diff libervia/web/pages/chat/page_meta.py @ 1518:eb00d593801d

refactoring: rename `libervia` to `libervia.web` + update imports following backend changes
author Goffi <goffi@goffi.org>
date Fri, 02 Jun 2023 16:49:28 +0200
parents libervia/pages/chat/page_meta.py@106bae41f5c8
children dc81403a5b2f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libervia/web/pages/chat/page_meta.py	Fri Jun 02 16:49:28 2023 +0200
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+
+from libervia.backend.core.i18n import _
+from twisted.internet import defer
+from libervia.backend.core.log import getLogger
+from libervia.backend.tools.common import data_objects
+from libervia.backend.tools.common import data_format
+from twisted.words.protocols.jabber import jid
+from libervia.web.server.constants import Const as C
+from libervia.web.server import session_iface
+
+
+log = getLogger(__name__)
+
+name = "chat"
+access = C.PAGES_ACCESS_PROFILE
+template = "chat/chat.html"
+dynamic = True
+
+
+def parse_url(self, request):
+    rdata = self.get_r_data(request)
+
+    try:
+        target_jid_s = self.next_path(request)
+    except IndexError:
+        # not chat jid, we redirect to jid selection page
+        self.page_redirect("chat_select", request)
+
+    try:
+        target_jid = jid.JID(target_jid_s)
+        if not target_jid.user:
+            raise ValueError(_("invalid jid for chat (no local part)"))
+    except Exception as e:
+        log.warning(
+            _("bad chat jid entered: {jid} ({msg})").format(jid=target_jid, msg=e)
+        )
+        self.page_error(request, C.HTTP_BAD_REQUEST)
+    else:
+        rdata["target"] = target_jid
+
+
+@defer.inlineCallbacks
+def prepare_render(self, request):
+    #  FIXME: bug on room filtering (currently display messages from all rooms)
+    session = self.host.get_session_data(request, session_iface.IWebSession)
+    template_data = request.template_data
+    rdata = self.get_r_data(request)
+    target_jid = rdata["target"]
+    profile = session.profile
+    profile_jid = session.jid
+
+    disco = yield self.host.bridge_call("disco_infos", target_jid.host, "", True, profile)
+    if "conference" in [i[0] for i in disco[1]]:
+        chat_type = C.CHAT_GROUP
+        join_ret = yield self.host.bridge_call(
+            "muc_join", target_jid.userhost(), "", "", profile
+        )
+        (already_joined,
+         room_jid_s,
+         occupants,
+         user_nick,
+         room_subject,
+         room_statuses,
+         __) = join_ret
+        template_data["subject"] = room_subject
+        template_data["room_statuses"] = room_statuses
+        own_jid = jid.JID(room_jid_s)
+        own_jid.resource = user_nick
+    else:
+        chat_type = C.CHAT_ONE2ONE
+        own_jid = profile_jid
+    rdata["chat_type"] = chat_type
+    template_data["own_jid"] = own_jid
+
+    self.register_signal(request, "message_new")
+    history = yield self.host.bridge_call(
+        "history_get",
+        profile_jid.userhost(),
+        target_jid.userhost(),
+        20,
+        True,
+        {},
+        profile,
+    )
+    authors = {m[2] for m in history}
+    identities = session.identities
+    for author in authors:
+        id_raw = yield self.host.bridge_call(
+            "identity_get", author, [], True, profile)
+        identities[author] = data_format.deserialise(id_raw)
+
+    template_data["messages"] = data_objects.Messages(history)
+    rdata['identities'] = identities
+    template_data["target_jid"] = target_jid
+    template_data["chat_type"] = chat_type
+
+
+def on_data(self, request, data):
+    session = self.host.get_session_data(request, session_iface.IWebSession)
+    rdata = self.get_r_data(request)
+    target = rdata["target"]
+    data_type = data.get("type", "")
+    if data_type == "msg":
+        message = data["body"]
+        mess_type = (
+            C.MESS_TYPE_GROUPCHAT
+            if rdata["chat_type"] == C.CHAT_GROUP
+            else C.MESS_TYPE_CHAT
+        )
+        log.debug("message received: {}".format(message))
+        self.host.bridge_call(
+            "message_send",
+            target.full(),
+            {"": message},
+            {},
+            mess_type,
+            "",
+            session.profile,
+        )
+    else:
+        log.warning("unknown message type: {type}".format(type=data_type))