6 class AntiFloodManager(Subsystem
):
7 def __init__(self
, module
):
8 Subsystem
.__init
__(self
, module
, module
.options
, 'antiflood')
9 self
.lock_user
= threading
.Lock()
13 self
.delay_base_user
= self
.get_option('delay_base_user', int, 1)
14 self
.delay_mult_pre_warn_user
= self
.get_option('delay_mult_pre_warn_user', int, 3)
15 self
.delay_mult_post_warn_user
= self
.get_option('delay_mult_post_warn_user', int, 10)
16 self
.ban_duration_user
= self
.get_option('ban_duration_user', int, 5 * 24 * 60 * 60)
17 self
.score_ban_user
= self
.get_option('score_ban_user', int, 6)
18 self
.score_warn_user
= self
.get_option('score_warn_user', int, 3)
19 self
.points_user
= self
.get_option('points_user', int, 1)
20 self
.points_repeat_user
= self
.get_option('points_repeat_user', int, 2)
21 self
.warning_message_user
= self
.get_option('warning_message_user', unicode, 'Slow down, wait @timeout seconds! If you continue flooding the bot you will be banned.')
23 def get_delay_user(self
, score
):
24 score_pre_warn
= score
27 if score
> self
.score_warn_user
:
28 score_post_warn
= score
- self
.score_warn_user
29 score_pre_warn
= self
.score_warn_user
31 return self
.delay_base_user
+ (score_pre_warn
* self
.delay_mult_pre_warn_user
) + (score_post_warn
* self
.delay_mult_post_warn_user
)
33 def check_user(self
, username
, command
, argument
):
34 command
= command
.lower().strip()
35 argument
= argument
.lower().strip()
36 now
= int(time
.time())
39 self
.lock_user
.acquire()
41 if not username
in self
.users
:
42 self
.users
[username
] = [now
, 0, command
, argument
]
45 user
= self
.users
[username
]
47 if now
- user
[0] <= self
.get_delay_user(user
[1]):
48 if user
[2] == command
and user
[3] == argument
:
49 user
[1] += self
.points_repeat_user
53 user
[1] += self
.points_user
61 self
.lock_user
.release()
63 if user
[1] >= self
.score_ban_user
:
64 self
.module
.users
.ban(username
, "anti-flood", "flooding", now
, now
+ self
.ban_duration_user
)
65 self
.module
.elog
.warning('Banned @b%s@b for flooding.' % username
)
69 if user
[1] >= self
.score_warn_user
:
70 self
.module
.notice(username
, self
.warning_message_user
.replace('@timeout', istring(self
.get_delay_user(user
[1]))))
76 now
= int(time
.time())
77 self
.lock_user
.acquire()
79 for username
in self
.users
:
80 user
= self
.users
[username
]
82 if now
- user
[0] <= self
.get_delay_user(user
[1]):
83 new_users
[username
] = user
85 self
.users
= new_users
86 self
.lock_user
.release()