# Other library imports from json import dumps class IRCCommands(object): class trades(object): name = "trades" authed = True helptext = "Get all open trades." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): """ Get details of open trades and post on IRC. """ # Send IRC - we don't want to automatically send messages on IRC, even though # this variable seems counter-intuitive here, we are doing something with the result # then calling msg() ourselves, and we don't want extra spam in the channel. trades = agora.dashboard(send_irc=False) if not trades: msg("No open trades.") return for trade_id in trades: msg(trade_id) class create(object): name = "create" authed = True helptext = "Create an ad. Usage: create " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): """ Post an ad on AgoraDesk with the given country and currency code. """ posted = agora.create_ad(spl[1], spl[2]) if posted["success"]: msg(f"{posted['response']['data']['message']}: {posted['response']['data']['ad_id']}") else: msg(dumps(posted["response"])) class messages(object): name = "messages" authed = True helptext = "Get messages. Usage: messages []" @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): """ Get all messages for all open trades or a given trade. """ if length == 1: messages = agora.get_recent_messages() if messages is False: msg("Error getting messages.") return if not messages: msg("No messages.") return for reference in messages: for message in messages[reference]: msg(f"{reference}: {message[0]} {message[1]}") msg("---") elif length == 2: tx = tx.ref_to_tx(spl[1]) if not tx: msg(f"No such reference: {spl[1]}") return messages = agora.get_messages(spl[1], send_irc=False) if not messages: msg("No messages.") for message in messages: msg(f"{spl[1]}: {message}") class dist(object): name = "dist" authed = True helptext = "Distribute all our chosen currency and country ad pairs." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): # Distribute out our ad to all countries in the config for x in agora.dist_countries(): if x["success"]: msg(f"{x['response']['data']['message']}: {x['response']['data']['ad_id']}") else: msg(x["response"]["data"]["message"]) class brute(object): name = "brute" authed = True helptext = "Use a bruteforce algorithm to create all possible currency and country pairs." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): for x in agora.dist_bruteforce(): if x["success"]: msg(f"{x['response']['data']['message']}: {x['response']['data']['ad_id']}") else: msg(dumps(x)) class fillblanks(object): name = "fillblanks" authed = True helptext = "Resume a run of brute by getting all our adverts then filling the blanks." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): for x in agora.bruteforce_fill_blanks(): if x["success"]: msg(f"{x['response']['data']['message']}: {x['response']['data']['ad_id']}") else: msg(dumps(x)) class stripdupes(object): name = "stripdupes" authed = True helptext = "Remove all duplicate adverts." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): rtrn = agora.strip_duplicate_ads() msg(dumps(rtrn)) class find(object): name = "find" authed = True helptext = "Find a transaction. Usage: find " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): """ Find a transaction received by Revolut with the given reference and amount. """ try: int(spl[2]) except ValueError: msg("Amount is not an integer.") rtrn = tx.find_tx(spl[1], spl[2]) if rtrn == "AMOUNT_INVALID": msg("Reference found but amount invalid.") elif not rtrn: msg("Reference not found.") else: return dumps(rtrn) class accounts(object): name = "accounts" authed = True helptext = "Get all account information from Revolut." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): accounts = revolut.accounts() accounts_posted = 0 if accounts is None: msg("Error getting accounts.") for account in accounts: if account["balance"] > 0: if "name" in account: name = account["name"] else: name = "not_set" msg(f"{name} {account['currency']}: {account['balance']}") accounts_posted += 1 if accounts_posted == 0: msg("No accounts with balances.") class total(object): name = "total" authed = True helptext = "Get total account balance from Revolut in USD." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): total_usd = revolut.get_total_usd() if total_usd is False: msg("Error getting total balance.") msg(f"Total: {round(total_usd, 2)}USD") class ping(object): name = "ping" authed = False helptext = "Pong!" @staticmethod def run(cmd, spl, length, authed, msg): msg("Pong!") class release_url(object): name = "release_url" authed = True helptext = "Get release URL for all open trades." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): trades = agora.dashboard_release_urls() if not trades: msg("No trades.") for trade in trades: msg(trade) class message(object): name = "msg" authed = True helptext = "Send a message on a trade. Usage: msg " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): if length > 2: full_msg = " ".join(spl[2:]) reference = tx.ref_to_tx(spl[1]) if not reference: msg(f"No such reference: {spl[1]}") return rtrn = agora.agora.contact_message_post(reference, full_msg) msg(f"Sent {full_msg} to {reference}: {rtrn}") class refs(object): name = "refs" authed = True helptext = "List all references" @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): msg(f"References: {', '.join(tx.get_refs())}") class ref(object): name = "ref" authed = True helptext = "Get more information about a reference. Usage: ref " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): if length == 2: ref_data = tx.get_ref(spl[1]) if not ref_data: msg(f"No such reference: {spl[1]}") return msg(f"{spl[1]}: {dumps(ref_data)}") class delete(object): name = "del" authed = True helptext = "Delete a reference. Usage: del " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): if length == 2: ref_data = tx.get_ref(spl[1]) if not ref_data: msg(f"No such reference: {spl[1]}") return tx.del_ref(spl[1]) msg(f"Deleted reference: {spl[1]}") class release(object): name = "release" authed = True helptext = "Release funds for a trade. Usage: release " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): if length == 2: tx = tx.ref_to_tx(spl[1]) if not tx: msg(f"No such reference: {spl[1]}") return rtrn = agora.release_funds(tx) msg(dumps(rtrn)) class nuke(object): name = "nuke" authed = True helptext = "Delete all our adverts." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): rtrn = agora.nuke_ads() msg(dumps(rtrn)) class wallet(object): name = "wallet" authed = True helptext = "Get Agora wallet balance in XMR." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): rtrn = agora.agora.wallet_balance_xmr() if not rtrn["success"]: msg("Error getting wallet details.") return balance = rtrn["response"]["data"]["total"]["balance"] msg(f"Wallet balance: {balance}XMR") class pubads(object): name = "pubads" authed = True helptext = "View public adverts. Usage: pubads " @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): if length == 3: country = spl[1] currency = spl[2] rtrn = agora.wrap_public_ads(country, currency) for ad in rtrn: msg(f"({ad[0]}) {ad[1]} {ad[2]} {ad[3]}") class cheat(object): name = "cheat" authed = True helptext = "Cheat the markets by manipulating our prices to exploit people." @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): rtrn = agora.update_prices() msg(dumps(rtrn)) class ads(object): name = "ads" authed = True helptext = "Get all our ad regions" @staticmethod def run(cmd, spl, length, authed, msg, agora, revolut, tx): ads = agora.enum_ads() for ad in ads: msg(f"({ad[0]}) {ad[1]} {ad[2]}")