Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0045.py @ 795:6625558371db
test: added tests for the plugin "room game" + rename other test files
author | souliane <souliane@mailoo.org> |
---|---|
date | Fri, 10 Jan 2014 18:20:30 +0100 |
parents | 23b0c949b86c |
children | 02ee9ef95277 |
rev | line source |
---|---|
72 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
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 |
84a6e83157c2
fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents:
599
diff
changeset
|
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013 Jérôme Poisson (goffi@goffi.org) |
72 | 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 | 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 | 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 | 19 |
771 | 20 from sat.core.i18n import _ |
72 | 21 from logging import debug, info, warning, error |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
22 from twisted.internet import defer |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
23 from twisted.words.protocols.jabber import jid |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
24 |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
25 from sat.core import exceptions |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
26 |
319 | 27 import uuid |
72 | 28 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
29 from wokkel import muc |
72 | 30 |
31 | |
32 try: | |
33 from twisted.words.protocols.xmlstream import XMPPHandler | |
34 except ImportError: | |
35 from wokkel.subprotocols import XMPPHandler | |
36 | |
37 PLUGIN_INFO = { | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
38 "name": "XEP 0045 Plugin", |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
39 "import_name": "XEP-0045", |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
40 "type": "XEP", |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
41 "protocols": ["XEP-0045"], |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
42 "dependencies": [], |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
43 "main": "XEP_0045", |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
44 "handler": "yes", |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
45 "description": _("""Implementation of Multi-User Chat""") |
72 | 46 } |
47 | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
48 |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
49 class UnknownRoom(Exception): |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
50 pass |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
51 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
52 |
588
beaf6bec2fcd
Remove every old-style class.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
587
diff
changeset
|
53 class XEP_0045(object): |
72 | 54 |
55 def __init__(self, host): | |
56 info(_("Plugin XEP_0045 initialization")) | |
57 self.host = host | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
58 self.clients = {} |
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
|
59 host.bridge.addMethod("joinMUC", ".plugin", in_sign='ssa{ss}s', out_sign='s', method=self._join) |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
60 host.bridge.addMethod("mucNick", ".plugin", in_sign='sss', out_sign='', method=self.mucNick) |
596
98a962d0b23c
plugin XEP-0045: fixed mucLeave bridge method
Goffi <goffi@goffi.org>
parents:
594
diff
changeset
|
61 host.bridge.addMethod("mucLeave", ".plugin", in_sign='ss', out_sign='', method=self.mucLeave, async = True) |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
62 host.bridge.addMethod("getRoomsJoined", ".plugin", in_sign='s', out_sign='a(sass)', method=self.getRoomsJoined) |
450
afe9cfd2ddbb
plugins: radio collective first draft
Goffi <goffi@goffi.org>
parents:
409
diff
changeset
|
63 host.bridge.addMethod("getRoomsSubjects", ".plugin", in_sign='s', out_sign='a(ss)', method=self.getRoomsSubjects) |
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
|
64 host.bridge.addMethod("getUniqueRoomName", ".plugin", in_sign='ss', out_sign='s', method=self.getUniqueName) |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
65 host.bridge.addSignal("roomJoined", ".plugin", signature='sasss') # args: room_jid, room_nicks, user_nick, profile |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
66 host.bridge.addSignal("roomLeft", ".plugin", signature='ss') # args: room_jid, profile |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
67 host.bridge.addSignal("roomUserJoined", ".plugin", signature='ssa{ss}s') # args: room_jid, user_nick, user_data, profile |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
68 host.bridge.addSignal("roomUserLeft", ".plugin", signature='ssa{ss}s') # args: room_jid, user_nick, user_data, profile |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
69 host.bridge.addSignal("roomUserChangedNick", ".plugin", signature='ssss') # args: room_jid, old_nick, new_nick, profile |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
70 host.bridge.addSignal("roomNewSubject", ".plugin", signature='sss') # args: room_jid, subject, profile |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
71 |
72 | 72 def __check_profile(self, profile): |
75 | 73 """check if profile is used and connected |
74 if profile known but disconnected, remove it from known profiles | |
75 @param profile: profile to check | |
76 @return: True if the profile is known and connected, else False""" | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
77 if not profile or profile not in self.clients or not self.host.isConnected(profile): |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
78 error(_('Unknown or disconnected profile (%s)') % profile) |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
79 if profile in self.clients: |
72 | 80 del self.clients[profile] |
81 return False | |
82 return True | |
83 | |
84 def __room_joined(self, room, profile): | |
85 """Called when the user is in the requested room""" | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
86 |
319 | 87 def _sendBridgeSignal(ignore=None): |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
88 self.host.bridge.roomJoined(room.roomJID.userhost(), [user.nick for user in room.roster.values()], room.nick, profile) |
319 | 89 |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
90 room_jid_s = room.roomJID.userhost() |
488
6edb4219fcf7
plugin xep-0045: entity type is changer to chatroom for room joined
Goffi <goffi@goffi.org>
parents:
480
diff
changeset
|
91 self.host.memory.updateEntityData(room.roomJID, "type", "chatroom", profile) |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
92 self.clients[profile].joined_rooms[room_jid_s] = room |
452
fd455b3ca6d4
plugin XEP-0045: room unlocking fix
Goffi <goffi@goffi.org>
parents:
451
diff
changeset
|
93 if room.locked: |
319 | 94 #FIXME: the current behaviour is to create an instant room |
95 #and send the signal only when the room is unlocked | |
96 #a proper configuration management should be done | |
452
fd455b3ca6d4
plugin XEP-0045: room unlocking fix
Goffi <goffi@goffi.org>
parents:
451
diff
changeset
|
97 print "room locked !" |
fd455b3ca6d4
plugin XEP-0045: room unlocking fix
Goffi <goffi@goffi.org>
parents:
451
diff
changeset
|
98 self.clients[profile].configure(room.roomJID, {}).addCallbacks(_sendBridgeSignal, lambda x: error(_('Error while configuring the room'))) |
319 | 99 else: |
100 _sendBridgeSignal() | |
101 return room | |
102 | |
528
f899f6e2a9d1
plugin XEP-0045: in case of nickname conflict when entering a room, a new one is automaticaly assigned
Goffi <goffi@goffi.org>
parents:
522
diff
changeset
|
103 def __err_joining_room(self, failure, room_jid, nick, history_options, password, profile): |
72 | 104 """Called when something is going wrong when joining the room""" |
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
|
105 if hasattr(failure.value, "condition") and failure.value.condition == 'conflict': |
528
f899f6e2a9d1
plugin XEP-0045: in case of nickname conflict when entering a room, a new one is automaticaly assigned
Goffi <goffi@goffi.org>
parents:
522
diff
changeset
|
106 # we have a nickname conflict, we try again with "_" suffixed to current nickname |
f899f6e2a9d1
plugin XEP-0045: in case of nickname conflict when entering a room, a new one is automaticaly assigned
Goffi <goffi@goffi.org>
parents:
522
diff
changeset
|
107 nick += '_' |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
108 return self.clients[profile].join(room_jid, nick, history_options, password).addCallbacks(self.__room_joined, self.__err_joining_room, callbackKeywords={'profile': profile}, errbackArgs=[room_jid, nick, history_options, password, profile]) |
743
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
109 mess = _("Error while joining the room %s" % room_jid.userhost()) |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
110 error(mess) |
183
9ee4a1d0d7fb
Added auto(dis)connect params + misc
Goffi <goffi@goffi.org>
parents:
134
diff
changeset
|
111 self.host.bridge.newAlert(mess, _("Group chat error"), "ERROR", profile) |
450
afe9cfd2ddbb
plugins: radio collective first draft
Goffi <goffi@goffi.org>
parents:
409
diff
changeset
|
112 raise failure |
72 | 113 |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
114 def getRoomsJoined(self, profile_key='@DEFAULT@'): |
78
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
115 """Return room where user is""" |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
116 profile = self.host.memory.getProfileName(profile_key) |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
117 result = [] |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
118 if not self.__check_profile(profile): |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
119 return result |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
120 for room in self.clients[profile].joined_rooms.values(): |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
121 result.append((room.roomJID.userhost(), [user.nick for user in room.roster.values()], room.nick)) |
78
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
122 return result |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
123 |
509
64ff046dc201
plugin text commands: added /join command
Goffi <goffi@goffi.org>
parents:
507
diff
changeset
|
124 def getRoomNick(self, room_jid_s, profile_key='@DEFAULT@'): |
93 | 125 """return nick used in room by user |
509
64ff046dc201
plugin text commands: added /join command
Goffi <goffi@goffi.org>
parents:
507
diff
changeset
|
126 @param room_jid_s: unicode room id |
93 | 127 @profile_key: profile |
128 @return: nick or empty string in case of error""" | |
129 profile = self.host.memory.getProfileName(profile_key) | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
130 if not self.__check_profile(profile) or room_jid_s not in self.clients[profile].joined_rooms: |
93 | 131 return '' |
509
64ff046dc201
plugin text commands: added /join command
Goffi <goffi@goffi.org>
parents:
507
diff
changeset
|
132 return self.clients[profile].joined_rooms[room_jid_s].nick |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
133 |
715
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
134 def getRoomNickOfUser(self, room, user_jid, secure=True): |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
135 """Returns the nick of the given user in the room. |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
136 @room: instance of wokkel.muc.Room |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
137 @user: JID or unicode (JID userhost). |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
138 @param secure: set to True for a secure check |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
139 @return: the nick or None if the user didn't join the room. |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
140 """ |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
141 if not isinstance(user_jid, jid.JID): |
791
23b0c949b86c
plugins room games, XEP-0045: small fixes, improved docstrings
souliane <souliane@mailoo.org>
parents:
771
diff
changeset
|
142 user_jid = jid.JID(user_jid).userhostJID() |
715
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
143 for user in room.roster.values(): |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
144 if user.entity is not None: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
145 if user.entity.userhostJID() == user_jid.userhostJID(): |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
146 return user.nick |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
147 elif not secure: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
148 # FIXME: this is NOT ENOUGH to check an identity!! |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
149 # See in which conditions user.entity could be None. |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
150 if user.nick == user_jid.user: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
151 return user.nick |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
152 return None |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
153 |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
154 def getRoomNicksOfUsers(self, room, users=[], secure=True): |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
155 """Returns the nicks of the given users in the room. |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
156 @room: instance of wokkel.muc.Room |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
157 @users: list of JID or unicode (JID userhost). |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
158 @param secure: set to True for a secure check |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
159 @return: (x, y) with x a list containing the nicks of |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
160 the users who are in the room, and y the missing users. |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
161 """ |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
162 nicks = [] |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
163 missing = [] |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
164 for user in users: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
165 nick = self.getRoomNickOfUser(room, user, secure) |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
166 if nick is None: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
167 missing.append(user) |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
168 else: |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
169 nicks.append(nick) |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
170 return nicks, missing |
f47d7c09c60b
plugins XEP-0045: added methods to get room nicks and "MUC user left" trigger
souliane <souliane@mailoo.org>
parents:
713
diff
changeset
|
171 |
522
3446ce33247d
plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents:
519
diff
changeset
|
172 def isNickInRoom(self, room_jid, nick, profile): |
3446ce33247d
plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents:
519
diff
changeset
|
173 """Tell if a nick is currently present in a room""" |
528
f899f6e2a9d1
plugin XEP-0045: in case of nickname conflict when entering a room, a new one is automaticaly assigned
Goffi <goffi@goffi.org>
parents:
522
diff
changeset
|
174 profile = self.host.memory.getProfileName(profile) |
522
3446ce33247d
plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents:
519
diff
changeset
|
175 if not self.__check_profile(profile): |
713
8bd63daecdbf
plugin XEP-0045: fixed incorrect exceptions name
souliane <souliane@mailoo.org>
parents:
712
diff
changeset
|
176 raise exceptions.ProfileUnknownError("Unknown or disconnected profile") |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
177 if room_jid.userhost() not in self.clients[profile].joined_rooms: |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
178 raise UnknownRoom("This room has not been joined") |
599
8d8a2ad163e2
plugin XEP-0045: fixed isNickInRoom
Goffi <goffi@goffi.org>
parents:
596
diff
changeset
|
179 return self.clients[profile].joined_rooms[room_jid.userhost()].inRoster(muc.User(nick)) |
93 | 180 |
450
afe9cfd2ddbb
plugins: radio collective first draft
Goffi <goffi@goffi.org>
parents:
409
diff
changeset
|
181 def getRoomsSubjects(self, profile_key='@DEFAULT@'): |
78
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
182 """Return received subjects of rooms""" |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
183 profile = self.host.memory.getProfileName(profile_key) |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
184 if not self.__check_profile(profile): |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
185 return [] |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
186 return self.clients[profile].rec_subjects.values() |
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
187 |
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
|
188 def getMUCService(self, profile): |
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
|
189 """Return the MUC service or None""" |
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
|
190 muc_service = None |
742
03744d9ebc13
plugin XEP-0033: implementation of the addressing feature:
souliane <souliane@mailoo.org>
parents:
715
diff
changeset
|
191 for service in self.host.memory.getServerServiceEntities("conference", "text", profile=profile): |
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
|
192 if not ".irc." in service.userhost(): |
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
|
193 #FIXME: |
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
|
194 #This awfull ugly hack is here to avoid an issue with openfire: the irc gateway |
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
|
195 #use "conference/text" identity (instead of "conference/irc"), there is certainly a better way |
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
|
196 #to manage this, but this hack fill do it for test purpose |
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
|
197 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
|
198 break |
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
|
199 return muc_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
|
200 |
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
|
201 def getUniqueName(self, muc_service="", profile_key='@DEFAULT@'): |
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
|
202 """Return unique name for room, avoiding collision |
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
|
203 @param muc_service: leave empty string to use the default 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
|
204 @return: unique room userhost, or '' if an error occured. |
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
|
205 """ |
319 | 206 #TODO: we should use #RFC-0045 10.1.4 when available here |
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
|
207 profile = self.host.memory.getProfileName(profile_key) |
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
|
208 if not profile: |
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
|
209 error(_("Unknown profile")) |
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
|
210 return "" |
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
|
211 room_name = uuid.uuid1() |
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
|
212 print "\n\n===> room_name:", room_name |
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
|
213 if muc_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
|
214 muc_service = self.getMUCService(profile) |
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
|
215 if not muc_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
|
216 error(_("Can't find a MUC 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
|
217 return "" |
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
|
218 muc_service = muc_service.userhost() |
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
|
219 return "%s@%s" % (room_name, muc_service) |
319 | 220 |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
221 def join(self, room_jid, nick, options, profile_key='@DEFAULT@'): |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
222 def _errDeferred(exc_obj=Exception, txt='Error while joining room'): |
350
abe08fcb42d7
plugin XEP-0045: added error callback to join's deferred, and a callback is created if join fail before calling MUCClient's join
Goffi <goffi@goffi.org>
parents:
319
diff
changeset
|
223 d = defer.Deferred() |
abe08fcb42d7
plugin XEP-0045: added error callback to join's deferred, and a callback is created if join fail before calling MUCClient's join
Goffi <goffi@goffi.org>
parents:
319
diff
changeset
|
224 d.errback(exc_obj(txt)) |
451
4f196e2d3781
plugin xep-0045: fixed missing return deferred
Goffi <goffi@goffi.org>
parents:
450
diff
changeset
|
225 return d |
350
abe08fcb42d7
plugin XEP-0045: added error callback to join's deferred, and a callback is created if join fail before calling MUCClient's join
Goffi <goffi@goffi.org>
parents:
319
diff
changeset
|
226 |
72 | 227 profile = self.host.memory.getProfileName(profile_key) |
228 if not self.__check_profile(profile): | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
229 return _errDeferred() |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
230 if room_jid.userhost() in self.clients[profile].joined_rooms: |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
231 warning(_('%(profile)s is already in room %(room_jid)s') % {'profile': profile, 'room_jid': room_jid.userhost()}) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
232 return _errDeferred() |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
233 info(_("[%(profile)s] is joining room %(room)s with nick %(nick)s") % {'profile': profile, 'room': room_jid.userhost(), 'nick': nick}) |
72 | 234 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
235 history_options = options["history"] == "True" if "history" in options else None |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
236 password = options["password"] if "password" in options else None |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
237 |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
238 return self.clients[profile].join(room_jid, nick, history_options, password).addCallbacks(self.__room_joined, self.__err_joining_room, callbackKeywords={'profile': profile}, errbackArgs=[room_jid, nick, history_options, password, profile]) |
743
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
239 # FIXME: how to set the cancel method on the Deferred created by wokkel? |
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
240 # This happens when the room is not reachable, e.g. no internet connection: |
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
241 # > /usr/local/lib/python2.7/dist-packages/twisted/internet/defer.py(480)_startRunCallbacks() |
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
242 # -> raise AlreadyCalledError(extra) |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
243 |
406
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
244 def _join(self, room_jid_s, nick, options={}, profile_key='@DEFAULT@'): |
743
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
245 """join method used by bridge: use the join method, but doesn't return any deferred |
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
|
246 @return the room userhost (given value or unique generated name) |
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
|
247 """ |
406
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
248 profile = self.host.memory.getProfileName(profile_key) |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
249 if not self.__check_profile(profile): |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
250 return |
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
|
251 if room_jid_s == "": |
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
|
252 room_jid_s = self.getUniqueName(profile_key=profile_key) |
406
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
253 try: |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
254 room_jid = jid.JID(room_jid_s) |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
255 except: |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
256 mess = _("Invalid room jid: %s") % room_jid_s |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
257 warning(mess) |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
258 self.host.bridge.newAlert(mess, _("Group chat error"), "ERROR", profile) |
b03b38b20c18
plugin XEP-0045: send error on invalid room jid on _join
Goffi <goffi@goffi.org>
parents:
405
diff
changeset
|
259 return |
407 | 260 d = self.join(room_jid, nick, options, profile) |
743
5a131930348d
plugin XEP-0045: remove redondant errback from _join
souliane <souliane@mailoo.org>
parents:
742
diff
changeset
|
261 # TODO: error management + signal in bridge |
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
|
262 return room_jid_s |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
263 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
264 def nick(self, room_jid, nick, profile_key): |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
265 profile = self.host.memory.getProfileName(profile_key) |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
266 if not self.__check_profile(profile): |
713
8bd63daecdbf
plugin XEP-0045: fixed incorrect exceptions name
souliane <souliane@mailoo.org>
parents:
712
diff
changeset
|
267 raise exceptions.ProfileUnknownError("Unknown or disconnected profile") |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
268 if room_jid.userhost() not in self.clients[profile].joined_rooms: |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
269 raise UnknownRoom("This room has not been joined") |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
270 return self.clients[profile].nick(room_jid, nick) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
271 |
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
272 def leave(self, room_jid, profile_key): |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
273 profile = self.host.memory.getProfileName(profile_key) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
274 if not self.__check_profile(profile): |
713
8bd63daecdbf
plugin XEP-0045: fixed incorrect exceptions name
souliane <souliane@mailoo.org>
parents:
712
diff
changeset
|
275 raise exceptions.ProfileUnknownError("Unknown or disconnected profile") |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
276 if room_jid.userhost() not in self.clients[profile].joined_rooms: |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
277 raise UnknownRoom("This room has not been joined") |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
278 return self.clients[profile].leave(room_jid) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
279 |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
280 def subject(self, room_jid, subject, profile_key): |
515
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
281 profile = self.host.memory.getProfileName(profile_key) |
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
282 if not self.__check_profile(profile): |
713
8bd63daecdbf
plugin XEP-0045: fixed incorrect exceptions name
souliane <souliane@mailoo.org>
parents:
712
diff
changeset
|
283 raise exceptions.ProfileUnknownError("Unknown or disconnected profile") |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
284 if room_jid.userhost() not in self.clients[profile].joined_rooms: |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
285 raise UnknownRoom("This room has not been joined") |
515
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
286 return self.clients[profile].subject(room_jid, subject) |
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
287 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
288 def mucNick(self, room_jid_s, nick, profile_key='@DEFAULT@'): |
505
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
289 """Change nickname in a room""" |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
290 return self.nick(jid.JID(room_jid_s), nick, profile_key) |
2402668b5d05
plugin xep-0045: nick change management
Goffi <goffi@goffi.org>
parents:
488
diff
changeset
|
291 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
292 def mucLeave(self, room_jid_s, profile_key='@DEFAULT@'): |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
293 """Leave a room""" |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
294 return self.leave(jid.JID(room_jid_s), profile_key) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
295 |
72 | 296 def getHandler(self, profile): |
297 self.clients[profile] = SatMUCClient(self) | |
298 return self.clients[profile] | |
299 | |
300 | |
301 class SatMUCClient (muc.MUCClient): | |
302 #implements(iwokkel.IDisco) | |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
303 |
72 | 304 def __init__(self, plugin_parent): |
305 self.plugin_parent = plugin_parent | |
306 self.host = plugin_parent.host | |
307 muc.MUCClient.__init__(self) | |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
308 self.joined_rooms = {} # FIXME: seem to do the same thing as MUCClient's _rooms attribute, must be removed |
78
ace2af8abc5a
Added method to know which MUC are joined, and which subjects were received.
Goffi <goffi@goffi.org>
parents:
77
diff
changeset
|
309 self.rec_subjects = {} |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
310 self.__changing_nicks = set() # used to keep trace of who is changing nick, |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
311 # and to discard userJoinedRoom signal in this case |
72 | 312 print "init SatMUCClient OK" |
515
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
313 |
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
314 def subject(self, room, subject): |
29b5ef129488
plugin XEP-0045, plugin text commands: added '/title' command
Goffi <goffi@goffi.org>
parents:
509
diff
changeset
|
315 return muc.MUCClientProtocol.subject(self, room, subject) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
316 |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
317 def unavailableReceived(self, presence): |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
318 #XXX: we override this method to manage nickname change |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
319 #TODO: feed this back to Wokkel |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
320 """ |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
321 Unavailable presence was received. |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
322 |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
323 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
|
324 left the room. |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
325 """ |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
326 room, user = self._getRoomUser(presence) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
327 |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
328 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
|
329 return |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
330 |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
331 room.removeUser(user) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
332 |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
333 if muc.STATUS_CODE.NEW_NICK in presence.mucStatuses: |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
334 self.__changing_nicks.add(presence.nick) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
335 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
|
336 else: |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
337 self.__changing_nicks.discard(presence.nick) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
338 self.userLeftRoom(room, user) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
339 |
72 | 340 def receivedGroupChat(self, room, user, body): |
341 debug('receivedGroupChat: room=%s user=%s body=%s', room, user, body) | |
342 | |
74
6e3a06b4dd36
plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
343 def userJoinedRoom(self, room, user): |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
344 if user.nick in self.__changing_nicks: |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
345 self.__changing_nicks.remove(user.nick) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
346 else: |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
347 debug(_("user %(nick)s has joined room (%(room_id)s)") % {'nick': user.nick, 'room_id': room.occupantJID.userhost()}) |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
348 if not self.host.trigger.point("MUC user joined", room, user, self.parent.profile): |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
349 return |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
350 user_data = {'entity': user.entity.full() if user.entity else '', 'affiliation': user.affiliation, 'role': user.role} |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
351 self.host.bridge.roomUserJoined(room.roomJID.userhost(), user.nick, user_data, self.parent.profile) |
587
952322b1d490
Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
572
diff
changeset
|
352 |
74
6e3a06b4dd36
plugin xep-0045: added roomUserJoined and roomUserLeft signals
Goffi <goffi@goffi.org>
parents:
73
diff
changeset
|
353 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
|
354 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
|
355 return |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
356 if user.nick == room.nick: |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
357 # we left the room |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
358 room_jid_s = room.roomJID.userhost() |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
359 info(_("Room [%(room)s] left (%(profile)s))") % {"room": room_jid_s, |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
360 "profile": self.parent.profile}) |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
361 self.host.memory.delEntityCache(room.roomJID, self.parent.profile) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
362 del self.plugin_parent.clients[self.parent.profile].joined_rooms[room_jid_s] |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
363 self.host.bridge.roomLeft(room.roomJID.userhost(), self.parent.profile) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
364 else: |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
365 debug(_("user %(nick)s left room (%(room_id)s)") % {'nick': user.nick, 'room_id': room.occupantJID.userhost()}) |
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
366 user_data = {'entity': user.entity.full() if user.entity else '', 'affiliation': user.affiliation, 'role': user.role} |
507
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
367 self.host.bridge.roomUserLeft(room.roomJID.userhost(), user.nick, user_data, self.parent.profile) |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
368 |
f98bef71a918
frontends, core, plugin XEP-0045: leave implementation + better nick change
Goffi <goffi@goffi.org>
parents:
505
diff
changeset
|
369 def userChangedNick(self, room, user, new_nick): |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
370 self.host.bridge.roomUserChangedNick(room.roomJID.userhost(), user.nick, new_nick, self.parent.profile) |
72 | 371 |
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
|
372 def userUpdatedStatus(self, room, user, show, status): |
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
|
373 print("FIXME: MUC status not managed yet") |
522
3446ce33247d
plugin XEP-0045: added isNickInRoom method
Goffi <goffi@goffi.org>
parents:
519
diff
changeset
|
374 #FIXME: |
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
|
375 |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
376 def receivedSubject(self, room, user, subject): |
594
e629371a28d3
Fix pep8 support in src/plugins.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
588
diff
changeset
|
377 debug(_("New subject for room (%(room_id)s): %(subject)s") % {'room_id': room.roomJID.full(), 'subject': subject}) |
405
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
378 self.rec_subjects[room.roomJID.userhost()] = (room.roomJID.userhost(), subject) |
10b4f577d0c0
MUC update to follow wokkel's MUC branch update
Goffi <goffi@goffi.org>
parents:
372
diff
changeset
|
379 self.host.bridge.roomNewSubject(room.roomJID.userhost(), subject, self.parent.profile) |