]>
jfr.im git - irc/rizon/acid.git/blob - pyva/src/main/python/moo/cmd_user.py
1 from datetime
import datetime
2 from decimal
import Decimal
3 from operator
import attrgetter
, itemgetter
7 from cmd_manager
import CommandManager
9 def cmd_activate_vhost ( self
, manager
, channel
, sender
, arg
):
12 for a
in arg
. split ( ' ' ):
13 self
. requests
. approve ( a
, sender
)
15 self
. requests
. approve ( arg
, sender
)
17 self
. msg ( self
. chan
, 'Syntax: @b %s act {@unick@u | @urequest_id@u} @b' % manager
. get_prefix ())
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
)
23 def cmd_except ( self
, manager
, channel
, sender
, arg
):
26 for r
in arg
. split ( ' ' ):
27 self
. requests
. reject ( r
, sender
)
29 self
. requests
. reject ( arg
, sender
)
31 for nick
, req
in self
. requests
. list . items ():
32 self
. requests
. approve ( req
[ 'nick' ], sender
)
34 self
. msg ( self
. chan
, 'Syntax: @b %sexc {@unick@u | @urequest_id@u} @b' % manager
. get_prefix ())
36 def cmd_ban_user ( self
, manager
, channel
, sender
, arg
):
42 reason
= ' ' . join ( sp
[ 1 :])
45 self
. requests
. ban ( nick
, sender
, reason
)
47 self
. msg ( self
. chan
, 'Syntax: @b %s ban @unick@u [@ureason@u]@b' % manager
. get_prefix ())
49 def cmd_unban_user ( self
, manager
, channel
, sender
, arg
):
51 self
. requests
. unban ( arg
)
53 self
. msg ( self
. chan
, 'Syntax: @b %su nban {@unick@u | @uban_id@u} @b' % manager
. get_prefix ())
55 def cmd_ban_list ( self
, manager
, channel
, sender
, arg
):
56 if self
. requests
. banlist
:
58 blist
= [ ban
for ban
in self
. requests
. banlist
. itervalues () if ban
. nick
. lower () == arg
. lower ()]
60 self
. msg ( self
. chan
, '@b[bans]@b Nick @b %s @b is not banned.' % arg
)
63 self
. notice ( sender
, '@b[bans]@b Total %d entries:' % len ( self
. requests
. banlist
))
64 blist
= self
. requests
. banlist
. values ()
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 ' % {
72 'reason' : ' @bReason@b %s @sep' % ban
. reason
if ban
. reason
else '' ,
75 self
. msg ( self
. chan
, '@b[bans]@b No banned nicks.' )
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 %s blacklist <add|del|list> [@uvhost-pattern@u]@b' % manager
. get_prefix ())
85 vhost
, sep
, reason
= args
. partition ( ' ' )
86 self
. requests
. add_blacklist ( vhost
, sender
, reason
if reason
else None )
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' % {
94 'ago' : utils
. get_timespan ( b
. date
),
97 'reason' : b
. reason
if b
. reason
else 'No reason' })
99 self
. msg ( self
. chan
, '@b[blacklist]@b No blacklisted vHosts.' )
101 vhost
, sep
, bla
= args
. partition ( ' ' )
102 self
. requests
. del_blacklist ( vhost
, sender
)
104 self
. msg ( self
. chan
, 'Syntax: @b %s blacklist <add|del|list> [@uvhost-pattern@u]@b' % manager
. get_prefix ())
106 def cmd_del ( self
, manager
, channel
, sender
, arg
):
108 self
. msg ( self
. chan
, 'Syntax: @b %sde l @unick@u@b' % manager
. get_prefix ())
111 nick
= arg
. split ( ' ' )[ 0 ]
112 self
. msg ( 'HostServ' , 'DEL %s ' % nick
)
113 self
. msg ( self
. chan
, 'vHost for %s has been removed.' % nick
)
115 def cmd_delall ( self
, manager
, channel
, sender
, arg
):
117 self
. msg ( self
. chan
, 'Syntax: @b %sde lall @unick@u@b' % manager
. get_prefix ())
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
)
124 def cmd_list_vhosts ( self
, manager
, channel
, sender
, arg
):
126 self
. requests
. list_vhosts ( arg
)
128 self
. msg ( self
. chan
, 'Syntax: @b %s list @unick@u@b' % manager
. get_prefix ())
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 '' ))
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 ' % {
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 '' ,
144 's' : 's' if min != 1 else '' }))
146 self
. msg ( self
. chan
, '@b[pending]@b There are no pending vHost requests.' )
148 def cmd_reject_vhost ( self
, manager
, channel
, sender
, arg
):
150 remove
, foo
, reason
= arg
. partition ( ' ' )
151 self
. requests
. reject ( remove
, sender
, reason
)
153 self
. msg ( self
. chan
, 'Syntax: @b %sre j @unick@u|@urequest_id@u [@ureason@u]@b' % manager
. get_prefix ())
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
)
159 def cmd_search_vhost ( self
, manager
, channel
, sender
, arg
):
161 self
. requests
. search ( arg
)
163 self
. msg ( self
. chan
, 'Syntax: @b %sse arch @uvHost@u@b' % manager
. get_prefix ())
165 def cmd_stats ( self
, manager
, channel
, sender
, arg
):
166 reqs
= self
. requests
. requests
170 startdate
= reqs
[ 0 ]. date
173 totalwait
+= req
. waited_for
179 sorted_list
= sorted ( reqs
, key
= lambda x
: x
. waited_for
)
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' % {
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 )})
190 longest
= max ([ len ( u
) for u
in topten
. iterkeys ()])
191 topten
= sorted ( topten
. iteritems (), key
= itemgetter ( 1 ), reverse
= True )
195 for n
, u
in enumerate ( topten
):
197 self
. notice ( sender
, '@b# %(num)d @b %(nick)s %(spacer)s @sep @bApproved@b %(amount)d vHosts' % {
200 'spacer' : ' ' * ( longest
- len ( user
)) if n
< 9 else ' ' * ( longest
- len ( user
) - 1 ),
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 %ssus picious <add|del|list> [@uvhost-pattern@u]@b' % manager
. get_prefix ())
211 vhost
, sep
, reason
= args
. partition ( ' ' )
212 self
. requests
. add_suspicious ( vhost
, sender
, reason
if reason
else None )
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' % {
220 'ago' : utils
. get_timespan ( b
. date
),
223 'reason' : b
. reason
if b
. reason
else 'No reason' })
225 self
. msg ( self
. chan
, '@b[suspicious]@b No suspicious vHosts.' )
227 vhost
, sep
, bla
= args
. partition ( ' ' )
228 self
. requests
. del_suspicious ( vhost
, sender
)
230 self
. msg ( self
. chan
, 'Syntax: @b %ssus picious <add|del|list> [@uvhost-pattern@u]@b' % manager
. get_prefix ())
232 def cmd_moo_help ( self
, manager
, channel
, sender
, arg
):
233 command
= arg
. lower ()
236 message
= [ 'moo: %s help moo - for moo commands' % manager
. get_prefix ()]
237 elif command
== 'moo' :
238 message
= manager
. help
243 self
. notice ( sender
, line
)
245 class UserCommandManager ( CommandManager
):
246 def get_prefix ( self
):
249 def get_commands ( self
):
253 'activate' : ( cmd_activate_vhost
, 'Activates requested vHost to @bnick@b.' ),
256 'actall' : ( cmd_activate_all
, 'Activates all pending vHosts' ),
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.' ),
260 'banlist' : ( cmd_ban_list
, 'Lists active bans.' ),
262 'blacklist' : ( cmd_blacklist
, 'Add/remove/list blacklist entries.' ),
264 'del' : ( cmd_del
, 'Deletes the vHost of @bnick@b.' ),
265 'delall' : ( cmd_delall
, 'Deletes all vHosts in the group of @bnick@b.' ),
269 'except' : ( cmd_except
, 'Rejects a [list of] vHosts and activates all the other pending requests.' ),
271 'help' : ( cmd_moo_help
, 'Shows this help text.' ),
273 'list' : ( cmd_list_vhosts
, 'Lists vHosts requests by @bnick@b.' ),
277 'pending' : ( cmd_check_pending
, 'Lists pending vHost requests.' ),
281 'reject' : ( cmd_reject_vhost
, 'Rejects requested vHost to @bnick@b.' ),
284 'rejall' : ( cmd_reject_all
, 'Rejects all pending vHosts.' ),
286 'search' : ( cmd_search_vhost
, 'Lists users who requested @bvHost@b.' ),
288 'stats' : ( cmd_stats
, 'Stats on approved vHosts.' ),
290 'suspicious' : ( cmd_suspicious
, 'Add/remove/list suspicious entries.' ),
292 'unban' : ( cmd_unban_user
, 'Unbans @bnick@b from requesting vHosts.' )