简体   繁体   中英

Contains is returning false

I worked a project I cloned from GIT, related to a bot.

The fact is that in some point, this bot uses the contains function, but this is not working. Using google I was able to put logs, and see that in fact the list contains the string, but it is always returning false.

This is the function:

var isFromUser = contains(cm.config.users, username, 'exists')

And this is the "log"

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false

As you can see, the user is in registersd users, but it is returning false.

These are the libs I am using in NPE:

drwxr-xr-x 4 root root 110 Nov 29 16:58 chokidar
drwxr-xr-x 4 root root 135 Nov 29 16:58 easylogger
drwxr-xr-x 6 root root 164 Nov 29 16:58 easywizard
drwxr-xr-x 3 root root 105 Nov 29 16:58 jsonfile-config-manager
drwxr-xr-x 2 root root 107 Nov 29 16:58 multiple-contains
drwxr-xr-x 5 root root 121 Nov 29 16:58 winston

Contains function:

// Compare item with filter or another item
var checkItem = function(item, itemOrFilter) {

  // Defining array of filters
  var filters = []
  if (!Array.isArray(itemOrFilter)) {
    if (itemOrFilter.key != undefined)
      filters.push(itemOrFilter)
  } else {
    filters = itemOrFilter
  }

  // Filtering
  if (filters.length > 0) {
    var i = 0
    var match = true
    while (match && i < filters.length) {
      match = (item[filters[i].key] === filters[i].value)
      i++
    }
    return match
  }

  // Matching
  else {
    return (JSON.stringify(item) === JSON.stringify(itemOrFilter))
  }
}

// Search item in array.
var searchInArray = function(array, itemOrFilter, mode) {
  var found = { "index": -1, "filtered": []}
  var i = 0
  var end = false
  while ( i < array.length && !end) {
    end = (mode != 'filter' && mode != 'repetitions' && found.index != -1)
    if (checkItem(array[i], itemOrFilter)) {
      found.index = i
      found.filtered.push(array[i])
    }
    i++
  }
  return found
}

// Search substring or char in string.
var searchInString = function(string, item, mode) {
  var filtered = string.match(new RegExp(item, 'g'))
  var index    = (filtered) ? string.indexOf(filtered[0]) : -1
  var found    = { "index": index
                 , "filtered": filtered || []
                 }
  return found
}

// Search digit or subnumber in number.
var searchInNumber = function(number, item, mode) {
  var strnumber = number.toString()
  return searchInString(strnumber, item)
}


// Main function
module.exports = function contains (container, item, mode) {

  mode = (mode || 'index')
  var found = { "index": -1, "filtered": []}

  // Searching in number
  if (typeof container == "number")
    found = searchInNumber(container, item, mode)

  // Searching in string
  else if (typeof container == "string" || container instanceof String)
    found = searchInString(container, item, mode)

  // Searching in array
  else if (Array.isArray(container))
    found = searchInArray(container, item, mode)
  else console.log("Container type not allowed")

  // TODO: Search into object's properties
  //else if (container instanceof Object)  found = searchInObject(container, item)

  if (mode == 'exists') return found.filtered.length > 0
  if (mode == 'index')  return found.index
  if (mode == 'filter') return found.filtered
  if (mode == 'repetitions') return found.filtered.length
  console.log("Mode not allowed")
  return null
}

These are the logs I did implemented:

// Filtering Messages
  var filterMessages = function(message) {
    // Formating message and preparing variables
    var username = (!message.from.username) ? message.from.id : message.from.username
    var messageToLog = logger.prepareMessage(message)
    // Checking message
    console.log('username: ' + username)
    console.log('cm.config.bot.owner: ' + cm.config.bot.owner)
    var isFromOwner = (username == cm.config.bot.owner)
    console.log('isFromOwner: ' + isFromOwner)
    console.log('cm.config.users: ' + cm.config.users)
    var isFromUser = contains(cm.config.users, username, 'exists')
    console.log('isFromUser: ' + isFromUser)
    var isCommand = (message.text && message.text.charAt(0) == '/' && message.text.length > 1)
    var activeUser = cmm.getActiveUserIdx(username)

And this was the output in log:

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false

Console out example of message where the username is retrieved:

Full log output, with user message:

username: 230592242
cm.config.bot.owner: 9587763
isFromOwner: false
cm.config.users: 230592242
isFromUser: false
into the condition !isFromOwner && !isFromUser
[info] - [msg_1566] @230592242 : /ventas 2016-11-30
returning...
[info] - [msg_1567] @IBM_monitor_bot : Sorry, this is a private bot.
         [msg_1567] @IBM_monitor_bot : You need an authorization to use it

Property user files:

// Loading config
  cm.addFile(cfgPath + 'literals.json', null, true)
  cm.addFile(cfgPath + 'users.json', null, true)
  cm.addFile(cfgPath + 'bot.json', null, true, buildBot)
}

