diff --git a/.gitignore b/.gitignore index 5b4d23f..001826c 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ yaboli/__pycache__/ +*.txt diff --git a/yaboli/__init__.py b/yaboli/__init__.py index 8aed845..3a2b964 100644 --- a/yaboli/__init__.py +++ b/yaboli/__init__.py @@ -1,10 +1,11 @@ -from .bot import Bot -from .botmanager import BotManager +import logging +logging.basicConfig( + level=logging.DEBUG, + format="[{levelname: <7}] in {threadName: <17} <{name}>: {message}", + style="{" +) + +from .basic_types import Message, SessionView from .callbacks import Callbacks from .connection import Connection -from .exceptions import * from .session import Session -from .message import Message -from .sessions import Sessions -from .messages import Messages -from .room import Room diff --git a/yaboli/basic_types.py b/yaboli/basic_types.py new file mode 100644 index 0000000..5ba0110 --- /dev/null +++ b/yaboli/basic_types.py @@ -0,0 +1,163 @@ +import time + +class SessionView(): + """ + This class keeps track of session details. + http://api.euphoria.io/#sessionview + """ + + def __init__(self, id, name, server_id, server_era, session_id, is_staff=None, is_manager=None): + """ + id - agent/account id + name - name of the client when the SessionView was captured + server_id - id of the server + server_era - era of the server + session_id - session id (unique across euphoria) + is_staff - client is staff + is_manager - client is manager + """ + + self.id = id + self.name = name + self.server_id = server_id + self.server_era = server_era + self.session_id = session_id + self.staff = is_staff + self.manager = is_manager + + @classmethod + def from_data(cls, data): + """ + Creates and returns a session created from the data. + + data - a euphoria SessionView + """ + + view = cls(None, None, None, None, None) + view.read_data(data) + return view + + def read_data(self, data): + if "id" in data: self.id = data.get("id") + if "name" in data: self.name = data.get("name") + if "server_id" in data: self.server_id = data.get("server_id") + if "server_era" in data: self.server_era = data.get("server_era") + if "session_id" in data: self.session_id = data.get("session_id") + if "is_staff" in data: self.is_staff = data.get("is_staff") + if "is_manager" in data: self.is_manager = data.get("is_manager") + + def session_type(self): + """ + session_type() -> str + + The session's type (bot, account, agent). + """ + + return self.id.split(":")[0] if ":" in self.id else None + +class Message(): + """ + This class represents a single euphoria message. + http://api.euphoria.io/#message + """ + + def __init__(self, id, time, sender, content, parent=None, edited=None, previous_edit_id=None, + deleted=None, truncated=None, encryption_key_id=None): + """ + id - message id + time - time the message was sent (epoch) + sender - SessionView of the sender + content - content of the message + parent - id of the parent message, or None + edited - time of last edit (epoch) + previous_edit_id - edit id of the most recent edit of this message + deleted - time of deletion (epoch) + truncated - message was truncated + encryption_key_id - id of the key that encrypts the message in storage + """ + + self.id = id + self.time = time + self.sender = sender + self.content = content + self.parent = parent + self.edited = edited + self.previous_edit_id = previous_edit_id + self.deleted = deleted + self.truncated = truncated + self.encryption_key_id = encryption_key_id + + @classmethod + def from_data(self, data): + """ + Creates and returns a message created from the data. + NOTE: This also creates a session object using the data in "sender". + + data - a euphoria message: http://api.euphoria.io/#message + """ + + sender = SessionView.from_data(data.get("sender")) + + return self( + data.get("id"), + data.get("time"), + sender, + data.get("content"), + parent=data.get("parent"), + edited=data.get("edited"), + deleted=data.get("deleted"), + truncated=data.get("truncated"), + previous_edit_id=data.get("previous_edit_id"), + encryption_key_id=data.get("encryption_key_id") + ) + + def time_formatted(self, date=True): + """ + time_formatted(date=True) -> str + + date - include date in format + + Time in a readable format: + With date: YYYY-MM-DD HH:MM:SS + Without date: HH:MM:SS + """ + + if date: + return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(self.time)) + else: + return time.strftime("%H:%M:%S", time.gmtime(self.time)) + + def formatted(self, show_time=False, date=True, insert_string=None, repeat_insert_string=True): + """ + formatted() -> strftime + + The message contents in the following format (does not end on a newline): +