Handle topic via a configuration file
Change-Id: I72d9310c0071ba08f23b804e13514a997458ae56 Partial-Bug: #1190296
This commit is contained in:
parent
336c7d9992
commit
003744fc7b
|
@ -30,6 +30,9 @@ user=StatusBot
|
||||||
password=password
|
password=password
|
||||||
url=https://wiki.example.com/w/api.php
|
url=https://wiki.example.com/w/api.php
|
||||||
pageid=1781
|
pageid=1781
|
||||||
|
|
||||||
|
[#foo]
|
||||||
|
topic=Hello world
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
|
@ -162,9 +165,7 @@ class StatusBot(irc.bot.SingleServerIRCBot):
|
||||||
self.nickname = nickname
|
self.nickname = nickname
|
||||||
self.password = password
|
self.password = password
|
||||||
self.identify_msg_cap = False
|
self.identify_msg_cap = False
|
||||||
self.ignore_topics = True
|
|
||||||
self.topic_lock = threading.Lock()
|
self.topic_lock = threading.Lock()
|
||||||
self.topics = {}
|
|
||||||
self.publishers = publishers
|
self.publishers = publishers
|
||||||
|
|
||||||
def on_nicknameinuse(self, c, e):
|
def on_nicknameinuse(self, c, e):
|
||||||
|
@ -183,7 +184,7 @@ class StatusBot(irc.bot.SingleServerIRCBot):
|
||||||
c.cap('END')
|
c.cap('END')
|
||||||
self.log.debug("Identifying to nickserv")
|
self.log.debug("Identifying to nickserv")
|
||||||
c.privmsg("nickserv", "identify %s " % self.password)
|
c.privmsg("nickserv", "identify %s " % self.password)
|
||||||
for channel in self.channel_list:
|
for channel in self.channel_list.iterkeys():
|
||||||
self.log.info("Joining %s" % channel)
|
self.log.info("Joining %s" % channel)
|
||||||
c.join(channel)
|
c.join(channel)
|
||||||
|
|
||||||
|
@ -247,7 +248,7 @@ class StatusBot(irc.bot.SingleServerIRCBot):
|
||||||
command, nick, msg))
|
command, nick, msg))
|
||||||
|
|
||||||
def broadcast(self, msg):
|
def broadcast(self, msg):
|
||||||
for channel in self.channel_list:
|
for channel in self.channel_list.iterkeys():
|
||||||
self.send(channel, msg)
|
self.send(channel, msg)
|
||||||
|
|
||||||
def restore_all_topics(self):
|
def restore_all_topics(self):
|
||||||
|
@ -257,10 +258,8 @@ class StatusBot(irc.bot.SingleServerIRCBot):
|
||||||
def _restore_all_topics(self):
|
def _restore_all_topics(self):
|
||||||
self.topic_lock.acquire()
|
self.topic_lock.acquire()
|
||||||
try:
|
try:
|
||||||
if self.topics:
|
for channel, conf in self.channel_list.iteritems():
|
||||||
for channel in self.channel_list:
|
self.set_topic(channel, conf.get('topic', "Welcome!"))
|
||||||
self.set_topic(channel, self.topics[channel])
|
|
||||||
self.topics = {}
|
|
||||||
finally:
|
finally:
|
||||||
self.topic_lock.release()
|
self.topic_lock.release()
|
||||||
|
|
||||||
|
@ -271,44 +270,35 @@ class StatusBot(irc.bot.SingleServerIRCBot):
|
||||||
def _set_all_topics(self, topic):
|
def _set_all_topics(self, topic):
|
||||||
self.topic_lock.acquire()
|
self.topic_lock.acquire()
|
||||||
try:
|
try:
|
||||||
if not self.topics:
|
for channel in self.channel_list.iterkeys():
|
||||||
self.save_topics()
|
|
||||||
for channel in self.channel_list:
|
|
||||||
self.set_topic(channel, topic)
|
self.set_topic(channel, topic)
|
||||||
finally:
|
finally:
|
||||||
self.topic_lock.release()
|
self.topic_lock.release()
|
||||||
|
|
||||||
def save_topics(self):
|
|
||||||
# Save all the current topics
|
|
||||||
self.ignore_topics = False
|
|
||||||
for channel in self.channel_list:
|
|
||||||
self.connection.topic(channel)
|
|
||||||
time.sleep(0.5)
|
|
||||||
start = time.time()
|
|
||||||
done = False
|
|
||||||
while time.time() < start + 300:
|
|
||||||
if len(self.topics) == len(self.channel_list):
|
|
||||||
done = True
|
|
||||||
break
|
|
||||||
time.sleep(0.5)
|
|
||||||
self.ignore_topics = True
|
|
||||||
if not done:
|
|
||||||
raise Exception("Unable to save topics")
|
|
||||||
|
|
||||||
def on_currenttopic(self, c, e):
|
|
||||||
if self.ignore_topics:
|
|
||||||
return
|
|
||||||
self.topics[e.arguments[0]] = e.arguments[1]
|
|
||||||
|
|
||||||
def send(self, channel, msg):
|
def send(self, channel, msg):
|
||||||
self.connection.privmsg(channel, msg)
|
self.connection.privmsg(channel, msg)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
def set_topic(self, channel, topic):
|
def set_topic(self, channel, topic):
|
||||||
self.connection.topic(channel, topic)
|
self.connection.topic(channel, topic)
|
||||||
self.connection.privmsg('ChanServ', 'topic %s %s' % (channel, topic))
|
self.chanserv_topic(channel, topic)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
def chanserv(self, message):
|
||||||
|
"""Send a message to ChanServ."""
|
||||||
|
self.privmsg('ChanServ', message)
|
||||||
|
|
||||||
|
def chanserv_topic(self, channel, topic):
|
||||||
|
self.chanserv("TOPIC %s %s" % (channel, topic))
|
||||||
|
|
||||||
|
def chanserv_flags(self, channel, target=None, flags=None):
|
||||||
|
"""Set flags on a channel."""
|
||||||
|
self.chanserv("FLAGS %s %s %s" % (channel, target, flags))
|
||||||
|
|
||||||
|
def chanserv_list_access(self, channel):
|
||||||
|
"""List access on a channel."""
|
||||||
|
self.chanserv("LIST %s", channel)
|
||||||
|
|
||||||
|
|
||||||
def _main(configpath):
|
def _main(configpath):
|
||||||
config = ConfigParser.ConfigParser()
|
config = ConfigParser.ConfigParser()
|
||||||
|
@ -321,7 +311,16 @@ def _main(configpath):
|
||||||
config.get('ircbot', 'nicks').split(',')]
|
config.get('ircbot', 'nicks').split(',')]
|
||||||
publishers = [StatusPage(config)]
|
publishers = [StatusPage(config)]
|
||||||
|
|
||||||
bot = StatusBot(channels, nicks, publishers,
|
# Build a dict such as:
|
||||||
|
# {'#channel1': { 'option1': value1, 'option2': value2, …},
|
||||||
|
# '#channel2: … }
|
||||||
|
channels_config = dict((c,
|
||||||
|
dict([(opt, config.get(c, opt))
|
||||||
|
for opt in config.options(c)]))
|
||||||
|
for c in channels)
|
||||||
|
|
||||||
|
bot = StatusBot(channels_config,
|
||||||
|
nicks, publishers,
|
||||||
config.get('ircbot', 'nick'),
|
config.get('ircbot', 'nick'),
|
||||||
config.get('ircbot', 'pass'),
|
config.get('ircbot', 'pass'),
|
||||||
config.get('ircbot', 'server'),
|
config.get('ircbot', 'server'),
|
||||||
|
|
Loading…
Reference in New Issue