From d5c2da6a93c8bbeaa4b1c0e3fe264723bad67314 Mon Sep 17 00:00:00 2001 From: justuser Date: Fri, 26 Jul 2024 23:01:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=94=D0=A1-=D0=A2=D0=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.py.bak | 305 ++++++++++++++++++++++++++++++++++++++++++++++++++++ call2api.py | 14 ++- ds.py | 247 ++++++++++++++++++++++++++++++++++++++++++ tg.py | 16 ++- 4 files changed, 572 insertions(+), 10 deletions(-) create mode 100644 api.py.bak create mode 100644 ds.py diff --git a/api.py.bak b/api.py.bak new file mode 100644 index 0000000..7fb6e8c --- /dev/null +++ b/api.py.bak @@ -0,0 +1,305 @@ +from fastapi import FastAPI, HTTPException +from pydantic import BaseModel + +from db import * + +app = FastAPI() + +def token_check(token): + db = read() + if token in db['tokens']: + return True + else: + return False + +class User_in_db(BaseModel): + token: str + id: str = None + tg: str = None + ds: str = None + mine: str = None + nick: str = None +@app.post('/api/user_in_db/') +def user_in_db(it: User_in_db): + token, id, tg, ds, mine, nick = it.token, it.id, it.tg, it.ds, it.mine, it.nick + if token_check(token): + db = read() + if id and id in db['id']: + return id + elif tg and tg in db['tg']: + return db['tg'][tg] + elif ds and ds in db['ds']: + return db['ds'][ds] + elif mine and mine in db['mine']: + return db['mine'][mine] + elif nick and nick in db['nick']: + return db['nick'][nick] + else: + return False + else: + return 'Error' + + +def gen_id(): + db = read() + for i in range(1,100000): + check = str(i) + print(db) + if check not in db['id']: + return str(i) + return 'Full?' + +class User_add(BaseModel): + token: str + id: str = None + tg: str = None + ds: str = None + mine: str = None + nick: str + passwd: str +@app.post('/api/user_add/') +def user_add(it: User_add): + token, id, tg, ds, mine, nick, passwd = it.token, it.id, it.tg, it.ds, it.mine, it.nick, it.passwd + id = gen_id() + print(id) + if token_check(token): + db = read() + db['id'][id] = {'tg': tg, 'ds': ds, 'mine': mine, 'nick': nick, 'passwd': passwd, 'bal': 0.0} + db['nick'][nick] = id + if tg: + db['tg'][tg] = id + if ds: + db['ds'][ds] = id + if mine: + db['mine'][mine] = id + write(db) + return 'OK' + else: + return 'Error' + +class User_del(BaseModel): + token: str + id: str +@app.post('/api/user_del/') +def user_del(it: User_del): + token, id = it.token, it.id + if token_check(token): + db = read() + tg, ds, mine, nick = db['id'][id]['tg'], db['id'][id]['ds'], db['id'][id]['mine'], db['id'][id]['nick'] + del db['nick'][nick] + if tg: + del db['tg'][tg] + if ds: + del db['ds'][ds] + if mine: + del db['mine'][mine] + del db['id'][id] + write(db) + return 'OK' + else: + return 'Error' + +class Coins_add(BaseModel): + token: str + id: str + amount: str +@app.post('/api/coins_add/') +def coins_add(it: Coins_add): + token, id, amount = it.token, it.id, float(it.amount) + if token_check(token): + db = read() + db['id'][id]['bal'] += amount + write(db) + return 'OK' + else: + return 'Error' + +class Coins_del(BaseModel): + token: str + id: str + amount: str +@app.post('/api/coins_del/') +def coins_del(it: Coins_del): + token, id, amount = it.token, it.id, float(it.amount) + if token_check(token): + db = read() + db['id'][id]['bal'] -= amount + write(db) + return 'OK' + else: + return 'Error' + +class Coins_transfer(BaseModel): + token: str + src_id: str + dst_id: str + amount: str +@app.post('/api/coins_transfer/') +def coins_transfer(it: Coins_transfer): + token, src_id, dst_id, amount = it.token, it.src_id, it.dst_id, float(it.amount) + if token_check(token): + db = read() + src_bal = db['id'][src_id]['bal'] + if src_bal > amount: + db['id'][src_id]['bal'] -= amount + db['id'][dst_id]['bal'] += amount + write(db) + return 'OK' + else: + return 'No_money' + else: + return 'Error' + +class Update_tg(BaseModel): + token: str + id: str + tg: str +@app.post('/api/update_tg/') +def update_tg(it: Update_tg): + token, id, tg = it.token, it.id, it.tg + if token_check(token): + db = read() + cur_tg = db['id'][id]['tg'] + del db['tg'][cur_tg] + db['id'][id]['tg'] = tg + db['tg'][tg] = id + write(db) + return 'OK' + else: + return 'Error' + +class Update_ds(BaseModel): + token: str + id: str + ds: str +@app.post('/api/update_ds/') +def update_ds(it: Update_ds): + token, id, ds = it.token, it.id, it.ds + if token_check(token): + db = read() + cur_ds = db['id'][id]['ds'] + del db['ds'][cur_ds] + db['id'][id]['ds'] = ds + db['ds'][ds] = id + write(db) + return 'OK' + else: + return 'Error' + +class Update_mine(BaseModel): + token: str + id: str + mine: str +@app.post('/api/update_mine/') +def update_mine(it: Update_mine): + token, id, mine = it.token, it.id, it.mine + if token_check(token): + db = read() + cur_mine = db['id'][id]['mine'] + del db['mine'][cur_mine] + db['id'][id]['mine'] = mine + db['mine'][mine] = id + write(db) + return 'OK' + else: + return 'Error' + +class Update_nick(BaseModel): + token: str + id: str + nick: str +@app.post('/api/update_nick/') +def update_nick(it: Update_nick): + token, id, nick = it.token, it.id, it.nick + if token_check(token): + db = read() + cur_nick = db['id'][id]['nick'] + del db['nick'][cur_nick] + db['id'][id]['nick'] = nick + db['nick'][nick] = id + write(db) + return 'OK' + else: + return 'Error' + +class Update_passwd(BaseModel): + token: str + id: str + passwd: str +@app.post('/api/update_passwd/') +def update_tg(it: Update_tg): + token, id, passwd = it.token, it.id, it.passwd + if token_check(token): + db = read() + db['id'][id]['passwd'] = passwd + write(db) + return 'OK' + else: + return 'Error' + + +class Check_bal(BaseModel): + token: str + id: str +@app.post('/api/check_bal/') +def check_bal(it: Check_bal): + token, id = it.token, it.id + if token_check(token): + db = read() + return db['id'][id]['bal'] + else: + return 'Error' + +class Get_nick(BaseModel): + token: str + id: str +@app.post('/api/get_nick/') +def get_nick(it: Get_nick): + token, id = it.token, it.id + if token_check(token): + db = read() + return db['id'][id]['nick'] + else: + return 'Error' + +class Get_tg(BaseModel): + token: str + id: str +@app.post('/api/get_tg/') +def get_tg(it: Get_tg): + token, id = it.token, it.id + if token_check(token): + db = read() + return db['id'][id]['tg'] + else: + return 'Error' + +class Get_ds(BaseModel): + token: str + id: str +@app.post('/api/get_ds/') +def get_ds(it: Get_ds): + token, id = it.token, it.id + if token_check(token): + db = read() + return db['id'][id]['ds'] + else: + return 'Error' + +class Get_mine(BaseModel): + token: str + id: str +@app.post('/api/get_mine/') +def get_mine(it: Get_mine): + token, id = it.token, it.id + if token_check(token): + db = read() + return db['id'][id]['mine'] + else: + return 'Error' + +# TODO: unauth from account + +if __name__ == '__main__': + import uvicorn + uvicorn.run(app, host='127.0.0.1', port=1111) diff --git a/call2api.py b/call2api.py index 1bfba0f..2b9ba11 100644 --- a/call2api.py +++ b/call2api.py @@ -11,8 +11,11 @@ def hash(text): text = str(text) return xxh32(text).hexdigest() -def call(api_url, data): - response = post(url_pre + api_url, data=dumps(data)) +def call(api_url, data, pre=True): + if pre: + response = post(url_pre + api_url, data=dumps(data)) + else: + response = post(api_url, data=dumps(data)) print(response.status_code) print(response.text) return response.text.replace('"', '') @@ -108,9 +111,10 @@ def get_passwd(token, id): data = {'token': token, 'id': id} return call('api/get_passwd/', data) -def transfer_callbak(addr, token, src_id, amount): +def transfer_callback(addr, token, src_nick, dst_nick, amount): amount = str(amount) - data = {'token': token, 'src_id': src_id, 'amount': amount} - return call(addr + 'api/get_passwd/', data) + data = {'token': token, 'src_nick': src_nick, 'dst_nick': dst_nick, 'amount': amount} + print(addr + 'api/transfer_callback/') + return call(addr + 'api/transfer_callback/', data, pre=False) #print( user_in_db('ee77b9d8-44f3-4e01-a702-69d5524ee50b', '1234') ) diff --git a/ds.py b/ds.py new file mode 100644 index 0000000..6cad7f7 --- /dev/null +++ b/ds.py @@ -0,0 +1,247 @@ +import discord +from time import sleep + +intents = discord.Intents.default() +intents.message_content = True +bot = discord.Client(intents=intents) + +# 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'] +DS_TOKEN = read('conf.json')['ds_token'] + +from datetime import datetime +LCTIME = datetime.now() + +# Обнуляем данные +db = read('conf.json') +db['push_src_nick'] = 0 +db['push_id'] = 0 +db['push_amount'] = 0 +write(db, 'conf.json') + +# Поток для приёма входящих переводов ТГ-ДС (костыль) +from discord.ext import tasks +@tasks.loop(seconds = 0.1) +async def push(): + db = read('conf.json') + if db['push_id'] != 0: + src_nick, id, amount = db['push_src_nick'], db['push_id'], db['push_amount'] + user = await bot.fetch_user(id) + await user.send(f'''Вам перевели `{amount}` CDM. + +Отправитель: `{src_nick}`''') + db['push_src_nick'], db['push_id'], db['push_amount'] = 0, 0, 0 + write(db, 'conf.json') + + +@bot.event +async def on_ready(): + print(f'We have logged in as {bot.user}') + await push.start() + return 0 + +async def checkauth(message, reg = False): + send = message.channel.send + if user_in_db(API_TOKEN, ds=message.author.id) != 'false': + return True + elif reg: + pass + else: + await send('''Пожалуйста, зарегистрируйтесь или войдите: +`!reg Nickname 1234567890` +`!login Nickname 1234567890` + +Ник вводить желательно игровой. +Пароль любой.''') + +def command(com, message): + # Если не бот + if message.author != bot.user: + # Если не публичный чат + if message.channel.type != discord.ChannelType.text: + if message.content.startswith(f'!{com}'): + return True + +async def help(message): + send = message.channel.send + await send('''Исходный код: https://gitea.del.pw/justuser/CryptoDM + +Доступные команды: +`/help - Помощь +/reg ник - Регистрация +/login ник пароль - Войти в аккаунт +/unreg - Выйти из аккаунта +/passwd пароль - Смена пароля +/bal - Баланс +/pay ник сумма - Перевод +` +''') + +async def bal(message): + send = message.channel.send + if await checkauth(message): + id = user_in_db(API_TOKEN, ds=message.author.id) + coins = check_bal(API_TOKEN, id) + nick = get_nick(API_TOKEN, id) + await send(f'''Ваш баланс: `{coins}` CDM + +Ник: `{nick}`''') + +async def reg(message): + send = message.channel.send + if not await checkauth(message, reg=True): + global LCTIME + time_delta = datetime.now() - LCTIME + if time_delta.seconds < 1: + await send('Большая нагрузка, повторите запрос позже...') + return 0 + if len(message.content.split()) == 3: + com, nick, passwd = message.content.split() + # Проверяем нет ли такого же ника + if user_in_db(API_TOKEN, nick=nick) == 'false': + if user_add(API_TOKEN, nick, passwd, ds=message.author.id) == 'OK': + await send('Вы успешно зарегистрированны!') + else: + await send('Что-то пошло не так...') + else: + await send('Уже существует пользователь с таким ником') + else: + await send('/reg ник пароль') + else: + await send('Вы уже зарегистрированны') + +async def login(message): + send = message.channel.send + if len(message.content.split()) == 3: + global LCTIME + time_delta = datetime.now() - LCTIME + if time_delta.seconds < 1: + await send('Большая нагрузка, повторите запрос позже...') + return 0 + com, nick, passwd = message.content.split() + id = user_in_db(API_TOKEN, nick=nick) + if get_ds(API_TOKEN, id) != 'null': + await send('Этот пользователь уже авторизован') + elif get_passwd(API_TOKEN, id) == hash(passwd): + if update_ds(API_TOKEN, id, ds=message.author.id) == 'OK': + await send('Вы успешно авторизовались!') + else: + await send('Что-то пошло не так...') + else: + await send('Пароль не совпадает') + else: + await send('!login ник пароль') + +async def unreg(message): + send = message.channel.send + id = user_in_db(API_TOKEN, ds=message.author.id) + if update_ds(API_TOKEN, id, 'None') == 'OK': + await send('Вы успешно вышли из аккаунта') + +async def passwd(message): + send = message.channel.send + if await checkauth(message): + if len(message.content.split()) == 2: + com, passwd = message.content.split() + id = user_in_db(API_TOKEN, ds=message.author.id) + if update_passwd(API_TOKEN, id, passwd) == 'OK': + await send('Пароль успешно изменён.') + else: + await send('Что-то пошло не так...') + else: + await send('!passwd пароль') + +async def pay(message): + send = message.channel.send + if await checkauth(message): + if len(message.content.split()) == 3: + com, nick, amount = message.content.split() + if float(amount) <= 0.0001: + await send('Слишком малое или недопустимое значение.') + return 0 + amount = str(float(amount)) # Защиты от 1000 нулей в начале + src_id = user_in_db(API_TOKEN, ds=message.author.id) + dst_id = user_in_db(API_TOKEN, nick=nick) + if dst_id == 'false': + await send('Не существует такого пользователя.') + else: + status = coins_transfer(API_TOKEN, src_id, dst_id, amount) + if status == 'No_money': + await send('Недостаточно средств.') + elif status == 'OK': + await send(f'''Успешно переведено `{amount}` CDM. +Адресат: `{nick}`''') + ds_dst = get_ds(API_TOKEN, dst_id) + tg_dst = get_tg(API_TOKEN, dst_id) + src_nick = get_nick(API_TOKEN, src_id) + if ds_dst != 'null': + transfer_callback('http://127.0.0.1:3333/', API_TOKEN, src_nick, nick, amount) + elif tg_dst != 'null': + print(22222) + transfer_callback('http://127.0.0.1:2222/', API_TOKEN, src_nick, nick, amount) + else: + await send('!pay ник количество') + +@bot.event +async def on_message(message): + send = message.channel.send + if command('help', message): + await help(message) + elif command('reg', message): + await reg(message) + elif command('login', message): + await login(message) + elif command('unreg', message): + await unreg(message) + elif command('bal', message): + await bal(message) + elif command('passwd', message): + await passwd(message) + elif command('pay', message): + await pay(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) + ds_dst = int(get_ds(API_TOKEN, id=dst_id)) + # Передаём в поток данные (см начало скрипта) + db = read('conf.json') + db['push_src_nick'] = src_nick + db['push_id'] = ds_dst + db['push_amount'] = amount + write(db, 'conf.json') + return 200 + else: + return 'Error' + +def run_api(): + uvicorn.run(app, host='127.0.0.1', port=3333) + +# Запускаем API для переводов +api = Thread(target=run_api) +api.Daemon = True +api.start() + +# Запускаем бота +bot.run(DS_TOKEN) diff --git a/tg.py b/tg.py index a30cbe9..c435cc7 100644 --- a/tg.py +++ b/tg.py @@ -104,6 +104,8 @@ def login(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: @@ -169,9 +171,14 @@ def pay(message): elif status == 'OK': bot.reply_to(message, f'''Успешно переведено {hcode(amount)} CDM. Адресат: {hcode(nick)}''', parse_mode='HTML') - bot.send_message(int(get_tg(API_TOKEN, dst_id)), f'''Вам перевели {hcode(amount)} CDM. -Отправитель: {hcode(get_nick(API_TOKEN, src_id))}''', 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:2222/', API_TOKEN, src_nick, nick, amount) + elif ds_dst != 'null': + transfer_callback('http://127.0.0.1:3333/', API_TOKEN, src_nick, nick, amount) else: bot.reply_to(message, '/pay ник количество') @@ -182,15 +189,14 @@ def checks(message): elif message.text == 'Помощь': help(message) - # API для переводов TG->DS / ... -class Transfer_callback(BaseModel): +class Transfer_callback_api(BaseModel): token: str src_nick: str dst_nick: str amount: str @app.post('/api/transfer_callback/') -def transfer_callback(it: 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']: