from telegram import InlineQueryResultPhoto, InlineQueryResultGif
from telegram.ext import InlineQueryHandler, Updater, MessageHandler
from uuid import uuid4
import requests
import imgurpython
import logging
import random
import time, datetime
import threading

TOKEN = "221286293:AAHnEmVsDfxctXsTFJHUpVCfXy5TCXWDY30"
FORMAT = "[%(asctime)s] [%(levelname)7s] %(name).20s: %(message)s"
START_DATE = datetime.datetime.fromtimestamp(time.time())

timers = {}
logging.basicConfig(level=logging.INFO, format=FORMAT)
logger = logging.getLogger('antispam')

def clear_n(item):
    logger.info("Clearing messages for {}".format(item))
    del timers[item]

def error(bot, update, error):
    print(error)

def kick_client(bot, chat_id, user_id):
    bot.kickChatMember(chat_id=chat_id, user_id=user_id)

def set_rate(bot, update, args):
    rate = args[0]
    if not re.match(r"^\d+:\d+$", rate):
        bot.send(chat_id=update.chat.chat_id, text="Error: format must be <messages>:<seconds>")
    else:
        msgs, secs = rate.split(":")

def message_handler(bot, update):
    if (update.message.date < START_DATE):
        return
    nick = update.message.from_user.id
    chat_id = update.message.chat.id
    unique = nick - chat_id
    if unique in timers:
        logger.info("received message from {} ({}) [{}]".format(unique, chat_id, timers[unique]["number"]))
        timers[unique]["number"] += 1
        if timers[unique]["number"] == 10:
            logger.info("kicked client {} for writing {} messages in {} seconds".format(
                unique, timers[unique]["number"], time.time() - timers[unique]["start"]))
            kick_client(bot, chat_id, nick)
    else:
        logger.debug("received message from {} ({})".format(unique, chat_id))
        timers[unique] = {"number": 1, "timer": threading.Timer(60.0, clear_n, args=[unique]), "start": time.time()}
        timers[unique]["timer"].start()

def main():
    updater = Updater(token=TOKEN)
    updater.dispatcher.add_handler(MessageHandler(filters=False, callback=message_handler))
    updater.dispatcher.add_error_handler(error)
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()
