Reorganize Message and SessionView into basic_types

This commit is contained in:
Joscha 2017-03-27 20:37:39 +00:00
parent 9b0195aa72
commit dd4b5144a9
4 changed files with 170 additions and 180 deletions

View file

@ -1,10 +1 @@
from .bot import Bot from .basic_types import Message, SessionView
from .botmanager import BotManager
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

169
yaboli/basic_types.py Normal file
View file

@ -0,0 +1,169 @@
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(self, data):
"""
Creates and returns a session created from the data.
data - a euphoria SessionView
"""
is_staff = data["is_staff"] if "is_staff" in data else None
is_manager = data["is_manager"] if "is_manager" in data else None
return self(
data["id"],
data["name"],
data["server_id"],
data["server_era"],
data["session_id"],
is_staff,
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 - session 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["sender"])
parent = data["parent"] if "parent" in data else None
edited = data["edited"] if "edited" in data else None
deleted = data["deleted"] if "deleted" in data else None
truncated = data["truncated"] if "truncated" in data else None
previous_edit_id = data["previous_edit_id"] if "previous_edit_id" in data else None
encryption_key_id = data["encryption_key_id"] if "encryption_key_id" in data else None
return self(
data["id"],
data["time"],
sender,
data["content"],
parent=parent,
edited=edited,
deleted=deleted,
truncated=truncated,
previous_edit_id=previous_edit_id,
encryption_key_id=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):
<time><insert_string>[<sender name>] message content
<insert_string> more message on a new line
If repeat_insert_string is False, the insert_string will only appear
on the first line.
If show_time is False, the time will not appear in the first line of
the formatted message.
The date option works like it does in Message.time_formatted().
"""
msgtime = self.time_formatted(date) if show_time else ""
if insert_string is None:
insert_string = " " if show_time else ""
lines = self.content.split("\n")
# first line
msg = "{}{}[{}] {}\n".format(msgtime, insert_string, self.sender.name, lines[0])
# all other lines
for line in lines[1:]:
msg += "{}{} {} {}\n".format(
" "*len(msgtime),
insert_string if repeat_insert_string else " "*len(insert_string),
" "*len(self.sender.name),
line
)
return msg[:-1] # remove trailing newline

View file

@ -1,99 +0,0 @@
import time
from . import session
class Message():
"""
This class keeps track of message details.
"""
def __init__(self, id, time, sender, content, parent=None, edited=None, deleted=None,
truncated=None):
"""
id - message id
time - time the message was sent (epoch)
sender - session of the sender
content - content of the message
parent - id of the parent message, or None
edited - time of last edit (epoch)
deleted - time of deletion (epoch)
truncated - message was truncated
"""
self.id = id
self.time = time
self.sender = sender
self.content = content
self.parent = parent
self.edited = edited
self.deleted = deleted
self.truncated = truncated
@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 = session.Session.from_data(data["sender"])
parent = data["parent"] if "parent" in data else None
edited = data["edited"] if "edited" in data else None
deleted = data["deleted"] if "deleted" in data else None
truncated = data["truncated"] if "truncated" in data else None
return self(
data["id"],
data["time"],
sender,
data["content"],
parent=parent,
edited=edited,
deleted=deleted,
truncated=truncated
)
def time_formatted(self, date=False):
"""
time_formatted(date=False) -> 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 is_edited(self):
"""
is_edited() -> bool
Has this message been edited?
"""
return True if self.edited is not None else False
def is_deleted(self):
"""
is_deleted() -> bool
Has this message been deleted?
"""
return True if self.deleted is not None else False
def is_truncated(self):
"""
is_truncated() -> bool
Has this message been truncated?
"""
return True if self.truncated is not None else False

View file

@ -1,71 +0,0 @@
class Session():
"""
This class keeps track of session details.
"""
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(self, data):
"""
Creates and returns a session created from the data.
data - a euphoria SessionView: http://api.euphoria.io/#sessionview
"""
is_staff = data["is_staff"] if "is_staff" in data else None
is_manager = data["is_manager"] if "is_manager" in data else None
return self(
data["id"],
data["name"],
data["server_id"],
data["server_era"],
data["session_id"],
is_staff,
is_manager
)
def session_type(self):
"""
session_type() -> str
The session's type (bot, account, agent).
"""
return self.id.split(":")[0]
def is_staff(self):
"""
is_staff() -> bool
Is a user staff?
"""
return self.staff and True or False
def is_manager(self):
"""
is_manager() -> bool
Is a user manager?
"""
return self.staff and True or False