Files
colony/colony/core/storages/chat.py
T
2026-10-03 10:04:45 +02:00

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)