2023-09-11 20:04:53 +00:00
|
|
|
import asyncio
|
|
|
|
import logging
|
2024-01-06 11:25:35 +00:00
|
|
|
import signal
|
2024-01-06 11:32:25 +00:00
|
|
|
from aiohttp import ClientSession
|
|
|
|
from handlers.command_my import send_message
|
2023-09-11 20:11:10 +00:00
|
|
|
from handlers.routing import handle_routing
|
2023-09-18 07:50:48 +00:00
|
|
|
from handlers.callback_unlink import handle_unlink
|
|
|
|
from handlers.callback_vouch import handle_button
|
|
|
|
from handlers.handle_join_request import handle_join_request
|
2023-09-18 11:02:24 +00:00
|
|
|
from handlers.handle_startup import handle_startup
|
|
|
|
from handlers.handle_members_change import handle_join, handle_left
|
2024-01-06 11:32:25 +00:00
|
|
|
from bot.config import BOT_TOKEN, FEEDBACK_CHAT_ID
|
2024-01-06 11:25:35 +00:00
|
|
|
from bot.state import State
|
2024-01-06 11:32:25 +00:00
|
|
|
from storage import Profile
|
2023-09-11 20:04:53 +00:00
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
logging.basicConfig(level=logging.INFO)
|
|
|
|
state = State()
|
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
api_url = f'https://api.telegram.org/bot{BOT_TOKEN}/'
|
|
|
|
|
|
|
|
|
|
|
|
async def fetch(session, url):
|
|
|
|
async with session.get(url) as response:
|
|
|
|
return await response.json()
|
|
|
|
|
2023-09-11 20:04:53 +00:00
|
|
|
|
2024-01-06 11:25:35 +00:00
|
|
|
async def command_start_handler(message):
|
2023-10-21 09:54:27 +00:00
|
|
|
caption = "Напишите своё сообщение для нас" if message.from_user.llanguage_code == 'ru' else "Write your message for us"
|
|
|
|
await message.answer(caption)
|
2023-09-11 20:04:53 +00:00
|
|
|
|
|
|
|
|
2024-01-06 11:42:00 +00:00
|
|
|
async def process_callback(cbq):
|
2023-10-21 09:54:27 +00:00
|
|
|
try:
|
2024-01-06 11:42:00 +00:00
|
|
|
data = cbq.get("data")
|
2023-10-21 09:54:27 +00:00
|
|
|
if data.startswith("vouch"):
|
|
|
|
await handle_button(cbq)
|
|
|
|
elif data.startswith("unlink"):
|
|
|
|
await handle_unlink(cbq, state)
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"[main.process_callback] ERROR {e}")
|
|
|
|
logger.debug(cbq)
|
2023-10-21 11:19:18 +00:00
|
|
|
import traceback
|
|
|
|
text = traceback.format_exc()
|
2024-01-06 11:25:35 +00:00
|
|
|
await send_message(FEEDBACK_CHAT_ID, text)
|
2023-09-11 20:04:53 +00:00
|
|
|
|
|
|
|
|
2024-01-06 11:42:00 +00:00
|
|
|
async def join_request_handler(join_request):
|
2023-10-21 09:54:27 +00:00
|
|
|
try:
|
|
|
|
await handle_join_request(join_request)
|
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"[main.join_request_handler] ERROR {e}")
|
|
|
|
logger.debug(join_request)
|
2023-10-21 11:19:18 +00:00
|
|
|
import traceback
|
|
|
|
text = traceback.format_exc()
|
2024-01-06 11:25:35 +00:00
|
|
|
await send_message(FEEDBACK_CHAT_ID, text)
|
2023-10-21 09:54:27 +00:00
|
|
|
|
2023-09-11 20:04:53 +00:00
|
|
|
|
2024-01-06 11:25:35 +00:00
|
|
|
async def all_handler(message):
|
2023-10-21 09:54:27 +00:00
|
|
|
try:
|
2024-01-06 11:42:00 +00:00
|
|
|
await handle_routing(message, state)
|
2023-10-21 09:54:27 +00:00
|
|
|
except Exception as e:
|
|
|
|
logger.error(f"[main.all_handler] ERROR {e}")
|
2024-01-06 11:42:00 +00:00
|
|
|
logger.debug(message)
|
2023-10-21 11:19:18 +00:00
|
|
|
import traceback
|
|
|
|
text = traceback.format_exc()
|
2024-01-06 11:25:35 +00:00
|
|
|
await send_message(FEEDBACK_CHAT_ID, text)
|
2023-09-11 20:04:53 +00:00
|
|
|
|
|
|
|
|
2024-01-06 11:25:35 +00:00
|
|
|
async def chat_members_change(update):
|
2023-10-21 09:54:27 +00:00
|
|
|
try:
|
2024-01-06 11:42:00 +00:00
|
|
|
old = update.get("old_chat_member")
|
|
|
|
if old:
|
|
|
|
if old.get("status") == 'KICKED':
|
|
|
|
Profile.erase(update["from"]["id"])
|
|
|
|
await handle_left(update)
|
|
|
|
elif update.get("new_chat_member"):
|
|
|
|
await handle_join(update)
|
2023-10-21 09:54:27 +00:00
|
|
|
else:
|
|
|
|
logger.info("unhandled members update")
|
2024-01-06 11:25:35 +00:00
|
|
|
|
2023-10-21 09:54:27 +00:00
|
|
|
except Exception as e:
|
2023-10-21 10:58:50 +00:00
|
|
|
logger.error(f"[main.my_chat_member] ERROR {e}")
|
2024-01-06 11:42:00 +00:00
|
|
|
logger.debug(update)
|
2023-10-21 11:19:18 +00:00
|
|
|
import traceback
|
|
|
|
text = traceback.format_exc()
|
2024-01-06 11:25:35 +00:00
|
|
|
await send_message(FEEDBACK_CHAT_ID, text)
|
2023-09-18 11:02:24 +00:00
|
|
|
|
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
async def main():
|
2023-09-18 11:02:24 +00:00
|
|
|
# storage revalidation
|
|
|
|
await handle_startup()
|
2023-09-11 20:04:53 +00:00
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
async with ClientSession() as session:
|
|
|
|
offset = 0 # начальное значение offset
|
|
|
|
while True:
|
|
|
|
updates = await fetch(session, f"{api_url}getUpdates?offset={offset}")
|
|
|
|
for update in updates["result"]:
|
|
|
|
if "message" in update:
|
|
|
|
await all_handler(update["message"])
|
|
|
|
elif "callback_query" in update:
|
|
|
|
await process_callback(update["callback_query"])
|
|
|
|
elif "join_chat_request" in update:
|
|
|
|
await join_request_handler(update["join_chat_request"])
|
|
|
|
elif "my_chat_member" in update:
|
|
|
|
await chat_members_change(update["my_chat_member"])
|
2023-09-11 20:04:53 +00:00
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
offset = update["update_id"] + 1 # обновление offset
|
2023-09-11 20:04:53 +00:00
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
await asyncio.sleep(1.0)
|
2023-09-11 20:04:53 +00:00
|
|
|
|
|
|
|
|
2024-01-06 11:25:35 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
logging.basicConfig(level=logging.INFO, stream=sys.stdout)
|
|
|
|
|
2024-01-06 11:32:25 +00:00
|
|
|
# Запуск асинхронного цикла
|
|
|
|
asyncio.run(main())
|