Example #1
0
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)
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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
Example #7
0
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)
Example #9
0
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
Example #10
0
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)
Example #11
0
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)
Example #12
0
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
Example #13
0
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)
Example #14
0
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
Example #15
0
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