Compare commits

..

3 Commits
main ... main

@ -1,5 +1,6 @@
# CryptoDM # CryptoIZ
Форк https://gitea.del.pw/justuser/dm_moneybot Форк https://gitea.del.pw/justuser/CryptoDM#
Новая версия с ТГ, ДС, API и блэкджеком. Новая валюта.
наверное...

137
api.py

@ -1,7 +1,5 @@
from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException
from pydantic import BaseModel from pydantic import BaseModel
from datetime import datetime, timedelta
from statistics import median
# Fix 3.3 + 0.15 = 3.4499999999999997 # Fix 3.3 + 0.15 = 3.4499999999999997
from decimal import Decimal as d from decimal import Decimal as d
@ -21,23 +19,6 @@ def token_check(token):
else: else:
return False return False
def stat_run(cdm_change):
stat = read('stat.json')
date = datetime.today().strftime('%Y-%m-%d')
if date in stat:
stat[date]['gbal'] += cdm_change
write(stat, 'stat.json')
else:
db = read()
bal = 0
for id in db['id']:
bal += db['id'][id]['bal']
stat[date] = {'gbal': bal, 'time2cdm': 0}
write(stat, 'stat.json')
def format_sign(number):
return f"+{number}" if number > 0 else f"{number}"
class User_in_db(BaseModel): class User_in_db(BaseModel):
token: str token: str
id: str = None id: str = None
@ -93,7 +74,7 @@ def user_add(it: User_add):
print(id) print(id)
if token_check(token): if token_check(token):
db = read() db = read()
db['id'][id] = {'tg': tg, 'ds': ds, 'mine': mine, 'nick': nick, 'passwd': passwd, 'bal': 0.0, 'time': 0} db['id'][id] = {'tg': tg, 'ds': ds, 'mine': mine, 'nick': nick, 'passwd': passwd, 'bal': 0.0}
db['nick'][nick] = id db['nick'][nick] = id
if tg: if tg:
db['tg'][tg] = id db['tg'][tg] = id
@ -134,12 +115,11 @@ class Coins_add(BaseModel):
amount: str amount: str
@app.post('/api/coins_add/') @app.post('/api/coins_add/')
def coins_add(it: Coins_add): def coins_add(it: Coins_add):
token, id, amount = it.token, it.id, abs(float(it.amount)) token, id, amount = it.token, it.id, float(it.amount)
if token_check(token): if token_check(token):
db = read() db = read()
db['id'][id]['bal'] = fix_add(db['id'][id]['bal'], amount) db['id'][id]['bal'] = fix_add(db['id'][id]['bal'], amount)
write(db) write(db)
stat_run(amount)
return 'OK' return 'OK'
else: else:
return 'Error' return 'Error'
@ -150,18 +130,14 @@ class Coins_del(BaseModel):
amount: str amount: str
@app.post('/api/coins_del/') @app.post('/api/coins_del/')
def coins_del(it: Coins_del): def coins_del(it: Coins_del):
token, id, amount = it.token, it.id, abs(float(it.amount)) token, id, amount = it.token, it.id, float(it.amount)
if token_check(token): if token_check(token):
db = read() db = read()
if db['id'][id]['bal'] >= amount: db['id'][id]['bal'] = fix_sub(db['id'][id]['bal'], amount)
db['id'][id]['bal'] = fix_sub(db['id'][id]['bal'], amount) write(db)
write(db) return 'OK'
stat_run(amount*-1) else:
return 'OK' return 'Error'
else:
return 'Error'
else:
return 'Error'
class Coins_transfer(BaseModel): class Coins_transfer(BaseModel):
token: str token: str
@ -281,7 +257,7 @@ class Update_passwd(BaseModel):
id: str id: str
passwd: str passwd: str
@app.post('/api/update_passwd/') @app.post('/api/update_passwd/')
def update_passwd(it: Update_passwd): def update_tg(it: Update_passwd):
token, id, passwd = it.token, it.id, it.passwd token, id, passwd = it.token, it.id, it.passwd
if token_check(token): if token_check(token):
db = read() db = read()
@ -291,37 +267,6 @@ def update_passwd(it: Update_passwd):
else: else:
return 'Error' return 'Error'
class Update_time(BaseModel):
token: str
id: str
time: str
@app.post('/api/update_time/')
def update_time(it: Update_time):
token, id, time = it.token, it.id, int(it.time)
if token_check(token):
db = read()
db['id'][id]['time'] = time
write(db)
return 'OK'
else:
return 'Error'
class Add_time(BaseModel):
token: str
id: str
time: str
@app.post('/api/add_time/')
def add_time(it: Add_time):
token, id, time = it.token, it.id, int(it.time)
if token_check(token):
db = read()
db['id'][id]['time'] += time
write(db)
return 'OK'
else:
return 'Error'
class Check_bal(BaseModel): class Check_bal(BaseModel):
token: str token: str
@ -395,66 +340,6 @@ def get_passwd(it: Get_passwd):
else: else:
return 'Error' return 'Error'
class Get_time(BaseModel):
token: str
id: str
@app.post('/api/get_time/')
def get_time(it: Get_time):
token, id = it.token, it.id
if token_check(token):
db = read()
return db['id'][id]['time']
else:
return 'Error'
class Get_stat(BaseModel):
token: str
@app.post('/api/get_stat/')
def get_stat(it: Get_stat):
token = it.token
if token_check(token):
# Общий баланс, среднее значение, медиана
# Низшее значение, высшее значение
# Изменение баланса и time2cdm
# Прирост за счёт алмазов, за счёт time2cdm
stat_run(0)
stats = {'gbal': 0, 'average': 0, 'median': 0, 'time2cdm': 0,
'gbal_delta': '0', 'time2cdm_delta': '',
'min': 0, 'max': 0,
'up_diamond': 0}
stat = read('stat.json')
date = datetime.today().strftime('%Y-%m-%d')
yesterday = (datetime.today() - timedelta(days=1)).strftime('%Y-%m-%d')
if yesterday in stat:
gbal_y = stat[yesterday]['gbal']
time2cdm_y = stat[yesterday]['time2cdm']
else:
gbal_y, time2cdm_y = 0, 0
gbal = stat[date]['gbal']
time2cdm = stat[date]['time2cdm']
# Получаем все балансы
db = read()
bals = []
for id in db['id']:
bals.append(db['id'][id]['bal'])
# Заполняем данные
stats['gbal'] = round(gbal, 3)
stats['average'] = round(sum(bals)/len(bals), 3)
stats['median'] = round(median(bals), 3)
stats['time2cdm'] = round(time2cdm, 3)
stats['gbal_delta'] = format_sign(round(gbal-gbal_y, 3))
stats['time2cdm_delta'] = format_sign(round(time2cdm-time2cdm_y, 3))
stats['min'] = round(min([x for x in bals if x != 0]), 3)
stats['max'] = round(max(bals), 3)
stats['up_diamond'] = round(gbal - (gbal_y + time2cdm), 3)
return stats
else:
return 'Error'
# TODO: unauth from account # TODO: unauth from account
if __name__ == '__main__': if __name__ == '__main__':

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

