h/plugins/urlhistory.py

77 lines
2.2 KiB
Python
Raw Normal View History

import math
import re
import time
from util import hook, urlnorm, timesince
url_re = r'([a-zA-Z]+://|www\.)[^ ]+'
2010-03-01 02:32:41 +00:00
expiration_period = 60 * 60 * 24 # 1 day
ignored_urls = [urlnorm.normalize("http://google.com")]
2010-03-01 02:32:41 +00:00
def db_init(db):
2010-02-02 04:42:34 +00:00
db.execute("create table if not exists urlhistory"
"(chan, url, nick, time)")
2010-02-02 04:42:34 +00:00
db.commit()
2010-03-01 02:32:41 +00:00
2010-02-02 04:42:34 +00:00
def insert_history(db, chan, url, nick):
now = time.time()
2010-02-02 04:42:34 +00:00
db.execute("insert into urlhistory(chan, url, nick, time) "
"values(?,?,?,?)", (chan, url, nick, time.time()))
2010-02-02 04:42:34 +00:00
db.commit()
2010-03-01 02:32:41 +00:00
def get_history(db, chan, url):
db.execute("delete from urlhistory where time < ?",
(time.time() - expiration_period,))
return db.execute("select nick, time from urlhistory where "
"chan=? and url=? order by time desc", (chan, url)).fetchall()
def nicklist(nicks):
nicks = sorted(dict(nicks), key=unicode.lower)
if len(nicks) <= 2:
return ' and '.join(nicks)
else:
return ', and '.join((', '.join(nicks[:-1]), nicks[-1]))
2010-03-01 02:32:41 +00:00
def format_reply(history):
if not history:
return
last_nick, recent_time = history[0]
last_time = timesince.timesince(recent_time)
if len(history) == 1:
return "%s linked that %s ago." % (last_nick, last_time)
hour_span = math.ceil((time.time() - history[-1][1]) / 3600)
hour_span = '%.0f hours' % hour_span if hour_span > 1 else 'hour'
hlen = len(history)
ordinal = ["once", "twice", "%d times" % hlen][min(hlen, 3) - 1]
if len(dict(history)) == 1:
last = "last linked %s ago" % last_time
else:
last = "last linked by %s %s ago" % (last_nick, last_time)
2010-03-01 02:32:41 +00:00
return "that url has been posted %s in the past %s by %s (%s)." % (ordinal,
hour_span, nicklist(history), last)
2010-03-01 02:32:41 +00:00
@hook.regex(url_re)
def urlinput(match, nick='', chan='', db=None, bot=None):
db_init(db)
url = urlnorm.normalize(match.group().encode('utf-8'))
if url not in ignored_urls:
url = url.decode('utf-8')
history = get_history(db, chan, url)
insert_history(db, chan, url, nick)
if nick not in dict(history):
return format_reply(history)