Compare commits

..

4 Commits

Author SHA1 Message Date
9fb509fc2b Changed conversation handler to convopyro 2023-03-18 01:15:21 +01:00
82a659cce2 Formatted README 2023-03-18 00:52:36 +01:00
c3dd6f61d6 Formatted everything with black 2023-03-18 00:52:15 +01:00
dcf82ab6f2 Bump BS4 and Pyrogram versions 2023-03-18 00:47:45 +01:00
7 changed files with 276 additions and 205 deletions

View File

@@ -1,14 +1,17 @@
# BWTAqua # BWTAqua
[![License: GPL v3](https://img.shields.io/badge/License-GPL_v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html) [![License: GPL v3](https://img.shields.io/badge/License-GPL_v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.html)
Simple yet helpful bot to check BWT Aqua's card balance Simple yet helpful bot to check BWT Aqua's card balance
## Requirements ## Requirements
* nodejs & npm * nodejs & npm
* python3 * python3
* git * git
## Installation ## Installation
1. Download package 1. Download package
1. `git clone https://git.end-play.xyz/profitroll/BWTAqua.git` 1. `git clone https://git.end-play.xyz/profitroll/BWTAqua.git`
2. `cd BWTAqua` 2. `cd BWTAqua`
@@ -25,5 +28,6 @@ Simple yet helpful bot to check BWT Aqua's card balance
* `python3 bwtbot.py` * `python3 bwtbot.py`
## Configuration ## Configuration
You can edit with vim, nano, whatever. You can edit with vim, nano, whatever.
If you don't know where to find bot_token and your id - here you can find some hints: [get bot token](https://www.siteguarding.com/en/how-to-get-telegram-bot-api-token), [get your id](https://www.alphr.com/telegram-find-user-id/), [get api_hash and api_id](https://core.telegram.org/api/obtaining_api_id). If you don't know where to find bot_token and your id - here you can find some hints: [get bot token](https://www.siteguarding.com/en/how-to-get-telegram-bot-api-token), [get your id](https://www.alphr.com/telegram-find-user-id/), [get api_hash and api_id](https://core.telegram.org/api/obtaining_api_id).

170
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 *
@@ -15,30 +22,43 @@ config = jsonLoad("config.json")
owner_id = config["owner_id"] owner_id = config["owner_id"]
app = Client(config["bot_name"], api_id=config["api_id"], api_hash=config["api_hash"], bot_token=config["bot_token"]) app = Client(
config["bot_name"],
api_id=config["api_id"],
api_hash=config["api_hash"],
bot_token=config["bot_token"],
)
Conversation(app)
@app.on_message(~ filters.scheduled & filters.command(["setcard", "задать карту"], prefixes=["/", ""])) @app.on_message(
~filters.scheduled
& 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(string("send_number"), reply_markup=ForceReply(placeholder=string("enter_number"))) reply_markup=ForceReply(placeholder=string("enter_number")),
else: )
await msg.reply_text(string("cancel_first")) answer = await listen_message(_, msg.chat.id, timeout=None)
if answer is None:
return
elif answer.text.strip() in ["/cancel", "cancel", "/відміна", "відміна"]:
await msg.reply_text(string("cancel"), reply_markup=ReplyKeyboardRemove())
return
userSet(answer.from_user.id, "card", answer.text)
appendLog(f"User {str(msg.from_user.id)} set card id to {answer.text}")
await msg.reply_text(
string("card_linked").format(answer.text), reply_markup=ReplyKeyboardRemove()
)
@app.on_message(~ filters.scheduled & filters.command(["cancel", "відміна"], prefixes=["/", ""])) @app.on_message(
async def cancel(_: Client, msg: Message): ~filters.scheduled
if userGet(msg.from_user.id, "context") is not None: & filters.command(["resetcard", "забути картку"], prefixes=["/", ""])
userReset(msg.from_user.id, "context") )
await msg.reply_text(string("cancel"))
else:
await msg.reply_text(string("cancel_none"))
@app.on_message(~ filters.scheduled & 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"))
@@ -46,131 +66,149 @@ async def resetcard(_: Client, msg: Message):
else: else:
await msg.reply_text(string("card_not_linked").format(string("get_number"))) 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") appendLog(f"User {str(msg.from_user.id)} tried to reset non-existent card")
else:
await msg.reply_text(string("cancel_first"))
@app.on_message(~ filters.scheduled & filters.command(["balance", "баланс"], prefixes=["/", ""])) @app.on_message(
~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(chat_id=msg.chat.id, action=ChatAction.TYPING)
water_left = await getWaterLeft(userGet(msg.from_user.id, "card"), msg.from_user.id, app) water_left = await getWaterLeft(
userGet(msg.from_user.id, "card"), msg.from_user.id, app
)
if water_left == "": 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")}')) 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") # raise EmptyCardException("Card information is empty")
elif water_left == "Failure": elif water_left == "Failure":
await msg.reply_text(string("error_occured").format(string("get_number"))) await msg.reply_text(
appendLog(f"User {str(msg.from_user.id)} could not get left water amount") string("error_occured").format(string("get_number"))
)
appendLog(
f"User {str(msg.from_user.id)} could not get left water amount"
)
else: else:
await msg.reply_text(string("card_balance").format(water_left)) await msg.reply_text(string("card_balance").format(water_left))
appendLog(f"User {str(msg.from_user.id)} has {water_left} liters remaining") appendLog(
f"User {str(msg.from_user.id)} has {water_left} liters remaining"
)
else: else:
await msg.reply_text(string("card_not_linked").format(string("get_number"))) 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)} tried to get balance without card set"
)
except Exception as exp: except Exception as exp:
if msg.from_user.id != config["owner_id"]: if msg.from_user.id != config["owner_id"]:
await msg.reply_text(string("error_occured").format(string("get_number"))) 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()}`") 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") appendLog(f"User {str(msg.from_user.id)} could not get left water amount")
else:
await msg.reply_text(string("cancel_first"))
@app.on_message(~ filters.scheduled & filters.command(["topup", "refill", "поповнити"], prefixes=["/", ""])) @app.on_message(
~filters.scheduled
& 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(chat_id=msg.chat.id, action=ChatAction.TYPING)
await msg.reply_text(string("top_up").format(str(userGet(msg.from_user.id, "card")))) await msg.reply_text(
string("top_up").format(str(userGet(msg.from_user.id, "card")))
)
appendLog(f"User {str(msg.from_user.id)} requested top up") appendLog(f"User {str(msg.from_user.id)} requested top up")
else: else:
await msg.reply_text(string("card_not_linked").format(string("get_number"))) await msg.reply_text(string("card_not_linked").format(string("get_number")))
appendLog(f"User {str(msg.from_user.id)} tried to request top up without card set") appendLog(
f"User {str(msg.from_user.id)} tried to request top up without card set"
)
except Exception as exp: except Exception as exp:
await msg.reply_text(str(exp)) await msg.reply_text(str(exp))
else:
await msg.reply_text(string("cancel_first"))
@app.on_message(~ filters.scheduled & filters.command(["start", "help", "допомога"], prefixes=["/", ""])) @app.on_message(
~filters.scheduled
& 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: else:
userSet(msg.from_user.id, "locale", "en") userSet(msg.from_user.id, "locale", "en")
else:
await msg.reply_text(string("cancel_first"))
pid = getpid() pid = getpid()
@app.on_message(~ filters.scheduled & filters.command(["kill", "die", "shutdown"], prefixes="/"))
@app.on_message(
~filters.scheduled & filters.command(["kill", "die", "shutdown"], prefixes="/")
)
async def kill(_: Client, msg: Message): async def kill(_: Client, msg: Message):
if msg.from_user.id == owner_id: if msg.from_user.id == owner_id:
await msg.reply_text(f"Shutting down bot with pid **{pid}**") await msg.reply_text(f"Shutting down bot with pid **{pid}**")
system(f"kill -9 {pid}") system(f"kill -9 {pid}")
@app.on_message(~ filters.scheduled) print(f"{nowtime()} {WHITE}Starting with PID {YELLOW}{pid}{RESET}")
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}')
app.start() # type: ignore app.start() # type: ignore
app.send_message(owner_id, f"Starting bot with pid **{pid}**") # type: ignore app.send_message(owner_id, f"Starting bot with pid **{pid}**") # type: ignore
app.set_bot_commands([ app.set_bot_commands(
[
BotCommand("help", "Меню допомоги"), BotCommand("help", "Меню допомоги"),
BotCommand("balance", "Баланс картки"), BotCommand("balance", "Баланс картки"),
BotCommand("topup", "Поповнити картку"), BotCommand("topup", "Поповнити картку"),
BotCommand("setcard", "Прив'язати картку"), BotCommand("setcard", "Прив'язати картку"),
BotCommand("resetcard", "Відв'язати картку"), BotCommand("resetcard", "Відв'язати картку"),
BotCommand("cancel", "Відмінити операцію"),
], ],
language_code="uk") # type: ignore language_code="uk",
) # type: ignore
app.set_bot_commands([ app.set_bot_commands(
[
BotCommand("help", "Меню допомоги"), BotCommand("help", "Меню допомоги"),
BotCommand("balance", "Баланс картки"), BotCommand("balance", "Баланс картки"),
BotCommand("topup", "Поповнити картку"), BotCommand("topup", "Поповнити картку"),
BotCommand("setcard", "Прив'язати картку"), BotCommand("setcard", "Прив'язати картку"),
BotCommand("resetcard", "Відв'язати картку"), BotCommand("resetcard", "Відв'язати картку"),
BotCommand("cancel", "Відмінити операцію"),
], ],
language_code="ru") # type: ignore language_code="ru",
) # type: ignore
app.set_bot_commands([ app.set_bot_commands(
[
BotCommand("help", "Help menu"), BotCommand("help", "Help menu"),
BotCommand("balance", "Card's balance"), BotCommand("balance", "Card's balance"),
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
app.set_bot_commands([ app.set_bot_commands(
[
BotCommand("help", "Help menu"), BotCommand("help", "Help menu"),
BotCommand("balance", "Card's balance"), BotCommand("balance", "Card's balance"),
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("shutdown", "Turn off the bot"), BotCommand("shutdown", "Turn off the bot"),
BotCommand("cancel", "Cancel operation"),
], ],
scope=BotCommandScopeChat(chat_id=owner_id)) # type: ignore scope=BotCommandScopeChat(chat_id=owner_id),
) # type: ignore
idle() idle()
app.send_message(owner_id, f"Shutting down bot with pid **{pid}**") # type: ignore app.send_message(owner_id, f"Shutting down bot with pid **{pid}**") # type: ignore
print(f'\n{nowtime()} {WHITE}Shutting down with PID {YELLOW}{pid}{RESET}') print(f"\n{nowtime()} {WHITE}Shutting down with PID {YELLOW}{pid}{RESET}")
call(f'kill -9 {pid}', shell=True) call(f"kill -9 {pid}", shell=True)

View File

@@ -13,11 +13,12 @@ logs_folder = "logs/"
def jsonSave(filename, value): def jsonSave(filename, value):
with open(filename, 'w', encoding="utf-8") as f: with open(filename, "w", encoding="utf-8") as f:
f.write(dumps(value, indent=4, ensure_ascii=False)) f.write(dumps(value, indent=4, ensure_ascii=False))
def jsonLoad(filename): def jsonLoad(filename):
with open(filename, 'r', encoding="utf-8") as f: with open(filename, "r", encoding="utf-8") as f:
value = loads(f.read()) value = loads(f.read())
return value return value
@@ -31,6 +32,7 @@ owner_id = config["owner_id"]
def nowtime(): def nowtime():
return f'{BBLACK}[{CYAN}{datetime.now().strftime("%H:%M:%S")}{BBLACK}]{RESET}' return f'{BBLACK}[{CYAN}{datetime.now().strftime("%H:%M:%S")}{BBLACK}]{RESET}'
def checkSize(): def checkSize():
global logs_folder, log_size global logs_folder, log_size
@@ -38,48 +40,51 @@ def checkSize():
while i < 2: while i < 2:
try: try:
log = stat(logs_folder + 'latest.log') log = stat(logs_folder + "latest.log")
if (log.st_size / 1024) > log_size: if (log.st_size / 1024) > log_size:
with open(logs_folder + 'latest.log', 'rb') as f_in: with open(logs_folder + "latest.log", "rb") as f_in:
with gzipopen(f'{logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip', 'wb') as f_out: with gzipopen(
f'{logs_folder}{datetime.now().strftime("%d.%m.%Y_%H:%M:%S")}.zip',
"wb",
) as f_out:
copyfileobj(f_in, f_out) copyfileobj(f_in, f_out)
open(logs_folder + 'latest.log', 'w').close() open(logs_folder + "latest.log", "w").close()
i = 2 i = 2
except FileNotFoundError: except FileNotFoundError:
try: try:
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + "latest.log", "a")
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + "latest.log", "a").close()
except: except:
try: try:
makedirs(logs_folder, exist_ok=True) makedirs(logs_folder, exist_ok=True)
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + "latest.log", "a")
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + "latest.log", "a").close()
except: except:
pass pass
i += 1 i += 1
def appendLog(message): def appendLog(message):
global logs_folder global logs_folder
checkSize() checkSize()
try: try:
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + "latest.log", "a")
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + "latest.log", "a").close()
except: except:
try: try:
makedirs(logs_folder, exist_ok=True) makedirs(logs_folder, exist_ok=True)
log = open(logs_folder + 'latest.log', 'a') log = open(logs_folder + "latest.log", "a")
open(logs_folder + 'latest.log', 'a').close() open(logs_folder + "latest.log", "a").close()
except: except:
sleep(2) sleep(2)
print('Log file could not be created') print("Log file could not be created")
return return
print(message, flush=True) print(message, flush=True)
@@ -104,11 +109,13 @@ def userSet(userid, key: str, value):
database[str(userid)][key] = value database[str(userid)][key] = value
jsonSave("data/database.json", database) jsonSave("data/database.json", database)
def userReset(userid, key: str): def userReset(userid, key: str):
database = jsonLoad("data/database.json") database = jsonLoad("data/database.json")
del database[str(userid)][key] del database[str(userid)][key]
jsonSave("data/database.json", database) jsonSave("data/database.json", database)
def userGet(userid, key: str): def userGet(userid, key: str):
try: try:
return jsonLoad("data/database.json")[str(userid)][key] return jsonLoad("data/database.json")[str(userid)][key]

View File

@@ -9,39 +9,60 @@ from bs4 import BeautifulSoup
config = jsonLoad("config.json") config = jsonLoad("config.json")
class EmptyCardException(Exception): class EmptyCardException(Exception):
pass pass
async def getWaterLeft(cardid, filename, app=None):
async def getWaterLeft(cardid, filename, app=None):
url = f"https://bwtaqua.com.ua/card-topup/?id={cardid}" url = f"https://bwtaqua.com.ua/card-topup/?id={cardid}"
try: try:
# if path.exists(f"data/pages/{str(filename)}.html") is False: # if path.exists(f"data/pages/{str(filename)}.html") is False:
# run(["touch", f"data/pages/{str(filename)}.html"]) # run(["touch", f"data/pages/{str(filename)}.html"])
appendLog(f"Trying to get liters for url '{url}'") appendLog(f"Trying to get liters for url '{url}'")
if config["use_compiled_page_saver"] is True: if config["use_compiled_page_saver"] is True:
proc = check_output(["PageSaver/pageSaver", f"https://bwtaqua.com.ua/card-topup/?id={cardid}"]) #, ">", f"data/pages/{str(filename)}.html"]) proc = check_output(
[
"PageSaver/pageSaver",
f"https://bwtaqua.com.ua/card-topup/?id={cardid}",
]
) # , ">", f"data/pages/{str(filename)}.html"])
html_file = proc.decode("utf-8") html_file = proc.decode("utf-8")
else: else:
proc = check_output(["node", "./PageSaver/pageSaver.js", f"https://bwtaqua.com.ua/card-topup/?id={cardid}"]) #, ">", f"data/pages/{str(filename)}.html"]) proc = check_output(
[
"node",
"./PageSaver/pageSaver.js",
f"https://bwtaqua.com.ua/card-topup/?id={cardid}",
]
) # , ">", f"data/pages/{str(filename)}.html"])
html_file = proc.decode("utf-8") html_file = proc.decode("utf-8")
# with open(f'data/pages/{str(filename)}.html') as f: # with open(f'data/pages/{str(filename)}.html') as f:
# html_file = f.read() # html_file = f.read()
# f.close() # f.close()
soup = BeautifulSoup(html_file, 'html.parser') soup = BeautifulSoup(html_file, "html.parser")
output = (soup.find_all("h3", class_="headline headline_center headline_pink js-payment-balance")[0].getText()).replace("Твій баланс ", "").replace(" л", "") output = (
(
soup.find_all(
"h3",
class_="headline headline_center headline_pink js-payment-balance",
)[0].getText()
)
.replace("Твій баланс ", "")
.replace(" л", "")
)
appendLog(f"Parsed {output} liters of water remaining (user: {str(filename)}, cardid: {cardid})") appendLog(
f"Parsed {output} liters of water remaining (user: {str(filename)}, cardid: {cardid})"
)
except Exception as exp: except Exception as exp:
appendLog(f"Exception occured: {exp} (user: {str(filename)}, cardid: {cardid})") appendLog(f"Exception occured: {exp} (user: {str(filename)}, cardid: {cardid})")
try: try:
@@ -54,16 +75,20 @@ async def getWaterLeft(cardid, filename, app=None):
appendLog(f"'html_file' is not defined so I won't gather any tmp data") appendLog(f"'html_file' is not defined so I won't gather any tmp data")
if app != None: if app != None:
await app.send_message(config["owner_id"], f"**Exception occured:**\n • User: `{str(filename)}`\n • Card: [{cardid}]({url})\n • Exception: `{exp}`\n • TMP UUID: `{tmp_name}`\n • Traceback: `{format_exc()}`", disable_web_page_preview=True) await app.send_message(
config["owner_id"],
f"**Exception occured:**\n • User: `{str(filename)}`\n • Card: [{cardid}]({url})\n • Exception: `{exp}`\n • TMP UUID: `{tmp_name}`\n • Traceback: `{format_exc()}`",
disable_web_page_preview=True,
)
else: else:
appendLog(f'Exception occured and could not send to user: {exp}') appendLog(f"Exception occured and could not send to user: {exp}")
output = "Failure" output = "Failure"
return output return output
if __name__ == "__main__":
if __name__ == "__main__":
cardid = input("Enter card number: ") cardid = input("Enter card number: ")
userid = input("Enter Telegram ID (optional): ") userid = input("Enter Telegram ID (optional): ")

View File

@@ -1,22 +1,22 @@
RESET = '\u001b[0m' RESET = "\u001b[0m"
BLACK = '\u001b[30m' BLACK = "\u001b[30m"
RED = '\u001b[31m' RED = "\u001b[31m"
GREEN = '\u001b[32m' GREEN = "\u001b[32m"
YELLOW = '\u001b[33m' YELLOW = "\u001b[33m"
BLUE = '\u001b[34m' BLUE = "\u001b[34m"
MAGENTA = '\u001b[35m' MAGENTA = "\u001b[35m"
CYAN = '\u001b[36m' CYAN = "\u001b[36m"
WHITE = '\u001b[37m' WHITE = "\u001b[37m"
BBLACK = '\u001b[30;1m' BBLACK = "\u001b[30;1m"
BRED = '\u001b[31;1m' BRED = "\u001b[31;1m"
BGREEN = '\u001b[32;1m' BGREEN = "\u001b[32;1m"
BYELLOW = '\u001b[33;1m' BYELLOW = "\u001b[33;1m"
BBLUE = '\u001b[34;1m' BBLUE = "\u001b[34;1m"
BMAGENTA = '\u001b[35;1m' BMAGENTA = "\u001b[35;1m"
BCYAN = '\u001b[36;1m' BCYAN = "\u001b[36;1m"
BWHITE = '\u001b[37;1m' BWHITE = "\u001b[37;1m"
ULINE = '\u001b[4m' ULINE = "\u001b[4m"
REVERSE = '\u001b[7m' REVERSE = "\u001b[7m"

View File

@@ -1,5 +1,6 @@
beautifulsoup4~=4.11.1 beautifulsoup4~=4.11.2
pyrogram~=2.0.97 convopyro==0.5
pathlib~=1.0.1 pyrogram~=2.0.102
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"
} }
} }