CryptoDM/tg.py
Your Name 0b8878dbb6 fix
2024-12-05 12:59:18 +03:00

362 lines
13 KiB
Python

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()