def _get_msg(self, wallet_data): name = wallet_data["Name"] logo = utl.esc_md(wallet_data["LogoUrl"]) sec = wallet_data["Security"] anon = wallet_data["Anonymity"] usage = wallet_data["EaseOfUse"] features = wallet_data["WalletFeatures"] coins = wallet_data["Coins"] platforms = wallet_data["Platforms"] src_url = utl.esc_md(wallet_data["SourceCodeUrl"]) validation = wallet_data["ValidationType"] trading = wallet_data["HasTradingFacilities"] website = utl.esc_md(wallet_data["AffiliateURL"]) rating = wallet_data["Rating"]["Avg"] users = wallet_data["Rating"]["TotalUsers"] ftr = "?" if not features else features src = f"`\n\nSource Code:\n`{src_url}" if src_url else "" return f"[{name}]({self._CC_URL}{logo})\n\n" \ f"`Rating: {rating} ({users} Users)\n`" \ f"`Security: {sec}\n`" \ f"`Anonymity: {anon}\n`" \ f"`EaseOfUse: {usage}\n`" \ f"`Trading: {utl.bool2str(trading)}\n`" \ f"`Validation: {validation}\n\n`" \ f"`Features:\n{', '.join(ftr)}\n\n`" \ f"`Supported Coins:\n{', '.join(sorted(coins))}\n\n`" \ f"`Platforms:\n{', '.join(platforms)}\n\n`" \ f"`Website:\n`{website}" \ f"{src}"
def _callback(self, bot, update): query = update.callback_query # Statistics - Number of Commands if query.data == "admin_cmds": sql = "SELECT COUNT(command) FROM cmd_data" data = self.tgb.db.execute(sql) bot.send_message( chat_id=update.effective_user.id, text=f"`Commands: {data[0][0]}`", parse_mode=ParseMode.MARKDOWN) # Statistics - Number of Users elif query.data == "admin_usrs": sql = "SELECT COUNT(user_id) FROM users" data = self.tgb.db.execute(sql) bot.send_message( chat_id=update.effective_user.id, text=f"`Users: {data[0][0]}`", parse_mode=ParseMode.MARKDOWN) # Statistics - Command Toplist elif query.data == "admin_cmdtop": sql = "SELECT command, COUNT(command) AS number " \ "FROM cmd_data " \ "GROUP BY command " \ "ORDER BY 2 DESC " \ "LIMIT 10" data = self.tgb.db.execute(sql) msg = str() for row in data: msg += utl.esc_md(f"{row[1]} {row[0]}\n") bot.send_message( chat_id=update.effective_user.id, text=f"`Command Toplist:\n\n{msg}`", parse_mode=ParseMode.MARKDOWN) # Statistics - Language Toplist elif query.data == "admin_langtop": sql = "SELECT language, COUNT(language) AS lang " \ "FROM users " \ "GROUP BY language " \ "ORDER BY 2 DESC " \ "LIMIT 10" data = self.tgb.db.execute(sql) msg = str() for row in data: msg += f"{row[1]} {row[0]}\n" bot.send_message( chat_id=update.effective_user.id, text=f"`Language Toplist:\n\n{msg}`", parse_mode=ParseMode.MARKDOWN)
def get_action(self, bot, update, args): if not args: if update.message: update.message.reply_text( text=f"Usage:\n{self.get_usage()}", parse_mode=ParseMode.MARKDOWN) return coin = args[0].upper() if RateLimit.limit_reached(update): return try: data = DecentralizedYet().coins() except Exception as e: return self.handle_error(e, update) if not data: update.message.reply_text( text=f"{emo.INFO} No data found", parse_mode=ParseMode.MARKDOWN) return msg = str() for c in data: if coin == c["symbol"]: name = c["name"] symbol = c["symbol"] notes = c["notes"] if "notes" in c else "" cons = c["consensus"] if "consensus" in c else "" nodes = c["public_nodes"] if "public_nodes" in c else "" incen = c["incentivized"] if "incentivized" in c else "" clients = c["client_codebases"] if "client_codebases" in c else "" msg = f"`Are We Decentralized Yet?`\n{msg}" msg += f"`{name} ({symbol})`\n\n" if notes: notes = utl.esc_md(f"{notes}\n\n") msg += f"`{notes}`" msg += f"`Consensus: {cons}`\n" msg += f"`Public Nodes: {nodes}`\n" msg += f"`Incentivized: {incen}`\n" msg += f"`Clients: {clients}`" break if not msg: msg = f"{emo.ERROR} Can't retrieve data for *{coin}*" update.message.reply_text( text=msg, parse_mode=ParseMode.MARKDOWN)
def _check_for_update(bot, job): user = Cfg.get('update', 'github_user') repo = Cfg.get('update', 'github_repo') gh = GitHub(github_user=user, github_repo=repo) try: # Get latest release response = gh.get_latest_release() except Exception as ex: logging.error(repr(ex)) return if job.context: if job.context["tag"] == response["tag_name"]: return else: job.context = dict() job.context["tag"] = response["tag_name"] release_notes = response["body"] try: response = gh.get_tags() except Exception as ex: logging.error(repr(ex)) return new_hash = str() for t in response: if t["name"] == job.context["tag"]: new_hash = t["commit"]["sha"] break cfg_hash = Cfg.get("update", "update_hash") if cfg_hash != new_hash: for admin in Cfg.get("admin_id"): update_cmd = utl.esc_md("/update") tag = job.context['tag'] try: bot.send_message( admin, f"New release *{utl.esc_md(tag)}* available\n\n" f"*Release Notes*\n{utl.esc_md(release_notes)}\n\n" f"{update_cmd}", parse_mode=ParseMode.MARKDOWN) except Exception as ex: err = f"Can't send release notes to chat {admin}" logging.error(f"{err} - {ex}")
def _get_msg(self, wallet_data): name = wallet_data["Name"] logo = utl.esc_md(wallet_data["LogoUrl"]) rating = wallet_data["Rating"]["Avg"] users = wallet_data["Rating"]["TotalUsers"] avg_fee = wallet_data["AverageFee"] exp_fee = wallet_data["FeeExpanded"] shared_fee = wallet_data["TxFeeSharedWithMiner"] payout = wallet_data["MinimumPayout"] merge = wallet_data["MergedMining"] mrg_min = wallet_data["MergedMiningCoins"] features = wallet_data["PoolFeatures"] coins = wallet_data["Coins"] locations = wallet_data["ServerLocations"] payment = wallet_data["PaymentType"] website = utl.esc_md(wallet_data["AffiliateURL"]) twitter = utl.esc_md(wallet_data["Twitter"]) exp_fee = "?" if not exp_fee else exp_fee.replace("; ", "\n") payout = "?" if not payout else payout.replace("; ", "\n") ftr = "?" if not features else features mrg_min = "" if not merge else f"`Merge Mining Coins:\n{', '.join(mrg_min)}\n\n`" mrg_min = mrg_min.replace(", ", "\n") return f"[{name}]({self._CC_URL}{logo})\n\n" \ f"`Rating: {rating} ({users} Users)\n\n`" \ f"`Features:\n{', '.join(ftr)}\n\n`" \ f"`Supported Coins:\n{', '.join(sorted(coins))}\n\n`" \ f"`Server Locations:\n{', '.join(locations)}\n\n`" \ f"`Payment Type:\n{', '.join(payment)}\n\n`" \ f"`Min. Payout:\n{payout}\n\n`" \ f"`Shared Tx Fee: {shared_fee}\n`" \ f"`Average Fee: {avg_fee}\n\n`" \ f"`Fee Expanded:\n{exp_fee}\n\n`" \ f"{mrg_min}" \ f"`Website:\n`{website}\n\n" \ f"`Twitter:\n`{self._TW_URL}{twitter[1:]}"
def get_action(self, bot, update, args): if not args: update.message.reply_text( text=f"Usage:\n{self.get_usage()}", parse_mode=ParseMode.MARKDOWN) return if len(args) > 1: update.message.reply_text( text=f"{emo.ERROR} Only one argument allowed", parse_mode=ParseMode.MARKDOWN) return if RateLimit.limit_reached(update): return coin = args[0].upper() msg = str() try: response = APICache.get_cp_coin_list() except Exception as e: return self.handle_error(e, update) for c in response: if c["symbol"] == coin: try: cp_coin_detail = CoinPaprika().get_coin_by_id(c["id"])["team"] except Exception as e: return self.handle_error(e, update) for p in cp_coin_detail: details = utl.esc_md(f"/_people__{p['id'].replace('-', '_')}") msg += f"`{p['name']}\n{p['position']}`\n{details}\n\n" break if not msg: update.message.reply_text( text=f"{emo.INFO} No team data for *{coin}*", parse_mode=ParseMode.MARKDOWN) return msg = f"`Team behind {coin}`\n\n{msg}" for message in utl.split_msg(msg): update.message.reply_text( text=message, parse_mode=ParseMode.MARKDOWN, disable_web_page_preview=True)
def _callback(self, bot, update): query = update.callback_query if not Cfg.get("database", "use_db"): bot.answer_callback_query(query.id, text="Database not enabled") return # Statistics - Number of Commands if query.data == "admin_cmds": data = self.tgb.db.execute_sql(self.get_sql("number_cmd")) if data["error"]: msg = data["error"] elif data["result"]: msg = f"`Commands: {data['result'][0][0]}`" else: msg = f"{emo.INFO} No data returned" bot.send_message(text=msg, chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) # Statistics - Number of Users elif query.data == "admin_usrs": data = self.tgb.db.execute_sql(self.get_sql("number_usr")) if data["error"]: msg = data["error"] elif data["result"]: msg = f"`Users: {data['result'][0][0]}`" else: msg = f"{emo.INFO} No data returned" bot.send_message(text=msg, chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) # Statistics - Command Toplist elif query.data == "admin_cmdtop": data = self.tgb.db.execute_sql(self.get_sql("cmd_top")) msg = str() if data["error"]: msg = data["error"] elif data["result"]: for row in data["result"] or []: msg += utl.esc_md(f"{row[1]} {row[0]}\n") else: msg = f"{emo.INFO} No data returned" bot.send_message(text=f"`Command Toplist:\n\n{msg}`", chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) # Statistics - Language Toplist elif query.data == "admin_langtop": data = self.tgb.db.execute_sql(self.get_sql("lang_top")) msg = str() if data["error"]: msg = data["error"] elif data["result"]: for row in data["result"] or []: msg += f"{row[1]} {row[0]}\n" else: msg = f"{emo.INFO} No data returned" bot.send_message(text=f"`Language Toplist:\n\n{msg}`", chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) # Statistics - User Toplist elif query.data == "admin_usertop": data = self.tgb.db.execute_sql(self.get_sql("user_top")) msg = str() if data["error"]: msg = data["error"] elif data["result"]: for row in data["result"] or []: msg += f"{row[1]} {row[0]}\n" else: msg = f"{emo.INFO} No data returned" bot.send_message(text=f"`User Toplist:\n\n{msg}`", chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) # Statistics - Daily Users elif query.data == "admin_userdaily": data = self.tgb.db.execute_sql(self.get_sql("user_daily")) if data["error"]: msg = data["error"] elif data["result"]: o_dict = OrderedDict() for row in data["result"] or []: date = row[0].split(" ")[0] if date not in o_dict: o_dict[date] = list() o_dict[date].append(row[1]) msg = str() for k, v in o_dict.items(): msg += f"\n{k}\n" for name in v: msg += f"{name}\n" else: msg = f"{emo.INFO} No data returned" bot.send_message(text=f"`Daily Users:\n{msg}`", chat_id=update.effective_user.id, parse_mode=ParseMode.MARKDOWN) bot.answer_callback_query(query.id, text="Query executed")
def get_action(self, bot, update, args): if not args: update.message.reply_text(text=f"Usage:\n{self.get_usage()}", parse_mode=ParseMode.MARKDOWN) return if RateLimit.limit_reached(update): return coin = args[0].upper() msg = str() try: response = APICache.get_cg_coins_list() except Exception as e: return self.handle_error(e, update) for entry in response: if entry["symbol"].lower() == coin.lower(): try: data = CoinGecko().get_coin_by_id(entry["id"]) except Exception as e: return self.handle_error(e, update) home_lst = list(filter(None, data["links"]["homepage"])) block_lst = list(filter(None, data["links"]["blockchain_site"])) annou_lst = list( filter(None, data["links"]["announcement_url"])) chat_lst = list(filter(None, data["links"]["chat_url"])) forum_lst = list( filter(None, data["links"]["official_forum_url"])) twitter = data["links"]["twitter_screen_name"] facebook = data["links"]["facebook_username"] btctalk = data["links"]["bitcointalk_thread_identifier"] telegram = data["links"]["telegram_channel_identifier"] reddit = data["links"]["subreddit_url"] fb_likes = data["community_data"]["facebook_likes"] tw_follow = data["community_data"]["twitter_followers"] rd_subsc = data["community_data"]["reddit_subscribers"] tg_usr_cnt = data["community_data"][ "telegram_channel_user_count"] msg = f"`Social data for {data['name']} ({coin})`\n\n" if home_lst: url = utl.esc_md(utl.url(home_lst)) msg += f"`Homepage:`\n{url}\n" if block_lst: url = utl.esc_md(utl.url(block_lst)) msg += f"`Block Explorer:`\n{url}\n" if annou_lst: url = utl.esc_md(utl.url(annou_lst)) msg += f"`Announcements:`\n{url}\n" if chat_lst: url = utl.esc_md(utl.url(chat_lst)) msg += f"`Chat:`\n{url}\n" if forum_lst: url = utl.esc_md(utl.url(forum_lst)) msg += f"`Forum:`\n{url}\n" if twitter: tw_follow = utl.format(tw_follow) url = utl.esc_md(f"{self.TW_URL}{twitter}") msg += f"`Twitter ({tw_follow} Followers):`\n{url}\n" if facebook: fb_likes = utl.format(fb_likes) url = utl.esc_md(f"{self.FB_URL}{facebook}") msg += f"`Facebook ({fb_likes} Likes):`\n{url}\n" if btctalk: url = utl.esc_md(f"{self.BT_URL}{btctalk}") msg += f"`BitcoinTalk:`\n{url}\n" if telegram: tg_usr_cnt = utl.format(tg_usr_cnt) url = utl.esc_md(f"{self.TG_URL}{telegram}") msg += f"`Telegram ({tg_usr_cnt} Users):`\n{url}\n" if reddit: rd_subsc = utl.format(rd_subsc) url = utl.esc_md(f"{utl.url(reddit)}") msg += f"`Reddit ({rd_subsc} Subscribers):`\n{url}\n" break if not msg: update.message.reply_text( text=f"{emo.ERROR} No data found for *{coin}*", parse_mode=ParseMode.MARKDOWN) return update.message.reply_text(text=msg, disable_web_page_preview=True, parse_mode=ParseMode.MARKDOWN)