This commit is contained in:
Jesús Pavón Abián
2026-01-11 20:13:56 +01:00
parent 9d9d86160d
commit 932e44a9c9
391 changed files with 120828 additions and 1090 deletions

View File

@@ -0,0 +1,117 @@
# -*- coding: utf-8 -*-
import logging
import wx
import output
from .base import BaseBuffer
from wxUI.buffers.blueski import panels as BlueskiPanels
from sessions.blueski import compose
log = logging.getLogger("controller.buffers.blueski.chat")
class ConversationListBuffer(BaseBuffer):
def __init__(self, *args, **kwargs):
kwargs["compose_func"] = "compose_convo"
super(ConversationListBuffer, self).__init__(*args, **kwargs)
self.type = "chat"
def create_buffer(self, parent, name):
self.buffer = BlueskiPanels.ChatPanel(parent, name)
self.buffer.session = self.session
def start_stream(self, mandatory=False, play_sound=True):
count = self.session.settings["general"].get("max_posts_per_call", 50)
try:
res = self.session.list_convos(limit=count)
items = res.get("items", [])
# Clear to avoid list weirdness on refreshes?
# Chat list usually replaces content on fetch
self.session.db[self.name] = []
self.buffer.list.clear()
return self.process_items(items, play_sound)
except Exception:
log.exception("Error fetching conversations")
return 0
def url(self, *args, **kwargs):
# In chat list, Enter (URL) should open the chat conversation buffer
self.view_chat()
def send_message(self, *args, **kwargs):
# Global shortcut for DM
self.view_chat()
def view_chat(self):
item = self.get_item()
if not item: return
convo_id = getattr(item, "id", None) or item.get("id")
if not convo_id: return
# Determine participants names for title
members = getattr(item, "members", []) or item.get("members", [])
others = [m for m in members if (getattr(m, "did", None) or m.get("did")) != self.session.db["user_id"]]
if not others: others = members
names = ", ".join([getattr(m, "handle", "unknown") or m.get("handle") for m in others])
title = _("Chat: {0}").format(names)
import application
application.app.controller.create_buffer(
buffer_type="chat_messages",
session_type="blueski",
buffer_title=title,
kwargs={"session": self.session, "convo_id": convo_id, "name": title},
start=True
)
class ChatBuffer(BaseBuffer):
def __init__(self, *args, **kwargs):
kwargs["compose_func"] = "compose_chat_message"
super(ChatBuffer, self).__init__(*args, **kwargs)
self.type = "chat_messages"
self.convo_id = kwargs.get("convo_id")
def create_buffer(self, parent, name):
self.buffer = BlueskiPanels.ChatMessagePanel(parent, name)
self.buffer.session = self.session
def start_stream(self, mandatory=False, play_sound=True):
if not self.convo_id: return 0
count = self.session.settings["general"].get("max_posts_per_call", 50)
try:
res = self.session.get_convo_messages(self.convo_id, limit=count)
items = res.get("items", [])
# Message order in API is often Oldest...Newest or vice versa.
# We want them in order and only new ones.
# For chat, let's just clear and show last N messages for simplicity now.
self.session.db[self.name] = []
self.buffer.list.clear()
# API usually returns newest first. We want newest at bottom.
items = list(reversed(items))
return self.process_items(items, play_sound)
except Exception:
log.exception("Error fetching chat messages")
return 0
def on_reply(self, evt):
# Open a text entry chat box
dlg = wx.TextEntryDialog(None, _("Message:"), _("Send Message"), style=wx.TE_MULTILINE | wx.OK | wx.CANCEL)
if dlg.ShowModal() == wx.ID_OK:
text = dlg.GetValue()
if text:
try:
self.session.send_chat_message(self.convo_id, text)
output.speak(_("Message sent."))
# Refresh
self.start_stream(mandatory=True, play_sound=False)
except:
output.speak(_("Failed to send message."))
dlg.Destroy()
def send_message(self, *args, **kwargs):
# Global shortcut for DM
self.on_reply(None)