Récupération d'un tableau retourné par une fonction

en JavaScript

Le problème exposé dans ce sujet a été résolu.

Bonsoir,

J’essaie depuis un certains de temps réécrire un projet d’une manière plus propre mais je suis bloqué à fichier qui ne se comporte pas comme je le souhaitais. J’ai fait plusieurs tests mais je ne comprends pas pourquoi ça ne fonctionne pas.

Pour contextualiser, il s’agit d’un morceau de code pour un bot Discord qui s’active dès qu’un canal est modifié (qu’importe ce qui est modifié). Pour simplifier le problème, je vais en sélection un point précis : celui de la modification du nom d’un canal textuel.

Tout d’abord, on passe par le switch où l’on vérifie de quel type est le canal. On va ensuite stocker le message à envoyer.

switch(newChannel.type) {
    case 'text':
        message = this.textUpdate(oldChannel, newChannel);
        break;
    case 'voice':
        message = this.voiceUpdate(oldChannel, newChannel);
}

(Je précise que j’utilise i18next pour la gestion des chaînes de caractères.) Dans la fonction gérant la modification d’un canal textuel, on s’intéressera donc au dernier bloc.

else if (newChannel.name !== oldChannel.name) {
    return message = {
        content: i18n.t('events:channel.update.name.text'),
        options: { oldChannel: `**#${oldChannel.name}**`, newChannel: newChannel, interpolation: { escapeValue: false }}
    };
}

Une fois qu’on a les bonnes valeurs pour l’envoie du message, on le fait.

return newChannel.guild.channels.get(config.defaultChannel).send(i18n.t(message.content, message.options));

Or, voici le message que j’obtiens à la modification du titre d’un canal textuel : The text channel is now called . Or, la chaîne de caractère est la suivante.

"text": "The text channel {{oldChannel}} is now called {{newChannel}}."

Voici le code en entier :

const { Listener } = require('discord-akairo');
const i18n = require('i18next');
const config = require ('../../config.json');

class ChannelUpdateListener extends Listener {
    constructor() {
        super('channelUpdate', {
            emitter: 'client',
            eventName: 'channelUpdate',
            category: 'channel'
        });
    }

    exec(oldChannel, newChannel) {
        let message;

        switch(newChannel.type) {
            case 'text':
                message = this.textUpdate(oldChannel, newChannel);
                break;
            case 'voice':
                message = this.voiceUpdate(oldChannel, newChannel);
        }

        return newChannel.guild.channels.get(config.defaultChannel).send(i18n.t(message.content, message.options));
    }

    textUpdate(oldChannel, newChannel) {
        let message = {};

        if (newChannel.topic !== oldChannel.topic) {
            const isEmpty = str => {
                return (!str || 0 === str.length);
            }

            message.options = { channel: newChannel, interpolation: { escapeValue: false }};

            if(isEmpty(newChannel.topic)) {
                return message.content = i18n.t('events:channel.update.topic.remove');
            } else {
                return message = i18n.t('events:channel.update.topic.set');
            }
        } else if (newChannel.name !== oldChannel.name) {
            return message = {
                content: i18n.t('events:channel.update.name.text'),
                options: { oldChannel: `**#${oldChannel.name}**`, newChannel: newChannel, interpolation: { escapeValue: false }}
            };
        }
    }

    voiceUpdate(oldChannel, newChannel) {
        if (newChannel.name !== oldChannel.name) {
            return message = {
                content: i18n.t('events:channel.update.name.voice'),
                options: { oldChannel: `**${oldChannel.name}**`, newChannel: newChannel, interpolation: { escapeValue: false }}
            }
        }
    }
}

module.exports = ChannelUpdateListener

Ça fait quelque jours que je suis dessus. J’espère pourvoir passer à autre choses. Merci d’avance !

Je pense que i18next.t, s’utilise comme ça (notamment pour le premier appel) :

// key = 'hello {{what}}'
i18next.t('key', { what: 'world' }); // -> hello WORLD

Essaye :

// key = 'hello {{what}}'
const message = i18next.t('key')
console.log(message)
i18next.t(message , { what: 'world' });

Ça reproduira peut-être ton problème.

Mon Dieu, j’ai mal utilisé les variables. Je ne sais pas si tu m’expliquais ça mais je l’ai compris grâce à ton message. En fait, au lieu de :

else if (newChannel.name !== oldChannel.name) {
    return message = {
        content: i18n.t('events:channel.update.name.text'),
        options: { oldChannel: `**#${oldChannel.name}**`, newChannel: newChannel, interpolation: { escapeValue: false }}
    };
}

Il faut faire :

else if (newChannel.name !== oldChannel.name) {
    return message = {
        content: 'events:channel.update.name.text',
        options: { oldChannel: `**#${oldChannel.name}**`, newChannel: newChannel, interpolation: { escapeValue: false }}
    };
}
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte