MissKatyPyro/misskaty/plugins/lang_setting.py
Yasir Aris M c5009b46b1
Pyromod: Fix listener timeout
Signed-off-by: Yasir Aris M <git@yasirdev.my.id>
2023-11-27 10:28:23 +07:00

120 lines
3.2 KiB
Python

from functools import partial
from typing import Union
from pyrogram import filters
from pyrogram.enums import ChatType
from pyrogram.errors import ListenerTimeout
from pyrogram.types import (
CallbackQuery,
InlineKeyboardButton,
InlineKeyboardMarkup,
Message,
)
from database.locale_db import set_db_lang
from misskaty import app
from misskaty.vars import COMMAND_HANDLER
from ..core.decorator.permissions import require_admin
from ..helper.localization import (
default_language,
get_locale_string,
langdict,
use_chat_lang,
)
def gen_langs_kb():
langs = list(langdict)
kb = []
while langs:
lang = langdict[langs[0]]["main"]
a = [
InlineKeyboardButton(
f"{lang['language_flag']} {lang['language_name']}",
callback_data=f"set_lang {langs[0]}",
)
]
langs.pop(0)
if langs:
lang = langdict[langs[0]]["main"]
a.append(
InlineKeyboardButton(
f"{lang['language_flag']} {lang['language_name']}",
callback_data=f"set_lang {langs[0]}",
)
)
langs.pop(0)
kb.append(a)
return kb
@app.on_callback_query(filters.regex("^chlang$"))
@app.on_message(filters.command(["setchatlang", "setlang"], COMMAND_HANDLER))
@require_admin(allow_in_private=True)
@use_chat_lang()
async def chlang(_, m: Union[CallbackQuery, Message], strings):
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
*gen_langs_kb(),
[
InlineKeyboardButton(
strings("back_btn", context="general"), callback_data="start_back"
)
],
]
)
if isinstance(m, CallbackQuery):
msg = m.message
sender = msg.edit_text
else:
msg = m
sender = msg.reply_text
if not msg.from_user:
return
res = (
strings("language_changer_private")
if msg.chat.type == ChatType.PRIVATE
else strings("language_changer_chat")
)
msg = await sender(res, reply_markup=keyboard)
try:
await msg.wait_for_click(from_user_id=m.from_user.id, timeout=30)
except ListenerTimeout:
await msg.edit_msg(strings("exp_task", context="general"))
@app.on_callback_query(filters.regex("^set_lang "))
@require_admin(allow_in_private=True)
@use_chat_lang()
async def set_chat_lang(_, m: CallbackQuery, strings):
lang = m.data.split()[1]
await set_db_lang(m.message.chat.id, m.message.chat.type, lang)
strings = partial(
get_locale_string,
langdict[lang].get("lang_setting", langdict[default_language]["lang_setting"]),
lang,
"lang_setting",
)
if m.message.chat.type == ChatType.PRIVATE:
keyboard = InlineKeyboardMarkup(
inline_keyboard=[
[
InlineKeyboardButton(
strings("back_btn", context="general"),
callback_data="start_back",
)
]
]
)
else:
keyboard = None
await m.message.edit_msg(
strings("language_changed_successfully"), reply_markup=keyboard
)