Handle more events, get messages

This commit is contained in:
Joscha 2016-05-09 22:19:41 +02:00
parent 6e845a50a3
commit 2da7155504

View file

@ -4,10 +4,19 @@ from . import connection
from . import messages from . import messages
from . import session from . import session
from . import sessions from . import sessions
from . import callbacks
class Room(): class Room():
""" """
Connects to and provides more abstract access to a room on euphoria. Connects to and provides more abstract access to a room on euphoria.
Callbacks:
- account - account info has changed
- identity - own session_id or identity or nick etc. has changed
- messages - message data has changed
- ping - ping event has happened
- room - room info has changed
- sessions - session data has changed
""" """
def __init__(self, room, nick=None, password=None, account_email=None, account_password=None): def __init__(self, room, nick=None, password=None, account_email=None, account_password=None):
@ -22,9 +31,12 @@ class Room():
self.room = room self.room = room
self.room_is_private = None self.room_is_private = None
self.password = password self.password = password
self.pm_with_nick = None
self.pm_with_user = None
self.nick = nick self.nick = nick
self.session = None self.identity = None
self.session_id = None
self.account_name = None self.account_name = None
self.account_email = account_email self.account_email = account_email
@ -34,14 +46,15 @@ class Room():
self.ping_next = 0 self.ping_next = 0
self.ping_offset = 0 # difference between server and local time self.ping_offset = 0 # difference between server and local time
self.messages = messages.Messages() self._messages = messages.Messages()
self.sessions = sessions.Sessions() self._sessions = sessions.Sessions()
self.callbacks = callbacks.Callbacks() self._callbacks = callbacks.Callbacks()
self.con = connection.Connection(self.room) self._con = connection.Connection(self.room)
self.con.add_callback("hello-event", self._handle_hello_event) self._con.add_callback("hello-event", self._handle_hello_event)
self.con.add_callback("ping-event", self._handle_ping_event) self._con.add_callback("ping-event", self._handle_ping_event)
self._con.add_callback("snapshot-event", self._handle_snapshot_event)
def launch(self): def launch(self):
""" """
@ -50,21 +63,58 @@ class Room():
Open connection in a new thread (see connection.Connection.launch). Open connection in a new thread (see connection.Connection.launch).
""" """
return self.con.launch() return self._con.launch()
def set_nick(self, nick):
"""
set_nick(nick) -> None
Change your nick.
"""
self._con.add_next_callback(self._handle_nick_reply)
self._con.send_packet("nick", name=nick)
def get_msg(self, mid):
"""
get_msg(message_id) -> Message
Returns the message with the given id, if found.
"""
return self._messages.get(mid)
def get_msg_parent(self, mes):
"""
get_msg_parent(message) -> Message
Returns the message's parent, if found.
"""
return self._messages.get_parent(mes)
# ----- HANDLING OF EVENTS -----
def _handle_hello_event(self, data): def _handle_hello_event(self, data):
""" """
TODO TODO
""" """
self.session = session.Session.from_data(data["session"]) ses = session.Session.from_data(data["session"])
self.sessions.add(self.session) self._sessions.add(ses)
self._callbacks.call("sessions")
self.identity = data["id"]
self.session_id = ses.session_id
self._callbacks.call("identity")
self.room_is_private = data["room_is_private"] self.room_is_private = data["room_is_private"]
self._callbacks.call("room")
if "account" in data: # in case you log in in another room if "account" in data: # in case you log in in another room
self.account_name = data["account"]["name"] self.account_name = data["account"]["name"]
self.account_email = data["account"]["email"] self.account_email = data["account"]["email"]
self._callbacks.call("account")
def _handle_ping_event(self, data): def _handle_ping_event(self, data):
""" """
@ -73,6 +123,46 @@ class Room():
self.ping_last = data["time"] self.ping_last = data["time"]
self.ping_next = data["next"] self.ping_next = data["next"]
self.ping_offset = self.ping_last - time.gmtime() self.ping_offset = self.ping_last - time.time()
self.con.send_packet("ping-reply", time=self.ping_last) self._con.send_packet("ping-reply", time=self.ping_last)
self._callbacks.call("ping")
def _handle_snapshot_event(self, data):
"""
TODO
"""
self.identity = data["identity"]
self.session_id = data["session_id"]
if not self.nick and "nick" in data:
self.nick = data["nick"]
elif self.nick:
self.set_nick(self.nick)
self._callbacks.call("identity")
if "pm_with_nick" in data or "pm_with_user_id" in data:
if "pm_with_nick" in data:
self.pm_with_nick = data["pm_with_nick"]
if "pm_with_user_id" in data:
self.pm_with_user_id = data["pm_with_user_id"]
self._callbacks.call("room")
for sesdata in data["listing"]:
self._sessions.add_from_data(sesdata)
self._callbacks.call("sessions")
for mesdata in data["log"]:
self._messages.add_from_data(mesdata)
self._callbacks.call("messages")
# ----- HANDLING OF REPLIES -----
def _handle_nick_reply(self, data):
"""
TODO
"""
self.nick = data["to"]
self._callbacks.call("identity")