This commit is contained in:
Joscha 2018-07-25 20:56:03 +00:00
parent 1f5fc58e06
commit a971b7e064
3 changed files with 35 additions and 100 deletions

View file

@ -1,65 +0,0 @@
import asyncio
__all__ = ["Callbacks"]
class Callbacks():
"""
Manage callbacks asynchronously
"""
def __init__(self):
self._callbacks = {}
def add(self, event, callback):
"""
add(event, callback) -> None
Add a function to be called on event.
"""
if not event in self._callbacks:
self._callbacks[event] = []
self._callbacks[event].append(callback)
def remove(self, event):
"""
remove(event) -> None
Remove all callbacks attached to that event.
"""
if event in self._callbacks:
del self._callbacks[event]
async def call(self, event, *args, **kwargs):
"""
await call(event) -> None
Call all callbacks subscribed to the event with *args and **kwargs".
"""
tasks = [asyncio.ensure_future(callback(*args, **kwargs))
for callback in self._callbacks.get(event, [])]
for task in tasks:
await task
def exists(self, event):
"""
exists(event) -> bool
Are any functions subscribed to this event?
"""
return event in self._callbacks
def list(self):
"""
list() -> callbacks
Returns a list of current callbacks
"""
return list(self._callbacks.keys())

View file

@ -65,7 +65,7 @@ class Connection:
self._stopped = True self._stopped = True
await self.reconnect() # _run() does the cleaning up now. await self.reconnect() # _run() does the cleaning up now.
await self._runtask await self._runtask
async def reconnect(self): async def reconnect(self):
""" """
Reconnect to the url. Reconnect to the url.

View file

