Esempio n. 1
0
class Tip23(Viz):
    def __init__(self):

        self.token = token
        self.maska = maska
        self.viz_reg_bot = viz_reg["account"]
        self.viz_reg_wif = viz_reg["wif"]

        # Подключаем фразы бота
        import msg as bot_msg
        self.bot_msg = bot_msg

        self.tg = Api(self.token, report=True, PROXY=False)
        self.prepare_commands()

        self.viz = VizApi()

        self.bot_menu = Menu(menu.menu, self.commands, self.tg)

    ##### ##### TG COMMANDS ##### #####

    def prepare_commands(self):

        self.tg.commands["private_text"] = self.private_text
        self.tg.commands["private_entities"] = self.private_entities
        self.tg.commands["chat_text"] = self.chat_text
        self.tg.commands["chat_entities"] = self.chat_entities
        self.tg.commands["chat_reply"] = self.chat_reply

        self.commands = {
            "help:Intro": self.help_intro,
            "help:Reg": self.help_reg,
            "vizsign": self.vizsign,
            "vizlogin": self.vizlogin,
            "vizwallet": self.vizwallet,
            "viz:Info": self.vizinfo,
            "vizinfo:ClaimNow": self.vizclaimnow,
            "vizreg": self.vizreg,
            "vizregYN:Yes": self.vizregyes,
            "vizdelYN:Yes": self.vizdelyes,
            "language:Russian": self.language,
            "language:English": self.language,
            "report:On": self.report,
            "report:Off": self.report,
        }

    ##### ##### CHAT ##### #####

    def private_text(self, message):
        self.bot_menu.resolve(message)

    def private_entities(self, message):
        self.bot_menu.resolve(message)
        pass

    def chat_text(self, message):
        #print(message["chat"]["id"], message["text"])
        #tg.send_message(message["chat"]["id"], 'get text')
        pass

    def chat_entities(self, message):

        user_id, chat_id, lng = self.get_params_chat(message)
        cmd = message["text"]

        cmd_all = ['/viz+', '/viz-']
        if (user_id in self.bot_menu.users_tg) and (cmd in cmd_all):
            db = self.bot_menu.users_tg[user_id]
            print(self.maska, 'CMD', chat_id, user_id, cmd)

            if cmd in ['/viz+', '/viz-']:
                target_account, target_chat, asset = 'vizaccount', 'vizchat', 'VIZ'

            if cmd in ['/viz+']:
                initiator = db.get(target_account, None)
                if initiator:
                    account, wif = initiator.split(':')
                    db.setdefault(target_chat, [])
                    if chat_id not in db[target_chat]:
                        if cmd == '/viz+':
                            tx = self.viz.get_accounts([account])[0]
                        try:
                            msg = ' '.join([' +' + str(int(tx["TIP"])), asset])
                        except:
                            msg = ' error data'

                        db[target_chat].append(chat_id)
                        self.tg.send_message(chat_id,
                                             self.bot_msg.InvestorBecome[lng] +
                                             msg,
                                             delete=True)
                        self.bot_menu.save()
                    else:
                        self.tg.send_message(chat_id,
                                             self.bot_msg.InvestorAlready[lng],
                                             delete=True)
                else:
                    self.tg.send_message(chat_id,
                                         self.bot_msg.MustConnectAccount[lng],
                                         delete=True)

            if cmd in ['/viz-']:
                chat_list = db.get(target_chat, [])
                if chat_id in chat_list:
                    db[target_chat].remove(chat_id)
                    self.tg.send_message(chat_id,
                                         self.bot_msg.InvestorWithdraw[lng] +
                                         asset,
                                         delete=True)
                    self.bot_menu.save()

    def chat_reply(self, message):
        user_id, chat_id, lng = self.get_params_chat(message)

        text = message["text"]
        user_name = '@' + str(message["from"].get("username", ''))
        message_id = str(message["message_id"])

        title = str(message["chat"]["title"])

        reply_id = str(message["reply_to_message"]["from"]["id"])
        reply_username = '******' + str(message["reply_to_message"]["from"].get(
            "username", ''))
        reply_text = str(message["reply_to_message"].get("text", ''))
        is_bot = str(message["reply_to_message"]["from"]["is_bot"])

        k_like, amount, target_main = text.count('+', 0, 5), 0, None

        if 'viz' == text[:3].lower():
            target_main = 'viz'
            try:
                amount = int(text.split()[0].lower().replace('viz', ''))
            except:
                amount = 1

        flag_for_del = True if k_like > 0 and len(text) <= 5 else False
        if flag_for_del:
            payload = [chat_id, message_id, self.tg.DEL_DELAY]
            self.tg.delete_message(payload)

        #if (k_like > 0) and (user_id != reply_id) and (str(is_bot) == 'False'):				# Если есть хоть один +, не самоап и не бот
        if (k_like > 0 or amount > 0) and (
                str(is_bot) == 'False'
        ):  # TEST for TEST Если есть хоть один +, самоап и не бот
            print(self.maska, user_id, reply_id, k_like, amount)
            if user_id in self.bot_menu.users_tg and reply_id in self.bot_menu.users_tg:  # Если юзеры в базе

                flag = False  # Отслеживаем в целом инвестора
                reports = []

                target_list = [target_main] if target_main else ['viz']
                for target in target_list:

                    state_acc, target_chat, wallet_acc = target + 'account', target + 'chat', target + 'wallet'

                    chat_list = self.bot_menu.users_tg[user_id].get(
                        target_chat, [])
                    if chat_id in chat_list:

                        flag = True

                        asset_account = self.bot_menu.users_tg[user_id].get(
                            state_acc, None)
                        asset_account_for_donate = self.bot_menu.users_tg[
                            reply_id].get(wallet_acc, None)
                        if asset_account and asset_account_for_donate:  # Если оба в базе
                            account, wif = asset_account.split(':')
                            account_for_donate = asset_account_for_donate

                            report = None
                            lines, comment = text.split(), ''
                            if len(lines) >= 2: comment = ' '.join(lines[1:])

                            if 'viz' == target:
                                report = self.viz_donate(account,
                                                         k_like,
                                                         title,
                                                         reply_text,
                                                         account_for_donate,
                                                         wif,
                                                         amount=amount,
                                                         comment=comment)

                            if report:
                                reports.append(report)

                        elif asset_account and (not asset_account_for_donate
                                                ):  # Если нет кому донатить
                            msg = self.bot_msg.NoProfileForDonate[
                                lng] + ' ' + target.upper()
                            self.tg.send_message(chat_id, msg, delete=True)

                for amount, report in reports:
                    # report
                    msg = ''.join([' +', amount, report])
                    self.tg.send_message(chat_id,
                                         reply_username + msg,
                                         delete=True)
                    if self.bot_menu.users_tg[user_id].get("report", True):
                        self.tg.send_message(
                            user_id, 'donate to ' + reply_username + msg)
                    if self.bot_menu.users_tg[reply_id].get("report", True):
                        self.tg.send_message(
                            reply_id, 'received from ' + user_name + msg)

                if not flag:
                    self.tg.send_message(chat_id,
                                         self.bot_msg.InvestorNot[lng],
                                         delete=True)

    ##### ##### HELP ##### #####

    def help_intro(self, message):
        msg = 'https://golos.id/ru--blokcheijn/@ksantoprotein/tip23bot-telegramm-bot-dlya-laikov-avtokleminga-i-igr'
        self.tg.send_message(message["chat"]["id"], msg)

    def help_reg(self, message):
        msg = 'https://golos.id/ru--blokcheijn/@ksantoprotein/tip23bot-registraciya'
        self.tg.send_message(message["chat"]["id"], msg)

    ##### ##### GET ##### #####

    def get_language(self, user_id):
        if user_id in self.bot_menu.users_tg:
            lng = self.bot_menu.users_tg[user_id].get("language", 'Russian')
        else:
            lng = 'Russian'
        return lng

    def get_chats(self, chat_list):
        chats = []
        for chat_id in chat_list:
            tx = self.tg.getChat(str(chat_id))
            if tx:
                chat = ''.join(
                    ['@',
                     tx.get("username", ''), ':',
                     tx.get("title", '')])
                chats.append(chat)
            else:
                print('error in chat', chat_id)
                chats.append('hidden')
        return chats

    def get_params_message(self, message, type):
        user_id = str(message["chat"]["id"])
        lng = self.get_language(user_id)
        keyboard = self.bot_menu.state[type]["keyboard"]
        db = self.bot_menu.users_tg[user_id]
        return ([user_id, lng, keyboard, db])

    def get_params_chat(self, message):
        user_id = str(message["from"]["id"])
        chat_id = str(message["chat"]["id"])
        lng = self.get_language(user_id)

        #db = self.bot_menu.users_tg[user_id]
        return ([user_id, chat_id, lng])

    def get_url_from_reply_text(self, reply_text, sign):
        lines = reply_text.split()
        authors = []
        for line in lines:
            if 'https://' == line[:8]:
                url = line
                response = self.golos.rpc.http.get(url, timeout=3)
                if response.ok:

                    text = str(response.text)
                    if sign + ':' in text:
                        for i in range(len(text)):
                            if sign + ':' == text[i:i + len(sign + ':')]:
                                raw = text[i:].split(':')[1]
                                author = []
                                if raw[0] in list(
                                        'abcdefghijklmnopqrstuvwxyz'):
                                    author.append(raw[0])
                                    for litter in raw[1:]:
                                        if litter in list(
                                                'abcdefghijklmnopqrstuvwxyz0123456789.-'
                                        ):
                                            author.append(litter)
                                        else:
                                            break
                                authors.append([''.join(author), url])

        if len(authors) > 0:
            print(sign, authors[0])
            return authors[0]
        return ([False, False])

    ##### ##### ##### ##### #####

    def language(self, message):
        lng = message["text"]
        user_id = str(message["chat"]["id"])
        if lng in ['Russian', 'English']:
            self.bot_menu.users_tg[user_id]["language"] = lng

    def report(self, message):
        type_report = True if message["text"] == 'On' else False
        user_id = str(message["chat"]["id"])
        self.bot_menu.users_tg[user_id].setdefault("report", True)
        self.bot_menu.users_tg[user_id]["report"] = type_report
