Mercurial > xib
annotate bot.py @ 166:0fc24e232997
some fixes related to IRC nicknames
Signed-off-by: Charly COSTE <changaco@changaco.net>
author | Charly COSTE <changaco@changaco.net> |
---|---|
date | Wed, 20 Jan 2010 14:48:52 +0100 |
parents | 3f299ad4d452 |
children | 489c157d9e82 |
rev | line source |
---|---|
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
3 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
4 # This program is free software: you can redistribute it and/or modify |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
5 # it under the terms of the GNU General Public License as published by |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
6 # the Free Software Foundation, either version 3 of the License, or |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
7 # (at your option) any later version. |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
8 # |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
9 # This program is distributed in the hope that it will be useful, |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
12 # GNU General Public License for more details. |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
13 # |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
14 # You should have received a copy of the GNU General Public License |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
15 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
16 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
17 |
124 | 18 import re |
19 import sys | |
20 import threading | |
21 from time import sleep | |
22 import traceback | |
23 import xml.parsers.expat | |
24 | |
25 from encoding import * | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
26 import irclib |
75 | 27 import muc |
28 xmpp = muc.xmpp | |
29 del muc | |
124 | 30 |
31 from bridge import Bridge | |
32 from participant import Participant | |
134
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
33 import commands |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
34 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
35 |
124 | 36 class Bot(threading.Thread): |
37 | |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
38 def __init__(self, jid, password, nickname, admins_jid=[], error_fd=sys.stderr, debug=False): |
124 | 39 threading.Thread.__init__(self) |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
40 self.halt = False |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
41 self.bare_jid = xmpp.protocol.JID(jid=jid) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
42 self.bare_jid.setResource('') |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
43 self.nickname = nickname |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
44 self.password = password |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
45 self.error_fd = error_fd |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
46 self.debug = debug |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
47 self.admins_jid = admins_jid |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
48 self.bridges = [] |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
49 self.xmpp_connections = {} |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
50 self.irc = irclib.IRC() |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
51 self.irc.bot = self |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
52 self.irc.add_global_handler('all_events', self._irc_event_handler) |
124 | 53 self.irc_thread = threading.Thread(target=self.irc.process_forever) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
54 self.irc_thread.start() |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
55 # Open connection with XMPP server |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
56 try: |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
57 self.xmpp_c = self.get_xmpp_connection(self.nickname) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
58 except: |
19
c1b84196c100
Changed format of non-debug error messages, fixed IRC namreply handling, prevented crash when receiving bad XMPP stanza.
Charly COSTE <changaco@changaco.net>
parents:
18
diff
changeset
|
59 self.error('[Error] XMPP Connection failed') |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
60 raise |
124 | 61 self.xmpp_thread = threading.Thread(target=self._xmpp_loop) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
62 self.xmpp_thread.start() |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
63 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
64 |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
65 def error(self, s, debug=False, send_to_admins=False): |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
66 """Output an error message.""" |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
67 if send_to_admins == True: |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
68 self._send_message_to_admins(s) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
69 if not debug or debug and self.debug: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
70 try: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
71 self.error_fd.write(auto_encode(s)+"\n") |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
72 except EncodingException: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
73 self.error_fd.write('Error message cannot be transcoded.\n') |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
74 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
75 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
76 def _xmpp_loop(self): |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
77 """[Internal] XMPP infinite loop.""" |
75 | 78 i = 1 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
79 while True: |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
80 if self.halt: |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
81 s = len(self.xmpp_connections) |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
82 for i in range(s): |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
83 self.close_xmpp_connection(self.xmpp_connections.keys()[s-i-1], force=True) |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
84 break |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
85 unlock = False |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
86 try: |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
87 if len(self.xmpp_connections) == 1: |
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
88 sleep(0.5) # avoid bot connection being locked all the time |
101
29d3b85c6286
Minor fixes/improvements
Charly COSTE <changaco@changaco.net>
parents:
100
diff
changeset
|
89 for j, c in enumerate(self.xmpp_connections.itervalues()): |
75 | 90 i += 1 |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
91 if hasattr(c, 'lock'): |
49
714e78fb912e
Tried to improve thread-safety during XMPP connection closing.
Charly COSTE <changaco@changaco.net>
parents:
48
diff
changeset
|
92 c.lock.acquire() |
75 | 93 if i == j: |
94 ping = xmpp.protocol.Iq(typ='get') | |
95 ping.addChild(name='ping', namespace='urn:xmpp:ping') | |
96 self.error('=> Debug: sending XMPP ping', debug=True) | |
97 c.pings.append(c.send(ping)) | |
52
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
98 if hasattr(c, 'Process'): |
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
99 c.Process(0.01) |
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
100 c.lock.release() |
75 | 101 if i > 5000: |
102 i = 0 | |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
103 except RuntimeError: |
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
104 pass |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
105 except (xml.parsers.expat.ExpatError, xmpp.protocol.XMLNotWellFormed): |
72
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
106 self.error('=> Debug: invalid stanza', debug=True) |
101
29d3b85c6286
Minor fixes/improvements
Charly COSTE <changaco@changaco.net>
parents:
100
diff
changeset
|
107 self.reopen_xmpp_connection(c) |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
108 unlock = True |
91
69e4fc0f015c
Tried to fix XMPP «Replaced by new connection» problem
Charly COSTE <changaco@changaco.net>
parents:
90
diff
changeset
|
109 except xmpp.Conflict: |
101
29d3b85c6286
Minor fixes/improvements
Charly COSTE <changaco@changaco.net>
parents:
100
diff
changeset
|
110 self.error('=> Debug: conflict', debug=True) |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
111 self.reopen_xmpp_connection(c) |
91
69e4fc0f015c
Tried to fix XMPP «Replaced by new connection» problem
Charly COSTE <changaco@changaco.net>
parents:
90
diff
changeset
|
112 unlock = True |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
113 except: |
101
29d3b85c6286
Minor fixes/improvements
Charly COSTE <changaco@changaco.net>
parents:
100
diff
changeset
|
114 error = '[Error] Unknown exception on XMPP thread:\n' |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
115 error += traceback.format_exc() |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
116 self.error(error, send_to_admins=True) |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
117 unlock = True |
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
118 if unlock == True: |
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
119 c.lock.release() |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
120 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
121 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
122 def _xmpp_presence_handler(self, dispatcher, presence): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
123 """[Internal] Manage XMPP presence.""" |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
124 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
125 xmpp_c = dispatcher._owner |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
126 |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
127 if xmpp_c.nickname != self.nickname: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
128 self.error('=> Debug: Skipping XMPP presence not received on bot connection.', debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
129 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
130 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
131 self.error('==> Debug: Received XMPP presence.', debug=True) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
132 self.error(presence.__str__(fancy=1), debug=True) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
133 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
134 from_ = xmpp.protocol.JID(presence.getFrom()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
135 bare_jid = unicode(from_.getNode()+'@'+from_.getDomain()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
136 for bridge in self.bridges: |
103 | 137 if bare_jid == bridge.xmpp_room_jid: |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
138 # presence comes from a muc |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
139 resource = unicode(from_.getResource()) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
140 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
141 if resource == '': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
142 # presence comes from the muc itself |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
143 pass |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
144 |
108
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
145 elif resource == xmpp_c.nickname: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
146 # presence comes from self |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
147 x = presence.getTag('x', namespace='http://jabber.org/protocol/muc#user') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
148 if x: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
149 d = x.getTag('destroy') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
150 if d: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
151 # room was destroyed |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
152 # problem is that this is used by some MUC servers when they shut down or restart |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
153 # considering this lack of semantic we have no choice but to do a check on the reason |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
154 reason = d.getTag('reason') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
155 if reason: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
156 r = reason.getData() |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
157 if r == 'The conference component is shutting down': |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
158 # MUC server is going down, try to restart the bridges in 1 minute |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
159 bridges = self.findBridges([from_.getDomain()]) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
160 error_message = '[Warning] The MUC server '+from_.getDomain()+' seems to be going down, the bot will try to recreate all bridges related to this server in 1 minute' |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
161 self.restart_bridges_delayed(bridges, 60, error_message) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
162 self.error(presence.__str__(fancy=1).encode('utf-8'), debug=True) |
108
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
163 return |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
164 elif r == '': |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
165 r = 'None given' |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
166 else: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
167 r = 'None given' |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
168 |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
169 # room has been destroyed, stop the bridge |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
170 self.error('[Error] The MUC room of the bridge '+str(bridge)+' has been destroyed with reason "'+r+'", stopping the bridge', send_to_admins=True) |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
171 bridge.stop(message='The MUC room of the bridge has been destroyed with reason "'+r+'", stopping the bridge') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
172 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
173 else: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
174 # presence comes from a participant of the muc |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
175 |
103 | 176 x = presence.getTag('x', namespace='http://jabber.org/protocol/muc#user') |
177 item = None | |
178 if x: | |
179 item = x.getTag('item') | |
180 | |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
181 if presence.getType() == 'unavailable': |
96 | 182 try: |
183 p = bridge.getParticipant(resource) | |
124 | 184 except Bridge.NoSuchParticipantException: |
96 | 185 p = None |
186 | |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
187 if x and x.getTag('status', attrs={'code': '303'}): |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
188 # participant changed its nickname |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
189 if p == None: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
190 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
191 if p.protocol != 'xmpp': |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
192 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
193 item = x.getTag('item') |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
194 if not item: |
19
c1b84196c100
Changed format of non-debug error messages, fixed IRC namreply handling, prevented crash when receiving bad XMPP stanza.
Charly COSTE <changaco@changaco.net>
parents:
18
diff
changeset
|
195 self.error('=> Debug: bad stanza, no item element', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
196 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
197 new_nick = item.getAttr('nick') |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
198 if not new_nick: |
19
c1b84196c100
Changed format of non-debug error messages, fixed IRC namreply handling, prevented crash when receiving bad XMPP stanza.
Charly COSTE <changaco@changaco.net>
parents:
18
diff
changeset
|
199 self.error('=> Debug: bad stanza, new nick is not given', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
200 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
201 p.changeNickname(new_nick, 'irc') |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
202 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
203 elif x and x.getTag('status', attrs={'code': '307'}): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
204 # participant was kicked |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
205 if p == None: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
206 bridge.xmpp_room.rejoin() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
207 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
208 if isinstance(p.xmpp_c, xmpp.client.Client): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
209 p.muc.rejoin() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
210 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
211 if item: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
212 reason = item.getTag('reason') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
213 actor = item.getTag('actor') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
214 if actor and actor.has_attr('jid'): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
215 kicker = actor.getAttr('jid') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
216 s1 = 'Kicked by '+kicker |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
217 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
218 s1 = 'Kicked from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
219 if reason: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
220 s2 = ' with reason: '+reason.getData() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
221 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
222 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
223 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
224 s1 = 'Kicked from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
225 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
226 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
227 bridge.removeParticipant('xmpp', p.nickname, s1+s2) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
228 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
229 elif x and x.getTag('status', attrs={'code': '301'}): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
230 # participant was banned |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
231 if p == None: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
232 m = '[Error] bot got banned from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
233 self.error(m) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
234 bridge.say(m, on_xmpp=False) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
235 self.removeBridge(bridge) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
236 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
237 if item: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
238 reason = item.getTag('reason') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
239 actor = item.getTag('actor') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
240 if actor and actor.has_attr('jid'): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
241 kicker = actor.getAttr('jid') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
242 s1 = 'Banned by '+kicker |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
243 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
244 s1 = 'Banned from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
245 if reason: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
246 s2 = ' with reason: '+reason.getData() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
247 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
248 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
249 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
250 s1 = 'Banned from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
251 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
252 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
253 bridge.removeParticipant('xmpp', p.nickname, s1+s2) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
254 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
255 else: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
256 # participant left |
99
5390e9abfa44
Don't try to remove a participant that does not exist
Charly COSTE <changaco@changaco.net>
parents:
96
diff
changeset
|
257 if p != None: |
5390e9abfa44
Don't try to remove a participant that does not exist
Charly COSTE <changaco@changaco.net>
parents:
96
diff
changeset
|
258 bridge.removeParticipant('xmpp', resource, presence.getStatus()) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
259 |
111
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
260 elif presence.getType() == 'error': |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
261 error = presence.getTag('error') |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
262 if error: |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
263 for c in error.getChildren(): |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
264 if c.getNamespace() == 'urn:ietf:params:xml:ns:xmpp-stanzas' and c.getName() != 'text': |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
265 err = error.getAttr('type')+' '+c.getName() |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
266 if err == 'cancel remote-server-not-found': |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
267 # Remote server not found |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
268 # Stop bridges that depend on this server |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
269 bridges = self.findBridges([from_.getDomain()]) |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
270 error_message = '[Error] XMPP Remote server not found: '+from_.getDomain() |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
271 self.restart_bridges_delayed(bridges, 60, error_message) |
111
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
272 self.error(presence.__str__(fancy=1).encode('utf-8'), debug=True) |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
273 else: |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
274 raise Exception(presence.__str__(fancy=1).encode('utf-8')) |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
275 |
96 | 276 elif resource != bridge.bot.nickname: |
103 | 277 real_jid = None |
278 if item and item.has_attr('jid'): | |
279 real_jid = item.getAttr('jid') | |
280 | |
281 p = bridge.addParticipant('xmpp', resource, real_jid) | |
282 | |
283 # if we have the real jid check if the participant is a bot admin | |
124 | 284 if real_jid and isinstance(p, Participant): |
103 | 285 for jid in self.admins_jid: |
286 if xmpp.protocol.JID(jid).bareMatch(real_jid): | |
287 p.bot_admin = True | |
288 break | |
289 | |
96 | 290 return |
291 | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
292 return |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
293 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
294 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
295 def _xmpp_iq_handler(self, dispatcher, iq): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
296 """[Internal] Manage XMPP IQs.""" |
75 | 297 |
298 xmpp_c = dispatcher._owner | |
299 | |
300 # Ignore pongs | |
301 if iq.getType() in ['result', 'error'] and iq.getID() in xmpp_c.pings: | |
302 xmpp_c.pings.remove(iq.getID()) | |
303 self.error('=> Debug: received XMPP pong', debug=True) | |
304 return | |
305 | |
306 self.error('==> Debug: Received XMPP iq.', debug=True) | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
307 self.error(iq.__str__(fancy=1), debug=True) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
308 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
309 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
310 def _xmpp_message_handler(self, dispatcher, message): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
311 """[Internal] Manage XMPP messages.""" |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
312 |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
313 xmpp_c = dispatcher._owner |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
314 |
34
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
315 if message.getBody() == None: |
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
316 return |
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
317 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
318 if message.getType() == 'chat': |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
319 from_bare_jid = unicode(message.getFrom().getNode()+'@'+message.getFrom().getDomain()) |
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
320 for bridge in self.bridges: |
103 | 321 if from_bare_jid == bridge.xmpp_room_jid: |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
322 # message comes from a room participant |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
323 |
103 | 324 self.error('==> Debug: Received XMPP chat message.', debug=True) |
325 self.error(message.__str__(fancy=1), debug=True) | |
326 | |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
327 try: |
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
328 from_ = bridge.getParticipant(message.getFrom().getResource()) |
27
9b7a628ca612
Fixed XMPP message handling, again.
Charly COSTE <changaco@changaco.net>
parents:
25
diff
changeset
|
329 to_ = bridge.getParticipant(xmpp_c.nickname) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
330 |
34
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
331 from_.sayOnIRCTo(to_.nickname, message.getBody()) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
332 |
124 | 333 except Bridge.NoSuchParticipantException: |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
334 if xmpp_c.nickname == self.nickname: |
124 | 335 r = self.respond(str(message.getBody()), participant=from_) |
103 | 336 if isinstance(r, basestring) and len(r) > 0: |
337 s = xmpp.protocol.Message(to=message.getFrom(), body=r, typ='chat') | |
338 self.error('==> Debug: Sending', debug=True) | |
339 self.error(s.__str__(fancy=1), debug=True) | |
340 xmpp_c.send(s) | |
341 else: | |
342 self.error('=> Debug: won\'t answer.', debug=True) | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
343 return |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
344 self.error('=> Debug: XMPP chat message not relayed', debug=True) |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
345 return |
103 | 346 |
347 # message does not come from a room | |
348 if xmpp_c.nickname == self.nickname: | |
349 self.error('==> Debug: Received XMPP chat message.', debug=True) | |
350 self.error(message.__str__(fancy=1), debug=True) | |
351 | |
352 # Find out if the message comes from a bot admin | |
353 bot_admin = False | |
354 for jid in self.admins_jid: | |
355 if xmpp.protocol.JID(jid).bareMatch(message.getFrom()): | |
356 bot_admin = True | |
357 break | |
358 | |
359 # Respond | |
360 r = self.respond(str(message.getBody()), bot_admin=bot_admin) | |
361 if isinstance(r, basestring) and len(r) > 0: | |
362 s = xmpp.protocol.Message(to=message.getFrom(), body=r, typ='chat') | |
363 self.error('==> Debug: Sending', debug=True) | |
364 self.error(s.__str__(fancy=1), debug=True) | |
365 xmpp_c.send(s) | |
366 | |
367 else: | |
368 self.error('=> Debug: Ignoring XMPP chat message not received on bot connection.', debug=True) | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
369 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
370 elif message.getType() == 'groupchat': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
371 # message comes from a room |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
372 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
373 for child in message.getChildren(): |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
374 if child.getName() == 'delay': |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
375 # MUC delayed message |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
376 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
377 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
378 if xmpp_c.nickname != self.nickname: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
379 self.error('=> Debug: Ignoring XMPP MUC message not received on bot connection.', debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
380 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
381 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
382 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
383 from_ = xmpp.protocol.JID(message.getFrom()) |
23 | 384 |
385 if unicode(from_.getResource()) == self.nickname: | |
386 self.error('=> Debug: Ignoring XMPP MUC message sent by self.', debug=True) | |
387 return | |
388 | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
389 room_jid = unicode(from_.getNode()+'@'+from_.getDomain()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
390 for bridge in self.bridges: |
103 | 391 if room_jid == bridge.xmpp_room_jid: |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
392 resource = unicode(from_.getResource()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
393 if resource == '': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
394 # message comes from the room itself |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
395 self.error('=> Debug: Ignoring XMPP groupchat message sent by the room.', debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
396 return |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
397 else: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
398 # message comes from a participant of the room |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
399 self.error('==> Debug: Received XMPP groupchat message.', debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
400 self.error(message.__str__(fancy=1), debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
401 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
402 try: |
124 | 403 participant = bridge.getParticipant(resource) |
404 except Bridge.NoSuchParticipantException: | |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
405 if resource != self.nickname: |
37 | 406 self.error('=> Debug: NoSuchParticipantException "'+resource+'" on "'+str(bridge)+'", WTF ?', debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
407 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
408 |
124 | 409 participant.sayOnIRC(message.getBody()) |
37 | 410 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
411 |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
412 elif message.getType() == 'error': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
413 for b in self.bridges: |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
414 if message.getFrom() == b.xmpp_room_jid: |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
415 # message comes from a room |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
416 for c in message.getChildren(): |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
417 if c.getName() == 'error': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
418 for cc in c.getChildren(): |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
419 if cc.getNamespace() == 'urn:ietf:params:xml:ns:xmpp-stanzas' and cc.getName() != 'text': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
420 err = cc.getName() |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
421 if err == 'not-acceptable': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
422 # we sent a message to a room we are not in |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
423 # probable cause is a MUC server restart |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
424 # let's restart the bot |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
425 self.restart() |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
426 elif err == 'forbidden': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
427 # we don't have the permission to speak |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
428 # let's remove the bridge and tell admins |
112
a817ad05dd1d
stop bridge on error instead of removing it
Charly COSTE <changaco@changaco.net>
parents:
111
diff
changeset
|
429 self.error('[Error] Not allowed to speak on the XMPP MUC of bridge '+str(b)+', stopping it', send_to_admins=True) |
a817ad05dd1d
stop bridge on error instead of removing it
Charly COSTE <changaco@changaco.net>
parents:
111
diff
changeset
|
430 b.stop(message='Not allowed to speak on the XMPP MUC, stopping bridge.') |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
431 else: |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
432 self.error('==> Debug: recevied unknown error message', debug=True) |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
433 self.error(message.__str__(fancy=1), debug=True) |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
434 return |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
435 |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
436 self.error('==> Debug: recevied unknown error message', debug=True) |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
437 self.error(message.__str__(fancy=1), debug=True) |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
438 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
439 else: |
141 | 440 self.error('==> Debug: Received XMPP message of unknown type "'+str(message.getType())+'".', debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
441 self.error(message.__str__(fancy=1), debug=True) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
442 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
443 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
444 def _irc_event_handler(self, connection, event): |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
445 """[Internal] Manage IRC events""" |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
446 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
447 # Answer ping |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
448 if event.eventtype() == 'ping': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
449 connection.pong(connection.get_server_name()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
450 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
451 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
452 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
453 # Events we always want to ignore |
166
0fc24e232997
some fixes related to IRC nicknames
Charly COSTE <changaco@changaco.net>
parents:
156
diff
changeset
|
454 if 'all' in event.eventtype() or 'motd' in event.eventtype() or event.eventtype() in ['nicknameinuse', 'nickcollision', 'erroneusnickname']: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
455 return |
144
fcab2bdf1d65
added an IRC event to ignore
Charly COSTE <changaco@changaco.net>
parents:
141
diff
changeset
|
456 if event.eventtype() in ['pong', 'privnotice', 'ctcp', 'nochanmodes', 'notexttosend', 'currenttopic', 'topicinfo', '328']: |
75 | 457 self.error('=> Debug: ignoring IRC '+event.eventtype(), debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
458 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
459 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
460 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
461 nickname = None |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
462 if event.source() != None: |
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
463 if '!' in event.source(): |
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
464 nickname = event.source().split('!')[0] |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
465 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
466 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
467 # Events that we want to ignore only in some cases |
14
1a1f2a0d35c7
Fixed bug that prevented the bot from connecting to freenode and all other servers that don't send "umode"
Charly COSTE <changaco@changaco.net>
parents:
11
diff
changeset
|
468 if event.eventtype() in ['umode', 'welcome', 'yourhost', 'created', 'myinfo', 'featurelist', 'luserclient', 'luserop', 'luserchannels', 'luserme', 'n_local', 'n_global', 'endofnames', 'luserunknown', 'luserconns']: |
1a1f2a0d35c7
Fixed bug that prevented the bot from connecting to freenode and all other servers that don't send "umode"
Charly COSTE <changaco@changaco.net>
parents:
11
diff
changeset
|
469 if connection.really_connected == False: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
470 if event.target() == connection.nickname: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
471 connection.really_connected = True |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
472 connection._call_nick_callbacks(None) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
473 elif len(connection.nick_callbacks) > 0: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
474 self.error('===> Debug: event target ('+event.target()+') and connection nickname ('+connection.nickname+') don\'t match') |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
475 connection._call_nick_callbacks('nicknametoolong', arguments=[len(event.target())]) |
14
1a1f2a0d35c7
Fixed bug that prevented the bot from connecting to freenode and all other servers that don't send "umode"
Charly COSTE <changaco@changaco.net>
parents:
11
diff
changeset
|
476 self.error('=> Debug: ignoring '+event.eventtype(), debug=True) |
1a1f2a0d35c7
Fixed bug that prevented the bot from connecting to freenode and all other servers that don't send "umode"
Charly COSTE <changaco@changaco.net>
parents:
11
diff
changeset
|
477 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
478 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
479 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
480 # A string representation of the event |
56 | 481 event_str = '==> Debug: Received IRC event.\nconnection='+connection.__str__()+'\neventtype='+event.eventtype()+'\nsource='+auto_decode(event.source().__str__())+'\ntarget='+auto_decode(event.target().__str__())+'\narguments='+auto_decode(event.arguments().__str__()) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
482 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
483 |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
484 if event.eventtype() in ['pubmsg', 'action', 'privmsg', 'quit', 'part', 'nick', 'kick']: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
485 if nickname == None: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
486 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
487 |
39 | 488 handled = False |
489 | |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
490 if event.eventtype() in ['quit', 'part', 'nick', 'kick']: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
491 if connection.get_nickname() != self.nickname: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
492 self.error('=> Debug: ignoring IRC '+event.eventtype()+' not received on bot connection', debug=True) |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
493 return |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
494 else: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
495 self.error(event_str, debug=True) |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
496 |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
497 if event.eventtype() == 'kick' and len(event.arguments()) < 1: |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
498 self.error('=> Debug: length of arguments should be greater than 0 for a '+event.eventtype()+' event') |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
499 return |
39 | 500 |
54
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
501 if event.eventtype() in ['pubmsg', 'action']: |
55 | 502 if connection.get_nickname() != self.nickname: |
54
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
503 self.error('=> Debug: ignoring IRC '+event.eventtype()+' not received on bot connection', debug=True) |
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
504 return |
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
505 if nickname == self.nickname: |
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
506 self.error('=> Debug: ignoring IRC '+event.eventtype()+' sent by self', debug=True) |
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
507 return |
50
dbb7c29a71e2
Ignore messages sent by self
Charly COSTE <changaco@changaco.net>
parents:
49
diff
changeset
|
508 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
509 # TODO: lock self.bridges for thread safety |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
510 for bridge in self.bridges: |
32
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
511 if connection.server != bridge.irc_server: |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
512 continue |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
513 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
514 try: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
515 from_ = bridge.getParticipant(nickname) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
516 |
124 | 517 except Bridge.NoSuchParticipantException: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
518 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
519 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
520 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
521 # Private message |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
522 if event.eventtype() == 'privmsg': |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
523 if event.target() == None: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
524 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
525 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
526 try: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
527 to_ = bridge.getParticipant(event.target().split('!')[0]) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
528 self.error(event_str, debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
529 from_.sayOnXMPPTo(to_.nickname, event.arguments()[0]) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
530 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
531 |
124 | 532 except Bridge.NoSuchParticipantException: |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
533 if event.target().split('!')[0] == self.nickname: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
534 # Message is for the bot |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
535 self.error(event_str, debug=True) |
18
3cdf7bb580da
Fixed bot.respond(), boosted XMPP thread to lower latency, fixed mode notice.
Charly COSTE <changaco@changaco.net>
parents:
17
diff
changeset
|
536 connection.privmsg(from_.nickname, self.respond(event.arguments()[0])) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
537 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
538 else: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
539 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
540 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
541 |
92
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
542 # kick handling |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
543 if event.eventtype() == 'kick': |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
544 if event.target().lower() == bridge.irc_room: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
545 try: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
546 kicked = bridge.getParticipant(event.arguments()[0]) |
72
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
547 if isinstance(kicked.irc_connection, irclib.ServerConnection): |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
548 kicked.irc_connection.join(bridge.irc_room) |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
549 else: |
92
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
550 if len(event.arguments()) > 1: |
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
551 bridge.removeParticipant('irc', kicked.nickname, 'Kicked by '+nickname+' with reason: '+event.arguments()[1]) |
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
552 else: |
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
553 bridge.removeParticipant('irc', kicked.nickname, 'Kicked by '+nickname+' (no reason was given)') |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
554 return |
124 | 555 except Bridge.NoSuchParticipantException: |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
556 self.error('=> Debug: a participant that was not here has been kicked ? WTF ?') |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
557 return |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
558 else: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
559 continue |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
560 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
561 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
562 # Leaving events |
45
41394ddb3aff
Lower before comparing strings.
Charly COSTE <changaco@changaco.net>
parents:
44
diff
changeset
|
563 if event.eventtype() == 'quit' or event.eventtype() == 'part' and event.target().lower() == bridge.irc_room: |
78
a8749705fe94
Fixed IRC quit event handling
Charly COSTE <changaco@changaco.net>
parents:
77
diff
changeset
|
564 if event.eventtype() == 'quit' and ( bridge.mode != 'normal' or isinstance(from_.irc_connection, irclib.ServerConnection) ): |
a8749705fe94
Fixed IRC quit event handling
Charly COSTE <changaco@changaco.net>
parents:
77
diff
changeset
|
565 continue |
30
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
566 if len(event.arguments()) > 0: |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
567 leave_message = event.arguments()[0] |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
568 elif event.eventtype() == 'quit': |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
569 leave_message = 'Left server.' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
570 elif event.eventtype() == 'part': |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
571 leave_message = 'Left channel.' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
572 else: |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
573 leave_message = '' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
574 bridge.removeParticipant('irc', from_.nickname, leave_message) |
39 | 575 handled = True |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
576 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
577 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
578 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
579 # Nickname change |
41
4c4f4ee72e17
Fixed IRC "nick" event handling. Fixed bot's XMPP infinite loop.
Charly COSTE <changaco@changaco.net>
parents:
39
diff
changeset
|
580 if event.eventtype() == 'nick': |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
581 from_.changeNickname(event.target(), 'xmpp') |
39 | 582 handled = True |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
583 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
584 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
585 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
586 # Chan message |
32
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
587 if event.eventtype() in ['pubmsg', 'action']: |
45
41394ddb3aff
Lower before comparing strings.
Charly COSTE <changaco@changaco.net>
parents:
44
diff
changeset
|
588 if bridge.irc_room == event.target().lower() and bridge.irc_server == connection.server: |
39 | 589 self.error(event_str, debug=True) |
32
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
590 message = event.arguments()[0] |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
591 if event.eventtype() == 'action': |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
592 message = '/me '+message |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
593 from_.sayOnXMPP(message) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
594 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
595 else: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
596 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
597 |
39 | 598 if handled == False: |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
599 if not event.eventtype() in ['quit', 'part', 'nick', 'kick']: |
39 | 600 self.error(event_str, debug=True) |
44
3d964ca1cf89
Fixed XMPP infinite loop and a debug message that wasn't flagged as a debug one.
Charly COSTE <changaco@changaco.net>
parents:
42
diff
changeset
|
601 self.error('=> Debug: event was not handled', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
602 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
603 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
604 |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
605 # Handle bannedfromchan |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
606 if event.eventtype() == 'bannedfromchan': |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
607 if len(event.arguments()) < 1: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
608 self.error('=> Debug: length of arguments should be greater than 0 for a '+event.eventtype()+' event') |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
609 return |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
610 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
611 for bridge in self.bridges: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
612 if connection.server != bridge.irc_server or event.arguments()[0].lower() != bridge.irc_room: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
613 continue |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
614 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
615 if event.target() == self.nickname: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
616 self.error('[Error] the nickname "'+event.target()+'" is banned from the IRC chan of bridge "'+str(bridge)+'"') |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
617 raise Exception('[Error] the nickname "'+event.target()+'" is banned from the IRC chan of bridge "'+str(bridge)+'"') |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
618 else: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
619 try: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
620 banned = bridge.getParticipant(event.target()) |
72
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
621 if banned.irc_connection != 'bannedfromchan': |
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
622 banned.irc_connection = 'bannedfromchan' |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
623 self.error(event_str, debug=True) |
137
9f39cead20cb
reduced duplication of error messages
Charly COSTE <changaco@changaco.net>
parents:
134
diff
changeset
|
624 bridge.say('[Warning] the nickname "'+event.target()+'" is banned from the IRC chan', log=True) |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
625 else: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
626 self.error('=> Debug: ignoring '+event.eventtype(), debug=True) |
124 | 627 except Bridge.NoSuchParticipantException: |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
628 self.error('=> Debug: no such participant. WTF ?') |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
629 return |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
630 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
631 return |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
632 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
633 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
634 # Joining events |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
635 if event.eventtype() in ['namreply', 'join']: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
636 if connection.get_nickname() != self.nickname: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
637 self.error('=> Debug: ignoring IRC '+event.eventtype()+' not received on bridge connection', debug=True) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
638 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
639 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
640 if event.eventtype() == 'namreply': |
48
cb08ea878db9
lower() for "join" and "namreply" IRC events
Charly COSTE <changaco@changaco.net>
parents:
47
diff
changeset
|
641 for bridge in self.getBridges(irc_room=event.arguments()[1].lower(), irc_server=connection.server): |
77
686724c5183c
Fixed IRC namreply handling
Charly COSTE <changaco@changaco.net>
parents:
75
diff
changeset
|
642 for nickname in re.split('(?:^[&@\+%]?|(?: [&@\+%]?)*)', event.arguments()[2].strip()): |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
643 if nickname == '' or nickname == self.nickname: |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
644 continue |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
645 bridge.addParticipant('irc', nickname) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
646 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
647 elif event.eventtype() == 'join': |
48
cb08ea878db9
lower() for "join" and "namreply" IRC events
Charly COSTE <changaco@changaco.net>
parents:
47
diff
changeset
|
648 bridges = self.getBridges(irc_room=event.target().lower(), irc_server=connection.server) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
649 if len(bridges) == 0: |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
650 self.error(event_str, debug=True) |
48
cb08ea878db9
lower() for "join" and "namreply" IRC events
Charly COSTE <changaco@changaco.net>
parents:
47
diff
changeset
|
651 self.error('===> Debug: no bridge found for "'+event.target().lower()+' at '+connection.server+'"', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
652 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
653 for bridge in bridges: |
115
0ae0f8836a7a
split long messages when sending on IRC
Charly COSTE <changaco@changaco.net>
parents:
113
diff
changeset
|
654 bridge.addParticipant('irc', nickname, irc_id=event.source()) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
655 return |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
656 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
657 |
152
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
658 if event.eventtype() in ['disconnect', 'kill', 'error']: |
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
659 if len(event.arguments()) > 0 and event.arguments()[0] == 'Connection reset by peer': |
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
660 self.error(event_str, debug=True) |
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
661 else: |
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
662 self.error(event_str, send_to_admins=True) |
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
663 return |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
664 |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
665 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
666 # Unhandled events |
166
0fc24e232997
some fixes related to IRC nicknames
Charly COSTE <changaco@changaco.net>
parents:
156
diff
changeset
|
667 self.error(event_str+'\n=> Debug: event not handled', debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
668 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
669 |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
670 def _send_message_to_admins(self, message): |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
671 """[Internal] Send XMPP Message to bot admin(s)""" |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
672 for admin_jid in self.admins_jid: |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
673 try: |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
674 self.xmpp_c.send(xmpp.protocol.Message(to=admin_jid, body=message, typ='chat')) |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
675 except: |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
676 pass |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
677 |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
678 |
151
a04840ad92b7
oops, forgot to modify Bot.new_bridge() in the previous commit
Charly COSTE <changaco@changaco.net>
parents:
144
diff
changeset
|
679 def new_bridge(self, xmpp_room, irc_room, irc_server, mode, say_level, irc_port=6667, irc_connection_interval=1): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
680 """Create a bridge between xmpp_room and irc_room at irc_server.""" |
151
a04840ad92b7
oops, forgot to modify Bot.new_bridge() in the previous commit
Charly COSTE <changaco@changaco.net>
parents:
144
diff
changeset
|
681 b = Bridge(self, xmpp_room, irc_room, irc_server, mode, say_level, irc_port=irc_port, irc_connection_interval=irc_connection_interval) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
682 self.bridges.append(b) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
683 return b |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
684 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
685 |
103 | 686 def findBridges(self, str_array): |
687 # TODO: lock self.bridges for thread safety | |
688 bridges = [b for b in self.bridges] | |
689 for bridge in [b for b in bridges]: | |
690 for s in str_array: | |
691 if not s in str(bridge): | |
692 bridges.remove(bridge) | |
693 break | |
694 return bridges | |
695 | |
696 | |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
697 def getBridges(self, irc_room=None, irc_server=None, xmpp_room_jid=None): |
96 | 698 # TODO: lock self.bridges for thread safety |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
699 bridges = [b for b in self.bridges] |
32
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
700 for bridge in [b for b in bridges]: |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
701 if irc_room != None and bridge.irc_room != irc_room: |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
702 bridges.remove(bridge) |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
703 continue |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
704 if irc_server != None and bridge.irc_server != irc_server: |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
705 bridges.remove(bridge) |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
706 continue |
103 | 707 if xmpp_room_jid != None and bridge.xmpp_room_jid != xmpp_room_jid: |
32
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
708 bridges.remove(bridge) |
8aa261545662
Implemented "/me" in the IRC->XMPP way (ie "action" event is now handled). Re-written bot.getBridges because the old one didn't always work and was slow.
Charly COSTE <changaco@changaco.net>
parents:
30
diff
changeset
|
709 continue |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
710 return bridges |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
711 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
712 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
713 def get_xmpp_connection(self, nickname): |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
714 if self.xmpp_connections.has_key(nickname): |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
715 c = self.xmpp_connections[nickname] |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
716 c.used_by += 1 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
717 self.error('===> Debug: using existing XMPP connection for "'+nickname+'", now used by '+str(c.used_by)+' bridges', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
718 return c |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
719 self.error('===> Debug: opening new XMPP connection for "'+nickname+'"', debug=True) |
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
720 c = xmpp.client.Client(self.bare_jid.getDomain(), debug=[]) |
35
ebf516b2e5c9
Switched from Lock() to RLock().
Charly COSTE <changaco@changaco.net>
parents:
34
diff
changeset
|
721 c.lock = threading.RLock() |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
722 c.lock.acquire() |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
723 self.xmpp_connections[nickname] = c |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
724 c.used_by = 1 |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
725 c.nickname = nickname |
90
965dd6f5fcc3
Tried to improve XMPP disconnections handling
Charly COSTE <changaco@changaco.net>
parents:
88
diff
changeset
|
726 c.mucs = [] |
75 | 727 c.pings = [] |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
728 c.connect() |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
729 c.auth(self.bare_jid.getNode(), self.password) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
730 c.RegisterHandler('presence', self._xmpp_presence_handler) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
731 c.RegisterHandler('iq', self._xmpp_iq_handler) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
732 c.RegisterHandler('message', self._xmpp_message_handler) |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
733 c.sendInitPresence() |
103 | 734 if nickname == self.nickname: |
735 c.send(xmpp.protocol.Presence(priority=127)) | |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
736 c.lock.release() |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
737 return c |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
738 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
739 |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
740 def reopen_xmpp_connection(self, c): |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
741 if not isinstance(c, xmpp.client.Client): |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
742 return |
103 | 743 bot_connection = False |
744 if c == self.xmpp_c: | |
745 bot_connection = True | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
746 mucs = c.mucs |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
747 nickname = c.nickname |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
748 used_by = c.used_by |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
749 participants = [] |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
750 for b in self.bridges: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
751 for p in b.participants: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
752 if p.xmpp_c == c: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
753 participants.append(p) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
754 p.xmpp_c = None |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
755 self.error('===> Debug: reopening XMPP connection for "'+nickname+'"', debug=True) |
122 | 756 if self.xmpp_connections.has_key(nickname): |
757 self.xmpp_connections.pop(nickname) | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
758 c.send(xmpp.protocol.Presence(typ='unavailable')) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
759 del c |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
760 c = self.get_xmpp_connection(nickname) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
761 c.used_by = used_by |
103 | 762 if bot_connection: |
763 self.xmpp_c = c | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
764 for p in participants: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
765 p.xmpp_c = c |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
766 c.mucs = mucs |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
767 for m in c.mucs: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
768 m.rejoin() |
122 | 769 return c |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
770 |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
771 |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
772 def close_xmpp_connection(self, nickname, force=False): |
29 | 773 if not self.xmpp_connections.has_key(nickname): |
774 return | |
37 | 775 c = self.xmpp_connections[nickname] |
42
b8c9ddf320f8
Thread safety for bot.close_xmpp_connection().
Charly COSTE <changaco@changaco.net>
parents:
41
diff
changeset
|
776 c.lock.acquire() |
37 | 777 c.used_by -= 1 |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
778 if c.used_by < 1 or force: |
22
e2bd4de698e5
Solved an XMPP resource conflict that would have happened when someone on IRC changed its nickname and later its old nickname would be used again. In other words, the bot no longer uses nicknames as XMPP resources.
Charly COSTE <changaco@changaco.net>
parents:
21
diff
changeset
|
779 self.error('===> Debug: closing XMPP connection for "'+nickname+'"', debug=True) |
37 | 780 self.xmpp_connections.pop(nickname) |
52
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
781 c.send(xmpp.protocol.Presence(typ='unavailable')) |
49
714e78fb912e
Tried to improve thread-safety during XMPP connection closing.
Charly COSTE <changaco@changaco.net>
parents:
48
diff
changeset
|
782 c.lock.release() |
37 | 783 del c |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
784 else: |
42
b8c9ddf320f8
Thread safety for bot.close_xmpp_connection().
Charly COSTE <changaco@changaco.net>
parents:
41
diff
changeset
|
785 c.lock.release() |
37 | 786 self.error('===> Debug: XMPP connection for "'+nickname+'" is now used by '+str(c.used_by)+' bridges', debug=True) |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
787 |
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
788 |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
789 def removeBridge(self, bridge, message='Removing bridge'): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
790 self.bridges.remove(bridge) |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
791 bridge.stop(message) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
792 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
793 |
124 | 794 def respond(self, message, participant=None, bot_admin=False): |
134
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
795 if isinstance(participant, Participant): |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
796 bridge = participant.bridge |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
797 if bot_admin != participant.bot_admin: |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
798 bot_admin = participant.bot_admin |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
799 else: |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
800 bridge = None |
103 | 801 |
134
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
802 return commands.execute(self, message, bot_admin, bridge) |
103 | 803 |
804 | |
805 def restart(self): | |
806 # Stop the bridges | |
807 for b in self.bridges: | |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
808 b.stop(message='Restarting bot') |
103 | 809 |
810 # Reopen the bot's XMPP connection | |
811 self.reopen_xmpp_connection(self.xmpp_c) | |
812 | |
813 # Restart the bridges | |
814 for b in self.bridges: | |
815 b.init2() | |
816 | |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
817 self.error('Bot restarted.', send_to_admins=True) |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
818 |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
819 |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
820 def restart_bridges_delayed(self, bridges, delay, error_message): |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
821 if len(bridges) > 0: |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
822 error_message += '\nThese bridges will be stopped:' |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
823 for b in bridges: |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
824 error_message += '\n'+str(b) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
825 if hasattr(b, 'reconnecting'): |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
826 leave_message = 'MUC server seems to be down' |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
827 else: |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
828 leave_message = 'MUC server seems to be down, will try to recreate the bridge in '+str(delay)+' seconds' |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
829 self.reconnecting = True |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
830 self.irc.execute_delayed(delay, b.init2) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
831 b.stop(message=leave_message) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
832 |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
833 self.error(error_message, send_to_admins=True) |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
834 |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
835 |
129
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
836 def stop(self, message='Stopping bot'): |
17
32a35f7eff70
Rewrote/modified many things, multiple bridges should now work and are preferred over multiple bots.
Charly COSTE <changaco@changaco.net>
parents:
14
diff
changeset
|
837 for bridge in self.bridges: |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
838 bridge.stop(message=message) |
129
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
839 |
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
840 |
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
841 def __del__(self): |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
842 for bridge in self.bridges: |
156
3f299ad4d452
oops, fix for the halt command
Charly COSTE <changaco@changaco.net>
parents:
155
diff
changeset
|
843 self.removeBridge(bridge, message='Stopping bot') |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
844 self.halt = True |