@ -17,14 +17,14 @@ __all__ = [
# """ # """
# Helper function to run a singular controller. # Helper function to run a singular controller.
# """ # """
# #
# async def run(): # async def run():
# task, reason = await controller.connect(room) # task, reason = await controller.connect(room)
# if task: # if task:
# await task # await task
# else: # else:
# logger.warn(f"Could not connect to &{room}: {reason!r}") # logger.warn(f"Could not connect to &{room}: {reason!r}")
# #
# asyncio.get_event_loop().run_until_complete(run()) # asyncio.get_event_loop().run_until_complete(run())
# #
#def run_bot(bot_class, room, *args, **kwargs): #def run_bot(bot_class, room, *args, **kwargs):
@ -32,7 +32,7 @@ __all__ = [
# Helper function to run a bot. To run Multibots, use the MultibotKeeper. # Helper function to run a bot. To run Multibots, use the MultibotKeeper.
# This restarts the bot when it is explicitly restarted through Bot.restart(). # This restarts the bot when it is explicitly restarted through Bot.restart().
# """ # """
# #
# async def run(): # async def run():
# while True: # while True:
# logger.info(f"Creating new instance and connecting to &{room}") # logger.info(f"Creating new instance and connecting to &{room}")
@ -42,12 +42,12 @@ __all__ = [
# await task # await task
# else: # else:
# logger.warn(f"Could not connect to &{room}: {reason!r}") # logger.warn(f"Could not connect to &{room}: {reason!r}")
# #
# if bot.restarting: # if bot.restarting:
# logger.info(f"Restarting in &{room}") # logger.info(f"Restarting in &{room}")
# else: # else:
# break # break
# #
# asyncio.get_event_loop().run_until_complete(run()) # asyncio.get_event_loop().run_until_complete(run())
def mention(nick): def mention(nick):
@ -70,28 +70,28 @@ def format_time_delta(delta):
result = "-" result = "-"
else: else:
result = "" result = ""
delta = int(delta) delta = int(delta)
second = 1 second = 1
minute = second*60 minute = second*60
hour = minute*60 hour = minute*60
day = hour*24 day = hour*24
if delta >= day: if delta >= day:
result += f"{delta//day}d " result += f"{delta//day}d "
delta = delta%day delta = delta%day
if delta >= hour: if delta >= hour:
result += f"{delta//hour}h " result += f"{delta//hour}h "
delta = delta%hour delta = delta%hour
if delta >= minute: if delta >= minute:
result += f"{delta//minute}m " result += f"{delta//minute}m "
delta = delta%minute delta = delta%minute
result += f"{delta}s" result += f"{delta}s"
return result return result
class Session: class Session:
@ -106,23 +106,23 @@ class Session:
self.is_manager = is_manager self.is_manager = is_manager
self.client_address = client_address self.client_address = client_address
self.real_address = real_address self.real_address = real_address
@property @property
def uid(self): def uid(self):
return self.user_id return self.user_id
@uid.setter @uid.setter
def uid(self, new_uid): def uid(self, new_uid):
self.user_id = new_uid self.user_id = new_uid
@property @property
def sid(self): def sid(self):
return self.session_id return self.session_id
@sid.setter @sid.setter
def sid(self, new_sid): def sid(self, new_sid):
self.session_id = new_sid self.session_id = new_sid
@classmethod @classmethod
def from_dict(cls, d): def from_dict(cls, d):
return cls( return cls(
@ -136,7 +136,7 @@ class Session:
d.get("client_address", None), d.get("client_address", None),
d.get("real_address", None) d.get("real_address", None)
) )
@property @property
def client_type(self): def client_type(self):
# account, agent or bot # account, agent or bot
@ -145,16 +145,16 @@ class Session:
class Listing: class Listing:
def __init__(self): def __init__(self):
self._sessions = {} self._sessions = {}
def __len__(self): def __len__(self):
return len(self._sessions) return len(self._sessions)
def add(self, session): def add(self, session):
self._sessions[session.session_id] = session self._sessions[session.session_id] = session
def remove(self, session_id): def remove(self, session_id):
self._sessions.pop(session_id) self._sessions.pop(session_id)
def remove_combo(self, server_id, server_era): def remove_combo(self, server_id, server_era):
removed = [ses for ses in self._sessions.items() removed = [ses for ses in self._sessions.items()
if ses.server_id == server_id and ses.server_era == server_era] if ses.server_id == server_id and ses.server_era == server_era]
@ -163,34 +163,34 @@ class Listing:
if ses.server_id != server_id and ses.server_era != server_era} if ses.server_id != server_id and ses.server_era != server_era}
return removed return removed
def by_sid(self, session_id): def by_sid(self, session_id):
return self._sessions.get(session_id); return self._sessions.get(session_id);
def by_uid(self, user_id): def by_uid(self, user_id):
return [ses for ses in self._sessions if ses.user_id == user_id] return [ses for ses in self._sessions if ses.user_id == user_id]
def get(self, types=["agent", "account", "bot"], lurker=None): def get(self, types=["agent", "account", "bot"], lurker=None):
sessions = [] sessions = []
for uid, ses in self._sessions.items(): for uid, ses in self._sessions.items():
if ses.client_type not in types: if ses.client_type not in types:
continue continue
is_lurker = not ses.nick # "" or None is_lurker = not ses.nick # "" or None
if lurker is None or lurker == is_lurker: if lurker is None or lurker == is_lurker:
sessions.append(ses) sessions.append(ses)
return sessions return sessions
#def get_people(self): #def get_people(self):
#return self.get(types=["agent", "account"]) #return self.get(types=["agent", "account"])
#def get_accounts(self): #def get_accounts(self):
#return self.get(types=["account"]) #return self.get(types=["account"])
#def get_agents(self): #def get_agents(self):
#return self.get(types=["agent"]) #return self.get(types=["agent"])
#def get_bots(self): #def get_bots(self):
#return self.get(types=["bot"]) #return self.get(types=["bot"])
@ -207,15 +207,15 @@ class Message():
self.edited = edited self.edited = edited
self.deleted = deleted self.deleted = deleted
self.truncated = truncated self.truncated = truncated
@property @property
def mid(self): def mid(self):
return self.message_id return self.message_id
@mid.setter @mid.setter
def mid(self, new_mid): def mid(self, new_mid):
self.message_id = new_mid self.message_id = new_mid
@classmethod @classmethod
def from_dict(cls, d): def from_dict(cls, d):
return cls( return cls(