Mercurial > xib
annotate bot.py @ 201:de574314990e
log some more things when Bot.debug is False
Signed-off-by: Charly COSTE <changaco@changaco.net>
author | Charly COSTE <changaco@changaco.net> |
---|---|
date | Thu, 25 Feb 2010 20:48:33 +0100 |
parents | 740effa74c18 |
children | 2a1ee46f86af |
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 | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
25 import irclib |
75 | 26 import muc |
27 xmpp = muc.xmpp | |
28 del muc | |
124 | 29 |
30 from bridge import Bridge | |
31 from participant import Participant | |
134
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
32 import commands |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
33 import say_levels |
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 | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
38 def __init__(self, jid, password, nickname, admins=[], 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 |
171
489c157d9e82
display error when bot creation fails
Charly COSTE <changaco@changaco.net>
parents:
166
diff
changeset
|
41 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
|
42 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
|
43 self.bare_jid.setResource('') |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
44 self.nickname = nickname |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
45 self.password = password |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
46 self.error_fd = error_fd |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
47 self.debug = debug |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
48 self.admins = admins |
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: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
59 self.error(say_levels.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 |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
65 def error(self, importance, message, debug=False, no_debug_add='', 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.""" |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
67 if not self.debug: |
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
68 message += no_debug_add |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
69 if send_to_admins == True: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
70 self._send_message_to_admins(importance, message) |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
71 if importance == -1: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
72 return |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
73 if not debug: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
74 self.error_fd.write(self.format_message(importance, message).encode('utf-8')+'\n') |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
75 elif self.debug: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
76 self.error_fd.write('='*importance+'> '+message.encode('utf-8')+'\n') |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
77 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
78 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
79 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
|
80 """[Internal] XMPP infinite loop.""" |
75 | 81 i = 1 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
82 while True: |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
83 if self.halt: |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
84 s = len(self.xmpp_connections) |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
85 for i in range(s): |
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
86 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
|
87 break |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
88 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
|
89 try: |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
90 if len(self.xmpp_connections) == 1: |
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
91 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
|
92 for j, c in enumerate(self.xmpp_connections.itervalues()): |
75 | 93 i += 1 |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
94 if hasattr(c, 'lock'): |
49
714e78fb912e
Tried to improve thread-safety during XMPP connection closing.
Charly COSTE <changaco@changaco.net>
parents:
48
diff
changeset
|
95 c.lock.acquire() |
75 | 96 if i == j: |
97 ping = xmpp.protocol.Iq(typ='get') | |
98 ping.addChild(name='ping', namespace='urn:xmpp:ping') | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
99 self.error(1, 'sending XMPP ping', debug=True) |
75 | 100 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
|
101 if hasattr(c, 'Process'): |
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
102 c.Process(0.01) |
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
103 c.lock.release() |
75 | 104 if i > 5000: |
105 i = 0 | |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
106 except RuntimeError: |
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
107 pass |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
108 except (xml.parsers.expat.ExpatError, xmpp.protocol.XMLNotWellFormed): |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
109 self.error(1, 'invalid stanza', debug=True) |
101
29d3b85c6286
Minor fixes/improvements
Charly COSTE <changaco@changaco.net>
parents:
100
diff
changeset
|
110 self.reopen_xmpp_connection(c) |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
111 unlock = True |
91
69e4fc0f015c
Tried to fix XMPP «Replaced by new connection» problem
Charly COSTE <changaco@changaco.net>
parents:
90
diff
changeset
|
112 except xmpp.Conflict: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
113 self.error(1, 'conflict', debug=True) |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
114 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
|
115 unlock = True |
51
2737ed5b9003
Tried to improve the XMPP loop, again.
Charly COSTE <changaco@changaco.net>
parents:
50
diff
changeset
|
116 except: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
117 error = 'Unknown exception on XMPP thread:\n'+traceback.format_exc() |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
118 self.error(say_levels.error, error, send_to_admins=True) |
79
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
119 unlock = True |
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
120 if unlock == True: |
73a30fc1922b
Fixed the XMPP loop (release the lock)
Charly COSTE <changaco@changaco.net>
parents:
78
diff
changeset
|
121 c.lock.release() |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
122 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
123 |
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
|
124 def _xmpp_presence_handler(self, dispatcher, presence): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
125 """[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
|
126 |
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
|
127 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
|
128 |
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
|
129 if xmpp_c.nickname != self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
130 self.error(1, 'Skipping XMPP presence not received on bot connection.', 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
|
131 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
|
132 |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
133 self.error(2, 'Received XMPP presence.\n'+presence.__str__(fancy=1), debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
134 |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
135 no_debug_add = '\n'+presence.__str__(fancy=1) |
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
136 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
137 from_ = xmpp.protocol.JID(presence.getFrom()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
138 bare_jid = unicode(from_.getNode()+'@'+from_.getDomain()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
139 for bridge in self.bridges: |
103 | 140 if bare_jid == bridge.xmpp_room_jid: |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
141 # presence comes from a muc |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
142 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
|
143 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
144 if resource == '': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
145 # presence comes from the muc itself |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
146 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
|
147 |
108
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
148 elif resource == xmpp_c.nickname: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
149 # presence comes from self |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
150 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
|
151 if x: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
152 d = x.getTag('destroy') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
153 if d: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
154 # room was destroyed |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
155 # 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
|
156 # 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
|
157 reason = d.getTag('reason') |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
158 if reason: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
159 r = reason.getData() |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
160 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
|
161 # 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
|
162 bridges = self.findBridges([from_.getDomain()]) |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
163 m = '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' |
190
6db99e458168
fixed calls to Bot.restart_bridges_delayed(), arguments changed in f52cb2f6e273328e73d75ab4ecf214c8dc9dfe1b
Charly COSTE <changaco@changaco.net>
parents:
188
diff
changeset
|
164 error = [say_levels.warning, m] |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
165 self.restart_bridges_delayed(bridges, 60, error) |
108
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
166 return |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
167 elif r == '': |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
168 r = 'None given' |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
169 else: |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
170 r = 'None given' |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
171 |
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
172 # room has been destroyed, stop the bridge |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
173 self.error(say_levels.error, 'The MUC room of the bridge '+str(bridge)+' has been destroyed with reason "'+r+'", stopping the bridge', send_to_admins=True) |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
174 bridge.stop(message='The MUC room has been destroyed with reason "'+r+'", stopping the bridge') |
108
dff9746aa508
XMPP room deletion (and server shut down) handling
Charly COSTE <changaco@changaco.net>
parents:
105
diff
changeset
|
175 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
176 else: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
177 # 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
|
178 |
103 | 179 x = presence.getTag('x', namespace='http://jabber.org/protocol/muc#user') |
180 item = None | |
181 if x: | |
182 item = x.getTag('item') | |
183 | |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
184 if presence.getType() == 'unavailable': |
96 | 185 try: |
186 p = bridge.getParticipant(resource) | |
124 | 187 except Bridge.NoSuchParticipantException: |
96 | 188 p = None |
189 | |
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
|
190 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
|
191 # participant changed its nickname |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
192 if p == None: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
193 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
194 if p.protocol != 'xmpp': |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
195 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
|
196 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
|
197 if not item: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
198 self.error(say_levels.debug, 'bad stanza, no item element', no_debug_add=no_debug_add) |
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
|
199 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
|
200 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
|
201 if not new_nick: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
202 self.error(say_levels.debug, 'bad stanza, new nick is not given', no_debug_add=no_debug_add) |
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
|
203 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
|
204 p.changeNickname(new_nick, 'irc') |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
205 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
206 elif x and x.getTag('status', attrs={'code': '307'}): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
207 # participant was kicked |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
208 if p == None: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
209 bridge.xmpp_room.rejoin() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
210 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
211 if isinstance(p.xmpp_c, xmpp.client.Client): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
212 p.muc.rejoin() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
213 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
214 if item: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
215 reason = item.getTag('reason') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
216 actor = item.getTag('actor') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
217 if actor and actor.has_attr('jid'): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
218 kicker = actor.getAttr('jid') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
219 s1 = 'Kicked by '+kicker |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
220 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
221 s1 = 'Kicked from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
222 if reason: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
223 s2 = ' with reason: '+reason.getData() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
224 else: |
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 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
227 s1 = 'Kicked from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
228 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
229 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
230 bridge.removeParticipant('xmpp', p.nickname, s1+s2) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
231 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
232 elif x and x.getTag('status', attrs={'code': '301'}): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
233 # participant was banned |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
234 if p == None: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
235 bridge.say(say_levels.error, 'bot got banned from XMPP', on_xmpp=False, send_to_admins=True) |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
236 self.removeBridge(bridge) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
237 return |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
238 if item: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
239 reason = item.getTag('reason') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
240 actor = item.getTag('actor') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
241 if actor and actor.has_attr('jid'): |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
242 kicker = actor.getAttr('jid') |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
243 s1 = 'Banned by '+kicker |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
244 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
245 s1 = 'Banned from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
246 if reason: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
247 s2 = ' with reason: '+reason.getData() |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
248 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
249 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
250 else: |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
251 s1 = 'Banned from XMPP' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
252 s2 = ' (no reason was given)' |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
253 |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
254 bridge.removeParticipant('xmpp', p.nickname, s1+s2) |
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
255 |
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
|
256 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
|
257 # participant left |
99
5390e9abfa44
Don't try to remove a participant that does not exist
Charly COSTE <changaco@changaco.net>
parents:
96
diff
changeset
|
258 if p != None: |
5390e9abfa44
Don't try to remove a participant that does not exist
Charly COSTE <changaco@changaco.net>
parents:
96
diff
changeset
|
259 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
|
260 |
111
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
261 elif presence.getType() == 'error': |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
262 error = presence.getTag('error') |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
263 if error: |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
264 for c in error.getChildren(): |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
265 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
|
266 err = error.getAttr('type')+' '+c.getName() |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
267 if err == 'cancel remote-server-not-found': |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
268 # Remote server not found |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
269 # Stop bridges that depend on this server |
59401ac0f47a
handle XMPP remote-server-not-found
Charly COSTE <changaco@changaco.net>
parents:
110
diff
changeset
|
270 bridges = self.findBridges([from_.getDomain()]) |
190
6db99e458168
fixed calls to Bot.restart_bridges_delayed(), arguments changed in f52cb2f6e273328e73d75ab4ecf214c8dc9dfe1b
Charly COSTE <changaco@changaco.net>
parents:
188
diff
changeset
|
271 error = [say_levels.error, 'XMPP Remote server not found: '+from_.getDomain()] |
6db99e458168
fixed calls to Bot.restart_bridges_delayed(), arguments changed in f52cb2f6e273328e73d75ab4ecf214c8dc9dfe1b
Charly COSTE <changaco@changaco.net>
parents:
188
diff
changeset
|
272 self.restart_bridges_delayed(bridges, 60, error) |
111
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): |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
285 for admin in self.admins: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
286 if xmpp.protocol.JID(admin.jid).bareMatch(real_jid): |
103 | 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 |
200
740effa74c18
bugfix for previous commit, forgot "self" argument for say_on_XMPP_through_bridge
Charly COSTE <changaco@changaco.net>
parents:
199
diff
changeset
|
293 |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
294 self.error(say_levels.debug, 'Unhandled XMPP presence', no_debug_add='\n'+presence.__str__(fancy=1)) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
295 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
296 |
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
|
297 def _xmpp_iq_handler(self, dispatcher, iq): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
298 """[Internal] Manage XMPP IQs.""" |
75 | 299 |
300 xmpp_c = dispatcher._owner | |
301 | |
302 # Ignore pongs | |
303 if iq.getType() in ['result', 'error'] and iq.getID() in xmpp_c.pings: | |
304 xmpp_c.pings.remove(iq.getID()) | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
305 self.error(1, 'received XMPP pong', debug=True) |
75 | 306 return |
307 | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
308 self.error(2, 'Received XMPP iq.\n'+iq.__str__(fancy=1), debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
309 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
310 |
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
|
311 def _xmpp_message_handler(self, dispatcher, message): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
312 """[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
|
313 |
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 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
|
315 |
34
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
316 if message.getBody() == None: |
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
317 return |
57d0e66378b0
Fixed XMPP message handling and removed disconnect handler.
Charly COSTE <changaco@changaco.net>
parents:
33
diff
changeset
|
318 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
319 if message.getType() == 'chat': |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
320 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
|
321 for bridge in self.bridges: |
103 | 322 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
|
323 # 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
|
324 |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
325 self.error(2, 'Received XMPP chat message.\n'+message.__str__(fancy=1), debug=True) |
103 | 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') | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
338 self.error(2, 'Sending\n'+s.__str__(fancy=1), debug=True) |
103 | 339 xmpp_c.send(s) |
340 else: | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
341 self.error(1, 'won\'t answer.', debug=True) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
342 return |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
343 self.error(say_levels.debug, 'XMPP chat message not relayed', no_debug_add='\n'+message.__str__(fancy=1)) |
11
79b0a7f48a3e
Introduced the command mechanism and fixed a bug
Charly COSTE <changaco@changaco.net>
parents:
10
diff
changeset
|
344 return |
103 | 345 |
346 # message does not come from a room | |
347 if xmpp_c.nickname == self.nickname: | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
348 self.error(2, 'Received XMPP chat message.\n'+message.__str__(fancy=1), debug=True) |
103 | 349 |
350 # Find out if the message comes from a bot admin | |
351 bot_admin = False | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
352 for admin in self.admins: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
353 if xmpp.protocol.JID(admin.jid).bareMatch(message.getFrom()): |
103 | 354 bot_admin = True |
355 break | |
356 | |
357 # Respond | |
358 r = self.respond(str(message.getBody()), bot_admin=bot_admin) | |
359 if isinstance(r, basestring) and len(r) > 0: | |
360 s = xmpp.protocol.Message(to=message.getFrom(), body=r, typ='chat') | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
361 self.error(2, 'Sending\n'+s.__str__(fancy=1), debug=True) |
103 | 362 xmpp_c.send(s) |
363 | |
364 else: | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
365 self.error(1, '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
|
366 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
367 elif message.getType() == 'groupchat': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
368 # 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
|
369 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
370 for child in message.getChildren(): |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
371 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
|
372 # MUC delayed message |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
373 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
|
374 |
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
|
375 if xmpp_c.nickname != self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
376 self.error(1, 'Ignoring XMPP MUC message not received on bot connection.', 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
|
377 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
|
378 |
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 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
380 from_ = xmpp.protocol.JID(message.getFrom()) |
23 | 381 |
382 if unicode(from_.getResource()) == self.nickname: | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
383 self.error(1, 'Ignoring XMPP MUC message sent by self.', debug=True) |
23 | 384 return |
385 | |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
386 room_jid = unicode(from_.getNode()+'@'+from_.getDomain()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
387 for bridge in self.bridges: |
103 | 388 if room_jid == bridge.xmpp_room_jid: |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
389 resource = unicode(from_.getResource()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
390 if resource == '': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
391 # message comes from the room itself |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
392 self.error(1, 'Ignoring XMPP groupchat message sent by the room.', 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
|
393 return |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
394 else: |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
395 # message comes from a participant of the room |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
396 self.error(2, 'Received XMPP groupchat message.\n'+message.__str__(fancy=1), 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
|
397 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
398 try: |
124 | 399 participant = bridge.getParticipant(resource) |
400 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
|
401 if resource != self.nickname: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
402 self.error(say_levels.debug, 'NoSuchParticipantException "'+resource+'" on "'+str(bridge)+'", WTF ?', no_debug_add='\n'+message.__str__(fancy=1)) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
403 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
|
404 |
124 | 405 participant.sayOnIRC(message.getBody()) |
37 | 406 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
|
407 |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
408 elif message.getType() == 'error': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
409 for b in self.bridges: |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
410 if message.getFrom() == b.xmpp_room_jid: |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
411 # message comes from a room |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
412 for c in message.getChildren(): |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
413 if c.getName() == 'error': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
414 for cc in c.getChildren(): |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
415 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
|
416 err = cc.getName() |
199
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
417 if err in ['not-acceptable', 'not-allowed']: |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
418 # we sent a message to a room we are not in |
199
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
419 # can be due to a MUC server restart |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
420 # can be a concurrency bug |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
421 if xmpp_c.nickname == self.nickname: |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
422 b.restart(message='Automatic restart of bridge') |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
423 else: |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
424 try: |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
425 p = b.getParticipant(xmpp_c.nickname) |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
426 p.say_on_XMPP_through_bridge(message.getBody()) |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
427 except Bridge.NoSuchParticipantException: |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
428 b.restart(message='Automatic restart of bridge') |
dcabe54deeba
improved an XMPP error handling, created Participant.say_on_XMPP_through_bridge()
Charly COSTE <changaco@changaco.net>
parents:
198
diff
changeset
|
429 |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
430 elif err == 'forbidden': |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
431 # we don't have the permission to speak |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
432 # let's remove the bridge and tell admins |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
433 self.error(say_levels.error, 'Not allowed to speak on the XMPP MUC of bridge '+str(b)+', stopping it', send_to_admins=True) |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
434 b.stop(message='Not allowed to speak on the XMPP MUC, stopping the bridge') |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
435 else: |
200
740effa74c18
bugfix for previous commit, forgot "self" argument for say_on_XMPP_through_bridge
Charly COSTE <changaco@changaco.net>
parents:
199
diff
changeset
|
436 self.error(say_levels.debug, 'recevied unknown error message\n'+message.__str__(fancy=1)) |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
437 return |
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
438 |
200
740effa74c18
bugfix for previous commit, forgot "self" argument for say_on_XMPP_through_bridge
Charly COSTE <changaco@changaco.net>
parents:
199
diff
changeset
|
439 self.error(say_levels.debug, 'received unknown error message\n'+message.__str__(fancy=1)) |
105
d8acff763731
Handle MUC error messages
Charly COSTE <changaco@changaco.net>
parents:
103
diff
changeset
|
440 |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
441 else: |
200
740effa74c18
bugfix for previous commit, forgot "self" argument for say_on_XMPP_through_bridge
Charly COSTE <changaco@changaco.net>
parents:
199
diff
changeset
|
442 self.error(say_levels.debug, 'Received XMPP message of unknown type "'+str(message.getType())+'".\n'+message.__str__(fancy=1)) |
0
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 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
445 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
|
446 """[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
|
447 |
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
|
448 # Answer ping |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
449 if event.eventtype() == 'ping': |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
450 connection.pong(connection.get_server_name()) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
451 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
|
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 |
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
|
454 # Events we always want to ignore |
166
0fc24e232997
some fixes related to IRC nicknames
Charly COSTE <changaco@changaco.net>
parents:
156
diff
changeset
|
455 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
|
456 return |
184
1e5308a0db55
added 2 IRC events to ignore, 042 and pubnotice
Charly COSTE <changaco@changaco.net>
parents:
183
diff
changeset
|
457 if event.eventtype() in ['pong', 'privnotice', 'ctcp', 'nochanmodes', 'notexttosend', 'currenttopic', 'topicinfo', '328', 'pubnotice', '042']: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
458 self.error(1, '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
|
459 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
|
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 |
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
|
462 nickname = None |
24
4e1f27ea527b
First hack at locks for thread safety. Some other minor changes.
Charly COSTE <changaco@changaco.net>
parents:
23
diff
changeset
|
463 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
|
464 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
|
465 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
|
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 |
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
|
468 # 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
|
469 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
|
470 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
|
471 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
|
472 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
|
473 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
|
474 elif len(connection.nick_callbacks) > 0: |
188
bd185885d4ca
minor fixes in bot.py, error messages that weren't flagged as debug
Charly COSTE <changaco@changaco.net>
parents:
187
diff
changeset
|
475 self.error(3, 'event target ('+event.target()+') and connection nickname ('+connection.nickname+') don\'t match', 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
|
476 connection._call_nick_callbacks('nicknametoolong', arguments=[len(event.target())]) |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
477 self.error(1, 'ignoring '+event.eventtype(), debug=True) |
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
|
478 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
|
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 |
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
|
481 # A string representation of the event |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
482 event_str = '\nconnection='+connection.__str__()+'\neventtype='+event.eventtype()+'\nsource='+repr(event.source())+'\ntarget='+repr(event.target())+'\narguments='+repr(event.arguments()) |
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
483 debug_str = 'Received IRC event.'+event_str |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
484 printed_event = 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
|
485 |
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 |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 |
39 | 491 handled = False |
492 | |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
493 if event.eventtype() in ['quit', 'part'] and nickname == self.nickname: |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
494 return |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
495 |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
496 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
|
497 if connection.get_nickname() != self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
498 self.error(1, 'ignoring IRC '+event.eventtype()+' not received on bot connection', debug=True) |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
499 return |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
500 else: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
501 self.error(2, debug_str, debug=True) |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
502 printed_event = True |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
503 |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
504 if event.eventtype() == 'kick' and len(event.arguments()) < 1: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
505 self.error(say_levels.debug, 'at least 1 argument is needed for a '+event.eventtype()+' event', no_debug_add=event_str) |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
506 return |
39 | 507 |
54
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
508 if event.eventtype() in ['pubmsg', 'action']: |
55 | 509 if connection.get_nickname() != self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
510 self.error(1, 'ignoring IRC '+event.eventtype()+' not received on bot connection', debug=True) |
54
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
511 return |
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
512 if nickname == self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
513 self.error(1, 'ignoring IRC '+event.eventtype()+' sent by self', debug=True) |
54
2507f424773a
Fixed a bug introduced in previous commit
Charly COSTE <changaco@changaco.net>
parents:
53
diff
changeset
|
514 return |
50
dbb7c29a71e2
Ignore messages sent by self
Charly COSTE <changaco@changaco.net>
parents:
49
diff
changeset
|
515 |
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
|
516 # 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
|
517 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
|
518 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
|
519 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
|
520 |
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
|
521 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
|
522 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
|
523 |
124 | 524 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
|
525 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
|
526 |
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 |
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 # 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
|
529 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
|
530 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
|
531 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
|
532 |
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 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
|
534 to_ = bridge.getParticipant(event.target().split('!')[0]) |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
535 self.error(2, debug_str, 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
|
536 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
|
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 |
124 | 539 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
|
540 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
|
541 # Message is for the bot |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
542 self.error(2, debug_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
|
543 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
|
544 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
|
545 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
|
546 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
|
547 |
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
|
548 |
92
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
549 # kick handling |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
550 if event.eventtype() == 'kick': |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
551 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
|
552 try: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
553 kicked = bridge.getParticipant(event.arguments()[0]) |
72
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
554 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
|
555 kicked.irc_connection.join(bridge.irc_room) |
93
c95fe0b319d9
XMPP kick and ban handling
Charly COSTE <changaco@changaco.net>
parents:
92
diff
changeset
|
556 else: |
92
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
557 if len(event.arguments()) > 1: |
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
558 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
|
559 else: |
aae8870b3727
Better handling of IRC kick
Charly COSTE <changaco@changaco.net>
parents:
91
diff
changeset
|
560 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
|
561 return |
124 | 562 except Bridge.NoSuchParticipantException: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
563 self.error(say_levels.debug, 'a participant that was not here has been kicked ? WTF ?', no_debug_add=event_str) |
53
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
564 return |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
565 else: |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
566 continue |
a2258a705a17
Handle kick (by simply rejoining) on IRC side
Charly COSTE <changaco@changaco.net>
parents:
52
diff
changeset
|
567 |
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
|
568 |
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
|
569 # Leaving events |
45
41394ddb3aff
Lower before comparing strings.
Charly COSTE <changaco@changaco.net>
parents:
44
diff
changeset
|
570 if event.eventtype() == 'quit' or event.eventtype() == 'part' and event.target().lower() == bridge.irc_room: |
30
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
571 if len(event.arguments()) > 0: |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
572 leave_message = event.arguments()[0] |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
573 elif event.eventtype() == 'quit': |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
574 leave_message = 'Left server.' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
575 elif event.eventtype() == 'part': |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
576 leave_message = 'Left channel.' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
577 else: |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
578 leave_message = '' |
c0fb916cb0a0
Fixed IRC leaving events handling.
Charly COSTE <changaco@changaco.net>
parents:
29
diff
changeset
|
579 bridge.removeParticipant('irc', from_.nickname, leave_message) |
39 | 580 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
|
581 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
|
582 |
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 |
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 # Nickname change |
41
4c4f4ee72e17
Fixed IRC "nick" event handling. Fixed bot's XMPP infinite loop.
Charly COSTE <changaco@changaco.net>
parents:
39
diff
changeset
|
585 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
|
586 from_.changeNickname(event.target(), 'xmpp') |
39 | 587 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
|
588 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
|
589 |
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
|
590 |
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
|
591 # 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
|
592 if event.eventtype() in ['pubmsg', 'action']: |
45
41394ddb3aff
Lower before comparing strings.
Charly COSTE <changaco@changaco.net>
parents:
44
diff
changeset
|
593 if bridge.irc_room == event.target().lower() and bridge.irc_server == connection.server: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
594 self.error(2, debug_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
|
595 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
|
596 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
|
597 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
|
598 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
|
599 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
|
600 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
|
601 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
|
602 |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
603 if handled: |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
604 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
|
605 |
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
|
606 |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
607 # Handle bannedfromchan |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
608 if event.eventtype() == 'bannedfromchan': |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
609 if len(event.arguments()) < 1: |
188
bd185885d4ca
minor fixes in bot.py, error messages that weren't flagged as debug
Charly COSTE <changaco@changaco.net>
parents:
187
diff
changeset
|
610 self.error(1, 'length of arguments should be greater than 0 for a '+event.eventtype()+' event', debug=True) |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
611 return |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
612 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
613 for bridge in self.bridges: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
614 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
|
615 continue |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
616 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
617 if event.target() == self.nickname: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
618 self.error(say_levels.error, 'the nickname "'+event.target()+'" is banned from the IRC chan of bridge "'+str(bridge)+'"') |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
619 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
|
620 else: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
621 try: |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
622 banned = bridge.getParticipant(event.target()) |
72
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
623 if banned.irc_connection != 'bannedfromchan': |
6c4b841144f6
Better handling of participants
Charly COSTE <changaco@changaco.net>
parents:
70
diff
changeset
|
624 banned.irc_connection = 'bannedfromchan' |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
625 self.error(2, debug_str, debug=True) |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
626 bridge.say(say_levels.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
|
627 else: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
628 self.error(1, 'ignoring '+event.eventtype(), debug=True) |
124 | 629 except Bridge.NoSuchParticipantException: |
188
bd185885d4ca
minor fixes in bot.py, error messages that weren't flagged as debug
Charly COSTE <changaco@changaco.net>
parents:
187
diff
changeset
|
630 self.error(1, 'no such participant. WTF ?', debug=True) |
58
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 return |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
634 |
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
635 |
152
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
636 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
|
637 if len(event.arguments()) > 0 and event.arguments()[0] == 'Connection reset by peer': |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
638 self.error(2, debug_str, debug=True) |
152
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
639 else: |
188
bd185885d4ca
minor fixes in bot.py, error messages that weren't flagged as debug
Charly COSTE <changaco@changaco.net>
parents:
187
diff
changeset
|
640 self.error(say_levels.debug, debug_str, send_to_admins=True) |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
641 return |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
642 |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
643 |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
644 if event.eventtype() in ['cannotsendtochan', 'notonchannel', 'inviteonlychan']: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
645 self.error(2, debug_str, debug=True) |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
646 bridges = self.getBridges(irc_room=event.arguments()[0], irc_server=connection.server) |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
647 if len(bridges) > 1: |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
648 raise Exception, 'more than one bridge for one irc chan, WTF ?' |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
649 bridge = bridges[0] |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
650 if connection.get_nickname() == self.nickname: |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
651 bridge._join_irc_failed(event.eventtype()) |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
652 else: |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
653 p = bridge.getParticipant(connection.get_nickname()) |
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
654 p._close_irc_connection('') |
198
66ed2dcdc4d1
bugfix, «error» → «event.eventtype()», introduced in 41a4f43330ef9e8b7aa94e35bde3162f1da2d4e7
Charly COSTE <changaco@changaco.net>
parents:
195
diff
changeset
|
655 p.irc_connection = event.eventtype() |
152
17305e57f71d
removed automatic switching to limited mode (created Bridge.show_participants_list_on())
Charly COSTE <changaco@changaco.net>
parents:
151
diff
changeset
|
656 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
|
657 |
58
92341dbfb8b7
Handle bannedfromchan IRC event
Charly COSTE <changaco@changaco.net>
parents:
56
diff
changeset
|
658 |
187 | 659 # Ignore events not received on bot connection |
660 if connection.get_nickname() != self.nickname: | |
661 self.error(1, 'ignoring IRC '+event.eventtype()+' not received on bridge connection', debug=True) | |
662 return | |
663 | |
664 | |
665 # Joining events | |
666 if event.eventtype() in ['namreply', 'join']: | |
667 if event.eventtype() == 'namreply': | |
668 for bridge in self.getBridges(irc_room=event.arguments()[1].lower(), irc_server=connection.server): | |
669 for nickname in re.split('(?:^[&@\+%]?|(?: [&@\+%]?)*)', event.arguments()[2].strip()): | |
670 if nickname == '' or nickname == self.nickname: | |
671 continue | |
672 bridge.addParticipant('irc', nickname) | |
673 return | |
674 elif event.eventtype() == 'join': | |
675 bridges = self.getBridges(irc_room=event.target().lower(), irc_server=connection.server) | |
676 if len(bridges) == 0: | |
677 self.error(2, debug_str, debug=True) | |
678 self.error(3, 'no bridge found for "'+event.target().lower()+' at '+connection.server+'"', debug=True) | |
679 return | |
680 for bridge in bridges: | |
681 bridge.addParticipant('irc', nickname, irc_id=event.source()) | |
682 return | |
683 | |
684 | |
685 # Mode event | |
686 if event.eventtype() == 'mode': | |
687 if len(event.arguments()) < 2: | |
688 self.error(2, debug_str, debug=True) | |
689 self.error(1, '2 arguments are needed for a '+event.eventtype()+' event', debug=True) | |
690 return | |
691 if event.arguments()[1] != self.nickname or not 'o' in event.arguments()[0]: | |
692 self.error(1, 'ignoring IRC mode "'+event.arguments()[0]+'" for "'+event.arguments()[1]+'"', debug=True) | |
693 return | |
694 self.error(2, debug_str, debug=True) | |
695 bridges = self.getBridges(irc_room=event.target(), irc_server=connection.server) | |
696 if len(bridges) > 1: | |
697 raise Exception, 'more than one bridge for one irc chan, WTF ?' | |
698 bridge = bridges[0] | |
699 if re.search('\+[^\-]*o', event.arguments()[0]): | |
700 # bot is channel operator | |
701 bridge.irc_op = True | |
702 self.error(say_levels.notice, 'bot has IRC operator privileges in '+event.target()) | |
703 elif re.search('\-[^\+]*o', event.arguments()[0]): | |
704 # bot lost channel operator privileges | |
705 if bridge.irc_op: | |
706 self.error(say_levels.notice, 'bot lost IRC operator privileges in '+event.target(), send_to_admins=True) | |
707 bridge.irc_op = False | |
708 return | |
709 | |
710 | |
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
|
711 # Unhandled events |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
712 if not printed_event: |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
713 self.error(say_levels.debug, 'The following IRC event was not handled:'+event_str+'\n', send_to_admins=True) |
179
f6c6708c6c0e
handle IRC events cannotsendtochan and notonchannel, send unhandled events to bot admins
Charly COSTE <changaco@changaco.net>
parents:
177
diff
changeset
|
714 else: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
715 self.error(1, 'event not handled', debug=True) |
201
de574314990e
log some more things when Bot.debug is False
Charly COSTE <changaco@changaco.net>
parents:
200
diff
changeset
|
716 self._send_message_to_admins(say_levels.debug, 'The following IRC event was not handled:'+event_str) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
717 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
718 |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
719 def _send_message_to_admins(self, importance, message): |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
720 """[Internal] Send XMPP Message to bot admin(s)""" |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
721 for admin in self.admins: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
722 if importance != -1: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
723 if admin.say_level == say_levels.nothing or importance < admin.say_level: |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
724 continue |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
725 message = self.format_message(importance, message) |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
726 |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
727 try: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
728 self.xmpp_c.send(xmpp.protocol.Message(to=admin.jid, body=message, typ='chat')) |
86
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
729 except: |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
730 pass |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
731 |
bfa32b017fc9
First hack at an error notification system
Charly COSTE <changaco@changaco.net>
parents:
79
diff
changeset
|
732 |
172
64a0e9636ae6
removed encoding.py, charsets handling is now in irclib and custom charsets can be set per server in the configuration file
Charly COSTE <changaco@changaco.net>
parents:
171
diff
changeset
|
733 def new_bridge(self, xmpp_room, irc_room, irc_server, mode, say_level, irc_port=6667, irc_connection_interval=1, irc_charsets=None): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
734 """Create a bridge between xmpp_room and irc_room at irc_server.""" |
172
64a0e9636ae6
removed encoding.py, charsets handling is now in irclib and custom charsets can be set per server in the configuration file
Charly COSTE <changaco@changaco.net>
parents:
171
diff
changeset
|
735 b = Bridge(self, xmpp_room, irc_room, irc_server, mode, say_level, irc_port=irc_port, irc_connection_interval=irc_connection_interval, irc_charsets=irc_charsets) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
736 self.bridges.append(b) |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
737 return b |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
738 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
739 |
103 | 740 def findBridges(self, str_array): |
741 # TODO: lock self.bridges for thread safety | |
742 bridges = [b for b in self.bridges] | |
183
8f67684fee23
minor fix to Bot.findBridges(), memory usage improvement
Charly COSTE <changaco@changaco.net>
parents:
181
diff
changeset
|
743 for bridge in self.bridges: |
103 | 744 for s in str_array: |
745 if not s in str(bridge): | |
746 bridges.remove(bridge) | |
747 break | |
748 return bridges | |
749 | |
750 | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
751 def format_message(self, importance, message): |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
752 if importance < 0 or importance >= len(say_levels.levels): |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
753 raise Exception('[Internal Error] unknown message importance') |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
754 return'['+str(say_levels.get(importance))+'] '+message |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
755 |
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
756 |
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
|
757 def getBridges(self, irc_room=None, irc_server=None, xmpp_room_jid=None): |
96 | 758 # 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
|
759 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
|
760 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
|
761 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
|
762 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
|
763 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
|
764 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
|
765 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
|
766 continue |
103 | 767 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
|
768 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
|
769 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
|
770 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
|
771 |
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
|
772 |
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
|
773 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
|
774 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
|
775 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
|
776 c.used_by += 1 |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
777 self.error(3, '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
|
778 return c |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
779 self.error(3, 'opening new XMPP connection for "'+nickname+'"', debug=True) |
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
|
780 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
|
781 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
|
782 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
|
783 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
|
784 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
|
785 c.nickname = nickname |
90
965dd6f5fcc3
Tried to improve XMPP disconnections handling
Charly COSTE <changaco@changaco.net>
parents:
88
diff
changeset
|
786 c.mucs = [] |
75 | 787 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
|
788 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
|
789 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
|
790 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
|
791 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
|
792 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
|
793 c.sendInitPresence() |
103 | 794 if nickname == self.nickname: |
795 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
|
796 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
|
797 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
|
798 |
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
|
799 |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
800 def reopen_xmpp_connection(self, c): |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
801 if not isinstance(c, xmpp.client.Client): |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
802 return |
103 | 803 bot_connection = False |
804 if c == self.xmpp_c: | |
805 bot_connection = True | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
806 mucs = c.mucs |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
807 nickname = c.nickname |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
808 used_by = c.used_by |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
809 participants = [] |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
810 for b in self.bridges: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
811 for p in b.participants: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
812 if p.xmpp_c == c: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
813 participants.append(p) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
814 p.xmpp_c = None |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
815 self.error(3, 'reopening XMPP connection for "'+nickname+'"', debug=True) |
122 | 816 if self.xmpp_connections.has_key(nickname): |
817 self.xmpp_connections.pop(nickname) | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
818 c.send(xmpp.protocol.Presence(typ='unavailable')) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
819 del c |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
820 c = self.get_xmpp_connection(nickname) |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
821 c.used_by = used_by |
103 | 822 if bot_connection: |
823 self.xmpp_c = c | |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
824 for p in participants: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
825 p.xmpp_c = c |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
826 c.mucs = mucs |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
827 for m in c.mucs: |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
828 m.rejoin() |
122 | 829 return c |
100
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
830 |
6289ac5a2db7
Reconnect when a connection is closed
Charly COSTE <changaco@changaco.net>
parents:
99
diff
changeset
|
831 |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
832 def close_xmpp_connection(self, nickname, force=False): |
29 | 833 if not self.xmpp_connections.has_key(nickname): |
834 return | |
37 | 835 c = self.xmpp_connections[nickname] |
42
b8c9ddf320f8
Thread safety for bot.close_xmpp_connection().
Charly COSTE <changaco@changaco.net>
parents:
41
diff
changeset
|
836 c.lock.acquire() |
37 | 837 c.used_by -= 1 |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
838 if c.used_by < 1 or force: |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
839 self.error(3, 'closing XMPP connection for "'+nickname+'"', debug=True) |
37 | 840 self.xmpp_connections.pop(nickname) |
52
5aabf124c78d
Fixed XMPP connection closing and the XMPP loop
Charly COSTE <changaco@changaco.net>
parents:
51
diff
changeset
|
841 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
|
842 c.lock.release() |
37 | 843 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
|
844 else: |
42
b8c9ddf320f8
Thread safety for bot.close_xmpp_connection().
Charly COSTE <changaco@changaco.net>
parents:
41
diff
changeset
|
845 c.lock.release() |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
846 self.error(3, '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
|
847 |
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
|
848 |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
849 def removeBridge(self, bridge, message='Removing bridge', log=True): |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
850 self.bridges.remove(bridge) |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
851 bridge.stop(message=message, log=log) |
0
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
852 |
4c842d23d4ce
Initial commit, version 0.1
Charly COSTE <changaco@changaco.net>
parents:
diff
changeset
|
853 |
124 | 854 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
|
855 if isinstance(participant, Participant): |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
856 bridge = participant.bridge |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
857 if bot_admin != participant.bot_admin: |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
858 bot_admin = participant.bot_admin |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
859 else: |
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
860 bridge = None |
103 | 861 |
134
931a5edc7971
moved commands to a separate file
Charly COSTE <changaco@changaco.net>
parents:
133
diff
changeset
|
862 return commands.execute(self, message, bot_admin, bridge) |
103 | 863 |
864 | |
865 def restart(self): | |
866 # Stop the bridges | |
867 for b in self.bridges: | |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
868 b.stop(message='Restarting bot', log=False) |
103 | 869 |
870 # Reopen the bot's XMPP connection | |
871 self.reopen_xmpp_connection(self.xmpp_c) | |
872 | |
873 # Restart the bridges | |
874 for b in self.bridges: | |
875 b.init2() | |
876 | |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
877 self.error(-1, '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
|
878 |
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
|
879 |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
880 def restart_bridges_delayed(self, bridges, delay, error, protocol='xmpp'): |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
881 if len(bridges) > 0: |
195
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
882 found = False |
180
102f895347ff
added a required "importance" argument to Bot.error()
Charly COSTE <changaco@changaco.net>
parents:
179
diff
changeset
|
883 error[1] += '\nThese bridges will be stopped:' |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
884 for b in bridges: |
177
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
885 if protocol == 'xmpp': |
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
886 leave_message = 'Could not connect to the MUC server ('+b.xmpp_room_jid+')' |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
887 else: |
177
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
888 leave_message = 'Could not connect to the IRC server ('+b.irc_connection._server_str()+')' |
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
889 |
195
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
890 if not b.reconnecting: |
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
891 found = True |
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
892 error[1] += '\n'+str(b) |
177
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
893 leave_message += 'will try to recreate the bridge in '+str(delay)+' seconds' |
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
894 b.reconnecting = True |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
895 self.irc.execute_delayed(delay, b.init2) |
177
d1686164b9e3
improved Bot.restart_bridges_delayed(), it can now be used when the IRC server is the problem
Charly COSTE <changaco@changaco.net>
parents:
172
diff
changeset
|
896 |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
897 b.stop(message=leave_message, log=False) |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
898 |
195
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
899 if found: |
e4ceefab8ba5
fixed Bot.restart_bridges_delayed(), don't send the message to admins more than once
Charly COSTE <changaco@changaco.net>
parents:
193
diff
changeset
|
900 self.error(error[0], error[1], send_to_admins=True) |
121
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
901 |
765e460bc20a
Restart all bridges connected to a MUC server when it goes down
Charly COSTE <changaco@changaco.net>
parents:
119
diff
changeset
|
902 |
129
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
903 def stop(self, message='Stopping bot'): |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
904 self.error(-1, message, send_to_admins=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
|
905 for bridge in self.bridges: |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
906 bridge.stop(message=message, log=False) |
129
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
907 |
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
908 |
b13ca9cefe1c
tried to fix the halt command (added Bot.stop())
Charly COSTE <changaco@changaco.net>
parents:
127
diff
changeset
|
909 def __del__(self): |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
910 for bridge in self.bridges: |
193
c2a8586e64b5
handle IRC inviteonlychan event, improved error messages
Charly COSTE <changaco@changaco.net>
parents:
190
diff
changeset
|
911 self.removeBridge(bridge, message='Stopping bot', log=False) |
155
63db565438bd
fixed the halt command
Charly COSTE <changaco@changaco.net>
parents:
152
diff
changeset
|
912 self.halt = True |