X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~matthewv/git?a=blobdiff_plain;ds=sidebyside;f=Servus-chiark.py;h=3fb7adca28261009ead17e3e5d1c05155f72f7a8;hb=a379f77c0099738fdd7c8e55c22d9c63a6954bb5;hp=a0ba8a5189a0d2060f4b6d635293f91c6309e8c5;hpb=bce7d2086371d534cc8cb19ae0adfc22f85d39d9;p=irc.git diff --git a/Servus-chiark.py b/Servus-chiark.py index a0ba8a5..3fb7adc 100644 --- a/Servus-chiark.py +++ b/Servus-chiark.py @@ -33,7 +33,7 @@ owner = "Emperor" # Everything else in this file is configuration-specific. -import os, time +import os, time, re # Most command implementations are stored in a separate module. import commands as c @@ -140,6 +140,75 @@ class game: maxlose=14*minlose #2 weeks losetime=time.time()+300000 +def canonical_url(urlstring): +# canonicalise BBC URLs + if (urlstring.find("news.bbc.co.uk") != -1): + for middle in ("/low/","/mobile/"): + x = urlstring.find(middle) + if (x != -1): + urlstring.replace(middle,"/hi/") + return urlstring + +def nicetime(tempus): + if (tempus<120): + tm="%d seconds ago"%int(tempus) + elif (tempus<7200): + tm="%d minutes ago"%int(tempus/60) + if (tempus>7200): + tm="%d hours ago"%int(tempus/3600) + return tm + +urldb = {} +urlre = re.compile("(https?://[^ ]+)( |$)") +urlcomplaints = [" contemporary","n interesting"," fascinating","n overused"," vastly overused"] + +def urlq(bot, cmd, nick, conn, public): + if (not urlre.search(cmd)): + bot.automsg(False,nick,"Please use 'url' only with http URLs") + return + + url="".join(cmd.split(" ")[1:]) + + url=canonical_url(url) + if (url in urldb): + users = urldb[url] + complaint="The url %s was mentioned %s by %s"%(url,nicetime(time.time()-users[-1][1]),users[-1][0]) + if (public): + complaint=complaint+". Furthermore it defeats the point of this command to use it other than via /msg." + bot.automsg(False,nick,complaint) + else: + if (public): + bot.automsg(False,nick,"That URL was unique. There is little point in using !url out loud; please use it via /msg") + else: + conn.privmsg(bot.channel,"%s would like to draw your attention to %s"%(nick,url)) + urldb[url]=[[nick,time.time()]] + +def dourl(bot,conn,nick,command): + urlstring=urlre.search(command).group(1) + urlstring=canonical_url(urlstring) + + if urlstring in urldb: + T=urldb[urlstring] + uci = len(T) + if uci >= len(urlcomplaints): + uci = len(urlcomplaints) + message="observes a"+urlcomplaints[uci-1]+" URL: mentioned by " + if (len(T)>5): + cutoff=len(T)-5 + else: + cutoff=-1 + for t in range(len(T)-1,cutoff,-1): + tempus = time.time()-T[t][1] + message += T[t][0]+" ("+nicetime(tempus)+")" + if (t!=cutoff+1): + message += ", " + if (cutoff != -1): + message += ", amongst others" + conn.action(bot.channel, message) + urldb[urlstring]=[[nick,time.time()]]+urldb[urlstring] + else: + urldb[urlstring]=[[nick,time.time()]] + # 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 @@ -158,10 +227,11 @@ commands = {"karma": (c.karmaq,karmadb), "reload": reload, "quit": quit, "die": quit, + "define": c.defineq, "google": c.googleq, + "url": urlq, "units": c.unitq, "help": c.helpq, -# "define": c.defineq, # "game": (c.gameq,game), "say": c.sayq, "do": c.doq } @@ -184,6 +254,11 @@ def command(bot, cmd, nick, conn, public): command = cmd.split()[0] except IndexError: command="" + + if public: + if urlre.search(cmd): + dourl(bot,conn,nick,cmd) + # karma: up if command.endswith("++"): karma(cmd,1)