Mercurial > libervia-web
annotate libervia/pages/chat/page_meta.py @ 1232:4ccc5bb65be2
pages (chat): handle room statuses following backend change
author | Goffi <goffi@goffi.org> |
---|---|
date | Sun, 29 Dec 2019 17:36:25 +0100 |
parents | b2d067339de3 |
children | 921e9f2a97af |
rev | line source |
---|---|
1216 | 1 #!/usr/bin/env python3 |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 from sat.core.i18n import _ |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 from twisted.internet import defer |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 from sat.core.log import getLogger |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
6 |
1145
29eb15062416
pages: set __name__ for imported pages
Goffi <goffi@goffi.org>
parents:
1124
diff
changeset
|
7 log = getLogger(__name__) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 from sat.tools.common import data_objects |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 from twisted.words.protocols.jabber import jid |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 from libervia.server.constants import Const as C |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 from libervia.server import session_iface |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 |
1216 | 13 name = "chat" |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 access = C.PAGES_ACCESS_PROFILE |
1216 | 15 template = "chat/chat.html" |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 dynamic = True |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 def parse_url(self, request): |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 rdata = self.getRData(request) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 try: |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 target_jid_s = self.nextPath(request) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 except IndexError: |
1000
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
25 # not chat jid, we redirect to jid selection page |
1216 | 26 self.pageRedirect("chat_select", request) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 try: |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 target_jid = jid.JID(target_jid_s) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 if not target_jid.user: |
1216 | 31 raise ValueError(_("invalid jid for chat (no local part)")) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 except Exception as e: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
33 log.warning( |
1216 | 34 _("bad chat jid entered: {jid} ({msg})").format(jid=target_jid, msg=e) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
35 ) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 self.pageError(request, C.HTTP_BAD_REQUEST) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 else: |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
38 rdata["target"] = target_jid |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 |
1000
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
40 |
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
41 @defer.inlineCallbacks |
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
42 def prepare_render(self, request): |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
43 # Â FIXME: bug on room filtering (currently display messages from all rooms) |
1000
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
44 session = self.host.getSessionData(request, session_iface.ISATSession) |
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
45 template_data = request.template_data |
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
46 rdata = self.getRData(request) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
47 target_jid = rdata["target"] |
1000
4cc4d49e1d0f
pages (chat): moved rendering preparation in prepare_render, and redirect to page_select if no jid is specified.
Goffi <goffi@goffi.org>
parents:
996
diff
changeset
|
48 profile = session.profile |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 profile_jid = session.jid |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
1216 | 51 disco = yield self.host.bridgeCall("discoInfos", target_jid.host, "", True, profile) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 if "conference" in [i[0] for i in disco[1]]: |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 chat_type = C.CHAT_GROUP |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
54 join_ret = yield self.host.bridgeCall( |
1216 | 55 "mucJoin", target_jid.userhost(), "", "", profile |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
56 ) |
1232
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
57 (already_joined, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
58 room_jid_s, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
59 occupants, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
60 user_nick, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
61 room_subject, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
62 room_statuses, |
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
63 __) = join_ret |
1216 | 64 template_data["subject"] = room_subject |
1232
4ccc5bb65be2
pages (chat): handle room statuses following backend change
Goffi <goffi@goffi.org>
parents:
1216
diff
changeset
|
65 template_data["room_statuses"] = room_statuses |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 own_jid = jid.JID(room_jid_s) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 own_jid.resource = user_nick |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 else: |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 chat_type = C.CHAT_ONE2ONE |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 own_jid = profile_jid |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
71 rdata["chat_type"] = chat_type |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
72 template_data["own_jid"] = own_jid |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 |
1216 | 74 self.registerSignal(request, "messageNew") |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
75 history = yield self.host.bridgeCall( |
1216 | 76 "historyGet", |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
77 profile_jid.userhost(), |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
78 target_jid.userhost(), |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
79 20, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
80 True, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
81 {}, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
82 profile, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
83 ) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 authors = {m[2] for m in history} |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
85 identities = {} |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
86 for author in authors: |
1216 | 87 identities[author] = yield self.host.bridgeCall("identityGet", author, profile) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 |
1216 | 89 template_data["messages"] = data_objects.Messages(history) |
90 rdata['identities'] = template_data["identities"] = identities | |
91 template_data["target_jid"] = target_jid | |
92 template_data["chat_type"] = chat_type | |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
93 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
94 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
95 def on_data(self, request, data): |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
96 session = self.host.getSessionData(request, session_iface.ISATSession) |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
97 rdata = self.getRData(request) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
98 target = rdata["target"] |
1216 | 99 data_type = data.get("type", "") |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
100 if data_type == "msg": |
1216 | 101 message = data["body"] |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
102 mess_type = ( |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
103 C.MESS_TYPE_GROUPCHAT |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
104 if rdata["chat_type"] == C.CHAT_GROUP |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
105 else C.MESS_TYPE_CHAT |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
106 ) |
1216 | 107 log.debug("message received: {}".format(message)) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
108 self.host.bridgeCall( |
1216 | 109 "messageSend", |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
110 target.full(), |
1216 | 111 {"": message}, |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
112 {}, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
113 mess_type, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
114 {}, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
115 session.profile, |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
116 ) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
117 else: |
1216 | 118 log.warning("unknown message type: {type}".format(type=data_type)) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
119 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
120 |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
121 @defer.inlineCallbacks |
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 def on_signal(self, request, signal, *args): |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
123 if signal == "messageNew": |
1002
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
124 rdata = self.getRData(request) |
1216 | 125 template_data_update = {"msg": data_objects.Message((args))} |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
126 target_jid = rdata["target"] |
1203
251eba911d4d
server (websockets): fixed websocket handling on HTTPS connections:
Goffi <goffi@goffi.org>
parents:
1145
diff
changeset
|
127 identities = rdata["identities"] |
251eba911d4d
server (websockets): fixed websocket handling on HTTPS connections:
Goffi <goffi@goffi.org>
parents:
1145
diff
changeset
|
128 uid, timestamp, from_jid_s, to_jid_s, message, subject, mess_type, extra, __ = ( |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
129 args |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
130 ) |
1002
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
131 from_jid = jid.JID(from_jid_s) |
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
132 to_jid = jid.JID(to_jid_s) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
133 if ( |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
134 target_jid.userhostJID() != from_jid.userhostJID() |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
135 and target_jid.userhostJID() != to_jid.userhostJID() |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
136 ): |
1002
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
137 # the message is not linked with page's room/user |
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
138 return |
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
139 |
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
140 if from_jid_s not in identities: |
990e80aa43a9
pages (chat): fixed messages filtering + get identity of user if not already in cache.
Goffi <goffi@goffi.org>
parents:
1001
diff
changeset
|
141 profile = self.getProfile(request) |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
142 identities[from_jid_s] = yield self.host.bridgeCall( |
1216 | 143 "identityGet", from_jid_s, profile |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
144 ) |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
145 template_data_update["identities"] = identities |
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
146 self.renderAndUpdate( |
1216 | 147 request, "chat/message.html", "#messages", template_data_update |
1113
cdd389ef97bc
server: code style reformatting using black
Goffi <goffi@goffi.org>
parents:
1091
diff
changeset
|
148 ) |
996
d821c112e656
pages (chat): implementation of chat page using new dynamic pages, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
149 else: |
1216 | 150 log.error(_("Unexpected signal: {signal}").format(signal=signal)) |