Exemplo n.º 1
0
	def __init__(self):
		
		self.sm = SteemMonstersApi()
		#self.api = SteemApi()
		self.fm = FindMatch()
		self.root = Tk()
		
		self.flag = False
		self.team_opponent = {}
		
		with open('accounts.ini', 'r') as f:
			raw = f.read()
		self.fm.accounts_list = raw.replace('\n', ' ').split()
		print('load accounts:', self.fm.accounts_list)
		
		self.fm.nodes_list = storage.nodes
		print('load nodes:', self.fm.nodes_list)
		
		self.root.title('Explorer SteemMonsters')
		self.root.minsize(700, 450)
		self.root.maxsize(700, 450)
		
		self.load_liga()
		self.load_find_match()
		self.load_vs()
		self.load_unit()
		
		self.sm.load_cards()
		
		self.root.mainloop()
Exemplo n.º 2
0
    def __init__(self):

        self.last_b = 30000000

        self.sm = SteemMonstersApi()
        self.api = Api()

        self.load_state()

        print('last block', self.state["last_block"])
	def __init__(self, double = False, csv = False):
		
		self.last_b = 30000000
		self.double = double
		self.csv = csv
		
		self.sm = SteemMonstersApi()
		self.api = Api()
		
		self.load_state()
Exemplo n.º 4
0
    def __init__(self):

        self.sm_custom_cmd = {
            'sm_find_match': self.sm_find_match,
            'sm_submit_team': self.sm_submit_team,
            'sm_team_reveal': self.sm_team_reveal,
        }

        self.liga_active = 'chemp'
        self.sm_find_match_list = []  ### Кто подал заявку на батл
        self.sm_battles_list = {}  ### Список trx_id ожидающих и не только
        self.sm_players_list = []
        self.sm_vs_list = []

        self.accounts_list = []  ### Список аккантов для отслеживания

        self.replay = True
        self.timestamp = '1983-03-26T12:12:12'

        self.flag = True
        self.sm = SteemMonstersApi()
Exemplo n.º 5
0
class Deep():

    decks = {}  ### save load
    ### {team_csv, {"win": 0, "total": 0}}
    ### team_csv = ','.join([liga, ruleset, str(mana_cap), color, summoner] + monsters)
    ### summoner = level:name

    files = {
        "state_main": 'combo.json',
        "state_bak": 'combo.bak',
        "state_csv": 'combo.csv',
        "state_csv_mini": 'combo_mini.csv',
    }

    types = [
        'sm_battle', 'sm_start_quest', 'find_match', 'sm_submit_team',
        'sm_team_reveal', 'token_transfer', 'sm_claim_reward',
        'sm_combine_all', 'gift_packs', 'market_purchase', 'sm_combine_cards',
        'open_pack', 'sm_sell_cards', 'sm_cancel_match', 'sm_surrender',
        'sm_market_purchase', 'sm_gift_cards', 'guild_contribution',
        'enter_tournament', 'sm_refresh_quest', 'sm_market_sale',
        'purchase_orbs', 'delegate_cards', 'update_price', 'sm_cancel_sell',
        'burn_cards', 'sm_card_award', 'sm_pack_purchase', 'undelegate_cards',
        'join_guild', 'guild_accept', 'guild_promote', 'purchase_item'
    ]

    def __init__(self):

        self.last_b = 30000000

        self.sm = SteemMonstersApi()
        self.api = Api()

        self.load_state()

        print('last block', self.state["last_block"])

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

    def load_state(self):
        try:
            with open(self.files["state_main"], 'r', encoding='utf8') as f:
                self.state = json.load(f)
                print('load state ok')
        except:
            # not exist or bad file, load copy in *.bak
            try:
                with open(self.files["state_bak"], 'r', encoding='utf8') as f:
                    self.state = json.load(f)
                    print('load state bak ok')
            except:
                self.state = {"last_block": self.last_b, "decks": {}}
                self.save_state()
                print('genesis new state')

    def save_state(self):
        self.decks = {}
        print('save state')
        with open(self.files["state_main"], 'w', encoding='utf8') as f:
            json.dump(self.state, f, ensure_ascii=False)
        with open(self.files["state_bak"], 'w', encoding='utf8') as f:
            json.dump(self.state, f, ensure_ascii=False)
        print('end save state')
        print('save decks')
        '''
		with open(self.files["state_csv"], 'w') as f:
			f.write(','.join(['Win', 'Total', 'Ruleset1', 'Ruleset2', 'Liga', 'Mana_cap', 'Color', 'Summoner']) + '\n')
			for key, value in self.state["decks"].items():
				f.write(','.join([str(value["win"]), str(value["total"]), key]) + '\n')
				
				new_key = ';'.join([i.split(':')[0] for i in key.split(',')])
				self.decks.setdefault(new_key, {"win": 0, "total": 0})
				self.decks[new_key]["win"] += value["win"]
				self.decks[new_key]["total"] += value["total"]
			
		with open(self.files["state_csv_mini"], 'w') as f:
			f.write(';'.join(['Win', 'Total', 'Ruleset1', 'Ruleset2', 'Liga', 'Mana_cap', 'Color', 'Summoner']) + '\n')
			for key, value in self.decks.items():
				f.write(';'.join([str(value["win"]), str(value["total"]), key]) + '\n')
		'''
        print('end save decks')

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

    def upload(self):

        block_end = self.api.get_irreversible_block()
        print('update block_end', block_end)

        n = 0
        s = 0

        while True:

            ids = []

            print('start from', self.state["last_block"], n, s)
            data = self.sm.get_from_block(self.state["last_block"])

            for line in data:

                if line["type"] == 'sm_battle':
                    block_num = line["block_num"]

                    if line["error"] != None or line["success"] != True:
                        line.pop("data")
                        line.pop("result")

                        pprint(line)
                        input('next?')
                    else:
                        data = json.loads(line.pop("data"))
                        result = json.loads(line.pop("result"))

                        if result["match_type"] == 'Ranked':
                            mana_cap = result["mana_cap"]
                            # Новые правила двойных боев
                            ruleset = result["ruleset"].split(
                                '|') if '|' in result["ruleset"] else [
                                    result["ruleset"], '-'
                                ]
                            winner = result["winner"]
                            players = result["players"]

                            if result["id"] not in ids:
                                if players[0][
                                        "initial_rating"] >= 100:  # Отсеиваем новичков
                                    #self.resolve_players(players)

                                    if not result["details"].get("type", None):

                                        for t in ["team1", "team2"]:
                                            team = result["details"][t]
                                            if team:
                                                team_csv = self.sm.convert_team_to_csv(
                                                    team, ruleset, mana_cap)
                                                if team_csv:
                                                    self.state[
                                                        "decks"].setdefault(
                                                            team_csv, {
                                                                "win": 0,
                                                                "total": 0
                                                            })
                                                    if winner == team[
                                                            'player']:
                                                        self.state["decks"][
                                                            team_csv][
                                                                "win"] += 1
                                                    self.state["decks"][
                                                        team_csv]["total"] += 1

                                        ids.append(result["id"])
                                        n += 1

            self.state["last_block"] = line["block_num"]  ###

            s += 1
            if s >= 1000:
                self.save_state()
                s = 0

            if self.state["last_block"] > block_end:
                self.save_state()
                break
        return

    def resolve_players(self, players):

        for player, oppenent in [[0, 1], [1, 0]]:
            player_name = players[player]["name"]
            oppenent_name = players[oppenent]["name"]

            d = players[player]["initial_rating"] - players[player][
                "final_rating"]
            win, lose = [1, 0] if d > 0 else [0, 1]

            self.state["players"].setdefault(player_name, {})
            self.state["players"][player_name].setdefault(
                oppenent_name, [0, 0])
            self.state["players"][player_name][oppenent_name][0] += win
            self.state["players"][player_name][oppenent_name][1] += lose

            d_rating = players[player]["initial_rating"] - players[oppenent][
                "initial_rating"]
            if d_rating >= 0:
                rating = str(int(d_rating / 5) * 5)  # округление до шага 5
                self.state["ratings"].setdefault(rating, [0, 0])
                self.state["ratings"][rating][0] += win
                self.state["ratings"][rating][1] += lose

        return
