2026-05-22 19:34:48 +03:00
from io import BytesIO
from typing import Optional , Union
from aiogram import Bot , Dispatcher , F , Router
2026-07-14 08:23:17 +03:00
from aiogram.methods import SendRichMessage
2026-05-22 19:34:48 +03:00
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ChatAction , ChatType
from aiogram.exceptions import TelegramForbiddenError
2026-07-14 08:23:17 +03:00
from aiogram.filters import Command , CommandStart , CommandObject
2026-05-22 19:34:48 +03:00
from aiogram.types import (
BufferedInputFile ,
CallbackQuery ,
ChosenInlineResult ,
InlineKeyboardButton ,
InlineKeyboardMarkup ,
InlineQuery ,
InlineQueryResultArticle ,
2026-07-14 08:23:17 +03:00
InputRichMessage ,
2026-05-22 19:34:48 +03:00
InputTextMessageContent ,
Message ,
User ,
)
from aiogram.utils.deep_linking import create_start_link
2026-05-23 18:09:50 +03:00
from collections import Counter
2026-05-22 19:34:48 +03:00
from colors import *
from config import *
2026-05-23 18:09:50 +03:00
from statistics import *
2026-05-22 19:34:48 +03:00
from supergenerator import *
router = Router ()
2026-07-14 08:23:17 +03:00
commands = [ "/stats" , "/broadcast" , "/ben" , "/reporn" , "/start" , "/prompt" , "/config" , "/settings" , "/clear" , "/stop" , "/markpidor" ]
2026-05-24 22:26:14 +03:00
2026-05-23 18:09:50 +03:00
@router.message ( Command ( "stats" ))
async def stats_handler ( message : Message ):
users = get_all_users ()
total_users = len ( users )
models = Counter ()
streams = Counter ()
calls = Counter ()
2026-07-05 17:06:11 +03:00
prompts = Counter ()
2026-05-23 18:09:50 +03:00
for data in users . values ():
if isinstance ( data , dict ):
models [ data . get ( "model" )] += 1
streams [ data . get ( "stream" )] += 1
calls [ data . get ( "call" )] += 1
2026-07-05 17:06:11 +03:00
prompts [ data . get ( "prompt" )] += 1
2026-05-23 18:09:50 +03:00
2026-07-05 17:06:11 +03:00
top_models = models . most_common ( 5 )
top_streams = streams . most_common ( 2 )
top_prompts = prompts . most_common ( 5 )
2026-05-23 18:09:50 +03:00
text = [
"✅ *общая статистика*" ,
f "☝️пользователей: { total_users } " ,
f "📞всего генераций: { get_stats ( 'stats/gens' ) } " ,
f "👻ген в гостевом: { get_stats ( 'stats/guest' ) } " ,
f "🙏ген в инлайне: { get_stats ( 'stats/inline' ) } " ,
f "🤝ben: { get_stats ( 'stats/ben' ) } " ,
f "🤝reporn: { get_stats ( 'stats/reporn' ) } " ,
2026-07-05 17:06:11 +03:00
"🥺топ 5 моделей:" ,
2026-05-23 18:09:50 +03:00
* ( f "- ` { m } `: { c } " for m , c in top_models ),
"✍️топ режимов стрима:" ,
* ( f "- ` { s } `: { c } " for s , c in top_streams ),
"👀топ режимов вызова:" ,
* ( f "- ` { c } `: { n } " for c , n in calls . most_common ()),
2026-07-05 17:06:11 +03:00
"📝топ 5 промптов:" ,
* ( f "- ` { c } `: { n } " for c , n in prompts . most_common ()),
2026-05-23 18:09:50 +03:00
]
await message . reply ( " \n " . join ( text ))
2026-05-22 19:34:48 +03:00
@router.message ( Command ( "broadcast" ))
async def broadcast_handler ( message : Message ):
if message . from_user . id != ADMIN_ID :
return await message . reply ( "🚫 pashol naxxuy." )
text = message . text . removeprefix ( "/broadcast" ) . strip ()
if not text :
return await message . reply ( "🚫 напиши текст после команды ало." )
2026-07-05 17:06:11 +03:00
users = get_all_user_ids ( only_notify = True )
2026-05-22 19:34:48 +03:00
success = 0
failed = 0
for user_id in users :
try :
if user_id > 0 :
await message . bot . send_message ( user_id , text )
success += 1
except TelegramForbiddenError :
failed += 1
except Exception as e :
print ( f " { RED } -- broadcast err - { e }{ RESET } " )
failed += 1
await message . reply (
f "✅ *готово врат.* \n - успешно: { success } \n - не удалось: { failed } "
)
2026-07-05 17:06:11 +03:00
@router.message ( Command ( "stop" ))
async def stop_handler ( message : Message ):
if message . sender_chat :
user_id = message . sender_chat . id
else :
user_id = message . from_user . id
config = get_user_config ( user_id )
2026-07-14 08:23:17 +03:00
set_user_config (
user_id ,
config . get ( "model" ),
config . get ( "stream" ),
config . get ( "call" ),
config . get ( "prompt" ),
"net" ,
config . get ( "markdown" )
)
2026-07-05 17:06:11 +03:00
await message . reply ( "✅ *рассылка успешно отключена!* чтобы включить её обратно: \n /settings --> рассылка" )
2026-05-22 21:06:49 +03:00
@router.message ( Command ( "ben" ))
2026-07-14 08:23:17 +03:00
async def ben_handler ( message : Message ):
2026-05-22 21:06:49 +03:00
if message . chat . type in [ ChatType . GROUP , ChatType . SUPERGROUP ]:
2026-05-24 22:43:22 +03:00
if message . chat . id in BEN_IDS :
replied = message . reply_to_message or None
if replied :
name = replied . from_user . first_name
ben_id = replied . from_user . id
else :
name = message . from_user . first_name
ben_id = message . from_user . id
await message . reply (
f " { name } ( { ben_id } ) заbenен за Botting, spamming, and coordinated inauthentic behavior.😡✅ \n "
f "админ: Ben (958011829)✅"
)
add_one_to ( "stats/ben" )
2026-05-22 21:06:49 +03:00
return
@router.message ( Command ( "reporn" ))
2026-07-14 08:23:17 +03:00
async def reporn_handler ( message : Message ):
2026-05-22 21:06:49 +03:00
user_name = message . from_user . first_name or message . sender_chat . title or "вы"
if message . chat . type in [ ChatType . GROUP , ChatType . SUPERGROUP ]:
2026-05-24 22:43:22 +03:00
if message . chat . id in REPORN_IDS :
replied = message . reply_to_message or None
if replied :
name = replied . from_user . first_name
ben_id = replied . from_user . id
else :
name = message . from_user . first_name
ben_id = message . from_user . id
await message . reply (
f "отправлен репорт на { name } ( { ben_id } )!📞"
)
add_one_to ( "stats/reporn" )
2026-05-22 21:06:49 +03:00
return
2026-07-14 08:23:17 +03:00
@router.message ( CommandStart ())
async def start_handler ( message : Message , command : CommandObject ):
2026-05-22 19:34:48 +03:00
if message . chat . type in [ ChatType . GROUP , ChatType . SUPERGROUP ]:
await message . reply (
"привет, запусти эту команду в ЛиС (личные сообщения) бота✅"
)
return
if message . sender_chat :
user_id = message . sender_chat . id
else :
user_id = message . from_user . id
2026-07-14 08:23:17 +03:00
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 ( "✅ установлен *старый* стиль выделения сообщений!" )
2026-05-22 19:34:48 +03:00
invite_url = f "https://t.me/ { BOT_USERNAME } ?startgroup=start"
keyboard = InlineKeyboardMarkup (
inline_keyboard = [
[ InlineKeyboardButton ( text = "команды" , callback_data = "start" )],
[
InlineKeyboardButton (
text = "настройки" , callback_data = f "settings% { user_id } "
)
],
[ InlineKeyboardButton ( text = "добавить в группу" , url = invite_url )],
]
)
try :
await message . reply (
"Привет, я УзбекГПТ✅ национальный бот Узбикестан и я готов не помочь. Напиши любае сообщение или отправь файл чтоб я быстра ответил!1!1 Или нажми кнопку ниже чтоба посмотрет мои команды.." ,
reply_markup = keyboard ,
)
except Exception as e :
print ( f " { RED } -- { e }{ RESET } " )
@router.message ( Command ( "prompt" ))
async def prompt_handler ( message : Message ):
2026-07-05 17:06:11 +03:00
if message . sender_chat :
user_id = message . sender_chat . id
else :
user_id = message . from_user . id
config = get_user_config ( user_id )
system_prompt_name = config [ "prompt" ]
if system_prompt_name in SYSTEM_PROMPTS :
system_prompt = SYSTEM_PROMPTS [ system_prompt_name ]
else :
await message . reply (
f "🤝 произошла ошибка при отображении промпта ` { system_prompt_name } ` \n *для фото*: ```prompt \n { IMAGE_PROMPT } ```изменить системный промпт узбекгпт пока что нельзя."
)
return
2026-05-22 19:34:48 +03:00
if PROMPT_COMMAND :
await message . reply (
2026-07-05 17:06:11 +03:00
f "🤝 *ваш выбранный промпт* ` { system_prompt_name } `: ```prompt \n { system_prompt } ``` \n *для фото*: ```prompt \n { IMAGE_PROMPT } ``` \n изменить системный промпт узбекгпт пока что нельзя."
2026-05-22 19:34:48 +03:00
)
else :
if SHOW_ACC_MSG :
await message . reply (
"🚫 *данный команда отключен в этом боте.* попросите владельца включить🤝"
)
2026-07-05 17:06:11 +03:00
return
2026-05-22 19:34:48 +03:00
@router.message ( Command ( "config" ))
async def config_handler ( message : Message ):
if CONFIG_COMMAND :
await message . reply (
f "🤝 *конфиг узбекгпт*: \n `MAX_CONTEXT` = ` { MAX_CONTEXT } ` \n `MAX_PROMPT` = ` { MAX_PROMPT } ` \n "
f "`DEFAULT_MODEL` = ` { DEFAULT_MODEL } ` \n `IMAGE_MODEL` = ` { IMAGE_MODEL } ` \n "
f "`DEFAULT_STREAM` = ` { DEFAULT_STREAM } ` \n "
2026-07-05 14:52:57 +03:00
"/settings для изменения настроек!"
2026-05-22 19:34:48 +03:00
)
else :
if SHOW_ACC_MSG :
await message . reply (
"🚫 *данный команда отключен в этом боте.* попросите владельца включить🤝"
)
async def settings_handler ( event : Union [ Message , CallbackQuery ]):
user_id = (
event . sender_chat . id
if isinstance ( event , Message ) and event . sender_chat
else event . from_user . id
)
config = get_user_config ( user_id )
models_count = sum ( len ( models ) for models in MODELS . values ())
2026-07-05 17:06:11 +03:00
prompts_count = len ( SYSTEM_PROMPTS )
2026-05-22 19:34:48 +03:00
if config [ "stream" ] == "native" :
stream_status = "натив"
stream_cb = "edit"
elif config [ "stream" ] == "edit" :
stream_status = "редакт"
stream_cb = "none"
else :
stream_status = "net"
stream_cb = "native"
if config [ "call" ] == "da" :
call_status = "da"
call_cb = "net"
else :
call_status = "net"
call_cb = "da"
2026-07-05 17:06:11 +03:00
if config [ "notify" ] == "da" :
notify_status = "da"
notify_cb = "net"
else :
notify_status = "net"
notify_cb = "da"
2026-05-22 19:34:48 +03:00
keyboard = InlineKeyboardMarkup (
inline_keyboard = [
[
InlineKeyboardButton (
text = f "модели ( { models_count } )" , callback_data = f "models% { user_id } "
)
],
2026-07-05 17:06:11 +03:00
[
InlineKeyboardButton (
text = f "промпты ( { prompts_count } )" , callback_data = f "prompts% { user_id } "
)
],
2026-05-22 19:34:48 +03:00
[
InlineKeyboardButton (
text = f "стрим: { stream_status } " ,
callback_data = f "set_stream% { user_id } % { stream_cb } " ,
)
],
[
InlineKeyboardButton (
text = f "отклик: { call_status } " ,
callback_data = f "set_call% { user_id } % { call_cb } " ,
)
],
2026-07-05 17:06:11 +03:00
[
InlineKeyboardButton (
text = f "рассылка: { notify_status } " ,
callback_data = f "set_notify% { user_id } % { notify_cb } " ,
)
],
2026-06-18 22:04:23 +03:00
[ InlineKeyboardButton ( text = "донат" , callback_data = f "donate% { user_id } " )],
2026-05-22 19:34:48 +03:00
[ InlineKeyboardButton ( text = "о боте" , callback_data = f "about% { user_id } " )],
]
)
2026-07-05 17:27:44 +03:00
text = f "⚡ *алло узбекгпт настройки* \n текущая модель: ` { config . get ( 'model' ) } ` \n " \
f "текущий промпт: ` { config . get ( 'prompt' ) } `"
2026-05-22 19:34:48 +03:00
if isinstance ( event , Message ):
await event . reply ( text , reply_markup = keyboard )
else :
await event . message . edit_text ( text , reply_markup = keyboard )
await event . answer ()
@router.message ( Command ( "settings" ))
async def settings_command ( message : Message ):
if not SETTINGS_COMMAND :
if SHOW_ACC_MSG :
await message . reply (
"🚫 *данный команда отключен в этом боте.* попросите владельца включить🤝"
)
return
await settings_handler ( message )
@router.message ( Command ( "clear" ))
async def clear_handler ( message : Message ):
if not CLEAR_COMMAND :
if SHOW_ACC_MSG :
await message . reply (
"🚫 *данный команда отключен в этом боте.* попросите владельца включить🤝"
)
return
user_id = message . sender_chat . id if message . sender_chat else message . from_user . id
user_contexts [ user_id ] = []
try :
await message . reply ( "контекст очищен. ✅" )
except TelegramForbiddenError as e :
user_contexts [ user_id ] = []
except Exception as e :
print ( f " { RED } -- { e }{ RESET } " )
2026-07-14 08:23:17 +03:00
@router.message ( Command ( "markpidor" ))
async def alo ( message : Message ):
await message . reply_rich ( InputRichMessage ( markdown = "# ало" ))
return