# -*- coding: utf-8 -*-

import json
from pprint import pprint

from tvizbase.api import Api

print('connect')
b4 = Api()
print('try call')

account = 'ksantoprotein'
wif = '5...'  #regular
json_metadata = {"profile": {}, "name": 'Протей'}

tx = b4.get_accounts([account])[0]
print(tx["json_metadata"])

input('ready?')

tx = b4.account_metadata(account, json_metadata, wif)
pprint(tx)

input()
#Loading settings from the json file
with open(os.path.dirname(__file__) + '/settings.json', 'r') as sett_file:
    settings = json.load(sett_file)
viz = Api()
#Getting the head block number from the blockchain
block_num = viz.get_dynamic_global_properties()['head_block_number']
#Number of blocks for energy recovery
block_count = (20 * 60 * 24 / 20) * settings['award_percent']
#Blcok delay for posting in the blockchain
block_count -= 2
#Comparing the head block number with the number of the last operation
if block_num <= settings['last_block_num'] + block_count:
    sys.exit()
#Getting account data
account = viz.get_accounts([settings['viz_account']['login']])[0]
receiver = 'committee'
#Calculating percentage of the award
award_percent = round(settings['award_percent'] * 100 *
                      settings['award_base'] / account['SHARES'])
#Sending award in the blockchain
res = viz.award(settings['viz_account']['login'], receiver, award_percent,
                settings['viz_account']['key'])
if res == False:
    sys.exit()
#Saving the last operation block number in the json file
settings['last_block_num'] = res['block_num']
with open(os.path.dirname(__file__) + '/settings.json', 'w') as sett_file:
    json.dump(settings, sett_file)
#Getting current award size from the virtual operations
ops = viz.get_ops_in_block(int(res['block_num']))