2016-07-12 3 views
0

Итак, у меня есть бот Kik, над которым я сейчас работаю, который использует клавиатуру, чтобы предлагать вещи, которые пользователь может сказать боту, как это делают большинство боксеров Kik. Для разных пользователей я хочу, чтобы у меня появлялись разные опции. Я создал функцию, чтобы проверить, является ли текущий пользователь одним из этих специальных пользователей, и если да, то для отображения другой опции для них. У меня есть оценка от многих тестов, что функция возвращает true, как бы параметры клавиатуры не изменялись от обычного пользователя. Вот мой кодЭлементы клавиатуры Kik Bot не меняются

message.stopTyping(); 
        if (userIsAdmin(message.from)) //This function returns the boolean true 
        { 
        message.reply(Bot.Message.text("I don't understand what you are trying to ask me. Please reply with something I can work with.").addResponseKeyboard(["Homework", "Admin Options"])) 
        } 
        else 
        { 
        message.reply(Bot.Message.text("I don't understand what you are trying to ask me. Please reply with something I can work with.").addResponseKeyboard(["Homework"])) //The bot always displays this as the keyboard, no matter if the user is an admin or not 
        } 
        break; 
        } 
+1

ли ваше сообщение действительно присылают (= вы получите сообщение о приложении Кик?). –

+0

@ RémiVansteelandt Да, все действует так, как должно, за исключением того, что предлагаемая клавиатура не меняется. – pjtnt11

+0

Я бы сделал сообщения для разных целей для тестирования. Похоже, вы просто отправляете второе сообщение. Если вы измените тела сообщений, вы сможете увидеть – quikst3r

ответ

0

Узел Js любит продолжать программы, когда функции запускаются, так что может потребоваться больше запросов. Функция userIsAdmin() делает веб-запрос к firebase, поэтому, беря всего лишь часть секунды для загрузки данных, достаточно долго, чтобы он возвращал false до того, как это было сделано. Мне нужно было отредактировать функцию userIsAdmin(), чтобы она приняла обратный вызов в качестве параметра и затем вызвала его. Вот мой новый код:

let sendingMessage = Bot.Message.text("I don't understand what you are trying to ask me. Please reply with something I can work with.") 

    adminCheck(user, function(isAdmin) 
       { 
       if (isAdmin) 
       { 
       bot.send(sendingMessage.addResponseKeyboard(adminSuggestedResponces), user) 
       } 
       else 
       { 
       bot.send(sendingMessage.addResponseKeyboard(userSuggestedResponces), user) 
       } 
       }); 

И вот моя adminCheck функция:

var isAdmin = false 
    adminsRef.on("child_added", function(snapshot) 
       { 
       if(user == snapshot.key && snapshot.val() == true) 
       { 
       isAdmin = true 
       } 
       }); 

    adminsRef.once("value", function(snapshot) 
        { 
        callback(isAdmin) 
        }); 
+2

Просто, чтобы помочь вам в случае возникновения похожих проблем в будущем, это не имеет никакого отношения к времени выполнения. Node.js работает асинхронно большую часть времени, чтобы не допустить, чтобы основной поток зависал. Таким образом, вы можете обрабатывать несколько запросов параллельно. Я бы рекомендовал проверить обещания, которые являются более чистым способом борьбы с такими вещами, чем простые обратные вызовы. –