154 lines
3.2 KiB
Python
Executable File
154 lines
3.2 KiB
Python
Executable File
#!/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()
|