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('Перевод') 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): pass else: bot.reply_to(message, 'Всё работает', reply_markup=markup) @bot.message_handler(commands=['help']) def help(message): bot.reply_to(message, f'''Исходный код: https://gitea.del.pw/justuser/CryptoDM Доступные команды: {hcode("""/help - Помощь /reg ник - Регистрация /login ник пароль - Войти в аккаунт /unreg - Выйти из аккаунта /passwd пароль - Смена пароля /nick ник - Смена ника /bal - Баланс /pay ник сумма - Перевод """)} ''', parse_mode='HTML') @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 user_add(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) print('!!!!', get_tg(API_TOKEN, id)) 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=['unreg']) def unreg(message): id = user_in_db(API_TOKEN, tg=message.chat.id) print(int(id)) print("1") if user_del(API_TOKEN, id) == 'OK': bot.reply_to(message, 'OK') ''' @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 = check_bal(API_TOKEN, id) nick = get_nick(API_TOKEN, id) bot.reply_to(message, f'''Ваш баланс: {hcode(coins)} CDM Ник: {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 = coins_transfer(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 ник количество') @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)) print(tg_dst) bot.send_message(tg_dst, f'''Вам перевели {hcode(amount)} CDM. Отправитель: {hcode(src_nick)}''', parse_mode='HTML') return 200 else: return 'Error' def run_api(): uvicorn.run(app, host='127.0.0.1', port=7002) # Запускаем API для переводов api = Thread(target=run_api) api.Daemon = True api.start() # Запускаем бота bot.infinity_polling()