Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2017
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 57.14 KB | None | 0 0
  1. var TelegramBot = require('node-telegram-bot-api');
  2.  
  3. // CONFIGURE THESE SETTINGS in config.js
  4. var c = require('./config');
  5.  
  6. // edit the text here
  7. var translated_texts = require('./bot_messages');
  8.  
  9. var WAValidator = require('wallet-address-validator');
  10. var blocktrail = require('blocktrail-sdk');
  11. var pg = require('pg');
  12.  
  13. // setup
  14.  
  15. var btc_client = blocktrail.BlocktrailSDK(c.blocktrail_opts);
  16. var webhook_url;
  17. var BASE_BLOCK_INFO_URL = (c.TESTNET ? 'https://www.blocktrail.com/tBTC/tx/' : 'https://blockchain.info/tx/');
  18.  
  19. var bot = new TelegramBot(c.TELE_TOKEN,
  20. {
  21. webHook: {
  22. port: process.env.PORT,
  23. autoOpen: false
  24. }
  25. }
  26. );
  27. webhook_url = process.env.APP_URL || c.HEROKU_URL;
  28.  
  29.  
  30. var validate_network_type = (c.TESTNET ? 'testnet':'prod');
  31.  
  32. var sql_config = process.env.DATABASE_URL || {
  33. user: 'postgres',
  34. database: 'postgres',
  35. password: 'password',
  36. host: 'localhost',
  37. port: 5432,
  38. };
  39.  
  40. var sql_client = new pg.Client(sql_config);
  41. sql_client.connect();
  42.  
  43. var user_id_to_info = {}; // cache stuff
  44.  
  45. // main bot class
  46.  
  47. function PonziBot(bot, sql_client) {
  48. // savedata
  49. var self = this;
  50. this.bot = bot;
  51. this.sql_client = sql_client;
  52. this.msg_lookup = new translated_texts.msg_dict()
  53.  
  54. this.languages = ['πŸ‡ΊπŸ‡Έ English','πŸ‡©πŸ‡ͺ Deutsch','πŸ‡«πŸ‡· FranΓ§ais','πŸ‡·πŸ‡Ί Русский'];
  55. this.language_keys = ['english', 'german', 'french', 'russian']
  56. this.admin_user_list = [];
  57.  
  58. var temp_kb = [];
  59. self.languages.forEach(function(l){
  60. temp_kb.push([{text: l}]);
  61. })
  62.  
  63. this.language_opts = {
  64. reply_markup: JSON.stringify({
  65. keyboard: temp_kb
  66. })
  67. };
  68.  
  69. // start wallet
  70. this.wallet = undefined;
  71. var initial_time = new Date(0);
  72. this.last_deposit = ['cc', 0, initial_time];
  73.  
  74. btc_client.initWallet(c.WALLET_NAME, c.WALLET_PASS, function(err, wallet) {
  75. if (err) {
  76. console.log(err);
  77. } else {
  78. self.wallet = wallet;
  79. // setup webhook for transactions
  80. if (webhook_url !== undefined) {
  81. self.wallet.setupWebhook(`${webhook_url}/blocktrail`,'default_webhook_id', function(err, result){
  82. if (err) {
  83. console.log('BOT SUCCESSFULLY STARTED');
  84. } else {
  85. console.log('webhook successfully setup');
  86. }
  87. });
  88. }
  89. }
  90. });
  91.  
  92. // helper funs
  93. this.pretty_print_amount = function(amt){
  94. return parseFloat(blocktrail.toBTC(amt))
  95. }
  96.  
  97. this.safe_send_msg = function(user_id, msg_text){
  98. try {
  99. self.bot.sendMessage(user_id, msg_text);
  100. }
  101. catch (e){
  102. console.log('error sending to', user_id);
  103. console.log(e);
  104. }
  105. }
  106.  
  107. // refresh cache
  108. self.ask_sql('SELECT * FROM user_info', function(all_users){
  109. if (all_users.rows.length == 0){
  110. console.log('no users');
  111. } else {
  112. for (var i = 0; i < all_users.rows.length; i++) {
  113. var u_id = all_users.rows[i]['id'];
  114. if (c.ADMIN_LIST.includes(u_id)){
  115. self.admin_user_list.push(all_users.rows[i]['username']);
  116. }
  117. }
  118. }
  119. });
  120.  
  121.  
  122. this.lookup_user_info = function(user_id, key, do_what_next){
  123. if (!(user_id in user_id_to_info)){
  124. user_id_to_info[user_id] = {};
  125. self.ask_sql(`select * from user_info where id=(${user_id})`, function(result){
  126. if (result.rows.length == 0){
  127. console.log('empty res')
  128. do_what_next(false); // user not found
  129. } else {
  130. console.log('non-empty res',result.rows[0]);
  131. user_id_to_info[user_id] = result.rows[0];
  132. if (!(key in user_id_to_info[user_id])){
  133. do_what_next(false);
  134. } else {
  135. do_what_next(user_id_to_info[user_id][key]);
  136. }
  137. }
  138. });
  139. } else {
  140. if (!(key in user_id_to_info[user_id])){
  141. do_what_next(false);
  142. } else {
  143. do_what_next(user_id_to_info[user_id][key]);
  144. }
  145. }
  146. }
  147.  
  148. this.lookup_user_lang = function(user_id, then_what){
  149. self.lookup_user_info(user_id, 'language', function(l_key){
  150. if (!l_key){
  151. l_key = 'english';
  152. }
  153. then_what(l_key);
  154. });
  155. }
  156.  
  157. // sql related helper funs
  158. this.ask_sql = function(query_string, callback_fun){
  159. console.log(query_string);
  160. try {
  161. self.sql_client.query(query_string, function(err, results){
  162. if (err) {
  163. console.log('ERROR\n',err);
  164. } else {
  165. callback_fun(results);
  166. }
  167. });
  168. }
  169. catch (e) {
  170. console.log('whoops',e);
  171. }
  172. }
  173. this.tell_sql = function(insert_string, insert_vals){
  174. console.log(insert_string, insert_vals);
  175. try {
  176. self.sql_client.query(insert_string, insert_vals);
  177. }
  178. catch (e) {
  179. console.log('whoops',e);
  180. }
  181. }
  182.  
  183. // first message : select language, create user, check referral_id
  184. this.bot.onText(/\/start\s*(.*)/, function(msg, match) {
  185. const user_id = "" + msg.chat.id;
  186. var user_name = msg.from.username;
  187. if (user_name == undefined){
  188. user_name = user_id;
  189. }
  190. const referral_id = match[1];
  191.  
  192. var welcome_msg = self.msg_lookup.initial_welcome_msg;
  193. self.bot.sendMessage(user_id, welcome_msg);
  194.  
  195. var setup_user = function(referral_id, xtra_msg_text){
  196. self.lookup_user_info(user_id, 'username', function(do_u_exist){
  197. var welcome_msg_2 = '';
  198. if (!(do_u_exist)){
  199. // get total no users
  200. self.ask_sql('SELECT COUNT(*) FROM user_info', function(res){
  201. var total_user_count = parseInt(res.rows[0].count);
  202. var prelaunch = (total_user_count <= (c.NO_PRELAUNCHERS + c.ADMIN_LIST.length));
  203. if (referral_id){
  204. var insrt_text = 'INSERT INTO user_info(id, username, prelaunch, referral_id) values($1, $2, $3, $4)';
  205. self.tell_sql(insrt_text, [user_id, user_name, prelaunch, referral_id]);
  206. } else {
  207. var insrt_text = 'INSERT INTO user_info(id, username, prelaunch) values($1, $2, $3)';
  208. self.tell_sql(insrt_text, [user_id, user_name, prelaunch]);
  209. }
  210. delete user_id_to_info[user_id];
  211. welcome_msg_2 += 'Your account has been created successfully\n' + xtra_msg_text;
  212. self.bot.sendMessage(user_id, welcome_msg_2, self.language_opts);
  213. });
  214. } else {
  215. welcome_msg_2 += xtra_msg_text;
  216. self.bot.sendMessage(user_id, welcome_msg_2, self.language_opts);
  217. }
  218. });
  219. }
  220.  
  221. if ((referral_id) && (referral_id != user_id)) {
  222. var xtra_text = ""
  223. self.lookup_user_info(referral_id, 'username', function(found_user){
  224. if (found_user){
  225. xtra_text += `Looks like you were referred by @${found_user}, thanks.\n`
  226. }
  227. xtra_text += 'Please choose your language:';
  228. setup_user(referral_id, xtra_text);
  229. });
  230. } else {
  231. setup_user(false, 'Please choose your language:');
  232. }
  233.  
  234. })
  235.  
  236. // language setup
  237. this.languages.forEach(function(lang, i){
  238. var l_key = self.language_keys[i]
  239. var lang_regx = new RegExp(lang)
  240. self.bot.onText(lang_regx, function(msg, match){
  241. const user_id = '' + msg.chat.id;
  242. // update user's preferred language
  243. var insrt_text = 'UPDATE user_info SET language=($1) WHERE id=($2)';
  244. self.tell_sql(insrt_text, [l_key, user_id]);
  245. delete user_id_to_info[user_id];
  246.  
  247. // now respond
  248. var response = self.msg_lookup.get_text(l_key, 'language_select_complete');
  249. var main_menu = self.main_menu_resp(user_id, l_key);
  250. self.bot.sendMessage(user_id, response, main_menu);
  251. })
  252. })
  253.  
  254. ////////////////
  255. // menus
  256. ////////////////
  257.  
  258. this.main_menu_resp = function(user_id, l_key){
  259. if (c.ADMIN_LIST.includes(user_id)){
  260. var main_menu = self.msg_lookup.get_text(l_key, 'main_menu_admin');
  261. } else {
  262. var main_menu = self.msg_lookup.get_text(l_key, 'main_menu');
  263. }
  264. return main_menu;
  265. }
  266.  
  267. var go_home = function(msg, match){
  268. const user_id = msg.chat.id;
  269. self.lookup_user_lang(user_id, function(l_key){
  270. var home_msg = self.msg_lookup.get_text(l_key, 'welcome_msg');
  271. home_msg += " " + msg.from.first_name;
  272. if (msg.from.last_name !== undefined){
  273. home_msg += " " + msg.from.last_name;
  274. }
  275. var mm_kb = self.main_menu_resp(user_id, l_key);
  276. self.bot.sendMessage(user_id, home_msg, mm_kb);
  277. });
  278. }
  279.  
  280. this.bot.onText(/\🏠\s*(.*)/, go_home)
  281. this.bot.onText(/\/home\s*(.*)/, go_home)
  282. this.bot.onText(/\/back\s*(.*)/, go_home)
  283.  
  284. // options
  285. this.bot.onText(/\βš™οΈ\s*(.*)/, function(msg, match) {
  286. const user_id = msg.chat.id;
  287. // lookup users lang key..
  288. self.lookup_user_lang(user_id, function(l_key){
  289. var msg_text = self.msg_lookup.get_text(l_key, 'options_text');
  290. var msg_menu = self.msg_lookup.get_text(l_key, 'options_menu');
  291. self.bot.sendMessage(user_id, msg_text, msg_menu);
  292. });
  293. });
  294.  
  295. // reset language
  296. this.bot.onText(/\🎌\s*(.*)/, function(msg, match) {
  297. const user_id = msg.chat.id;
  298. var resp_msg = 'Please choose your language:'
  299.  
  300. self.bot.sendMessage(user_id, resp_msg, self.language_opts);
  301. })
  302.  
  303. // deposit msg
  304. this.bot.onText(/\πŸ’΅\s*(.*)/, function(msg, match) {
  305. const user_id = msg.chat.id;
  306. self.lookup_user_lang(user_id, function(l_key){
  307. self.lookup_user_info(user_id, 'deposit_addr', function(user_addr){
  308. if (!(user_addr)){
  309. var d_msg = self.msg_lookup.get_text(l_key, 'deposit_initial_text');
  310. if (self.wallet !== undefined){
  311. self.wallet.getNewAddress(function(err, address) {
  312. if (err) {
  313. console.log(err);
  314. var new_msg = self.msg_lookup.get_text(l_key, 'error_msg');
  315. } else {
  316. console.log(address);
  317. // record the address in daytabase
  318. var insrt_text = 'UPDATE user_info SET deposit_addr=($1) WHERE id=($2)';
  319. self.tell_sql(insrt_text, [address, user_id]);
  320. delete user_id_to_info[user_id];
  321. var new_msg = '`' + address + '`';
  322. }
  323. self.bot.sendMessage(user_id, new_msg, {parse_mode: 'Markdown'});
  324. });
  325.  
  326. }
  327. } else {
  328. var d_msg = self.msg_lookup.get_text(l_key, 'deposit_text');
  329. d_msg += '\n`' + user_addr + '`\n';
  330. d_msg += self.msg_lookup.get_text(l_key, 'deposit_text_rest');
  331. }
  332. self.bot.sendMessage(user_id, d_msg, {parse_mode: 'Markdown'})
  333. self.bot.sendPhoto(user_id, `http://www.btcfrog.com/qr/bitcoinPNG.php?address=${user_addr}&error=M`)
  334. })
  335.  
  336. });
  337. });
  338.  
  339. // set withdrawal addr
  340. this.bot.onText(/\πŸ”\s*(.*)/, function(msg, match) {
  341. const user_id = msg.chat.id;
  342. self.edit_withdrawal_addr(user_id);
  343. })
  344.  
  345. this.register_addr = function(user_id, user_lang){
  346. var u_id = user_id;
  347. var u_l = user_lang;
  348. var fun_tor = function(sent_msg) {
  349. var message_id = sent_msg.message_id;
  350.  
  351. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  352.  
  353. var msg_text = msg.text;
  354. var pot_addr = msg_text.split(" ")[0];
  355.  
  356. var valid = WAValidator.validate(pot_addr, 'BTC', validate_network_type);
  357.  
  358. if (valid) {
  359. var v_msg = self.msg_lookup.get_text(u_l, 'withdrawal_addr_success_text');
  360. // record the address in daytabase
  361. var insrt_text = 'UPDATE user_info SET withdrawal_addr=($1) WHERE id=($2)';
  362. self.tell_sql(insrt_text, [pot_addr, u_id]);
  363. delete user_id_to_info[u_id];
  364. var mm_kb = self.main_menu_resp(u_id, u_l); // back to main menu ok
  365. self.bot.sendMessage(u_id, v_msg, mm_kb);
  366. } else {
  367. var v_msg = self.msg_lookup.get_text(u_l, 'withdrawal_addr_error_text');
  368. var do_it_again = self.register_addr(u_id, u_l);
  369. self.bot.sendMessage(u_id, v_msg, {"reply_markup":{'force_reply':true}}).then(do_it_again);
  370. }
  371.  
  372. });
  373. };
  374. return fun_tor;
  375. }
  376.  
  377. this.edit_withdrawal_addr = function(user_id){
  378. self.lookup_user_lang(user_id, function(l_key){
  379. var w_msg = self.msg_lookup.get_text(l_key, 'withdrawal_addr_text');
  380. var force_it = {"reply_markup":{'force_reply':true}}
  381. var reply_callback = self.register_addr(user_id, l_key);
  382. self.bot.sendMessage(user_id, w_msg,force_it).then(reply_callback);
  383. });
  384. }
  385.  
  386. // faq
  387. this.bot.onText(/\⁉️\s*(.*)/, function(msg, match) {
  388. const user_id = msg.chat.id;
  389. self.lookup_user_lang(user_id, function(l_key){
  390. var faq_msg = self.msg_lookup.get_text(l_key, 'faq_text');
  391. var faq_opts = self.msg_lookup.get_text(l_key, 'faq_menu');
  392. self.bot.sendMessage(user_id, faq_msg, faq_opts);
  393. });
  394. })
  395.  
  396. // support
  397. var support_me_pls = function(msg, match) {
  398. const user_id = msg.chat.id;
  399. self.lookup_user_lang(user_id, function(l_key){
  400. var support_msg = self.msg_lookup.get_text(l_key, 'support_text');
  401. self.bot.sendMessage(user_id, support_msg);
  402. })
  403. }
  404.  
  405. this.bot.onText(/\βœ‰\s*(.*)/, support_me_pls);
  406. this.bot.onText(/\/help\s*(.*)/, support_me_pls);
  407.  
  408. // affiliate program
  409. this.bot.onText(/\πŸ‘₯\s*(.*)/, function(msg, match) {
  410. const user_id = msg.chat.id;
  411. self.lookup_user_lang(user_id, function(l_key){
  412.  
  413. self.lookup_user_info(user_id, 'prelaunch', function(prelauncher){
  414. if (prelauncher){
  415. var r_msg = self.msg_lookup.get_text(l_key, 'referral_prelauncher_text');
  416. } else {
  417. var r_msg = self.msg_lookup.get_text(l_key, 'referral_text');
  418. }
  419. self.bot.sendMessage(user_id, r_msg).then(function(msg){
  420. var aff_link_msg = self.msg_lookup.get_text(l_key, 'referral_msg_text');
  421. aff_link_msg += 'https://telegram.me/' + c.BOT_USERNAME + '?start=' + user_id;
  422. self.bot.sendMessage(user_id, aff_link_msg);
  423. self.get_referral_info(user_id);
  424. });
  425. });
  426. });
  427. })
  428.  
  429.  
  430. // stats
  431. this.bot.onText(/\πŸ“ˆ\s*(.*)/, function(msg, match) {
  432. const user_id = msg.chat.id;
  433. // lookup users lang key..
  434. self.generate_interest(user_id, function(ttttt){
  435. self.lookup_user_lang(user_id, function(l_key){
  436. var stats_text_1 = self.msg_lookup.get_text(l_key, 'stats_text_1');
  437. var stats_text_2 = self.msg_lookup.get_text(l_key, 'stats_text_2');
  438. var stats_text_3 = self.msg_lookup.get_text(l_key, 'stats_text_3');
  439. var stats_text_4 = self.msg_lookup.get_text(l_key, 'stats_text_4');
  440.  
  441. var finna_send = function(account_balance, total_invested, total_profit){
  442. var complet_msg = stats_text_1 + self.pretty_print_amount(total_profit).toFixed(6);
  443. complet_msg += stats_text_2 + self.pretty_print_amount(total_invested).toFixed(6);
  444. complet_msg += stats_text_3 + self.pretty_print_amount(total_profit).toFixed(6);
  445. complet_msg += stats_text_4;
  446. self.bot.sendMessage(user_id, complet_msg);
  447. self.get_referral_info(user_id);
  448. }
  449.  
  450. // account balance
  451. self.ask_sql(`SELECT * FROM tx_info where requested_user=(${user_id})`, function(result){
  452. var act_bal = 0;
  453. var tot_inv = 0;
  454. var tot_prof = 0;
  455. var extras = ['BONUS', 'INTEREST'];
  456. if (result.rows.length != 0){
  457. for (var i = 0; i < result.rows.length; i++) {
  458. var d = result.rows[i];
  459. var d_a = d['amount'];
  460. act_bal += d_a;
  461. var d_r = d['recv_addr'];
  462. if (d_a > 0){
  463. if (!(extras.includes(d_r))){
  464. // your recv_addr, so you invested
  465. tot_inv += d_a;
  466. } else {
  467. // any bonus
  468. tot_prof += d_a;
  469. }
  470. } else {
  471. tot_prof += d_a;
  472. }
  473. }
  474. }
  475. finna_send(act_bal, tot_inv, tot_prof);
  476. })
  477. });
  478. });
  479. });
  480.  
  481. this.get_referral_info = function(user_id) {
  482. var send_msg_on_done = function(total_ref_n, total_act_n, first_line_total, total_invest, total_profit){
  483. var ref_msg = "Your referral stats\nTotal Referrals: ";
  484. ref_msg += total_ref_n + "\nActive Referrals: ";
  485. ref_msg += total_act_n + "\n1st line Total: ";
  486. ref_msg += first_line_total + "\nReferral's Investments: ";
  487. ref_msg += total_invest + "\nYour Profit: " + total_profit;
  488. self.bot.sendMessage(user_id, ref_msg);
  489. }
  490.  
  491. var referral_query = `WITH RECURSIVE referrals AS (SELECT referral_id, id, username, deposit_addr FROM user_info WHERE referral_id = ${user_id} UNION SELECT e.referral_id, e.id, e.username, e.deposit_addr FROM user_info e INNER JOIN referrals s ON s.id = e.referral_id) SELECT * FROM referrals;`
  492.  
  493. self.ask_sql(referral_query, function(result){
  494. if (result.rows.length != 0){
  495. var all_addr = [];
  496. var first_line = [];
  497. for (var i = 0; i < result.rows.length; i++) {
  498. var depo_addr = result.rows[i]['deposit_addr'];
  499. var u_id = result.rows[i]['id'];
  500. if ((depo_addr != undefined) && (u_id != user_id)){
  501. all_addr.push(depo_addr);
  502. var ref_id = result.rows[i]['referral_id'];
  503. if (ref_id == user_id){
  504. first_line.push(u_id);
  505. }
  506. }
  507. }
  508.  
  509. self.ask_sql('SELECT * FROM tx_info WHERE amount != 0', function(wew){
  510.  
  511. var seen_ids = new Set();
  512. var invest_total = 0;
  513. var first_line_total = 0;
  514. var your_profit = 0;
  515. var extras = ['BONUS', 'INTEREST'];
  516.  
  517. if (wew.rows.length != 0){
  518. for (var i = 0; i < wew.rows.length; i++) {
  519. var d_r = wew.rows[i]['recv_addr'];
  520. var amt = wew.rows[i]['amount'];
  521. var whom_id = wew.rows[i]['requested_user'];
  522. if (extras.includes(d_r)){
  523. if ((d_r == 'BONUS') && (whom_id == user_id)){
  524. your_profit += parseFloat(blocktrail.toBTC(amt));
  525. }
  526. } else {
  527. if (all_addr.includes(d_r) && (amt > 0)){
  528. seen_ids.add(whom_id);
  529. var new_amt = parseFloat(blocktrail.toBTC(amt));
  530. invest_total += new_amt;
  531. if (first_line.includes(whom_id)){
  532. first_line_total += new_amt;
  533. }
  534. }
  535. }
  536. }
  537. send_msg_on_done(all_addr.length, seen_ids.size, first_line_total, invest_total, your_profit);
  538. } else {
  539. send_msg_on_done(all_addr.length, 0, 0, 0, 0)
  540. }
  541. })
  542.  
  543. } else {
  544. // no referral
  545. send_msg_on_done(0, 0, 0, 0, 0)
  546. }
  547. });
  548. }
  549.  
  550. this.check_referral = function(referee_id, amount, who_deposited, layer){
  551. // check if referee id is not null
  552. if (!(referee_id)){
  553. return;
  554. }
  555. if (layer >= c.REFERRAL_BONUSES.length){
  556. return;
  557. }
  558. self.lookup_user_lang(referee_id, function(l_key){
  559.  
  560. self.lookup_user_info(referee_id, 'prelaunch', function(prelauncher){
  561. // credit referee_id with amount : layer reward
  562. var bonus_amt = amount * c.REFERRAL_BONUSES[layer];
  563. if (prelauncher){
  564. bonus_amt *= 2;
  565. }
  566. bonus_amt = Math.floor(bonus_amt);
  567.  
  568. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, requested_user) values($1, $2, $3, $4)';
  569. self.tell_sql(insrt_text, ['BONUS', bonus_amt, true, referee_id]);
  570.  
  571. // send them a nice message (if u can) with the bonus earned : )
  572. self.lookup_user_lang(referee_id, function(l_key){
  573.  
  574. var bonus_msg = self.msg_lookup.get_text(l_key, 'bonus_text');
  575. bonus_msg += self.pretty_print_amount(bonus_amt);
  576. bonus_msg += self.msg_lookup.get_text(l_key, 'bonus_text_rest');
  577. bonus_msg += who_deposited;
  578.  
  579. self.safe_send_msg(referee_id, bonus_msg);
  580. });
  581.  
  582. // next layer
  583. self.lookup_user_info(referee_id, 'referral_id', function(next_layer_id){
  584. if (next_layer_id){
  585. self.lookup_user_info(next_layer_id, 'username', function(whomst){
  586. if (whomst){
  587. self.check_referral(next_layer_id, amount, whomst, (layer + 1));
  588. }
  589. });
  590. }
  591. })
  592. });
  593. });
  594. }
  595.  
  596. // withdraw
  597. this.bot.onText(/\πŸ’³\s*(.*)/, function(msg, match) {
  598. const user_id = msg.chat.id;
  599. const user_name = (msg.from.username) || ("" + user_id);
  600. // gen interest
  601. self.generate_interest(user_id, function(aa){
  602. // now calculate how much u can withdraw
  603. var what_time_is_now = new Date();
  604. self.ask_sql(`SELECT * FROM tx_info where requested_user=(${user_id})`, function(all_user_tx){
  605. var avail_to_withdraw = 0;
  606. for (var i = 0; i < all_user_tx.rows.length; i++) {
  607. var tx_amt = all_user_tx.rows[i]['amount'];
  608. if (tx_amt < 0){
  609. avail_to_withdraw += tx_amt;
  610. } else {
  611. var timestamp = all_user_tx.rows[i]['timestamp_confirmed'];
  612. if (timestamp != undefined){
  613. d_t = new Date(timestamp);
  614. var t_diff = (what_time_is_now - d_t) / 36e5;
  615. // timestamp confirmed > 24 hrs
  616. if (t_diff > c.TIME_DELAY){
  617. // avail_to_withdraw += tx_amt;
  618. console.log('no u dont get deposits back lol')
  619. }
  620. } else {
  621. // if null confirmed timestamp add it (bonus or interest)
  622. avail_to_withdraw += tx_amt;
  623. }
  624. }
  625. }
  626.  
  627. self.lookup_user_lang(user_id, function(l_key){
  628. // check if balance is more than enough
  629. if (avail_to_withdraw < (c.MIN_WITHDRAWAL * 1e8)){
  630. var error_msg = self.msg_lookup.get_text(l_key, 'withdrawal_error_text');
  631. error_msg += self.pretty_print_amount(avail_to_withdraw) + ' btc';
  632. self.bot.sendMessage(user_id, error_msg);
  633. } else {
  634. // check if they have withdrawal addr
  635. self.lookup_user_info(user_id, 'withdrawal_addr', function(wtdrl_addr){
  636. if (wtdrl_addr){
  637. // reply to this msg with how much u want to withdraw
  638. var withdraw_msg_1 = self.msg_lookup.get_text(l_key, 'withdrawal_text');
  639. var withdraw_msg_2 = self.msg_lookup.get_text(l_key, 'withdrawal_text_addr_check');
  640. var withdraw_msg_3 = self.msg_lookup.get_text(l_key, 'withdrawal_text_rest');
  641. var w_msg = withdraw_msg_1 + self.pretty_print_amount(avail_to_withdraw) + ' btc\n';
  642. w_msg += "`"+ wtdrl_addr +'`\n'
  643. w_msg += withdraw_msg_2 + withdraw_msg_3;
  644.  
  645. var force_md_it = {"reply_markup":{'force_reply':true}, parse_mode: 'Markdown'}
  646. var reply_callback = self.withdrawl_create(user_id, l_key, user_name, wtdrl_addr, avail_to_withdraw);
  647. self.bot.sendMessage(user_id, w_msg, force_md_it).then(reply_callback);
  648.  
  649. } else {
  650. // if not, tell them to set it
  651. var error_msg = self.msg_lookup.get_text(l_key, 'withdrawal_error_addr_text');
  652. self.bot.sendMessage(user_id, error_msg);
  653. self.edit_withdrawal_addr(user_id);
  654. }
  655. });
  656. }
  657. });
  658. });
  659. });
  660. });
  661.  
  662. // reinvest πŸ’Έ
  663. this.bot.onText(/\πŸ’Έ\s*(.*)/, function(msg, match) {
  664. const user_id = msg.chat.id;
  665. const user_name = msg.from.username;
  666. // gen interest
  667. self.generate_interest(user_id, function(aa){
  668. // now calculate how much u can reinvest
  669. var what_time_is_now = new Date();
  670. self.ask_sql(`SELECT * FROM tx_info where requested_user=(${user_id})`, function(all_user_tx){
  671. var avail_to_reinvest = 0;
  672. for (var i = 0; i < all_user_tx.rows.length; i++) {
  673. var tx_amt = all_user_tx.rows[i]['amount'];
  674. if (tx_amt < 0){
  675. avail_to_reinvest += tx_amt;
  676. } else {
  677. var timestamp = all_user_tx.rows[i]['timestamp_confirmed'];
  678. if (timestamp != undefined){
  679. console.log('no u dont get deposits back lol')
  680. } else {
  681. // if null confirmed timestamp add it (bonus or interest)
  682. avail_to_reinvest += tx_amt;
  683. }
  684. }
  685. }
  686.  
  687. self.lookup_user_lang(user_id, function(l_key){
  688. // check if balance is more than enough
  689. if (avail_to_reinvest < (c.MIN_DEPOSIT * 1e8)){
  690. var error_msg = self.msg_lookup.get_text(l_key, 'reinvest_error_text');
  691. error_msg += self.pretty_print_amount(avail_to_reinvest) + ' btc';
  692. self.bot.sendMessage(user_id, error_msg);
  693. } else {
  694. var reinv_msg_1 = self.msg_lookup.get_text(l_key, 'reinvest_text');
  695. var reinv_msg_2 = self.msg_lookup.get_text(l_key, 'reinvest_text_rest');
  696. var r_msg = reinv_msg_1 + self.pretty_print_amount(avail_to_reinvest) + reinv_msg_2;
  697. var force_md_it = {"reply_markup":{'force_reply':true}, parse_mode: 'Markdown'}
  698. var reply_callback = self.reinvest_create(user_id, l_key, user_name, avail_to_reinvest);
  699. self.bot.sendMessage(user_id, r_msg, force_md_it).then(reply_callback);
  700. }
  701. });
  702. });
  703. });
  704. });
  705.  
  706. ////////////////////////
  707. // admin menu & actions
  708. ////////////////////////
  709.  
  710. // admin menu
  711. this.bot.onText(/\πŸ€\s*(.*)/, function(msg, match) {
  712. const user_id = msg.chat.id;
  713. if (c.ADMIN_LIST.includes(user_id)){
  714. var menu = self.msg_lookup.get_text('english', 'admin_menu');
  715. self.bot.sendMessage(user_id, 'admin menu', menu);
  716. }
  717. });
  718.  
  719. // check wallet balance
  720. this.bot.onText(/\🍞\s*(.*)/, function(msg, match) {
  721. const user_id = msg.chat.id;
  722. if (c.ADMIN_LIST.includes(user_id)){
  723. if (self.wallet !== undefined){
  724. self.wallet.getBalance(function(err, confirmed, uncomfirmed){
  725. if (err){
  726. var resp_msg = 'something wrong with the wallet...'
  727. } else {
  728. var resp_msg = 'current wallet totals\n'
  729. resp_msg += 'Total Balance: ' + blocktrail.toBTC(confirmed) + ' btc \n';
  730. resp_msg += 'Still Unconfirmed: ' + blocktrail.toBTC(uncomfirmed) + ' btc';
  731. }
  732. self.bot.sendMessage(user_id, resp_msg);
  733. // total counts of stuff
  734. // deposit/withdrawal is not bonus or interest
  735. var tx_query = 'SELECT * FROM tx_info';
  736. self.ask_sql(tx_query, function(result){
  737. var total_deposits = 0;
  738. var depo_addrs = [];
  739. // var deposit_count = 0;
  740. var total_withdrawals = 0;
  741. // var withdrawal_count = 0;
  742. var with_addrs = [];
  743. var extras = ['BONUS', 'INTEREST'];
  744. if (result.rows.length != 0){
  745. for (var i = 0; i < result.rows.length; i++) {
  746. var d = result.rows[i];
  747. var d_r = d['recv_addr'];
  748. if (!(extras.includes(d_r))){
  749. var d_a = d['amount'];
  750. if (d_a > 0) { // deposit
  751. total_deposits += d_a;
  752. depo_addrs.push(d_r);
  753. } else { // withdrawal
  754. total_withdrawals -= d_a;
  755. with_addrs.push(d_r);
  756. }
  757. }
  758. }
  759. }
  760. var count_msg = 'transactions summary\n';
  761. var depo_set = new Set(depo_addrs);
  762. var with_set = new Set(with_addrs);
  763. count_msg += 'Total Deposited: ' + blocktrail.toBTC(total_deposits) + ' btc in ';
  764. count_msg += depo_addrs.length + ' transactions\n(' + depo_set.size + ' unique addresses)\n';
  765. count_msg += 'Total Withdrawn: ' + blocktrail.toBTC(total_withdrawals) + ' btc in ';
  766. count_msg += with_addrs.length + ' transactions\n(' + with_set.size + ' unique addresses)\n';
  767. self.bot.sendMessage(user_id, count_msg);
  768. // now user counts
  769. var qry_text = 'SELECT count(*) FROM user_info';
  770. self.ask_sql(qry_text, function(user_count){
  771. var total_user_count = parseInt(user_count.rows[0].count);
  772. var u_c_msg = "Total User Count: " + total_user_count;
  773. self.bot.sendMessage(user_id, u_c_msg);
  774. })
  775. })
  776. })
  777. } else {
  778. self.bot.sendMessage(user_id, 'something\'s wrong with the wallet');
  779. }
  780. }
  781. });
  782.  
  783. // check pending deposits
  784. this.bot.onText(/\πŸ‡\s*(.*)/, function(msg, match) {
  785. const user_id = msg.chat.id;
  786. if (c.ADMIN_LIST.includes(user_id)){
  787. if (self.wallet !== undefined){
  788. var gimme = function(page_no, build_up){
  789. self.wallet.transactions({page: page_no, limit: 20}, function (err, transactions){
  790. if (err){
  791. console.log('whooops\n------------------\n',err)
  792. if (build_up.length == 0){
  793. build_up = 'no pending transactions found, if someone is having issues check they sent to the correct address';
  794. }
  795. console.log('gna send\n',build_up)
  796.  
  797. self.bot.sendMessage(user_id, build_up)
  798. } else {
  799. transactions['data'].forEach(function(datum){
  800. if (datum['confirmations'] < 3){
  801. build_up += 'low confirmation count on the following tx_id\n '
  802. build_up += datum['hash']+'\n potential deposit addresses\n ';
  803. build_up += datum['addresses'].join() + '\n'
  804. }
  805. })
  806. if (page_no * 20 > transactions['total']){
  807. if (build_up.length == 0){
  808. build_up = 'no pending transactions found, if someone is having issues check they sent to the correct address';
  809. }
  810. console.log('gna send\n',build_up)
  811. self.bot.sendMessage(user_id, build_up)
  812. } else {
  813. gimme(page_no + 1, build_up);
  814. }
  815. }
  816. })
  817. }
  818. gimme(1, "");
  819. }
  820. }
  821. });
  822.  
  823. // resend admin approvals
  824. this.bot.onText(/\πŸ‰\s*(.*)/, function(msg, match) {
  825. const user_id = msg.chat.id;
  826. if (c.ADMIN_LIST.includes(user_id)){
  827. var qry_text = 'SELECT * FROM tx_info WHERE approved=FALSE';
  828. self.ask_sql(qry_text, function(need_approval){
  829. if (need_approval.rows.length == 0){
  830. self.bot.sendMessage(user_id, 'no pending withdrawal requests')
  831. } else {
  832. for (var i = 0; i < need_approval.rows.length; i++) {
  833. var approve_me = need_approval.rows[i];
  834. var amt = -1 * approve_me['amount'];
  835.  
  836. self.spam_admin_approval(user_id, approve_me['requested_user'], approve_me['requested_user_name'], amt, approve_me['tx_id'])
  837. }
  838. }
  839. })
  840.  
  841. }
  842. });
  843.  
  844. // withdrawals needs admin approval
  845. this.bot.onText(/\/approve_*(.*)/, function(msg, match){
  846. const user_id = msg.chat.id;
  847. if (c.ADMIN_LIST.includes(user_id)){
  848. if (match[1]){
  849. // find the tx
  850. var fake_tx_id = match[1]
  851. self.ask_sql(`SELECT * FROM tx_info where tx_id=('${fake_tx_id}')`, function(tx_to_apprv){
  852. if (tx_to_apprv.rows.length != 0){
  853. // set approved
  854. var insrt_text = 'UPDATE tx_info SET approved=($1) WHERE tx_id=($2)';
  855. self.tell_sql(insrt_text, [true, fake_tx_id]);
  856. var sent_amt = -1 * tx_to_apprv.rows[0]['amount']
  857. // send it out
  858. var send_addr = fake_tx_id.split("_")[1];
  859. var req_user = tx_to_apprv.rows[0]['requested_user']
  860. if (self.wallet !== undefined){
  861. var pay_whom = {}
  862. pay_whom[send_addr] = sent_amt;
  863. self.wallet.pay(pay_whom,
  864. function(err, tx_id) {
  865. if (err){
  866. console.log('aaah\n------------------\n',err);
  867. } else {
  868. // tell user their transaction was sent
  869. self.lookup_user_lang(req_user, function(l_key){
  870. var approv_msg = self.msg_lookup.get_text(l_key, 'withdrawal_approved_text');
  871. approv_msg += self.pretty_print_amount(sent_amt);
  872. approv_msg += self.msg_lookup.get_text(l_key, 'withdrawal_approved_text_rest');
  873. approv_msg += BASE_BLOCK_INFO_URL + tx_id;
  874. self.safe_send_msg(req_user, approv_msg);
  875. var insrt_text = 'UPDATE tx_info SET tx_id=($1) WHERE tx_id=($2)';
  876. self.tell_sql(insrt_text, [tx_id, fake_tx_id]);
  877. });
  878. }
  879. });
  880. }
  881. } else {
  882. var err_msg = 'that transaction has already been approved'
  883. try {
  884.  
  885. var check_addr = fake_tx_id.split("_")[1];
  886. err_msg += '\n check the address ' + check_addr;
  887. }
  888. catch (e) {
  889. console.log('whoops')
  890. }
  891. self.bot.sendMessage(user_id, err_msg);
  892. }
  893. });
  894. }
  895. }
  896. });
  897.  
  898. this.spam_admin_approval = function(to_whom, user_id, user_name, request_amount, tx_id){
  899. var the_msg = 'yo admin,\n@';
  900. the_msg += user_name + ' wants to withdraw ' + self.pretty_print_amount(request_amount) + ' btc\n click this ';
  901. the_msg += '/approve_' + tx_id + '\n to approve the withdrawal request';
  902. self.safe_send_msg(to_whom, the_msg);
  903. }
  904.  
  905. this.create_admin_approval = function(user_id, user_name, withdraw_addr, request_amount){
  906. // lookup deposit addr
  907. self.lookup_user_info(user_id, 'deposit_addr', function(addr){
  908. if (!(addr)){
  909. } else {
  910. // negative amount
  911. // approved false
  912. // generate fake tx id from time?
  913. var now_is = new Date();
  914. var fake_tx_id = "" + now_is.valueOf();
  915. fake_tx_id += '_' + withdraw_addr;
  916. var record_amt = -1 * request_amount;
  917. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, requested_user, requested_user_name, tx_id) values($1, $2, $3, $4, $5, $6)';
  918. self.tell_sql(insrt_text, [addr, record_amt, false, user_id, user_name, fake_tx_id]);
  919. c.APPROVAL_ADMIN_LIST.forEach(function(a_id){
  920. self.spam_admin_approval(a_id, user_id, user_name, request_amount, fake_tx_id)
  921. });
  922. }
  923. });
  924. }
  925.  
  926. // send a bonus
  927. this.bot.onText(/\πŸ’¦\s*(.*)/, function(msg, match) {
  928. const user_id = msg.chat.id;
  929. if (c.ADMIN_LIST.includes(user_id)){
  930. // reply to this message with @ username
  931. var first_check = "reply to this message with @[username of person to give bonus]"
  932. var reply_callback = self.user_name_check(user_id);
  933. // reply to that message with amt bonus
  934. self.bot.sendMessage(user_id, first_check, {"reply_markup":{'force_reply':true}}).then(reply_callback);
  935. }
  936. });
  937.  
  938. this.bonus_amt_check = function(user_id, found_id){
  939. var u_id = user_id;
  940. var f_id = found_id;
  941. var fun_tor = function(sent_msg){
  942. var message_id = sent_msg.message_id;
  943. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  944. var msg_text = msg.text;
  945. var amount_msg = msg_text.split(" ")[0];
  946. var amount = 0;
  947. valid = false;
  948. try {
  949. amount = blocktrail.toSatoshi(parseFloat(amount_msg));
  950. valid = (amount > 0);
  951. }
  952. catch (e) {
  953. console.log('error parsing bonus msg')
  954. }
  955. if (valid){
  956. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, requested_user) values($1, $2, $3, $4)';
  957. self.tell_sql(insrt_text, ['BONUS', amount, true, f_id]);
  958. var bonus_msg = 'Congrats! An admin has given you a bonus of ' + self.pretty_print_amount(amount) + ' btc.';
  959. self.safe_send_msg(f_id, bonus_msg);
  960. var mm_kb = self.main_menu_resp(user_id, 'english');
  961. self.bot.sendMessage(u_id, 'bonus successfully sent', mm_kb);
  962. } else {
  963. var mm_kb = self.main_menu_resp(user_id, 'english');
  964. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  965. }
  966.  
  967. });
  968. }
  969. return fun_tor;
  970. }
  971.  
  972. this.user_name_check = function(user_id){
  973. var u_id = user_id;
  974. var fun_tor = function(sent_msg) {
  975. var message_id = sent_msg.message_id;
  976. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  977. var msg_text = msg.text;
  978. if (msg_text.indexOf('@') !== -1){
  979. var check_user = msg_text.split('@')[1];
  980. try {
  981. var sql_query = `SELECT * FROM user_info WHERE username=('${check_user}')`
  982. self.ask_sql(sql_query, function(user_res){
  983. if (user_res.rows.length == 0){
  984. var mm_kb = self.main_menu_resp(user_id, 'english');
  985. self.bot.sendMessage(u_id, 'user not found sry', mm_kb);
  986. } else {
  987. // now ask for bonus amt
  988. var found_user_id = user_res.rows[0]['id'];
  989. console.log('user id is',found_user_id);
  990. var reply_callback = self.bonus_amt_check(u_id, found_user_id);
  991. self.bot.sendMessage(u_id, 'reply to this msg with bonus amount', {"reply_markup":{'force_reply':true}}).then(reply_callback);
  992. }
  993. })
  994. }
  995. catch (e){
  996. console.log('fuk up',e)
  997. var mm_kb = self.main_menu_resp(user_id, 'english');
  998. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  999. }
  1000. } else {
  1001. var mm_kb = self.main_menu_resp(user_id, 'english');
  1002. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  1003. }
  1004. });
  1005. }
  1006. return fun_tor;
  1007. }
  1008.  
  1009. // fake deposit
  1010. this.bot.onText(/\πŸ’’\s*(.*)/, function(msg, match) {
  1011. const user_id = msg.chat.id;
  1012. if (c.DEV_ADMIN_LIST.includes(user_id)){
  1013. // reply to this message with @ username
  1014. var first_check = "reply to this message with @[username of person to give fake deposit]"
  1015. var reply_callback = self.fake_deposit_check(user_id);
  1016. // reply to that message with amt deposit
  1017. self.bot.sendMessage(user_id, first_check, {"reply_markup":{'force_reply':true}}).then(reply_callback);
  1018. }
  1019. });
  1020.  
  1021. this.deposit_amt_check = function(user_id, found_id){
  1022. var u_id = user_id;
  1023. var f_id = found_id;
  1024. var fun_tor = function(sent_msg){
  1025. var message_id = sent_msg.message_id;
  1026. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  1027. var msg_text = msg.text;
  1028. var amount_msg = msg_text.split(" ")[0];
  1029. var amount = 0;
  1030. valid = false;
  1031. try {
  1032. amount = blocktrail.toSatoshi(parseFloat(amount_msg));
  1033. valid = (amount > 0);
  1034. }
  1035. catch (e) {
  1036. console.log('error parsing deposit msg')
  1037. }
  1038. if (valid){
  1039. var find_user = `SELECT * FROM user_info WHERE id=('${f_id}')`;
  1040. self.ask_sql(find_user, function(res){
  1041. if (res.rows.length == 0){
  1042. console.log('fake deposit didnt work');
  1043. var mm_kb = self.main_menu_resp(user_id, 'english');
  1044. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  1045. return; // free money i guess
  1046. } else {
  1047. var user_name = res.rows[0]['username'];
  1048. var recv_addr = res.rows[0]['deposit_addr'];
  1049. if (!(recv_addr)){
  1050. console.log('user has no recv addr, cancelling fake deposit');
  1051. var mm_kb = self.main_menu_resp(user_id, 'english');
  1052. self.bot.sendMessage(u_id, 'no valid deposit addr sry', mm_kb);
  1053. return;
  1054. }
  1055. var what_time_is_now = new Date();
  1056.  
  1057. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, timestamp_confirmed, tx_id, requested_user, requested_user_name) values($1, $2, $3, $4, $5, $6, $7)';
  1058. self.tell_sql(insrt_text, [recv_addr, amount, true, what_time_is_now, 'fake deposit', f_id, user_name]);
  1059. self.lookup_user_lang(f_id, function(l_key){
  1060. var deposit_msg = self.msg_lookup.get_text(l_key, 'deposit_confirmed_text');
  1061. deposit_msg += self.pretty_print_amount(amount);
  1062. deposit_msg += self.msg_lookup.get_text(l_key, 'deposit_confirmed_text_rest');
  1063. self.safe_send_msg(f_id, deposit_msg);
  1064. var mm_kb = self.main_menu_resp(user_id, 'english');
  1065. self.bot.sendMessage(u_id, 'fake deposit successfully sent', mm_kb);
  1066. });
  1067. }
  1068. });
  1069. var mm_kb = self.main_menu_resp(user_id, 'english');
  1070. self.bot.sendMessage(u_id, 'fake deposit successfully sent', mm_kb);
  1071. } else {
  1072. var mm_kb = self.main_menu_resp(user_id, 'english');
  1073. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  1074. }
  1075. });
  1076. }
  1077. return fun_tor;
  1078. }
  1079.  
  1080. this.fake_deposit_check = function(user_id){
  1081. var u_id = user_id;
  1082. var fun_tor = function(sent_msg) {
  1083. var message_id = sent_msg.message_id;
  1084. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  1085. var msg_text = msg.text;
  1086. if (msg_text.indexOf('@') !== -1){
  1087. var check_user = msg_text.split('@')[1];
  1088. try {
  1089. var sql_query = `SELECT * FROM user_info WHERE username=('${check_user}')`
  1090. self.ask_sql(sql_query, function(user_res){
  1091. if (user_res.rows.length == 0){
  1092. var mm_kb = self.main_menu_resp(user_id, 'english');
  1093. self.bot.sendMessage(u_id, 'user not found sry', mm_kb);
  1094. } else {
  1095. // now ask for bonus amt
  1096. var found_user_id = user_res.rows[0]['id'];
  1097. console.log('user id is',found_user_id);
  1098. var reply_callback = self.deposit_amt_check(u_id, found_user_id);
  1099. self.bot.sendMessage(u_id, 'reply to this msg with deposit amount', {"reply_markup":{'force_reply':true}}).then(reply_callback);
  1100. }
  1101. })
  1102. }
  1103. catch (e){
  1104. console.log('fuk up',e)
  1105. var mm_kb = self.main_menu_resp(user_id, 'english');
  1106. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  1107. }
  1108. } else {
  1109. var mm_kb = self.main_menu_resp(user_id, 'english');
  1110. self.bot.sendMessage(u_id, 'not valid sry', mm_kb);
  1111. }
  1112. });
  1113. }
  1114. return fun_tor;
  1115. }
  1116.  
  1117. // execute a sql command
  1118. this.bot.onText(/\/sql\s*(.*)/, function(msg, match) {
  1119. const user_id = msg.chat.id;
  1120. if (c.DEV_ADMIN_LIST.includes(user_id)){
  1121. if (match[1]){
  1122. self.ask_sql(match[1], function(result){
  1123. var mm_kb = self.main_menu_resp(user_id, 'english');
  1124. console.log('----------------------');
  1125. console.log(result);
  1126. console.log('----------------------');
  1127. var str_result = JSON.stringify(result);
  1128. function chunkSubstr(str, size) {
  1129. var numChunks = Math.ceil(str.length / size),
  1130. chunks = new Array(numChunks);
  1131.  
  1132. for(var i = 0, o = 0; i < numChunks; ++i, o += size) {
  1133. chunks[i] = str.substr(o, size);
  1134. }
  1135.  
  1136. return chunks;
  1137. }
  1138. var chunked_resp = chunkSubstr(str_result, 4000);
  1139. for (var i = 0; i < chunked_resp.length; i++) {
  1140. self.bot.sendMessage(user_id, chunked_resp[i]);
  1141. }
  1142. self.bot.sendMessage(user_id, '================', mm_kb);
  1143. })
  1144. }
  1145. }
  1146. });
  1147.  
  1148. // create a fake message from the bot
  1149. this.bot.onText(/\/echo\s*(.*)/, function(msg, match) {
  1150. const user_id = msg.chat.id;
  1151. if (c.DEV_ADMIN_LIST.includes(user_id)){
  1152. if (match[1]){
  1153. self.bot.sendMessage(user_id, match[1]);
  1154. }
  1155. }
  1156. });
  1157.  
  1158. // send a message to everyone
  1159. this.bot.onText(/\/spam\s*(.*)/, function(msg, match) {
  1160. const user_id = msg.chat.id;
  1161. if (c.DEV_ADMIN_LIST.includes(user_id)){
  1162. var w_msg = 'pls respond with what u wish to spam with';
  1163. var force_it = {"reply_markup":{'force_reply':true}}
  1164. var reply_callback = self.spam_everyone(user_id);
  1165. self.bot.sendMessage(user_id, w_msg,force_it).then(reply_callback);
  1166. }
  1167. });
  1168.  
  1169. this.spam_everyone = function(user_id){
  1170. var u_id = user_id;
  1171. var fun_tor = function(sent_msg) {
  1172. var message_id = sent_msg.message_id;
  1173.  
  1174. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  1175. var msg_text = msg.text;
  1176. self.bot.sendMessage(u_id, msg_text);
  1177. var qry_text = 'SELECT * FROM user_info';
  1178. self.ask_sql(qry_text, function(all_users){
  1179. if (all_users.rows.length == 0){
  1180. self.bot.sendMessage(user_id, 'no users to spam lel')
  1181. } else {
  1182. for (var i = 0; i < all_users.rows.length; i++) {
  1183. var i_user = all_users.rows[i]['id']
  1184. self.safe_send_msg(i_user, msg_text)
  1185. }
  1186. }
  1187. });
  1188. });
  1189. };
  1190. return fun_tor;
  1191. }
  1192.  
  1193. /////////////////////
  1194. // btc related funs
  1195. /////////////////////
  1196.  
  1197. this.handle_tx_event = function(data){
  1198. if (!('event_type' in data)){
  1199. return;
  1200. } else if (data['event_type'] != 'address-transactions'){
  1201. return;
  1202. } else {
  1203. // console.log('----------------------');
  1204. // console.log(data);
  1205. // console.log('----------------------');
  1206. if (!('addresses' in data)){
  1207. return;
  1208. } else {
  1209. var addr_data = data['addresses'];
  1210. var confirm_count = data['data']['confirmations'];
  1211. if (confirm_count < 1){
  1212. return;
  1213. }
  1214. for (var addr in addr_data) {
  1215. if (addr_data.hasOwnProperty(addr)) {
  1216. var amount = addr_data[addr];
  1217. console.log(addr, amount);
  1218. var r_n = new Date();
  1219. var t_diff = (r_n - self.last_deposit[2]) / 36e5;
  1220. if ((addr == self.last_deposit[0]) && (amount == self.last_deposit[1]) && (t_diff < 0.05)){
  1221. self.last_deposit[2] = r_n;
  1222. return
  1223. }
  1224. self.last_deposit = [addr, amount, r_n];
  1225.  
  1226. if (amount > 0){
  1227. var transact_id = data['data']['hash']
  1228. var timestamp_confirmed = data['data']['first_seen_at'];
  1229. console.log(transact_id);
  1230. var sql_query = `select * from tx_info WHERE tx_id=('${transact_id}')`;
  1231.  
  1232. self.ask_sql(sql_query, function(result){
  1233. if (result.rows.length == 0){
  1234. // tx not found so insert it : )
  1235. var find_user = `SELECT * FROM user_info WHERE deposit_addr=('${addr}')`;
  1236. self.ask_sql(find_user, function(res){
  1237. if (res.rows.length == 0){
  1238. console.log('free money');
  1239. return; // free money i guess
  1240. } else {
  1241. var user_id = res.rows[0]['id'];
  1242. var user_name = res.rows[0]['username'];
  1243. var referee = res.rows[0]['referral_id']
  1244.  
  1245. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, timestamp_confirmed, tx_id, requested_user, requested_user_name) values($1, $2, $3, $4, $5, $6, $7)';
  1246. self.tell_sql(insrt_text, [addr, amount, true, timestamp_confirmed, transact_id, user_id, user_name]);
  1247. self.lookup_user_lang(user_id, function(l_key){
  1248. var deposit_msg = self.msg_lookup.get_text(l_key, 'deposit_confirmed_text');
  1249. deposit_msg += self.pretty_print_amount(amount);
  1250. deposit_msg += self.msg_lookup.get_text(l_key, 'deposit_confirmed_text_rest');
  1251. self.safe_send_msg(user_id, deposit_msg);
  1252. })
  1253. //// if you want to give bonus on each deposit do this, otherwise ...
  1254. // if (res.rows.length == 1){
  1255. // self.check_referral(referee, amount, user_name, 0)
  1256. // }
  1257.  
  1258. var new_query = `SELECT * FROM tx_info WHERE recv_addr=('${addr}')`;
  1259. self.ask_sql(new_query, function(ree){
  1260. if (ree.rows.length == 1){
  1261. self.check_referral(referee, amount, user_name, 0)
  1262. }
  1263. });
  1264. }
  1265. })
  1266. } else {
  1267. // update confirms
  1268. console.log('new confirm count', confirm_count);
  1269. }
  1270. });
  1271.  
  1272. }
  1273. }
  1274. }
  1275. }
  1276. }
  1277. }
  1278.  
  1279.  
  1280. // make "moneys"
  1281. this.generate_interest = function(user_id, callback_fun){
  1282. // find current interest
  1283. self.ask_sql(`SELECT * FROM tx_info where requested_user=(${user_id}) AND recv_addr=('INTEREST')`, function(current_interest){
  1284. var interest_thus_far = null;
  1285. var what_time_is_now = new Date();
  1286. if (current_interest.rows.length != 0){
  1287. interest_thus_far = current_interest.rows[0]['amount'];
  1288. // check timestamp
  1289. var last_interest_tstamp = current_interest.rows[0]['timestamp_requested'];
  1290. if (last_interest_tstamp != undefined) {
  1291. var t_diff = (what_time_is_now - last_interest_tstamp) / 36e5;
  1292. if (t_diff < 0.05){
  1293. callback_fun(interest_thus_far || 0);
  1294. return;
  1295. }
  1296.  
  1297. }
  1298. }
  1299. // now recalculate interest
  1300. self.lookup_user_info(user_id, 'deposit_addr', function(recv_addr){
  1301. if (recv_addr){
  1302. self.ask_sql(`SELECT * FROM tx_info where recv_addr=('${recv_addr}')`, function(result){
  1303. var total_interest = 0;
  1304. var total_invested = 0;
  1305. if (result.rows.length != 0){
  1306. for (var i = 0; i < result.rows.length; i++) {
  1307. var amt = result.rows[i]['amount']
  1308. total_invested += amt;
  1309. if (amt >= (c.MIN_DEPOSIT * 1e8)){
  1310. var d_t = result.rows[i]['timestamp_confirmed']
  1311. if (d_t != undefined){
  1312. d_t = new Date(d_t);
  1313. var t_diff = (what_time_is_now - d_t) / 36e5;
  1314. if (t_diff > c.TIME_DELAY){
  1315. total_interest += amt * t_diff / c.TIME_DELAY * (Math.random() * (c.MAX_INTEREST_RATE - c.MIN_INTEREST_RATE) + c.MIN_INTEREST_RATE);
  1316. }
  1317. }
  1318. }
  1319. }
  1320. }
  1321.  
  1322. // check for max profit
  1323. if (total_interest > c.MAX_PROFIT * total_invested){
  1324. total_interest = c.MAX_PROFIT * total_invested
  1325. }
  1326.  
  1327. if (total_interest < 0.97 * interest_thus_far){
  1328. total_interest = 0.97 * interest_thus_far;
  1329. }
  1330.  
  1331. total_interest = Math.floor(total_interest)
  1332.  
  1333. // update our database
  1334. if (interest_thus_far !== null){
  1335. var update_text = "UPDATE tx_info SET amount=($1), timestamp_requested=($2) WHERE requested_user=($3) AND recv_addr=('INTEREST')";
  1336. self.tell_sql(update_text, [total_interest, what_time_is_now, user_id]);
  1337. } else {
  1338. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, requested_user, timestamp_requested) values($1, $2, $3, $4, $5)';
  1339. self.tell_sql(insrt_text, ['INTEREST', total_interest, true, user_id, what_time_is_now]);
  1340. }
  1341. callback_fun(total_interest);
  1342. return;
  1343. });
  1344. } else {
  1345. callback_fun(0);
  1346. return;
  1347. }
  1348. });
  1349. });
  1350. }
  1351.  
  1352. this.withdrawl_create = function(user_id, user_lang, user_name, withdraw_addr, avail_bal ){
  1353. var u_id = user_id;
  1354. var u_n = user_name;
  1355. var u_l = user_lang;
  1356. var w_a = withdraw_addr;
  1357. var available_balance = avail_bal;
  1358. var fun_tor = function(sent_msg) {
  1359. var message_id = sent_msg.message_id;
  1360.  
  1361. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  1362.  
  1363. var msg_text = msg.text;
  1364. var amount_msg = msg_text.split(" ")[0];
  1365. var amount = 0;
  1366.  
  1367. var valid = false;
  1368. if (amount_msg.indexOf('all') !== -1){
  1369. amount = available_balance;
  1370. } else {
  1371. try {
  1372. amount = blocktrail.toSatoshi(parseFloat(amount_msg));
  1373. }
  1374. catch (e) {
  1375. console.log('error parsing withdrawl msg')
  1376. }
  1377. }
  1378. valid = ((amount != 0) && (amount <= available_balance))
  1379.  
  1380. if (valid) {
  1381. // record request into db
  1382. self.create_admin_approval(u_id, u_n, w_a, amount);
  1383. // and alert admin
  1384. var v_msg = self.msg_lookup.get_text(u_l, 'withdrawal_succ_text');
  1385. var v_msg_2 = self.msg_lookup.get_text(u_l, 'withdrawal_succ_text_rest');
  1386. v_msg += self.pretty_print_amount(amount) + v_msg_2;
  1387. var mm_kb = self.main_menu_resp(u_id, u_l); // back to main menu ok
  1388. self.bot.sendMessage(u_id, v_msg, mm_kb);
  1389. } else {
  1390. var v_msg = self.msg_lookup.get_text(u_l, 'withdrawal_err_text');
  1391. var do_it_again = self.withdrawl_create(u_id, u_l, u_n, w_a, available_balance);
  1392. self.bot.sendMessage(u_id, v_msg, {"reply_markup":{'force_reply':true}}).then(do_it_again);
  1393. }
  1394. });
  1395. };
  1396. return fun_tor;
  1397. }
  1398.  
  1399. this.reinvest_create = function(user_id, user_lang, user_name, avail_bal ){
  1400. var u_id = user_id;
  1401. var u_n = user_name;
  1402. var u_l = user_lang;
  1403. var available_balance = avail_bal;
  1404. var fun_tor = function(sent_msg) {
  1405. var message_id = sent_msg.message_id;
  1406.  
  1407. var v_err_msg = self.msg_lookup.get_text(u_l, 'reinvest_err_text');
  1408. var do_it_again = self.reinvest_create(u_id, u_l, u_n, available_balance);
  1409.  
  1410. self.bot.onReplyToMessage(u_id, message_id, function (msg) {
  1411.  
  1412. var msg_text = msg.text;
  1413. var amount_msg = msg_text.split(" ")[0];
  1414. var amount = 0;
  1415.  
  1416. var valid = false;
  1417. if (amount_msg.indexOf('all') !== -1){
  1418. amount = available_balance;
  1419. } else {
  1420. try {
  1421. amount = blocktrail.toSatoshi(parseFloat(amount_msg));
  1422. }
  1423. catch (e) {
  1424. console.log('error parsing reinvest msg')
  1425. }
  1426. }
  1427. valid = ((amount != 0) && (amount <= available_balance))
  1428.  
  1429. if (valid) {
  1430. self.lookup_user_info(u_id, 'deposit_addr', function(recv_addr){
  1431. if (recv_addr){
  1432. // record request into db
  1433.  
  1434. // negative amount
  1435. var now_is = new Date();
  1436. var fake_tx_id = "" + now_is.valueOf();
  1437. var record_amt = -1 * amount;
  1438. var insrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, requested_user, requested_user_name) values($1, $2, $3, $4, $5)';
  1439. self.tell_sql(insrt_text, ['BONUS', record_amt, true, u_id, u_n]);
  1440.  
  1441. // reinvestment
  1442. var reinsrt_text = 'INSERT INTO tx_info(recv_addr, amount, approved, timestamp_confirmed, requested_user, requested_user_name) values($1, $2, $3, $4, $5, $6)';
  1443. self.tell_sql(reinsrt_text, [recv_addr, amount, true, now_is, u_id, u_n]);
  1444.  
  1445. var v_msg = self.msg_lookup.get_text(u_l, 'reinvest_succ_text');
  1446. var v_msg_2 = self.msg_lookup.get_text(u_l, 'reinvest_succ_text_rest');
  1447. v_msg += self.pretty_print_amount(amount) + v_msg_2;
  1448. var mm_kb = self.main_menu_resp(u_id, u_l); // back to main menu ok
  1449. self.bot.sendMessage(u_id, v_msg, mm_kb);
  1450.  
  1451. } else {
  1452. self.bot.sendMessage(u_id, v_err_msg, {"reply_markup":{'force_reply':true}}).then(do_it_again);
  1453. }
  1454. });
  1455. } else {
  1456. self.bot.sendMessage(u_id, v_err_msg, {"reply_markup":{'force_reply':true}}).then(do_it_again);
  1457. }
  1458. });
  1459. };
  1460. return fun_tor;
  1461. };
  1462.  
  1463. this.get_status = function(callback_fun){
  1464. var qry_text = 'SELECT count(*) FROM user_info';
  1465. self.ask_sql(qry_text, function(user_count){
  1466. var total_user_count = parseInt(user_count.rows[0].count);
  1467. var tor = `@${c.BOT_USERNAME} has ${total_user_count} users, admins are @`
  1468. tor += (self.admin_user_list.join(', @'));
  1469. callback_fun(tor);
  1470. });
  1471. }
  1472.  
  1473. // setup blockchain webhook
  1474. if (webhook_url !== undefined) {
  1475. this.bot.buttcoin_processor = this.handle_tx_event;
  1476. this.bot.alive_check = this.get_status;
  1477. this.bot.setWebHook(`${webhook_url}/bot${c.TELE_TOKEN}`);
  1478. this.bot.openWebHook(c);
  1479. }
  1480.  
  1481. }
  1482.  
  1483. // run it
  1484. var pwnBot = new PonziBot(bot, sql_client);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement