Receive a desktop notification when a steemmonster opponent is matched
steemmonsteres·@holger80·
0.000 HBDReceive a desktop notification when a steemmonster opponent is matched
Waiting at the seeking enemy screen of steemmonsters is quite boring, and when I get distracted, I will lose due to timeout...  ## Installation You need beem: ``` pip install beem ``` For windows: ``` pip install win10toast ``` and for mac: ``` pip install pync ``` It should work out of the box for linux (notify-send must be available). Store the following script as `sm_opponent_ready.py`: ``` from beem.blockchain import Blockchain from beem.nodelist import NodeList from beem.account import Account import requests from beem import Steem import json import os import platform import subprocess from time import sleep import argparse app_name = 'sm-notifier' is_mac = platform.system().lower() == 'darwin' is_win = platform.system().lower() == 'windows' if is_mac: from pync import notify as mac_notify if is_win: from win10toast import ToastNotifier toaster = ToastNotifier() def notify(msg, link=None): """Platform agnostic notifier""" if is_mac: mac_notify("", title=msg, open=link) elif is_win: toaster.show_toast(app_name, msg) else: subprocess.run(['notify-send', app_name, msg]) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("account") args = parser.parse_args() account = args.account max_batch_size = 50 threading = False wss = False https = True normal = False appbase = True last_deck = {} nodes = NodeList() nodes.update_nodes() node_list = nodes.get_nodes(normal=normal, appbase=appbase, wss=wss, https=https) stm = Steem(node=node_list, num_retries=5, call_num_retries=3, timeout=15) b = Blockchain(steem_instance=stm, mode="head") acc = Account(account, steem_instance=stm) match_type = "Ranked" while True: found = False start_block_num = None for h in b.stream(opNames=["custom_json"], threading=threading, max_batch_size=max_batch_size): if start_block_num is None: start_block_num = h["block_num"] if h["id"] == 'sm_find_match': if json.loads(h['json'])["match_type"] == match_type and h["required_posting_auths"][0] == acc["name"]: found = True break trx_id = h['trx_id'] block_num = h["block_num"] notify("Transaction id found (%d - %s)" % (block_num, trx_id)) response = "" cnt2 = 0 trx_found = False while not trx_found and cnt2 < 90: response = requests.get("https://steemmonsters.com/transactions/lookup?trx_id=%s" % trx_id) if str(response) != '<Response [200]>': sleep(4) else: if 'error' in response.json() and "not found" in response.json()["error"]: sleep(1) elif 'error' in response.json(): trx_found = True elif "trx_info" in response.json() and response.json()["trx_info"]["success"]: trx_found = True else: sleep(2) cnt2 += 1 if 'error' in response.json(): print(response.json()["error"]) match_cnt = 0 match_found = False while not match_found and match_cnt < 180: match_cnt += 1 response = "" cnt2 = 0 trx_found = False while response == "" and cnt2 < 45: response = requests.get("https://steemmonsters.com/battle/status?id=%s" % trx_id) if str(response) != '<Response [200]>': sleep(4) response = "" if "status" in response.json() and response.json()["status"] > 0 and response.json()["status"] < 3: match_found = True submit_expiration_block_num = response.json()["submit_expiration_block_num"] opponent_player = response.json()["opponent_player"] ruleset = response.json()["ruleset"] mana_cap = response.json()["mana_cap"] else: sleep(2) if not match_found: notify("Timeout and no opponent found...") continue notify("Opponent found... %s" % opponent_player) match_cnt = 0 can_reveal = False error_occured = False while not can_reveal and match_cnt < 45 and not error_occured: match_cnt += 1 response = "" cnt2 = 0 trx_found = False while response == "" and cnt2 < 45: response = requests.get("https://steemmonsters.com/battle/status?id=%s" % trx_id) if str(response) != '<Response [200]>': sleep(4) response = "" current_block = b.get_current_block_num() submit_expiration_block_num = response.json()["submit_expiration_block_num"] status = response.json()["status"] if "opponent_team_hash" in response.json() and response.json()["opponent_team_hash"] is not None and response.json()["opponent_team_hash"] != "": can_reveal = True notify("Opponent submitted a team...") elif "team_hash" in response.json() and response.json()["team_hash"] is not None and response.json()["team_hash"] != "": sleep(4) else: if (submit_expiration_block_num - current_block) % 2 == 0: notify("%d blocks or %.2f seconds left..." % ((submit_expiration_block_num - current_block), (submit_expiration_block_num - current_block) * 3.)) sleep(4) if status > 2: error_occured = True if current_block > submit_expiration_block_num: error_occured = True ``` and run it with ``` python sm_opponent_ready.py holger80 ``` Replace holger80 with your account name. When python 3.x is installed, `pip` and `python` may be replayed by `pip3` and `python3`. You will now get a notification, when an opponent is found and you will be reminded when you did not select a team yet. The script scans new blocks for custom_json transaction with a `sm_find_match` id. When one is found, the `https://steemmonsters.com/battle/status?id=` API is asked if an opponent was matched. The API data are requested in a loop, until both opponents submitted a team. Please let me know if you find this script useful and If I can improve something on it.
👍 lukasmining, samlee2018, shahabudin, linkerstinker, upgoat, literaturkritik, wstanley226, cryptorunway, nurah, resheep, funanime, funkyfun, thefunfactory, robofox, changeangels, upcroak, bubbleburst, someonefun, funbox, funlands, funnyfun, goldrym, qeoddrir, dodrorth, dmonia, soundworks, eforucom, dfen, mbappe, curation.trail, ctime, flugschwein, accelerator, pataty69, jacekw.dev, samotonakatoshi, elviento, martusamak, joaorafael, micaelacf, duarte9sousa, munhenhos, bhaski, drorion, inespereira, crokkon, espoem, snafnornode, lauren432, suppdercaga, samanthaq, baisohicjo, trinityyrgk, nieloagranca, plasthaotyaglob, esiselac1980, alexandra5njs2, mops2e, taylory, jacekw, holger.random, pamahdoo, bitok.xyz, steemchoose, bluesniper, hamsa.quality, tony.montana, steemtank, ewkaw, ew-and-patterns, shammi, akifane, elleok, neokuduk, stevescoins, swedishdragon, thomasgift, isnochys, warfeed, arcange, ripperone, snwolak, steembasicincome, zcool, fullnodeupdate, reggaemuffin, badham, boontjie, freebornsociety, qurator, qurator-tier-1-2, raphaelle, qberry, yadamaniart, emdesan, unatalmaria, skycae, rach, thecryptodrive, glitterbooster, tbtek, kingnosa, quigua, theleapingkoala, abigail-dantes, twinner, kamikaze, feo, anfitriones, naturicia, samantha-w, cardumen, monoc, anthive, jesusj1, michaelizer, elohim4, perepilichnyy, alvinvoo, commonlaw, oliverschmid, ikarus56, teamsteem, verhp11, partiko, arsadulislam, jayna, nwjordan, redheadpei, marygourmet, hawk399, steempty, fminerten, mys, imperfect-one, mysia, kgakakillerg, cardboard, cfminer, tipu.curator, steem-plus, steem-ua, schabenstolz, timcliff, kaczynski, gideonkg, janse, germansailor,