jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/338048 )
Change subject: Guard against multiple bots competing in channels
......................................................................
Guard against multiple bots competing in channels
* Die when using secondary nick and given a nick in use notice
* Use `/msg NickServ regain` when reclaiming primary nick
* Check for primary nick before handling channel messages
Bug: T156895
Change-Id: I375175b07a6c924555e3a35f5ea5b01af4b42eb6
---
M stashbot/bot.py
1 file changed, 23 insertions(+), 4 deletions(-)
Approvals:
BryanDavis: Looks good to me, approved
jenkins-bot: Verified
diff --git a/stashbot/bot.py b/stashbot/bot.py
index 08038d2..9bd87df 100644
--- a/stashbot/bot.py
+++ b/stashbot/bot.py
@@ -95,7 +95,13 @@
def on_nicknameinuse(self, conn, event):
nick = conn.get_nickname()
self.logger.warning('Requested nick "%s" in use', nick)
- conn.nick(nick + '_')
+ alt_nick = self.config['irc']['nick'] + '_'
+ if nick == alt_nick:
+ # Primary and secondary nicks taken, abort connection
+ self.die(
+ 'Cowardly refusing to fill the channel with copies of myself')
+
+ conn.nick(alt_nick)
if 'password' in self.config['irc']:
self.reactor.scheduler.execute_after(30, self.do_reclaim_nick)
@@ -126,6 +132,10 @@
self.logger.warning(str(event))
def on_pubmsg(self, conn, event):
+ if not self._have_primary_nick():
+ # Don't do anything if we haven't aquired the primary nick
+ return
+
# Log all public channel messages we receive
doc = self.es.event_to_doc(conn, event)
self.do_write_to_elasticsearch(conn, event, doc)
@@ -214,9 +224,14 @@
1, functools.partial(self.do_join, cdr))
def do_reclaim_nick(self):
- nick = self.connection.get_nickname()
- if nick != self.config['irc']['nick']:
- self.connection.nick(self.config['irc']['nick'])
+ if not self._have_primary_nick():
+ # REGAIN disconnects an old user session, or somebody
+ # attempting to use your nickname without authorization,
+ # then changes your nickname to the given nickname.
+ # This may not work, disconnecting you, if the target
+ # client reconnects automatically.
+ self.connection.privmsg('NickServ', 'regain %s %s' % (
+ self.config['irc']['nick'], self.config['irc']['password']))
def do_ping(self):
"""Send a ping or disconnect if too many pings are outstanding."""
@@ -319,6 +334,10 @@
"""Remove common status indicators and normlize to lower case."""
return nick.split('|', 1)[0].rstrip('`_').lower()
+ def _have_primary_nick(self):
+ """Do we currently have the desired nick?"""
+ return self.connection.get_nickname() == self.config['irc']['nick']
+
def respond(self, conn, event, msg):
"""Respond to an event with a message."""
to = event.target
--
To view, visit https://gerrit.wikimedia.org/r/338048
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I375175b07a6c924555e3a35f5ea5b01af4b42eb6
Gerrit-PatchSet: 1
Gerrit-Project: labs/tools/stashbot
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <[email protected]>
Gerrit-Reviewer: BryanDavis <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits