51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
import datetime
|
|
import os
|
|
import threading
|
|
from urllib.parse import quote, unquote
|
|
|
|
from colony.core.storages.core import Storage, STORAGES_DIR
|
|
|
|
CHAT_DIR = os.path.join(STORAGES_DIR, "chat")
|
|
|
|
|
|
class ChatStorage(Storage):
|
|
_lock = threading.Lock()
|
|
|
|
def __init__(self, storage_dir=None):
|
|
super().__init__(storage_dir or CHAT_DIR)
|
|
|
|
@staticmethod
|
|
def _file(peer_id):
|
|
return quote(peer_id, safe="") + ".json"
|
|
|
|
def messages(self, peer_id):
|
|
messages = self.open(self._file(peer_id)) or []
|
|
received = 0
|
|
for seq, message in enumerate(messages, 1):
|
|
received = message.setdefault("received", received + (message["direction"] == "in"))
|
|
message.setdefault("seq", seq)
|
|
return messages
|
|
|
|
def append(self, peer_id, direction, text, keep=None):
|
|
at = datetime.datetime.now(datetime.timezone.utc).isoformat()
|
|
with self._lock:
|
|
messages = self.messages(peer_id)
|
|
last = messages[-1] if messages else {"seq": 0, "received": 0}
|
|
messages.append({
|
|
"direction": direction,
|
|
"text": text,
|
|
"at": at,
|
|
"seq": last["seq"] + 1,
|
|
"received": last["received"] + (direction == "in"),
|
|
})
|
|
if keep:
|
|
messages = messages[-keep:]
|
|
self.save(self._file(peer_id), messages)
|
|
|
|
def peers(self):
|
|
peers = []
|
|
for filename in self.ls(""):
|
|
peer_id = unquote(filename.removesuffix(".json"))
|
|
peers.append(peer_id)
|
|
return sorted(peers)
|