]> jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/moo/cmd_user.py
Import acidictive 4 and pyva plugin
[irc/rizon/acid.git] / pyva / src / main / python / moo / cmd_user.py
1 from datetime import datetime
2 from decimal import Decimal
3 from operator import attrgetter, itemgetter
4
5 import utils
6 import moo_utils
7 from cmd_manager import CommandManager
8
9 def cmd_activate_vhost(self, manager, channel, sender, arg):
10 if arg:
11 if ' ' in arg:
12 for a in arg.split(' '):
13 self.requests.approve(a, sender)
14 else:
15 self.requests.approve(arg, sender)
16 else:
17 self.msg(self.chan, 'Syntax: @b%sact {@unick@u | @urequest_id@u}@b' % manager.get_prefix())
18
19 def cmd_activate_all(self, manager, channel, sender, arg):
20 for nick, req in self.requests.list.items():
21 self.requests.approve(req['nick'], sender)
22
23 def cmd_except(self, manager, channel, sender, arg):
24 if arg:
25 if ' ' in arg:
26 for r in arg.split(' '):
27 self.requests.reject(r, sender)
28 else:
29 self.requests.reject(arg, sender)
30
31 for nick, req in self.requests.list.items():
32 self.requests.approve(req['nick'], sender)
33 else:
34 self.msg(self.chan, 'Syntax: @b%sexc {@unick@u | @urequest_id@u}@b' % manager.get_prefix())
35
36 def cmd_ban_user(self, manager, channel, sender, arg):
37 reason = None
38 nick = arg
39 if ' ' in arg:
40 sp = arg.split(' ')
41 nick = sp[0]
42 reason = ' '.join(sp[1:])
43
44 if nick:
45 self.requests.ban(nick, sender, reason)
46 else:
47 self.msg(self.chan, 'Syntax: @b%sban @unick@u [@ureason@u]@b' % manager.get_prefix())
48
49 def cmd_unban_user(self, manager, channel, sender, arg):
50 if arg:
51 self.requests.unban(arg)
52 else:
53 self.msg(self.chan, 'Syntax: @b%sunban {@unick@u | @uban_id@u}@b' % manager.get_prefix())
54
55 def cmd_ban_list(self, manager, channel, sender, arg):
56 if self.requests.banlist:
57 if arg:
58 blist = [ban for ban in self.requests.banlist.itervalues() if ban.nick.lower() == arg.lower()]
59 if not blist:
60 self.msg(self.chan, '@b[bans]@b Nick @b%s@b is not banned.' % arg)
61 return
62 else:
63 self.notice(sender, '@b[bans]@b Total %d entries:' % len(self.requests.banlist))
64 blist = self.requests.banlist.values()
65
66 for n, ban in enumerate(sorted(blist, key=attrgetter('date'))):
67 ago = utils.get_timespan(ban.date)
68 self.notice(sender, '@b%(num)d.@b @bNick@b %(nick)s @sep @bBanned by@b %(by)s %(ago)s ago @sep%(reason)s' % {
69 'num' : n + 1,
70 'nick' : ban.nick,
71 'by' : ban.banned_by,
72 'reason': ' @bReason@b %s @sep' % ban.reason if ban.reason else '',
73 'ago' : ago})
74 else:
75 self.msg(self.chan, '@b[bans]@b No banned nicks.')
76
77 def cmd_blacklist(self, manager, channel, sender, arg):
78 type, sep, args = arg.partition(' ')
79 if not sep and arg != 'list':
80 self.msg(self.chan, 'Syntax: @b%sblacklist <add|del|list> [@uvhost-pattern@u]@b' % manager.get_prefix())
81 return
82
83 type = type.lower()
84 if type == 'add':
85 vhost, sep, reason = args.partition(' ')
86 self.requests.add_blacklist(vhost, sender, reason if reason else None)
87 elif type == 'list':
88 foo, bar, match = type.partition(' ')
89 if self.requests.blacklist:
90 self.notice(sender, '@b[blacklist]@b %d entries:' % len(self.requests.blacklist))
91 for n, b in enumerate(self.requests.blacklist):
92 self.notice(sender, '@b%(num)d.@b %(vhost)s @sep @bAdded by@b %(by)s %(ago)s ago @sep @bReason@b %(reason)s @sep' % {
93 'num': n + 1,
94 'ago': utils.get_timespan(b.date),
95 'vhost': b.vhost,
96 'by': b.added_by,
97 'reason': b.reason if b.reason else 'No reason'})
98 else:
99 self.msg(self.chan, '@b[blacklist]@b No blacklisted vHosts.')
100 elif type == 'del':
101 vhost, sep, bla = args.partition(' ')
102 self.requests.del_blacklist(vhost, sender)
103 else:
104 self.msg(self.chan, 'Syntax: @b%sblacklist <add|del|list> [@uvhost-pattern@u]@b' % manager.get_prefix())
105
106 def cmd_del(self, manager, channel, sender, arg):
107 if not arg:
108 self.msg(self.chan, 'Syntax: @b%sdel @unick@u@b' % manager.get_prefix())
109 return
110
111 nick = arg.split(' ')[0]
112 self.msg('HostServ', 'DEL %s' % nick)
113 self.msg(self.chan, 'vHost for %s has been removed.' % nick)
114
115 def cmd_delall(self, manager, channel, sender, arg):
116 if not arg:
117 self.msg(self.chan, 'Syntax: @b%sdelall @unick@u@b' % manager.get_prefix())
118 return
119
120 nick = arg.split(' ')[0]
121 self.msg('HostServ', 'DELALL %s' % nick)
122 self.msg(self.chan, 'vHosts for group of %s have been removed.' % nick)
123
124 def cmd_list_vhosts(self, manager, channel, sender, arg):
125 if arg:
126 self.requests.list_vhosts(arg)
127 else:
128 self.msg(self.chan, 'Syntax: @b%slist @unick@u@b' % manager.get_prefix())
129
130 def cmd_check_pending(self, manager, channel, sender, arg):
131 if self.requests.list:
132 s = sorted(self.requests.list.values(), key=itemgetter('id'))
133 size = len(self.requests.list)
134 self.msg(self.chan, '@b[pending]@b %d pending vHost%s:' % (size, 's' if size != 1 else ''))
135 for req in s:
136 min = (datetime.now() - req['date']).seconds / 60
137 self.msg(self.chan, moo_utils.format_last_req(req['last'], '@b%(id)d.@b %(nick)s @sep @bvHost@b %(vhost)s%(susp)s @sep @bWaiting for@b %(wait)s minute%(s)s @sep%(lastreq)s' % {
138 'id' : req['id'],
139 'nick' : req['nick'],
140 'vhost' : req['vhost'] if not req['suspicious'] else '@c10@b[!]@o ' + req['vhost'],
141 'susp' : ' @sep @bSuspicious@b %s' % req['suspicious'] if req['suspicious'] else '',
142 'lastreq': ' @bLast request@b %s ago as %s @sep' % (utils.get_timespan(req['last'].date), req['last'].nickname) if req['last'] else '',
143 'wait' : min,
144 's' : 's' if min != 1 else ''}))
145 else:
146 self.msg(self.chan, '@b[pending]@b There are no pending vHost requests.')
147
148 def cmd_reject_vhost(self, manager, channel, sender, arg):
149 if arg:
150 remove, foo, reason = arg.partition(' ')
151 self.requests.reject(remove, sender, reason)
152 else:
153 self.msg(self.chan, 'Syntax: @b%srej @unick@u|@urequest_id@u [@ureason@u]@b' % manager.get_prefix())
154
155 def cmd_reject_all(self, manager, channel, sender, arg):
156 for nick, req in self.requests.list.items():
157 self.requests.reject(nick, sender)
158
159 def cmd_search_vhost(self, manager, channel, sender, arg):
160 if arg:
161 self.requests.search(arg)
162 else:
163 self.msg(self.chan, 'Syntax: @b%ssearch @uvHost@u@b' % manager.get_prefix())
164
165 def cmd_stats(self, manager, channel, sender, arg):
166 reqs = self.requests.requests
167 total = len(reqs)
168 topten = {}
169 totalwait = 0
170 startdate = reqs[0].date
171 for req in reqs:
172 by = req.resolved_by
173 totalwait += req.waited_for
174 if by not in topten:
175 topten[by] = 1
176 else:
177 topten[by] += 1
178
179 sorted_list = sorted(reqs, key=lambda x: x.waited_for)
180
181 days = (datetime.now() - startdate).days
182 self.notice(sender, '@sep Approved %(total)s vHosts in %(days)d days @sep Average of %(dailyavg)s approved vHosts/day, one every %(avgappr)s minutes @sep Average wait time %(avgwait)s minutes @sep Median wait time %(median)s minutes @sep' % {
183 'total' : total,
184 'days' : days,
185 'dailyavg': round(total / Decimal(days), 2),
186 'avgappr' : round(days * Decimal('1440') / total, 2),
187 'avgwait' : round(totalwait / (Decimal('60') * total), 2),
188 'median' : round((sorted_list[total / 2].waited_for if total % 2 == 1 else (sorted_list[total / 2].waited_for + sorted_list[total / 2 - 1].waited_for) / 2) / Decimal('60'), 2)})
189
190 longest = max([len(u) for u in topten.iterkeys()])
191 topten = sorted(topten.iteritems(), key=itemgetter(1), reverse=True)
192 if arg != 'all':
193 topten = topten[:10]
194
195 for n, u in enumerate(topten):
196 user, amount = u
197 self.notice(sender, '@b#%(num)d@b %(nick)s %(spacer)s @sep @bApproved@b %(amount)d vHosts' % {
198 'num': n + 1,
199 'nick': user,
200 'spacer' : ' ' * (longest - len(user)) if n < 9 else ' ' * (longest - len(user) - 1),
201 'amount': amount})
202
203 def cmd_suspicious(self, manager, channel, sender, arg):
204 type, sep, args = arg.partition(' ')
205 if not sep and arg != 'list':
206 self.msg(self.chan, 'Syntax: @b%ssuspicious <add|del|list> [@uvhost-pattern@u]@b' % manager.get_prefix())
207 return
208
209 type = type.lower()
210 if type == 'add':
211 vhost, sep, reason = args.partition(' ')
212 self.requests.add_suspicious(vhost, sender, reason if reason else None)
213 elif type == 'list':
214 foo, bar, match = type.partition(' ')
215 if self.requests.suspicious:
216 self.notice(sender, '@b[suspicious]@b %d entries:' % len(self.requests.suspicious))
217 for n, b in enumerate(self.requests.suspicious):
218 self.notice(sender, '@b%(num)d.@b %(vhost)s @sep @bAdded by@b %(by)s %(ago)s ago @sep @bReason@b %(reason)s @sep' % {
219 'num': n + 1,
220 'ago': utils.get_timespan(b.date),
221 'vhost': b.vhost,
222 'by': b.added_by,
223 'reason': b.reason if b.reason else 'No reason'})
224 else:
225 self.msg(self.chan, '@b[suspicious]@b No suspicious vHosts.')
226 elif type == 'del':
227 vhost, sep, bla = args.partition(' ')
228 self.requests.del_suspicious(vhost, sender)
229 else:
230 self.msg(self.chan, 'Syntax: @b%ssuspicious <add|del|list> [@uvhost-pattern@u]@b' % manager.get_prefix())
231
232 def cmd_moo_help(self, manager, channel, sender, arg):
233 command = arg.lower()
234
235 if command == '':
236 message = ['moo: %shelp moo - for moo commands' % manager.get_prefix()]
237 elif command == 'moo':
238 message = manager.help
239 else:
240 return
241
242 for line in message:
243 self.notice(sender, line)
244
245 class UserCommandManager(CommandManager):
246 def get_prefix(self):
247 return '!'
248
249 def get_commands(self):
250 return {
251 'a' : 'activate',
252 'act' : 'activate',
253 'activate' : (cmd_activate_vhost, 'Activates requested vHost to @bnick@b.'),
254
255 'aa' : 'actall',
256 'actall' : (cmd_activate_all, 'Activates all pending vHosts'),
257
258 'ban' : (cmd_ban_user, 'Bans @bnick@b from requesting vHosts with an optional @breason@b and deletes all vHosts in that group. @uNote@u: use it on the main nick to ban an entire group.'),
259
260 'banlist' : (cmd_ban_list, 'Lists active bans.'),
261
262 'blacklist' : (cmd_blacklist, 'Add/remove/list blacklist entries.'),
263
264 'del' : (cmd_del, 'Deletes the vHost of @bnick@b.'),
265 'delall' : (cmd_delall, 'Deletes all vHosts in the group of @bnick@b.'),
266
267 'e' : 'except',
268 'exc' : 'except',
269 'except' : (cmd_except, 'Rejects a [list of] vHosts and activates all the other pending requests.'),
270
271 'help' : (cmd_moo_help, 'Shows this help text.'),
272
273 'list' : (cmd_list_vhosts, 'Lists vHosts requests by @bnick@b.'),
274
275 'p' : 'pending',
276 'pen' : 'pending',
277 'pending' : (cmd_check_pending, 'Lists pending vHost requests.'),
278
279 'r' : 'reject',
280 'rej' : 'reject',
281 'reject' : (cmd_reject_vhost, 'Rejects requested vHost to @bnick@b.'),
282
283 'ra' : 'rejall',
284 'rejall' : (cmd_reject_all, 'Rejects all pending vHosts.'),
285
286 'search' : (cmd_search_vhost, 'Lists users who requested @bvHost@b.'),
287
288 'stats' : (cmd_stats, 'Stats on approved vHosts.'),
289
290 'suspicious': (cmd_suspicious, 'Add/remove/list suspicious entries.'),
291
292 'unban' : (cmd_unban_user, 'Unbans @bnick@b from requesting vHosts.')
293 }
294