From d7e16e173fa69c40205f3c33e777c9b4a73fc15c Mon Sep 17 00:00:00 2001 From: joscha Date: Sun, 8 May 2016 00:46:47 +0200 Subject: [PATCH] Add callbacks --- yaboli/__init__.py | 1 + yaboli/callbacks.py | 53 ++++++++++++++++++++++++++++++++++++++++++++ yaboli/connection.py | 47 +++++++++------------------------------ 3 files changed, 65 insertions(+), 36 deletions(-) create mode 100644 yaboli/callbacks.py diff --git a/yaboli/__init__.py b/yaboli/__init__.py index 7d439d5..9502526 100644 --- a/yaboli/__init__.py +++ b/yaboli/__init__.py @@ -1,3 +1,4 @@ +from .callbacks import Callbacks from .connection import Connection from .session import Session from .message import Message diff --git a/yaboli/callbacks.py b/yaboli/callbacks.py new file mode 100644 index 0000000..de46774 --- /dev/null +++ b/yaboli/callbacks.py @@ -0,0 +1,53 @@ +class Callbacks(): + """ + Manage callbacks + """ + + def __init__(self): + self._callbacks = {} + + def add_callback(self, event, callback, *args, **kwargs): + """ + add_callback(event, callback, *args, **kwargs) -> None + + Add a function to be called on event. + The function will be called witand *+kwargs. + Certain arguments might be added, depending on the event. + """ + + if not event in self.callbacks: + self._callbacks[event] = [] + + callback_info = { + "callback": callback, + "args": args, + "kwargs": kwargs + } + + self._callbacks[event].append(callback_info) + + def del_callbacks(self, event): + """ + del_callbacks(event) -> None + + Delete all callbacks attached to that event. + """ + + if event in self._callbacks: + del self._callbacks[event] + + def call_callback(self, event, *args): + """ + call_callback(event) -> None + + Call all callbacks subscribed to the event with *args and the arguments + specified when the callback was added. + """ + + if event in self._callbacks: + for c_info in self._callbacks[event]: + c = c_info["callback"] + args = c_info["args"] + args + kwargs = c_info["kwargs"] + + c(*args, **kwargs) diff --git a/yaboli/connection.py b/yaboli/connection.py index 06650f2..5b56171 100644 --- a/yaboli/connection.py +++ b/yaboli/connection.py @@ -4,6 +4,8 @@ import threading import websocket from websocket import WebSocketException as WSException +from . import callbacks + ROOM_FORMAT = "wss://euphoria.io/room/{}/ws" @@ -33,8 +35,8 @@ class Connection(): self.ws = None self.send_id = 0 - self.callbacks = {} - self.id_callbacks = {} + self.callbacks = callbacks.Callbacks() + self.id_callbacks = callbacks.Callbacks() def connect(self, tries=-1, delay=10): """ @@ -132,39 +134,21 @@ class Connection(): def add_callback(self, ptype, callback, *args, **kwargs): """ - add_callback(ptype, callback) -> None + add_callback(ptype, callback, *args, **kwargs) -> None Add a function to be called when a packet of type ptype is received. """ - if not ptype in self.callbacks: - self.callbacks[ptype] = [] - - callback_info = { - "callback": callback, - "args": args, - "kwargs": kwargs - } - - self.callbacks[ptype].append(callback_info) + self.callbacks.add_callback(ptype, callback, *args, **kwargs) def add_id_callback(self, pid, callback, *args, **kwargs): """ - add_id_callback(pid, callback) -> None + add_id_callback(pid, callback, *args, **kwargs) -> None Add a function to be called when a packet with id pid is received. """ - if not pid in self.id_callbacks: - self.id_callbacks[pid] = [] - - callback_info = { - "callback": callback, - "args": args, - "kwargs": kwargs - } - - self.id_callbacks[pid].append(callback_info) + self.id_callbacks.add_callback(pid, callback, *args, **kwargs) def call_callback(self, event, *args): """ @@ -173,12 +157,7 @@ class Connection(): Call all callbacks subscribed to the event with *args. """ - if event in self.callbacks: - for c_info in self.callbacks[event]: - c = c_info["callback"] - args = c_info["args"] + args - kwargs = c_info["kwargs"] - c(*args, **kwargs) + self.callbacks.call_callback(event, *args) def call_id_callback(self, pid, *args): """ @@ -187,12 +166,8 @@ class Connection(): Call all callbacks subscribed to the pid with *args. """ - if pid in self.id_callbacks: - for c_info in self.id_callbacks.pop(pid): - c = c_info["callback"] - args = c_info["args"] + args - kwargs = c_info["kwargs"] - c(*args, **kwargs) + self.id_callbacks.call_callback(pid, *args) + self.id_callbacks.del_callbacks(pid) def handle_json(self, data): """