From 470a1294795a375d82e607b56bb84b81b855696d Mon Sep 17 00:00:00 2001 From: Matthew Vernon Date: Tue, 25 May 2010 15:43:28 +0100 Subject: [PATCH] url-handling patch from Tom Womack --- Servus-chiark.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/Servus-chiark.py b/Servus-chiark.py index 8e308ba..30bd483 100644 --- a/Servus-chiark.py +++ b/Servus-chiark.py @@ -140,6 +140,80 @@ 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): + print "debug: ",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:]) + print "##",url,"##" + + 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()]] + print [bot, cmd, nick, conn] + +def dourl(bot,conn,nick,command): + urlstring=urlre.search(command).group(1) + print "dourl: ",urlstring + urlstring=canonical_url(urlstring) + + if urlstring in urldb: + T=urldb[urlstring] + print T + 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 +232,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 +259,11 @@ def command(bot, cmd, nick, conn, public): command = cmd.split()[0] except IndexError: command="" + + if public: + if cmd.find("http") != -1: + dourl(bot,conn,nick,cmd) + # karma: up if command.endswith("++"): karma(cmd,1) -- 2.30.2