pep.py/objects/tokenList.py

166 lines
3.7 KiB
Python

from objects import osuToken
import time
import threading
from events import logoutEvent
class tokenList:
"""
List of connected osu tokens
tokens -- dictionary. key: token string, value: token object
"""
tokens = {}
def addToken(self, __userID):
"""
Add a token object to tokens list
__userID -- user id associated to that token
return -- token object
"""
newToken = osuToken.token(__userID)
self.tokens[newToken.token] = newToken
return newToken
def deleteToken(self, __token):
"""
Delete a token from token list if it exists
__token -- token string
"""
if __token in self.tokens:
self.tokens.pop(__token)
def getUserIDFromToken(self, __token):
"""
Get user ID from a token
__token -- token to find
return: false if not found, userID if found
"""
# Make sure the token exists
if __token not in self.tokens:
return False
# Get userID associated to that token
return self.tokens[__token].userID
def getTokenFromUserID(self, __userID):
"""
Get token from a user ID
__userID -- user ID to find
return -- False if not found, token object if found
"""
# Make sure the token exists
for _, value in self.tokens.items():
if value.userID == __userID:
return value
# Return none if not found
return None
def getTokenFromUsername(self, __username):
"""
Get token from a username
__username -- username to find
return -- False if not found, token object if found
"""
# lowercase
who = __username.lower()
# Make sure the token exists
for _, value in self.tokens.items():
if value.username.lower() == who:
return value
# Return none if not found
return None
def deleteOldTokens(self, __userID):
"""
Delete old userID's tokens if found
__userID -- tokens associated to this user will be deleted
"""
# Delete older tokens
for key, value in self.tokens.items():
if value.userID == __userID:
# Delete this token from the dictionary
self.tokens.pop(key)
# break or items() function throws errors
break
def multipleEnqueue(self, __packet, __who, __but = False):
"""
Enqueue a packet to multiple users
__packet -- packet bytes to enqueue
__who -- userIDs array
__but -- if True, enqueue to everyone but users in __who array
"""
for _, value in self.tokens.items():
shouldEnqueue = False
if value.userID in __who and not __but:
shouldEnqueue = True
elif value.userID not in __who and __but:
shouldEnqueue = True
if shouldEnqueue:
value.enqueue(__packet)
def enqueueAll(self, __packet):
"""
Enqueue packet(s) to every connected user
__packet -- packet bytes to enqueue
"""
for _, value in self.tokens.items():
value.enqueue(__packet)
def usersTimeoutCheckLoop(self, __timeoutTime = 100, __checkTime = 100):
"""
Deletes all timed out users.
If called once, will recall after __checkTime seconds and so on, forever
CALL THIS FUNCTION ONLY ONCE!
__timeoutTime - seconds of inactivity required to disconnect someone (Default: 100)
__checkTime - seconds between loops (Default: 100)
"""
timedOutTokens = [] # timed out users
timeoutLimit = time.time()-__timeoutTime
for key, value in self.tokens.items():
# Check timeout (fokabot is ignored)
if value.pingTime < timeoutLimit and value.userID != 999:
# That user has timed out, add to disconnected tokens
# We can't delete it while iterating or items() throws an error
timedOutTokens.append(key)
# Delete timed out users from self.tokens
# i is token string (dictionary key)
for i in timedOutTokens:
logoutEvent.handle(self.tokens[i], None)
# Schedule a new check (endless loop)
threading.Timer(__checkTime, self.usersTimeoutCheckLoop, [__timeoutTime, __checkTime]).start()