[英]Contains is returning false
I worked a project I cloned from GIT, related to a bot.我做了一个从 GIT 克隆的项目,与机器人有关。
The fact is that in some point, this bot uses the contains function, but this is not working.事实是,在某些时候,这个机器人使用了 contains 函数,但这不起作用。 Using google I was able to put logs, and see that in fact the list contains the string, but it is always returning false.
使用谷歌我能够放置日志,并看到实际上列表包含字符串,但它总是返回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.如您所见,用户在 registersd 用户中,但返回 false。
These are the libs I am using in NPE:这些是我在 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: users.json 文件的内容:
[
"230592242"
]
Sample of message:消息示例:
[info] - [msg_1566] @230592242 : /ventas 2016-11-30 [信息] - [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.更新:如评论中所述,您必须使用如下
for
循环,因为cm.config.users
是一个数组。
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.当我与相同值运行函数
230592242
中提到cm.config.users: 230592242
,其回归true
预期。 When running with a value other than this, it returns false
.当使用除此以外的值运行时,它返回
false
。
I have given a sample snippet below to confirm this which you can run by clicking Run code snippet
at the bottom.我在下面给出了一个示例片段来确认这一点,您可以通过单击底部的
Run code snippet
来Run code snippet
。
You have to check what is the value of username
used at contains(cm.config.users, username, 'exists')
您必须检查在
contains(cm.config.users, username, 'exists')
使用的username
的值是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.由于使用的配置值是
230592242
cm.config.users: 230592242
行中的cm.config.users: 230592242
,这似乎是您要检查的“用户 ID”而不是“用户名”。
That's why you are getting false
.这就是为什么你得到
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.