#!/usr/bin/python3
import argparse
import hashlib
import hmac
import json
import requests
import os
import sys
# import csv
import socket
import time
import threading
import atexit
import signal
# import selectors
# from tempfile import TemporaryFile
from abc import ABCMeta, abstractmethod
from io import TextIOWrapper, BytesIO
# import subprocess
from _thread import *
import threading
sys.path.insert(0, "/home/bloodstalker/extra/seer/")
shut_up = sys.stdout
seriously = sys.stderr
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
sys.stderr = TextIOWrapper(BytesIO(), sys.stdout.encoding)
# from seer import launch_ais
sys.stdout = shut_up
sys.stderr = seriously
api_url_base = "https://api.coinmarketcap.com/v1/ticker/"
assets_file = "/home/bloodstalker/scripts/assets.json"
api_url_base_shapeshift = "https://shapeshift.io/getcoins"
test_url = "https://api.coinmarketcap.com/v1/ticker/?start=0&limit=300"
cryptocompare_price_url = "https://min-api.cryptocompare.com/data/price?"
# argument parser calls sys.exit() on exception, we don't want that.
class ArgumentParseError(Exception):
pass
class ArgumentParserWithoutExit(argparse.ArgumentParser):
def error(self, message):
raise ArgumentParseError(message)
class Argparser(object):
def __init__(self):
self.parser = ArgumentParserWithoutExit()
self.parser.add_argument(
"--name", type=str, help="price of the chose crypto")
self.parser.add_argument(
"--worth", type=str, help="single asset worth")
self.parser.add_argument("--xx", type=str, nargs=2, help="convert")
self.parser.add_argument("--xxv", type=float, help="xx multiplier")
self.parser.add_argument(
"--gen", type=str, nargs=2, help="general option")
self.parser.add_argument("--cap", type=str, help="market cap")
self.parser.add_argument("--rank", type=str, help="market cap rank")
self.parser.add_argument(
"--total", action="store_true", help="total", default=False)
self.parser.add_argument(
"--ava", type=str, help="is currency available on changelly")
self.parser.add_argument(
"--avass", type=str, help="is currency available on shapeshift")
self.parser.add_argument("--cglistall", action="store_true",
help="list all currencies available on changelly", default=False)
self.parser.add_argument(
"--test", action="store_true", help="test switch", default=False)
self.parser.add_argument(
"--watchlist", type=str, nargs="+", help="watch list")
self.parser.add_argument(
"--ss", type=str, nargs="+", help="watchlist on shapeshift")
self.parser.add_argument("--dy", type=int, help="lazy")
self.parser.add_argument(
"--demon", action="store_true", help="daemon mode", default=False)
self.parser.add_argument(
"--al1", action="store_true", help="alert1", default=False)
self.parser.add_argument(
"--al2", action="store_true", help="alert2", default=False)
self.parser.add_argument(
"--al3", action="store_true", help="alert3", default=False)
self.parser.add_argument(
"--al4", action="store_true", help="alert4", default=False)
self.parser.add_argument(
"--al5", action="store_true", help="alert5", default=False)
self.parser.add_argument(
"--dbg", action="store_true", help="debug", default=False)
self.parser.add_argument(
"--alive", action="store_true", help="is hived up", default=False)
self.parser.add_argument(
"--tg", action="store_true", help="tg", default=False)
self.parser.add_argument(
"--mahsaread", action="store_true", help="mark as read", default=False)
self.parser.add_argument(
"--ai", action="store_true", help="which ai to launch", default=False)
def parse(self, argv):
self.args, self.rest = self.parser.parse_known_args(argv)
class Colors:
purple = '\033[95m'
blue = '\033[94m'
green = '\033[92m'
yellow = '\033[93m'
red = '\033[91m'
grey = '\033[1;37m'
darkgrey = '\033[1;30m'
cyan = '\033[1;36m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
def get_info_w_name(api_url, name):
cc_key = json.load(
open("/home/bloodstalker/scripts/cryptocompare_key.json"))["key"]
#response = requests.get(cryptocompare_price_url + "fsym=" + name + "&" + "tsyms=USD&" + "api_key=" + cc_key)
response = requests.get(cryptocompare_price_url +
"fsym=" + name + "&" + "tsyms=USD&")
if response.status_code == 200:
return json.loads(response.content.decode('utf-8'))
else:
return None
def changelly():
API_URL = 'https://api.changelly.com'
API_KEY = '1a17d70c8b624a398c3ec1e4dbffbaa5'
API_SECRET = json.load(
open("/home/bloodstalker/scripts/changelly_api_secret.json"))["key"]
message = {
'jsonrpc': '2.0',
'id': 1,
'method': 'getCurrencies',
'params': []
}
serialized_data = json.dumps(message)
sign = hmac.new(API_SECRET.encode('utf-8'),
serialized_data.encode('utf-8'), hashlib.sha512).hexdigest()
headers = {'api-key': API_KEY, 'sign': sign,
'Content-type': 'application/json'}
response = requests.post(API_URL, headers=headers, data=serialized_data)
if response.status_code == 200:
return (response.json()['result'])
else:
return None
def vocalize(sound):
# for whatever weird reason this causes a hang
# subprocess.call([os.path.expanduser("~")+"/scripts/voice.sh", sound])
pass
def trim(num, dig):
from math import log10, floor, ceil
power = ceil(log10(num))
power = dig - power
result = int(num * pow(10, power))
count = ceil(log10(result))
digits = list(str(result))
if power > ceil(log10(num)):
for i in range(0, abs(power)-count):
digits.insert(0, "0")
digits.insert(ceil(log10(num)) if log10(num) > 0 else 0, ".")
elif power < 0:
for i in range(0, abs(power)):
digits.insert(len(digits), "0")
else:
digits.insert(-abs(power) + count, ".")
return("".join(digits))
def highpercentdump(number):
dic_7d = {}
dic_7d_sorted = {}
list_7d_key = []
list_7d_value = []
dic_24h = {}
dic_24h_sorted = {}
list_24h_key = []
list_24h_value = []
dic_1h = {}
dic_1h_sorted = {}
list_1h_key = []
list_1h_value = []
res = get_info_w_name(test_url, "")
for i in range(0, 300):
price = res[i]["percent_change_7d"]
if price == None:
price = 0
dic_7d[res[i]["name"]] = float(price)
for key, value in sorted(dic_7d.items(), key=lambda kv: (kv[1], kv[0])):
dic_7d_sorted[key] = value
for k, v in dic_7d_sorted.items():
list_7d_key.append(k)
list_7d_value.append(v)
for i in range(0, 300):
price = res[i]["percent_change_24h"]
if price == None:
price = 0
dic_24h[res[i]["name"]] = float(price)
for key, value in sorted(dic_24h.items(), key=lambda kv: (kv[1], kv[0])):
dic_24h_sorted[key] = value
for k, v in dic_24h_sorted.items():
list_24h_key.append(k)
list_24h_value.append(v)
for i in range(0, 300):
price = res[i]["percent_change_1h"]
if price == None:
price = 0
dic_1h[res[i]["name"]] = float(price)
for key, value in sorted(dic_1h.items(), key=lambda kv: (kv[1], kv[0])):
dic_1h_sorted[key] = value
for k, v in dic_1h_sorted.items():
list_1h_key.append(k)
list_1h_value.append(v)
col_width_1 = max(len(word) for word in list_7d_key) + \
max(len(repr(word)) for word in list_7d_value) + 2
col_width_2 = max(len(word) for word in list_7d_key) + \
max(len(repr(word)) for word in list_7d_value) + 2
col_width_3 = max(len(word) for word in list_7d_key) + \
max(len(repr(word)) for word in list_7d_value) + 2
col_width = max(col_width_1, col_width_2, col_width_3, 40)
print(("\t" + Colors.green + Colors.BOLD +
"7d:").ljust(col_width + 10), end="")
print("24h:".ljust(col_width), end="")
print(("1h:" + Colors.ENDC).ljust(col_width))
for i in range(300-number, 300):
print((Colors.red + Colors.BOLD + repr(300-i) +
Colors.ENDC).ljust(21), end="")
print((Colors.blue+list_7d_key[i]+Colors.ENDC+":"+Colors.cyan+Colors.BOLD+repr(
list_7d_value[i])+Colors.ENDC).ljust(col_width + 24), end="")
print((Colors.blue+list_24h_key[i]+Colors.ENDC+":"+Colors.cyan+Colors.BOLD+repr(
list_24h_value[i])+Colors.ENDC).ljust(col_width+24), end="")
print((Colors.blue+list_1h_key[i]+Colors.ENDC+":"+Colors.cyan +
Colors.BOLD+repr(list_1h_value[i])+Colors.ENDC).ljust(col_width))
print()
for i in range(number, -1, -1):
print((Colors.red + Colors.BOLD + repr(300-i) +
Colors.ENDC).ljust(21), end="")
print((Colors.blue+list_7d_key[i]+Colors.ENDC+":"+Colors.cyan+Colors.BOLD+repr(
list_7d_value[i])+Colors.ENDC).ljust(col_width + 24), end="")
print((Colors.blue+list_24h_key[i]+Colors.ENDC+":"+Colors.cyan+Colors.BOLD+repr(
list_24h_value[i])+Colors.ENDC).ljust(col_width+24), end="")
print((Colors.blue+list_1h_key[i]+Colors.ENDC+":"+Colors.cyan +
Colors.BOLD+repr(list_1h_value[i])+Colors.ENDC).ljust(col_width))
one = []
one.append("7d:\n\n")
for i in range(299, 300-number, -1):
one.append(repr(list_7d_key[i]))
one.append("\t")
one.append(repr(list_7d_value[i]))
one.append("\n")
for i in range(number, -1, -1):
one.append(repr(list_7d_key[i]))
one.append("\t")
one.append(repr(list_7d_value[i]))
one.append("\n")
one.append("\n\n24h:\n\n")
for i in range(299, 300-number, -1):
one.append(repr(list_24h_key[i]))
one.append("\t")
one.append(repr(list_24h_value[i]))
one.append("\n")
for i in range(number, -1, -1):
one.append(repr(list_24h_key[i]))
one.append("\t")
one.append(repr(list_24h_value[i]))
one.append("\n")
one.append("\n\n1h:\n\n")
for i in range(299, 300-number, -1):
one.append(repr(list_1h_key[i]))
one.append("\t")
one.append(repr(list_1h_value[i]))
one.append("\n")
for i in range(number, -1, -1):
one.append(repr(list_1h_key[i]))
one.append("\t")
one.append(repr(list_1h_value[i]))
one.append("\n")
return one
class Void_Spawner(object):
__metalclass__ = ABCMeta
def __init__(self):
thread = threading.Thread(target=self.run, args=())
thread.daemon = True
thread.start()
@abstractmethod
def run(self):
pass
class V_Spawn_cnn(Void_Spawner):
def run(self):
launch_ais("cnn_type_1")
class V_Spawn_ltsm(Void_Spawner):
def run(self):
launch_ais("ltsm_type_2")
class V_Spawn_marionette(Void_Spawner):
def run(self):
launch_ais("marionette_type_1")
class Demon_Father:
__metalclass__ = ABCMeta
def __init__(self, pidfile):
self.pidfile = pidfile
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server_address = ('localhost', 10111)
def demonize(self):
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError as err:
sys.stderr.write('fork #1 failed: {0}\n'.format(err))
sys.exit(1)
os.chdir('/')
os.setsid()
os.umask(0)
try:
pid = os.fork()
if pid > 0:
sys.exit(0)
except OSError as err:
sys.stderr.write('fork #2 failed: {0}\n'.format(err))
sys.exit(1)
sys.stdout.flush()
sys.stderr.flush()
si = open(os.devnull, 'r')
so = open(os.devnull, 'a+')
se = open(os.devnull, 'a+')
os.dup2(si.fileno(), sys.stdin.fileno())
os.dup2(so.fileno(), sys.stdout.fileno())
os.dup2(se.fileno(), sys.stderr.fileno())
atexit.register(self.delpid)
pid = str(os.getpid())
with open(self.pidfile, 'w+') as f:
f.write(pid + '\n')
def delpid(self):
self.pidfile.close()
os.remove(self.pidfile)
def start(self):
try:
with open(self.pidfile, 'r') as pf:
pid = int(pf.read().strip())
except IOError:
pid = None
'''
if pid:
message = "pidfile {0} already exist. " + "Daemon already running?\n"
sys.stderr.write(message.format(self.pidfile))
sys.exit(1)
'''
self.demonize()
self.run()
def stop(self):
try:
with open(self.pidfile, 'r') as pf:
pid = int(pf.read().strip())
except IOError:
pid = None
if not pid:
message = "pidfile {0} does not exist. " + "Daemon not running?\n"
sys.stderr.write(message.format(self.pidfile))
return
try:
while 1:
os.kill(pid, signal.SIGTERM)
time.sleep(0.1)
except OSError as err:
e = str(err.args)
if e.find("No such process") > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
else:
print(str(err.args))
sys.exit(1)
def restart(self):
self.stop()
self.start()
@abstractmethod
def run(self):
pass
class Demon(Demon_Father):
def __init__(self, argparser, pidfile):
self.pidfile = pidfile
self.connection = []
self.client_address = []
self.argparser = argparser
def run(self):
premain(self.argparser)
def networth():
net = float()
assets = json.load(open(assets_file))
for asset in assets:
price = get_info_w_name(api_url_base, asset)["USD"]
net += assets[asset] * float(price)
return int(net)
def alert_1():
res1 = get_info_w_name(api_url_base, "doge")["USD"]
res2 = get_info_w_name(api_url_base, "eth")["USD"]
value = 600000
print("%.2f" % (value*float(res1)/float(res2)))
if value*float(res1)/float(res2) < 2:
vocalize("./mila/alert_1.ogg")
def alert_2():
res1 = get_info_w_name(api_url_base, "gnt")["USD"]
res2 = get_info_w_name(api_url_base, "eth")["USD"]
value = 1765
print("%.2f" % (value*float(res1)/float(res2)))
if value*float(res1)/float(res2) > 2:
vocalize("./mila/alert_2.ogg")
def alert_3():
res1 = get_info_w_name(api_url_base, "ant")["USD"]
res2 = get_info_w_name(api_url_base, "eth")["USD"]
value = 196
print("%.2f" % (value*float(res1)/float(res2)))
if value*float(res1)/float(res2) > 2:
vocalize("./mila/alert_3.ogg")
def alert_4():
res1 = get_info_w_name(api_url_base, "sc")["USD"]
res2 = get_info_w_name(api_url_base, "eth")["USD"]
value = 35695
print("%.2f" % (value*float(res1)/float(res2)))
if value*float(res1)/float(res2) > 2:
vocalize("./mila/alert_4.ogg")
def alert_5():
res1 = get_info_w_name(api_url_base, "bat")["USD"]
res2 = get_info_w_name(api_url_base, "eth")["USD"]
value = 4013
print("%.2f" % (value*float(res1)/float(res2)))
if value*float(res1)/float(res2) > 2:
vocalize("./mila/alert_4.ogg")
def highpercentdump_bot():
return highpercentdump(22)
def com_name(name):
res = get_info_w_name(api_url_base, name)
if res is not None:
print(trim(float(res['USD']), 4))
def com_cap(name):
res = get_info_w_name(api_url_base, name)
if res is not None:
print(res[0]['market_cap_usd'])
def com_rank(name):
res = get_info_w_name(api_url_base, name)
if res is not None:
print(res[0]['rank'])
def com_gen(argparser):
name = argparser.args.gen[0]
cat = argparser.args.gen[1]
res = get_info_w_name(api_url_base, name)
if res is not None:
print(res[0][cat])
def com_worth(argparser):
net = float()
assets = json.load(open(assets_file))
for asset in assets:
if asset == argparser.args.worth:
price = get_info_w_name(api_url_base, asset)["USD"]
net = assets[asset] * float(price)
print(int(net))
break
def com_total(argparser):
net = float()
assets = json.load(open(assets_file))
for asset in assets:
price = get_info_w_name(api_url_base, asset)["USD"]
net += assets[asset] * float(price)
print("{:,}".format(int(net)))
def com_xx(argparser):
value = 1.0
name1 = argparser.args.xx[0]
name2 = argparser.args.xx[1]
res1 = get_info_w_name(api_url_base, name1)["USD"]
res2 = get_info_w_name(api_url_base, name2)["USD"]
if argparser.args.xxv:
value = argparser.args.xxv
print(value*float(res1)/float(res2))
def com_ava(argparser):
currencies = changelly()
if currencies is not None:
for currency in currencies:
if currency == argparser.args.ava:
print("YES")
return
print("NO")
def com_avass(argparser):
currencies = get_info_w_name(api_url_base_shapeshift, "")
for currency in currencies:
if currency.lower() == argparser.args.avass:
print("YES")
return
print("NO")
def com_cglistall(argparser):
currencies = changelly()
if currencies is not None:
for currency in currencies:
print(currency + " ", end="")
print()
def com_watchlist(argparser):
ret = []
currencies = changelly()
if currencies is not None:
for currency in currencies:
for item in argparser.args.watchlist:
if currency == item:
ret.append(item)
for item in ret:
print(item.upper() + " ", end="")
print()
def com_ss(argparser):
ret = []
result = get_info_w_name(api_url_base_shapeshift, "")
if not result:
return
for currency in result:
for item in argparser.args.ss:
if currency.lower() == item and result[currency]['status'] == "available":
ret.append(item)
for item in ret:
print(item.upper() + " ", end="")
print()
def alive():
print("hived")
def get_socket():
# use TCP
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ("", 10111)
sock.bind(server_address)
return sock
def premain(argparser):
try:
sock = get_socket()
sock.listen(15)
vocalize("./mila/hiveup.ogg")
while True:
connection, client_address = sock.accept()
command = connection.recv(4096)
new_argv = command.decode("utf-8").split(" ")
print(new_argv)
argparser.parse(new_argv)
old_stdout = sys.stdout
sys.stdout = TextIOWrapper(BytesIO(), sys.stdout.encoding)
if argparser.args.name:
com_name(argparser.args.name)
if argparser.args.cap:
com_cap(argparser.args.cap)
if argparser.args.rank:
com_rank(argparser.args.rank)
if argparser.args.gen:
com_gen(argparser)
if argparser.args.worth:
com_worth(argparser)
if argparser.args.total:
com_total(argparser)
if argparser.args.xx:
com_xx(argparser)
if argparser.args.ava:
com_ava(argparser)
if argparser.args.al1:
alert_1()
if argparser.args.al2:
alert_2()
if argparser.args.al3:
alert_3()
if argparser.args.al4:
alert_4()
if argparser.args.al5:
alert_5()
if argparser.args.avass:
com_avass(argparser)
if argparser.args.cglistall:
com_cglistall(argparser)
if argparser.args.watchlist:
com_watchlist(argparser)
if argparser.args.ss:
com_ss(argparser)
if argparser.args.dy:
highpercentdump(argparser.args.dy)
if argparser.args.alive:
alive()
sys.stdout.seek(0)
mushi_out = sys.stdout.read()
sys.stdout.close()
connection.sendall(bytes(mushi_out, "utf-8"))
sys.stdout = old_stdout
print(mushi_out)
except Exception as e:
vocalize("./mila/hiveexcept.ogg")
if hasattr(e, "message"):
print(e.messasge)
if hasattr(e, "__doc__"):
print(e.__doc__)
finally:
# vocalize("./mila/hivedown.ogg")
# sock.shutdown(socket.SHUT_RDWR)
# connection.shutdown(socket.SHUT_RDWR)
# sock.close()
# connection.close()
time.sleep(60)
def main():
argparser = Argparser()
sys.argv.pop(0)
argparser.parse(sys.argv)
if argparser.args.dbg:
try:
premain(argparser)
except:
variables = globals().copy()
variables.update(locals())
shell = code.InteractiveConsole(variables)
shell.interact(banner="DEBUG REPL")
else:
premain(argparser)
if __name__ == "__main__":
main()