Content of the users.json file:

[
        "230592242"
]

Sample of message:

[info] - [msg_1566] @230592242 : /ventas 2016-11-30

Message preparation:

// Filtering Messages
var filterMessages = function(message) {
// Formating message and preparing variables
var username = (!message.from.username) ? message.from.id : message.from.username
var messageToLog = logger.prepareMessage(message)

New log requested with console and config:

{ files: 
   { easylogger: 
      { name: '/root/node_modules/private-telegram-bot/config/logger.json',
        watch: true },
     literals: 
      { name: '/root/node_modules/private-telegram-bot/config/literals.json',
        watch: true },
     users: 
      { name: '/root/node_modules/private-telegram-bot/config/users.json',
        watch: true },
     bot: 
      { name: '/root/node_modules/private-telegram-bot/config/bot.json',
        watch: true },
     help: 
      { name: '/root/node_modules/private-telegram-bot/config/help.json',
        watch: true },
     commands: 
      { name: '/root/node_modules/private-telegram-bot/config/commands.json',
        watch: true } },
  easylogger: { enabled: true, transports: [ [Object], [Object], [Object] ] },
  literals: 
   { en: 
      { notAuthorizedUserError: 'Sorry, this is a private bot.\nYou need an authorization to use it',
        notCommandError: '',
        unknownCommandError: 'I don\'t know this command.\nWhat do you want from me?',
        operationCancelledError: 'Operation has been cancelled',
        nothingToCancelError: 'Sorry, nothing to cancel',
        commandTimeoutError: 'command has been cancelled by timeout',
        commandOnlyForOwnerError: 'Sorry, this command is only for bot owner',
        noHelpError: 'Sorry, I can\'t help you.\nI haven\'t any info about this command',
        wellcomeMessage: 'Hi @%username%.\nWellcome to %botname%.',
        emptyUsernameError: 'Your friend does not have a name?',
        userAuthorizedError: 'Needless to add to your friend.\nHe was among the elect!',
        addUserSuccessMessage: 'Done! Currently, your friend can run all your public commands',
        addUserWellcomeMessage: 'Do you want to allow to a friend use your bot?\nI need his Telegram username for this',
        removeUserSuccessMessage: 'Done! User has been removed',
        removeUserWellcomeMessage: 'Do you want remove a user?',
        userNotFoundError: 'This user doesn\'t exist',
        wrongTokenError: 'Something is worng with this bot token. Check it in bot.json file',
        tokenNotFoundError: 'Token not found. Add your bot token in \'token\' property in bot.json file',
        ownerNotFoundError: 'Bot owner not found. Add your Telegram alias (without \'@\') in \'owner\' property in bot.json file',
        unknownLanguageError: 'Which language do you speak? I don\'t understand you\nI speak english(en) and spanish(es)\nCheck your default language in your bot config file (bot.json)' },
     es: 
      { notAuthorizedUserError: 'Lo siento, este es un bot privado.\nNecesitas autorizacion para usarlo',
        notCommandError: 'Solo se permite usar comandos.\nTodos los comandos empiezan por /',
        unknownCommandError: 'No conozco ese comando.\nQue quieres de mi?',
        operationCancelledError: 'La operacion ha sido cancelada',
        nothingToCancelError: 'Lo siento, no hay nada que cancelar',
        commandTimeoutError: 'comando ha sido cancelado por timeout',
        commandOnlyForOwnerError: 'Lo siento, ese comando es solo para el dueño del bot',
        noHelpError: 'Lo, siento, no puedo ayudarte.\nNo tengo ninguna informacion sobre ese comando',
        wellcomeMessage: 'Hola @%username%.\nBienvenido a %botname%.',
        emptyUsernameError: 'Tu amigo no tiene nombre?',
        userAuthorizedError: 'No hace falta añadir a tu amigo.\nYa estaba entre los elegidos!',
        addUserSuccessMessage: 'Hecho! Tu amigo ya puede ejecutar todos los comandos publicos',
        addUserWellcomeMessage: 'Quieres que un amigo pueda usar tu bot?\nPara eso necesito su usuario de Telegram',
        removeUserSuccessMessage: 'Hecho! Usuario eliminado',
        removeUserWellcomeMessage: 'Quieres eliminar un usuario?',
        userNotFoundError: 'Ese usuario no existe',
        wrongTokenError: 'Algo va mal con ese token. Compruebalo en el fichero bot.json',
        tokenNotFoundError: 'Token no encontrado. Añade tu token en la propiedad \'token\' de bot.json',
        ownerNotFoundError: 'Propietario del bot no encontrado. Añade tu alias de Telegram (sin \'@\') en la propiedad \'owner\' de bot.json',
        unknownLanguageError: 'Que lengua hablas? No te entiendo\nSolo hablo ingles(en) y español(es)\nComprueba tu lenguaje por defecto en el fichero de configuracion del bot (bot.json)' } },
  users: [ '9587763' ],
  bot: 
   { token: 'XXXXXXXXXXXXXXXXX',
     owner: 'XXX9587763XXX',
     updates: { enabled: true },
     responseNoAuthorizedMessages: true,
     defaultLanguage: 'en' },
  help: { commands: [ [Object], [Object], [Object], [Object], [Object] ] },
  commands: 
   { publicScriptsPath: '../publicScripts/',
     adminScriptsPath: '../adminScripts/',
     commandTimeout: 60000,
     adminCommands: [ 'adduser', 'removeuser' ],
     publicCommands: [ 'ventas' ] } }
[ '9587763' ]
username: 9587763
username length: 7
number
cm.config.bot.owner: XXX9587763XXX
false
isFromOwner: false
cm.config.users: 9587763
cm.config.users length: 7
object
isFromUser: false
into the condition !isFromOwner && !isFromUser
[info] - [msg_1620] @9587763 : /ventas

Update : As discussed in the comments, you have to use the for loop as below since cm.config.users is an array.

var isFromUser = false;
for(var i = 0; i < cm.config.users.length; i++) {
   isFromUser = contains(cm.config.users[i], username, 'exists');
   if(isFromUser) break;
}

The function is working as expected and no issues with this. When I run the function with the value same as 230592242 mentioned in cm.config.users: 230592242 , its returning true as expected. When running with a value other than this, it returns false .

I have given a sample snippet below to confirm this which you can run by clicking Run code snippet at the bottom.

You have to check what is the value of username used at contains(cm.config.users, username, 'exists')

Since the config value used is 230592242 from the line cm.config.users: 230592242 which seems like a "user id" and not "user name" which you are trying to check.

That's why you are getting false .

 // Compare item with filter or another item var checkItem = function(item, itemOrFilter) { // Defining array of filters var filters = [] if (!Array.isArray(itemOrFilter)) { if (itemOrFilter.key != undefined) filters.push(itemOrFilter) } else { filters = itemOrFilter } // Filtering if (filters.length > 0) { var i = 0 var match = true while (match && i < filters.length) { match = (item[filters[i].key] === filters[i].value) i++ } return match } // Matching else { return (JSON.stringify(item) === JSON.stringify(itemOrFilter)) } } // Search item in array. var searchInArray = function(array, itemOrFilter, mode) { var found = { "index": -1, "filtered": []} var i = 0 var end = false while ( i < array.length && !end) { end = (mode != 'filter' && mode != 'repetitions' && found.index != -1) if (checkItem(array[i], itemOrFilter)) { found.index = i found.filtered.push(array[i]) } i++ } return found } // Search substring or char in string. var searchInString = function(string, item, mode) { var filtered = string.match(new RegExp(item, 'g')) var index = (filtered) ? string.indexOf(filtered[0]) : -1 var found = { "index": index , "filtered": filtered || [] } return found } // Search digit or subnumber in number. var searchInNumber = function(number, item, mode) { var strnumber = number.toString() return searchInString(strnumber, item) } // Main function function contains (container, item, mode) { mode = (mode || 'index') var found = { "index": -1, "filtered": []} // Searching in number if (typeof container == "number") found = searchInNumber(container, item, mode) // Searching in string else if (typeof container == "string" || container instanceof String) found = searchInString(container, item, mode) // Searching in array else if (Array.isArray(container)) found = searchInArray(container, item, mode) else console.log("Container type not allowed") // TODO: Search into object's properties //else if (container instanceof Object) found = searchInObject(container, item) if (mode == 'exists') return found.filtered.length > 0 if (mode == 'index') return found.index if (mode == 'filter') return found.filtered if (mode == 'repetitions') return found.filtered.length console.log("Mode not allowed") return null } var cm = { config: { users: [ 230592242 ] } }; var userId = 230592242; console.log('Checking the value user id "' + userId + '"..'); var isFromUser = false; for(var i = 0; i < cm.config.users.length; i++) { isFromUser = contains(cm.config.users[i], userId, 'exists'); if(isFromUser) break; } console.log(isFromUser); var username = 'test' console.log('Checking the value user name "' + username + '"..'); isFromUser = false; for(var i = 0; i < cm.config.users.length; i++) { isFromUser = contains(cm.config.users[i], username, 'exists'); if(isFromUser) break; } console.log(isFromUser);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM