Changed conversation handler to convopyro

This commit is contained in:
Profitroll 2023-03-18 01:15:21 +01:00
parent 82a659cce2
commit 9fb509fc2b
3 changed files with 87 additions and 120 deletions

192
bwtbot.py
View File

@ -5,8 +5,15 @@ from subprocess import call
from pyrogram import filters from pyrogram import filters
from pyrogram.client import Client from pyrogram.client import Client
from pyrogram.sync import idle from pyrogram.sync import idle
from pyrogram.types import ForceReply, BotCommand, BotCommandScopeChat, Message from pyrogram.types import (
ForceReply,
BotCommand,
BotCommandScopeChat,
Message,
ReplyKeyboardRemove,
)
from pyrogram.enums.chat_action import ChatAction from pyrogram.enums.chat_action import ChatAction
from convopyro import Conversation, listen_message
from functions import * from functions import *
from modules.colors import * from modules.colors import *
from modules.bwt import * from modules.bwt import *
@ -22,31 +29,29 @@ app = Client(
bot_token=config["bot_token"], bot_token=config["bot_token"],
) )
Conversation(app)
@app.on_message( @app.on_message(
~filters.scheduled ~filters.scheduled
& filters.command(["setcard", "задать карту"], prefixes=["/", ""]) & filters.command(["setcard", "задать карту"], prefixes=["/", ""])
) )
async def setcard(_: Client, msg: Message): async def setcard(_: Client, msg: Message):
if userGet(msg.from_user.id, "context") is None: await msg.reply_text(
userSet(msg.from_user.id, "context", "set") string("send_number"),
await msg.reply_text( reply_markup=ForceReply(placeholder=string("enter_number")),
string("send_number"), )
reply_markup=ForceReply(placeholder=string("enter_number")), answer = await listen_message(_, msg.chat.id, timeout=None)
) if answer is None:
else: return
await msg.reply_text(string("cancel_first")) elif answer.text.strip() in ["/cancel", "cancel", "/відміна", "відміна"]:
await msg.reply_text(string("cancel"), reply_markup=ReplyKeyboardRemove())
return
@app.on_message( userSet(answer.from_user.id, "card", answer.text)
~filters.scheduled & filters.command(["cancel", "відміна"], prefixes=["/", ""]) appendLog(f"User {str(msg.from_user.id)} set card id to {answer.text}")
) await msg.reply_text(
async def cancel(_: Client, msg: Message): string("card_linked").format(answer.text), reply_markup=ReplyKeyboardRemove()
if userGet(msg.from_user.id, "context") is not None: )
userReset(msg.from_user.id, "context")
await msg.reply_text(string("cancel"))
else:
await msg.reply_text(string("cancel_none"))
@app.on_message( @app.on_message(
@ -54,69 +59,57 @@ async def cancel(_: Client, msg: Message):
& filters.command(["resetcard", "забути картку"], prefixes=["/", ""]) & filters.command(["resetcard", "забути картку"], prefixes=["/", ""])
) )
async def resetcard(_: Client, msg: Message): async def resetcard(_: Client, msg: Message):
if userGet(msg.from_user.id, "context") is None: if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]:
if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]: userReset(msg.from_user.id, "card")
userReset(msg.from_user.id, "card") await msg.reply_text(string("card_unlinked"))
await msg.reply_text(string("card_unlinked")) appendLog(f"User {str(msg.from_user.id)} reseted his card")
appendLog(f"User {str(msg.from_user.id)} reseted his card")
else:
await msg.reply_text(string("card_not_linked").format(string("get_number")))
appendLog(f"User {str(msg.from_user.id)} tried to reset non-existent card")
else: else:
await msg.reply_text(string("cancel_first")) await msg.reply_text(string("card_not_linked").format(string("get_number")))
appendLog(f"User {str(msg.from_user.id)} tried to reset non-existent card")
@app.on_message( @app.on_message(
~filters.scheduled & filters.command(["balance", "баланс"], prefixes=["/", ""]) ~filters.scheduled & filters.command(["balance", "баланс"], prefixes=["/", ""])
) )
async def balance(_: Client, msg: Message): async def balance(_: Client, msg: Message):
if userGet(msg.from_user.id, "context") is None: try:
try: if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]:
if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]: await app.send_chat_action(chat_id=msg.chat.id, action=ChatAction.TYPING)
await app.send_chat_action( water_left = await getWaterLeft(
chat_id=msg.chat.id, action=ChatAction.TYPING userGet(msg.from_user.id, "card"), msg.from_user.id, app
) )
water_left = await getWaterLeft( if water_left == "":
userGet(msg.from_user.id, "card"), msg.from_user.id, app
)
if water_left == "":
await msg.reply_text(
string("error_new").format(
f'https://bwtaqua.com.ua/card-topup/?id={userGet(msg.from_user.id, "card")}'
)
)
# raise EmptyCardException("Card information is empty")
elif water_left == "Failure":
await msg.reply_text(
string("error_occured").format(string("get_number"))
)
appendLog(
f"User {str(msg.from_user.id)} could not get left water amount"
)
else:
await msg.reply_text(string("card_balance").format(water_left))
appendLog(
f"User {str(msg.from_user.id)} has {water_left} liters remaining"
)
else:
await msg.reply_text( await msg.reply_text(
string("card_not_linked").format(string("get_number")) string("error_new").format(
f'https://bwtaqua.com.ua/card-topup/?id={userGet(msg.from_user.id, "card")}'
)
) )
appendLog( # raise EmptyCardException("Card information is empty")
f"User {str(msg.from_user.id)} tried to get balance without card set" elif water_left == "Failure":
)
except Exception as exp:
if msg.from_user.id != config["owner_id"]:
await msg.reply_text( await msg.reply_text(
string("error_occured").format(string("get_number")) string("error_occured").format(string("get_number"))
) )
await app.send_message( appendLog(
owner_id, f"User {str(msg.from_user.id)} could not get left water amount"
f"Error occured by {str(msg.from_user.id)}:\nException: `{exp}`\nTraceback: `{format_exc()}`", )
else:
await msg.reply_text(string("card_balance").format(water_left))
appendLog(
f"User {str(msg.from_user.id)} has {water_left} liters remaining"
)
else:
await msg.reply_text(string("card_not_linked").format(string("get_number")))
appendLog(
f"User {str(msg.from_user.id)} tried to get balance without card set"
) )
appendLog(f"User {str(msg.from_user.id)} could not get left water amount") except Exception as exp:
else: if msg.from_user.id != config["owner_id"]:
await msg.reply_text(string("cancel_first")) await msg.reply_text(string("error_occured").format(string("get_number")))
await app.send_message(
owner_id,
f"Error occured by {str(msg.from_user.id)}:\nException: `{exp}`\nTraceback: `{format_exc()}`",
)
appendLog(f"User {str(msg.from_user.id)} could not get left water amount")
@app.on_message( @app.on_message(
@ -124,27 +117,20 @@ async def balance(_: Client, msg: Message):
& filters.command(["topup", "refill", "поповнити"], prefixes=["/", ""]) & filters.command(["topup", "refill", "поповнити"], prefixes=["/", ""])
) )
async def topup_cmd(_: Client, msg: Message): async def topup_cmd(_: Client, msg: Message):
if userGet(msg.from_user.id, "context") is None: try:
try: if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]:
if "card" in jsonLoad("data/database.json")[str(msg.from_user.id)]: await app.send_chat_action(chat_id=msg.chat.id, action=ChatAction.TYPING)
await app.send_chat_action( await msg.reply_text(
chat_id=msg.chat.id, action=ChatAction.TYPING string("top_up").format(str(userGet(msg.from_user.id, "card")))
) )
await msg.reply_text( appendLog(f"User {str(msg.from_user.id)} requested top up")
string("top_up").format(str(userGet(msg.from_user.id, "card"))) else:
) await msg.reply_text(string("card_not_linked").format(string("get_number")))
appendLog(f"User {str(msg.from_user.id)} requested top up") appendLog(
else: f"User {str(msg.from_user.id)} tried to request top up without card set"
await msg.reply_text( )
string("card_not_linked").format(string("get_number")) except Exception as exp:
) await msg.reply_text(str(exp))
appendLog(
f"User {str(msg.from_user.id)} tried to request top up without card set"
)
except Exception as exp:
await msg.reply_text(str(exp))
else:
await msg.reply_text(string("cancel_first"))
@app.on_message( @app.on_message(
@ -152,14 +138,11 @@ async def topup_cmd(_: Client, msg: Message):
& filters.command(["start", "help", "допомога"], prefixes=["/", ""]) & filters.command(["start", "help", "допомога"], prefixes=["/", ""])
) )
async def help(_: Client, msg: Message): async def help(_: Client, msg: Message):
if userGet(msg.from_user.id, "context") is None: await msg.reply_text(string("welcome").format(string("get_number")))
await msg.reply_text(string("welcome").format(string("get_number"))) if msg.from_user.language_code in jsonLoad("strings.json"):
if msg.from_user.language_code in jsonLoad("strings.json"): userSet(msg.from_user.id, "locale", msg.from_user.language_code)
userSet(msg.from_user.id, "locale", msg.from_user.language_code)
else:
userSet(msg.from_user.id, "locale", "en")
else: else:
await msg.reply_text(string("cancel_first")) userSet(msg.from_user.id, "locale", "en")
pid = getpid() pid = getpid()
@ -174,15 +157,6 @@ async def kill(_: Client, msg: Message):
system(f"kill -9 {pid}") system(f"kill -9 {pid}")
@app.on_message(~filters.scheduled)
async def any_message_handler(app, msg):
if userGet(msg.from_user.id, "context") == "set":
userSet(msg.from_user.id, "card", msg.text)
userReset(msg.from_user.id, "context")
appendLog(f"User {str(msg.from_user.id)} set card id to {msg.text}")
await msg.reply_text(string("card_linked").format(msg.text))
print(f"{nowtime()} {WHITE}Starting with PID {YELLOW}{pid}{RESET}") print(f"{nowtime()} {WHITE}Starting with PID {YELLOW}{pid}{RESET}")
app.start() # type: ignore app.start() # type: ignore
@ -195,7 +169,6 @@ app.set_bot_commands(
BotCommand("topup", "Поповнити картку"), BotCommand("topup", "Поповнити картку"),
BotCommand("setcard", "Прив'язати картку"), BotCommand("setcard", "Прив'язати картку"),
BotCommand("resetcard", "Відв'язати картку"), BotCommand("resetcard", "Відв'язати картку"),
BotCommand("cancel", "Відмінити операцію"),
], ],
language_code="uk", language_code="uk",
) # type: ignore ) # type: ignore
@ -207,7 +180,6 @@ app.set_bot_commands(
BotCommand("topup", "Поповнити картку"), BotCommand("topup", "Поповнити картку"),
BotCommand("setcard", "Прив'язати картку"), BotCommand("setcard", "Прив'язати картку"),
BotCommand("resetcard", "Відв'язати картку"), BotCommand("resetcard", "Відв'язати картку"),
BotCommand("cancel", "Відмінити операцію"),
], ],
language_code="ru", language_code="ru",
) # type: ignore ) # type: ignore
@ -219,7 +191,6 @@ app.set_bot_commands(
BotCommand("topup", "Refill card"), BotCommand("topup", "Refill card"),
BotCommand("setcard", "Link card"), BotCommand("setcard", "Link card"),
BotCommand("resetcard", "Unlink card"), BotCommand("resetcard", "Unlink card"),
BotCommand("cancel", "Cancel operation"),
] ]
) # type: ignore ) # type: ignore
@ -231,7 +202,6 @@ app.set_bot_commands(
BotCommand("setcard", "Link card"), BotCommand("setcard", "Link card"),
BotCommand("resetcard", "Unlink card"), BotCommand("resetcard", "Unlink card"),
BotCommand("shutdown", "Turn off the bot"), BotCommand("shutdown", "Turn off the bot"),
BotCommand("cancel", "Cancel operation"),
], ],
scope=BotCommandScopeChat(chat_id=owner_id), scope=BotCommandScopeChat(chat_id=owner_id),
) # type: ignore ) # type: ignore