Exemplo n.º 6
0
class FindMatch():

    step_part = 14  ### Количество выводимых строк

    def __init__(self):

        self.sm_custom_cmd = {
            'sm_find_match': self.sm_find_match,
            'sm_submit_team': self.sm_submit_team,
            'sm_team_reveal': self.sm_team_reveal,
        }

        self.liga_active = 'chemp'
        self.sm_find_match_list = []  ### Кто подал заявку на батл
        self.sm_battles_list = {}  ### Список trx_id ожидающих и не только
        self.sm_players_list = []
        self.sm_vs_list = []

        self.accounts_list = []  ### Список аккантов для отслеживания

        self.replay = True
        self.timestamp = '1983-03-26T12:12:12'

        self.flag = True
        self.sm = SteemMonstersApi()
        #self.api = SteemApi()
        #self.sm.load_cards()

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

    def run(self, liga):
        #self.scan_blocks(self.resolve_block)
        print('connect to', self.node)
        self.api = SteemApi(nodes=[self.node])
        self.liga_active = liga
        self.flag = True
        self.players = {
            acc: {}
            for acc in self.accounts_list
        }  ### Список своих аккаунтов для отслеживания {player:}
        self.opponents = []  ### Список оппонентов, чтобы их подсвечивать

        sm_thread = Thread(target=self.scan_blocks,
                           args=[self.resolve_block],
                           daemon=True)
        sm_thread.start()
        print('run scan')

    def stop(self):
        self.flag = False
        self.sm_find_match_list = []
        self.sm_battles_list = {}
        self.sm_players_list = []
        self.sm_vs_list = []
        self.players = {acc: {} for acc in self.accounts_list}
        self.replay = True

    def scan_blocks(self, cmd):
        print('reconnect')
        last_block = self.api.get_head_block() - 1 * 20  #aka 1 min	###
        print('replay... wait')
        self.replay = True

        while self.flag:
            time_start = time()
            head_block = self.api.get_head_block()

            for b in range(last_block, head_block):
                #print('next block', b)
                cmd(self.api.get_block(b))  #resolve_block

            ###pprint(self.players)
            self.check_battles()

            time_end = time()
            d = round(time_end - time_start)
            tt = 3 - d
            tt = 0 if tt < 0 else tt
            last_block = head_block
            #print('sleep', tt, 'sec')
            self.replay = False
            sleep(tt)
        print('stop scan')  ###

    def resolve_block(self, block):
        #self.timestamp = block["timestamp"].split('T')[1]
        try:
            self.timestamp = block["timestamp"]
        except:
            print('ERROR not correct block from b4')
            sleep(3)
        # check custom
        for tx in block["transactions"]:  ###
            for op in tx["operations"]:
                if op[0] == 'custom_json':
                    id = op[1].get('id')
                    if id in self.sm_custom_cmd:
                        player = op[1].get('required_posting_auths')[0]
                        #player = op[1].get('required_posting_auths', [None])[0]
                        data = json.loads(op[1].get('json', None))
                        trx_id = tx.get('transaction_id')
                        self.sm_custom_cmd[id](
                            player, data, trx_id,
                            self.timestamp)  #sm_find_match and other

    def sm_find_match(self, player, data, trx_id, timestamp):
        if data["match_type"] == 'Ranked':
            rating = self.sm.get_player_login(player)["rating"]
            liga = self.sm.is_rating(rating)
            if liga == self.liga_active:

                hide = '' if self.sm.is_submit_hashed_team(player) else '*'
                ### Кто подал заявку на батл
                self.sm_find_match_list.append({
                    "timestamp":
                    timestamp.split('T')[1],
                    "player":
                    player,
                    "liga":
                    liga,
                    "rating":
                    rating,
                })
                if len(self.sm_find_match_list) > self.step_part:
                    self.sm_find_match_list = self.sm_find_match_list[
                        -self.step_part:]

                ### Список trx_id ожидающих и не только
                self.sm_battles_list[trx_id] = {
                    "player": player,
                    "rating": rating,
                    "timestamp": timestamp,
                    "hide": hide
                }
                #print('add trx', trx_id)
                #print(timestamp, player, liga, rating)

    def check_battles(self):

        list_for_del = []
        sm_players_list = []
        for trx_id, value in self.sm_battles_list.items():  ### error
            battle = self.sm.get_battle_status(trx_id)
            if isinstance(battle, dict):
                status = int(battle["status"])

                if status == 0:
                    sm_players_list.append([
                        value["rating"], value["player"], value["timestamp"],
                        value["hide"]
                    ])
                elif status == 1:

                    #pprint(battle)	###

                    player = battle["player"]
                    opponent_player = battle["opponent_player"]
                    timestamp = str(battle["match_date"])
                    timestamp = timestamp.split('.')[0].split('T')[1]

                    mana_cap = battle["mana_cap"]
                    ruleset = battle["ruleset"]
                    inactive = battle["inactive"]

                    if player in self.players:
                        self.players[player][
                            "opponent_player"] = opponent_player
                        self.players[player][
                            "submit_hashed_team"] = self.sm.is_submit_hashed_team(
                                opponent_player)
                        if opponent_player not in self.opponents:
                            self.opponents.append(opponent_player)
                            opponent_colors = self.sm.get_opponent_colors(
                                opponent_player)
                            print(player, 'VS', opponent_player)
                            pprint(opponent_colors["procent"])
                    else:
                        self.sm_vs_list.append(
                            [timestamp, player, 'VS', opponent_player])
                        list_for_del.append(trx_id)

                elif status == 2:
                    list_for_del.append(trx_id)

                    player = battle["player"]
                    opponent_player = battle["opponent_player"]
                    timestamp = str(battle["created_date"])
                    timestamp = timestamp.split('.')[0].split('T')[1]

                    if player in self.players:
                        print('round complete')
                        self.players[player] = {}  # Обнуление
                        self.opponents.remove(opponent_player)

                        #pprint(battle)
                    self.sm_vs_list.append(
                        [timestamp, player, 'VS', opponent_player])

                else:
                    list_for_del.append(trx_id)

                    player = battle["player"]
                    #pprint(battle)
                    if player in self.players:
                        print('round NOT complete')
                        self.players[player] = {}

        if len(self.sm_vs_list) > self.step_part:
            self.sm_vs_list = self.sm_vs_list[-self.step_part:]

        for trx_id in list_for_del:
            self.sm_battles_list.pop(trx_id)

        self.sm_players_list = sm_players_list[:]
        self.sm_players_list.sort(reverse=True)

    def sm_submit_team(self, player, data, trx_id, timestamp):
        for acc in self.players:
            if player == self.players[acc].get("opponent_player", None):
                try:
                    team = [data["summoner"]] + data["monsters"]
                    csv = self.sm.resolve_team(team, player)
                    print(self.timestamp, 'submit', player, csv)
                except:
                    print(self.timestamp, 'hash team from', player)
                    csv = 'hash'
                self.players[acc]["team"] = csv

    def sm_team_reveal(self, player, data, trx_id, timestamp):
        for acc in self.players:
            if player == self.players[acc].get("opponent_player", None):
                team = [data["summoner"]] + data["monsters"]
                csv = self.sm.resolve_team(team, player)
                print(self.timestamp, 'reveal', player, csv)
                self.players[acc]["team"] = csv
