aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhuker667 <huker@tuta.io>2026-07-14 08:23:17 +0300
committerhuker667 <huker@tuta.io>2026-07-14 08:23:17 +0300
commit2cce59fb5806633db002d4145070035414e9c42d (patch)
tree569b1c2e0e58384cb5a10903ffc94592e0c4a3cd
parentb3f345838899498eee98e16e86e7c3dcba092864 (diff)
downloaduzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.tar.gz
uzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.tar.bz2
uzbekgpt-2cce59fb5806633db002d4145070035414e9c42d.zip
add new markdown
-rw-r--r--callbacks.py130
-rw-r--r--commands.py56
-rw-r--r--helpers.py31
-rw-r--r--main.py76
-rw-r--r--prompts.py14
-rw-r--r--requirements.txt2
-rw-r--r--supergenerator.py37
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
diff --git a/helpers.py b/helpers.py
index d42b315..b94ef05 100644
--- a/helpers.py
+++ b/helpers.py
@@ -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
+ )
)
)
diff --git a/main.py b/main.py
index a603e2f..2b2aa94 100644
--- a/main.py
+++ b/main.py
@@ -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
diff --git a/prompts.py b/prompts.py
index 02b14eb..f00d8aa 100644
--- a/prompts.py
+++ b/prompts.py
@@ -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: