"""
-BOT_VERSION = "TwitterBot 1.4 (http://mike.verdone.ca/twitter)"
+from __future__ import print_function
+
+BOT_VERSION = "TwitterBot 1.6.1 (http://mike.verdone.ca/twitter)"
CONSUMER_KEY = "XryIxN3J2ACaJs50EizfLQ"
CONSUMER_SECRET = "j7IuDCNjftVY8DBauRdqXs4jDl5Fgk1IJRag8iE"
import time
from datetime import datetime, timedelta
from email.utils import parsedate
-from configparser import ConfigParser
+try:
+ from configparser import ConfigParser
+except ImportError:
+ from ConfigParser import ConfigParser
from heapq import heappop, heappush
import traceback
import os
try:
import irclib
-except:
+except ImportError:
raise ImportError(
"This module requires python irclib available from "
+ "https://github.com/sixohsix/python-irclib/zipball/python-irclib3-0.4.8")
def debug(msg):
# uncomment this for debug text stuff
- # print >> sys.stderr, msg
+ # print(msg, file=sys.stdout)
pass
class SchedTask(object):
self.irc = irclib.IRC()
self.irc.add_global_handler('privmsg', self.handle_privmsg)
self.irc.add_global_handler('ctcp', self.handle_ctcp)
+ self.irc.add_global_handler('umode', self.handle_umode)
self.ircServer = self.irc.server()
self.sched = Scheduler(
if (crt > nextLastUpdate):
text = (htmlentitydecode(
update['text'].replace('\n', ' '))
- .encode('utf-8', 'replace'))
+ .encode('utf8', 'replace'))
# Skip updates beginning with @
# TODO This would be better if we only ignored messages
# to people who are not on our following list.
if not text.startswith(b"@"):
- self.privmsg_channels(
- "%s %s%s%s %s" %(
- get_prefix(),
- IRC_BOLD, update['user']['screen_name'],
- IRC_BOLD, text.decode('utf-8')))
+ msg = "%s %s%s%s %s" %(
+ get_prefix(),
+ IRC_BOLD, update['user']['screen_name'],
+ IRC_BOLD, text.decode('utf8'))
+ self.privmsg_channels(msg)
nextLastUpdate = crt
elif args[0] == 'CLIENTINFO':
conn.ctcp_reply(source, "CLIENTINFO PING VERSION CLIENTINFO")
- def privmsg_channel(self, msg):
- return self.ircServer.privmsg(
- self.config.get('irc', 'channel'), msg)
+ def handle_umode(self, conn, evt):
+ """
+ QuakeNet ignores all your commands until after the MOTD. This
+ handler defers joining until after it sees a magic line. It
+ also tries to join right after connect, but this will just
+ make it join again which should be safe.
+ """
+ args = evt.arguments()
+ if (args and args[0] == '+i'):
+ channels = self.config.get('irc', 'channel').split(',')
+ for channel in channels:
+ self.ircServer.join(channel)
def privmsg_channels(self, msg):
return_response=True
channels=self.config.get('irc','channel').split(',')
- return self.ircServer.privmsg_many(channels, msg)
+ return self.ircServer.privmsg_many(channels, msg.encode('utf8'))
def follow(self, conn, evt, name):
userNick = evt.source().split('!')[0]
"%s%s has asked me to stop following %s" %(
get_prefix('inform'), userNick, name))
- def run(self):
+ def _irc_connect(self):
self.ircServer.connect(
self.config.get('irc', 'server'),
self.config.getint('irc', 'port'),
for channel in channels:
self.ircServer.join(channel)
+ def run(self):
+ self._irc_connect()
+
while True:
try:
self.sched.run_forever()
# twitter.com is probably down because it
# sucks. ignore the fault and keep going
pass
+ except irclib.ServerNotConnectedError:
+ # Try and reconnect to IRC.
+ self._irc_connect()
+
def load_config(filename):
# Note: Python ConfigParser module has the worst interface in the