class Deep():
	
	decks = {}	### save load	
				### {team_csv, {"win": 0, "total": 0 and colors}}
				### team_csv = ','.join([ruleset, liga, str(mana_cap), color, summoner] + monsters)
				### summoner = level:name
				
	files = {
				"state_main": 'moon.json',
				"state_bak": 'moon.bak',
				"state_csv": 'moon.csv',
				"state_csv_mini": 'moon_mini.csv',
			}

	types = ['sm_battle', 'sm_start_quest', 'find_match', 'sm_submit_team', 'sm_team_reveal', 'token_transfer', 'sm_claim_reward', 'sm_combine_all',
				'gift_packs', 'market_purchase', 'sm_combine_cards', 'open_pack', 'sm_sell_cards', 'sm_cancel_match', 'sm_surrender',
				'sm_market_purchase', 'sm_gift_cards', 'guild_contribution', 'enter_tournament', 'sm_refresh_quest', 'sm_market_sale',
				'purchase_orbs', 'delegate_cards', 'update_price', 'sm_cancel_sell', 'burn_cards', 'sm_card_award', 'sm_pack_purchase',
				'undelegate_cards', 'join_guild', 'guild_accept', 'guild_promote', 'purchase_item']

			
	def __init__(self, double = False, csv = False):
		
		self.last_b = 30000000
		self.double = double
		self.csv = csv
		
		self.sm = SteemMonstersApi()
		self.api = Api()
		
		self.load_state()

		
	##### ##### ##### ##### #####
	
	def load_state(self):
		try:
			with open(self.files["state_main"], 'r', encoding = 'utf8') as f:
				self.state = json.load(f)
				print('load state ok')
		except:
			# not exist or bad file, load copy in *.bak
			try:
				with open(self.files["state_bak"], 'r', encoding = 'utf8') as f:
					self.state = json.load(f)
					print('load state bak ok')
			except:
				self.state = {"last_block": self.last_b, "decks": {liga: {} for liga in self.sm.ratings}}
				self.save_state()
				print('genesis new state')
				
	
	def save_state(self):
		self.decks = {}
		print('save state')
		with open(self.files["state_main"], 'w', encoding = 'utf8') as f:
			json.dump(self.state, f, ensure_ascii = False)
		if self.double:
			with open(self.files["state_bak"], 'w', encoding = 'utf8') as f:
				json.dump(self.state, f, ensure_ascii = False)
		if self.csv:
			with open(self.files["state_csv"], 'w', encoding = 'utf8') as f:
				for liga, v1 in self.state["decks"].items():
					for ruleset, v2 in v1.items():
						for mana_cap, v3 in v2.items():
							for team, v4 in v3.items():
								players = []
								for player, v5 in v4["player"].items():
									p5 = ':'.join([player, str(v5["win"]), str(v5["lose"])])
									players.append(p5)
								p4 = ','.join(players)
								p3 = ':'.join([str(v4[cmd]) for cmd in ["win", "total", "Red", "Blue", "Green", "White", "Black", "Gold"]])
								line = ';'.join([p3, p4, liga, ruleset, mana_cap, team])
								f.write(line + '\n')
			
		print('end save state')
		
	##### ##### ##### ##### #####
	
	def load_moon(self, login):
	
		collection = self.sm.get_player_collection(login)
		
		self.moon_cards = {}
		for uid, card in collection.items():
			name, level = card["name"], card["level"]
			self.moon_cards.setdefault(name, {"level": level, "uid": uid})
			if level > self.moon_cards[name]["level"]:
				self.moon_cards[name] = {"level": level, "uid": uid}

		self.moon_decks = {liga: {} for liga in self.sm.ratings}
		for liga, v1 in self.state["decks"].items():
			for ruleset, v2 in v1.items():
				for mana_cap, v3 in v2.items():
					for team, v4 in v3.items():
						color, *combo = team.split(';')
						
						win, total = v4["win"], v4["total"]
					
						for i in range(len(self.sm.colors) - 1):
							opponent_color = self.sm.colors[i]
							win_color = v4[opponent_color]
							k_moon = round((win_color / total) * (win / total) * (win + total), 3)
						
							self.moon_decks[liga].setdefault(ruleset, {})
							self.moon_decks[liga][ruleset].setdefault(mana_cap, {})
							self.moon_decks[liga][ruleset][mana_cap].setdefault(opponent_color, {})
							self.moon_decks[liga][ruleset][mana_cap][opponent_color].setdefault(color, {"team": ['xxx'], "k_moon": -100, "best": combo, "k_best": k_moon})
							if k_moon > self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["k_best"]:
								self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["k_best"] = k_moon
								self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["best"] = combo
							
							flag = True
							
							for card in combo:
								name, level = card.split(':')
								level = int(level)
								if name in self.moon_cards:
									for k in range(level - self.moon_cards[name]["level"]):
										k_moon = round(k_moon * 0.75, 3)
								else:
									flag = False
									break

							if flag:
								
								if k_moon > self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["k_moon"]:
									self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["k_moon"] = k_moon
									self.moon_decks[liga][ruleset][mana_cap][opponent_color][color]["team"] = combo
		
	##### ##### ##### ##### #####
	
	def upload(self):
	
		block_end = self.api.get_irreversible_block()
		print('update block_end:', block_end, 'last block:', self.state["last_block"])

		n = 0
		s = 0
		
		while True:
		
			ids = []
			
			print('start from', self.state["last_block"], n, s, 'update block_end:', block_end)
			data = self.sm.get_from_block(self.state["last_block"])

			for line in data:
			
				if line["type"] == 'sm_battle':
					block_num = line["block_num"]
				
					if line["error"] != None or line["success"] != True:
						line.pop("data")
						line.pop("result")
						
						pprint(line)
						input('next?')
					else:
						data = json.loads(line.pop("data"))
						result = json.loads(line.pop("result"))
						
						if result["match_type"] == 'Ranked':
							mana_cap = str(result["mana_cap"])
							ruleset = self.sm.check_ruleset(result["ruleset"])
							winner = result["winner"]
							players = result["players"]

							if result["id"] not in ids:
								liga = self.sm.is_rating(players[0]["initial_rating"])
								if liga:		# Отсеиваем новичков >= 100
									
									if not result["details"].get("type", None):
										
										for team_player, team_opponent in [["team1", "team2"], ["team2", "team1"] ]:
											team = result["details"][team_player]
											if team:
												oppenent_color = result["details"][team_opponent]["color"]
												team_csv = self.convert_team_to_csv(team)
												if team_csv:
													self.state["decks"][liga].setdefault(ruleset, {})
													self.state["decks"][liga][ruleset].setdefault(mana_cap, {})
													self.state["decks"][liga][ruleset][mana_cap].setdefault(team_csv, {
															"win": 0, "total": 0, 
															"Red": 0, "Blue": 0, "Green": 0, "White": 0, "Black": 0, "Gold": 0,
															"player": {}})
													self.state["decks"][liga][ruleset][mana_cap][team_csv]["player"].setdefault(team["player"], {
															"win": 0, "lose": 0})
													if winner == team["player"]:
														self.state["decks"][liga][ruleset][mana_cap][team_csv]["win"] += 1
														self.state["decks"][liga][ruleset][mana_cap][team_csv][oppenent_color] += 1
														self.state["decks"][liga][ruleset][mana_cap][team_csv]["player"][team['player']]["win"] += 1
													else:
														self.state["decks"][liga][ruleset][mana_cap][team_csv][oppenent_color] -= 1
														self.state["decks"][liga][ruleset][mana_cap][team_csv]["player"][team['player']]["lose"] += 1
													self.state["decks"][liga][ruleset][mana_cap][team_csv]["total"] += 1
										ids.append(result["id"])
										n += 1
			
						
			self.state["last_block"] = line["block_num"]	###
			
			s += 1
			if s >= 1000:
				self.save_state()
				s = 0
			
			if self.state["last_block"] > block_end:
				self.save_state()
				break
		return
		
		
	def convert_team_to_csv(self, team):
		liga = self.sm.is_rating(team["rating"])
		if liga:
			try:
				summoner = self.sm.card_names[team["summoner"]["card_detail_id"]] + ':' + str(team["summoner"]["level"])
				monsters = [self.sm.card_names[monster["card_detail_id"]] + ':' + str(monster["level"]) for monster in team["monsters"]]
				combo = self.sm.check_rarity([summoner] + monsters, liga)
				color = self.sm.check_color(combo)
				csv = ';'.join([color] + combo)
				return(csv)
			except:
				pprint(team)
				input('Error convert')
		return False
