import telebot from telebot.formatting import hcode from telebot.types import ReplyKeyboardMarkup, KeyboardButton from datetime import datetime # API для отправки сообщения о переводе # TG -> DS / DS -> Mine / ... from fastapi import FastAPI, HTTPException from pydantic import BaseModel import uvicorn app = FastAPI() # Для запуска API в потоке from threading import Thread from call2api import * from db import * API_TOKEN = read('conf.json')['api_token'] TG_TOKEN = read('conf.json')['tg_token'] bot = telebot.TeleBot(TG_TOKEN) LCTIME = datetime.now() def checkauth(message, reg = False): if user_in_db(API_TOKEN, tg=message.chat.id) != 'false': return True else: if not reg: markup = ReplyKeyboardMarkup(resize_keyboard=True) markup.add('Баланс') markup.add('Помощь') bot.reply_to(message, '''Пожалуйста, зарегистрируйтесь или войдите: /reg Nickname 1234567890 /login Nickname 1234567890 Ник вводить желательно игровой. Пароль любой.''', reply_markup=markup) return False @bot.message_handler(commands=['start']) def start(message): markup = ReplyKeyboardMarkup(resize_keyboard=True) markup.add('Баланс') markup.add('Помощь') if not checkauth(message): return if message.text == '/start': bot.reply_to(message, 'Всё работает', reply_markup=markup) else: try: fp_id = message.text.split(' ')[1] dst_id, amount = read('user_api.json')['fp'][fp_id] nick = get_nick(API_TOKEN, dst_id) if float(amount) <= 0.0001: bot.reply_to(message, 'Слишком малое или недопустимое значение.') return amount = str(float(amount)) # Защиты от 1000 нулей в начале src_id = user_in_db(API_TOKEN, tg=message.chat.id) if dst_id == 'false': bot.reply_to(message, 'Не существует такого пользователя.') else: print(src_id) print(amount) status = transfer_coins(API_TOKEN, src_id, dst_id, amount) if status == 'No_money': bot.reply_to(message, 'Недостаточно средств.') elif status == 'OK': bot.reply_to(message, f'''Успешно переведено {hcode(amount)} CDM. Адресат: {hcode(nick)}''', parse_mode='HTML') del_fp(API_TOKEN, fp_id) tg_dst = get_tg(API_TOKEN, dst_id) ds_dst = get_ds(API_TOKEN, dst_id) src_nick = nick if tg_dst != 'null': transfer_callback('http://127.0.0.1:7002/', API_TOKEN, src_nick, nick, amount) elif ds_dst != 'null': transfer_callback('http://127.0.0.1:7003/', API_TOKEN, src_nick, nick, amount) except: pass @bot.message_handler(commands=['help']) def help(message): bot.reply_to(message, f''' Доступные команды: ` /help - Помощь /reg ник - Регистрация /login ник пароль - Войти в аккаунт /passwd пароль - Смена пароля /nick ник - Смена ника /bal - Баланс /pay ник сумма - Перевод /stats - Статистика /gen_token - (Ре)генерация токена API /chat_id - Айди чата /user_id - Айди пользователя` [Исходный код](https://gitea.del.pw/justuser/CryptoDM) [Документация UserAPI](https://gitea.del.pw/justuser/cdm_example_user_api) [UserAPI URL](https://cdm-api.del.pw/docs) ''', parse_mode='Markdown') @bot.message_handler(commands=['reg']) def reg(message): if not checkauth(message, reg=True): global LCTIME time_delta = datetime.now() - LCTIME if time_delta.seconds < 1: bot.reply_to(message, 'Большая нагрузка, повторите запрос позже...') return 0 if len(message.text.split()) == 3: com, nick, passwd = message.text.split() # Проверяем нет ли такого же ника if user_in_db(API_TOKEN, nick=nick) == 'false': if add_user(API_TOKEN, nick, passwd, tg=message.chat.id) == 'OK': bot.reply_to(message, 'Вы успешно зарегистрированны!') else: bot.reply_to(message, 'Что-то пошло не так...') else: bot.reply_to(message, 'Уже существует пользователь с таким ником') else: bot.reply_to(message, '/reg ник пароль') else: bot.reply_to(message, 'Вы уже зарегистрированны') @bot.message_handler(commands=['login']) def login(message): if len(message.text.split()) == 3: global LCTIME time_delta = datetime.now() - LCTIME if time_delta.seconds < 1: bot.reply_to(message, 'Большая нагрузка, повторите запрос позже...') return 0 com, nick, passwd = message.text.split() id = user_in_db(API_TOKEN, nick=nick) if get_tg(API_TOKEN, id) != 'null': bot.reply_to(message, 'Этот пользователь уже авторизован') elif get_passwd(API_TOKEN, id) == hash(passwd): if update_tg(API_TOKEN, id, message.chat.id) == 'OK': bot.reply_to(message, 'Вы успешно авторизовались!') else: bot.reply_to(message, 'Что-то пошло не так...') else: bot.reply_to(message, 'Пароль не совпадает') else: bot.reply_to(message, '/login ник пароль') # @bot.message_handler(commands=['unreg']) # def unreg(message): # id = user_in_db(API_TOKEN, tg=message.chat.id) # if update_tg(API_TOKEN, id, 'None') == 'OK': # bot.reply_to(message, 'Вы успешно вышли из аккаунта') @bot.message_handler(commands=['passwd']) def passwd(message): if checkauth(message): if len(message.text.split()) == 2: com, passwd = message.text.split() id = user_in_db(API_TOKEN, tg=message.chat.id) if update_passwd(API_TOKEN, id, passwd) == 'OK': bot.reply_to(message, 'Пароль успешно изменён.') else: bot.reply_to(message, 'Что-то пошло не так...') else: bot.reply_to(message, '/passwd новый_пароль') @bot.message_handler(commands=['nick']) def nick(message): if checkauth(message): if len(message.text.split()) == 2: com, new_nick = message.text.split() id = user_in_db(API_TOKEN, tg=message.chat.id) if update_nick(API_TOKEN, id, new_nick) == 'OK': bot.reply_to(message, 'Ник успешно изменён') else: bot.reply_to(message, 'Что-то пошло не так...') else: bot.reply_to(message, '/nick новый_ник') @bot.message_handler(commands=['bal']) def bal(message): if checkauth(message): id = user_in_db(API_TOKEN, tg=message.chat.id) coins = round(float(check_bal(API_TOKEN, id)), 4) nick = get_nick(API_TOKEN, id) time2cdm = round(float(get_time2cdm(API_TOKEN, id)), 4) bot.reply_to(message, f'''Ваш баланс: {hcode(f"{coins}")} CDM Валюта за время (сегодня): {hcode(f"{time2cdm}")} Ник: {hcode(nick)}''', parse_mode='HTML') @bot.message_handler(commands=['pay']) def pay(message): if checkauth(message): if len(message.text.split()) == 3: com, nick, amount = message.text.split() if float(amount) <= 0.0001: bot.reply_to(message, 'Слишком малое или недопустимое значение.') return 0 amount = str(float(amount)) # Защиты от 1000 нулей в начале src_id = user_in_db(API_TOKEN, tg=message.chat.id) dst_id = user_in_db(API_TOKEN, nick=nick) if dst_id == 'false': bot.reply_to(message, 'Не существует такого пользователя.') else: status = transfer_coins(API_TOKEN, src_id, dst_id, amount) if status == 'No_money': bot.reply_to(message, 'Недостаточно средств.') elif status == 'OK': bot.reply_to(message, f'''Успешно переведено {hcode(amount)} CDM. Адресат: {hcode(nick)}''', parse_mode='HTML') tg_dst = get_tg(API_TOKEN, dst_id) ds_dst = get_ds(API_TOKEN, dst_id) src_nick = get_nick(API_TOKEN, src_id) if tg_dst != 'null': transfer_callback('http://127.0.0.1:7002/', API_TOKEN, src_nick, nick, amount) elif ds_dst != 'null': transfer_callback('http://127.0.0.1:7003/', API_TOKEN, src_nick, nick, amount) else: bot.reply_to(message, '/pay ник количество') def format_sign(number): if '-' in str(number): return f"{number}" if number > 0: return f"+{number}" elif number == 0: return f"{number}" else: return f"-{number}" @bot.message_handler(commands=['stats']) def stats(message): if checkauth(message): data = get_stat(API_TOKEN) bal = f'Баланс ({format_sign(data["gbal_delta"])})' t2cdm = f'Time2cdm ({format_sign(data["time2cdm_delta"])})' max_len = max(len(bal), len(t2cdm), 19) bot.reply_to(message, f''' ```json {bal.ljust(max_len)}: {data["gbal"]} {t2cdm.ljust(max_len)}: {data["time2cdm"]} Среднее значение : {data["average"]} Медиана : {data["median"]} Минимум : {data["min"]} Максимум : {data["max"]} Ввод/вывод алмазов : {data["up_diamond"]} ``` ''', parse_mode='Markdown') @bot.message_handler(commands=['course']) def course(message): conf = read('conf.json') if message.from_user.id == conf['owner']: bot.reply_to(message, f'''Текущий курс: `{conf['time2cdm']}` CDM в час: `{conf['time2cdm']*3600}`''', parse_mode = 'Markdown') @bot.message_handler(commands=['set_course']) def set_course(message): conf = read('conf.json') if message.from_user.id == conf['owner']: conf['time2cdm'] = float(message.text.split()[1]) write(conf, 'conf.json') bot.reply_to(message, f'''Установлен новый курс: `{conf['time2cdm']}` CDM в час: `{conf['time2cdm']*3600}`''', parse_mode = 'Markdown') @bot.message_handler(commands=['gen_token']) def gen_token_tg(message): if checkauth(message): id = user_in_db(API_TOKEN, tg=message.chat.id) token = gen_token(API_TOKEN, id) bot.reply_to(message, f'''Ваш новый токен: {hcode(f"{token}")} ⚠️ВНИМАНИЕ, не передавайте никому токен. Администрация не спрашивает токены.⚠️''', parse_mode='HTML') @bot.message_handler(commands=['chat_id']) def chat_id(message): print(message.chat.id) print(f'chat_id: `{message.chat.id}`') bot.reply_to(message, f'chat\_id: `{message.chat.id}`', parse_mode='Markdown') @bot.message_handler(commands=['user_id']) def user_id(message): bot.reply_to(message, f'user\_id: `{message.from_user.id}`', parse_mode='Markdown') @bot.message_handler(func=lambda message: True) def checks(message): if message.text == 'Баланс': bal(message) elif message.text == 'Помощь': help(message) # API для переводов TG->DS / ... class Transfer_callback_api(BaseModel): token: str src_nick: str dst_nick: str amount: str @app.post('/api/transfer_callback/') def transfer_callback_api(it: Transfer_callback_api): token, src_nick, dst_nick, amount = it.token, it.src_nick, it.dst_nick, it.amount db = read() if token in db['tokens']: dst_id = user_in_db(API_TOKEN, nick=dst_nick) tg_dst = int(get_tg(API_TOKEN, id=dst_id)) bot.send_message(tg_dst, f'''Вам перевели {hcode(amount)} CDM. Отправитель: {hcode(src_nick)}''', parse_mode='HTML') return 200 else: return 'Error' # Генерация сообщения с быстрым платежом class Gen_fp_mess_api(BaseModel): token: str nick: str amount: str chat_id: str fp_id: str @app.post('/api/gen_fp_mess/') def gen_fp_mess_api(it: Gen_fp_mess_api): try: token, nick, amount, chat_id, fp_id = it.token, it.nick, it.amount, it.chat_id, it.fp_id token, fp_id, chat_id = it.token, it.fp_id, it.chat_id keyboard = telebot.types.InlineKeyboardMarkup() url_button = telebot.types.InlineKeyboardButton('ОПЛАТИТЬ' , url=f'https://t.me/cdm_bank_bot?start={fp_id}') keyboard.add(url_button) bot.send_message(int(chat_id), f''' `----- ЧЕК -----` Сумма: `{amount}` CDM Получатель: `{nick}` `---------------`''', parse_mode='Markdown', reply_markup=keyboard) return 'OK' except: return 'Error' def run_api(): uvicorn.run(app, host='0.0.0.0', port=7002) # Запускаем API для переводов api = Thread(target=run_api) api.Daemon = True api.start() # Запускаем бота bot.infinity_polling()