Mercurial > libervia-web
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))