prototype
This commit is contained in:
parent
926b8c3f05
commit
f49c1b873c
2 changed files with 61 additions and 5 deletions
|
@ -1,8 +1,10 @@
|
||||||
import re
|
from util import hook, bucket
|
||||||
|
|
||||||
from util import hook
|
TOKENS = 10
|
||||||
from fnmatch import fnmatch
|
RESTORE_RATE = 2
|
||||||
|
MESSAGE_COST = 5
|
||||||
|
|
||||||
|
buckets = {}
|
||||||
|
|
||||||
@hook.sieve
|
@hook.sieve
|
||||||
def sieve_suite(bot, input, func, kind, args):
|
def sieve_suite(bot, input, func, kind, args):
|
||||||
|
@ -12,6 +14,22 @@ def sieve_suite(bot, input, func, kind, args):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if kind == "command":
|
if kind == "command":
|
||||||
|
uid = (input.nick, input.chan)
|
||||||
|
|
||||||
|
if not uid in buckets:
|
||||||
|
_bucket = bucket.TokenBucket(TOKENS, RESTORE_RATE)
|
||||||
|
_bucket.consume(MESSAGE_COST)
|
||||||
|
buckets[uid] = _bucket
|
||||||
|
return input
|
||||||
|
|
||||||
|
_bucket = buckets[uid]
|
||||||
|
if _bucket.consume(MESSAGE_COST):
|
||||||
|
return input
|
||||||
|
else:
|
||||||
|
print "pong!"
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
disabled_commands = conn.config.get('disabled_commands', [])
|
disabled_commands = conn.config.get('disabled_commands', [])
|
||||||
if input.trigger in disabled_commands:
|
if input.trigger in disabled_commands:
|
||||||
return None
|
return None
|
||||||
|
@ -33,8 +51,6 @@ def sieve_suite(bot, input, func, kind, args):
|
||||||
args["permissions"] = ["adminonly"]
|
args["permissions"] = ["adminonly"]
|
||||||
|
|
||||||
if args.get('permissions', False):
|
if args.get('permissions', False):
|
||||||
|
|
||||||
|
|
||||||
mask = input.mask.lower()
|
mask = input.mask.lower()
|
||||||
|
|
||||||
allowed_permissions = args.get('permissions', [])
|
allowed_permissions = args.get('permissions', [])
|
||||||
|
|
40
util/bucket.py
Normal file
40
util/bucket.py
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
from time import time
|
||||||
|
|
||||||
|
|
||||||
|
class TokenBucket(object):
|
||||||
|
"""An implementation of the token bucket algorithm.
|
||||||
|
|
||||||
|
>>> bucket = TokenBucket(80, 0.5)
|
||||||
|
>>> print bucket.consume(10)
|
||||||
|
True
|
||||||
|
>>> print bucket.consume(90)
|
||||||
|
False
|
||||||
|
"""
|
||||||
|
def __init__(self, tokens, fill_rate):
|
||||||
|
"""tokens is the total tokens in the bucket. fill_rate is the
|
||||||
|
rate in tokens/second that the bucket will be refilled."""
|
||||||
|
self.capacity = float(tokens)
|
||||||
|
self._tokens = float(tokens)
|
||||||
|
self.fill_rate = float(fill_rate)
|
||||||
|
self.timestamp = time()
|
||||||
|
|
||||||
|
def consume(self, tokens):
|
||||||
|
"""Consume tokens from the bucket. Returns True if there were
|
||||||
|
sufficient tokens otherwise False."""
|
||||||
|
if tokens <= self.tokens:
|
||||||
|
self._tokens -= tokens
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def refill(self):
|
||||||
|
self._tokens = self.capacity
|
||||||
|
|
||||||
|
def get_tokens(self):
|
||||||
|
now = time()
|
||||||
|
if self._tokens < self.capacity:
|
||||||
|
delta = self.fill_rate * (now - self.timestamp)
|
||||||
|
self._tokens = min(self.capacity, self._tokens + delta)
|
||||||
|
self.timestamp = now
|
||||||
|
return self._tokens
|
||||||
|
tokens = property(get_tokens)
|
Reference in a new issue