annotate sat/plugins/plugin_xep_0045.py @ 4011:74d4c9ff893d

plugin XEP-0277: when publisher is not found, check ancestor in both client and component namespaces
author Goffi <goffi@goffi.org>
date Thu, 16 Mar 2023 16:43:47 +0100
parents 32d714a8ea51
children 524856bd7b19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
4 # SAT plugin for managing xep-0045
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3254
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
10 # (at your option) any later version.
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
15 # GNU Affero General Public License for more details.
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 599
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
19
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
20 import time
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
21 from typing import Optional
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
22 import uuid
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
23
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
24 from twisted.internet import defer
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
25 from twisted.python import failure
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
26 from twisted.words.protocols.jabber import jid
3080
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
27 from twisted.words.protocols.jabber import error as xmpp_error
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
28 from wokkel import disco, iwokkel, muc
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
29 from wokkel import rsm
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
30 from wokkel import mam
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
31 from zope.interface import implementer
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
32
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
33 from sat.core import exceptions
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
34 from sat.core.core_types import SatXMPPEntity
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
35 from sat.core.constants import Const as C
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
36 from sat.core.i18n import D_, _
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
37 from sat.core.log import getLogger
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
38 from sat.memory import memory
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
39 from sat.tools import xml_tools, utils
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
40
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
41
3080
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
42 log = getLogger(__name__)
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
43
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
44
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
45 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
46 C.PI_NAME: "XEP-0045 Plugin",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
47 C.PI_IMPORT_NAME: "XEP-0045",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
48 C.PI_TYPE: "XEP",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
49 C.PI_PROTOCOLS: ["XEP-0045"],
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
50 C.PI_DEPENDENCIES: ["XEP-0359"],
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
51 C.PI_RECOMMENDATIONS: [C.TEXT_CMDS, "XEP-0313"],
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
52 C.PI_MAIN: "XEP_0045",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
53 C.PI_HANDLER: "yes",
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
54 C.PI_DESCRIPTION: _("""Implementation of Multi-User Chat""")
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
55 }
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
56
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
57 NS_MUC = 'http://jabber.org/protocol/muc'
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
58 AFFILIATIONS = ('owner', 'admin', 'member', 'none', 'outcast')
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
59 ROOM_USER_JOINED = 'ROOM_USER_JOINED'
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
60 ROOM_USER_LEFT = 'ROOM_USER_LEFT'
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
61 OCCUPANT_KEYS = ('nick', 'entity', 'affiliation', 'role')
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
62 ROOM_STATE_OCCUPANTS = "occupants"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
63 ROOM_STATE_SELF_PRESENCE = "self-presence"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 ROOM_STATE_LIVE = "live"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65 ROOM_STATES = (ROOM_STATE_OCCUPANTS, ROOM_STATE_SELF_PRESENCE, ROOM_STATE_LIVE)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
66 HISTORY_LEGACY = "legacy"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
67 HISTORY_MAM = "mam"
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
68
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
69
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
70 CONFIG_SECTION = 'plugin muc'
1407
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
71
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
72 default_conf = {"default_muc": 'sat@chat.jabberfr.org'}
1407
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
73
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
74
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
75 class AlreadyJoined(exceptions.ConflictError):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
76
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
77 def __init__(self, room):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
78 super(AlreadyJoined, self).__init__()
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
79 self.room = room
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
80
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
81
588
beaf6bec2fcd Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
82 class XEP_0045(object):
2046
b99bd02ea643 plugin XEP-0045, XEP-0054, XEP-0096: deprecated bridge method are not used anymore
Goffi <goffi@goffi.org>
parents: 2028
diff changeset
83 # TODO: handle invitations
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
84 # FIXME: this plugin need a good cleaning, join method is messy
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
85
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
86 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
87 log.info(_("Plugin XEP_0045 initialization"))
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
88 self.host = host
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
89 self._sessions = memory.Sessions()
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
90 # return same arguments as mucRoomJoined + a boolean set to True is the room was
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
91 # already joined (first argument)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
92 host.bridge.addMethod(
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
93 "mucJoin", ".plugin", in_sign='ssa{ss}s', out_sign='(bsa{sa{ss}}ssass)',
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
94 method=self._join, async_=True)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
95 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
96 "mucNick", ".plugin", in_sign='sss', out_sign='', method=self._nick)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
97 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
98 "mucNickGet", ".plugin", in_sign='ss', out_sign='s', method=self._getRoomNick)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
99 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
100 "mucLeave", ".plugin", in_sign='ss', out_sign='', method=self._leave,
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
101 async_=True)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
102 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
103 "mucOccupantsGet", ".plugin", in_sign='ss', out_sign='a{sa{ss}}',
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
104 method=self._getRoomOccupants)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
105 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
106 "mucSubject", ".plugin", in_sign='sss', out_sign='', method=self._subject)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
107 host.bridge.addMethod(
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
108 "mucGetRoomsJoined", ".plugin", in_sign='s', out_sign='a(sa{sa{ss}}ssas)',
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
109 method=self._getRoomsJoined)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
110 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
111 "mucGetUniqueRoomName", ".plugin", in_sign='ss', out_sign='s',
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
112 method=self._getUniqueName)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
113 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
114 "mucConfigureRoom", ".plugin", in_sign='ss', out_sign='s',
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
115 method=self._configureRoom, async_=True)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
116 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
117 "mucGetDefaultService", ".plugin", in_sign='', out_sign='s',
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
118 method=self.getDefaultMUC)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
119 host.bridge.addMethod(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
120 "mucGetService", ".plugin", in_sign='ss', out_sign='s',
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
121 method=self._getMUCService, async_=True)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
122 # called when a room will be joined but must be locked until join is received
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
123 # (room is prepared, history is getting retrieved)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
124 # args: room_jid, profile
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
125 host.bridge.addSignal(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
126 "mucRoomPrepareJoin", ".plugin", signature='ss')
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
127 # args: room_jid, occupants, user_nick, subject, profile
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
128 host.bridge.addSignal(
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
129 "mucRoomJoined", ".plugin", signature='sa{sa{ss}}ssass')
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
130 # args: room_jid, profile
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
131 host.bridge.addSignal(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
132 "mucRoomLeft", ".plugin", signature='ss')
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
133 # args: room_jid, old_nick, new_nick, profile
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
134 host.bridge.addSignal(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
135 "mucRoomUserChangedNick", ".plugin", signature='ssss')
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
136 # args: room_jid, subject, profile
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
137 host.bridge.addSignal(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
138 "mucRoomNewSubject", ".plugin", signature='sss')
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
139 self.__submit_conf_id = host.registerCallback(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
140 self._submitConfiguration, with_data=True)
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
141 self._room_join_id = host.registerCallback(self._UIRoomJoinCb, with_data=True)
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
142 host.importMenu(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
143 (D_("MUC"), D_("configure")), self._configureRoomMenu, security_limit=0,
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
144 help_string=D_("Configure Multi-User Chat room"), type_=C.MENU_ROOM)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
145 try:
1992
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
146 self.text_cmds = self.host.plugins[C.TEXT_CMDS]
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
147 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
148 log.info(_("Text commands not available"))
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
149 else:
1992
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
150 self.text_cmds.registerTextCommands(self)
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
151 self.text_cmds.addWhoIsCb(self._whois, 100)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
152
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
153 self._mam = self.host.plugins.get("XEP-0313")
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
154 self._si = self.host.plugins["XEP-0359"]
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
155
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
156 host.trigger.add("presence_available", self.presenceTrigger)
2822
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
157 host.trigger.add("presence_received", self.presenceReceivedTrigger)
3172
dcebc585c29f core: renamed "MessageReceived" trigger to "messageReceived" for consistency.
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
158 host.trigger.add("messageReceived", self.messageReceivedTrigger, priority=1000000)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
159 host.trigger.add("message_parse", self._message_parseTrigger)
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
160
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
161 async def profileConnected(self, client):
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
162 client.muc_service = await self.get_MUC_service(client)
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
163
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
164 def _message_parseTrigger(self, client, message_elt, data):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
165 """Add stanza-id from the room if present"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
166 if message_elt.getAttribute("type") != C.MESS_TYPE_GROUPCHAT:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
167 return True
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
168
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
169 # stanza_id will not be filled by parseMessage because the emitter
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
170 # is the room and not our server, so we have to parse it here
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
171 room_jid = data["from"].userhostJID()
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
172 stanza_id = self._si.getStanzaId(message_elt, room_jid)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
173 if stanza_id:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
174 data["extra"]["stanza_id"] = stanza_id
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
175
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
176 def messageReceivedTrigger(self, client, message_elt, post_treat):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
177 if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
178 if message_elt.subject or message_elt.delay:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
179 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
180 from_jid = jid.JID(message_elt['from'])
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
181 room_jid = from_jid.userhostJID()
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
182 if room_jid in client._muc_client.joined_rooms:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
183 room = client._muc_client.joined_rooms[room_jid]
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
184 if room.state != ROOM_STATE_LIVE:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
185 if getattr(room, "_history_type", HISTORY_LEGACY) == HISTORY_LEGACY:
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
186 # With MAM history, order is different, and we can get live
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
187 # messages before history is complete, so this is not a warning
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
188 # but an expected case.
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
189 # On the other hand, with legacy history, it's not normal.
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
190 log.warning(_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
191 "Received non delayed message in a room before its "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
192 "initialisation: state={state}, msg={msg}").format(
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
193 state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
194 msg=message_elt.toXml()))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
195 room._cache.append(message_elt)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
196 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
197 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
198 log.warning("Received groupchat message for a room which has not been "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
199 "joined, ignoring it: {}".format(message_elt.toXml()))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
200 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
201 return True
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
202
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
203 def getRoom(self, client: SatXMPPEntity, room_jid: jid.JID) -> muc.Room:
2844
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
204 """Retrieve Room instance from its jid
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
205
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3573
diff changeset
206 @param room_jid: jid of the room
2844
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
207 @raise exceptions.NotFound: the room has not been joined
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
208 """
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
209 try:
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
210 return client._muc_client.joined_rooms[room_jid]
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
211 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
212 raise exceptions.NotFound(_("This room has not been joined"))
2844
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
213
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
214 def checkRoomJoined(self, client, room_jid):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
215 """Check that given room has been joined in current session
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
216
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
217 @param room_jid (JID): room JID
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
218 """
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
219 if room_jid not in client._muc_client.joined_rooms:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
220 raise exceptions.NotFound(_("This room has not been joined"))
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
221
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
222 def isJoinedRoom(self, client: SatXMPPEntity, room_jid: jid.JID) -> bool:
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
223 """Tell if a jid is a known and joined room
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
224
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3573
diff changeset
225 @room_jid: jid of the room
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
226 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
227 try:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
228 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
229 except exceptions.NotFound:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
230 return False
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
231 else:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
232 return True
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
233
3254
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
234 def isRoom(self, client, entity_jid):
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
235 """Tell if a jid is a joined MUC
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
236
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
237 similar to isJoinedRoom but returns a boolean
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
238 @param entity_jid(jid.JID): full or bare jid of the entity check
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
239 @return (bool): True if the bare jid of the entity is a room jid
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
240 """
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
241 try:
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
242 self.checkRoomJoined(client, entity_jid.userhostJID())
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
243 except exceptions.NotFound:
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
244 return False
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
245 else:
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
246 return True
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
247
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
248 def getBareOrFull(self, client, peer_jid):
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
249 """use full jid if peer_jid is an occupant of a room, bare jid else
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
250
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
251 @param peer_jid(jid.JID): entity to test
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
252 @return (jid.JID): bare or full jid
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
253 """
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
254 if peer_jid.resource:
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
255 if not self.isRoom(client, peer_jid):
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
256 return peer_jid.userhostJID()
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
257 return peer_jid
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
258
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
259 def _getRoomJoinedArgs(self, room, profile):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
260 return [
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
261 room.roomJID.userhost(),
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
262 XEP_0045._getOccupants(room),
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
263 room.nick,
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
264 room.subject,
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
265 [s.name for s in room.statuses],
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
266 profile
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
267 ]
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
268
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
269 def _UIRoomJoinCb(self, data, profile):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
270 room_jid = jid.JID(data['index'])
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
271 client = self.host.getClient(profile)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
272 self.join(client, room_jid)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
273 return {}
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
274
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
275 def _passwordUICb(self, data, client, room_jid, nick):
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
276 """Called when the user has given room password (or cancelled)"""
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
277 if C.bool(data.get(C.XMLUI_DATA_CANCELLED, "false")):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
278 log.info("room join for {} is cancelled".format(room_jid.userhost()))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
279 raise failure.Failure(exceptions.CancelError(D_("Room joining cancelled by user")))
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
280 password = data[xml_tools.formEscape('password')]
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
281 return client._muc_client.join(room_jid, nick, password).addCallbacks(self._joinCb, self._joinEb, (client, room_jid, nick), errbackArgs=(client, room_jid, nick, password))
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
282
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
283 def _showListUI(self, items, client, service):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
284 xmlui = xml_tools.XMLUI(title=D_('Rooms in {}'.format(service.full())))
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
285 adv_list = xmlui.changeContainer('advanced_list', columns=1, selectable='single', callback_id=self._room_join_id)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
286 items = sorted(items, key=lambda i: i.name.lower())
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
287 for item in items:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
288 adv_list.setRowIndex(item.entity.full())
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
289 xmlui.addText(item.name)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
290 adv_list.end()
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
291 self.host.actionNew({'xmlui': xmlui.toXml()}, profile=client.profile)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
292
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
293 def _joinCb(self, room, client, room_jid, nick):
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
294 """Called when the user is in the requested room"""
452
fd455b3ca6d4 plugin XEP-0045: room unlocking fix
Goffi <goffi@goffi.org>
parents: 451
diff changeset
295 if room.locked:
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
296 # FIXME: the current behaviour is to create an instant room
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
297 # and send the signal only when the room is unlocked
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
298 # a proper configuration management should be done
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
299 log.debug(_("room locked !"))
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
300 d = client._muc_client.configure(room.roomJID, {})
2990
6959c71ab8bf plugin XEP-0045: log "failure" on configure error
Goffi <goffi@goffi.org>
parents: 2986
diff changeset
301 d.addErrback(self.host.logErrback,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
302 msg=_('Error while configuring the room: {failure_}'))
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
303 return room.fully_joined
319
5bb1cfc105d0 plugin xep-0045: misc improvments
Goffi <goffi@goffi.org>
parents: 291
diff changeset
304
3086
13be04a70e2f plugin XEP-0045: show join error even if it's not a StanzaError, log it with warning instead of error
Goffi <goffi@goffi.org>
parents: 3080
diff changeset
305 def _joinEb(self, failure_, client, room_jid, nick, password):
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
306 """Called when something is going wrong when joining the room"""
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
307 try:
3086
13be04a70e2f plugin XEP-0045: show join error even if it's not a StanzaError, log it with warning instead of error
Goffi <goffi@goffi.org>
parents: 3080
diff changeset
308 condition = failure_.value.condition
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
309 except AttributeError:
3086
13be04a70e2f plugin XEP-0045: show join error even if it's not a StanzaError, log it with warning instead of error
Goffi <goffi@goffi.org>
parents: 3080
diff changeset
310 msg_suffix = f': {failure_}'
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
311 else:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
312 if condition == 'conflict':
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
313 # we have a nickname conflict, we try again with "_" suffixed to current nickname
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
314 nick += '_'
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
315 return client._muc_client.join(room_jid, nick, password).addCallbacks(self._joinCb, self._joinEb, (client, room_jid, nick), errbackArgs=(client, room_jid, nick, password))
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
316 elif condition == 'not-allowed':
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
317 # room is restricted, we need a password
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
318 password_ui = xml_tools.XMLUI("form", title=D_('Room {} is restricted').format(room_jid.userhost()), submit_id='')
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
319 password_ui.addText(D_("This room is restricted, please enter the password"))
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
320 password_ui.addPassword('password')
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
321 d = xml_tools.deferXMLUI(self.host, password_ui, profile=client.profile)
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
322 d.addCallback(self._passwordUICb, client, room_jid, nick)
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
323 return d
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
324
3086
13be04a70e2f plugin XEP-0045: show join error even if it's not a StanzaError, log it with warning instead of error
Goffi <goffi@goffi.org>
parents: 3080
diff changeset
325 msg_suffix = ' with condition "{}"'.format(failure_.value.condition)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
326
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
327 mess = D_("Error while joining the room {room}{suffix}".format(
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
328 room = room_jid.userhost(), suffix = msg_suffix))
3086
13be04a70e2f plugin XEP-0045: show join error even if it's not a StanzaError, log it with warning instead of error
Goffi <goffi@goffi.org>
parents: 3080
diff changeset
329 log.warning(mess)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
330 xmlui = xml_tools.note(mess, D_("Group chat error"), level=C.XMLUI_DATA_LVL_ERROR)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
331 self.host.actionNew({'xmlui': xmlui.toXml()}, profile=client.profile)
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
332
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
333 @staticmethod
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
334 def _getOccupants(room):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
335 """Get occupants of a room in a form suitable for bridge"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
336 return {u.nick: {k:str(getattr(u,k) or '') for k in OCCUPANT_KEYS} for u in list(room.roster.values())}
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
337
2844
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
338 def _getRoomOccupants(self, room_jid_s, profile_key):
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
339 client = self.host.getClient(profile_key)
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
340 room_jid = jid.JID(room_jid_s)
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
341 return self.getRoomOccupants(client, room_jid)
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
342
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
343 def getRoomOccupants(self, client, room_jid):
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
344 room = self.getRoom(client, room_jid)
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
345 return self._getOccupants(room)
fa1cc09df195 plugin XEP-0045: added getRoomOccupants/mucOccupantsGet method to retrieve occupants of a joined room.
Goffi <goffi@goffi.org>
parents: 2827
diff changeset
346
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
347 def _getRoomsJoined(self, profile_key=C.PROF_KEY_NONE):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
348 client = self.host.getClient(profile_key)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
349 return self.getRoomsJoined(client)
1392
c7082457d03f memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents: 1384
diff changeset
350
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
351 def getRoomsJoined(self, client):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
352 """Return rooms where user is"""
78
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
353 result = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
354 for room in list(client._muc_client.joined_rooms.values()):
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
355 if room.state == ROOM_STATE_LIVE:
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
356 result.append(
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
357 (room.roomJID.userhost(),
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
358 self._getOccupants(room),
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
359 room.nick,
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
360 room.subject,
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
361 [s.name for s in room.statuses],
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
362 )
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
363 )
78
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
364 return result
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
365
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
366 def _getRoomNick(self, room_jid_s, profile_key=C.PROF_KEY_NONE):
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
367 client = self.host.getClient(profile_key)
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
368 return self.getRoomNick(client, jid.JID(room_jid_s))
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
369
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
370 def getRoomNick(self, client, room_jid):
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 91
diff changeset
371 """return nick used in room by user
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
372
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
373 @param room_jid (jid.JID): JID of the room
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 91
diff changeset
374 @profile_key: profile
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
375 @return: nick or empty string in case of error
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
376 @raise exceptions.Notfound: use has not joined the room
715
f47d7c09c60b plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents: 713
diff changeset
377 """
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
378 self.checkRoomJoined(client, room_jid)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
379 return client._muc_client.joined_rooms[room_jid].nick
715
f47d7c09c60b plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents: 713
diff changeset
380
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 811
diff changeset
381 def _configureRoom(self, room_jid_s, profile_key=C.PROF_KEY_NONE):
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
382 client = self.host.getClient(profile_key)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
383 d = self.configureRoom(client, jid.JID(room_jid_s))
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
384 d.addCallback(lambda xmlui: xmlui.toXml())
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
385 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
386
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
387 def _configureRoomMenu(self, menu_data, profile):
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
388 """Return room configuration form
1135
3158f9e08760 plugin OTR: a warning is logged when Account is instancied with a bare jid.
Goffi <goffi@goffi.org>
parents: 1101
diff changeset
389
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
390 @param menu_data: %(menu_data)s
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
391 @param profile: %(doc_profile)s
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
392 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
393 client = self.host.getClient(profile)
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
394 try:
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
395 room_jid = jid.JID(menu_data['room_jid'])
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
396 except KeyError:
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
397 log.error(_("room_jid key is not present !"))
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
398 return defer.fail(exceptions.DataError)
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
399
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
400 def xmluiReceived(xmlui):
2584
f8e4d855001e plugin XEP-0045: display a note when no configuration is available on the room
Goffi <goffi@goffi.org>
parents: 2583
diff changeset
401 if not xmlui:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
402 msg = D_("No configuration available for this room")
2584
f8e4d855001e plugin XEP-0045: display a note when no configuration is available on the room
Goffi <goffi@goffi.org>
parents: 2583
diff changeset
403 return {"xmlui": xml_tools.note(msg).toXml()}
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
404 return {"xmlui": xmlui.toXml()}
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
405 return self.configureRoom(client, room_jid).addCallback(xmluiReceived)
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
406
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
407 def configureRoom(self, client, room_jid):
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
408 """return the room configuration form
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
409
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
410 @param room: jid of the room to configure
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
411 @return: configuration form as XMLUI
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
412 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
413 self.checkRoomJoined(client, room_jid)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
414
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
415 def config2XMLUI(result):
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
416 if not result:
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
417 return ""
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
418 session_id, session_data = self._sessions.newSession(profile=client.profile)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
419 session_data["room_jid"] = room_jid
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
420 xmlui = xml_tools.dataForm2XMLUI(result, submit_id=self.__submit_conf_id)
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
421 xmlui.session_id = session_id
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
422 return xmlui
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
423
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
424 d = client._muc_client.getConfiguration(room_jid)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
425 d.addCallback(config2XMLUI)
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
426 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
427
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
428 def _submitConfiguration(self, raw_data, profile):
2583
8378806a70fe plugin XEP-0045: fixed room configuration cancellation
Goffi <goffi@goffi.org>
parents: 2581
diff changeset
429 cancelled = C.bool(raw_data.get("cancelled", C.BOOL_FALSE))
8378806a70fe plugin XEP-0045: fixed room configuration cancellation
Goffi <goffi@goffi.org>
parents: 2581
diff changeset
430 if cancelled:
8378806a70fe plugin XEP-0045: fixed room configuration cancellation
Goffi <goffi@goffi.org>
parents: 2581
diff changeset
431 return defer.succeed({})
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
432 client = self.host.getClient(profile)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
433 try:
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
434 session_data = self._sessions.profileGet(raw_data["session_id"], profile)
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
435 except KeyError:
1068
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
436 log.warning(D_("Session ID doesn't exist, session has probably expired."))
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
437 _dialog = xml_tools.XMLUI('popup', title=D_('Room configuration failed'))
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
438 _dialog.addText(D_("Session ID doesn't exist, session has probably expired."))
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
439 return defer.succeed({'xmlui': _dialog.toXml()})
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
440
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
441 data = xml_tools.XMLUIResult2DataFormResult(raw_data)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
442 d = client._muc_client.configure(session_data['room_jid'], data)
1068
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
443 _dialog = xml_tools.XMLUI('popup', title=D_('Room configuration succeed'))
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
444 _dialog.addText(D_("The new settings have been saved."))
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
445 d.addCallback(lambda ignore: {'xmlui': _dialog.toXml()})
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
446 del self._sessions[raw_data["session_id"]]
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
447 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
448
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
449 def isNickInRoom(self, client, room_jid, nick):
522
3446ce33247d plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents: 519
diff changeset
450 """Tell if a nick is currently present in a room"""
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
451 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
452 return client._muc_client.joined_rooms[room_jid].inRoster(muc.User(nick))
78
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
453
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
454 def _getMUCService(self, jid_=None, profile=C.PROF_KEY_NONE):
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
455 client = self.host.getClient(profile)
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
456 d = defer.ensureDeferred(self.get_MUC_service(client, jid_ or None))
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
457 d.addCallback(lambda service_jid: service_jid.full() if service_jid is not None else '')
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
458 return d
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
459
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
460 async def get_MUC_service(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
461 self,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
462 client: SatXMPPEntity,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
463 jid_: Optional[jid.JID] = None) -> Optional[jid.JID]:
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
464 """Return first found MUC service of an entity
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
465
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
466 @param jid_: entity which may have a MUC service, or None for our own server
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
467 @return: found service jid or None
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
468 """
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
469 if jid_ is None:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
470 try:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
471 muc_service = client.muc_service
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
472 except AttributeError:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
473 pass
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
474 else:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
475 # we have a cached value, we return it
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
476 return muc_service
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
477 services = await self.host.findServiceEntities(client, "conference", "text", jid_)
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
478 for service in services:
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
479 if ".irc." not in service.userhost():
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
480 # FIXME:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
481 # This ugly hack is here to avoid an issue with openfire: the IRC gateway
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
482 # use "conference/text" identity (instead of "conference/irc")
712
f610864eb7a5 plugins (MUC, tools, games): generalize the generation of a unique room name when joining a MUC and no room is specified:
souliane <souliane@mailoo.org>
parents: 609
diff changeset
483 muc_service = service
f610864eb7a5 plugins (MUC, tools, games): generalize the generation of a unique room name when joining a MUC and no room is specified:
souliane <souliane@mailoo.org>
parents: 609
diff changeset
484 break
2613
9680cd958529 plugin XEP-0045: fixed crash when muc service is not found
Goffi <goffi@goffi.org>
parents: 2584
diff changeset
485 else:
9680cd958529 plugin XEP-0045: fixed crash when muc service is not found
Goffi <goffi@goffi.org>
parents: 2584
diff changeset
486 muc_service = None
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
487 return muc_service
712
f610864eb7a5 plugins (MUC, tools, games): generalize the generation of a unique room name when joining a MUC and no room is specified:
souliane <souliane@mailoo.org>
parents: 609
diff changeset
488
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
489 def _getUniqueName(self, muc_service="", profile_key=C.PROF_KEY_NONE):
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
490 client = self.host.getClient(profile_key)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
491 return self.getUniqueName(client, muc_service or None).full()
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
492
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
493 def getUniqueName(self, client, muc_service=None):
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
494 """Return unique name for a room, avoiding collision
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
495
1356
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
496 @param muc_service (jid.JID) : leave empty string to use the default service
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
497 @return: jid.JID (unique room bare JID)
712
f610864eb7a5 plugins (MUC, tools, games): generalize the generation of a unique room name when joining a MUC and no room is specified:
souliane <souliane@mailoo.org>
parents: 609
diff changeset
498 """
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
499 # TODO: we should use #RFC-0045 10.1.4 when available here
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
500 room_name = str(uuid.uuid4())
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
501 if muc_service is None:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
502 try:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
503 muc_service = client.muc_service
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
504 except AttributeError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
505 raise exceptions.NotReady("Main server MUC service has not been checked yet")
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
506 if muc_service is None:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
507 log.warning(_("No MUC service found on main server"))
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
508 raise exceptions.FeatureNotFound
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
509
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
510 muc_service = muc_service.userhost()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
511 return jid.JID("{}@{}".format(room_name, muc_service))
319
5bb1cfc105d0 plugin xep-0045: misc improvments
Goffi <goffi@goffi.org>
parents: 291
diff changeset
512
1407
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
513 def getDefaultMUC(self):
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
514 """Return the default MUC.
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
515
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
516 @return: unicode
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
517 """
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
518 return self.host.memory.getConfig(CONFIG_SECTION, 'default_muc', default_conf['default_muc'])
77f07ea90420 plugin XEP-0045, quick_frontend, primitivus: replace C.DEFAULT_MUC by bridge method getDefaultMUC (value is defined in plugin XEP-0045 and can be overriden with the config file)
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
519
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
520 def _join_eb(self, failure_, client):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
521 failure_.trap(AlreadyJoined)
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
522 room = failure_.value.room
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
523 return [True] + self._getRoomJoinedArgs(room, client.profile)
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
524
2028
70bd7b242a9e plugin XEP-0045: fixed options parameter handling in bridge callback
Goffi <goffi@goffi.org>
parents: 2021
diff changeset
525 def _join(self, room_jid_s, nick, options, profile_key=C.PROF_KEY_NONE):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
526 """join method used by bridge
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
527
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
528 @return (tuple): already_joined boolean + room joined arguments (see [_getRoomJoinedArgs])
712
f610864eb7a5 plugins (MUC, tools, games): generalize the generation of a unique room name when joining a MUC and no room is specified:
souliane <souliane@mailoo.org>
parents: 609
diff changeset
529 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
530 client = self.host.getClient(profile_key)
1356
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
531 if room_jid_s:
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
532 muc_service = client.muc_service
1356
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
533 try:
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
534 room_jid = jid.JID(room_jid_s)
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
535 except (RuntimeError, jid.InvalidFormat, AttributeError):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
536 return defer.fail(jid.InvalidFormat(_("Invalid room identifier: {room_id}'. Please give a room short or full identifier like 'room' or 'room@{muc_service}'.").format(
2170
d246666ebe25 i18n: updated sat.po
Goffi <goffi@goffi.org>
parents: 2149
diff changeset
537 room_id=room_jid_s,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
538 muc_service=str(muc_service))))
1384
73f8582c7c99 plugins XEP-0045, XEP-0249: allow to join / invite without specifying the JID's host part (use client's values)
souliane <souliane@mailoo.org>
parents: 1381
diff changeset
539 if not room_jid.user:
73f8582c7c99 plugins XEP-0045, XEP-0249: allow to join / invite without specifying the JID's host part (use client's values)
souliane <souliane@mailoo.org>
parents: 1381
diff changeset
540 room_jid.user, room_jid.host = room_jid.host, muc_service
1356
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
541 else:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
542 room_jid = self.getUniqueName(profile_key=client.profile)
743
5a131930348d plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents: 742
diff changeset
543 # TODO: error management + signal in bridge
2028
70bd7b242a9e plugin XEP-0045: fixed options parameter handling in bridge callback
Goffi <goffi@goffi.org>
parents: 2021
diff changeset
544 d = self.join(client, room_jid, nick, options or None)
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
545 d.addCallback(lambda room: [False] + self._getRoomJoinedArgs(room, client.profile))
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
546 d.addErrback(self._join_eb, client)
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
547 return d
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
548
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
549 async def join(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
550 self,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
551 client: SatXMPPEntity,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
552 room_jid: jid.JID,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
553 nick: Optional[str] = None,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
554 options: Optional[dict] = None
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
555 ) -> Optional[muc.Room]:
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
556 if not nick:
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
557 nick = client.jid.user
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
558 if options is None:
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
559 options = {}
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
560 if room_jid in client._muc_client.joined_rooms:
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
561 room = client._muc_client.joined_rooms[room_jid]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
562 log.info(_('{profile} is already in room {room_jid}').format(
3002
6acaa8244220 plugin 0249: fixed invitation handling + some improvments:
Goffi <goffi@goffi.org>
parents: 2994
diff changeset
563 profile=client.profile, room_jid = room_jid.userhost()))
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
564 raise AlreadyJoined(room)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
565 log.info(_("[{profile}] is joining room {room} with nick {nick}").format(
3002
6acaa8244220 plugin 0249: fixed invitation handling + some improvments:
Goffi <goffi@goffi.org>
parents: 2994
diff changeset
566 profile=client.profile, room=room_jid.userhost(), nick=nick))
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
567 self.host.bridge.mucRoomPrepareJoin(room_jid.userhost(), client.profile)
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
568
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
569 password = options.get("password")
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
570
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
571 try:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
572 room = await client._muc_client.join(room_jid, nick, password)
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
573 except Exception as e:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
574 room = await utils.asDeferred(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
575 self._joinEb(failure.Failure(e), client, room_jid, nick, password)
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
576 )
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
577 else:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
578 await defer.ensureDeferred(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
579 self._joinCb(room, client, room_jid, nick)
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
580 )
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
581 return room
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
582
3008
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
583 def popRooms(self, client):
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
584 """Remove rooms and return data needed to re-join them
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
585
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
586 This methods is to be called before a hot reconnection
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
587 @return (list[(jid.JID, unicode)]): arguments needed to re-join the rooms
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
588 This list can be used directly (unpacked) with self.join
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
589 """
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
590 args_list = []
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
591 for room in list(client._muc_client.joined_rooms.values()):
3008
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
592 client._muc_client._removeRoom(room.roomJID)
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
593 args_list.append((client, room.roomJID, room.nick))
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
594 return args_list
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
595
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
596 def _nick(self, room_jid_s, nick, profile_key=C.PROF_KEY_NONE):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
597 client = self.host.getClient(profile_key)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
598 return self.nick(client, jid.JID(room_jid_s), nick)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
599
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
600 def nick(self, client, room_jid, nick):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
601 """Change nickname in a room"""
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
602 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
603 return client._muc_client.nick(room_jid, nick)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
604
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
605 def _leave(self, room_jid, profile_key):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
606 client = self.host.getClient(profile_key)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
607 return self.leave(client, jid.JID(room_jid))
515
29b5ef129488 plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents: 509
diff changeset
608
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
609 def leave(self, client, room_jid):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
610 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
611 return client._muc_client.leave(room_jid)
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
612
2021
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
613 def _subject(self, room_jid_s, new_subject, profile_key):
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
614 client = self.host.getClient(profile_key)
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
615 return self.subject(client, jid.JID(room_jid_s), new_subject)
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
616
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
617 def subject(self, client, room_jid, subject):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
618 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
619 return client._muc_client.subject(room_jid, subject)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
620
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2066
diff changeset
621 def getHandler(self, client):
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
622 # create a MUC client and associate it with profile' session
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
623 muc_client = client._muc_client = LiberviaMUCClient(self)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
624 return muc_client
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
625
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
626 def kick(self, client, nick, room_jid, options=None):
2689
d715d912afac plugin XEP-0199: implementation of XMPP Ping
Goffi <goffi@goffi.org>
parents: 2613
diff changeset
627 """Kick a participant from the room
d715d912afac plugin XEP-0199: implementation of XMPP Ping
Goffi <goffi@goffi.org>
parents: 2613
diff changeset
628
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
629 @param nick (str): nick of the user to kick
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
630 @param room_jid_s (JID): jid of the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
631 @param options (dict): attribute with extra info (reason, password) as in #XEP-0045
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
632 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
633 if options is None:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
634 options = {}
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
635 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
636 return client._muc_client.kick(room_jid, nick, reason=options.get('reason', None))
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
637
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
638 def ban(self, client, entity_jid, room_jid, options=None):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
639 """Ban an entity from the room
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
640
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
641 @param entity_jid (JID): bare jid of the entity to be banned
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
642 @param room_jid (JID): jid of the room
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
643 @param options: attribute with extra info (reason, password) as in #XEP-0045
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
644 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
645 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
646 if options is None:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
647 options = {}
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
648 assert not entity_jid.resource
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
649 assert not room_jid.resource
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
650 return client._muc_client.ban(room_jid, entity_jid, reason=options.get('reason', None))
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
651
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
652 def affiliate(self, client, entity_jid, room_jid, options):
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
653 """Change the affiliation of an entity
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
654
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
655 @param entity_jid (JID): bare jid of the entity
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
656 @param room_jid_s (JID): jid of the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
657 @param options: attribute with extra info (reason, nick) as in #XEP-0045
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
658 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
659 self.checkRoomJoined(client, room_jid)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
660 assert not entity_jid.resource
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
661 assert not room_jid.resource
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
662 assert 'affiliation' in options
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
663 # TODO: handles reason and nick
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
664 return client._muc_client.modifyAffiliationList(room_jid, [entity_jid], options['affiliation'])
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
665
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
666 # Text commands #
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
667
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
668 def cmd_nick(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
669 """change nickname
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
670
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
671 @command (group): new_nick
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
672 - new_nick: new nick to use
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
673 """
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
674 nick = mess_data["unparsed"].strip()
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
675 if nick:
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
676 room = mess_data["to"]
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
677 self.nick(client, room, nick)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
678
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
679 return False
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
680
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
681 def cmd_join(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
682 """join a new room
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
683
1381
0d12d4e32664 plugin XEP-0045: /join text command can be used in all contexts, not only group
Goffi <goffi@goffi.org>
parents: 1371
diff changeset
684 @command (all): JID
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
685 - JID: room to join (on the same service if full jid is not specified)
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
686 """
3544
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
687 room_raw = mess_data["unparsed"].strip()
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
688 if room_raw:
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
689 if self.isJoinedRoom(client, mess_data["to"]):
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
690 # we use the same service as the one from the room where the command has
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
691 # been entered if full jid is not entered
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
692 muc_service = mess_data["to"].host
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
693 nick = self.getRoomNick(client, mess_data["to"]) or client.jid.user
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
694 else:
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
695 # the command has been entered in a one2one conversation, so we use
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
696 # our server MUC service as default service
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
697 muc_service = client.muc_service or ""
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
698 nick = client.jid.user
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
699 room_jid = self.text_cmds.getRoomJID(room_raw, muc_service)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
700 self.join(client, room_jid, nick, {})
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
701
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
702 return False
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
703
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
704 def cmd_leave(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
705 """quit a room
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
706
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
707 @command (group): [ROOM_JID]
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
708 - ROOM_JID: jid of the room to live (current room if not specified)
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
709 """
3544
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
710 room_raw = mess_data["unparsed"].strip()
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
711 if room_raw:
ae5f63e5ed2c plugin XEP-0045: fix `/join` text command
Goffi <goffi@goffi.org>
parents: 3543
diff changeset
712 room = self.text_cmds.getRoomJID(room_raw, mess_data["to"].host)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
713 else:
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
714 room = mess_data["to"]
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
715
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
716 self.leave(client, room)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
717
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
718 return False
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
719
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
720 def cmd_part(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
721 """just a synonym of /leave
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
722
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
723 @command (group): [ROOM_JID]
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
724 - ROOM_JID: jid of the room to live (current room if not specified)
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
725 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
726 return self.cmd_leave(client, mess_data)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
727
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
728 def cmd_kick(self, client, mess_data):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
729 """kick a room member
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
730
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
731 @command (group): ROOM_NICK
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
732 - ROOM_NICK: the nick of the person to kick
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
733 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
734 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
735 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
736 nick = options[0]
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
737 assert self.isNickInRoom(client, mess_data["to"], nick)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
738 except (IndexError, AssertionError):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
739 feedback = _("You must provide a member's nick to kick.")
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
740 self.text_cmds.feedBack(client, feedback, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
741 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
742
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
743 reason = ' '.join(options[1:]) if len(options) > 1 else None
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
744
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
745 d = self.kick(client, nick, mess_data["to"], {"reason": reason})
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
746
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
747 def cb(__):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
748 feedback_msg = _('You have kicked {}').format(nick)
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
749 if reason is not None:
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
750 feedback_msg += _(' for the following reason: {reason}').format(
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
751 reason=reason
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
752 )
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
753 self.text_cmds.feedBack(client, feedback_msg, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
754 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
755 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
756 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
757
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
758 def cmd_ban(self, client, mess_data):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
759 """ban an entity from the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
760
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
761 @command (group): (JID) [reason]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
762 - JID: the JID of the entity to ban
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
763 - reason: the reason why this entity is being banned
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
764 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
765 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
766 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
767 jid_s = options[0]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
768 entity_jid = jid.JID(jid_s).userhostJID()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
769 assert(entity_jid.user)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
770 assert(entity_jid.host)
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
771 except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError,
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
772 AssertionError):
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
773 feedback = _(
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
774 "You must provide a valid JID to ban, like in '/ban contact@example.net'"
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
775 )
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
776 self.text_cmds.feedBack(client, feedback, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
777 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
778
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
779 reason = ' '.join(options[1:]) if len(options) > 1 else None
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
780
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
781 d = self.ban(client, entity_jid, mess_data["to"], {"reason": reason})
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
782
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
783 def cb(__):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
784 feedback_msg = _('You have banned {}').format(entity_jid)
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
785 if reason is not None:
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
786 feedback_msg += _(' for the following reason: {reason}').format(
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
787 reason=reason
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
788 )
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
789 self.text_cmds.feedBack(client, feedback_msg, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
790 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
791 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
792 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
793
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
794 def cmd_affiliate(self, client, mess_data):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
795 """affiliate an entity to the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
796
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
797 @command (group): (JID) [owner|admin|member|none|outcast]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
798 - JID: the JID of the entity to affiliate
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
799 - owner: grant owner privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
800 - admin: grant admin privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
801 - member: grant member privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
802 - none: reset entity privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
803 - outcast: ban entity
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
804 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
805 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
806 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
807 jid_s = options[0]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
808 entity_jid = jid.JID(jid_s).userhostJID()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
809 assert(entity_jid.user)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
810 assert(entity_jid.host)
1742
244a605623d6 complete the Exception's list when catching JID error:
souliane <souliane@mailoo.org>
parents: 1700
diff changeset
811 except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError, AssertionError):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
812 feedback = _("You must provide a valid JID to affiliate, like in '/affiliate contact@example.net member'")
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
813 self.text_cmds.feedBack(client, feedback, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
814 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
815
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
816 affiliation = options[1] if len(options) > 1 else 'none'
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
817 if affiliation not in AFFILIATIONS:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
818 feedback = _("You must provide a valid affiliation: %s") % ' '.join(AFFILIATIONS)
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
819 self.text_cmds.feedBack(client, feedback, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
820 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
821
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
822 d = self.affiliate(client, entity_jid, mess_data["to"], {'affiliation': affiliation})
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
823
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
824 def cb(__):
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
825 feedback_msg = _('New affiliation for {entity}: {affiliation}').format(
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
826 entity=entity_jid, affiliation=affiliation)
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
827 self.text_cmds.feedBack(client, feedback_msg, mess_data)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
828 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
829 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
830 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
831
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
832 def cmd_title(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
833 """change room's subject
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
834
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
835 @command (group): title
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
836 - title: new room subject
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
837 """
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
838 subject = mess_data["unparsed"].strip()
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
839
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
840 if subject:
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
841 room = mess_data["to"]
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
842 self.subject(client, room, subject)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
843
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
844 return False
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
845
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
846 def cmd_topic(self, client, mess_data):
1371
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
847 """just a synonym of /title
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
848
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
849 @command (group): title
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
850 - title: new room subject
876c9fbd0b3d plugin text command, XEP-0045, XEP-0048, XEP-0249: removed feedBackWrongContext which is no more usefull with new _contextValid method
Goffi <goffi@goffi.org>
parents: 1358
diff changeset
851 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
852 return self.cmd_title(client, mess_data)
926
d609581bf74a plugin text commands: refactoring, text now only contain main commands, and other plugin can add commands themselve:
Goffi <goffi@goffi.org>
parents: 916
diff changeset
853
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
854 def cmd_list(self, client, mess_data):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
855 """list available rooms in a muc server
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
856
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
857 @command (all): [MUC_SERVICE]
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
858 - MUC_SERVICE: service to request
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
859 empty value will request room's service for a room,
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
860 or user's server default MUC service in a one2one chat
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
861 """
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
862 unparsed = mess_data["unparsed"].strip()
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
863 try:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
864 service = jid.JID(unparsed)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
865 except RuntimeError:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
866 if mess_data['type'] == C.MESS_TYPE_GROUPCHAT:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
867 room_jid = mess_data["to"]
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
868 service = jid.JID(room_jid.host)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
869 elif client.muc_service is not None:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
870 service = client.muc_service
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
871 else:
3543
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
872 msg = D_("No known default MUC service {unparsed}").format(
f19718296c20 plugin XEP-0045: fix "reason" parsing for /ban and /kick text commands
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
873 unparsed=unparsed)
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
874 self.text_cmds.feedBack(client, msg, mess_data)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
875 return False
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
876 except jid.InvalidFormat:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
877 msg = D_("{} is not a valid JID!".format(unparsed))
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
878 self.text_cmds.feedBack(client, msg, mess_data)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
879 return False
2148
a543eda2c923 core (memory/disco): getInfos now handle node + use client instead of profile in many methods
Goffi <goffi@goffi.org>
parents: 2145
diff changeset
880 d = self.host.getDiscoItems(client, service)
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
881 d.addCallback(self._showListUI, client, service)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
882
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
883 return False
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
884
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
885 def _whois(self, client, whois_msg, mess_data, target_jid):
1199
96fb74a4714d misc: fixed some typos
Matteo Cypriani <mcy@lm7.fr>
parents: 1135
diff changeset
886 """ Add MUC user information to whois """
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
887 if mess_data['type'] != "groupchat":
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
888 return
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
889 if target_jid.userhostJID() not in client._muc_client.joined_rooms:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
890 log.warning(_("This room has not been joined"))
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
891 return
1392
c7082457d03f memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents: 1384
diff changeset
892 if not target_jid.resource:
c7082457d03f memory, plugin XEP-0045: getMainResource returns None when asking a MUC entity + fixes /whois on a MUC (bare) entity
souliane <souliane@mailoo.org>
parents: 1384
diff changeset
893 return
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
894 user = client._muc_client.joined_rooms[target_jid.userhostJID()].getUser(target_jid.resource)
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
895 whois_msg.append(_("Nickname: %s") % user.nick)
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
896 if user.entity:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
897 whois_msg.append(_("Entity: %s") % user.entity)
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
898 if user.affiliation != 'none':
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
899 whois_msg.append(_("Affiliation: %s") % user.affiliation)
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
900 if user.role != 'none':
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
901 whois_msg.append(_("Role: %s") % user.role)
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
902 if user.status:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
903 whois_msg.append(_("Status: %s") % user.status)
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
904 if user.show:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
905 whois_msg.append(_("Show: %s") % user.show)
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
906
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
907 def presenceTrigger(self, presence_elt, client):
3008
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
908 # FIXME: should we add a privacy parameters in settings to activate before
c8c68a3b0a79 plugins XEP-0045, XEP-0198: rejoin MUC rooms while a hot reconnection is done:
Goffi <goffi@goffi.org>
parents: 3002
diff changeset
909 # broadcasting the presence to all MUC rooms ?
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
910 muc_client = client._muc_client
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
911 for room_jid, room in muc_client.joined_rooms.items():
2815
27d9d25ec3cd plugin XEP-0045: fixed issue with deepcopy by using new xml_tools.elementCopy method
Goffi <goffi@goffi.org>
parents: 2794
diff changeset
912 elt = xml_tools.elementCopy(presence_elt)
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
913 elt['to'] = room_jid.userhost() + '/' + room.nick
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
914 client.presence.send(elt)
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
915 return True
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
916
2822
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
917 def presenceReceivedTrigger(self, client, entity, show, priority, statuses):
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
918 entity_bare = entity.userhostJID()
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
919 muc_client = client._muc_client
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
920 if entity_bare in muc_client.joined_rooms:
2991
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
921 # presence is already handled in (un)availableReceived
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
922 return False
2822
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
923 return True
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
924
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
925
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
926 @implementer(iwokkel.IDisco)
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
927 class LiberviaMUCClient(muc.MUCClient):
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
928
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
929 def __init__(self, plugin_parent):
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
930 self.plugin_parent = plugin_parent
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
931 muc.MUCClient.__init__(self)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
932 self._changing_nicks = set() # used to keep trace of who is changing nick,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
933 # and to discard userJoinedRoom signal in this case
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
934 print("init SatMUCClient OK")
515
29b5ef129488 plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents: 509
diff changeset
935
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
936 @property
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
937 def joined_rooms(self):
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
938 return self._rooms
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
939
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
940 @property
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
941 def host(self):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
942 return self.plugin_parent.host
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
943
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
944 @property
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
945 def client(self):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
946 return self.parent
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
947
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
948 @property
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
949 def _mam(self):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
950 return self.plugin_parent._mam
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
951
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
952 @property
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
953 def _si(self):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
954 return self.plugin_parent._si
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
955
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
956 def changeRoomState(self, room, new_state):
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
957 """Check that room is in expected state, and change it
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
958
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
959 @param new_state: one of ROOM_STATE_*
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
960 """
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
961 new_state_idx = ROOM_STATES.index(new_state)
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
962 if new_state_idx == -1:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
963 raise exceptions.InternalError("unknown room state")
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
964 if new_state_idx < 1:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
965 raise exceptions.InternalError("unexpected new room state ({room}): {state}".format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
966 room=room.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
967 state=new_state))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
968 expected_state = ROOM_STATES[new_state_idx-1]
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
969 if room.state != expected_state:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
970 log.error(_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
971 "room {room} is not in expected state: room is in state {current_state} "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
972 "while we were expecting {expected_state}").format(
3015
7b8d40b17451 plugin XEP-0045: fixed a bad attribute in a log message.
Goffi <goffi@goffi.org>
parents: 3008
diff changeset
973 room=room.roomJID.userhost(),
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
974 current_state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
975 expected_state=expected_state))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
976 room.state = new_state
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
977
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
978 def _addRoom(self, room):
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
979 super(LiberviaMUCClient, self)._addRoom(room)
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
980 room._roster_ok = False # True when occupants list has been fully received
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
981 room.state = ROOM_STATE_OCCUPANTS
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
982 # FIXME: check if history_d is not redundant with fully_joined
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
983 room.fully_joined = defer.Deferred() # called when everything is OK
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
984 # cache data until room is ready
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
985 # list of elements which will be re-injected in stream
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
986 room._cache = []
2822
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
987 # we only need to keep last presence status for each jid, so a dict is suitable
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
988 room._cache_presence = {}
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
989
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
990 async def _join_legacy(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
991 self,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
992 client: SatXMPPEntity,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
993 room_jid: jid.JID,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
994 nick: str,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
995 password: Optional[str]
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
996 ) -> muc.Room:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
997 """Join room an retrieve history with legacy method"""
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
998 mess_data_list = await self.host.memory.historyGet(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
999 room_jid,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1000 client.jid.userhostJID(),
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1001 limit=1,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1002 between=True,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1003 profile=client.profile
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1004 )
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1005 if mess_data_list:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1006 timestamp = mess_data_list[0][1]
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1007 # we use seconds since last message to get backlog without duplicates
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1008 # and we remove 1 second to avoid getting the last message again
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1009 seconds = int(time.time() - timestamp) - 1
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1010 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1011 seconds = None
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1012
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1013 room = await super(LiberviaMUCClient, self).join(
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1014 room_jid, nick, muc.HistoryOptions(seconds=seconds), password)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1015 # used to send bridge signal once backlog are written in history
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1016 room._history_type = HISTORY_LEGACY
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1017 room._history_d = defer.Deferred()
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1018 room._history_d.callback(None)
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1019 return room
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1020
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1021 async def _get_MAM_history(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1022 self,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1023 client: SatXMPPEntity,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1024 room: muc.Room,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1025 room_jid: jid.JID
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1026 ) -> None:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1027 """Retrieve history for rooms handling MAM"""
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1028 history_d = room._history_d = defer.Deferred()
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1029 # we trigger now the deferred so all callback are processed as soon as possible
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1030 # and in order
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1031 history_d.callback(None)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1032
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1033 last_mess = await self.host.memory.historyGet(
2826
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1034 room_jid,
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1035 None,
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1036 limit=1,
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1037 between=False,
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1038 filters={
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1039 'types': C.MESS_TYPE_GROUPCHAT,
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1040 'last_stanza_id': True},
2826
177f11163ed0 plugin XEP-0045: fixed message type filtering when getting last stanza_id to retrieve history with MAM
Goffi <goffi@goffi.org>
parents: 2822
diff changeset
1041 profile=client.profile)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1042 if last_mess:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1043 stanza_id = last_mess[0][-1]['stanza_id']
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1044 rsm_req = rsm.RSMRequest(max_=20, after=stanza_id)
2724
35a0ab3032bb plugin XEP-0045: don't loop when initiating MAM archive
Goffi <goffi@goffi.org>
parents: 2723
diff changeset
1045 no_loop=False
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1046 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1047 log.info("We have no MAM archive for room {room_jid}.".format(
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1048 room_jid=room_jid))
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1049 # we don't want the whole archive if we have no archive yet
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1050 # as it can be huge
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1051 rsm_req = rsm.RSMRequest(max_=50, before='')
2724
35a0ab3032bb plugin XEP-0045: don't loop when initiating MAM archive
Goffi <goffi@goffi.org>
parents: 2723
diff changeset
1052 no_loop=True
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1053
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1054 mam_req = mam.MAMRequest(rsm_=rsm_req)
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1055 complete = False
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1056 count = 0
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1057 while not complete:
3080
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1058 try:
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1059 mam_data = await self._mam.getArchives(client, mam_req,
3080
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1060 service=room_jid)
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1061 except xmpp_error.StanzaError as e:
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1062 if last_mess and e.condition == 'item-not-found':
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1063 log.info(
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1064 f"requested item (with id {stanza_id!r}) can't be found in "
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1065 f"history of {room_jid}, history has probably been purged on "
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1066 f"server.")
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1067 # we get last items like for a new room
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1068 rsm_req = rsm.RSMRequest(max_=50, before='')
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1069 mam_req = mam.MAMRequest(rsm_=rsm_req)
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1070 no_loop=True
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1071 continue
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1072 else:
16925f494820 plugin XEP-0045: don't fail on `item-not-found` with MAM:
Goffi <goffi@goffi.org>
parents: 3060
diff changeset
1073 raise e
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1074 elt_list, rsm_response, mam_response = mam_data
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1075 complete = True if no_loop else mam_response["complete"]
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1076 # we update MAM request for next iteration
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1077 mam_req.rsm.after = rsm_response.last
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1078
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1079 if not elt_list:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1080 break
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1081 else:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1082 count += len(elt_list)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1083
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1084 for mess_elt in elt_list:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1085 try:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1086 fwd_message_elt = self._mam.getMessageFromResult(
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1087 client, mess_elt, mam_req, service=room_jid)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1088 except exceptions.DataError:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1089 continue
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1090 if fwd_message_elt.getAttribute("to"):
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1091 log.warning(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1092 'Forwarded message element has a "to" attribute while it is '
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1093 'forbidden by specifications')
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1094 fwd_message_elt["to"] = client.jid.full()
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1095 try:
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1096 mess_data = client.messageProt.parseMessage(fwd_message_elt)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1097 except Exception as e:
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1098 log.error(
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1099 f"Can't parse message, ignoring it: {e}\n"
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1100 f"{fwd_message_elt.toXml()}"
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1101 )
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1102 continue
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1103 # we attache parsed message data to element, to avoid parsing
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1104 # again in _addToHistory
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1105 fwd_message_elt._mess_data = mess_data
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1106 # and we inject to MUC workflow
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1107 client._muc_client._onGroupChat(fwd_message_elt)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1108
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1109 if not count:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1110 log.info(_("No message received while offline in {room_jid}".format(
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1111 room_jid=room_jid)))
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1112 else:
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1113 log.info(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1114 _("We have received {num_mess} message(s) in {room_jid} while "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1115 "offline.")
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2715
diff changeset
1116 .format(num_mess=count, room_jid=room_jid))
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1117
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1118 # for legacy history, the following steps are done in receivedSubject but for MAM
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1119 # the order is different (we have to join then get MAM archive, so subject
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1120 # is received before archive), so we change state and add the callbacks here.
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1121 self.changeRoomState(room, ROOM_STATE_LIVE)
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1122 history_d.addCallbacks(self._historyCb, self._historyEb, [room],
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1123 errbackArgs=[room])
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1124
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1125 # we wait for all callbacks to be processed
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1126 await history_d
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1127
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1128 async def _join_MAM(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1129 self,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1130 client: SatXMPPEntity,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1131 room_jid: jid.JID,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1132 nick: str,
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1133 password: Optional[str]
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1134 ) -> muc.Room:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1135 """Join room and retrieve history using MAM"""
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1136 room = await super(LiberviaMUCClient, self).join(
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1137 # we don't want any history from room as we'll get it with MAM
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1138 room_jid, nick, muc.HistoryOptions(maxStanzas=0), password=password
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1139 )
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1140 room._history_type = HISTORY_MAM
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1141 # MAM history retrieval can be very long, and doesn't need to be sync, so we don't
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1142 # wait for it
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1143 defer.ensureDeferred(self._get_MAM_history(client, room, room_jid))
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1144 room.fully_joined.callback(room)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1145
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1146 return room
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1147
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1148 async def join(self, room_jid, nick, password=None):
2827
9a3b99acad91 plugin XEP-0045: fixed item-not-found exception when creating a room:
Goffi <goffi@goffi.org>
parents: 2826
diff changeset
1149 room_service = jid.JID(room_jid.host)
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1150 has_mam = await self.host.hasFeature(self.client, mam.NS_MAM, room_service)
2728
1b11da85492c plugin XEP-0045: fixed bad MAM detection on join
Goffi <goffi@goffi.org>
parents: 2724
diff changeset
1151 if not self._mam or not has_mam:
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1152 return await self._join_legacy(self.client, room_jid, nick, password)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1153 else:
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1154 return await self._join_MAM(self.client, room_jid, nick, password)
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1155
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1156 ## presence/roster ##
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1157
1891
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1158 def availableReceived(self, presence):
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1159 """
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1160 Available presence was received.
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1161 """
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1162 # XXX: we override MUCClient.availableReceived to fix bugs
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1163 # (affiliation and role are not set)
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1164
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1165 room, user = self._getRoomUser(presence)
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1166
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1167 if room is None:
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1168 return
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1169
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1170 if user is None:
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1171 nick = presence.sender.resource
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1172 if not nick:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1173 log.warning(_("missing nick in presence: {xml}").format(
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1174 xml = presence.toElement().toXml()))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1175 return
1891
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1176 user = muc.User(nick, presence.entity)
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1177
3101
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1178 # we want to keep statuses with room
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1179 # XXX: presence if broadcasted, and we won't have status code
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1180 # like 110 (REALJID_PUBLIC) after first <presence/> received
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1181 # so we keep only the initial <presence> (with SELF_PRESENCE),
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1182 # thus we check if attribute already exists
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1183 if (not hasattr(room, 'statuses')
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1184 and muc.STATUS_CODE.SELF_PRESENCE in presence.mucStatuses):
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1185 room.statuses = presence.mucStatuses
ab7e8ade848a plugin XEP-0045: added room statuses to metadata:
Goffi <goffi@goffi.org>
parents: 3086
diff changeset
1186
1891
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1187 # Update user data
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1188 user.role = presence.role
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1189 user.affiliation = presence.affiliation
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1190 user.status = presence.status
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1191 user.show = presence.show
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1192
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1193 if room.inRoster(user):
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1194 self.userUpdatedStatus(room, user, presence.show, presence.status)
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1195 else:
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1196 room.addUser(user)
b91c8637c656 plugin XEP-0045: overriden availableReceived method of MUCClient to work around a bug in Wokkel (affiliation and role are not set). TODO: propose a patch upstream
Goffi <goffi@goffi.org>
parents: 1890
diff changeset
1197 self.userJoinedRoom(room, user)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1198
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1199 def unavailableReceived(self, presence):
1358
bf3f669a6052 plugins XEP-0045, XEP-0249, parrot: use JID instead of unicode in many methods + class attributes
souliane <souliane@mailoo.org>
parents: 1356
diff changeset
1200 # XXX: we override this method to manage nickname change
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1201 """
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1202 Unavailable presence was received.
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1203
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1204 If this was received from a MUC room occupant JID, that occupant has
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1205 left the room.
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1206 """
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1207 room, user = self._getRoomUser(presence)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1208
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1209 if room is None or user is None:
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1210 return
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1211
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1212 room.removeUser(user)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1213
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1214 if muc.STATUS_CODE.NEW_NICK in presence.mucStatuses:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1215 self._changing_nicks.add(presence.nick)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1216 self.userChangedNick(room, user, presence.nick)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1217 else:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1218 self._changing_nicks.discard(presence.nick)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1219 self.userLeftRoom(room, user)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1220
74
6e3a06b4dd36 plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents: 73
diff changeset
1221 def userJoinedRoom(self, room, user):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1222 if user.nick == room.nick:
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1223 # we have received our own nick,
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1224 # this mean that the full room roster was received
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1225 self.changeRoomState(room, ROOM_STATE_SELF_PRESENCE)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1226 log.debug("room {room} joined with nick {nick}".format(
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1227 room=room.occupantJID.userhost(), nick=user.nick))
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1228 # we set type so we don't have to use a deferred
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1229 # with disco to check entity type
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1230 self.host.memory.updateEntityData(
3254
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1231 self.client, room.roomJID, C.ENTITY_TYPE, C.ENTITY_TYPE_MUC
6cf4bd6972c2 core, frontends: avatar refactoring:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1232 )
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1233 elif room.state not in (ROOM_STATE_OCCUPANTS, ROOM_STATE_LIVE):
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1234 log.warning(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1235 "Received user presence data in a room before its initialisation "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1236 "(current state: {state}),"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1237 "this is not standard! Ignoring it: {room} ({nick})".format(
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1238 state=room.state,
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1239 room=room.roomJID.userhost(),
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1240 nick=user.nick))
1984
de4fac507dc4 xep-0045: ignore non standard presence received between own presence and room subject
Goffi <goffi@goffi.org>
parents: 1977
diff changeset
1241 return
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1242 else:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1243 if not room.fully_joined.called:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1244 return
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1245 try:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1246 self._changing_nicks.remove(user.nick)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1247 except KeyError:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1248 # this is a new user
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1249 log.debug(_("user {nick} has joined room {room_id}").format(
2994
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1250 nick=user.nick, room_id=room.occupantJID.userhost()))
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1251 if not self.host.trigger.point(
94708a7d3ecf core, plugin XEP-0045: fixed message type autodetection + ENTITY_TYPE_MUC constant:
Goffi <goffi@goffi.org>
parents: 2991
diff changeset
1252 "MUC user joined", room, user, self.client.profile):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1253 return
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1254
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1255 extra = {'info_type': ROOM_USER_JOINED,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1256 'user_affiliation': user.affiliation,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1257 'user_role': user.role,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1258 'user_nick': user.nick
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1259 }
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1260 if user.entity is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1261 extra['user_entity'] = user.entity.full()
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1262 mess_data = { # dict is similar to the one used in client.onMessage
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1263 "from": room.roomJID,
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1264 "to": self.client.jid,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1265 "uid": str(uuid.uuid4()),
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1266 "message": {'': D_("=> {} has joined the room").format(user.nick)},
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1267 "subject": {},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1268 "type": C.MESS_TYPE_INFO,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1269 "extra": extra,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1270 "timestamp": time.time(),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1271 }
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1272 # FIXME: we disable presence in history as it's taking a lot of space
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1273 # while not indispensable. In the future an option may allow
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1274 # to re-enable it
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1275 # self.client.messageAddToHistory(mess_data)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1276 self.client.messageSendToBridge(mess_data)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1277
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
1278
74
6e3a06b4dd36 plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents: 73
diff changeset
1279 def userLeftRoom(self, room, user):
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1280 if not self.host.trigger.point("MUC user left", room, user, self.client.profile):
715
f47d7c09c60b plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents: 713
diff changeset
1281 return
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1282 if user.nick == room.nick:
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1283 # we left the room
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1284 room_jid_s = room.roomJID.userhost()
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1285 log.info(_("Room ({room}) left ({profile})").format(
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1286 room = room_jid_s, profile = self.client.profile))
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1287 self.host.memory.delEntityCache(room.roomJID, profile_key=self.client.profile)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1288 self.host.bridge.mucRoomLeft(room.roomJID.userhost(), self.client.profile)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1289 elif room.state != ROOM_STATE_LIVE:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1290 log.warning("Received user presence data in a room before its initialisation (current state: {state}),"
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1291 "this is not standard! Ignoring it: {room} ({nick})".format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1292 state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1293 room=room.roomJID.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1294 nick=user.nick))
1984
de4fac507dc4 xep-0045: ignore non standard presence received between own presence and room subject
Goffi <goffi@goffi.org>
parents: 1977
diff changeset
1295 return
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1296 else:
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1297 if not room.fully_joined.called:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1298 return
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1299 log.debug(_("user {nick} left room {room_id}").format(nick=user.nick, room_id=room.occupantJID.userhost()))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1300 extra = {'info_type': ROOM_USER_LEFT,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1301 'user_affiliation': user.affiliation,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1302 'user_role': user.role,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1303 'user_nick': user.nick
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1304 }
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1305 if user.entity is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1306 extra['user_entity'] = user.entity.full()
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1307 mess_data = { # dict is similar to the one used in client.onMessage
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1308 "from": room.roomJID,
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1309 "to": self.client.jid,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1310 "uid": str(uuid.uuid4()),
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1311 "message": {'': D_("<= {} has left the room").format(user.nick)},
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1312 "subject": {},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1313 "type": C.MESS_TYPE_INFO,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1314 "extra": extra,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1315 "timestamp": time.time(),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1316 }
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1317 # FIXME: disable history, see userJoinRoom comment
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1318 # self.client.messageAddToHistory(mess_data)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1319 self.client.messageSendToBridge(mess_data)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1320
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
1321 def userChangedNick(self, room, user, new_nick):
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1322 self.host.bridge.mucRoomUserChangedNick(room.roomJID.userhost(), user.nick, new_nick, self.client.profile)
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
1323
77
1ae680f9682e wix: MUC groupchat management + short nick shown in chat window instead of full jid when possible
Goffi <goffi@goffi.org>
parents: 76
diff changeset
1324 def userUpdatedStatus(self, room, user, show, status):
2991
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1325 entity = jid.JID(tuple=(room.roomJID.user, room.roomJID.host, user.nick))
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1326 if hasattr(room, "_cache_presence"):
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1327 # room has a cache for presence, meaning it has not been fully
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1328 # joined yet. So we put presence in cache, and stop workflow.
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1329 # Or delete current presence and continue workflow if it's an
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1330 # "unavailable" presence
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1331 cache = room._cache_presence
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1332 cache[entity] = {
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1333 "room": room,
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1334 "user": user,
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1335 "show": show,
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1336 "status": status,
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1337 }
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1338 return
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1339 statuses = {C.PRESENCE_STATUSES_DEFAULT: status or ''}
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1340 self.host.bridge.presenceUpdate(
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1341 entity.full(), show or '', 0, statuses, self.client.profile)
77
1ae680f9682e wix: MUC groupchat management + short nick shown in chat window instead of full jid when possible
Goffi <goffi@goffi.org>
parents: 76
diff changeset
1342
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1343 ## messages ##
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1344
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
1345 def receivedGroupChat(self, room, user, body):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1346 log.debug('receivedGroupChat: room=%s user=%s body=%s' % (room.roomJID.full(), user, body))
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
1347
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1348 def _addToHistory(self, __, user, message):
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1349 try:
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1350 # message can be already parsed (with MAM), in this case mess_data
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1351 # it attached to the element
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1352 mess_data = message.element._mess_data
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1353 except AttributeError:
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1354 mess_data = self.client.messageProt.parseMessage(message.element)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1355 if mess_data['message'] or mess_data['subject']:
3541
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
1356 return defer.ensureDeferred(
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
1357 self.host.memory.addToHistory(self.client, mess_data)
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
1358 )
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1359 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1360 return defer.succeed(None)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1361
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1362 def _addToHistoryEb(self, failure):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1363 failure.trap(exceptions.CancelError)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1364
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
1365 def receivedHistory(self, room, user, message):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1366 """Called when history (backlog) message are received
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1367
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1368 we check if message is not already in our history
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1369 and add it if needed
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1370 @param room(muc.Room): room instance
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1371 @param user(muc.User, None): the user that sent the message
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1372 None if the message come from the room
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1373 @param message(muc.GroupChat): the parsed message
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1374 """
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1375 if room.state != ROOM_STATE_SELF_PRESENCE:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1376 log.warning(_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1377 "received history in unexpected state in room {room} (state: "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1378 "{state})").format(room = room.roomJID.userhost(),
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1379 state = room.state))
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1380 if not hasattr(room, "_history_d"):
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1381 # XXX: this hack is due to buggy behaviour seen in the wild because of the
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1382 # "mod_delay" prosody module being activated. This module add an
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1383 # unexpected <delay> elements which break our workflow.
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1384 log.warning(_("storing the unexpected message anyway, to avoid loss"))
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1385 # we have to restore URI which are stripped by wokkel parsing
2979
f44a95f566d2 core, plugin XEP-0045: fix crashes when changing URIs:
Goffi <goffi@goffi.org>
parents: 2844
diff changeset
1386 for c in message.element.elements():
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1387 if c.uri is None:
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1388 c.uri = C.NS_CLIENT
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1389 mess_data = self.client.messageProt.parseMessage(message.element)
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1390 message.element._mess_data = mess_data
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1391 self._addToHistory(None, user, message)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1392 if mess_data['message'] or mess_data['subject']:
2794
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1393 self.host.bridge.messageNew(
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1394 *self.client.messageGetBridgeArgs(mess_data),
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1395 profile=self.client.profile
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1396 )
33fa70c102de plugin XEP-0045: fixed crash when <delay> is used at an unexpected time.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
1397 return
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1398 room._history_d.addCallback(self._addToHistory, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1399 room._history_d.addErrback(self._addToHistoryEb)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1400
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1401 ## subject ##
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1402
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1403 def groupChatReceived(self, message):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1404 """
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1405 A group chat message has been received from a MUC room.
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1406
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1407 There are a few event methods that may get called here.
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1408 L{receivedGroupChat}, L{receivedSubject} or L{receivedHistory}.
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1409 """
3060
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1410 # We override this method to fix subject handling (empty strings were discarded)
730bbed77a89 plugin XEP-0045: join / MAM history improvements:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
1411 # FIXME: remove this once fixed upstream
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1412 room, user = self._getRoomUser(message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1413
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1414 if room is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1415 log.warning("No room found for message: {message}"
2986
37b55d87d027 plugin XEP-0045: added a warning if a message is discarded because the room has not been found
Goffi <goffi@goffi.org>
parents: 2979
diff changeset
1416 .format(message=message.toElement().toXml()))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1417 return
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1418
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1419 if message.subject is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1420 self.receivedSubject(room, user, message.subject)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1421 elif message.delay is None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1422 self.receivedGroupChat(room, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1423 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1424 self.receivedHistory(room, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1425
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1426 def subject(self, room, subject):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1427 return muc.MUCClientProtocol.subject(self, room, subject)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1428
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1429 def _historyCb(self, __, room):
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1430 """Called when history have been written to database and subject is received
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1431
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1432 this method will finish joining by:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1433 - sending message to bridge
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1434 - calling fully_joined deferred (for legacy history)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1435 - sending stanza put in cache
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1436 - cleaning variables not needed anymore
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1437 """
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1438 args = self.plugin_parent._getRoomJoinedArgs(room, self.client.profile)
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
1439 self.host.bridge.mucRoomJoined(*args)
4001
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1440 if room._history_type == HISTORY_LEGACY:
32d714a8ea51 plugin XEP-0045: dot not wait for MAM retrieval to be completed:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1441 room.fully_joined.callback(room)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1442 del room._history_d
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1443 del room._history_type
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1444 cache = room._cache
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1445 del room._cache
2822
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
1446 cache_presence = room._cache_presence
5284be4c601b plugin XEP-0045: cache presences if they are received before the room is fully joined:
Goffi <goffi@goffi.org>
parents: 2815
diff changeset
1447 del room._cache_presence
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1448 for elem in cache:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1449 self.client.xmlstream.dispatch(elem)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1450 for presence_data in cache_presence.values():
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1451 if not presence_data['show'] and not presence_data['status']:
2991
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1452 # occupants are already sent in mucRoomJoined, so if we don't have
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1453 # extra information like show or statuses, we can discard the signal
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1454 continue
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1455 else:
f4590ca2acff plugin XEP-0045: avoid sending useless presence signals:
Goffi <goffi@goffi.org>
parents: 2990
diff changeset
1456 self.userUpdatedStatus(**presence_data)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1457
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1458 def _historyEb(self, failure_, room):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1459 log.error("Error while managing history: {}".format(failure_))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1460 self._historyCb(None, room)
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
1461
405
10b4f577d0c0 MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents: 372
diff changeset
1462 def receivedSubject(self, room, user, subject):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1463 # when subject is received, we know that we have whole roster and history
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1464 # cf. http://xmpp.org/extensions/xep-0045.html#enter-subject
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1465 room.subject = subject # FIXME: subject doesn't handle xml:lang
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1466 if room.state != ROOM_STATE_LIVE:
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1467 if room._history_type == HISTORY_LEGACY:
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1468 self.changeRoomState(room, ROOM_STATE_LIVE)
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1469 room._history_d.addCallbacks(self._historyCb, self._historyEb, [room], errbackArgs=[room])
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1470 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1471 # the subject has been changed
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 3015
diff changeset
1472 log.debug(_("New subject for room ({room_id}): {subject}").format(room_id = room.roomJID.full(), subject = subject))
2715
b35c84ea73cf plugin XEP-0045: MAM implementation for MUC
Goffi <goffi@goffi.org>
parents: 2689
diff changeset
1473 self.host.bridge.mucRoomNewSubject(room.roomJID.userhost(), subject, self.client.profile)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1474
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1475 ## disco ##
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1476
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1477 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1478 return [disco.DiscoFeature(NS_MUC)]
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1479
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1480 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1481 # TODO: manage room queries ? Bad for privacy, must be disabled by default
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1482 # see XEP-0045 § 6.7
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1483 return []