View File

@ -1,5 +1,6 @@
beautifulsoup4~=4.11.2 beautifulsoup4~=4.11.2
convopyro==0.5
pyrogram~=2.0.102 pyrogram~=2.0.102
pathlib~=1.0.1
tgcrypto~=1.2.5 tgcrypto~=1.2.5
pathlib~=1.0.1
ujson~=5.7.0 ujson~=5.7.0

View File

@ -4,16 +4,14 @@
"get_number": "**Get card number (Var. 1):**\nOn the front bottom side of your card, number may be found\n\n**Get card number (Var. 2):**\n1. Scan QR on the card\n2. Open webpage from code\n3. Numer should be found in **Номер карти \"Здорова Вода\"** or **Номер карти BWT Aqua** fields", "get_number": "**Get card number (Var. 1):**\nOn the front bottom side of your card, number may be found\n\n**Get card number (Var. 2):**\n1. Scan QR on the card\n2. Open webpage from code\n3. Numer should be found in **Номер карти \"Здорова Вода\"** or **Номер карти BWT Aqua** fields",
"card_linked": "Linked card: `{0}`\n\nPlease, make sure the number is correct before using the bot", "card_linked": "Linked card: `{0}`\n\nPlease, make sure the number is correct before using the bot",
"card_unlinked": "Card was unlinked from your Telegram", "card_unlinked": "Card was unlinked from your Telegram",
"card_not_linked": "You don't have any linked card.\n\nВы можете задать её с помощью команды /setcard\n\n{0}", "card_not_linked": "You don't have any linked card.\n\nВYou can set it using /setcard\n\n{0}",
"error_occured": "An error occurred while getting the amount of remaining water on the card.\n\nPlease make sure the linked card number is correct. If you are sure that the bot is broken, please contact @profitroll.\n\nLink your card: /setcard\n\n{0}", "error_occured": "An error occurred while getting the amount of remaining water on the card.\n\nPlease make sure the linked card number is correct. If you are sure that the bot is broken, please contact @profitroll.\n\nLink your card: /setcard\n\n{0}",
"error_new": "An error occurred while getting the amount of remaining water on the card.\n\nLast a few weeks BWT seems to return empty string to balance request from our server. We assume that our server has been blacklisted.\n\nTo check your balance you can use official [BWT App](https://bwtaqua.com.ua/en/#app) or simply bookmark this page: {0}.", "error_new": "An error occurred while getting the amount of remaining water on the card.\n\nLast a few weeks BWT seems to return empty string to balance request from our server. We assume that our server has been blacklisted.\n\nTo check your balance you can use official [BWT App](https://bwtaqua.com.ua/en/#app) or simply bookmark this page: {0}.",
"card_balance": "Card's balance is {0} l. of water", "card_balance": "Card's balance is {0} l. of water",
"top_up": "[Click here to top up](https://bwtaqua.com.ua/card-topup/?id={0})", "top_up": "[Click here to top up](https://bwtaqua.com.ua/card-topup/?id={0})",
"cancel": "Operation cancelled", "cancel": "Operation cancelled",
"cancel_none": "Nothing to cancel",
"cancel_first": "Operation ongoing. Cancel the current one using /cancel to run this action",
"enter_number": "Enter card number", "enter_number": "Enter card number",
"send_number": "Please, send your card number" "send_number": "Please, send your card number\nIf you want to abort this operation, use /cancel"
}, },
"uk": { "uk": {
"welcome": "Привіт-привіт!\n\nЦей бот дозволяє дізнатись скільки літрів залишилось на вашій карточці.\n\n**Команди:**\n • /balance дізнатись баланс карти\n • /setcard приав'язати карту\n • /resetcard відв'язати карту\n\n{0}\n\nРозробник **не має жодного відношення до BWT Aqua**, а бот створений лише для особистого, некомерційного використання.", "welcome": "Привіт-привіт!\n\nЦей бот дозволяє дізнатись скільки літрів залишилось на вашій карточці.\n\n**Команди:**\n • /balance дізнатись баланс карти\n • /setcard приав'язати карту\n • /resetcard відв'язати карту\n\n{0}\n\nРозробник **не має жодного відношення до BWT Aqua**, а бот створений лише для особистого, некомерційного використання.",
@ -25,10 +23,8 @@
"error_new": "При отриманні води на карточці виникла помилка.\n\nОстанні тижні BWT повертає нашому серверу порожні строки замість балансу. Є підозри, що сервер потрапив у блеклист.\n\nДля перевірки балансу рекомендуємо користуватись офіційним [додатком BWT](https://bwtaqua.com.ua/#app) або просто додати цю сторінку у закладки: {0}.", "error_new": "При отриманні води на карточці виникла помилка.\n\nОстанні тижні BWT повертає нашому серверу порожні строки замість балансу. Є підозри, що сервер потрапив у блеклист.\n\nДля перевірки балансу рекомендуємо користуватись офіційним [додатком BWT](https://bwtaqua.com.ua/#app) або просто додати цю сторінку у закладки: {0}.",
"card_balance": "На карточці {0} л. води", "card_balance": "На карточці {0} л. води",
"top_up": "[Натисніть для поповнення](https://bwtaqua.com.ua/card-topup/?id={0})", "top_up": "[Натисніть для поповнення](https://bwtaqua.com.ua/card-topup/?id={0})",
"cancel": "Операція відмінена", "cancel": "Операцію скасовано",
"cancel_none": "Нема що відміняти",
"cancel_first": "Триває інша операція. Відмініть триваючу операцію командою /cancel щоб запустити іншу дію",
"enter_number": "Введіть номер картки", "enter_number": "Введіть номер картки",
"send_number": "Будь ласка, надішліть номер вашої картки" "send_number": "Будь ласка, надішліть номер вашої картки\nЯкщо ви хочете скасувати цю операцію, використовуйте /cancel"
} }
} }