@ -1,5 +1,5 @@
from requests import post from requests import post
from json import dumps, loads from json import dumps
from xxhash import xxh32 from xxhash import xxh32
from db import * from db import *
@ -11,20 +11,14 @@ def hash(text):
text = str(text) text = str(text)
return xxh32(text).hexdigest() return xxh32(text).hexdigest()
def call(api_url, data, pre=True, fix=True): def call(api_url, data, pre=True):
if pre: if pre:
response = post(url_pre + api_url, data=dumps(data)) response = post(url_pre + api_url, data=dumps(data))
else: else:
response = post(api_url, data=dumps(data)) response = post(api_url, data=dumps(data))
#print(response.status_code) print(response.status_code)
#print(response.text) print(response.text)
try: return response.text.replace('"', '')
if fix:
return response.text.replace('"', '')
else:
return response.text
except:
return response.text
def user_in_db(token, id=None, tg=None, ds=None, mine=None, nick=None): def user_in_db(token, id=None, tg=None, ds=None, mine=None, nick=None):
data = {'token': token} data = {'token': token}
@ -92,10 +86,6 @@ def update_passwd(token, id, passwd):
data = {'token': token, 'id': id, 'passwd': hash(passwd)} data = {'token': token, 'id': id, 'passwd': hash(passwd)}
return call('api/update_passwd/', data) return call('api/update_passwd/', data)
def update_time(token, id, time):
data = {'token': token, 'id': id, 'time': time}
return call('api/update_time/', data)
def check_bal(token, id): def check_bal(token, id):
data = {'token': token, 'id': id} data = {'token': token, 'id': id}
@ -106,28 +96,20 @@ def get_nick(token, id):
return call('api/get_nick/', data) return call('api/get_nick/', data)
def get_tg(token, id): def get_tg(token, id):
data = {'token': token, 'id': id} data = {'token': token, 'id': id}
return call('api/get_tg/', data) return call('api/get_tg/', data)
def get_ds(token, id): def get_ds(token, id):
data = {'token': token, 'id': id} data = {'token': token, 'id': id}
return call('api/get_ds/', data) return call('api/get_ds/', data)
def get_mine(token, id): def get_mine(token, id):
data = {'token': token, 'id': id} data = {'token': token, 'id': id}
return call('api/get_mine/', data) return call('api/get_mine/', data)
def get_passwd(token, id): def get_passwd(token, id):
data = {'token': token, 'id': id} data = {'token': token, 'id': id}
return call('api/get_passwd/', data) return call('api/get_passwd/', data)
def get_time(token, id):
data = {'token': token, 'id': id}
return call('api/get_time/', data)
def get_stat(token):
data = {'token': token}
return loads(call('api/get_stat/', data, fix=False))
def transfer_callback(addr, token, src_nick, dst_nick, amount): def transfer_callback(addr, token, src_nick, dst_nick, amount):
amount = str(amount) amount = str(amount)

16
db.py

@ -15,25 +15,13 @@ if not os.path.exists('db.json'):
if not os.path.exists('conf.json'): if not os.path.exists('conf.json'):
db = {'api_token': 'None', db = {'api_token': 'None',
'tg_token': 'None', 'tg_token': 'None',
'ds_token': 'None', 'ds_token': 'None'}
'push_src_nick': 0,
'push_id': 0,
'push_amount': 0,
'time2cdm': 0,
'owner': 0}
js = json.dumps(db, indent=2) js = json.dumps(db, indent=2)
with open("conf.json", "w") as outfile: with open("conf.json", "w") as outfile:
outfile.write(js) outfile.write(js)
print('Created new conf.json') print('Created new conf.json')
if not os.path.exists('stat.json'):
db = {}
js = json.dumps(db, indent=2)
with open("stat.json", "w") as outfile:
outfile.write(js)
print('Created new stat.json')
def read(file = 'db.json'): def read(file = 'db.json'):
with open(file, "r", encoding="utf-8") as openfile: with open(file, "r", encoding="utf-8") as openfile:
db = json.load(openfile) db = json.load(openfile)

87
ds.py

@ -86,21 +86,16 @@ async def help(message):
/nick ник - Смена ника /nick ник - Смена ника
/bal - Баланс /bal - Баланс
/pay ник сумма - Перевод /pay ник сумма - Перевод
/time2cdm - Конвертация времени на сервере в CDM
/stats - Статистика
` `
''') ''')
async def bal(message): async def bal(message):
send = message.channel.send send = message.channel.send
if await checkauth(message): if await checkauth(message):
id = user_in_db(API_TOKEN, ds=message.author.id) id = user_in_db(API_TOKEN, ds=message.author.id)
coins = check_bal(API_TOKEN, id) coins = check_bal(API_TOKEN, id)
nick = get_nick(API_TOKEN, id) nick = get_nick(API_TOKEN, id)
time = int(get_time(API_TOKEN, id)) await send(f'''Ваш баланс: `{coins}` CDM
hours = time//3600 ; minutes = (time - hours*3600)//60
await send(f'''Ваш баланс: `{coins}` CDM
Время на сервере: `{f"{hours}:{minutes}"}`
Ник: `{nick}`''') Ник: `{nick}`''')
@ -212,63 +207,23 @@ async def pay(message):
else: else:
await send('/pay ник количество') await send('/pay ник количество')
async def time2cdm(message):
send = message.channel.send
if await checkauth(message):
id = user_in_db(API_TOKEN, ds=message.author.id)
course = read('conf.json')['time2cdm']
time = int(get_time(API_TOKEN, id))
amount = time*course
if update_time(API_TOKEN, id, '0'):
if coins_add(API_TOKEN, id, str(amount)):
# Статистика
stat = read('stat.json')
date = datetime.today().strftime('%Y-%m-%d')
stat[date]['time2cdm'] += amount
write(stat, 'stat.json')
await send(f'''Вы успешно конвертировали время на сервере в `{str(amount)}` CDM.''')
async def stats(message):
send = message.channel.send
if await checkauth(message):
data = get_stat(API_TOKEN)
bal = f'Баланс ({data["gbal_delta"]})'
t2cdm = f'Time2cdm ({data["time2cdm_delta"]})'
max_len = max(len(bal), len(t2cdm), 19)
await send(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"]}
```
''')
@bot.event @bot.event
async def on_message(message): async def on_message(message):
send = message.channel.send send = message.channel.send
if command('help', message): if command('help', message):
await help(message) await help(message)
elif command('reg', message): elif command('reg', message):
await reg(message) await reg(message)
elif command('login', message): elif command('login', message):
await login(message) await login(message)
elif command('unreg', message): elif command('unreg', message):
await unreg(message) await unreg(message)
elif command('bal', message): elif command('bal', message):
await bal(message) await bal(message)
elif command('passwd', message): elif command('passwd', message):
await passwd(message) await passwd(message)
elif command('pay', message): elif command('pay', message):
await pay(message) await pay(message)
elif command('time2cdm', message):
await time2cdm(message)
elif command('stats', message):
await stats(message)
# API для переводов TG->DS / ... # API для переводов TG->DS / ...

62
tg.py

@ -63,8 +63,6 @@ def help(message):
/nick ник - Смена ника /nick ник - Смена ника
/bal - Баланс /bal - Баланс
/pay ник сумма - Перевод /pay ник сумма - Перевод
/time2cdm - Конвертация времени на сервере в CDM
/stats - Статистика
""")} """)}
''', parse_mode='HTML') ''', parse_mode='HTML')
@ -163,10 +161,7 @@ def bal(message):
id = user_in_db(API_TOKEN, tg=message.chat.id) id = user_in_db(API_TOKEN, tg=message.chat.id)
coins = check_bal(API_TOKEN, id) coins = check_bal(API_TOKEN, id)
nick = get_nick(API_TOKEN, id) nick = get_nick(API_TOKEN, id)
time = int(get_time(API_TOKEN, id))
hours = time//3600 ; minutes = (time - hours*3600)//60
bot.reply_to(message, f'''Ваш баланс: {hcode(coins)} CDM bot.reply_to(message, f'''Ваш баланс: {hcode(coins)} CDM
Время на сервере: {hcode(f"{hours}:{minutes}")}
Ник: {hcode(nick)}''', parse_mode='HTML') Ник: {hcode(nick)}''', parse_mode='HTML')
@ -201,63 +196,6 @@ def pay(message):
else: else:
bot.reply_to(message, '/pay ник количество') bot.reply_to(message, '/pay ник количество')
@bot.message_handler(commands=['time2cdm'])
def time2cdm(message):
if checkauth(message):
id = user_in_db(API_TOKEN, tg=message.chat.id)
course = read('conf.json')['time2cdm']
time = int(get_time(API_TOKEN, id))
amount = time*course
if update_time(API_TOKEN, id, '0'):
if coins_add(API_TOKEN, id, str(amount)):
# Статистика
stat = read('stat.json')
date = datetime.today().strftime('%Y-%m-%d')
stat[date]['time2cdm'] += amount
write(stat, 'stat.json')
bot.reply_to(message, f'''Вы успешно конвертировали время на сервере в {hcode(str(amount))} CDM.'''
, parse_mode='HTML')
@bot.message_handler(commands=['stats'])
def stats(message):
if checkauth(message):
data = get_stat(API_TOKEN)
bal = f'Баланс ({data["gbal_delta"]})'
t2cdm = f'Time2cdm ({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(func=lambda message: True) @bot.message_handler(func=lambda message: True)
def checks(message): def checks(message):
if message.text == 'Баланс': if message.text == 'Баланс':

Loading…
Cancel
Save