forked from sfan5/minetestbot-modules
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathantiabuse.py
executable file
·153 lines (130 loc) · 3.29 KB
/
antiabuse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/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 or not input.group(2):
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 or not input.group(2):
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()