annotate sat/plugins/plugin_xep_0045.py @ 2584:f8e4d855001e

plugin XEP-0045: display a note when no configuration is available on the room
author Goffi <goffi@goffi.org>
date Fri, 11 May 2018 18:18:06 +0200
parents 8378806a70fe
children 9680cd958529
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1891
diff changeset
1 #!/usr/bin/env python2
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
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
2483
0046283a285d dates update
Goffi <goffi@goffi.org>
parents: 2468
diff changeset
5 # Copyright (C) 2009-2018 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
1068
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
20 from sat.core.i18n import _, D_
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 811
diff changeset
21 from sat.core.constants import Const as C
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
22 from sat.core.log import getLogger
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
23 log = getLogger(__name__)
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
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
25 from twisted.words.protocols.jabber import jid
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
26 from twisted.python import failure
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
27 from dateutil.tz import tzutc
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
28
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
29 from sat.core import exceptions
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
30 from sat.memory import memory
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
31
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
32 import calendar
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
33 import time
319
5bb1cfc105d0 plugin xep-0045: misc improvments
Goffi <goffi@goffi.org>
parents: 291
diff changeset
34 import uuid
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
35 import copy
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
36
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
37 from wokkel import muc, disco, iwokkel
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
38 from sat.tools import xml_tools
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
39
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
40 from zope.interface import implements
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
41
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
42
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
43 PLUGIN_INFO = {
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
44 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
45 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
46 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
47 C.PI_PROTOCOLS: ["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_DEPENDENCIES: [],
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
49 C.PI_RECOMMENDATIONS: [C.TEXT_CMDS],
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
50 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
51 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
52 C.PI_DESCRIPTION: _("""Implementation of Multi-User Chat""")
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
53 }
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
54
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
55 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
56 AFFILIATIONS = ('owner', 'admin', 'member', 'none', 'outcast')
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
57 ROOM_USER_JOINED = 'ROOM_USER_JOINED'
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
58 ROOM_USER_LEFT = 'ROOM_USER_LEFT'
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
59 OCCUPANT_KEYS = ('nick', 'entity', 'affiliation', 'role')
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
60 ENTITY_TYPE_MUC = "MUC"
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 ROOM_STATE_OCCUPANTS = "occupants"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
62 ROOM_STATE_SELF_PRESENCE = "self-presence"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
63 ROOM_STATE_LIVE = "live"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
64 ROOM_STATES = (ROOM_STATE_OCCUPANTS, ROOM_STATE_SELF_PRESENCE, ROOM_STATE_LIVE)
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
66
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
67 CONFIG_SECTION = u'plugin 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
68
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
69 default_conf = {"default_muc": u'sat@chat.jabberfr.org'}
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
70
594
e629371a28d3 Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 588
diff changeset
71
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
72 class AlreadyJoined(exceptions.ConflictError):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
73
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
74 def __init__(self, room):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
75 super(AlreadyJoined, self).__init__()
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
76 self.room = room
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
77
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
78
588
beaf6bec2fcd Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 587
diff changeset
79 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
80 # 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
81 # FIXME: this plugin need a good cleaning, join method is messy
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
82
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
83 def __init__(self, host):
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
84 log.info(_("Plugin XEP_0045 initialization"))
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
85 self.host = host
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
86 self._sessions = memory.Sessions()
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
87 host.bridge.addMethod("mucJoin", ".plugin", in_sign='ssa{ss}s', out_sign='(bsa{sa{ss}}sss)', method=self._join, async=True) # return same arguments as mucRoomJoined + a boolean set to True is the room was already joined (first argument)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
88 host.bridge.addMethod("mucNick", ".plugin", in_sign='sss', out_sign='', method=self._nick)
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
89 host.bridge.addMethod("mucNickGet", ".plugin", in_sign='ss', out_sign='s', method=self._getRoomNick)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
90 host.bridge.addMethod("mucLeave", ".plugin", in_sign='ss', out_sign='', method=self._leave, async=True)
2021
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
91 host.bridge.addMethod("mucSubject", ".plugin", in_sign='sss', out_sign='', method=self._subject)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
92 host.bridge.addMethod("mucGetRoomsJoined", ".plugin", in_sign='s', out_sign='a(sa{sa{ss}}ss)', method=self._getRoomsJoined)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
93 host.bridge.addMethod("mucGetUniqueRoomName", ".plugin", in_sign='ss', out_sign='s', method=self._getUniqueName)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
94 host.bridge.addMethod("mucConfigureRoom", ".plugin", in_sign='ss', out_sign='s', method=self._configureRoom, async=True)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
95 host.bridge.addMethod("mucGetDefaultService", ".plugin", in_sign='', out_sign='s', method=self.getDefaultMUC)
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
96 host.bridge.addMethod("mucGetService", ".plugin", in_sign='ss', out_sign='s', method=self._getMUCService, async=True)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
97 host.bridge.addSignal("mucRoomJoined", ".plugin", signature='sa{sa{ss}}sss') # args: room_jid, occupants, user_nick, subject, profile
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
98 host.bridge.addSignal("mucRoomLeft", ".plugin", signature='ss') # args: room_jid, profile
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
99 host.bridge.addSignal("mucRoomUserChangedNick", ".plugin", signature='ssss') # args: room_jid, old_nick, new_nick, profile
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
100 host.bridge.addSignal("mucRoomNewSubject", ".plugin", signature='sss') # args: room_jid, subject, profile
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
101 self.__submit_conf_id = host.registerCallback(self._submitConfiguration, with_data=True)
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
102 self._room_join_id = host.registerCallback(self._UIRoomJoinCb, with_data=True)
1538
55967cf161b1 reverted patch ad4ec8d9235e: there must not be security limit on room configuration
Goffi <goffi@goffi.org>
parents: 1466
diff changeset
103 host.importMenu((D_("MUC"), D_("configure")), self._configureRoomMenu, security_limit=0, 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
104 try:
1992
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
105 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
106 except KeyError:
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
107 log.info(_(u"Text commands not available"))
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
108 else:
1992
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
109 self.text_cmds.registerTextCommands(self)
d5befe7253aa plugin XEP-0045: fixed typo in text commands
Goffi <goffi@goffi.org>
parents: 1990
diff changeset
110 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
111
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
112 host.trigger.add("presence_available", self.presenceTrigger)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
113 host.trigger.add("MessageReceived", self.messageReceivedTrigger, priority=1000000)
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
114
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2066
diff changeset
115 def profileConnected(self, client):
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
116 def assign_service(service):
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
117 client.muc_service = service
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
118 return self.getMUCService(client).addCallback(assign_service)
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
119
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
120 def messageReceivedTrigger(self, client, message_elt, post_treat):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
121 if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
122 if message_elt.subject or message_elt.delay:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
123 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
124 from_jid = jid.JID(message_elt['from'])
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
125 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
126 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
127 room = client._muc_client.joined_rooms[room_jid]
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
128 if room.state != ROOM_STATE_LIVE:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
129 log.warning(_(u"Received non delayed message in a room before its initialisation: state={state}, msg={msg}").format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
130 state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
131 msg=message_elt.toXml()))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
132 room._cache.append(message_elt)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
133 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
134 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
135 log.warning(u"Received groupchat message for a room which has not been joined, ignoring it: {}".format(message_elt.toXml()))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
136 return False
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
137 return True
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
138
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
139 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
140 """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
141
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
142 @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
143 """
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
144 if room_jid not 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
145 raise exceptions.NotFound(_(u"This room has not been joined"))
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
146
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
147 def isJoinedRoom(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
148 """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
149
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
150 @room_jid(jid.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
151 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
152 try:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
153 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
154 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
155 return False
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
156 else:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
157 return True
1083
e8731b02f5ea plugin XEP-0045: small refactorization + clean on profile's disconnection
souliane <souliane@mailoo.org>
parents: 1082
diff changeset
158
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
159 def _getRoomJoinedArgs(self, room, profile):
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
160 return [
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
161 room.roomJID.userhost(),
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
162 XEP_0045._getOccupants(room),
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
163 room.nick,
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
164 room.subject,
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
165 profile
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
166 ]
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
167
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
168 def _UIRoomJoinCb(self, data, profile):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
169 room_jid = jid.JID(data['index'])
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
170 client = self.host.getClient(profile)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
171 self.join(client, room_jid)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
172 return {}
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
173
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
174 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
175 """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
176 if C.bool(data.get(C.XMLUI_DATA_CANCELLED, "false")):
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
177 log.info(u"room join for {} is cancelled".format(room_jid.userhost()))
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
178 raise failure.Failure(exceptions.CancelError(D_(u"Room joining cancelled by user")))
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
179 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
180 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
181
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
182 def _showListUI(self, items, client, service):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
183 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
184 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
185 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
186 for item in items:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
187 adv_list.setRowIndex(item.entity.full())
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
188 xmlui.addText(item.name)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
189 adv_list.end()
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
190 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
191
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
192 def _joinCb(self, room, client, room_jid, nick):
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
193 """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
194 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
195 # 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
196 # 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
197 # a proper configuration management should be done
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
198 log.debug(_(u"room locked !"))
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
199 d = client._muc_client.configure(room.roomJID, {})
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
200 d.addErrback(lambda dummy: log.error(_(u'Error while configuring the room')))
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
201 return room.fully_joined
319
5bb1cfc105d0 plugin xep-0045: misc improvments
Goffi <goffi@goffi.org>
parents: 291
diff changeset
202
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
203 def _joinEb(self, failure, client, room_jid, nick, password):
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
204 """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
205 try:
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
206 condition = failure.value.condition
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
207 except AttributeError:
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
208 msg_suffix = ''
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
209 else:
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
210 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
211 # 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
212 nick += '_'
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
213 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
214 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
215 # room is restricted, we need a password
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
216 password_ui = xml_tools.XMLUI("form", title=D_(u'Room {} is restricted').format(room_jid.userhost()), submit_id='')
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
217 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
218 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
219 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
220 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
221 return d
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
222
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
223 msg_suffix = ' with condition "{}"'.format(failure.value.condition)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
224
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
225 mess = D_(u"Error while joining the room {room}{suffix}".format(
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
226 room = room_jid.userhost(), suffix = msg_suffix))
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
227 log.error(mess)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
228 xmlui = xml_tools.note(mess, D_(u"Group chat error"), level=C.XMLUI_DATA_LVL_ERROR)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
229 self.host.actionNew({'xmlui': xmlui.toXml()}, profile=client.profile)
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
230
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
231 @staticmethod
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
232 def _getOccupants(room):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
233 """Get occupants of a room in a form suitable for bridge"""
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
234 return {u.nick: {k:unicode(getattr(u,k) or '') for k in OCCUPANT_KEYS} for u in room.roster.values()}
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
235
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
236 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
237 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
238 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
239
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
240 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
241 """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
242 result = []
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
243 for room in client._muc_client.joined_rooms.values():
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
244 if room.state == ROOM_STATE_LIVE:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
245 result.append((room.roomJID.userhost(), self._getOccupants(room), room.nick, room.subject))
78
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
246 return result
ace2af8abc5a Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents: 77
diff changeset
247
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
248 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
249 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
250 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
251
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
252 def getRoomNick(self, client, room_jid):
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 91
diff changeset
253 """return nick used in room by user
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
254
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
255 @param room_jid (jid.JID): JID of the room
93
2f87651a5ad8 Tarot game: basic trick
Goffi <goffi@goffi.org>
parents: 91
diff changeset
256 @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
257 @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
258 @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
259 """
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
260 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
261 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
262
916
1a759096ccbd core: use of Const for profile_key + replaced '@DEFAULT@' default profile_key by '@NONE@'
Goffi <goffi@goffi.org>
parents: 811
diff changeset
263 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
264 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
265 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
266 d.addCallback(lambda xmlui: xmlui.toXml())
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
267 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
268
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
269 def _configureRoomMenu(self, menu_data, profile):
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
270 """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
271
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
272 @param menu_data: %(menu_data)s
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
273 @param profile: %(doc_profile)s
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
274 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
275 client = self.host.getClient(profile)
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
276 try:
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
277 room_jid = jid.JID(menu_data['room_jid'])
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
278 except KeyError:
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
279 log.error(_("room_jid key is not present !"))
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
280 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
281
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
282 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
283 if not xmlui:
f8e4d855001e plugin XEP-0045: display a note when no configuration is available on the room
Goffi <goffi@goffi.org>
parents: 2583
diff changeset
284 msg = D_(u"No configuration available for this room")
f8e4d855001e plugin XEP-0045: display a note when no configuration is available on the room
Goffi <goffi@goffi.org>
parents: 2583
diff changeset
285 return {"xmlui": xml_tools.note(msg).toXml()}
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
286 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
287 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
288
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
289 def configureRoom(self, client, room_jid):
1094
4286a19e9e8a pluging XEP-0045: configure room dynamic menu
Goffi <goffi@goffi.org>
parents: 1083
diff changeset
290 """return the room configuration form
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
291
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
292 @param room: jid of the room to configure
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
293 @return: configuration form as XMLUI
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
294 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
295 self.checkRoomJoined(client, room_jid)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
296
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
297 def config2XMLUI(result):
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
298 if not result:
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
299 return ""
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
300 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
301 session_data["room_jid"] = room_jid
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
302 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
303 xmlui.session_id = session_id
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
304 return xmlui
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
305
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
306 d = client._muc_client.getConfiguration(room_jid)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
307 d.addCallback(config2XMLUI)
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
308 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
309
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
310 def _submitConfiguration(self, raw_data, profile):
2583
8378806a70fe plugin XEP-0045: fixed room configuration cancellation
Goffi <goffi@goffi.org>
parents: 2581
diff changeset
311 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
312 if cancelled:
8378806a70fe plugin XEP-0045: fixed room configuration cancellation
Goffi <goffi@goffi.org>
parents: 2581
diff changeset
313 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
314 client = self.host.getClient(profile)
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
315 try:
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
316 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
317 except KeyError:
1068
1513511a0586 plugin XEP-0045: room configuration returns a success or failure message
souliane <souliane@mailoo.org>
parents: 1007
diff changeset
318 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
319 _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
320 _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
321 return defer.succeed({'xmlui': _dialog.toXml()})
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
322
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
323 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
324 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
325 _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
326 _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
327 d.addCallback(lambda ignore: {'xmlui': _dialog.toXml()})
801
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
328 del self._sessions[raw_data["session_id"]]
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
329 return d
02ee9ef95277 plugin XEP-0045, primitivus: added MUC configuration
Goffi <goffi@goffi.org>
parents: 791
diff changeset
330
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
331 def isNickInRoom(self, client, room_jid, nick):
522
3446ce33247d plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents: 519
diff changeset
332 """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
333 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
334 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
335
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
336 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
337 client = self.host.getClient(profile)
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
338 d = self.getMUCService(client, jid_ or None)
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
339 d.addCallback(lambda service_jid: service_jid.full() if service_jid is not None else u'')
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
340 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
341
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
342 @defer.inlineCallbacks
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
343 def getMUCService(self, client, jid_=None):
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
344 """Return first found MUC service of an entity
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
345
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
346 @param jid_: entity which may have a MUC service, or None for our own server
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
347 @return (jid.JID, None): found service jid or None
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
348 """
2468
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
349 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
350 try:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
351 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
352 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
353 pass
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
354 else:
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
355 # we have a cached value, we return it
8f14c1865e9e plugin XEP-0045: new mucGetService bridge method to retrieve MUC service of the server.
Goffi <goffi@goffi.org>
parents: 2461
diff changeset
356 defer.returnValue(muc_service)
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
357 services = yield self.host.findServiceEntities(client, "conference", "text", jid_)
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
358 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
359 if ".irc." not in service.userhost():
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
360 # FIXME:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
361 # 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
362 # 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
363 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
364 break
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
365 defer.returnValue(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
366
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
367 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
368 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
369 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
370
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
371 def getUniqueName(self, client, muc_service=None):
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
372 """Return unique name for a room, avoiding collision
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
373
1356
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
374 @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
375 @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
376 """
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
377 # TODO: we should use #RFC-0045 10.1.4 when available here
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
378 room_name = unicode(uuid.uuid4())
944
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
379 if muc_service is None:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
380 try:
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
381 muc_service = client.muc_service
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
382 except AttributeError:
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
383 raise exceptions.NotReady(u"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
384 if muc_service is None:
993
301b342c697a core: use of the new core.log module:
Goffi <goffi@goffi.org>
parents: 950
diff changeset
385 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
386 raise exceptions.FeatureNotFound
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
387
e1842ebcb2f3 core, plugin XEP-0115: discovery refactoring:
Goffi <goffi@goffi.org>
parents: 928
diff changeset
388 muc_service = muc_service.userhost()
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
389 return jid.JID(u"{}@{}".format(room_name, muc_service))
319
5bb1cfc105d0 plugin xep-0045: misc improvments
Goffi <goffi@goffi.org>
parents: 291
diff changeset
390
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
391 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
392 """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
393
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
394 @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
395 """
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
396 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
397
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
398 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
399 failure_.trap(AlreadyJoined)
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
400 room = failure_.value.room
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
401 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
402
2028
70bd7b242a9e plugin XEP-0045: fixed options parameter handling in bridge callback
Goffi <goffi@goffi.org>
parents: 2021
diff changeset
403 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
404 """join method used by bridge
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
405
2461
34cb8b713370 plugin XEP-0045: added mucNickGet to retrieve our nickname in a MUC room
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
406 @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
407 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
408 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
409 if room_jid_s:
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
410 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
411 try:
c01cbd8fc8dd plugin XEP-0045: make joinMUC asynchronous and fixes its handler
souliane <souliane@mailoo.org>
parents: 1315
diff changeset
412 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
413 except (RuntimeError, jid.InvalidFormat, AttributeError):
2170
d246666ebe25 i18n: updated sat.po
Goffi <goffi@goffi.org>
parents: 2149
diff changeset
414 return defer.fail(jid.InvalidFormat(_(u"Invalid room identifier: {room_id}'. Please give a room short or full identifier like 'room' or 'room@{muc_service}'.").format(
d246666ebe25 i18n: updated sat.po
Goffi <goffi@goffi.org>
parents: 2149
diff changeset
415 room_id=room_jid_s,
d246666ebe25 i18n: updated sat.po
Goffi <goffi@goffi.org>
parents: 2149
diff changeset
416 muc_service=unicode(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
417 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
418 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
419 else:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
420 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
421 # 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
422 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
423 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
424 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
425 return d
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
426
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
427 def join(self, client, room_jid, nick=None, options=None):
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
428 if not nick:
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
429 nick = client.jid.user
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
430 if options is None:
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
431 options = {}
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
432 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
433 room = client._muc_client.joined_rooms[room_jid]
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
434 log.info(_(u'{profile} is already in room {room_jid}').format(profile=client.profile, room_jid = room_jid.userhost()))
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
435 return defer.fail(AlreadyJoined(room))
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
436 log.info(_(u"[{profile}] is joining room {room} with nick {nick}").format(profile=client.profile, room=room_jid.userhost(), nick=nick))
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
437
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
438 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
439
1986
fbd313cfd40b plugin xep-0045: ask for password when getting a "not-allowed" error
Goffi <goffi@goffi.org>
parents: 1984
diff changeset
440 return client._muc_client.join(room_jid, nick, password).addCallbacks(self._joinCb, self._joinEb, (client, room_jid, nick), errbackArgs=(client, room_jid, nick, password))
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
441
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
442 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
443 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
444 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
445
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
446 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
447 """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
448 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
449 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
450
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
451 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
452 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
453 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
454
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
455 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
456 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
457 return client._muc_client.leave(room_jid)
505
2402668b5d05 plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents: 488
diff changeset
458
2021
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
459 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
460 client = self.host.getClient(profile_key)
6c51e8f17c92 plugin XEP-0045: added bridge method to change subject
Goffi <goffi@goffi.org>
parents: 1992
diff changeset
461 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
462
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
463 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
464 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
465 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
466
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2066
diff changeset
467 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
468 # create a MUC client and associate it with profile' session
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
469 muc_client = client._muc_client = SatMUCClient(self)
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
470 return muc_client
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
471
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
472 def kick(self, client, nick, room_jid, options=None):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
473 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
474 Kick a participant from the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
475 @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
476 @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
477 @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
478 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
479 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
480 options = {}
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
481 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
482 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
483
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
484 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
485 """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
486
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
487 @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
488 @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
489 @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
490 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
491 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
492 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
493 options = {}
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
494 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
495 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
496 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
497
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
498 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
499 """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
500
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
501 @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
502 @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
503 @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
504 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
505 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
506 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
507 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
508 assert 'affiliation' in options
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
509 # 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
510 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
511
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
512 # 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
513
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
514 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
515 """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
516
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
517 @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
518 - 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
519 """
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
520 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
521 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
522 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
523 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
524
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
525 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
526
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
527 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
528 """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
529
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
530 @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
531 - 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
532 """
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
533 if mess_data["unparsed"].strip():
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
534 room_jid = self.text_cmds.getRoomJID(mess_data["unparsed"].strip(), mess_data["to"].host)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
535 nick = (self.getRoomNick(client, room_jid) or
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
536 client.jid.user)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
537 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
538
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
539 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
540
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
541 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
542 """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
543
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
544 @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
545 - 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
546 """
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
547 if mess_data["unparsed"].strip():
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
548 room = self.text_cmds.getRoomJID(mess_data["unparsed"].strip(), 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
549 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
550 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
551
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
552 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
553
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
554 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
555
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
556 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
557 """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
558
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
559 @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
560 - 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
561 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
562 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
563
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
564 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
565 """kick a room member
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
566
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
567 @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
568 - 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
569 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
570 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
571 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
572 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
573 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
574 except (IndexError, AssertionError):
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
575 feedback = _(u"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
576 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
577 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
578
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
579 d = self.kick(client, nick, mess_data["to"], {} if len(options) == 1 else {'reason': options[1]})
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
580
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
581 def cb(dummy):
1890
0a45bc8e7cf4 plugin XEP-0045: fixed feedback for /kick /ban and /afficiliate commands which should not be public
Goffi <goffi@goffi.org>
parents: 1789
diff changeset
582 feedback_msg = _(u'You have kicked {}').format(nick)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
583 if len(options) > 1:
1890
0a45bc8e7cf4 plugin XEP-0045: fixed feedback for /kick /ban and /afficiliate commands which should not be public
Goffi <goffi@goffi.org>
parents: 1789
diff changeset
584 feedback_msg += _(u' for the following reason: {}').format(options[1])
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
585 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
586 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
587 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
588 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
589
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
590 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
591 """ban an entity from the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
592
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
593 @command (group): (JID) [reason]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
594 - 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
595 - 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
596 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
597 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
598 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
599 jid_s = options[0]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
600 entity_jid = jid.JID(jid_s).userhostJID()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
601 assert(entity_jid.user)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
602 assert(entity_jid.host)
1742
244a605623d6 complete the Exception's list when catching JID error:
souliane <souliane@mailoo.org>
parents: 1700
diff changeset
603 except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError, AssertionError):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
604 feedback = _(u"You must provide a valid JID to ban, like in '/ban contact@example.net'")
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
605 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
606 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
607
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
608 d = self.ban(client, entity_jid, mess_data["to"], {} if len(options) == 1 else {'reason': options[1]})
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
609
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
610 def cb(dummy):
1890
0a45bc8e7cf4 plugin XEP-0045: fixed feedback for /kick /ban and /afficiliate commands which should not be public
Goffi <goffi@goffi.org>
parents: 1789
diff changeset
611 feedback_msg = _(u'You have banned {}').format(entity_jid)
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
612 if len(options) > 1:
1890
0a45bc8e7cf4 plugin XEP-0045: fixed feedback for /kick /ban and /afficiliate commands which should not be public
Goffi <goffi@goffi.org>
parents: 1789
diff changeset
613 feedback_msg += _(u' for the following reason: {}').format(options[1])
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
614 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
615 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
616 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
617 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
618
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
619 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
620 """affiliate an entity to the room
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
621
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
622 @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
623 - 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
624 - owner: grant owner privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
625 - admin: grant admin privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
626 - member: grant member privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
627 - none: reset entity privileges
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
628 - outcast: ban entity
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
629 """
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
630 options = mess_data["unparsed"].strip().split()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
631 try:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
632 jid_s = options[0]
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
633 entity_jid = jid.JID(jid_s).userhostJID()
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
634 assert(entity_jid.user)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
635 assert(entity_jid.host)
1742
244a605623d6 complete the Exception's list when catching JID error:
souliane <souliane@mailoo.org>
parents: 1700
diff changeset
636 except (RuntimeError, jid.InvalidFormat, AttributeError, IndexError, AssertionError):
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
637 feedback = _(u"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
638 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
639 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
640
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
641 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
642 if affiliation not in AFFILIATIONS:
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
643 feedback = _(u"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
644 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
645 return False
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
646
1977
bdc6a5b07922 plugin XEP-0045: fixed calls to join, nick, kick, ban and affiliate
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
647 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
648
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
649 def cb(dummy):
1890
0a45bc8e7cf4 plugin XEP-0045: fixed feedback for /kick /ban and /afficiliate commands which should not be public
Goffi <goffi@goffi.org>
parents: 1789
diff changeset
650 feedback_msg = _(u'New affiliation for %(entity)s: %(affiliation)s').format(entity=entity_jid, affiliation=affiliation)
1989
757c512fe06c plugin XEP-0045: various fixes/improvments:
Goffi <goffi@goffi.org>
parents: 1986
diff changeset
651 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
652 return True
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
653 d.addCallback(cb)
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
654 return d
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
655
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
656 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
657 """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
658
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
659 @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
660 - 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
661 """
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
662 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
663
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
664 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
665 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
666 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
667
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
668 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
669
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
670 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
671 """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
672
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 @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
674 - 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
675 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
676 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
677
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
678 def cmd_list(self, client, mess_data):
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
679 """list available rooms in a muc server
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
680
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
681 @command (all): [MUC_SERVICE]
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
682 - MUC_SERVICE: service to request
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
683 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
684 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
685 """
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
686 unparsed = mess_data["unparsed"].strip()
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
687 try:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
688 service = jid.JID(unparsed)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
689 except RuntimeError:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
690 if mess_data['type'] == C.MESS_TYPE_GROUPCHAT:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
691 room_jid = mess_data["to"]
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
692 service = jid.JID(room_jid.host)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
693 elif client.muc_service is not None:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
694 service = client.muc_service
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
695 else:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
696 msg = D_(u"No known default MUC service".format(unparsed))
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
697 self.text_cmds.feedBack(client, msg, mess_data)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
698 return False
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
699 except jid.InvalidFormat:
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
700 msg = D_(u"{} is not a valid JID!".format(unparsed))
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
701 self.text_cmds.feedBack(client, msg, mess_data)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
702 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
703 d = self.host.getDiscoItems(client, service)
1990
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
704 d.addCallback(self._showListUI, client, service)
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
705
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
706 return False
dfbe0bb056dc plugin XEP-0045: added /list text command:
Goffi <goffi@goffi.org>
parents: 1989
diff changeset
707
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
708 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
709 """ 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
710 if mess_data['type'] != "groupchat":
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
711 return
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
712 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
713 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
714 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
715 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
716 return
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
717 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
718 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
719 if user.entity:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
720 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
721 if user.affiliation != 'none':
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
722 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
723 if user.role != 'none':
928
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
724 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
725 if user.status:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
726 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
727 if user.show:
73873e9b56f7 plugin XEP-0045: added user information to /whois text command
Goffi <goffi@goffi.org>
parents: 926
diff changeset
728 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
729
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
730 def presenceTrigger(self, presence_elt, client):
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
731 # XXX: shouldn't it be done by the server ?!!
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
732 muc_client = client._muc_client
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
733 for room_jid, room in muc_client.joined_rooms.iteritems():
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
734 elt = copy.deepcopy(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
735 elt['to'] = room_jid.userhost() + '/' + room.nick
1239
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
736 client.presence.send(elt)
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
737 return True
b6dbac8ee485 plugin XEP-0045: handle MUC presence
souliane <souliane@mailoo.org>
parents: 1199
diff changeset
738
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
739
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
740 class SatMUCClient(muc.MUCClient):
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
741 implements(iwokkel.IDisco)
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
742
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
743 def __init__(self, plugin_parent):
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
744 self.plugin_parent = plugin_parent
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
745 self.host = plugin_parent.host
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
746 muc.MUCClient.__init__(self)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
747 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
748 # and to discard userJoinedRoom signal in this case
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
749 print "init SatMUCClient OK"
515
29b5ef129488 plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents: 509
diff changeset
750
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
751 @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
752 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
753 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
754
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
755 def changeRoomState(self, room, new_state):
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
756 """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
757
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
758 @param new_state: one of ROOM_STATE_*
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
759 """
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
760 new_state_idx = ROOM_STATES.index(new_state)
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
761 if new_state_idx == -1:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
762 raise exceptions.InternalError("unknown room state")
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
763 if new_state_idx < 1:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
764 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
765 room=room.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
766 state=new_state))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
767 expected_state = ROOM_STATES[new_state_idx-1]
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
768 if room.state != expected_state:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
769 log.warning(_(u"room {room} is not in expected state: room is in state {current_state} while we were expecting {expected_state}").format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
770 room=room.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
771 current_state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
772 expected_state=expected_state))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
773 room.state = new_state
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
774
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
775 def _addRoom(self, room):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
776 super(SatMUCClient, self)._addRoom(room)
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
777 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
778 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
779 room._history_d = defer.Deferred() # used to send bridge signal once backlog are written in history
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
780 room._history_d.callback(None)
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
781 # 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
782 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
783 # cache data until room is ready
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
784 # 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
785 room._cache = []
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
786
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
787 @defer.inlineCallbacks
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
788 def join(self, room_jid, nick, password=None):
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
789 mess_data_list = yield self.host.memory.historyGet(self.parent.jid.userhostJID(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
790 room_jid,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
791 1,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
792 True,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
793 profile=self.parent.profile)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
794 if mess_data_list:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
795 timestamp = mess_data_list[0][1]
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
796 # 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
797 # 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
798 seconds = int(time.time() - timestamp) - 1
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
799 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
800 seconds = None
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
801 room = yield super(SatMUCClient, self).join(room_jid, nick, muc.HistoryOptions(seconds=seconds), password)
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
802 defer.returnValue(room)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
803
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
804 ## presence/roster ##
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
805
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
806 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
807 """
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
808 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
809 """
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
810 # 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
811 # (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
812
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
813 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
814
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
815 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
816 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
817
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
818 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
819 nick = presence.sender.resource
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
820 if not nick:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
821 log.warning(_(u"missing nick in presence: {xml}").format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
822 xml = presence.toElement().toXml()))
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
823 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
824 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
825
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
826 # 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
827 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
828 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
829 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
830 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
831
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
832 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
833 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
834 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
835 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
836 self.userJoinedRoom(room, user)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
837
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
838 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
839 # 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
840 """
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
841 Unavailable presence was received.
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
842
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
843 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
844 left the room.
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
845 """
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
846 room, user = self._getRoomUser(presence)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
847
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
848 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
849 return
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
850
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
851 room.removeUser(user)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
852
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
853 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
854 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
855 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
856 else:
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
857 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
858 self.userLeftRoom(room, user)
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
859
74
6e3a06b4dd36 plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents: 73
diff changeset
860 def userJoinedRoom(self, room, user):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
861 if user.nick == room.nick:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
862 # we have received our own nick, 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
863 self.changeRoomState(room, ROOM_STATE_SELF_PRESENCE)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
864 log.debug(u"room {room} joined with nick {nick}".format(room=room.occupantJID.userhost(), nick=user.nick))
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
865 # We set type so we don't have to use a deferred with disco to check entity type
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
866 self.host.memory.updateEntityData(room.roomJID, C.ENTITY_TYPE, ENTITY_TYPE_MUC, profile_key=self.parent.profile)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
867 elif room.state not in (ROOM_STATE_OCCUPANTS, ROOM_STATE_LIVE):
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
868 log.warning(u"Received user presence data in a room before its initialisation (current state: {state}),"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
869 "this is not standard! Ignoring it: {room} ({nick})".format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
870 state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
871 room=room.roomJID.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
872 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
873 return
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
874 else:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
875 if not room.fully_joined.called:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
876 return
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
877 try:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
878 self._changing_nicks.remove(user.nick)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
879 except KeyError:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
880 # this is a new user
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
881 log.debug(_(u"user {nick} has joined room {room_id}").format(nick=user.nick, room_id=room.occupantJID.userhost()))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
882 if not self.host.trigger.point("MUC user joined", room, user, self.parent.profile):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
883 return
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
884
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
885 extra = {'info_type': ROOM_USER_JOINED,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
886 'user_affiliation': user.affiliation,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
887 'user_role': user.role,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
888 'user_nick': user.nick
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
889 }
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
890 if user.entity is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
891 extra['user_entity'] = user.entity.full()
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
892 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
893 "from": room.roomJID,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
894 "to": self.parent.jid,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
895 "uid": unicode(uuid.uuid4()),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
896 "message": {'': D_(u"=> {} has joined the room").format(user.nick)},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
897 "subject": {},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
898 "type": C.MESS_TYPE_INFO,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
899 "extra": extra,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
900 "timestamp": time.time(),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
901 }
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
902 # 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
903 # 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
904 # to re-enable it
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
905 # self.parent.messageAddToHistory(mess_data)
2149
a0e6f7951bd7 plugin XEP-0045: fix after client refactoring
Goffi <goffi@goffi.org>
parents: 2148
diff changeset
906 self.parent.messageSendToBridge(mess_data)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
907
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
908
74
6e3a06b4dd36 plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents: 73
diff changeset
909 def userLeftRoom(self, room, user):
715
f47d7c09c60b plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents: 713
diff changeset
910 if not self.host.trigger.point("MUC user left", room, user, self.parent.profile):
f47d7c09c60b plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents: 713
diff changeset
911 return
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
912 if user.nick == room.nick:
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
913 # we left the room
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
914 room_jid_s = room.roomJID.userhost()
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
915 log.info(_(u"Room ({room}) left ({profile})").format(
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
916 room = room_jid_s, profile = self.parent.profile))
1082
246712d2e7bc plugin XEP-0045, text_commands: add some commands:
souliane <souliane@mailoo.org>
parents: 1068
diff changeset
917 self.host.memory.delEntityCache(room.roomJID, profile_key=self.parent.profile)
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
918 self.host.bridge.mucRoomLeft(room.roomJID.userhost(), self.parent.profile)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
919 elif room.state != ROOM_STATE_LIVE:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
920 log.warning(u"Received user presence data in a room before its initialisation (current state: {state}),"
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
921 "this is not standard! Ignoring it: {room} ({nick})".format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
922 state=room.state,
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
923 room=room.roomJID.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
924 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
925 return
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
926 else:
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
927 if not room.fully_joined.called:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
928 return
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
929 log.debug(_(u"user {nick} left room {room_id}").format(nick=user.nick, room_id=room.occupantJID.userhost()))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
930 extra = {'info_type': ROOM_USER_LEFT,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
931 'user_affiliation': user.affiliation,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
932 'user_role': user.role,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
933 'user_nick': user.nick
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
934 }
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
935 if user.entity is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
936 extra['user_entity'] = user.entity.full()
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
937 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
938 "from": room.roomJID,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
939 "to": self.parent.jid,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
940 "uid": unicode(uuid.uuid4()),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
941 "message": {'': D_(u"<= {} has left the room").format(user.nick)},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
942 "subject": {},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
943 "type": C.MESS_TYPE_INFO,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
944 "extra": extra,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
945 "timestamp": time.time(),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
946 }
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
947 # FIXME: disable history, see userJoinRoom comment
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
948 # self.parent.messageAddToHistory(mess_data)
2149
a0e6f7951bd7 plugin XEP-0045: fix after client refactoring
Goffi <goffi@goffi.org>
parents: 2148
diff changeset
949 self.parent.messageSendToBridge(mess_data)
507
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
950
f98bef71a918 frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents: 505
diff changeset
951 def userChangedNick(self, room, user, new_nick):
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
952 self.host.bridge.mucRoomUserChangedNick(room.roomJID.userhost(), user.nick, new_nick, self.parent.profile)
72
f271fff3a713 MUC implementation: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
953
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
954 def userUpdatedStatus(self, room, user, show, status):
1417
176de79c8c39 core, plugin XEP-0045, frontends: change frontend method "setStatusOnline" for "setPresenceStatus":
souliane <souliane@mailoo.org>
parents: 1409
diff changeset
955 self.host.bridge.presenceUpdate(room.roomJID.userhost() + '/' + user.nick, show or '', 0, {C.PRESENCE_STATUSES_DEFAULT: status or ''}, self.parent.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
956
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
957 ## messages ##
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
958
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
959 def receivedGroupChat(self, room, user, body):
1409
3265a2639182 massive (preventive) addition of 'u' (unicode) before the strings passed to logging functions
souliane <souliane@mailoo.org>
parents: 1407
diff changeset
960 log.debug(u'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
961
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
962 def _addToHistory(self, dummy, user, message):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
963 # we check if message is not in history
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
964 # and raise ConflictError else
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
965 stamp = message.delay.stamp.astimezone(tzutc()).timetuple()
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
966 timestamp = float(calendar.timegm(stamp))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
967 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
968 "from": message.sender,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
969 "to": message.recipient,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
970 "uid": unicode(uuid.uuid4()),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
971 "type": C.MESS_TYPE_GROUPCHAT,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
972 "extra": {},
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
973 "timestamp": timestamp,
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
974 "received_timestamp": unicode(time.time()),
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
975 }
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
976 # FIXME: message and subject don't handle xml:lang
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
977 data['message'] = {'': message.body} if message.body is not None else {}
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
978 data['subject'] = {'': message.subject} if message.subject is not None else {}
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
979
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
980 if data['message'] or data['subject']:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
981 return self.host.memory.addToHistory(self.parent, data)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
982 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
983 return defer.succeed(None)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
984
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
985 def _addToHistoryEb(self, failure):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
986 failure.trap(exceptions.CancelError)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
987
1256
4b27b9bf31b0 plugin XEP-0045: use HISTORY_LIMIT param to retrieve the MUC history
souliane <souliane@mailoo.org>
parents: 1250
diff changeset
988 def receivedHistory(self, room, user, message):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
989 """Called when history (backlog) message are received
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
990
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
991 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
992 and add it if needed
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
993 @param room(muc.Room): room instance
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
994 @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
995 None if the message come from the room
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
996 @param message(muc.GroupChat): the parsed message
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
997 """
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
998 if room.state != ROOM_STATE_SELF_PRESENCE:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
999 log.warning(_(u"received history in unexpected state in room {room} (state: {state})").format(
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1000 room = room.userhost(),
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1001 state = room.state))
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1002 room._history_d.addCallback(self._addToHistory, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1003 room._history_d.addErrback(self._addToHistoryEb)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1004
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1005 ## subject ##
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1006
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1007 def groupChatReceived(self, message):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1008 """
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1009 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
1010
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1011 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
1012 L{receivedGroupChat}, L{receivedSubject} or L{receivedHistory}.
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1013 """
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1014 # We override this method to fix subject handling
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1015 # FIXME: remove this merge fixed upstream
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1016 room, user = self._getRoomUser(message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1017
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1018 if room is None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1019 return
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1020
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1021 if message.subject is not None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1022 self.receivedSubject(room, user, message.subject)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1023 elif message.delay is None:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1024 self.receivedGroupChat(room, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1025 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1026 self.receivedHistory(room, user, message)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1027
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1028 def subject(self, room, subject):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1029 return muc.MUCClientProtocol.subject(self, room, subject)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1030
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1031 def _historyCb(self, dummy, room):
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1032 """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
1033
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1034 this method will finish joining by:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1035 - sending message to bridge
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1036 - calling fully_joined deferred
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1037 - sending stanza put in cache
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1038 - cleaning variables not needed anymore
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1039 """
2066
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
1040 args = self.plugin_parent._getRoomJoinedArgs(room, self.parent.profile)
09c18fcd8225 plugin XEP-0045, quick frontend (app,chat): various chat improvments:
Goffi <goffi@goffi.org>
parents: 2058
diff changeset
1041 self.host.bridge.mucRoomJoined(*args)
2581
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1042 room.fully_joined.callback(room)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1043 del room._history_d
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1044 cache = room._cache
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1045 del room._cache
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1046 for elem in cache:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1047 self.parent.xmlstream.dispatch(elem)
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1048
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1049 def _historyEb(self, failure_, room):
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1050 log.error(u"Error while managing history: {}".format(failure_))
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1051 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
1052
405
10b4f577d0c0 MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents: 372
diff changeset
1053 def receivedSubject(self, room, user, subject):
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1054 # 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
1055 # 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
1056 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
1057 if room.state != ROOM_STATE_LIVE:
395a3d1c2888 plugin XEP-0045: fixed joining workflow:
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
1058 self.changeRoomState(room, ROOM_STATE_LIVE)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1059 room._history_d.addCallbacks(self._historyCb, self._historyEb, [room], errbackArgs=[room])
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1060 else:
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1061 # the subject has been changed
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1062 log.debug(_(u"New subject for room ({room_id}): {subject}").format(room_id = room.roomJID.full(), subject = subject))
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
1063 self.host.bridge.mucRoomNewSubject(room.roomJID.userhost(), subject, self.parent.profile)
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1064
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
1065 ## disco ##
1466
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1066
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1067 def getDiscoInfo(self, requestor, target, nodeIdentifier=''):
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1068 return [disco.DiscoFeature(NS_MUC)]
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1069
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1070 def getDiscoItems(self, requestor, target, nodeIdentifier=''):
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1071 # 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
1072 # see XEP-0045 § 6.7
2184d5f496b5 plugin XEP-0045: added disco announce
Goffi <goffi@goffi.org>
parents: 1417
diff changeset
1073 return []