def measure(self, name): """ measure lag of <botname> """ bot = fleet.byname(name) if not bot: return if bot.connectok.isSet() and bot.connectok: bot.sendraw('PING :LAG %f' % time.time())
def doscan(self, scanlist): for botname, channel, name, node in scanlist: try: result = geturl('http://%s/7.html' % node) except Exception, ex: rlog(10, 'shoutcast', "can't get %s shoutcast data: %s" % \ (node, str(ex))) continue try: res = result.split(',')[6] except IndexError: rlog(10, 'shoutcast', "can't match %s shoutcast data" % node) continue song = striphtml(res).strip().replace('\n', '') bot = fleet.byname(botname) if bot and channel in bot.state['joinedchannels']: got = False for ttime, played in self.songsplayed: if played == song: got = True if not got: self.songsplayed.append((time.time(), song)) bot.say(channel, "now playing on %s: %s" % (name, song)) else: for ttime, played in self.songsplayed: if time.time() - ttime > 1800: self.songsplayed.remove((ttime, played))
def handle_fleetaddjabber(bot, ievent): """ fleed-addjabber <name> <host> <user> <password> [port] .. add jabber bot to fleet. """ try: import xmpp except ImportError: ievent.reply('xmpp is not enabled .. install the xmpppy package') return from gozerbot.jabber.jabberbot import Jabberbot if not bot.type == 'jabber': ievent.reply('use this command on a jabber bot (and change \ password if you used it)') return if ievent.groupchat: ievent.reply('use this command in a private message (and change \ password if you used it)') return length = len(ievent.args) if length == 5: (name, host, user, password, port) = ievent.args elif length == 4: (name, host, user, password) = ievent.args port = 5222 else: ievent.missing('<name> <host> <user> <password> [<port>]') return if fleet.byname(name): ievent.reply('we already have a bot with %s name in fleet' % \ name) return if '--port' in ievent.optionset: port = ievent.options['--port'] cfg = Config(datadir + os.sep + 'fleet' + os.sep + name, 'config') cfg['name'] = name cfg['type'] = 'jabber' cfg['host'] = host cfg['user'] = user cfg['password'] = password cfg['port'] = port cfg.save() b = fleet.makebot(name, cfg) try: ievent.reply('added %s bot' % name) fleet.addbot(b) ievent.reply('connecting to %s' % server) fleet.connect(name) ievent.reply('%s started' % name) except Exception, ex: ievent.reply(str(ex)) fleet.delete(b)
def fleet_enable(bot, ievent): """ enable a fleet bot. """ if not ievent.rest: ievent.missing("list of fleet bots") return bots = ievent.rest.split() for name in bots: bot = fleet.byname(name) if bot: bot.cfg['enable'] = 1 bot.cfg.save() ievent.reply('enabled %s' % name) start_new_thread(fleet.connect, (name, )) elif name in fleet.avail(): bots = fleet.start([ name, ], enable=True) for bot in bots: ievent.reply('enabled and started %s bot' % name) start_new_thread(fleet.connect, (name, )) else: ievent.reply('no %s bot in fleet' % name)
def fleet_enable(bot, ievent): """ enable a fleet bot. """ if not ievent.rest: ievent.missing("list of fleet bots") return bots = ievent.rest.split() for name in bots: bot = fleet.byname(name) if bot: bot.cfg['enable'] = 1 bot.cfg.save() ievent.reply('enabled %s' % name) start_new_thread(fleet.connect, (name, )) elif name in fleet.avail(): bots = fleet.start([name, ], enable=True) for bot in bots: ievent.reply('enabled and started %s bot' % name) start_new_thread(fleet.connect, (name, )) else: ievent.reply('no %s bot in fleet' % name)
def peek(self, name, *args): rssitem = self.byname(name) if not rssitem or not rssitem.running or rssitem.stoprunning: return try: try: res = self.getdata(name) except socket.timeout: rlog(10, 'rss', 'socket timeout of %s' % name) return except RssException, ex: rlog(10, 'rss', '%s error: %s' % (name, str(ex))) return if not res: return res2 = [] for j in res: try: d = j['updated'] except KeyError: if j not in self.results[name]: self.results[name].append(j) res2.append(j) else: if not checkfordate(self.results[name], d): self.results[name].append(j) res2.append(j) if not res2: return for item in rssitem.watchchannels: try: (botname, channel) = item except: try: (botname, channel) = loads(item) except: rlog(10, 'rss', '%s is not in the format \ (botname,channel)' % str(item)) bot = fleet.byname(botname) if not bot: continue if self.markup.get(jsonstring([name, channel]), 'reverse-order'): res2 = res2[::-1] if self.markup.get(jsonstring([name, channel]), 'all-lines'): for i in res2: response = self.makeresponse(name, [i, ], channel) bot.say(channel, "\002%s\002: %s" % \ (rssitem.name, response), fromm=rssitem.name) else: sep = self.markup.get(jsonstring([name, channel]), 'separator') if sep: response = self.makeresponse(name, res2, channel, \ sep=sep) else: response = self.makeresponse(name, res2, channel) bot.say(channel, "\002%s\002: %s" % (rssitem.name, \ response), fromm=rssitem.name)
def alarmsay(self, item): """ say alarm txt """ bot = fleet.byname(item.botname) if bot: if item.printto: bot.say(item.printto, "[%s] %s" % (item.nick, item.txt), \ speed=1) else: bot.say(item.nick, item.txt, speed=1) self.delete(item.idnr)
def dosay(self, printto, txt): if cfg['udpparty'] and partyline.is_on(printto): partyline.say_nick(printto, txt) return bot = fleet.byname(cfg['udpbot']) if not bot.jabber and not cfg['nolimiter']: time.sleep(3) bot.say(printto, txt) for i in self.loggers: i.log(printto, txt)
def peek(self, name, *args): rssitem = self.byname(name) if not rssitem or not rssitem.running or rssitem.stoprunning: return try: try: res = self.getdata(name) except socket.timeout: rlog(10, 'rss', 'socket timeout of %s' % name) return except RssException, ex: rlog(10, 'rss', '%s error: %s' % (name, str(ex))) return if not res: return res2 = [] for j in res: try: d = j['date'] except KeyError: if j not in self.results[name]: self.results[name].append(j) res2.append(j) else: if not checkfordate(self.results[name], d): self.results[name].append(j) res2.append(j) if not res2: return for item in rssitem.watchchannels: try: (botname, channel) = item except: rlog( 10, 'rss', '%s is not in the format \ (botname,channel)' % str(item)) bot = fleet.byname(botname) if not bot: continue if self.markup.get((name, channel), 'all-lines'): for i in res2: response = self.makeresponse(name, [ i, ], channel) bot.say(channel, "\002%s\002: %s" % \ (rssitem.name, response), fromm=rssitem.name) else: sep = self.markup.get((name, channel), 'seperator') if sep: response = self.makeresponse(name, res2, channel, \ sep=sep) else: response = self.makeresponse(name, res2, channel) bot.say(channel, "\002%s\002: %s" % (rssitem.name, \ response), fromm=rssitem.name)
def announce(self, status): if not self.running or not cfg.get('watcher-enabled'): return rlog(5, 'mpd', 'announcing song information') status['time'] = mpd_duration(status['time']) song = cfg.get('song-status') % status for name in self.data.keys(): bot = fleet.byname(name) if bot: for channel in self.data[name].keys(): bot.say(channel, song)
def announce(self, status): if not self.running or not cfg.get("watcher-enabled"): return rlog(5, "mpd", "announcing song information") status["time"] = mpd_duration(status["time"]) song = cfg.get("song-status") % status for name in self.data.keys(): bot = fleet.byname(name) if bot: for channel in self.data[name].keys(): bot.say(channel, song)
def peek(self, name, *args): rssitem = self.byname(name) if not rssitem or not rssitem.running or rssitem.stoprunning: return try: try: res = self.getdata(name) except socket.timeout: rlog(10, "rss", "socket timeout of %s" % name) return except RssException, ex: rlog(10, "rss", "%s error: %s" % (name, str(ex))) return if not res: return res2 = [] for j in res: try: d = j["date"] except KeyError: if j not in self.results[name]: self.results[name].append(j) res2.append(j) else: if not checkfordate(self.results[name], d): self.results[name].append(j) res2.append(j) if not res2: return for item in rssitem.watchchannels: try: (botname, channel) = item except: rlog( 10, "rss", "%s is not in the format \ (botname,channel)" % str(item), ) bot = fleet.byname(botname) if not bot: continue if self.markup.get((name, channel), "all-lines"): for i in res2: response = self.makeresponse(name, [i], channel) bot.say(channel, "\002%s\002: %s" % (rssitem.name, response), fromm=rssitem.name) else: sep = self.markup.get((name, channel), "seperator") if sep: response = self.makeresponse(name, res2, channel, sep=sep) else: response = self.makeresponse(name, res2, channel) bot.say(channel, "\002%s\002: %s" % (rssitem.name, response), fromm=rssitem.name)
def check(self, botname, channel, txt, fromm=None): """ check if we relay on (botname, channel) .. if so do output """ channel = channel.lower() indexstring = jsonstring((botname, channel)) if self.data.has_key(indexstring): for i in self.data[indexstring]: if i != indexstring: bot = fleet.byname(i[0]) if bot: if txt.count('[%s]' % bot.nick) > 0: return if not bot.stopped: time.sleep(1) bot.outputnolog(i[1], txt, 'msg', fromm=fromm)
def fleet_disable(bot, ievent): """ disable a fleet bot. """ if not ievent.rest: ievent.missing("list of fleet bots") return bots = ievent.rest.split() for name in bots: bot = fleet.byname(name) if bot: bot.cfg['enable'] = 0 bot.cfg.save() ievent.reply('disabled %s' % name) fleet.exit(name) else: ievent.reply("can't find %s bot in fleet" % name)
def _listen(self): """ listen for udp messages .. /msg via bot""" if not cfg['udp']: return try: fleet.startok.wait() bot = fleet.byname(cfg['udpbot'] or 'default') if not bot: rlog(10, 'udp', "can't find %s bot .. not starting" % cfg['udpbot']) return self.sock.bind((cfg['udphost'], cfg['udpport'])) rlog(10, 'udp', 'udp listening on %s %s' % (cfg['udphost'], \ cfg['udpport'])) self.stop = 0 except IOError: handle_exception() self.sock = None self.stop = 1 return # loop on listening udp socket bot.connectok.wait() while not self.stop: try: input, addr = self.sock.recvfrom(64000) except socket.timeout: continue except Exception, ex: try: (errno, errstr) = ex except ValueError: errno = 0 errstr = str(ex) if errno == 4: rlog(10, self.name, str(ex)) break if errno == 35: continue else: handle_exception() break if self.stop: break self.queue.put((input, addr))
def handle_nsdel(bot, ievent): """ remove a bot from nickserv. """ if bot.jabber: return if len(ievent.args) != 1: ievent.missing('<fleetbot name>') return fbot = fleet.byname(ievent.args[0]) if not fbot: ievent.reply('fleet not found') return if not nsauth.has(fbot): ievent.reply('nickserv not configured on %s' % fbot.name) return nsauth.remove(fbot) ievent.reply('ok')
def handle_nsauth(bot, ievent): """ perform an auth request. """ if bot.jabber: return if len(ievent.args) != 1: name = bot.name else: name = ievent.args[0] fbot = fleet.byname(name) if not fbot: ievent.reply('fleet not found') return if not nsauth.has(fbot): ievent.reply('nickserv not configured on %s' % fbot.name) return nsauth.identify(fbot) ievent.reply('ok')
def _listen(self): """ listen for tcp messages .. /msg via bot""" if not cfg['tcp']: return try: fleet.startok.wait() bot = fleet.byname(cfg['tcpbot'] or 'default') if not bot: rlog(10, 'tcp', "can't find main bot .. not starting") return # get listen socket on host were running on self.sock.bind((cfg['tcphost'], cfg['tcpport'])) self.sock.listen(1) rlog(10, 'tcp', 'tcp listening on %s %s' % (cfg['tcphost'], \ cfg['tcpport'])) self.stop = 0 except IOError: handle_exception() self.sock = None self.stop = 1 return # loop on listening tcp socket bot.connectok.wait() while not self.stop: try: (sock, addr) = self.sock.accept() rlog(10, 'tcp', 'connection from %s' % str(addr)) except socket.timeout: continue except Exception, ex: if 'Invalid argument' in str(ex): continue handle_exception() break if cfg['tcp'] and (addr[0] in cfg['tcpallow'] or \ _inmask(addr[0])): start_new_thread(self.handlesocket, (sock, addr))
def announce(self, url): for name in self.data['send'][url]: bot = fleet.byname(name) for chan in self.data['send'][url][name]: bot.say(chan, '%s changed (new checksum: %s)' % (url, \ self.data['urls'][url]))
except AlreadyConnecting: return 0 except AlreadyConnected: return 0 except Exception, ex: self.connectlock.release() if self.stopped: return 0 rlog(10, self.name, 'connecting error: %s' % str(ex)) if reconnect: self.reconnect() return raise # add bot to the fleet if not fleet.byname(self.name): fleet.addbot(self) self.connectlock.release() return res def shutdown(self): """ shutdown the bot. """ rlog(10, self.name, 'shutdown') self.stopoutputloop = 1 self.stopped = 1 time.sleep(1) self.tickqueue.put_nowait('go') self.close() self.connecting = False
def handle_fleetaddirc(bot, ievent): """ fleed-addirc <name> <nick> <server> [port] [passwd] [ipv6] .. add irc \ bot to fleet. """ from gozerbot.irc.bot import Bot length = len(ievent.args) if length == 7: (name, nick, server, ipv6, ssl, port, password) = ievent.args elif length == 6: (name, nick, server, ipv6, ssl, port) = ievent.args password = "" elif length == 5: (name, nick, server, ipv6, ssl) = ievent.args password = "" if ssl: port = 6697 else: port = 6667 elif length == 4: (name, nick, server, ipv6) = ievent.args password = "" ssl = 0 port = 6667 elif length == 3: (name, nick, server) = ievent.args port = 6667 password = "" ssl = 0 ipv6 = 0 else: ievent.missing('<name> <nick> <server> [<ipv6>] [<ssl>] [<port>] \ [<password>]') return if fleet.byname(name): ievent.reply('we already have a bot with %s name in fleet' % \ name) return if '--port' in ievent.optionset: port = ievent.options['--port'] cfg = Config(datadir + os.sep + 'fleet' + os.sep + name, 'config', \ fleetbotconfigtxt) cfg['name'] = name cfg['nick'] = nick cfg['server'] = server cfg['port'] = port cfg['password'] = password cfg['ipv6'] = ipv6 cfg['ssl'] = ssl cfg.save() b = fleet.makebot(name, cfg) try: ievent.reply('adding bot: %s' % str(b)) fleet.addbot(b) ievent.reply('connecting to %s' % server) fleet.connect(name) ievent.reply('%s started' % name) except Exception, ex: ievent.reply(str(ex)) fleet.delete(b)
except AlreadyConnecting: return 0 except AlreadyConnected: return 0 except Exception, ex: self.connectlock.release() if self.stopped: return 0 rlog(10, self.name, 'connecting error: %s' % str(ex)) if reconnect: self.reconnect() return raise # add bot to the fleet if not fleet.byname(self.name): fleet.addbot(self) self.connectlock.release() return res def shutdown(self): """ shutdown the bot. """ rlog(10, self.name, 'shutdown') self.stopoutputloop = 1 self.stopped = 1 time.sleep(1) self.tickqueue.put_nowait('go') self.close() self.connecting = False self.connected = False