yaboli/yaboli/basic_types.py

169 lines
4.7 KiB
Python

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