X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~matthewv/git?p=irc.git;a=blobdiff_plain;f=acrobat-chiark-0.2.py;h=640694042f32906a42fe38300d0b328bd90174f4;hp=e258636eed6cfce43ea4b630fd134a62f1a9acf4;hb=f5419e82751d4ca788303e9619910001d01c7f0f;hpb=dc37a4e7bdd252c75bea028c5d9281abbf8d638c diff --git a/acrobat-chiark-0.2.py b/acrobat-chiark-0.2.py index e258636..6406940 100755 --- a/acrobat-chiark-0.2.py +++ b/acrobat-chiark-0.2.py @@ -33,7 +33,7 @@ back with the url. """ -import string, urllib, sys, cPickle, os, random, re +import string, urllib, sys, cPickle, os, random, re, time from ircbot import SingleServerIRCBot from irclib import nm_to_n, irc_lower @@ -49,10 +49,14 @@ class Acrobat(SingleServerIRCBot): [(server, port)], nickname, nickname) self.channel = channel self.owner = owner - # version control magic - acrorevision="$Revision$" - acrorev1=re.sub(Revision$\([^$]*\)$,\1,acrorevision) - acrorev2=re.sub($\(.*\),\1,acrorev1) + self.quotatime = time.time() + #Configurable stuff - how often do we add how many fish? + self.cur_fish=5 + self.max_fish=5 #Maximum of 5 fish + self.fish_time_inc=60 #Add fish with 20s granularity + self.fish_inc=2 #Rate of increase is 2 fish per 60s + self.DoS=0 #Have we been told to shut up? + self.Boring_Git='Nobody' #Who told us to shut up? # load the karma db try: f = open("karmadump", "r") @@ -82,15 +86,15 @@ class Acrobat(SingleServerIRCBot): and (irc_lower(a[0]) == irc_lower(self.connection.get_nickname()) or irc_lower(a[0])[:-1] == irc_lower(self.connection.get_nickname())): - self.do_command(self.channel, string.strip(a[1]), public = 1) + self.do_command(nm_to_n(evt.source()), string.strip(a[1]), public = 1) if a[0].endswith("++"): self.karmaup(a[0]) if a[0].endswith("--"): self.karmadown(a[0]) if payload[0] == "!" and len(payload)>1: - self.do_command(self.channel, string.strip(payload[1:]), public=1) + self.do_command(nm_to_n(evt.source()), string.strip(payload[1:]), public=1) if payload[0] == "~" and len(payload)>1: - self.do_command(self.channel, string.strip(payload[1:]), public=1) + self.do_command(nm_to_n(evt.source()), string.strip(payload[1:]), public=1) # And now bot commands; @@ -138,21 +142,34 @@ class Acrobat(SingleServerIRCBot): len(self.karma.dict.keys())) # query bot status def infoq(self, cmd, nick, conn, public): + # version control magic + acrorevision="$Revision$" + acrorev1=re.sub(r'\$Revision: (.*)',r'\1',acrorevision) + acroversion=re.sub(r'(.*) \$',r'\1',acrorev1) if public == 1: conn.privmsg(self.channel, - "I am Acrobat 0.2.1chiark, on %s, as nick %s." % - (self.channel, self.connection.get_nickname())) + "I am Acrobat %s, on %s, as nick %s." % + (acroversion, self.channel, self.connection.get_nickname())) conn.privmsg(self.channel, "My owner is %s; I have karma on %s items." % (self.owner, len(self.karma.dict.keys()))) else: - conn.notice(nick, "I am Acrobat 0.2.1chiark, on %s, as nick %s." % - (self.channel, self.connection.get_nickname())) + conn.notice(nick, "I am Acrobat %s, on %s, as nick %s." % + (acroversion, self.channel, self.connection.get_nickname())) conn.notice(nick, "My owner is %s; I have karma on %s items." % (self.owner, len(self.karma.dict.keys()))) # trout someone def troutq(self, cmd, nick, conn, public): + self.fish_quota() + if self.DoS == 1: + conn.notice(nick, "Sorry, but %s is being a spoilsport." % + self.Boring_Git) + return + if self.cur_fish == 0: + conn.notice(nick, "Fish stocks exhausted.") + else: + self.cur_fish -=1 try: target = string.join(cmd.split()[1:]) me = self.connection.get_nickname() @@ -163,10 +180,10 @@ class Acrobat(SingleServerIRCBot): # ...and touchy. if me.lower() == target.lower(): target = nick - conn.action(self.channel, trout_msg % target) if public == 0: - if random.random() <= 0.1: - conn.action(self.channel, "notes %s is conducting a whispering campaign" % nick) + if random.random() <= 0.25: + trout_msg+= ' (at the instigation of %s)' % nick + conn.action(self.channel, trout_msg % target) except IndexError: conn.notice(nick, "Who do you wish me to trout?") @@ -184,6 +201,27 @@ class Acrobat(SingleServerIRCBot): self.trouts = tback else: conn.notice(nick, "This command can only be invoked by my owner.") + # Shut up trouting for a minute + def nofish(self, cmd, nick, conn, public): + self.cur_fish=0 + self.DoS=1 + self.Boring_Git=nick + self.quotatime=time.time() + self.quotatime+=60 #60 seconds of no fishing + conn.notice(nick, "Fish stocks depleted, as you wish.") + # Check on fish stocks + def fish_quota(self): + if self.DoS==1: + if time.time()>=self.quotatime: + self.DoS=0 + else: + return + if self.DoS==0: + if (time.time()-self.quotatime)>self.fish_time_inc: + self.cur_fish+=(((time.time()-self.quotatime)/self.fish_time_inc)*self.fish_inc) + if self.cur_fish>self.max_fish: + self.cur_fish=self.max_fish + self.quotatime=time.time() # quit irc def quit(self, cmd, nick, conn, public): @@ -210,17 +248,17 @@ class Acrobat(SingleServerIRCBot): if public == 0: conn.notice(nick, str(gsearch)) else: # we haven't found anything. - conn.privmsg(nick, str(gsearch)) + conn.privmsg(self.channel, str(gsearch)) else: if public == 0: conn.notice(nick, "No pages found.") else: - conn.privmsg(nick, "No pages found.") + conn.privmsg(self.channel, "No pages found.") except IOError: # if the connection times out. This blocks. :( if public == 0: conn,notice(nick, "The web's broken. Waah!") else: - conn.privmsg(nick, "The web's broken. Waah!") + conn.privmsg(self.channel, "The web's broken. Waah!") # General query handler def do_command(self, nick, cmd, public=0): @@ -246,11 +284,16 @@ class Acrobat(SingleServerIRCBot): self.troutq(cmd, nick, conn, public) if cmd == "reload": self.reloadq(cmd, nick, conn, public) - - #disconnect - if cmd == "disconnect": # hop off for 60s - self.disconnect(msg="Be right back.") +#Disconnect disabled 'cos people hated it +# #disconnect +# if cmd == "disconnect": # hop off for 60s +# self.disconnect(msg="Be right back.") + + # No more trout + if cmd.split()[0] == "quiet": + self.nofish(cmd,nick,conn, public) + # say to msg/channel elif cmd.split()[0] == "say" \ and irc_lower(nick) == irc_lower(self.owner):