You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.2 KiB
153 lines
3.2 KiB
#!/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()
|
|
|