From 4c8e21fd4287c3e26ca470c520d9d234ef2da450 Mon Sep 17 00:00:00 2001 From: huker667 Date: Sun, 5 Jul 2026 15:43:52 +0300 Subject: fix antiflood megaozbeksystem --- main.py | 100 +++++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 61 insertions(+), 39 deletions(-) (limited to 'main.py') diff --git a/main.py b/main.py index 8f08674..7a8a221 100644 --- a/main.py +++ b/main.py @@ -94,14 +94,12 @@ async def guest_middleware(handler, event, data): if not is_replied_bot(message, is_channel, user_text, config) and event.message: return - # снизу очень важный кусок кода!! у нас же async бот да ну вот - # если переслать несколько сообщений то удасться обойти ограничение - # по задержке между генерациями и поэтому тут такое решение - # скоро это будет нормально реализовано. ждите. if user_id: - await asyncio.sleep(uniform(0,1)) + await asyncio.sleep(uniform(0,0.3)) text, blocked = is_blocked(user_id) + if not text and blocked: + return if blocked: if event.guest_message: await g_answer(data, message, text, title="ошибка врат") @@ -115,15 +113,24 @@ async def guest_middleware(handler, event, data): return + ensure_user(user_id) + + if not user_id in last_command_time: + last_command_time[user_id] = [current_time, True, [message.message_id]] + elif len(last_command_time[user_id][2]) == 0: + last_command_time[user_id] = [current_time, True, [message.message_id]] + else: + last_command_time[user_id][0] = current_time + last_command_time[user_id][1] = True + last_command_time[user_id][2] += [message.message_id] + + await asyncio.sleep(uniform(0,0.5)) + if event.message: try: await bot.send_chat_action(chat_id=message.chat.id, action="typing") except TelegramForbiddenError: return - - ensure_user(user_id) - - last_command_time[user_id] = [current_time, True] msg = None replied = message.reply_to_message or None @@ -278,40 +285,45 @@ async def guest_middleware(handler, event, data): message_id = msg.message_id else: message_id = None - - if is_channel and event.message: - result = await generate( - bot=bot, - prompt=prompt, - chat_id=message.chat.id, - user_id=None, - message_id=message_id, - ) - elif event.message: - result = await generate( - bot=bot, - prompt=prompt, - chat_id=message.chat.id, - user_id=user_id, - message_id=message_id, - ) - else: - result = await generate( - bot=bot, - prompt=prompt, - chat_id=None, - user_id=user_id, - message_id=None, - ) - - result = parse_tools(result) + + if len(last_command_time[user_id][2]) == 1: + if is_channel and event.message: + result = await generate( + bot=bot, + prompt=prompt, + chat_id=message.chat.id, + user_id=None, + message_id=message_id, + ) + elif event.message: + result = await generate( + bot=bot, + prompt=prompt, + chat_id=message.chat.id, + user_id=user_id, + message_id=message_id, + ) + else: + result = await generate( + bot=bot, + prompt=prompt, + chat_id=None, + user_id=user_id, + message_id=None, + ) + + result = parse_tools(result) - if event.guest_message: - add_one_to("stats/guest") + if event.guest_message: + add_one_to("stats/guest") + else: + print(f"{YELLOW} -- err in blocking 2 {RESET}") + return else: return last_command_time[user_id][1] = False + last_command_time[user_id][2] = [] try: if event.guest_message: @@ -391,6 +403,8 @@ async def chosen_inline_result_handler(chosen_result: ChosenInlineResult): else: current_time = time.time() alo, blocked = is_blocked(user_id) + if not alo: + return if alo and blocked: await bot.edit_message_text( text=alo, @@ -398,7 +412,14 @@ async def chosen_inline_result_handler(chosen_result: ChosenInlineResult): ) return - last_command_time[user_id] = [current_time, True] + if not user_id in last_command_time: + last_command_time[user_id] = [current_time, True, [inline_message_id]] + elif len(last_command_time[user_id][2]) == 0: + last_command_time[user_id] = [current_time, True, [inline_message_id]] + else: + last_command_time[user_id][0] = current_time + last_command_time[user_id][1] = True + last_command_time[user_id][2] += [inline_message_id] if inline_message_id: try: @@ -407,6 +428,7 @@ async def chosen_inline_result_handler(chosen_result: ChosenInlineResult): user_id=chosen_result.from_user.id, ) last_command_time[user_id][1] = False + last_command_time[user_id][2] = [] except Exception as e: error = parse_response(str(e)) await bot.edit_message_text( -- cgit v1.3.1