#!/usr/bin/env python """ antiabuse.py - Phenny AntiAbuse Module Copyright 2012, sfan5 Licensed under GNU General Public License v2.0 """ import time, sqlite3 DBPATH = "data/antiabuse.sqlite" antiabuse = {} antiabuse["ignorelist"] = [] antiabuse["cooldown_l"] = {} antiabuse["cooldown"] = 3 # seconds def api_ignore(mask): antiabuse["ignorelist"].append(mask) db = sqlite3.connect(DBPATH) c = db.cursor() c.execute("INSERT INTO ignore (nick) VALUES (?)", (mask,)) c.close() db.commit() db.close() def api_unignore(mask): if not mask in antiabuse["ignorelist"]: return False antiabuse['ignorelist'].remove(mask) db = sqlite3.connect(DBPATH) c = db.cursor() c.execute("DELETE FROM ignore WHERE nick = ?", (mask,)) c.close() db.commit() db.close() return True def api_get_ignorelist(): return antiabuse["ignorelist"] class SomeObject(object): pass antiabuse_api = SomeObject() antiabuse_api.ignore = api_ignore antiabuse_api.unignore = api_unignore antiabuse_api.get_ignorelist = api_get_ignorelist _export = { 'antiabuse': antiabuse_api, } def aa_hook(phenny, input, func): if input.admin or input.owner: return True # Ignore list for entry in antiabuse["ignorelist"]: if phenny.match_hostmask(entry, input.hostmask): return False # abort command # Cooldown if input.nick in antiabuse["cooldown_l"]: ot = antiabuse["cooldown_l"][input.nick] else: ot = 0 antiabuse["cooldown_l"][input.nick] = time.time() if antiabuse["cooldown_l"][input.nick] - antiabuse["cooldown"] < ot: return False # abort command pass return True aa_hook.hook = True def hmasktrans(va): a = "!" in va b = "@" in va if not a and not b: return va + "!*@*" elif a and not b: return va + "@*" elif not a and b: return "*!" + va else: # a and b return va def ignore(phenny, input): if not input.admin: return arg = hmasktrans(input.group(2).strip()) api_ignore(arg) phenny.reply("'%s' added to ignore list." % arg) ignore.commands = ['ignore'] ignore.priority = 'high' def unignore(phenny, input): if not input.admin: return arg = hmasktrans(input.group(2).strip()) r = api_unignore(arg) if r: phenny.reply("'%s' removed from ignore list." % arg) else: phenny.reply("'%s' not in ignore list." % arg) unignore.commands = ['unignore'] unignore.priority = 'high' def limjoin(ent, j, lim): o = [] i = 0 while True: if i == len(ent): break s = "" while True: if i == len(ent) or len(s) + len(ent[i]) > lim: break s += ent[i] i += 1 s += j o.append(s) if len(o) > 0: for i in range(len(o)): o[i] = o[i][:-len(j)] # Cut off the delimiter return o def listignore(phenny, input): if not input.admin: return if len(antiabuse['ignorelist']) == 0: return phenny.reply("Ignore list empty.") l = limjoin(antiabuse['ignorelist'], ', ', 400) for s in l: phenny.reply(s) listignore.commands = ['listignore'] listignore.priority = 'high' db = sqlite3.connect(DBPATH) c = db.cursor() c.execute('''CREATE TABLE IF NOT EXISTS ignore (nick text)''') c.execute("SELECT * FROM ignore") while True: e = c.fetchone() if not e: break antiabuse["ignorelist"].append(e[0]) c.close() db.commit() db.close()