aboutsummaryrefslogtreecommitdiff
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py574
1 files changed, 221 insertions, 353 deletions
diff --git a/main.py b/main.py
index 52c5888..31a0c16 100644
--- a/main.py
+++ b/main.py
@@ -2,6 +2,7 @@ import asyncio
import base64
import io
import sys
+import time
import gconfig
@@ -29,6 +30,7 @@ from aiogram.types import (
from callbacks import *
from statistics import *
from colors import *
+from helpers import *
from commands import *
from dotenv import load_dotenv
@@ -64,181 +66,18 @@ def parse_tools(text):
return text
-def is_blocked(user_id):
- current_time = time.time()
- if user_id:
- if user_id in last_command_time:
- time_diff = current_time - last_command_time[user_id]
- if time_diff < 3:
- alo = "🚫 *файл не вошёл.* хватит так быстро слать свои сообщения.\n" \
- f"подожди {round(3 - time_diff, 3)} секунд, брат😡😡"
- return alo, True
- return "", False
-
-
-def is_replied_bot(message, is_channel, user_text, config=None):
- if message.chat.type in [ChatType.GROUP, ChatType.SUPERGROUP, ChatType.CHANNEL]:
- if not is_channel:
- is_reply_to_bot = (
- message.reply_to_message
- and message.reply_to_message.from_user
- and message.reply_to_message.from_user.is_bot
- and message.reply_to_message.from_user.username == BOT_USERNAME
- )
- if config:
- if config.get("call") == "da":
- mentions_bot = any(
- user_text.lower().startswith(call.lower()) for call in BOT_CALLS
- )
- else:
- mentions_bot = False
- else:
- mentions_bot = any(
- user_text.lower().startswith(call.lower()) for call in BOT_CALLS
- )
- if not (is_reply_to_bot or mentions_bot):
- return False
- return True
-
@dp.update.outer_middleware()
async def guest_middleware(handler, event, data):
# print("e: ", event)
if event.guest_message:
message = event.guest_message
- user_id = message.sender_chat.id if message.sender_chat else message.from_user.id
- current_time = time.time()
-
- if user_id:
- text, blocked = is_blocked(user_id)
- if blocked:
- await data["bot"](
- AnswerGuestQuery(
- guest_query_id=message.guest_query_id,
- result=InlineQueryResultArticle(
- id="1",
- title="err",
- input_message_content=InputTextMessageContent(
- message_text=text
- ),
- ),
- )
- )
-
- return
-
- ensure_user(user_id)
-
- last_command_time[user_id] = current_time
- user_text = message.text or message.caption or ""
- replied = message.reply_to_message or None
- if replied:
- replied_text = message.reply_to_message.text or message.reply_to_message.caption or None
- else:
- replied_text = None
-
- prompt = ""
-
- if replied and replied.location:
- loc = replied.location
- prompt += (
- f"<ответ на локацию>\n"
- f"{loc.latitude}, {loc.longitude}\n"
- f"</ответ на локацию>\n"
- )
-
- if message.location:
- loc = message.location
- prompt += (
- f"<локация>\n"
- f"{loc.latitude}, {loc.longitude}\n"
- f"</локация>\n"
- )
- if replied and replied.poll:
- poll = replied.poll
- if poll.allows_multiple_answers:
- prompt += "<множественный "
- else:
- prompt += "<одиночный "
- prompt += f"опрос в ответе: {poll.question}>\n"
- for option in poll.options:
- prompt += f"- {option.text}\n"
- prompt += "</опрос в ответе>"
- if replied and replied.photo and IMAGE_MODEL != "":
- try:
- photo = replied.photo[-1]
- file_bytes = await bot.download(photo)
- image_bytes = file_bytes.read()
- b64_image = base64.b64encode(image_bytes).decode("utf-8")
- image_text = await image2text(image=b64_image)
- except Exception as e:
- image_text = "произошла ошибка при анализе фото"
- print(f"{RED} -- photo - {e}{RESET}")
- prompt = f"{prompt}<фото в ответе>{image_text}</фото в ответе>\n"
- if message.photo and IMAGE_MODEL != "":
- try:
- photo = message.photo[-1]
- file_bytes = await bot.download(photo)
- image_bytes = file_bytes.read()
- b64_image = base64.b64encode(image_bytes).decode("utf-8")
- image_text = await image2text(image=b64_image)
- except Exception as e:
- image_text = "произошла ошибка при анализе фото"
- print(f"{RED} -- photo - {e}{RESET}")
- prompt = f"{prompt}<фото>{image_text}</фото>\n"
-
- prompt = f"{prompt}\n{user_text}"
- if replied_text:
- prompt = f"<ответ на>{replied_text}</ответ> {prompt}"
- prompt = prompt[:MAX_PROMPT]
-
- result = await generate(
- bot=bot,
- prompt=prompt,
- chat_id=None,
- user_id=user_id,
- message_id=None,
- )
- add_one_to("stats/guest")
- try:
- await data["bot"](
- AnswerGuestQuery(
- guest_query_id=message.guest_query_id,
- result=InlineQueryResultArticle(
- id="1",
- title="ok",
- input_message_content=InputTextMessageContent(
- message_text=result
- ),
- ),
- )
- )
- except Exception as e:
- try:
- await data["bot"](
- AnswerGuestQuery(
- guest_query_id=message.guest_query_id,
- result=InlineQueryResultArticle(
- id="1",
- title="ok",
- input_message_content=InputTextMessageContent(
- message_text=result,
- parse_mode="None"
- ),
- ),
- )
- )
- except Exception as e:
- print(f"{RED} -- send guest - {e}{RESET}")
- else:
- print(f"{YELLOW} -- markdown - {e}{RESET}")
-
- return
-
- return await handler(event, data)
+ elif event.message:
+ if event.message.text and any(event.message.text.startswith(cmd) for cmd in commands):
+ return await handler(event, data)
+ message = event.message
+ else:
+ return await handler(event, data)
-
-@router.message(F.content_type.in_({"text", "photo", "document", "poll", "location"}))
-async def text_handler(message: Message):
chat_type = message.sender_chat.type if message.sender_chat else ""
user_id = message.sender_chat.id if message.sender_chat else message.from_user.id
is_channel = (
@@ -246,202 +85,227 @@ async def text_handler(message: Message):
and message.from_user
and message.from_user.id == 777000
)
- user_text = message.text or message.caption or ""
- msg = None
+ current_time = time.time()
config = get_user_config(user_id)
stream = config.get("stream")
- current_time = time.time()
+ user_text = message.text or message.caption or ""
- if not is_replied_bot(message, is_channel, user_text, config):
+ if not is_replied_bot(message, is_channel, user_text, config) and event.message:
return
-
+
if user_id:
text, blocked = is_blocked(user_id)
if blocked:
- error_message = await message.reply(text)
- await asyncio.sleep(7)
- try:
- await error_message.delete()
- except Exception as e:
- print(f"{YELLOW} -- del err - {e}{RESET}")
+ if event.guest_message:
+ await g_answer(data, message, text, title="ошибка врат")
+ elif event.message:
+ error_message = await message.reply(text)
+ await asyncio.sleep(7)
+ try:
+ await error_message.delete()
+ except Exception as e:
+ print(f"{YELLOW} -- del err - {e}{RESET}")
+ return
+
return
- last_command_time[user_id] = current_time
ensure_user(user_id)
-
- replied = message.reply_to_message
- prompt = ""
- try:
- await bot.send_chat_action(chat_id=message.chat.id, action="typing")
- except TelegramForbiddenError:
- return
-
- if replied and replied.poll:
- poll = replied.poll
- if poll.allows_multiple_answers:
- prompt += "<множественный "
- else:
- prompt += "<одиночный "
- prompt += f"опрос в ответе: {poll.question}>\n"
- for option in poll.options:
- prompt += f"- {option.text}\n"
- prompt += "</опрос в ответе>"
+ if event.message:
+ try:
+ await bot.send_chat_action(chat_id=message.chat.id, action="typing")
+ except TelegramForbiddenError:
+ return
- if message.poll:
- poll = message.poll
- if poll.allows_multiple_answers:
- prompt += "<множественный "
+ last_command_time[user_id] = current_time
+ msg = None
+ replied = message.reply_to_message or None
+ if replied:
+ replied_text = message.reply_to_message.text or message.reply_to_message.caption or None
else:
- prompt += "<одиночный "
- prompt += f"опрос: {poll.question}>\n"
- for option in poll.options:
- prompt += f"- {option.text}\n"
- prompt += "</опрос>"
-
- if message.document:
- if message.document.file_size > 4096:
- await message.reply("слишком много данных не хочу отвечать☝️☝️")
- return
-
- file_bytes = io.BytesIO()
-
- try:
- await bot.download(message.document, destination=file_bytes)
-
- file_bytes.seek(0)
- file_content = file_bytes.read().decode("utf-8", errors="ignore")
- file_bytes.close()
-
- prompt = f"<файл>{file_content}</файл>"
-
- except UnicodeDecodeError:
- await message.reply("файл не вошёл брат❌❌")
- return
-
- except Exception:
- await message.reply("файл не вошёл ало❌")
- return
-
- if replied and replied.document:
- if replied.document.file_size > 4096:
- await message.reply("файл не вошёл слишком много весит❌😡")
- return
-
- file_bytes = io.BytesIO()
-
- try:
- await bot.download(replied.document, destination=file_bytes)
- file_bytes.seek(0)
- file_content = file_bytes.read().decode("utf-8", errors="ignore")
- prompt = f"<файл>{file_content}</файл>{user_text}"
- except UnicodeDecodeError:
- await message.reply("файл не вошёл❌")
- return
- except Exception as e:
- print(f"{RED} -- {e}{RESET}")
- return
+ replied_text = None
+
+ prompt = ""
- if replied and replied.location:
- loc = replied.location
-
- prompt += (
- f"<ответ на локацию>\n"
- f"{loc.latitude}, {loc.longitude}\n"
- f"</ответ на локацию>\n"
- )
+ if message.document:
+ if message.document.file_size > 4096:
+ if event.guest_message:
+ await g_answer(data, message, "слишком много данных не хочу отвечать☝️☝️")
+ elif event.message:
+ await message.reply("слишком много данных не хочу отвечать☝️☝️")
+ return
+
+ file_bytes = io.BytesIO()
+
+ try:
+ await bot.download(message.document, destination=file_bytes)
+
+ file_bytes.seek(0)
+ file_content = file_bytes.read().decode("utf-8", errors="ignore")
+ file_bytes.close()
+
+ prompt = f"<файл>{file_content}</файл>"
+
+ except UnicodeDecodeError:
+ if event.guest_message:
+ await g_answer(data, message, "файл не вошёл брат❌❌")
+ elif event.message:
+ await message.reply("файл не вошёл брат❌❌")
+ return
+
+ except Exception:
+ if event.guest_message:
+ await g_answer(data, message, "файл не вошёл ало ошибка❌❌")
+ elif event.message:
+ await message.reply("файл не вошёл ало ошибка❌❌")
+ return
+
+ if replied and replied.document:
+ if replied.document.file_size > 4096:
+ if event.guest_message:
+ await g_answer(data, message, "слишком много данных не хочу отвечать☝️☝️")
+ elif event.message:
+ await message.reply("слишком много данных не хочу отвечать☝️☝️")
+ return
+
+ file_bytes = io.BytesIO()
+
+ try:
+ await bot.download(replied.document, destination=file_bytes)
+ file_bytes.seek(0)
+ file_content = file_bytes.read().decode("utf-8", errors="ignore")
+ prompt = f"<файл>{file_content}</файл>{user_text}"
+ except UnicodeDecodeError:
+ if event.guest_message:
+ await g_answer(data, message, "файл не вошёл❌")
+ elif event.message:
+ await message.reply("файл не вошёл❌")
+ return
+ except Exception as e:
+ print(f"{RED} -- {e}{RESET}")
+ return
+
+ if replied and replied.location:
+ loc = replied.location
+ prompt += (
+ f"<ответ на локацию>\n"
+ f"{loc.latitude}, {loc.longitude}\n"
+ f"</ответ на локацию>\n"
+ )
+
+ if message.location:
+ loc = message.location
+ prompt += (
+ f"<локация>\n"
+ f"{loc.latitude}, {loc.longitude}\n"
+ f"</локация>\n"
+ )
+
+ if replied and replied.poll:
+ poll = replied.poll
+ if poll.allows_multiple_answers:
+ prompt += "<множественный "
+ else:
+ prompt += "<одиночный "
+ prompt += f"опрос в ответе: {poll.question}>\n"
+ for option in poll.options:
+ prompt += f"- {option.text}\n"
+ prompt += "</опрос в ответе>"
- if message.location:
- loc = message.location
-
- prompt += (
- f"<локация>\n"
- f"{loc.latitude}, {loc.longitude}\n"
- f"</локация>\n"
- )
+ if message.poll:
+ poll = message.poll
+ if poll.allows_multiple_answers:
+ prompt += "<множественный "
+ else:
+ prompt += "<одиночный "
+ prompt += f"опрос: {poll.question}>\n"
+ for option in poll.options:
+ prompt += f"- {option.text}\n"
+ prompt += "</опрос>"
- elif replied and replied.photo and IMAGE_MODEL != "":
- try:
- if not msg:
- msg = await message.reply("👀")
- except Exception:
- return
- try:
- photo = replied.photo[-1]
- file_bytes = await bot.download(photo)
- image_bytes = file_bytes.read()
- b64_image = base64.b64encode(image_bytes).decode("utf-8")
- image_text = await image2text(image=b64_image)
- except Exception as e:
- image_text = "произошла ошибка при анализе фото"
- print(f"{RED} -- photo - {e}{RESET}")
- if replied.caption:
- prompt = f"<ответ на фото>{image_text}</ответ на фото>\n<подпись в ответе>{replied.caption}</подпись в ответе>\n"
- else:
- prompt = f"<ответ на фото>{image_text}</ответ на фото>\n<подпись в ответе>{replied.caption}\n"
- if not msg:
- await msg.edit_text("💬")
-
- elif replied and replied.text:
- replied_text = message.reply_to_message.text
- prompt = f"<ответил на сообщение> {replied_text} </ответил на сообщение>\n"
-
- if message.photo and IMAGE_MODEL != "":
- try:
- msg = await message.reply("👀")
- except Exception:
- return
- try:
- photo = message.photo[-1]
- file_bytes = await bot.download(photo)
- image_bytes = file_bytes.read()
- b64_image = base64.b64encode(image_bytes).decode("utf-8")
- image_text = await image2text(image=b64_image)
- except Exception as e:
- image_text = "произошла ошибка при анализе фото"
- print(f"{RED} -- photo - {e}{RESET}")
- prompt = f"<фото>{image_text}</фото>\n"
- await msg.edit_text("💬")
-
- prompt = f"{prompt}\n{user_text}"
- prompt = prompt[:MAX_PROMPT]
+ if replied and replied.photo and IMAGE_MODEL != "":
+ try:
+ photo = replied.photo[-1]
+ file_bytes = await bot.download(photo)
+ image_bytes = file_bytes.read()
+ b64_image = base64.b64encode(image_bytes).decode("utf-8")
+ image_text = await image2text(image=b64_image)
+ except Exception as e:
+ image_text = "произошла ошибка при анализе фото"
+ print(f"{RED} -- photo - {e}{RESET}")
+ prompt = f"{prompt}<фото в ответе>{image_text}</фото в ответе>\n"
+
+ if message.photo and IMAGE_MODEL != "":
+ try:
+ if event.message:
+ if not msg:
+ msg = await message.reply("👀")
+ photo = message.photo[-1]
+ file_bytes = await bot.download(photo)
+ image_bytes = file_bytes.read()
+ b64_image = base64.b64encode(image_bytes).decode("utf-8")
+ image_text = await image2text(image=b64_image)
+ except Exception as e:
+ image_text = "произошла ошибка при анализе фото"
+ print(f"{RED} -- photo - {e}{RESET}")
+ prompt = f"{prompt}<фото>{image_text}</фото>\n"
- try:
- await bot.send_chat_action(chat_id=message.chat.id, action="typing")
- except TelegramForbiddenError:
- return
+ if event.message:
+ if msg:
+ await msg.edit_text("💬")
+ if not msg and stream == "edit":
+ msg = await message.reply("💬")
+
+ prompt = f"{prompt}\n{user_text}"
+ if replied_text:
+ prompt = f"<ответ на>{replied_text}</ответ> {prompt}"
+ prompt = prompt[:MAX_PROMPT]
- if stream == "edit":
- if not msg:
+ if event.message:
try:
- msg = await message.reply("💬")
- except Exception:
+ await bot.send_chat_action(chat_id=message.chat.id, action="typing")
+ except TelegramForbiddenError:
return
- message_id = msg.message_id
- else:
- message_id = None
-
- if is_channel:
- result = await generate(
- bot=bot,
- prompt=prompt,
- chat_id=message.chat.id,
- user_id=None,
- message_id=message_id,
- )
- else:
- result = await generate(
- bot=bot,
- prompt=prompt,
- chat_id=message.chat.id,
- user_id=user_id,
- message_id=message_id,
- )
-
- result = parse_tools(result)
+ if stream == "edit":
+ 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 event.guest_message:
+ add_one_to("stats/guest")
+
try:
- if result:
+ if event.guest_message:
+ await g_answer(data, message, result)
+ elif event.message:
if msg:
if stream == "native":
await msg.delete()
@@ -452,18 +316,22 @@ async def text_handler(message: Message):
await message.reply(result)
except Exception as e:
try:
- if msg:
- if stream == "native":
- await msg.delete()
- await message.reply(result, parse_mode="None")
+ if event.guest_message:
+ await g_answer(data, message, result, parse_mode="None")
+ elif event.message:
+ if msg:
+ if stream == "native":
+ await msg.delete()
+ await message.reply(result, parse_mode="None")
+ else:
+ await msg.edit_text(result, parse_mode="None")
else:
- await msg.edit_text(result, parse_mode="None")
- else:
- await message.reply(result, parse_mode="None")
+ await message.reply(result, parse_mode="None")
except Exception as e:
- print(f"{RED} -- {e}{RESET}")
- return
- print(f"{YELLOW} -- {e}{RESET}")
+ print(f"{RED} -- send guest - {e}{RESET}")
+ else:
+ print(f"{YELLOW} -- markdown - {e}{RESET}")
+ return
@router.inline_query()