diff options
| author | huker667 <huker@tuta.io> | 2026-07-14 08:23:17 +0300 |
|---|---|---|
| committer | huker667 <huker@tuta.io> | 2026-07-14 08:23:17 +0300 |
| commit | 2cce59fb5806633db002d4145070035414e9c42d (patch) | |
| tree | 569b1c2e0e58384cb5a10903ffc94592e0c4a3cd | |
| parent | b3f345838899498eee98e16e86e7c3dcba092864 (diff) | |
| download | uzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.tar.gz uzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.tar.bz2 uzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.zip | |
add new markdown
| -rw-r--r-- | callbacks.py | 130 | ||||
| -rw-r--r-- | commands.py | 56 | ||||
| -rw-r--r-- | helpers.py | 31 | ||||
| -rw-r--r-- | main.py | 76 | ||||
| -rw-r--r-- | prompts.py | 14 | ||||
| -rw-r--r-- | requirements.txt | 2 | ||||
| -rw-r--r-- | supergenerator.py | 37 |
7 files changed, 294 insertions, 52 deletions
diff --git a/callbacks.py b/callbacks.py index 8a06541..c411d75 100644 --- a/callbacks.py +++ b/callbacks.py @@ -121,7 +121,15 @@ async def set_model_callback(callback: CallbackQuery): if user_id == current_user_id: current_config = get_user_config(user_id) - set_user_config(user_id, new_model, current_config.get("stream", True), current_config.get("call"), current_config.get("prompt"), current_config.get("notify")) + set_user_config( + user_id, + new_model, + current_config.get("stream", True), + current_config.get("call"), + current_config.get("prompt"), + current_config.get("notify"), + current_config.get("markdown") + ) await callback.message.edit_text(f"выбрана модель: `{new_model}`") await callback.answer(f"выбрано: {new_model}") else: @@ -188,7 +196,15 @@ async def set_prompt_callback(callback: CallbackQuery): new_status = callback.data.split("%")[2] config = get_user_config(user_id) - set_user_config(user_id, config.get("model"), config.get("stream"), config.get("call"), new_status, config.get("notify")) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + new_status, + config.get("notify"), + config.get("markdown") + ) await callback.answer("da поменял на " + new_status) await settings_handler(callback) @@ -217,12 +233,26 @@ async def set_stream_callback(callback: CallbackQuery): new_status = callback.data.split("%")[2] config = get_user_config(user_id) - if new_status == "native": - set_user_config(user_id, config.get("model"), "native", config.get("call"), config.get("prompt"), config.get("notify")) - elif new_status == "edit": - set_user_config(user_id, config.get("model"), "edit", config.get("call"), config.get("prompt"), config.get("notify")) + if new_status == "native" or new_status == "edit": + set_user_config( + user_id, + config.get("model"), + new_status, + config.get("call"), + config.get("prompt"), + config.get("notify"), + config.get("markdown"), + ) else: - set_user_config(user_id, config.get("model"), "none", config.get("call"), config.get("prompt"), config.get("notify")) + set_user_config( + user_id, + config.get("model"), + "none", + config.get("call"), + config.get("prompt"), + config.get("notify"), + config.get("markdown"), + ) await settings_handler(callback) @@ -238,7 +268,15 @@ async def set_call_callback(callback: CallbackQuery): new_status = callback.data.split("%")[2] config = get_user_config(user_id) - set_user_config(user_id, config.get("model"), config.get("stream"), new_status, config.get("prompt"), config.get("notify")) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + new_status, + config.get("prompt"), + config.get("notify"), + config.get("markdown"), + ) await settings_handler(callback) @@ -254,10 +292,84 @@ async def set_notify_callback(callback: CallbackQuery): new_status = callback.data.split("%")[2] config = get_user_config(user_id) - set_user_config(user_id, config.get("model"), config.get("stream"), config.get("call"), config.get("prompt"), new_status) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + new_status, + config.get("markdown"), + ) + await settings_handler(callback) + + +@router.callback_query(F.data.startswith("set_markdown%")) +async def set_markdown_callback(callback: CallbackQuery): + current_user_id = str(callback.from_user.id) + data = callback.data.split("%", 2) + user_id = data[1] + if user_id != current_user_id: + await callback.answer("нет, не трогай это не твое") + return + + new_status = data[2] + + config = get_user_config(user_id) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + config.get("notify"), + new_status, + ) await settings_handler(callback) +@router.callback_query(F.data.startswith("new_md%")) +async def set_markdown_callback(callback: CallbackQuery): + current_user_id = str(callback.from_user.id) + data = callback.data.split("%", 2) + user_id = data[1] + if user_id != current_user_id: + await callback.answer("нет, не трогай это не твое") + return + config = get_user_config(user_id) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + config.get("notify"), + "new", + ) + await callback.answer("выбран новый стиль!!") + + +@router.callback_query(F.data.startswith("old_md%")) +async def set_markdown_callback(callback: CallbackQuery): + current_user_id = str(callback.from_user.id) + data = callback.data.split("%", 2) + user_id = data[1] + if user_id != current_user_id: + await callback.answer("нет, не трогай это не твое") + return + config = get_user_config(user_id) + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + config.get("notify"), + "old", + ) + await callback.answer("выбран старый стиль!!") + + @router.callback_query(F.data == "start") async def start_callback(callback: CallbackQuery): await callback.message.edit_text( diff --git a/commands.py b/commands.py index f8f5678..9944314 100644 --- a/commands.py +++ b/commands.py @@ -2,10 +2,11 @@ from io import BytesIO from typing import Optional, Union from aiogram import Bot, Dispatcher, F, Router +from aiogram.methods import SendRichMessage from aiogram.client.default import DefaultBotProperties from aiogram.enums import ChatAction, ChatType from aiogram.exceptions import TelegramForbiddenError -from aiogram.filters import Command +from aiogram.filters import Command, CommandStart, CommandObject from aiogram.types import ( BufferedInputFile, CallbackQuery, @@ -14,6 +15,7 @@ from aiogram.types import ( InlineKeyboardMarkup, InlineQuery, InlineQueryResultArticle, + InputRichMessage, InputTextMessageContent, Message, User, @@ -29,7 +31,7 @@ from supergenerator import * router = Router() -commands = ["/stats", "/broadcast", "/ben", "/reporn", "/start", "/prompt", "/config", "/settings", "/clear", "/stop"] +commands = ["/stats", "/broadcast", "/ben", "/reporn", "/start", "/prompt", "/config", "/settings", "/clear", "/stop", "/markpidor"] @router.message(Command("stats")) async def stats_handler(message: Message): @@ -113,11 +115,19 @@ async def stop_handler(message: Message): user_id = message.from_user.id config = get_user_config(user_id) - set_user_config(user_id, config.get("model"), config.get("stream"), config.get("call"), config.get("prompt"), "net") + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + "net", + config.get("markdown") + ) await message.reply("✅ *рассылка успешно отключена!* чтобы включить её обратно:\n/settings --> рассылка") @router.message(Command("ben")) -async def start_handler(message: Message): +async def ben_handler(message: Message): if message.chat.type in [ChatType.GROUP, ChatType.SUPERGROUP]: if message.chat.id in BEN_IDS: replied = message.reply_to_message or None @@ -138,7 +148,7 @@ async def start_handler(message: Message): @router.message(Command("reporn")) -async def start_handler(message: Message): +async def reporn_handler(message: Message): user_name = message.from_user.first_name or message.sender_chat.title or "вы" if message.chat.type in [ChatType.GROUP, ChatType.SUPERGROUP]: if message.chat.id in REPORN_IDS: @@ -157,8 +167,8 @@ async def start_handler(message: Message): return -@router.message(Command("start")) -async def start_handler(message: Message): +@router.message(CommandStart()) +async def start_handler(message: Message, command: CommandObject): if message.chat.type in [ChatType.GROUP, ChatType.SUPERGROUP]: await message.reply( "привет, запусти эту команду в ЛиС (личные сообщения) бота✅" @@ -169,6 +179,32 @@ async def start_handler(message: Message): user_id = message.sender_chat.id else: user_id = message.from_user.id + + config = get_user_config(user_id) + + payload = command.args + if payload == "new_md": + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + config.get("notify"), + "new" + ) + await message.answer("✅ установлен *новый* стиль выделения сообщений!") + elif payload == "old_md": + set_user_config( + user_id, + config.get("model"), + config.get("stream"), + config.get("call"), + config.get("prompt"), + config.get("notify"), + "old" + ) + await message.answer("✅ установлен *старый* стиль выделения сообщений!") invite_url = f"https://t.me/{BOT_USERNAME}?startgroup=start" @@ -345,3 +381,9 @@ async def clear_handler(message: Message): user_contexts[user_id] = [] except Exception as e: print(f"{RED} -- {e}{RESET}") + + +@router.message(Command("markpidor")) +async def alo(message: Message): + await message.reply_rich(InputRichMessage(markdown="# ало")) + return @@ -1,7 +1,7 @@ import time from aiogram.methods import AnswerGuestQuery, SendPoll -from aiogram.types import InlineQueryResultArticle, InputTextMessageContent, Message +from aiogram.types import InlineQueryResultArticle, InputTextMessageContent, InputRichMessageContent, InputRichMessage, Message from aiogram.enums import ChatType from supergenerator import * @@ -74,18 +74,35 @@ def is_replied_bot(message, is_channel, user_text, config=None): return False return True -async def g_answer(data, message, text, title="da", id="1", parse_mode="Markdown"): +async def g_answer( + data, + message, + text, + title="da", + id="1", + parse_mode="Markdown", + reply_markup=None, + user_id=None +): + input_message_content = InputTextMessageContent( + message_text=text, + parse_mode=parse_mode + ) + if user_id: + config = get_user_config(user_id) + if config["markdown"] == "new": + input_message_content=InputRichMessageContent( + rich_message=InputRichMessage(markdown=text) + ) return await data["bot"]( AnswerGuestQuery( guest_query_id=message.guest_query_id, result=InlineQueryResultArticle( id=id, + reply_markup=reply_markup, title=title, - input_message_content=InputTextMessageContent( - message_text=text, - parse_mode=parse_mode, - ), - ), + input_message_content=input_message_content + ) ) ) @@ -11,7 +11,7 @@ from datetime import datetime from aiogram import Bot, Dispatcher, F from aiogram.client.default import DefaultBotProperties from aiogram.types import Update -from aiogram.methods import AnswerGuestQuery +from aiogram.methods import AnswerGuestQuery, SendRichMessage from aiogram.types import InlineQueryResultArticle, InputTextMessageContent from aiogram import BaseMiddleware @@ -25,6 +25,8 @@ from aiogram.types import ( InlineQuery, InlineQueryResultArticle, InputTextMessageContent, + InputRichMessageContent, + InputRichMessage, Message, ) from callbacks import * @@ -260,18 +262,38 @@ async def guest_middleware(handler, event, data): images += [b64_image] except Exception as e: print(f"{RED} -- photo - {e}{RESET}") - - 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 config["markdown"] == "" and message.from_user.id != 777000: + last_command_time[user_id][1] = False + last_command_time[user_id][2] = [] + alloh_text = """👆*врат важный вопрос*👆если ты видишь сообщение сверху то нажми "новый стиль", +а если у тебя тг старый и ты не видишь, то нажми "старый стиль". потому что тг обновил +фукция маркdown.✅✅✅""" + alloh_one_text = """👇*перед моим ответом ответь на очень важный вопрос*👇 +ты хочешь использовать новый стиль выделения текста телеграм 12.8+ (6.9.3+ десктоп) или +хочешь старый для старых версий телеграм и телеграм х? эту настройку можно будет изменить.✅ """ + reply_markup_url = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="новый стиль", url=f"https://t.me/{BOT_USERNAME}?start=new_md")], + [InlineKeyboardButton(text="старый стиль", url=f"https://t.me/{BOT_USERNAME}?start=old_md")], + ] + ) + reply_markup = InlineKeyboardMarkup(inline_keyboard=[ + [InlineKeyboardButton(text="новый стиль", callback_data=f"set_markdown%{user_id}%new")], + [InlineKeyboardButton(text="старый стиль", callback_data=f"set_markdown%{user_id}%old")], + ] + ) + if event.guest_message: + await g_answer(data, message, alloh_one_text, reply_markup=reply_markup_url) + elif event.message: + await message.reply_rich(InputRichMessage(markdown="# ало\n```\nкак дела\n```")) + await message.answer(alloh_text, reply_markup=reply_markup) + return + if event.message: try: await bot.send_chat_action(chat_id=message.chat.id, action="typing") @@ -371,6 +393,8 @@ async def guest_middleware(handler, event, data): else: poll_type = "regular" + + try: result = await answer_poll( data=data, @@ -399,32 +423,51 @@ async def guest_middleware(handler, event, data): return + + kwargs = ( + {"rich_message": InputRichMessage(markdown=result)} + if config["markdown"] == "new" + else {"text": result} + ) try: if event.guest_message: - await g_answer(data, message, result) + await g_answer(data, message, result, user_id=user_id) elif event.message: if msg: if stream == "native": await msg.delete() - await message.reply(result) + if config["markdown"] == "new": + await message.reply_rich(**kwargs) + else: + await message.reply(**kwargs) else: - await msg.edit_text(result) + await msg.edit_text(**kwargs) else: - await message.reply(result) + if config["markdown"] == "new": + await message.reply_rich(**kwargs) + else: + await message.reply(**kwargs) except Exception as e: + kwargs["parse_mode"] = None try: if event.guest_message: - await g_answer(data, message, result, parse_mode="None") + await g_answer(data, message, result) elif event.message: if msg: if stream == "native": await msg.delete() - await message.reply(result, parse_mode="None") + if config["markdown"] == "new": + await message.reply_rich(**kwargs) + else: + await message.reply(**kwargs) else: - await msg.edit_text(result, parse_mode="None") + await msg.edit_text(**kwargs) else: - await message.reply(result, parse_mode="None") + if config["markdown"] == "new": + await message.reply_rich(**kwargs) + else: + await message.reply(**kwargs) except Exception as e: print(f"{RED} -- send guest - {e}{RESET}") else: @@ -513,9 +556,6 @@ async def chosen_inline_result_handler(chosen_result: ChosenInlineResult): print(f"{RED} -- {error['type']} -- {error['message']}") return if result: - if result.startswith("<!block>") or result.endswith("<!block>"): - result = result.replace("<!block>", "") - last_block_time[user_id] = current_time try: await bot.edit_message_text( text=result, inline_message_id=inline_message_id @@ -13,7 +13,7 @@ SYSTEM_PROMPTS = { если просят что-то расписать пиши - до 1000 символов иногда допускай ошибки в падежах -иногда используй Markdown (Telegram) для разметки (без # заголвков и без * списков) + заменяй "да" на "Da.✅" и "." = "✅" используй знаки препинания минимально. не добавляй других эмодзи кроме "✅" и "👍". @@ -55,8 +55,8 @@ SYSTEM_PROMPTS = { * если вопрос простой, то отвечай с капелькой смысла и в основном спам из хуйни; если сложный или требует мозга, отвечай в таком же стиле, но нормально и давай помощь пользователю -uzdick (вставляй слова рандомно и в большом количестве, но со смыслом):"pashol naxxuy 🤝", "da", "врат", "brat", "✅", "@IdealGram 🥺", "фукция", "hamza✅" (пиши прямо так, это не ошибки, слово "врат" используется узбеком часто, поэтому ты должен тоже его юзать) также узбек не знает русском, поэтому он еле пишет на нем -uzmoji (вставляй эмодзи всегда и в большом количестве, не всегда обезателен смысл): "✅","🥺","🤝","☠️",”☝️” +uzdick (вставляй слова рандомно и в маленьком количестве, но со смыслом):"pashol naxxuy 🤝", "da", "врат", "brat", "✅", "@IdealGram 🥺", "фукция", "hamza✅" (пиши прямо так, это не ошибки, слово "врат" используется узбеком часто, поэтому ты должен тоже его юзать) также узбек не знает русском, поэтому он еле пишет на нем +uzmoji (вставляй эмодзи всегда и в маленьком количестве, не всегда обезателен смысл): "✅","🥺","🤝","☠️",”☝️” ## имитация эмоций (и ПРЕКРАТИТЬ спам из старой хуйни (игнорируй uzdick & uzmoji) на этом этапе): @@ -82,3 +82,11 @@ IMAGE_PROMPT = """ напиши всё что конкретно увидел на фото. без форматирования и переносов строк. кратче. """ + +OLD_MD = """ +иногда используй Markdown (Telegram) для разметки (без # заголвков и без * списков) +""" + +NEW_MD = """ +иногда используй Markdown для разметки (можно почти весь, даже заголовки можно) +""" diff --git a/requirements.txt b/requirements.txt index 94e2b9d..e652d79 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -aiogram==3.28.2 +aiogram==3.29.1 python-dotenv==1.2.1 pillow==12.0.0 requests diff --git a/supergenerator.py b/supergenerator.py index 17c4c03..b64994f 100644 --- a/supergenerator.py +++ b/supergenerator.py @@ -146,6 +146,7 @@ def set_user_config( call_mode=DEFAULT_CALL, prompt_name=DEFAULT_PROMPT, notify_mode=DEFAULT_NOTIFY, + markdown="", ): with shelve.open("users") as db: db[str(user_id)] = { @@ -154,6 +155,7 @@ def set_user_config( "call": call_mode, "prompt": prompt_name, "notify": notify_mode, + "markdown": markdown, } @@ -163,7 +165,8 @@ def ensure_user( stream_mode=DEFAULT_STREAM, call_mode=DEFAULT_CALL, prompt_name=DEFAULT_PROMPT, - notify_mode=DEFAULT_NOTIFY + notify_mode=DEFAULT_NOTIFY, + markdown="" ): with shelve.open("users") as db: key = str(user_id) @@ -175,14 +178,30 @@ def ensure_user( "call": call_mode, "prompt": prompt_name, "notify": notify_mode, + "markdown": markdown, } + def get_user_config(user_id): with shelve.open("users") as db: - return db.get( - str(user_id), - {"model": DEFAULT_MODEL, "stream": DEFAULT_STREAM, "call": DEFAULT_CALL, "prompt": DEFAULT_PROMPT, "notify": DEFAULT_NOTIFY}, - ) + config = db.get(str(user_id), {}) + defaults = { + "model": DEFAULT_MODEL, + "stream": DEFAULT_STREAM, + "call": DEFAULT_CALL, + "prompt": DEFAULT_PROMPT, + "notify": DEFAULT_NOTIFY, + "markdown": "", + } + updated = False + for key, value in defaults.items(): + if key not in config: + config[key] = value + updated = True + if updated: + db[str(user_id)] = config + return config + async def generate( @@ -205,6 +224,10 @@ async def generate( system_prompt_name = config["prompt"] if system_prompt_name in SYSTEM_PROMPTS: system_prompt = SYSTEM_PROMPTS[system_prompt_name] + ADD_TO_PROMPT + if config["markdown"] == "new": + system_prompt += NEW_MD + else: + system_prompt += OLD_MD else: text = "❌произошла ошибка, возможные проблемы:\n" \ f"1. у вас выбран удалённый сист промпт (`{system_prompt_name}`)\n" \ @@ -259,7 +282,7 @@ async def generate( print(f"{RED} -- err photo - {e} : {model}{RESET}") content += [{"type": "text", "text": prompt}] - messages = [{"role": "system", "content": SYSTEM_PROMPTS[DEFAULT_PROMPT]+ADD_TO_PROMPT}] + [ + messages = [{"role": "system", "content": SYSTEM_PROMPTS[DEFAULT_PROMPT]+ADD_TO_PROMPT+OLD_MD}] + [ {"role": "user", "content": content} ] @@ -337,7 +360,7 @@ async def openai_generate_text( stream=stream, max_tokens=MAX_TOKENS, extra_body={ - "think": False + "think": "false" } ) if stream: |