예제 #1
0
    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}"
예제 #2
0
    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)
예제 #3
0
    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)
예제 #4
0
        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}")
예제 #5
0
    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:]}"
예제 #6
0
    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)
예제 #7
0
    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")
예제 #8
0
    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)