def watchlist(bot, message): logger.info("watchlist") response = "<u><b>Your watchlist<b><u>\n\n" userInfo = util.crossMessengerSplit(message) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else "Unknown" public = userInfo['public'] dbUser = bot.database.getUser(userId) if not dbUser: logger.error("User not in db?!") response += "<b>Unexpected error. Contact the team!<b>" else: watchlist = bot.database.getWatchlist(userId=userId) if not watchlist or not len(watchlist): logger.info("No watchlist entry!") response += messages.noWatchlistEntry(bot.messenger) else: proposalIds = list(map(lambda x: x['proposal_id'], watchlist)) watchlist = bot.proposals.getProposals(proposalIds) response += proposalList(bot, watchlist) return messages.markdown(response, bot.messenger)
def username(bot, update, args): response = messages.markdown("<u><b>Change username<b><u>\n\n", bot.messenger) userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None #Get the user entry from the user which fired the command user = bot.database.getUser(userId) if user == None: response += messages.nodesRequired(bot.messenger) elif len(args) != 1: response += messages.userNameRequiredError(bot.messenger) elif not util.validateName(args[0]): response += messages.invalidNameError.format(args[0]) else: old = user['name'] bot.database.updateUsername(args[0], user['id']) response += "Username updated from {} to {}".format( messages.removeMarkdown(old), messages.removeMarkdown(args[0])) return response
def me(bot, update): response = messages.markdown("<u><b>User info<b><u>\n\n", bot.messenger) userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None #Get the user entry from the user which fired the command user = bot.database.getUser(userId) if user == None: response += messages.nodesRequired(bot.messenger) else: response += "You are {}\n\n".format( messages.removeMarkdown(user['name'])) response += "Status Notifications " + messages.notificationState( bot.messenger, user['status_n']) response += "\nReward Notifications " + messages.notificationState( bot.messenger, user['reward_n']) response += "\nTimeout Notifications " + messages.notificationState( bot.messenger, user['timeout_n']) response += "\nNetwork Notifications " + messages.notificationState( bot.messenger, user['network_n']) return response
def changeState(bot, update, args, action, description): response = messages.markdown( "<b>{} notifications<b>\n\n".format(description), bot.messenger) userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None #Get the user entry from the user which fired the command user = bot.database.getUser(userId) if user == None: response += messages.nodesRequired(bot.messenger) elif len(args) != 1: response += messages.notificationArgumentRequiredError(bot.messenger) elif not util.isInt(args[0]) or int(args[0]) < 0 or int(args[0]) > 1: response += messages.notificationArgumentInvalidError(bot.messenger) else: action(user['id'], args[0]) response += messages.notificationResponse(bot.messenger, description.lower(), int(args[0])) return response
def detail(bot, update): response = messages.markdown("<u><b>Detail<b><u>\n\n", bot.messenger) userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo[ 'name'] if 'name' in userInfo else update.message.from_user.name logger.debug("detail - user: {}".format(userId)) nodesFound = False user = bot.database.getUser(userId) userNodes = bot.database.getAllNodes(userId) if user == None or userNodes == None or len(userNodes) == 0: response += messages.nodesRequired(bot.messenger) else: with bot.nodeList as nodeList: minimumUptime = nodeList.minimumUptime() top10 = nodeList.enabledWithMinProtocol() * 0.1 for userNode in userNodes: masternode = nodeList.getNodes([userNode['collateral']])[0] response += messages.markdown( ("<b>" + userNode['name'] + " - " + masternode.ip + "<b>"), bot.messenger) response += "\n `Status` " + masternode.status response += "\n `Position` " + messages.markdown( masternode.positionString(minimumUptime, top10), bot.messenger) response += "\n `Payee` " + masternode.payee response += "\n `Active since` " + util.secondsToText( masternode.activeSeconds) response += "\n `Last seen` " + util.secondsToText( int(time.time()) - masternode.lastSeen) response += "\n `Last payout (Block)` " + masternode.payoutBlockString( ) response += "\n `Last payout (Time)` " + masternode.payoutTimeString( ) response += "\n `Protocol` {}".format(masternode.protocol) #response += "\n `Rank` {}".format(masternode.rank) response += "\n " + messages.link( bot.messenger, 'https://explorer3.curium.cc/address/{}'.format( masternode.payee), 'Open the explorer!') response += "\n\n" return response
def publish(bot, message, args): logger.info("publish") result = {'fire': False} response = "<u><b>Publish proposal<b><u>\n\n" userInfo = util.crossMessengerSplit(message) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else "Unknown" result['author'] = userName if len(args) != 1: response += messages.proposalIdRequired(bot.messenger, 'publish') elif not util.isInt(args[0].replace('#', '')): response += messages.invalidProposalId(bot.messenger, args[0]) else: proposal = bot.proposals.getProposal(int(args[0].replace('#', ''))) if not proposal: response += messages.proposalNotFound(bot.messenger, args[0]) else: result['proposal'] = proposal twitter = bot.tweeter != None reddit = bot.reddit != None gab = bot.gab != None discord = False telegram = False if 'discord' in bot.messenger: discord = True if 'telegram' in bot.messenger: telegram = True if proposal.published(twitter=twitter, reddit=reddit, gab=gab, discord=discord, telegram=telegram): response += messages.proposalAlreadyPublished( bot.messenger, args[0]) else: result['fire'] = True result['message'] = messages.markdown(response, bot.messenger) return result
def nodes(bot, update): response = messages.markdown("<u><b>Nodes<b><u>\n\n", bot.messenger) userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None logger.debug("nodes - user: {}".format(userId)) nodesFound = False user = bot.database.getUser(userId) userNodes = bot.database.getAllNodes(userId) if user == None or userNodes == None or len(userNodes) == 0: response += messages.nodesRequired(bot.messenger) else: with bot.nodeList as nodeList: collaterals = list(map(lambda x: x['collateral'], userNodes)) nodes = nodeList.getNodes(collaterals) minimumUptime = nodeList.minimumUptime() top10 = nodeList.enabledWithMinProtocol() * 0.1 for masternode in sorted(nodes, key=lambda x: x.position if x.position > 0 else 100000): userNode = bot.database.getNodes(masternode.collateral, user['id']) payoutText = util.secondsToText(masternode.lastPaidTime) response += messages.markdown( "<b>" + userNode['name'] + "<b> - `" + masternode.status + "`", bot.messenger) response += "\nPosition " + messages.markdown( masternode.positionString(minimumUptime, top10), bot.messenger) response += "\nLast seen " + util.secondsToText( int(time.time()) - masternode.lastSeen) response += "\nLast payout " + masternode.payoutTimeString() response += "\n" + messages.link( bot.messenger, 'https://explorer3.curium.cc/address/{}'.format( masternode.payee), 'Open the explorer!') response += "\n\n" return response
def remove(bot, message, args): logger.info("remove") response = "<u><b>Remove from watchlist<b><u>\n\n" userInfo = util.crossMessengerSplit(message) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else "Unknown" public = userInfo['public'] dbUser = bot.database.getUser(userId) if not dbUser: logger.error("User not in db?!") response += messages.unexpectedError(bot.messenger) else: if len(args) != 1: response += messages.proposalIdRequired(bot.messenger, 'remove') elif not util.isInt(args[0].replace('#', '')): response += messages.invalidProposalId(bot.messenger, args[0]) else: proposal = bot.proposals.getProposal(int(args[0].replace('#', ''))) if not proposal: response += messages.proposalNotFound(bot.messenger, args[0]) else: currentList = bot.database.getWatchlist(userId=userId) if currentList and len(currentList) and\ not proposal.proposalId in list(map(lambda x: x['proposal_id'],currentList)) or\ not currentList or not len(currentList): response += messages.proposalIsNotOnWatchlist( bot.messenger, proposal.title) else: if bot.database.removeFromWatchlist( userId, proposal.proposalId): response += "Succesfully removed the proposal <b>{}<b> from your watchlist.".format( proposal.title) else: logger.error("Could not remove watchlist entry?!") response += messages.unexpectedError(bot.messenger) return messages.markdown(response, bot.messenger)
def checkUser(bot, message): logger.info("checkUser") result = {'response':None, 'added':False} userInfo = util.crossMessengerSplit(message) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else "Unknown" if not bot.database.getUser(userId) and bot.database.addUser(userId, userName): logger.info("checkUser - new user {}".format(userName)) result['added'] = True if bot.messenger == 'discord': result['response'] = messages.welcome(bot.messenger) return result
def subscription(bot, message, state): logger.info("subscription") response = "<u><b>Subscription<b><u>\n\n" userInfo = util.crossMessengerSplit(message) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else "Unknown" public = userInfo['public'] dbUser = bot.database.getUser(userId) if not dbUser: logger.error("User not in db?!") response += messages.unexpectedError(bot.messenger) else: logger.info("subscription - update {}".format(state)) bot.database.updateSubscription(userId, state) response += "Succesfully <b>{}subscribed<b> new/ended proposals.".format("" if state else "un") return messages.markdown(response, bot.messenger)
def top(bot, update, args): response = "<u><b>Top nodes<b><u>\n\n" userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None logger.debug("nodes - user: {}".format(userId)) nodesFound = False user = bot.database.getUser(userId) userNodes = bot.database.getAllNodes(userId) if user == None or userNodes == None or len(userNodes) == 0: response += messages.nodesRequired(bot.messenger) else: invalidFilterValueMsg = "<b>ERROR<b>: Invalid filter value: <b>{}<b>! Valid range: 10 - 100\n\n" topPercent = 10 if len(args) >= 1: if util.isInt(args[0]) and\ int(args[0]) >= 10 and int(args[0]) <= 100: topPercent = int(args[0]) else: response += invalidFilterValueMsg.format( messages.removeMarkdown(args[0])) response += "<b>Filter<b> {}%\n\n".format(topPercent) with bot.nodeList as nodeList: topX = nodeList.enabledWithMinProtocol() * (topPercent / 100) collaterals = list(map(lambda x: x['collateral'], userNodes)) nodes = nodeList.getNodes(collaterals) topNodes = list( filter(lambda x: x.position <= topX and x.position > 0, nodes)) minimumUptime = nodeList.minimumUptime() if len(topNodes): for masternode in sorted(topNodes, key=lambda x: x.position if x.position > 0 else 100000): userNode = bot.database.getNodes(masternode.collateral, user['id']) response += "<b>" + userNode['name'] + "<b>" response += "\nPosition " + messages.markdown( masternode.positionString(minimumUptime), bot.messenger) response += "\n" + messages.link( bot.messenger, 'https://explorer3.curium.cc/address/{}'.format( masternode.payee), 'Open the explorer!') response += "\n\n" else: response += "<b>You have currently no nodes in the top {}% of the queue.<b>\n\n".format( topPercent) return messages.markdown(response, bot.messenger)
def nodeAdd(bot, update, args): userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None response = messages.markdown("<u><b>Add<b><u>\n\n", bot.messenger) logger.debug("add - " + " ".join(args)) logger.debug("add - user: {}".format(userId)) if len(args) == 0: response += messages.markdown(( "<b>ERROR<b>: Arguments required: <b>IPAddress_0;name_0 ... IPAddress_n;name_n<b>\n\n" "Example: <cb>add<ca> 43.121.56.87;Node1 56.76.27.100;Node2\n"), bot.messenger) valid = False else: with bot.nodeList as nodeList: for arg in args: valid = True newNode = arg.split(";") if len(newNode) != 2: response += messages.invalidParameterError( bot.messenger, arg) valid = False else: ip = util.validateIp(newNode[0]) name = util.validateName(newNode[1]) if not ip: response += messages.invalidIpError( bot.messenger, newNode[0]) valid = False if not name: response += messages.invalidNameError( bot.messenger, newNode[1]) valid = False if valid: node = nodeList.getNodeByIp(ip) if node == None: response += messages.nodeNotInListError( bot.messenger, ip) else: if bot.database.addNode(node.collateral, name, userId, userName): response += "Added node {}!\n".format(ip) else: response += messages.nodeExistsError( bot.messenger, ip) return response
def history(bot, update): response = "<u><b>History<b><u>\n\n" userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None logger.debug("history - user: {}".format(userId)) nodesFound = False user = bot.database.getUser(userId) userNodes = bot.database.getAllNodes(userId) if user == None or userNodes == None or len(userNodes) == 0: response += messages.nodesRequired(bot.messenger) else: with bot.nodeList as nodeList: collaterals = list(map(lambda x: x['collateral'], userNodes)) nodes = nodeList.getNodes(collaterals) time30Days = time.time() - (2592000) # now - 30d * 24h * 60m * 60s totalInvest = len(nodes) * 10000 totalProfit = 0 totalAvgInterval = 0 totalFirst = 0 countMultiplePayouts = 0 totalProfit30Days = 0 for masternode in nodes: userNode = bot.database.getNodes(masternode.collateral, user['id']) rewards = bot.rewardList.getRewardsForPayee(masternode.payee) profit = sum(map(lambda x: x.amount, rewards)) profit30Days = sum( map(lambda x: x.amount if x.txtime > time30Days else 0, rewards)) totalProfit30Days += profit30Days totalProfit += round(profit, 1) avgInterval = 0 masterPerDay = 0 first = 0 last = 0 if len(rewards) == 1: first = rewards[0].txtime if len(rewards) > 1: countMultiplePayouts += 1 payoutTimes = list(map(lambda x: x.txtime, rewards)) first = min(payoutTimes) last = max(payoutTimes) if not totalFirst or first and totalFirst > first: totalFirst = first if last: avgInterval = (last - first) / len(rewards) totalAvgInterval += avgInterval masterPerDay = round( profit / ((time.time() - first) / 86400), 1) response += "<u><b>Node - " + userNode['name'] + "<b><u>\n\n" response += "<b>Payouts<b> {}\n".format(len(rewards)) response += "<b>Profit<b> {:,} CRU\n".format(round(profit, 1)) response += "<b>Profit (30 days)<b> {:,} CRU\n".format( round(profit30Days, 1)) if avgInterval: response += "\n<b>Payout interval<b> " + util.secondsToText( avgInterval) if masterPerDay: response += "\n<b>CRU/day<b> {:,} CRU".format(masterPerDay) response += "\n<b>ROI (CRU)<b> {}%".format( round((profit / 10000.0) * 100.0, 1)) response += "\n\n" response += "<u><b>Total stats<b><u>\n\n" if totalFirst: response += "<b>First payout<b> {} ago\n\n".format( util.secondsToText(time.time() - totalFirst)) response += "<b>Profit (30 days)<b> {:,} CRU\n".format( round(totalProfit30Days, 1)) response += "<b>CRU/day (30 days)<b> {:,} CRU\n\n".format( round(totalProfit30Days / 30, 1)) if totalAvgInterval: totalAvgInterval = totalAvgInterval / countMultiplePayouts response += "<b>Total payout interval<b> {}\n".format( util.secondsToText(totalAvgInterval)) response += "<b>Total CRU/day<b> {:,} CRU\n\n".format( round(totalProfit / ((time.time() - totalFirst) / 86400), 1)) response += "<b>Total profit<b> {:,} CRU\n".format( round(totalProfit, 1)) response += "<b>Total ROI (CRU)<b> {}%\n\n".format( round((totalProfit / totalInvest) * 100, 1)) return messages.markdown(response, bot.messenger)
def nodeRemove(bot, update, args): userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None response = messages.markdown("<u><b>Remove<b><u>\n\n", bot.messenger) logger.debug("remove - " + " ".join(args)) logger.debug("remove - user: {}".format(userId)) user = bot.database.getUser(userId) if user == None: response += messages.notActiveError(bot.messenger) elif len(args) < 1: response += messages.markdown( ("<b>ERROR<b>: Argument(s) required: <b>:ip0 :ipN<b>\n\n" "Example remove one: <cb>remove<ca> 21.23.34.44\n" "Example remove more: <cb>remove<ca> 21.23.34.44 21.23.34.43\n" "Example remove all: <cb>remove<ca> all\n"), bot.messenger) else: # Check if the user wants to remove all nodes. if len(args) == 1 and args[0] == 'all': bot.database.deleteNodesForUser(userId) response += messages.markdown( "Successfully removed <b>all<b> your nodes!\n", bot.messenger) else: # Else go through the parameters for arg in args: ip = util.validateIp(arg) if not ip: response += messages.invalidIpError(bot.messenger, arg) valid = False else: with bot.nodeList as nodeList: logger.info("remove - valid {}".format(ip)) node = nodeList.getNodeByIp(ip) if node == None: response += messages.nodeNotInListError( bot.messenger, ip) else: userNode = bot.database.getNodes( node.collateral, userId) if userNode == None: response += messages.nodeNotExistsError( bot.messenger, ip) else: bot.database.deleteNode( node.collateral, user['id']) response += messages.markdown( "Node successfully removed. <b>{}<b>\n". format(ip), bot.messenger) return response
def nodeUpdate(bot, update, args): userInfo = util.crossMessengerSplit(update) userId = userInfo['user'] if 'user' in userInfo else None userName = userInfo['name'] if 'name' in userInfo else None response = messages.markdown("<u><b>Update<b><u>\n\n", bot.messenger) logger.debug("update - " + " ".join(args)) logger.debug("update - user: {}".format(userId)) user = bot.database.getUser(userId) if user == None: response += messages.notActiveError(bot.messenger) elif not len(args): response += messages.markdown(( "<b>ERROR<b>: Argument(s) required: <b>ip0;newname0 ipN;newnameN<b>\n\n" "Where <b>ip<b> is the IP-Address of the node to update and <b>newname<b> the" " new name of the node.\n\n" "Example: <cb>update<ca> 23.132.143.34;MyNewNodeName\n"), bot.messenger) else: with bot.nodeList as nodeList: for arg in args: nodeEdit = arg.split(";") valid = True if len(nodeEdit) != 2: response += messages.invalidParameterError( bot.messenger, arg) valid = False else: ip = util.validateIp(nodeEdit[0]) name = util.validateName(nodeEdit[1]) if not ip: response += messages.invalidIpError( bot.messenger, nodeEdit[0]) valid = False if not name: response += messages.invalidNameError( bot.messenger, nodeEdit[1]) valid = False if valid: logger.info("update - {} {}".format(ip, user['id'])) node = nodeList.getNodeByIp(ip) if node == None: response += messages.nodeNotInListError( bot.messenger, ip) else: userNode = bot.database.getNodes( node.collateral, userId) if userNode == None: response += messages.nodeNotExistsError( bot.messenger, ip) else: bot.database.updateNode(node.collateral, user['id'], name) response += "Node successfully updated. {}\n".format( ip) return response