Exemplo n.º 8
0
class Explorer():

	color_stop = 'red'
	color_go = 'green'
	color_opponent_hide = 'red'
	color_opponent_not_hide = 'cyan'

	scan_sleep = 0.5
	sleep_team_opponent = 5
	
	
	def __init__(self):
		
		self.sm = SteemMonstersApi()
		#self.api = SteemApi()
		self.fm = FindMatch()
		self.root = Tk()
		
		self.flag = False
		self.team_opponent = {}
		
		with open('accounts.ini', 'r') as f:
			raw = f.read()
		self.fm.accounts_list = raw.replace('\n', ' ').split()
		print('load accounts:', self.fm.accounts_list)
		
		self.fm.nodes_list = storage.nodes
		print('load nodes:', self.fm.nodes_list)
		
		self.root.title('Explorer SteemMonsters')
		self.root.minsize(700, 450)
		self.root.maxsize(700, 450)
		
		self.load_liga()
		self.load_find_match()
		self.load_vs()
		self.load_unit()
		
		self.sm.load_cards()
		
		self.root.mainloop()
		
		
	def scan(self):
	
		while self.flag:
		
			### find_match_label ###
			#print(self.fm.sm_find_match_list)
			raw_text = [' '.join([i["timestamp"], str(i["rating"]), i["player"]]) for i in self.fm.sm_find_match_list]
			new_text = '\n'.join(raw_text)
			self.find_match_label["text"] = new_text if not self.fm.replay else 'replay'
			
			### vs_label ###
			raw_text = [' '.join(i) for i in self.fm.sm_vs_list]
			new_text = '\n'.join(raw_text)
			self.vs_label["text"] = new_text if not self.fm.replay else 'replay'
			
			### pool_label ###
			now = int(mktime(strptime(self.fm.timestamp, time_format)))
			raw_text = [' '.join(['{:>3}'.format(str(now - int(mktime(strptime(i[2], time_format))))), 'sec', str(i[0]), i[1], i[3]]) for i in self.fm.sm_players_list]
			new_text = '\n'.join(raw_text)
			self.pool_label["text"] = new_text if not self.fm.replay else 'replay'
			self.pool_label["bg"] = self.color_stop if len(self.fm.sm_players_list) > 0 or self.fm.replay else self.color_go

			### title ###
			utc_unit = int(self.utc.get().replace('UTC', ''))
			self.root.title(' '.join([str(int(time()) - now - utc_unit * 60 * 60), 'sec delta', 'Explorer SteemMonsters']))
			
			### unit_opponent_label ###
			player = self.unit.get()
			#self.fm.players["player"] = player
			
			opponent_player = self.fm.players[player].get("opponent_player", None)
			if opponent_player:
				self.unit_opponent_label["text"] = opponent_player
				try:
					bg = self.color_opponent_hide if self.fm.players[player]["submit_hashed_team"] else self.color_opponent_not_hide
				except:
					### point for error
					bg = 'black'
					##pprint(self.fm.players)
					
				self.unit_opponent_label["bg"] = bg
			else:
				self.unit_opponent_label["text"] = ''
				self.unit_opponent_label["bg"] = 'white'

			### team_opponent ###
			opponent_team = self.fm.players[player].get("team", None)
			r = 25
			x = 100
			y = int(x * 420 / 300)
			
			if opponent_team:
				if opponent_team == 'hash':
					hidden = 'HIDDEN'
					for n in range(len(list(hidden))):
						self.team_opponent[n] = {	"image": Label(self.unit_opponent_frame), 
													"level": Label(self.unit_opponent_frame, text = hidden[n], font = 'Arial 40'),}
						self.team_opponent[n]["image"].place(x = 0 + n * x, y = 0, width = x, height = y)										
						self.team_opponent[n]["level"].place(x = 0 + n * x, y = 0, width = x, height = y)												
						
				else:
					for n in range(len(opponent_team)):
						name, level = opponent_team[n].split(':')
						
						self.team_opponent[n] = {	"image": Label(self.unit_opponent_frame, image = self.sm.card_photos[name]),
													"level": Label(self.unit_opponent_frame, text = level, font = 'Arial 18'),}
						self.team_opponent[n]["image"].place(x = 0 + n * x, y = 0, width = x, height = y)										
						self.team_opponent[n]["level"].place(x = 50 - 0.5 * r + n * x, y = 140 - r - 5, width = 25, height = 25)												
						
				sleep(self.sleep_team_opponent)
				
				# kill widgets
				for n in range(len(self.team_opponent)):
					self.team_opponent[n]["image"].destroy()												
					self.team_opponent[n]["level"].destroy()												
					self.team_opponent.pop(n)
					#self.team_opponent = {}
					#print('kill')

			sleep(self.scan_sleep)
			
		self.fm.stop()
			
			
	##### ##### ##### ##### #####

	def cmd_button_start(self):
	
		self.fm.node = self.node.get()

		self.button_start["state"] = DISABLED
		self.button_stop["state"] = NORMAL
		self.node_entry["state"] = DISABLED
		for liga in self.liga_radiobuttons:
			self.liga_radiobuttons[liga]["state"] = DISABLED
			
		self.flag = True
		sm_thread = Thread(target = self.scan, daemon = True)
		sm_thread.start()
		print(self.liga_var.get())
		self.fm.run(self.liga_var.get())
		
		
	def cmd_button_stop(self):
		self.button_start["state"] = NORMAL
		self.button_stop["state"] = DISABLED
		self.node_entry["state"] = NORMAL
		for liga in self.liga_radiobuttons:
			self.liga_radiobuttons[liga]["state"] = NORMAL
		print('end work')
		self.flag = False
			
		
	def load_liga(self):
		
		self.liga_var = StringVar()
		self.liga_var.set('chemp')
		self.liga_radiobuttons = {}
		
		menu_liga = [ ['Diamond+Champion', 'chemp'], ['Gold', 'gold'], ['Silver', 'silver'], ['Bronze', 'bronze'] ]
		liga_frame = LabelFrame(self.root, width = 200, height = 250, text = 'Your League')	#, bg = "green"
		n = 0
		for text, liga in menu_liga:
			self.liga_radiobuttons[liga] = Radiobutton(liga_frame, text = text, variable = self.liga_var, value = liga)
			self.liga_radiobuttons[liga].place(x = 0, y = n * 25)
			n += 1
		
		self.button_start = Button(liga_frame, text = 'Start', width = 10, command = self.cmd_button_start)
		self.button_start.place(x = 5, y = 100)
		self.button_stop = Button(liga_frame, text = 'Stop', width = 10, state = DISABLED, command = self.cmd_button_stop)
		self.button_stop.place(x = 100, y = 100)
		
		self.pool_label = Label(liga_frame, justify = LEFT, anchor = 'nw', bg = "red")
		self.pool_label.place(x = 5, y = 130, width = 185, height = 95)
		
		liga_frame.place(x = 0, y = 0)
		

	def load_find_match(self):
		find_match_frame = LabelFrame(self.root, width = 250, height = 250, text = 'Find Match')	#
		self.find_match_label = Label(find_match_frame, justify = LEFT, anchor = 'nw')	#, bg = "green"
		self.find_match_label.place(x = 5, y = 0, width = 235, height = 225)
		find_match_frame.place(x = 200, y = 0)
		
		
	def load_vs(self):
		vs_frame = LabelFrame(self.root, width = 250, height = 250, text = 'Battles')	#, bg = "green"
		self.vs_label = Label(vs_frame, justify = LEFT, anchor = 'nw')					#, bg = "green"
		self.vs_label.place(x = 5, y = 0, width = 235, height = 225)
		vs_frame.place(x = 450, y = 0)
		
		
	def load_unit(self):
		unit_frame = LabelFrame(self.root, width = 700, height = 200, text = 'Your VS Opponent')	#, bg = "green"
		
		#self.unit_entry = Entry(unit_frame, width = 200)
		#self.unit_entry.place(x = 5, y = 0, width = 185, height = 25)
		self.unit = StringVar(value = self.fm.accounts_list[0])
		self.unit_entry = OptionMenu(unit_frame, self.unit, *self.fm.accounts_list)
		self.unit_entry.place(x = 5, y = 0, width = 150, height = 25)
		
		#self.unit_vs_label = Label(unit_frame, text = 'VS')
		#self.unit_vs_label.place(x = 150, y = 0, width = 150, height = 25)
		
		self.utc = StringVar(value = 'UTC+3')
		utc_list = ['UTC' + str(n) for n in range(-12, 13)]
		self.utc_optionmenu = OptionMenu(unit_frame, self.utc, *utc_list)
		self.utc_optionmenu.place(x = 155, y = 0, width = 100, height = 25)
		
		self.node = StringVar(value = self.fm.nodes_list[0])
		self.node_entry = OptionMenu(unit_frame, self.node, *self.fm.nodes_list)
		self.node_entry.place(x = 255, y = 0, width = 190, height = 25)
		
		self.unit_opponent_label = Label(unit_frame, justify = LEFT, anchor = 'nw', bg = "white")		#
		self.unit_opponent_label.place(x = 455, y = 0, width = 235, height = 25)
		
		self.unit_opponent_frame = Frame(unit_frame, width = 695, height = 145)
		self.unit_opponent_frame.place(x = 0, y = 35)
		
		unit_frame.place(x = 0, y = 250)