Je travaille sur un bot Discord en utilisant node.js. L'idée est assez simple, le bot vérifie les messages de chat pour certaines phrases qui le déclenchent pour faire diverses actions. Principalement lié à la fourniture d'informations sur divers serveurs de jeux.

J'ai fait fonctionner le robot et il fait les bases de ce que je voulais qu'il fasse.

Je cherche cependant à étendre un peu ses fonctionnalités.

Fondamentalement, lorsque les gens saisissent un certain terme comme «serveur 1v1», le bot donnera les informations de connexion à ce serveur et interrogera l'état actuel du serveur.

J'utilise un package npm appelé gamedig pour ce faire.

Le code est comme suit

//Query Minecraft Server
var serverInfo = function(chatTrigger){

//create an array of servers
//Name of the array arrays within the array is the chat trigger, the first value of each chat trigger array is the query mode for gamedir, second value is the IP or server query URL.
var namedServerArrays = {
    '1v1' : ["csgo","192.168.1.1",2016],
    '10man' : ["csgo","192.168.1.2",27017],
    'minecraft' : ["minecraft","192.168.1.3",2018]
}

//Convert named array data based on the chat triggers to a variable.
//This doesn't have to be done but gamedig gets a little pissy sometimes if you feed it straight arrays. No idea why.
var gameType = namedServerArrays[chatTrigger][0];
var gameHost = namedServerArrays[chatTrigger][1];
var gamePort = namedServerArrays[chatTrigger][2];

//Query server based on chatTrigger input.
Gamedig.query({
        type: gameType,
        host: gameHost,
        port: gamePort
    },
function(e,state) {
        if(e){
            console.log("Server is offline");
            return "Server connection error.";
        }else{
            var playersOnline = state.players.length;
            var currentMap = state.map;

                //Vomit a bunch of error checking.
                console.log("The " + chatTrigger + " server is online.");
                console.log("Players Online: " + playersOnline);
                console.log("Server map: " + currentMap);
                console.log("User was given " + chatTrigger +" server connection information.");

                return [playersOnline,currentMap];
        }
});
//End Query 

var queryReturnState = Gamedig.query();}

Ce que je raccroche, c'est comment renvoyer les données de la fonction de requête gamedig à la fonction serverInfo afin qu'elles puissent ensuite être renvoyées par la fonction serverInfo à tout ce qui utilise la fonction serverInfo?

Dans son état actuel, la console enregistre toutes les données pertinentes à jour et correctement, mais finira par rencontrer un UnhandledPromiseRejectionWarming.

(node:1479) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot set property 'callback' of undefined (node:1479) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

J'ai également du mal à comprendre comment gérer les promesses dans node.js.

Toute aide pour que cela fonctionne et comprenne mieux est appréciée.

0
Jem 4 avril 2017 à 01:54

2 réponses

Meilleure réponse

Cela ressemble à un bogue dans la bibliothèque sous-jacente ou à un problème d'utilisation de la bibliothèque. Essayez d'utiliser l 'promesse API qui détectera au moins l'erreur, et évitez éventuellement d'utiliser des rappels dans la bibliothèque gamedig sous-jacente.

Lorsque vous utilisez une API de promesse, tout ce que vous avez à faire est return une valeur ou la promesse d'une valeur de vos fonctions.

Partout où vous appelez serverInfo(), utilisez un .then pour gérer le résultat de la promesse asynchrone, puis envoyez-le au chat, quel qu'il soit.

serverInfo(blah).then(function(result){
   chat.send(result)
})

Code promis

// Query Minecraft Server
var serverInfo = function(chatTrigger){
  var namedServerArrays = {
    '1v1' : ["csgo","192.168.1.1",2016],
    '10man' : ["csgo","192.168.1.2",27017],
    'minecraft' : ["minecraft","192.168.1.3",2018]
  }

  // Convert named array data based on the chat triggers to a variable.
  // This doesn't have to be done but gamedig gets a little pissy sometimes if you feed it straight arrays. No idea why.
  var gameType = namedServerArrays[chatTrigger][0];
  var gameHost = namedServerArrays[chatTrigger][1];
  var gamePort = namedServerArrays[chatTrigger][2];

  //Query server based on chatTrigger input.
  return Gamedig.query({
        type: gameType,
        host: gameHost,
        port: gamePort
    })
    .then(function(state){
        var playersOnline = state.players.length;
        var currentMap = state.map;

        //Vomit a bunch of error checking.
        console.log("The " + chatTrigger + " server is online.");
        console.log("Players Online: " + playersOnline);
        console.log("Server map: " + currentMap);
        console.log("User was given " + chatTrigger +" server connection information.");

        return [playersOnline,currentMap];
    })
    .catch(function(error){
        console.error(error);
        return 'Server connection error';
    });
}
1
Matt 4 avril 2017 à 03:59

Cela est probablement dû au var queryReturnState = Gamedig.query(); au bas de votre extrait de code.

Selon l'API, Gamedig.query nécessite au moins un paramètre. Comme le paramètre était manquant, il essayait probablement de définir callback sur cet objet inexistant.

0
Para 9 août 2017 à 11:22