#!/usr/bin/env python # IRC Cryptocurrency Exchange (IRCCEX) - Developed by acidvegas in Python (https://acid.vegas/irccex) # irc.py ''' if using_too_many_if_statements == True: use_more = True else: use_alot_more = True ''' import datetime import os import pickle import random import socket import threading import time import config import constants import functions from coinmarketcap import CoinMarketCap if config.connection.ssl: import ssl def color(msg, foreground, background=None): if background: return f'{constants.color}{foreground},{background}{msg}{constants.reset}' else: return f'{constants.color}{foreground}{msg}{constants.reset}' class IRC(object): def __init__(self): self.db = {'bank':dict(),'pool':0.0,'round':1,'score':dict(),'start':datetime.date.today(),'verify':dict(),'wallet':dict()} self.last = 0 self.last_backup = time.strftime('%I:%M') self.maintenance = False self.reward = {'reward':0,'rewards':0,'status':False} self.slow = False self.sock = None self.start = time.time() def run(self): if os.path.isfile('db.pkl'): with open('db.pkl', 'rb') as db_file: self.db = pickle.load(db_file) print('[+] - Restored database!') Loops.start_loops() self.connect() def connect(self): try: self.create_socket() self.sock.connect((config.connection.server, config.connection.port)) self.register() except socket.error as ex: print('[!] - Failed to connect to IRC server! (' + str(ex) + ')') Events.disconnect() else: self.listen() def create_socket(self): self.sock = socket.socket(AF_INET6) if config.connection.ipv6 else socket.socket() if config.connection.vhost: self.sock.bind((config.connection.vhost, 0)) if config.connection.ssl: ctx = ssl.SSLContext() if config.cert.file: ctx.load_cert_chain(config.cert.file, password=config.cert.password) if config.connection.ssl_verify: ctx.check_hostname = True ctx.load_default_certs() self.sock = ctx.wrap_socket(self.sock, server_hostname=config.connection.server) else: self.sock = ctx.wrap_socket(self.sock) def listen(self): buffer = str() last = time.time() while True: try: data = self.sock.recv(1024).decode('utf-8') buffer += data if data: last = time.time() else: if time.time() - last > 120: break while '\r\n' in buffer: line = buffer.split('\r\n')[0] buffer = buffer.split('\r\n', 1)[1] print('[~] - ' + line) if len(line.split()) >= 2: Events.handle(line) except (UnicodeDecodeError,UnicodeEncodeError): pass except Exception as ex: print('[!] - Unexpected error occured. (' + str(ex) + ')') break Events.disconnect() def register(self): if config.login.network: Commands.raw('PASS ' + config.login.network) Commands.raw(f'USER {config.ident.username} 0 * :{config.ident.realname}') Commands.nick(config.ident.nickname) class Commands: def action(chan, msg): Commands.sendmsg(chan, f'\x01ACTION {msg}\x01') def check_nick(nick, chan): if nick in Bot.db['wallet']: return True else: if nick in Bot.db['verify']: Commands.error(chan, 'Your account is not verified!', 'try again later') else: Commands.error(chan, 'You don\'t have an account!', 'use !register to make an account') return False def cleanup(nick): for symbol in [symbol for symbol in Bot.db['wallet'][nick] if not Bot.db['wallet'][nick][symbol]]: del Bot.db['wallet'][nick][symbol] if not Bot.db['wallet'][nick]: del Bot.db['wallet'][nick] def error(target, data, reason=None): if reason: Commands.sendmsg(target, '[{0}] {1} {2}'.format(color('!', constants.red), data, color('({0})'.format(reason), constants.grey))) else: Commands.sendmsg(target, '[{0}] {1}'.format(color('!', constants.red), data)) def identify(nick, password): Commands.sendmsg('NickServ', f'identify {nick} {password}') def join_channel(chan, key=None): Commands.raw(f'JOIN {chan} {key}') if key else Commands.raw('JOIN ' + chan) def mode(target, mode): Commands.raw(f'MODE {target} {mode}') def nick(nick): Commands.raw('NICK ' + nick) def notice(target, msg): Commands.raw(f'NOTICE {target} :{msg}') def oper(user, password): Commands.raw(f'OPER {user} {password}') def raw(msg): Bot.sock.send(bytes(msg + '\r\n', 'utf-8')) def sendmsg(target, msg): Commands.raw(f'PRIVMSG {target} :{msg}') time.sleep(config.throttle.msg) class Events: def connect(): if config.connection.modes: Commands.mode(config.ident.nickname, '+' + config.connection.modes) if config.login.nickserv: Commands.identify(config.ident.nickname, config.login.nickserv) if config.login.operator: Commands.oper(config.ident.username, config.login.operator) Commands.join_channel(config.connection.channel, config.connection.key) def disconnect(): Bot.sock.close() time.sleep(config.throttle.reconnect) Bot.connect() def invite(chan): if chan == config.connection.channel: Commands.join_channel(config.connection.channel, config.connection.key) def kick(chan, kicked): if kicked == config.ident.nickname and chan == config.connection.channel: time.sleep(config.throttle.rejoin) Commands.join_channel(chan, config.connection.key) def message(nick, chan, msg): if chan == config.connection.channel: try: if msg[:1] in '!@$': if time.time() - Bot.last < config.throttle.cmd: if not Bot.slow: Bot.slow = True Commands.sendmsg(chan, color('Slow down nerd!', constants.red)) else: Bot.slow = False args = msg.split() if Bot.maintenance and args[0] in ('!cashout','!send','!trade'): Commands.error(chan, 'Exchange is down for scheduled maintenance!', 'try again later') else: if args[0] == '!cashout': if Commands.check_nick(nick, chan): if 'USD' not in Bot.db['wallet'][nick]: Commands.error(chan, 'Insufficent funds.', 'you have no USD in your account') elif Bot.db['wallet'][nick]['USD'] < config.limits.cashout: Commands.error(chan, 'Insufficent funds.', f'${config.limits.cashout:,} minimum') else: profit = Bot.db['wallet'][nick]['USD']-config.limits.init amount = functions.fee(profit, config.fees.cashout) cashout_msg = msg[9:][:100] if len(args) > 1 else Bot.db['bank'][nick][1] if nick in Bot.db['bank'] else 'IM RICH BITCH !!!' Bot.db['bank'][nick] = (Bot.db['bank'][nick][0]+amount, cashout_msg) if nick in Bot.db['bank'] else (amount, cashout_msg) Bot.db['pool'] += profit-amount Bot.db['wallet'][nick]['USD'] = config.limits.init Commands.sendmsg(chan, 'Cashed out {0} to your bank account! {1}'.format(color('${:,}'.format(int(amount)), constants.green), color('(current balance: ${:,})'.format(int(Bot.db['bank'][nick][0])), constants.grey))) elif len(args) == 1: if msg == '@irccex': Commands.sendmsg(chan, constants.bold + 'IRC Cryptocurrency Exchange (IRCCEX) - Developed by acidvegas in Python - https://github.com/acidvegas/irccex') elif msg == '@stats': bank_total = 0 global_data = CMC._global() ticker_data = CMC._ticker() wallet_total = 0 for item in Bot.db['bank']: bank_total += Bot.db['bank'][item][0] for user in Bot.db['wallet']: for symbol in Bot.db['wallet'][user]: value = Bot.db['wallet'][user][symbol] if symbol == 'USD' else ticker_data[symbol]['price']*Bot.db['wallet'][user][symbol] wallet_total += value Commands.sendmsg(chan, '[{0}]'.format(color('Bot', constants.cyan))) Commands.sendmsg(chan, ' {0} {1}'.format(color('Backup :', constants.white), Bot.last_backup)) Commands.sendmsg(chan, ' {0} {1}'.format(color('Round :', constants.white), Bot.db['round'])) Commands.sendmsg(chan, ' {0} {1}'.format(color('Uptime :', constants.white), functions.uptime(Bot.start))) Commands.sendmsg(chan, '[{0}]'.format(color('Market', constants.cyan))) Commands.sendmsg(chan, ' {0} {1}%'.format(color('BTC Dominance :', constants.white), global_data['btc_dominance'])) Commands.sendmsg(chan, ' {0} {1}%'.format(color('ETH Dominance :', constants.white), global_data['eth_dominance'])) Commands.sendmsg(chan, ' {0} {1:,}'.format(color('Cryptocurrencies :', constants.white), global_data['cryptocurrencies'])) Commands.sendmsg(chan, ' {0} {1:,}'.format(color('Exchanges :', constants.white), global_data['exchanges'])) Commands.sendmsg(chan, ' {0} ${1:,}'.format(color('Market Cap :', constants.white), global_data['market_cap'])) Commands.sendmsg(chan, ' {0} ${1:,}'.format(color('Volume :', constants.white), global_data['volume'])) Commands.sendmsg(chan, '[{0}]'.format(color('Round', constants.cyan))) Commands.sendmsg(chan, ' {0} {1} {2}'.format(color('Accounts :', constants.white), '{:,}'.format(len(Bot.db['wallet'])), color('(${:,})'.format(int(wallet_total)), constants.grey))) Commands.sendmsg(chan, ' {0} {1} {2}'.format(color('Bank :', constants.white), '{:,}'.format(len(Bot.db['bank'])), color('(${:,})'.format(int(bank_total)), constants.grey))) Commands.sendmsg(chan, ' {0} ${1:,}'.format(color('Reward Pool :', constants.white), int(Bot.db['pool']))) Commands.sendmsg(chan, ' {0} {1:,}'.format(color('Unverified :', constants.white), len(Bot.db['verify']))) elif msg.startswith('$'): msg = msg.upper() if ',' in msg: seen = set() coins = [x for x in list(msg[1:].split(','))[:10] if not (x in seen or seen.add(x))] data = [CMC._ticker()[coin] for coin in coins if coin in CMC._ticker()] if data: if len(data) == 1: Commands.sendmsg(chan, functions.coin_info(data[0])) else: for line in functions.coin_table(data): Commands.sendmsg(chan, line) else: Commands.error(chan, 'Invalid cryptocurrency names!') else: coin = msg[1:] if not coin.split('.')[0].isdigit(): if coin in CMC._ticker(): Commands.sendmsg(chan, functions.coin_info(CMC._ticker()[coin])) else: Commands.error(chan, 'Invalid cryptocurrency name!') elif msg == '!bang' and Bot.reward['status']: if Commands.check_nick(nick, chan): amount = functions.fee(Bot.reward['reward'], float('0.{0:02}'.format(functions.random_int(5,15)))) if Bot.reward['rewards'] else Bot.db['pool'] Bot.db['wallet'][nick]['USD'] = Bot.db['wallet'][nick]['USD']+amount if 'USD' in Bot.db['wallet'][nick] else amount Bot.db['pool'] -= amount if Bot.db['pool']: Commands.sendmsg(chan, 'You won {0}!'.format(color('${:,}'.format(amount), constants.green))) Bot.reward['rewards'] -= 1 else: Commands.sendmsg(chan, 'You won the big {0}!'.format(color('${:,}'.format(amount), constants.green))) Bot.reward = {'reward':0,'rewards':0,'status':False} elif msg == '!bank': if nick in Bot.db['bank']: clean_bank = dict() for item in Bot.db['bank']: clean_bank[item] = Bot.db['bank'][item][0] richest = sorted(clean_bank, key=clean_bank.get, reverse=True) Commands.sendmsg(chan, '[{0}] {1} {2} {3}'.format(color('{:02}'.format(richest.index(nick)+1), constants.pink), nick, color('${:,}'.format(int(Bot.db['bank'][nick][0])), constants.green), Bot.db['bank'][nick][1])) else: Commands.error(chan, 'You don\'t have any money in the bank!', 'use !cashout to put money in the bank') elif msg == '!portfolio': if Commands.check_nick(nick, chan): total = 0 for symbol in Bot.db['wallet'][nick]: value = Bot.db['wallet'][nick][symbol] if symbol == 'USD' else CMC._ticker()[symbol]['price']*Bot.db['wallet'][nick][symbol] total += value Commands.sendmsg(chan, color('${:,}'.format(int(total)), constants.green)) elif msg == '!register': if nick not in Bot.db['verify'] and nick not in Bot.db['wallet']: Bot.db['verify'][nick] = time.time() Commands.sendmsg(chan, 'Welcome to the IRC Cryptocurrency Exchange! ' + color('(please wait 24 hours while we verify your documents)', constants.grey)) else: Commands.error(chan, 'Failed to register an account!', 'you already have an account') elif msg == '!rich': if Bot.db['bank']: clean_bank = dict() for item in Bot.db['bank']: clean_bank[item] = Bot.db['bank'][item][0] richest = sorted(clean_bank, key=clean_bank.get, reverse=True)[:10] for user in richest: _user = f'{user[:1]}{constants.reset}{user[1:]}' Commands.sendmsg(chan, '[{0}] {1} {2} {3}'.format(color('{:02}'.format(richest.index(user)+1), constants.pink), _user.ljust(15), color('${:,}'.format(int(Bot.db['bank'][user][0])).ljust(13), constants.green), Bot.db['bank'][user][1])) Commands.sendmsg(chan, '^ this could be u but u playin...') else: Commands.error(chan, 'Yall broke...') elif msg == '!score': if nick in Bot.db['score']: clean_bank = dict() for item in Bot.db['score']: clean_bank[item] = Bot.db['score'][item][0] top = sorted(clean_bank, key=clean_bank.get, reverse=True) Commands.sendmsg(chan, '[{0}] {1} {2} {3}'.format(color('{:02}'.format(top.index(nick)+1), constants.pink), nick, color(str(Bot.db['score'][nick][0]), constants.cyan), color('${:,}'.format(int(Bot.db['score'][nick][1])), constants.green))) else: Commands.error(chan, 'You don\'t have any points!', 'be in the top 10 at the end of the month when the current round ends to get points') elif msg == '!scores': if Bot.db['score']: clean_score = dict() for item in Bot.db['score']: clean_score[item] = Bot.db['score'][item][0] top = sorted(clean_score, key=clean_score.get, reverse=True)[:10] for user in top: Commands.sendmsg(chan, '[{0}] {1} {2} {3}'.format(color('{:02}'.format(top.index(user)+1), constants.pink), user.ljust(15), color(str(Bot.db['score'][user][0]).ljust(5), constants.cyan), color('${:,}'.format(int(Bot.db['score'][nick][1])), constants.green))) Commands.sendmsg(chan, '^ this could be u but u playin...') else: Commands.error(chan, 'Yall broke...') elif msg == '!top': data = list(CMC._ticker().values())[:10] for line in functions.coin_table(data): Commands.sendmsg(chan, line) elif msg == '!wallet': if Commands.check_nick(nick, chan): Commands.sendmsg(chan, color(' Symbol Amount Value ', constants.black, constants.light_grey)) total = 0 for symbol in Bot.db['wallet'][nick]: amount = Bot.db['wallet'][nick][symbol] if symbol == 'USD': value = amount elif symbol in CMC._ticker(): value = CMC._ticker()[symbol]['price']*amount else: # CLEAN THIS UP - TEMP FIX FOR ERRORS ON !wallet reported by sht, ji, and others... value = 'JACKED' if value == 'JACKED': Commands.sendmsg(chan, symbol + ' was JACKED sucka!') del Bot.db['wallet'][nick][symbol] else: Commands.sendmsg(chan, f' {symbol.ljust(8)} | {str(functions.clean_float(amount)).rjust(20)} | {str(functions.clean_value(value)).rjust(20)}') total += float(value) Commands.sendmsg(chan, color(f' Total: {str(functions.clean_value(total)).rjust(27)}', constants.black, constants.light_grey)) elif len(args) == 2: if args[0] in ('!bottom','!top'): option = args[1].lower() if option not in ('1h','24h','7d','value','volume'): Commands.error(chan, 'Invalid option!', 'valid options are 1h, 24h, 7d, value & volume') else: data = dict() for item in CMC._ticker(): data[item] = float(CMC._ticker()[item]['percent'][option]) data = sorted(data, key=data.get, reverse=True) data = data[-10:] if args[0] == '!bottom' else data[:10] data = [CMC._ticker()[coin] for coin in data] for line in functions.coin_table(data): Commands.sendmsg(chan, line) elif len(args) == 3: if args[0] == '!trade': if Commands.check_nick(nick, chan): pair = args[1].upper() if len(pair.split('/')) == 2: from_symbol, to_symbol = pair.split('/') if from_symbol in Bot.db['wallet'][nick]: amount = args[2].replace(',','') if functions.is_amount(amount): if amount == '*': amount = Bot.db['wallet'][nick][from_symbol] elif amount.startswith('$'): amount = float(amount[1:]) if from_symbol == 'USD' else float(amount[1:])/CMC._ticker()[from_symbol]['price'] else: amount = float(amount) usd_value = amount if from_symbol == 'USD' else CMC._ticker()[from_symbol]['price']*amount if Bot.db['wallet'][nick][from_symbol] >= amount: if usd_value >= config.limits.trade: recv_amount = functions.fee(amount, config.fees.trade) if functions.check_pair(from_symbol, to_symbol): from_value = 1 if from_symbol == 'USD' else CMC._ticker()[from_symbol]['price'] to_value = 1 if to_symbol == 'USD' else CMC._ticker()[to_symbol]['price'] recv_amount = (recv_amount*from_value)/to_value if to_symbol in Bot.db['wallet'][nick]: Bot.db['wallet'][nick][from_symbol] -= amount Bot.db['wallet'][nick][to_symbol] += recv_amount Commands.cleanup(nick) Bot.db['pool'] += usd_value-functions.fee(usd_value, config.fees.trade) Commands.sendmsg(chan, 'Trade successful!') else: if len(Bot.db['wallet'][nick]) < config.limits.assets: Bot.db['wallet'][nick][from_symbol] -= amount Bot.db['wallet'][nick][to_symbol] = recv_amount Commands.cleanup(nick) Bot.db['pool'] += usd_value-functions.fee(usd_value, config.fees.trade) Commands.sendmsg(chan, 'Trade successful!') else: Commands.error(chan, f'You can\'t hold more than {config.limits.assets} assets!') else: Commands.error(chan, 'Invalid trade pair!') else: Commands.error(chan, 'Invalid amount.', f'${config.limits.trade} minimum') else: Commands.error(chan, 'Insufficient funds.') else: Commands.error(chan, 'Invalid amount argument.') else: Commands.error(chan, 'Insufficient funds.') else: Commands.error(chan, 'Invalid trade pair.') elif args[0] == '!value': amount = args[1] if functions.is_amount(amount, False): amount = amount.replace(',','') symbol = args[2].upper() if symbol in CMC._ticker(): value = CMC._ticker()[symbol]['price']*float(amount) if value < 0.01: Commands.sendmsg(chan, '{0} is worth {1}'.format(color(f'{amount} {symbol}', constants.white), color('${0:,.8f}'.format(value), constants.light_blue))) else: Commands.sendmsg(chan, '{0} is worth {1}'.format(color(f'{amount} {symbol}', constants.white), color('${0:,.2f}'.format(value), constants.light_blue))) else: Commands.error(chan, 'Invalid cryptocurrency name!') else: Commands.error(chan, 'Invalid amount!') elif len(args) == 4: if args[0] == '!send': if Commands.check_nick(nick, chan): total = 0 for symbol in Bot.db['wallet'][nick]: total += Bot.db['wallet'][nick]['USD'] if symbol == 'USD' else CMC._ticker()[symbol]['price']*Bot.db['wallet'][nick][symbol] if total >= config.limits.send: receiver = args[1].lower() if receiver in Bot.db['wallet']: if nick != receiver: amount = args[2].replace(',','') symbol = args[3].upper() if symbol in Bot.db['wallet'][nick]: if functions.is_amount(amount): amount = amount.replace(',','') if amount == '*': amount = Bot.db['wallet'][nick][symbol] elif amount.startswith('$'): amount = float(amount[1:]) if symbol == 'USD' else float(amount[1:])/CMC._ticker()[symbol]['price'] else: amount = float(amount) usd_value = amount if symbol == 'USD' else CMC._ticker()[symbol]['price']*amount if Bot.db['wallet'][nick][symbol] >= amount: if usd_value >= config.limits.trade: recv_amount = functions.fee(amount, config.fees.send) if symbol in Bot.db['wallet'][receiver] or len(Bot.db['wallet'][receiver]) < config.limits.assets: Bot.db['wallet'][receiver][symbol] = Bot.db['wallet'][receiver][symbol]+recv_amount if symbol in Bot.db['wallet'][receiver] else recv_amount Bot.db['wallet'][nick][symbol] -= amount Commands.cleanup(nick) Bot.db['pool'] += usd_value-functions.fee(usd_value, config.fees.send) Commands.sendmsg(receiver, '{0} just sent you {1} {2}! {3}'.format(color(nick, constants.light_blue), functions.clean_float(recv_amount), symbol, color('({0})'.format(functions.clean_value(usd_value)), constants.grey))) Commands.sendmsg(chan, 'Sent!') else: Commands.error(chan, f'User can\'t hold more than {config.limits.assets} assets!') else: Commands.error(chan, 'Invalid send amount.', f'${config.limits.trade} minimum') else: Commands.error(chan, 'Insufficient funds.') else: Commands.error(chan, 'Invalid send amount.') else: Commands.error(chan, 'Insufficient funds.') else: Commands.error(chan, '...Really?') elif receiver in Bot.db['verify']: Commands.error(chan, 'User is not verified yet!') else: Commands.error(chan, 'User is not in the database.') else: Commands.error(chan, 'Insufficent funds!', f'${config.limits.send} minium') Bot.last = time.time() except Exception as ex: if time.time() - Bot.last < config.throttle.cmd: if not Bot.slow: Commands.sendmsg(chan, color('Slow down nerd!', constants.red)) Bot.slow = True else: Commands.error(chan, 'Command threw an exception.', ex) Bot.last = time.time() def nick_in_use(): config.ident.nickname = 'IRCCEX_' + str(functions.random_int(10,99)) Commands.nick(config.ident.nickname) def handle(data): args = data.split() if data.startswith('ERROR :Closing Link:'): raise Exception('Connection has closed.') elif args[0] == 'PING': Commands.raw('PONG ' + args[1][1:]) elif args[1] == constants.RPL_WELCOME: Events.connect() elif args[1] == constants.ERR_NICKNAMEINUSE: Events.nick_in_use() elif args[1] == constants.INVITE and len(args) == 4: chan = args[3][1:] Events.invite(chan) elif args[1] == constants.KICK and len(args) >= 4: chan = args[2] kicked = args[3] Events.kick(chan, kicked) elif args[1] == constants.PRIVMSG and len(args) >= 4: chan = args[2] nick = args[0].split('!')[0][1:].lower() msg = ' '.join(args[3:])[1:] Events.message(nick, chan, msg) class Loops: def start_loops(): threading.Thread(target=Loops.backup).start() threading.Thread(target=Loops.double_fees).start() threading.Thread(target=Loops.maintenance).start() threading.Thread(target=Loops.remind).start() threading.Thread(target=Loops.reward).start() threading.Thread(target=Loops.round).start() threading.Thread(target=Loops.verify).start() def backup(): while True: time.sleep(3600) # 1H with open('db.pkl', 'wb') as db_file: pickle.dump(Bot.db, db_file, pickle.HIGHEST_PROTOCOL) Bot.last_backup = time.strftime('%I:%M') print('[+] - Database backed up!') def double_fees(): original_fees = {'cashout':config.fees.cashout,'send':config.fees.send,'trade':config.fees.trade} while True: try: time.sleep(functions.random_int(604800,864000)) # 7D - 10D config.fees.cashout = original_fees['cashout']*2 config.fees.send = original_fees['send']*2 config.fees.trade = original_fees['trade']*2 Commands.action(config.connection.channel, color('Double fees have been activated!', constants.red)) time.sleep(functions.random_int(86400, 259200)) # 1D - 3D config.fees.cashout = original_fees['cashout']/2 config.fees.send = original_fees['send']/2 config.fees.trade = original_fees['trade']/2 Commands.notice(config.connection.channel, color('Double fees have been deactivated!', constants.red)) except Exception as ex: config.fees.cashout = original_fees['cashout'] config.fees.send = original_fees['send'] config.fees.trade = original_fees['trade'] print('[!] - Error occured in the double fees loop! (' + str(ex) + ')') def maintenance(): while True: try: time.sleep(functions.random_int(604800,1209600)) # 7D - 14D Bot.maintenance = True Commands.action(config.connection.channel, color('Exchange is going down for scheduled maintenance!', constants.red)) time.sleep(functions.random_int(3600, 86400)) # 1H - 1D Bot.maintenance = False Commands.notice(config.connection.channel, color('Maintenance complete! Exchange is back online!', constants.green)) except Exception as ex: Bot.maintenance = False print('[!] - Error occured in the maintenance loop! (' + str(ex) + ')') def remind(): time.sleep(10) while True: try: days = functions.month_days() now = int(time.strftime('%-d')) for dayz in (7,14,21): if days-now == dayz: Commands.notice(config.connection.channel, 'There is only {0} week(s) left until round {1} ends!'.format(color(str(int(dayz/7)), constants.cyan), color(str(Bot.db['round']), constants.cyan))) break except Exception as ex: print('[!] - Error occured in the reminder loop! (' + str(ex) + ')') finally: time.sleep(86400) # 24H def reward(): while True: try: time.sleep(functions.random_int(86400, 259200)) # 1D - 3D if not Bot.reward['status'] and not Bot.maintenance: option = functions.random_int(25,50) Bot.reward = {'reward':Bot.db['pool']/(option*2),'rewards':option,'status':True} Commands.notice(config.connection.channel, 'There is {1} in the reward pool. Type {2} to grab some cash stacks!'.format(color('${:,}'.format(int(Bot.db['pool'])), constants.green), color('!bang', constants.light_blue))) except Exception as ex: print('[!] - Error occured in the reward loop! (' + str(ex) + ')') def round(): time.sleep(10) while True: try: if time.strftime('%d') == '01': Bot.maintenance = True amount = 10 if len(Bot.db['bank']) >= 10 else len(Bot.db['bank']) if amount: clean_bank = dict() for item in Bot.db['bank']: clean_bank[item] = Bot.db['bank'][item][0] richest = sorted(clean_bank, key=clean_bank.get, reverse=True)[:amount] for nick in richest: if nick in Bot.db['score']: Bot.db['score'][nick] = (Bot.db['score'][nick][0]+(amount-richest.index(nick)), Bot.db['score'][nick][1]+Bot.db['bank'][nick][0]) else: Bot.db['score'][nick] = (amount-richest.index(nick), Bot.db['bank'][nick][0]) Commands.notice(config.connection.channel, 'Round {0} is now over! Winners: {1}'.format(color(Bot.db['round'], constants.light_blue), color(', '.join(richest), constants.yellow))) else: Commands.notice(config.connection.channel, 'Round {0} is now over! Winners: {1}'.format(color(Bot.db['round'], constants.light_blue), color('None', constants.grey))) Bot.db = {'bank':dict(),'pool':0.0,'round':Bot.db['round']+1,'score':Bot.db['score'],'verify':dict(),'wallet':dict()} Commands.action(config.connection.channel, 'Round {0} starts NOW!'.format(color(Bot.db['round'], constants.light_blue))) Bot.maintenance = False except Exception as ex: print('[!] - Error occured in the round loop! (' + str(ex) + ')') finally: time.sleep(86400) # 24H def verify(): time.sleep(10) while True: try: if Bot.db['verify']: for nick in [nick for nick in Bot.db['verify'] if time.time() - Bot.db['verify'][nick] >= 86400]: # 1D Bot.db['wallet'][nick] = {'USD':config.limits.init} del Bot.db['verify'][nick] Commands.sendmsg(nick, f'Your account is now verified! Here is ${config.limits.init:,} to start trading!') except Exception as ex: print('[!] - Error occured in the verify loop! (' + str(ex) + ')') finally: time.sleep(3600) # 1H Bot = IRC() CMC = CoinMarketCap(config.CMC_API_KEY)