# The following definitions are required to be present in this module:
# You can also override them on the command-line
-# e.g. python acrobat.py Servus-chiark nickname=testbot channel=\#test
+# e.g. python acrobat.py Servus-chiark nickname=testbot channel=\#test owner=MyNick
server = "chiark"
port = 6667
nickname = "Servus"
# Everything else in this file is configuration-specific.
-import os, time, re
+import os, time, re, twitter, subprocess, sys, os.path
# Most command implementations are stored in a separate module.
import commands as c
# This fishpond is shared between trouts and flirts. It doesn't have to be;
# you can define as many ponds as you like.
-class fish:
+class Fish (c.FishPond):
cur_fish=5
max_fish=5
nofish_time=60
fish_time_inc=60
fish_inc=2
- DoS=0
Boring_Git='Nobody'
- quotatime=0
+fish = Fish()
+
+# load the "blame" details for a file
+def loadblame(filename):
+ p=subprocess.Popen(["git","blame","-s",filename],
+ stdout=subprocess.PIPE,stderr=subprocess.PIPE)
+ out,err=p.communicate()
+ if len(err)>0:
+ sys.exit("git blame failure: %s" % err)
+ bdb={}
+ lines=out.split("\n")
+ for line in lines:
+ l=line.split()
+ if len(line.strip())>0:
+ commit=l[0]
+ thing=' '.join(l[2:])
+ bdb[thing]=commit
+ keys=bdb.keys()
+ return bdb,keys,filename
+
# load a file full of flirts or trouts
def __load(filename):
try:
"Who do you wish me to trout?",
"Fish stocks exhausted.",
fish,
- 0.1)
+ 0.1,
+ loadblame("trouts"),
+ )
flirtcfg = (
__load("flirts"),
"Who do you wish me to flirt with?",
"My libido is over-used!",
fish,
- 0.1)
+ 0.1,
+ loadblame("flirts"),
+ )
slashcfg= (
__load("slashes"),
"Who do you want to slash?",
"I have writer's block!",
fish,
- 0.1)
+ 0.1,
+ loadblame("slashes")
+ )
# Hacky command to output the current fishpond state
def fishq(bot, cmd, nick, conn, public,f):
# Karma implementation
import cPickle
-karmafilename = "chiark-karma"
+karmafilename = "chiark-karma-"+channel
# load the karma db
try:
f = open(karmafilename, "r")
def reload(bot,cmd,nick,conn,public):
c.reloadq(bot,cmd,nick,conn,public)
-#The game...
-class game:
- trigger="Servus"
- grace=time.time()
- minlose=24*60*60 #1 day
- maxlose=14*minlose #2 weeks
- losetime=time.time()+300000
-
# initialise the urldb on startup
urldb={}
lastexp=time.time()
#do an expiry run every hour
expirevery=60*60
+
+#path where Oauth details are kept
+twioauthpath=os.path.expanduser("~/private/servus_twapi_oauth.txt")
+
+try:
+ f=open(twioauthpath,"r")
+ for line in f:
+ if line[0]=='#':
+ continue
+ key,val=map(str.strip,line.split(':'))
+ if key == "consumer_key":
+ twoaapck = val
+ elif key == "consumer_secret":
+ twoaapcs = val
+ elif key == "access_token":
+ twoapat = val
+ elif key == "access_token_secret":
+ twoapats = val
+ else:
+ raise ValueError, "Invalid line in twitter auth details file %s" % line
+ f.close()
+ twitapi = twitter.Api(consumer_key = twoaapck,
+ consumer_secret = twoaapcs,
+ access_token_key = twoapat,
+ access_token_secret = twoapats,
+ tweet_mode = "extended")
+except IOError:
+# non-authenticated twitter api instance
+ twitapi = twitter.Api()
+
# Command processing: whenever something is said that the bot can hear,
# "command" is invoked and must decide what to do. This configuration
# defines a couple of special cases (for karma) but is otherwise driven
"define": c.defineq,
"google": c.googleq,
"url": (c.urlq,urldb),
+ "nsfw": (c.nsfwq,urldb),
+ "nws": (c.nsfwq,urldb),
"units": c.unitq,
+ "currency":c.currencyq,
+ "blame": (c.blameq,fish, [troutcfg,flirtcfg,slashcfg]),
"help": c.helpq,
-# "game": (c.gameq,game),
"say": c.sayq,
- "do": c.doq }
+ "do": c.doq,
+ "twit": (c.twitterq,twitapi) }
# disconnect and hop annoy people
# "disconnect": c.disconnq,
# "hop": c.disconnq }
# eg !trout, ~trout etc.
def command(bot, cmd, nick, conn, public):
- global urldb,lastexp,expirelen,expirevery
+ global urldb,lastexp,expirelen,expirevery,twitapi
ours=0
try:
if public and cmd[0] in triggers:
e(bot,cmd,nick,conn,public)
else:
e[0](bot,cmd,nick,conn,public,*e[1:])
-# elif public:
-# if cmd.find("GAME")!=-1: #someone else lost
-# grace.grace=time.time()+60*20
-# elif cmd.find(game.trigger)!=-1 and len(game.trigger)>2: #we lost!
-# c.gameq(bot,"pad "+game.trigger,bot.owner,conn,False,game)
-# elif time.time()>game.losetime: #we randomly lost, take new trigger
-# c.gameq(bot,cmd,bot.owner,conn,False,game)
-#