from json import loads as json_loads from json import dumps as json_dumps from datetime import timedelta from redis import Redis from requests import get as r_get from flask import current_app from app.library.coingecko import get_market_data from app.library.monero import wallet from app.library.digitalocean import do from app import config class Cache(object): def __init__(self): self.redis = Redis(host=config.CACHE_HOST, port=config.CACHE_PORT) def store_data(self, item_name, expiration_minutes, data): current_app.logger.info(f'SET - {item_name} - expires in {expiration_minutes} minutes') self.redis.setex( item_name, timedelta(minutes=expiration_minutes), value=data ) def get_tor_url(self, codename): key_name = f'node_{codename}_tor_url' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return data else: current_app.logger.info(f'MISS - {key_name}') try: dns = f'{codename}.node.{config.DO_DOMAIN}' url = f'https://{dns}/tor/' r = r_get(url, timeout=6) if r.text: data = r.text.strip() self.store_data(key_name, 86400, data) else: data = '' return data except: return '' def get_info(self, codename): key_name = f'node_{codename}_info' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') try: dns = f'{codename}.node.{config.DO_DOMAIN}' url = f'http://{dns}:18081/get_info' r = r_get(url, timeout=6) data = r.json() self.store_data(key_name, 30, json_dumps(data)) return data except: return {'error': 'true'} def get_transfers(self, account_idx): key_name = f'wallet_txes_{account_idx}' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') txes = wallet.get_transfers(account_idx) self.store_data(key_name, 2, json_dumps(txes)) return txes def get_balances(self, account_idx, atomic=True): if atomic: extra = '_atomic' else: extra = '' key_name = f'wallet_balances_{account_idx}{extra}' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') balances = wallet.balances(account_idx, atomic) data = {'balance': balances[0], 'unlocked': balances[1]} self.store_data(key_name, 2, json_dumps(data)) return data def show_droplet(self, droplet_id): if droplet_id is None: return None key_name = f'droplet_{droplet_id}' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') droplet = do.show_droplet(droplet_id) self.store_data(key_name, 120, json_dumps(droplet)) return droplet def show_volume(self, volume_id): key_name = f'volume_{volume_id}' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') volume = do.show_volume(volume_id) self.store_data(key_name, 120, json_dumps(volume)) return volume def get_coin_price(self, cur='usd'): key_name = f'xmr_price_{cur}' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return float(data.decode()) else: current_app.logger.info(f'MISS - {key_name}') d = get_market_data() amt = d['market_data']['current_price'][cur] self.store_data(key_name, 5, amt) return amt def get_transfer_data(self, subaddress_index): key_name = f'xmr_wallet_{subaddress_index}_txes' data = self.redis.get(key_name) if data: current_app.logger.info(f'HIT - {key_name}') return json_loads(data) else: current_app.logger.info(f'MISS - {key_name}') wallet.get_transfers(subaddress_index) self.store_data(key_name, 2, json_dumps(data)) return data cache = Cache()