den4ik2003

Untitled

Jan 31st, 2025
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.79 KB | None | 0 0
  1. import asyncio
  2. import logging
  3. import os
  4. import json
  5. import subprocess
  6. import signal
  7. import psutil
  8. import time
  9. from datetime import datetime, timezone, timedelta
  10. from pathlib import Path
  11. from aiogram.types import Message
  12. from aiogram.enums import ParseMode
  13. from aiogram import Bot, Dispatcher, types
  14. from aiogram.filters.command import Command
  15. from aiogram import F
  16. from aiogram.exceptions import TelegramBadRequest
  17. from apscheduler.schedulers.asyncio import AsyncIOScheduler
  18.  
  19. logging.basicConfig(level=logging.INFO)
  20.  
  21. scheduler = AsyncIOScheduler()
  22. bot = Bot(token="7030520224:AAEnyKFkIsgS6QzVnexn3EiWM9Dlgb3WBPY")
  23. dp = Dispatcher()
  24.  
  25. # chat_ids = {
  26. # -4567096432: ["DOR", "DAG", "KRU", "LTX", "ABDS", "GHUB", "IMARO", "SENDOR", "AEROBUD", "OBORTECH", "VGX", "CHAMP", "CHEX", "RBX", "MEI", "DOGA", "SOLAR", "$SX"], # managing group
  27. # -1002150192437: ["DOR", "DAG", "KRU", "LTX", "ABDS", "GHUB", "IMARO", "SENDOR", "AEROBUD", "OBORTECH", "VGX", "CHAMP", "CHEX", "RBX", "MEI", "DOGA", "SOLAR", "$SX"], # managing group
  28. # -4147360362: ["DAG","IMARO", "$SX"], # test group
  29. # # client groups
  30. # -4531845094: ["DAG"],
  31. # -4573489347: ["GHUB"],
  32. # -1002385516473: ["ABDS"],
  33. # -1002404653479: ["KRU"],
  34. # -4537296744: ["DOR"],
  35. # -4541252605: ["LTX"],
  36. # -4742454014: ["AEROBUD"],
  37. # -4560694856: ["IMARO"],
  38. # -4743728721: ["OBORTECH"],
  39. # -1002264729612: ["VGX"],
  40. # -4679815932: ["CHAMP"],
  41. # -4770925676: ["CHEX"],
  42. # -4626936453: ["RBX"],
  43. # -4788418340: ["MEI"],
  44. # -4663628175: ["DOGA"],
  45. # -4747537835: ["SOLAR"],
  46. # -4770221167: ["$SX"]
  47. # }
  48.  
  49. chat_ids = {}
  50.  
  51. def parse_clients_json():
  52. with open('clients.json', 'r') as clients_f:
  53. chat_ids = json.loads(''.join(clients_f.readlines()).replace(' ', '').replace('\n', ''))
  54.  
  55. timezones = {
  56. -4788418340: timedelta(hours=9),
  57. # -1002150192437: timedelta(hours=3),
  58. }
  59.  
  60. path_to_mm_balances_dir = '/mnt/mm_telemetry'
  61. path_to_volume_balances_dir = '/mnt/volume_telemetry'
  62. balance_state = {}
  63. prev_wide_spread = {}
  64. stopped = []
  65.  
  66.  
  67. @dp.message(Command("add_token"))
  68. async def add_token(message: types.Message):
  69. current_chat_id = str(message.chat.id)
  70. token_name = ''.upper()
  71. if current_chat_id in chat_ids:
  72. chat_ids[current_chat_id].append(token_name)
  73. else:
  74. chat_ids[current_chat_id] = [token_name]
  75.  
  76. with open('clients.json', 'w') as clients_f:
  77. clients_f.write(json.dumps(chat_ids))
  78.  
  79. await message.answer(f"{token_name} was successfully added")
  80.  
  81.  
  82. @dp.message(Command("liquidity_volume"))
  83. async def volume_balances(message: types.Message):
  84. files_path = [path_to_volume_balances_dir + '/' + file.name for file in Path(path_to_volume_balances_dir).iterdir() if file.is_file()]
  85. trades_size = {}
  86.  
  87. for balance_file in files_path:
  88. name = balance_file.split('/')[-1]
  89.  
  90. if str(message.chat.id) not in chat_ids:
  91. await message.answer("Your chat is not in whitelist")
  92. return
  93.  
  94. is_clients_coin = False
  95. for coin in chat_ids[str(message.chat.id)]:
  96. if coin.lower() == name.split('_')[0].lower():
  97. is_clients_coin = True
  98. break
  99. if not is_clients_coin:
  100. continue
  101.  
  102. total_trades, last_time = await calculate_private_trades(balance_file)
  103. if total_trades == -1 and last_time == -1: # decode error
  104. continue
  105. if last_time != 0:
  106. last_time = str(datetime.fromtimestamp(int(last_time / 1000)))
  107. trades_size[name] = f'\nliquidity_volume (24h): {round(total_trades, 2)}\nearliest 24h trade time: {last_time}\n'
  108.  
  109. trades_answer = ''
  110. for name in sorted(trades_size.keys(), key=lambda s: s.lower()):
  111. print_name = ''
  112. parse_name = name.replace('-', ' ').replace('_', ' ').split(' ')
  113. if len(parse_name) == 2:
  114. print_name += parse_name[0].upper() + " " + parse_name[1]
  115. elif len(parse_name) == 3:
  116. print_name += (parse_name[0] + parse_name[1]).upper() + " " + parse_name[2]
  117. elif len(parse_name) == 4:
  118. print_name += (parse_name[0] + parse_name[1]).upper() + " " + parse_name[2] + parse_name[3]
  119.  
  120. trades_answer += f'{print_name}:{trades_size[name]}\n'
  121.  
  122. await message.answer(trades_answer)
  123.  
  124.  
  125. @dp.message(Command("volume_balances"))
  126. async def volume_balances(message: types.Message):
  127. files_path = [path_to_volume_balances_dir + '/' + file.name for file in Path(path_to_volume_balances_dir).iterdir() if file.is_file()]
  128. balances = {}
  129. trades_size = {}
  130.  
  131. for balance_file in files_path:
  132. p = subprocess.Popen(['tail', '-20', balance_file],shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
  133. res, err = p.communicate()
  134. if not err:
  135. name = balance_file.split('/')[-1]
  136.  
  137. if str(message.chat.id) not in chat_ids:
  138. await message.answer("Your chat is not in whitelist")
  139. return
  140.  
  141. is_clients_coin = False
  142. symbol_name = '_'.join(name.split('_')[:2])
  143. base_asset = symbol_name.split('_')[0]
  144. quote_asset = symbol_name.split('_')[1]
  145. for coin in chat_ids[str(message.chat.id)]:
  146. if coin.upper() == base_asset:
  147. is_clients_coin = True
  148. break
  149. if not is_clients_coin:
  150. continue
  151.  
  152. decoded = res.decode().split('\n')[::-1]
  153. for line in decoded:
  154. splitted = line.split(' ')
  155.  
  156. if len(splitted) < 3:
  157. continue
  158.  
  159. if splitted[1] == 'balance':
  160. tz = timezone(timezones.get(message.chat.id, timedelta(hours=0)))
  161. time = datetime.fromtimestamp(int(int(splitted[0]) / 1000), tz)
  162. info_dict = json.loads(''.join(splitted[2:]).replace("'", '"'))
  163. base, quote = float(info_dict['base']), float(info_dict['quote'])
  164. balances[name] = f"\ntime: {str(time)}\n{base_asset}: {base}\n{quote_asset}: {quote}\n"
  165.  
  166. else:
  167. print(err.decode())
  168.  
  169. answers = []
  170. balances_answer = ''
  171. for name in sorted(balances.keys(), key=lambda s: s.lower()):
  172. z = name.split('_')
  173. parse_name = '/'.join(z[:2]) + ' ' + '_'.join(z[2:])
  174. balances_answer += f'{parse_name}:{balances[name]}\n'
  175.  
  176. await message.answer(balances_answer)
  177.  
  178.  
  179. async def calculate_private_trades(balance_file):
  180. grep_command = ['grep', 'private_trades', balance_file]
  181. tail_command = ['tail', '-n', '100000']
  182.  
  183. with subprocess.Popen(grep_command, stdout=subprocess.PIPE) as grep_process:
  184. with subprocess.Popen(tail_command, stdin=grep_process.stdout, stdout=subprocess.PIPE) as tail_process:
  185. res, err = tail_process.communicate()
  186. if not err:
  187. decoded = res.decode().split('\n')[::-1]
  188. else:
  189. print(err.decode())
  190. return -1, -1
  191.  
  192. total = 0
  193. critical_time = int(time.time() * 1000) - 86400000
  194. last_time = 0
  195. for line in decoded:
  196. splitted = line.split(' ')
  197.  
  198. if len(splitted) < 3:
  199. continue
  200.  
  201. if (int(splitted[0]) < critical_time):
  202. break
  203.  
  204. if splitted[1] == 'private_trades': # на всякий случай проверка
  205. trades = eval(''.join(splitted[2:]).replace("'", '"'))
  206. if len(trades) == 0:
  207. continue
  208.  
  209. last_time = int(splitted[0])
  210. total += float(trades[0]['price']) * float(trades[0]['quantity'])
  211.  
  212. return total, last_time
  213.  
  214. @dp.message(Command("mm_balances"))
  215. async def mm_balance(message: types.Message):
  216. files_path = [path_to_mm_balances_dir + '/' + file.name for file in Path(path_to_mm_balances_dir).iterdir() if file.is_file()]
  217. balances = {}
  218.  
  219. for balance_file in files_path:
  220. p = subprocess.Popen(['tail', '-20', balance_file],shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
  221. res, err = p.communicate()
  222. if not err:
  223. name = balance_file.split('/')[-1]
  224.  
  225. if str(message.chat.id) not in chat_ids:
  226. await message.answer("Your chat is not in whitelist")
  227. return
  228.  
  229. is_clients_coin = False
  230. symbol_name = '_'.join(name.split('_')[:2])
  231. base_asset = symbol_name.split('_')[0]
  232. quote_asset = symbol_name.split('_')[1]
  233. for coin in chat_ids[str(message.chat.id)]:
  234. if coin == base_asset:
  235. is_clients_coin = True
  236. break
  237. if not is_clients_coin:
  238. continue
  239.  
  240. decoded = res.decode().split('\n')[::-1]
  241. for line in decoded:
  242. splitted = line.split(' ')
  243.  
  244. if len(splitted) < 3:
  245. continue
  246.  
  247. if splitted[1] == 'balance':
  248. tz = timezone(timezones.get(message.chat.id, timedelta(hours=0)))
  249. time = datetime.fromtimestamp(int(int(splitted[0]) / 1000), tz)
  250. info_dict = json.loads(''.join(splitted[2:]).replace("'", '"'))
  251. base, quote = float(info_dict['base']), float(info_dict['quote'])
  252. balances[name] = f"\ntime: {str(time)}\n{base_asset}: {base}\n{quote_asset}: {quote}\n"
  253.  
  254. else:
  255. print(err.decode())
  256.  
  257. answers = []
  258. balances_answer = ''
  259. for name in sorted(balances.keys(), key=lambda s: s.lower()):
  260. # print_name = ''
  261. # parse_name = name.replace('-', ' ').replace('_', ' ').split(' ')
  262. # if len(parse_name) == 2:
  263. # print_name += parse_name[0].upper() + " " + parse_name[1]
  264. # elif len(parse_name) == 3:
  265. # print_name += (parse_name[0] + parse_name[1]).upper() + " " + parse_name[2]
  266. z = name.split('_')
  267. parse_name = '/'.join(z[:2]) + ' ' + '_'.join(z[2:])
  268. balances_answer += f'{parse_name}:{balances[name]}\n'
  269.  
  270. await message.answer(balances_answer)
  271.  
  272.  
  273. @dp.message(Command("cashout_balances"))
  274. async def cashout_balances(message: types.Message):
  275. files_path = ['/mnt/tb_telemetry/' + file.name for file in Path('/mnt/tb_telemetry').iterdir() if file.is_file()]
  276. balances = {}
  277. trades_size = {}
  278.  
  279. for balance_file in files_path:
  280. p = subprocess.Popen(['tail', '-20', balance_file],shell=False, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
  281. res, err = p.communicate()
  282. if not err:
  283. name = balance_file.split('/')[-1]
  284.  
  285. if 'FUCK' in name.upper():
  286. continue
  287.  
  288. if str(message.chat.id) not in chat_ids:
  289. await message.answer("Your chat is not in whitelist")
  290. return
  291.  
  292. is_clients_coin = False
  293. symbol_name = '_'.join(name.split('_')[:2])
  294. base_asset = symbol_name.split('_')[0]
  295. quote_asset = symbol_name.split('_')[1]
  296.  
  297. for coin in chat_ids[str(message.chat.id)]:
  298. if coin.upper() == base_asset:
  299. is_clients_coin = True
  300. break
  301. if not is_clients_coin:
  302. continue
  303.  
  304. decoded = res.decode().split('\n')[::-1]
  305. for line in decoded:
  306. splitted = line.split(' ')
  307.  
  308. if len(splitted) < 3:
  309. continue
  310.  
  311. if splitted[1] == 'balance':
  312. tz = timezone(timezones.get(message.chat.id, timedelta(hours=0)))
  313. time = datetime.fromtimestamp(int(int(splitted[0]) / 1000), tz)
  314. info_dict = json.loads(''.join(splitted[2:]).replace("'", '"'))
  315. base, quote = float(info_dict['base']), float(info_dict['quote'])
  316. balances[name] = f"\ntime: {str(time)}\n{base_asset}: {base}\n{quote_asset}: {quote}\n"
  317.  
  318. else:
  319. print(err.decode())
  320.  
  321. answers = []
  322. balances_answer = ''
  323. for name in sorted(balances.keys(), key=lambda s: s.lower()):
  324. z = name.split('_')
  325. parse_name = '/'.join(z[:2]) + ' ' + '_'.join(z[2:])
  326. balances_answer += f'{parse_name}:{balances[name]}\n'
  327.  
  328. await message.answer(balances_answer)
  329.  
  330.  
  331. @dp.message(F.text)
  332. async def bad_message(message: Message):
  333. print(message.chat.id)
  334. await message.answer("I don't understand you")
  335.  
  336.  
  337. async def main():
  338. await dp.start_polling(bot)
  339.  
  340. if __name__ == "__main__":
  341. parse_clients_json()
  342.  
  343. asyncio.run(main())
  344.  
Add Comment
Please, Sign In to add comment