2020-03-09 15:38:23 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
from urllib.request import urlopen, Request
|
|
|
|
from dotenv import load_dotenv
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
import urllib, json, os, traceback, discord, sys
|
|
|
|
|
|
|
|
# sc_precision is the number of hastings per siacoin
|
|
|
|
sc_precision = 10 ** 24
|
|
|
|
|
|
|
|
channel_name = "skynet-portal-health-check"
|
|
|
|
|
|
|
|
# Environment variable globals
|
|
|
|
api_endpoint, port, portal_name, bot_token, password = None, None, None, None, None
|
|
|
|
discord_client = None
|
|
|
|
setup_done = False
|
|
|
|
|
|
|
|
def setup():
|
|
|
|
# Load dotenv file if possible.
|
|
|
|
if len(sys.argv) > 1:
|
|
|
|
env_path = Path(sys.argv[1])
|
|
|
|
load_dotenv(dotenv_path=env_path, override=True)
|
|
|
|
|
|
|
|
global bot_token
|
|
|
|
bot_token = os.environ["DISCORD_BOT_TOKEN"]
|
|
|
|
|
|
|
|
global portal_name
|
|
|
|
portal_name = os.getenv("PORTAL_NAME")
|
|
|
|
|
|
|
|
# Get a port or use default
|
|
|
|
global port
|
|
|
|
port = os.getenv("API_PORT")
|
|
|
|
if not port:
|
|
|
|
port = "9980"
|
|
|
|
|
|
|
|
global api_endpoint
|
|
|
|
api_endpoint = "http://localhost:{}".format(port)
|
|
|
|
|
|
|
|
siad.initialize()
|
|
|
|
|
|
|
|
global setup_done
|
|
|
|
setup_done = True
|
|
|
|
|
|
|
|
return bot_token
|
|
|
|
|
|
|
|
# send_msg sends the msg to the specified discord channel. If force_notify is set to true it adds "@here".
|
2020-03-09 18:54:41 +00:00
|
|
|
async def send_msg(client, msg, force_notify=False, file=None):
|
2020-03-09 15:38:23 +00:00
|
|
|
await client.wait_until_ready()
|
|
|
|
|
|
|
|
guild = client.guilds[0]
|
|
|
|
channels = guild.channels
|
|
|
|
|
|
|
|
chan = None
|
|
|
|
for c in channels:
|
|
|
|
if c.name == channel_name:
|
|
|
|
chan = c
|
|
|
|
|
|
|
|
if chan is None:
|
|
|
|
print("Can't find channel {}".format(channel_name))
|
|
|
|
|
|
|
|
# Add the portal name.
|
|
|
|
msg = "`{}`: {}".format(portal_name, msg)
|
|
|
|
|
|
|
|
if force_notify:
|
|
|
|
msg = "@here: \n{}".format(msg)
|
2020-03-09 18:54:41 +00:00
|
|
|
await chan.send(msg, file=file)
|
2020-03-09 15:38:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
#siad class provides wrappers for the necessary siad commands.
|
|
|
|
class siad:
|
|
|
|
# initializes values for using the API (password and
|
|
|
|
# user-agent) so that all calls to urllib.request.urlopen have these set.
|
|
|
|
@staticmethod
|
|
|
|
def initialize():
|
|
|
|
# Setup a handler with the API password
|
|
|
|
username = ""
|
|
|
|
password_mgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
|
|
|
|
password_mgr.add_password(None, api_endpoint, username, siad.get_password())
|
|
|
|
handler = urllib.request.HTTPBasicAuthHandler(password_mgr)
|
|
|
|
|
|
|
|
# Setup an opener with the correct user agent
|
|
|
|
opener = urllib.request.build_opener(handler)
|
|
|
|
opener.addheaders = [('User-agent', 'Sia-Agent')]
|
|
|
|
|
|
|
|
# Install the opener.
|
|
|
|
# Now all calls to urllib.request.urlopen use our opener.
|
|
|
|
urllib.request.install_opener(opener)
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_password():
|
|
|
|
# Get a port or use default
|
|
|
|
password = os.getenv("SIA_API_PASSWORD")
|
|
|
|
if not password:
|
|
|
|
home = os.getenv("HOME")
|
|
|
|
password_file = open(home+"/.sia/apipassword")
|
|
|
|
password = password_file.readlines()[0].strip()
|
|
|
|
return password
|
|
|
|
|
|
|
|
# load_json reads the http response and decodes the JSON value
|
|
|
|
@staticmethod
|
|
|
|
def load_json(resp):
|
|
|
|
return json.loads(resp.decode("utf-8"))
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_wallet():
|
|
|
|
if not setup_done: setup()
|
|
|
|
|
|
|
|
resp = urllib.request.urlopen(api_endpoint + "/wallet").read()
|
|
|
|
return siad.load_json(resp)
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_renter():
|
|
|
|
if not setup_done: setup()
|
|
|
|
|
|
|
|
resp = urllib.request.urlopen(api_endpoint + "/renter").read()
|
|
|
|
return siad.load_json(resp)
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def get_renter_contracts():
|
|
|
|
if not setup_done: setup()
|
|
|
|
|
|
|
|
resp = urllib.request.urlopen(api_endpoint + "/renter/contracts").read()
|
|
|
|
return siad.load_json(resp)
|