def registerUser(self, nBonusSlots=0): try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() #add the user to the Users table count = 0 count = myDAL.insertUpdateDelete("""INSERT INTO Users (ID, totalSlots, usedSlots, bonusSlots) VALUES(?,?,?,?)""",[self.discordID, 0, 0, nBonusSlots]) if (count != 1): self.logger.error("NodeBotUser - registerUser - Failed to insert user to Users table. BonusSlots: {}. ErrRefID: {}".format(str(nBonusSlots), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to insert required data. Please contact team." #update user object info self.isRegistered = True self.totalSlots = nBonusSlots self.usedSlots = 0 except Exception as e: self.logger.error("NodeBotUser - registerUser - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to get required data. Please contact team." else: myDAL.commit() myDAL.addSysLogEntry("log","registerUser", "Success registerUser. User: {} BonusSlots: {}.".format(str(self.discordID), str(nBonusSlots))) myDAL.disconnect() return True, "[return value not used]"
def removeNode(self, sTicker, sCollateralAddress): sTXID = "" nTXIndex = "" sIP = "" try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() # verify this collateral address is registered to the user row = None row = myDAL.selectData("single", """SELECT txID, txIndex, IP FROM UserNodes WHERE coinTicker = ? and collateralAddress = ? and userID = ?""",[sTicker, sCollateralAddress, self.discordID]) if row: sTXID = row["txID"] nTXIndex = int(row["txIndex"]) sIP = row["IP"] else: myDAL.disconnect() self.logger.warning("NodeBotUser - removeNode - User attempted to remove a node that was not found for them. User: {} Ticker: {} CollateralAddress: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sCollateralAddress, self.errRefID)) return False, "A {} node with collateral address of {} was not found for you in the system.".format(sTicker, sCollateralAddress), "[return value not used]" # mark the record to REMOVE from the UserNodes table count = 0 count = myDAL.insertUpdateDelete("""Update UserNodes set systemStatus = ? WHERE userID = ? and coinTicker = ? and collateralAddress = ?""", ['REMOVE', self.discordID, sTicker, sCollateralAddress]) if (count != 1): self.logger.error("NodeBotUser - removeNode - Failed to mark node as systemStatus of REMOVE in UserNodes table. User: {} Ticker: {} CollateralAddress: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sCollateralAddress, self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to delete required data. Please contact team.", "[return value not used]" #mark this IP as unused count = 0 count = myDAL.insertUpdateDelete("""UPDATE CoinIPs SET isUsed=0 WHERE coinTicker = ? AND IP = ?""",[sTicker, sIP]) if (count != 1): self.logger.error("NodeBotUser - removeNode - IP address failed to be marked as unused. Ticker: {} IP: {}. ErrRefID: {}".format(sTicker, sIP, self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team." # update user node count in database and in object if not NZR node if (sTicker != 'NZR'): self.usedSlots = self.usedSlots - 1 count = 0 count = myDAL.insertUpdateDelete("""UPDATE Users SET usedSlots = usedSlots - 1 WHERE ID = ?""", [self.discordID]) if (count != 1): self.logger.error("NodeBotUser - removeNode - Failed to decrement used slot count for the user. UserID: {} Ticker: {} CollateralAddress: {} IPAddress: {} TXID: {} TXindex: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sCollateralAddress, sIP, sTXID, str(nTXIndex), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team.", "[return value not used]" except Exception as e: self.logger.error("NodeBotUser - removeNode - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to get required data. Please contact team.", "[return value not used]" else: myDAL.commit() myDAL.addSysLogEntry("log", "removeNode", "Success mark node for removal. UserID: {} Ticker: {} CollateralAddress: {} IPAddress: {} TXID: {} TXindex: {}".format(str(self.discordID), sTicker, sCollateralAddress, sIP, sTXID, str(nTXIndex))) myDAL.disconnect() return True, sTXID, nTXIndex
def registerNode(self, sCollateralAddress, nFreeNodes): try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() #verify this address is not already registered in the system row = None row = myDAL.selectData("single", """SELECT userID FROM RegisteredNZRNodes WHERE address = ?""", [sCollateralAddress]) if row: myDAL.disconnect() if(row["userID"] == self.discordID): self.logger.error("NodeBotUser - registerNode - Node already registered by this user. User: {} Address: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, self.errRefID)) return False, "You have already registered this node. Please contact team if you believe this is an error." else: self.logger.error("NodeBotUser - registerNode - Node already registered by another user. UserTryingToAdd: {} Address: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, self.errRefID)) return False, "This node is already registered by another user in the system. Please contact team if you believe this is an error." #add the record to the RegisteredNZRNodes table count = 0 count = myDAL.insertUpdateDelete("""INSERT INTO RegisteredNZRNodes (address, userID, nodesAllowed) VALUES(?,?,?)""",[sCollateralAddress, self.discordID, nFreeNodes]) if (count != 1): self.logger.error("NodeBotUser - registerNode - Failed to insert node to RegisteredNZRNodes table. User: {} CollateralAddress: {} NodesAllowed: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, str(nFreeNodes), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to insert required data. Please contact team." #update user node count in database and in object self.totalSlots = self.totalSlots + nFreeNodes count = 0 count = myDAL.insertUpdateDelete("""UPDATE Users SET totalSlots = totalSlots + ? WHERE ID = ?""",[nFreeNodes, self.discordID]) if (count != 1): self.logger.error("NodeBotUser - registerNode - Failed to increment total slots for the user. User: {} Address: {} FreeSlots: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, str(nFreeNodes), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team." except Exception as e: self.logger.error("NodeBotUser - registerNode - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to get required data. Please contact team." else: myDAL.commit() myDAL.addSysLogEntry("log","registerNode", "Success registernode. User: {} Address: {} FreeSlots: {}.".format(str(self.discordID), sCollateralAddress, str(nFreeNodes))) myDAL.disconnect() return True, "[return value not used]"
def unregisterNode(self, sCollateralAddress): nFreeSlots = 0 try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() # verify this collateral address is registered to the user row = None row = myDAL.selectData("single", """SELECT nodesAllowed FROM RegisteredNZRNodes WHERE userID = ? and address = ?""",[self.discordID, sCollateralAddress]) if row: nFreeSlots = row["nodesAllowed"] else: myDAL.disconnect() self.logger.warning("NodeBotUser - unregisterNode - User attempted to unregister a node that was not found for them. User: {} CollateralAddress: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, self.errRefID)) return False, "No NZR node with collateral address of {} found to be registered for you in the system.".format(sCollateralAddress) # remove the record from the RegisteredNZRNodes table count = 0 count = myDAL.insertUpdateDelete("""DELETE FROM RegisteredNZRNodes WHERE userID = ? and address = ?""", [self.discordID, sCollateralAddress]) if (count != 1): self.logger.error("NodeBotUser - unregisterNode - Failed to remove node from RegisteredNZRNodes table. User: {} CollateralAddress: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to delete required data. Please contact team." # update user free node count in database and in object self.totalSlots = self.totalSlots - nFreeSlots count = 0 count = myDAL.insertUpdateDelete("""UPDATE Users SET totalSlots = totalSlots - ? WHERE ID = ?""", [nFreeSlots, self.discordID]) if (count != 1): self.logger.error("NodeBotUser - unregisterNode - Failed to decrement total slot count for the user. UserID: {} CollateralAddress: {} FreeSlotDecrement: {}. ErrRefID: {}".format(str(self.discordID), sCollateralAddress, str(nFreeSlots), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team." except Exception as e: self.logger.error("NodeBotUser - unregisterNode - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to get required data. Please contact team." else: myDAL.commit() myDAL.addSysLogEntry("log", "unregisterNode", "Success unregister node. UserID: {} CollateralAddress: {} FreeSlotDecrement: {}".format(str(self.discordID), sCollateralAddress, str(nFreeSlots))) myDAL.disconnect() return True, "[return value not used]"
def unregisterUser(self): nBonusSlots = 0 oAddedNodes = [] oRegisteredNodes = [] #Get a listing of all nodes the user has added to the system #the listNodes() function is self contained so keep it in its own try block try: bTmp, sTmp = self.listAddedNodes() if (bTmp): oAddedNodes = sTmp else: # this could mean an error, but we'll ignore any error and assume it means the user has no nodes pass except Exception as e: self.logger.error("NodeBotUser - unregisterUser - Unknown error occured getting listing of added nodes. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) return False, "Failed to obtain required data. Please contact team." #Get a listing of all registered nodes #the listRegisteredNodes() function is self contained so keep it in its own try block try: bTmp, sTmp = self.listRegisteredNodes() if (bTmp): oRegisteredNodes = sTmp else: # this could mean an error, but we'll ignore any error and assume it means the user has no nodes pass except Exception as e: self.logger.error("NodeBotUser - unregisterUser - Unknown error occured getting listing of registered nodes. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) return False, "Failed to obtain required data. Please contact team." #Remove all the added nodes #the removeNode() function is self contained so keep it in its own try block try: for node in oAddedNodes[1:]: #skip first entry because it is a header entry self.removeNode(node[0], node[2]) #the ticker is first item in the list, the collateral address is the 3rd item except Exception as e: self.logger.error("NodeBotUser - unregisterUser - Error occured removing added nodes. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) return False, "Failed to remove required data. Please contact team." #Unregister all nodes #the unregisterNode() function is self contained so keep it in its own try block try: for node in oRegisteredNodes[1:]: #skip first entry because it is a header entry self.unregisterNode(node[0]) #the collateral address is the 1st item except Exception as e: self.logger.error("NodeBotUser - unregisterUser - Error occured unregistering nodes. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) return False, "Failed to remove required data. Please contact team." #Now remove the user try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() #get existing data for this user to add to system log when we delete (for recovery purposes) row = None row = myDAL.selectData("single", """SELECT bonusSlots FROM Users WHERE ID = ?""", [self.discordID]) if row: nBonusSlots = row["bonusSlots"] else: self.logger.error("NodeBotUser - unregisterUser - No record found for user id {}. ErrRefID: {}".format(str(self.discordID), self.errRefID)) myDAL.disconnect() return False, "Failed to select required data. Please contact team." #remove the user from the Users table count = 0 count = myDAL.insertUpdateDelete("""DELETE FROM Users WHERE ID = ?""",[self.discordID]) if (count != 1): self.logger.error("NodeBotUser - unregisterUser - Failed to delete user from Users table. User: {}. ErrRefID: {}".format(str(self.discordID), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to delete required data. Please contact team." #update user object info self.isRegistered = False self.totalSlots = 0 self.usedSlots = 0 except Exception as e: self.logger.error("NodeBotUser - unregisterUser - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to delete required data. Please contact team." else: myDAL.commit() myDAL.addSysLogEntry("log","unregisterUser", "Success unregisterUser. User: {} BonusSlots: {}.".format(str(self.discordID), str(nBonusSlots))) myDAL.disconnect() return True, "[return value not used]"
def addNode(self, sTicker, sAliasName, nPort, sCollateralAddress, sTXID, nTXIndex): sDefaultAliasName = "" sIPAddress = "" sMasternodeKey = "" sDaemonType = "" nPhantomEpDateTime = 0 try: myDAL = DAL(self.databaseFile, self.logger, self.loggingLevel, self.errRefID) myDAL.connect() #verify this UTXO is not already registered in the system row = None row = myDAL.selectData("single", """SELECT userID FROM UserNodes WHERE coinTicker = ? and txID = ? and txIndex=?""", [sTicker, sTXID, nTXIndex], False) if row: myDAL.disconnect() if(row["userID"] == self.discordID): self.logger.error("NodeBotUser - addNode - UTXO already used by this user. Ticker: {} TXID: {} TXIndex: {}. ErrRefID: {}".format(sTicker, sTXID, str(nTXIndex), self.errRefID)) return False, "You have already added a node with this transaction ID and transaction index. If needed, please delete it before adding it again, or contact team if you believe this is an error." else: self.logger.error("NodeBotUser - addNode - UTXO already used by another user. UserTryingToAdd: {} Ticker: {} TXID: {} TXIndex: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sTXID, str(nTXIndex), self.errRefID)) return False, "Transaction ID and transaction index are already added by another user in the system. Please try again, or contact team if you believe this is an error." #get an unused IP address and default alias name for this coin row = None row = myDAL.selectData("single", """SELECT IP, defaultAlias, masternodeKey, daemonType, phantomEpDateTime FROM CoinIPs WHERE coinTicker = ? and isUsed=0 ORDER BY ID LIMIT 1""", [sTicker]) if row: sDefaultAliasName = row["defaultAlias"] sIPAddress = row["IP"] sMasternodeKey = row["masternodeKey"] sDaemonType = row["daemonType"] nPhantomEpDateTime = row["phantomEpDateTime"] else: self.logger.error("NodeBotUser - addNode - No unused coin IP address found for coin {}. ErrRefID: {}".format(sTicker, self.errRefID)) myDAL.disconnect() return False, "System capacity for {} coin reached. Please contact team to inform them.".format(sTicker) #if alias name is default, then use the default one if (sAliasName.lower() == 'default'): sAliasName = sDefaultAliasName #verify aliasname is unique for this user/ticker combination (an alias name must be unique in a user's wallet) row = None row = myDAL.selectData("single", """SELECT 1 FROM UserNodes WHERE userID = ? and coinTicker = ? and aliasName=?""", [str(self.discordID), sTicker, sAliasName.lower()],False) if row: myDAL.disconnect() self.logger.error("NodeBotUser - addNode - Aliasname already in use by this user. User: {} Ticker: {} AliasName: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sAliasName, self.errRefID)) return False, "You are already using alias name of {} for coin {}. The alias name is case-insensitive (meaning MN1 = Mn1 = mN1 = mn1). This is not allowed. Please remove the other node if it is not in use or choose a different alias name. Please contact a team member if you belive this is in error.".format(sAliasName, sTicker) #verify this collateral address is not already registered in the system for this coin row = None row = myDAL.selectData("single", """SELECT userID FROM UserNodes WHERE coinTicker = ? and collateralAddress = ?""", [sTicker, sCollateralAddress], False) if row: myDAL.disconnect() if(row["userID"] == self.discordID): self.logger.error("NodeBotUser - addNode - Collateral address for UTXO already used by this user. Ticker: {} TXID: {} TXIndex: {} CollateralAddress {}. ErrRefID: {}".format(sTicker, sTXID, str(nTXIndex), sCollateralAddress, self.errRefID)) return False, "You have already registered a {} node with collateral address of {}. If needed, please delete it before adding it again, or contact team if you believe this is an error.".format(sTicker, sCollateralAddress) else: self.logger.error("NodeBotUser - addNode - Collateral address for UTXO already used by another user. UserTryingToAdd: {} Ticker: {} TXID: {} TXIndex: {} CollateralAddress {}. ErrRefID: {}".format(str(self.discordID), sTicker, sTXID, str(nTXIndex), sCollateralAddress, self.errRefID)) return False, "A {} node with collateral address of {} is already registered by another user in the system. Please try again, or contact team if you believe this is an error.".format(sTicker, sCollateralAddress) #mark this IP as used count = 0 count = myDAL.insertUpdateDelete("""UPDATE CoinIPs SET isUsed=1 WHERE coinTicker = ? AND IP = ?""",[sTicker, sIPAddress]) if (count != 1): self.logger.error("NodeBotUser - addNode - IP address failed to be marked as used. Ticker: {} IP: {}. ErrRefID: {}".format(sTicker, sIPAddress, self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team." #add the record to the UserNodes table count = 0 count = myDAL.insertUpdateDelete("""INSERT INTO UserNodes (userID, coinTicker, aliasName, genKey, IP, coinPort, collateralAddress, txID, txIndex, isActive, systemStatus, daemonType, phantomEpDateTime) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)""",[self.discordID, sTicker, sAliasName, sMasternodeKey, sIPAddress, nPort, sCollateralAddress, sTXID, nTXIndex, 1, 'NEW', sDaemonType, nPhantomEpDateTime]) if (count != 1): self.logger.error("NodeBotUser - addNode - Failed to insert node to UserNodes table. User: {} Ticker: {} AliasName: {} GenKey: {} IP: {} Port: {} CollateralAddress: {} TXID: {} TXIndex: {} DaemonType: {} PhantomEpDateTime: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sAliasName, sMasternodeKey, sIPAddress, str(nPort), sCollateralAddress, sTXID, str(nTXIndex), sDaemonType, str(nPhantomEpDateTime), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to insert required data. Please contact team." #update user node count in database and in object if not NZR if(sTicker != 'NZR'): self.usedSlots = self.usedSlots + 1 count = 0 count = myDAL.insertUpdateDelete("""UPDATE Users SET usedSlots = usedSlots + 1 WHERE ID = ?""",[self.discordID]) if (count != 1): self.logger.error("NodeBotUser - addNode - Failed to increment used count for the user. User: {} Ticker: {} AliasName: {} GenKey: {} IP: {} Port: {} CollateralAddress: {} TXID: {} TXIndex: {} DaemonType: {} PhantomEpDateTime: {}. ErrRefID: {}".format(str(self.discordID), sTicker, sAliasName, sMasternodeKey, sIPAddress, str(nPort), sCollateralAddress, sTXID, str(nTXIndex), sDaemonType, str(nPhantomEpDateTime), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to update required data. Please contact team." except Exception as e: self.logger.error("NodeBotUser - addNode - Error occured. Error: {}. ErrRefID: {}".format(str(e), self.errRefID)) myDAL.rollback() myDAL.disconnect() return False, "Failed to get required data. Please contact team." else: myDAL.commit() myDAL.addSysLogEntry("log","addNode", "Success addnode. User: {} Ticker: {} AliasName: {} GenKey: {} IP: {} Port: {} CollateralAddress: {} TXID: {} TXIndex: {} DaemonType: {} PhantomEpDateTime: {}.".format(str(self.discordID), sTicker, sAliasName, sMasternodeKey, sIPAddress, str(nPort), sCollateralAddress, sTXID, str(nTXIndex), sDaemonType, str(nPhantomEpDateTime))) myDAL.disconnect() return True, (sAliasName + " " + sIPAddress + ":" + str(nPort) + " " + sMasternodeKey + " " + sTXID + " " + str(nTXIndex))