Libraries refactor and add some sinks #4

Closed
m wants to merge 136 commits from library-refactor into master
2 changed files with 59 additions and 3 deletions
Showing only changes of commit e15cec7afe - Show all commits

View File

@ -18,6 +18,8 @@ from settings import settings
log = Logger("agora.global")
# TODO: move to utils
def handle_exceptions(func):
def inner_function(*args, **kwargs):
@ -594,6 +596,7 @@ class Agora(object):
ad = self.agora.ad_create(**form)
return ad
# TODO: move to markets
def create_distribution_list(self, filter_asset=None):
"""
Create a list for distribution of ads.

View File

@ -24,6 +24,7 @@ class Transactions(object):
"""
self.log = Logger("transactions")
# TODO: write tests then refactor, this is terribly complicated!
def transaction(self, data):
"""
Store details of transaction and post notifications to IRC.
@ -284,6 +285,7 @@ class Transactions(object):
"""
refs = self.get_refs()
matching_refs = []
# TODO: use get_ref_map in this function instead of calling get_ref multiple times
for ref in refs:
stored_trade = self.get_ref(ref)
if stored_trade["currency"] == currency and float(stored_trade["amount"]) == float(amount):
@ -320,9 +322,11 @@ class Transactions(object):
def get_ref(self, reference):
"""
Get a reference ID for a single trade.
:return: trade ID
:rtype: string
Get the trade information for a reference.
:param reference: trade reference
:type reference: string
:return: dict of trade information
:rtype: dict
"""
ref_data = r.hgetall(f"trade.{reference}")
ref_data = convert(ref_data)
@ -333,12 +337,20 @@ class Transactions(object):
def del_ref(self, reference):
"""
Delete a given reference from the Redis database.
:param reference: trade reference to delete
:type reference: string
"""
tx = self.ref_to_tx(reference)
r.delete(f"trade.{reference}")
r.delete(f"trade.{tx}.reference")
def cleanup(self, references):
"""
Reconcile the internal reference database with a given list of references.
Delete all internal references not present in the list and clean up artifacts.
:param references: list of references to reconcile against
:type references: list
"""
for tx, reference in self.get_ref_map().items():
if reference not in references:
self.log.info("Archiving trade reference: {reference} / TX: {tx}", reference=reference, tx=tx)
@ -346,6 +358,13 @@ class Transactions(object):
r.rename(f"trade.{reference}", f"archive.trade.{reference}")
def tx_to_ref(self, tx):
"""
Convert a trade ID to a reference.
:param tx: trade ID
:type tx: string
:return: reference
:rtype: string
"""
refs = self.get_refs()
for reference in refs:
ref_data = convert(r.hgetall(f"trade.{reference}"))
@ -355,12 +374,24 @@ class Transactions(object):
return reference
def ref_to_tx(self, reference):
"""
Convert a reference to a trade ID.
:param reference: trade reference
:type reference: string
:return: trade ID
:rtype: string
"""
ref_data = convert(r.hgetall(f"trade.{reference}"))
if not ref_data:
return False
return ref_data["id"]
def get_total_usd(self):
"""
Get total USD in all our accounts, bank and trading.
:return: value in USD
:rtype float:
"""
total_usd_revolut = self.revolut.get_total_usd()
if total_usd_revolut is False:
return False
@ -389,7 +420,14 @@ class Transactions(object):
total_usd = total_usd_agora + total_usd_revolut
return total_usd
# TODO: possibly refactor this into smaller functions which don't return as much stuff
# check if this is all really needed in the corresponding withdraw function
def get_total(self):
"""
Get all the values corresponding to the amount of money we hold.
:return: ((total SEK, total USD, total GBP), (total XMR USD, total BTC USD), (total XMR, total BTC))
:rtype: tuple(tuple(float, float, float), tuple(float, float), tuple(float, float))
"""
total_usd_revolut = self.revolut.get_total_usd()
if total_usd_revolut is False:
self.log.error("Could not get USD total.")
@ -433,6 +471,11 @@ class Transactions(object):
) # Total XMR and BTC balance in Agora
def get_remaining(self):
"""
Check how much profit we need to make in order to withdraw.
:return: profit remaining in USD
:rtype: float
"""
total_usd = self.get_total_usd()
if not total_usd:
return False
@ -443,6 +486,11 @@ class Transactions(object):
return remaining
def get_open_trades_usd(self):
"""
Get total value of open trades in USD.
:return: total trade value
:rtype: float
"""
dash = self.agora.wrap_dashboard()
if dash is False:
return False
@ -463,6 +511,11 @@ class Transactions(object):
return cumul_usd
def get_total_remaining(self):
"""
Check how much profit we need to make in order to withdraw, taking into account open trade value.
:return: profit remaining in USD
:rtype: float
"""
total_usd = self.get_total_usd()
total_trades_usd = self.get_open_trades_usd()
if not total_usd: