Back to All

Python Code

Is it possible to implement this code to my bot?

coding: utf-8

!/usr/bin/env python

Author: Kirill Vasin

import logging
from time import time
from collections import deque

logger = logging.getLogger(name)

class SpamFilter:
def init(self):
self.limits = {1:3, 5:7, 10:10} # max: 3 updates in 1 second, 7 updates in 5 seconds, 10 updates in 10 seconds
self.timeout_start = 10
self.severity = 2
self.timeouts = {}
self.times = {}
self.violations = {}
def new_message(self, chat_id):
update_time = time()
if chat_id not in self.timeouts:
self.timeouts.update({chat_id: 0})
self.times.update({chat_id : deque(maxlen=10)})
self.violations.update({chat_id: 0})
else:
if self.timeouts[chat_id] > update_time:
return 1
for limit in self.limits:
amount = 1
for upd_time in self.times[chat_id]:
if update_time - upd_time < limit:
amount += 1
else:
break
if amount > self.limits[limit]:
delta = int(self.timeout_start * self.severity ** self.violations[chat_id])
self.timeouts[chat_id] = update_time + delta
self.violations[chat_id] += 1
logger.warning("User %s is sending too many requests, broke %s limit", chat_id, limit)
return "Too many requests. Operations will be availiable in {0}".format(delta)
self.times[chat_id].appendleft(update_time)
return False

def wrapper(self, func):  # only works on functions, not on instancemethods
    # Only works for messages (+Commands) and callback_queries (Inline Buttons)
    def func_wrapper(bot, update):
        if update.callback_query:
            chat_id = update.callback_query.from_user.id
        elif update.message:
            chat_id = update.message.chat_id
        timeout = self.new_message(chat_id)
        if not timeout:
            return func(bot, update) # return is required by ConversationHandler
        elif timeout != 1:
            bot.sendMessage(chat_id=chat_id, text=timeout)
    return func_wrapper

blocker = SpamFilter()

@blocker.wrapper

def start(bot, update):

Thank you