Bot discord

!stats <pseudo> (donne ensuite le nombre de message envoyé par la personne qui détient le pseudo indiqué sur la commande)

a marqué ce sujet comme résolu.

Bonjour,

je voudrais créer un bot Discord qui détient cette commande :

!stats (pseudo)

Pour faire ce bot-ci j’ai pensé faire comme ceci :

Si le message commence par une lettre de l’alphabet, un chiffre etc… alors cela ajoute 1 au nombre de message envoyé.

Je vous demande simplement si cette méthode est la bonne ou pas car le seule problème est que je ne parviens pas à mettre toute les lettres, chiffre etc en une seule variable.

j’aimerais faire ceci :

1
var lettre_alphabet = 'a', 'b', 'c' etc etc...

Mais je n’y parviens pas.

J’ai ensuite pensé à faire comme ceci :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const Discord = require('discord.js')
const bot = new Discord.Client()



bot.on('ready', () => {
    console.log('testSUP est en ligne !')
})




bot.on('message', function (message){
    if(message.content.startsWith('a')){
        (le bot stocke 1 message en plus)
    }
})

bot.on('message', function (message){
    if(message.content.startsWith('b')){
        (le bot stocke 1 message en plus)
    }
})

bot.on('message', function (message){
    if(message.content.startsWith('c')){
        (le bot stocke 1 message en plus)
    }
})

bot.on('message', function (message){
    if(message.content.startsWith('d')){
        (le bot stocke 1 message en plus)
    }
})


bot.login('token');

Le souci est que ça prendrais beaucoup trop de lignes de codes pour si peu, je ne pense pas que cette méthode soit la bonne.

Donc voilà, j’aimerais juste que quelqu’un puisse me dire quel méthode faut-il prendre.

EDIT: Dois-je utiliser la regex ?

+0 -0

Salut,

Très rapidement une solution naïve ça serait de regarder le code ascii du premier caractère de ta chaîne à l’aide de charCodeAt() puis de le comparer aux valeurs ascii entre 0-9, a-z, A-Z (le tableau).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var a_tester = "test_alphanum_str";
code = a_tester.charCodeAt(0)      // ici 0 est l'index du premier élément
if ( (code >= 48 && code <= 57)    // code entre 0-9
  || (code >= 65 && code <= 90)    // code entre A-Z
  || (code >= 97 && code <= 122) ) // code entre a-z
{ 
  // commence par un char alphanumérique

}
else {
  // sinon
}

Il y a très certainement mieux et plus élégant mais ça devrait déjà pouvoir te débloquer un peu.

+0 -0

Salut,

Très rapidement une solution naïve ça serait de regarder le code ascii du premier caractère de ta chaîne à l’aide de charCodeAt() puis de le comparer aux valeurs ascii entre 0-9, a-z, A-Z (le tableau).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var a_tester = "test_alphanum_str";
code = a_tester.charCodeAt(0)      // ici 0 est l'index du premier élément
if ( (code >= 48 && code <= 57)    // code entre 0-9
  || (code >= 65 && code <= 90)    // code entre A-Z
  || (code >= 97 && code <= 122) ) // code entre a-z
{ 
  // commence par un char alphanumérique

}
else {
  // sinon
}

Il y a très certainement mieux et plus élégant mais ça devrait déjà pouvoir te débloquer un peu.

skywhi

Ok merci, je vais voir ça !

+0 -0

Salut,

Très rapidement une solution naïve ça serait de regarder le code ascii du premier caractère de ta chaîne à l’aide de charCodeAt() puis de le comparer aux valeurs ascii entre 0-9, a-z, A-Z (le tableau).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
var a_tester = "test_alphanum_str";
code = a_tester.charCodeAt(0)      // ici 0 est l'index du premier élément
if ( (code >= 48 && code <= 57)    // code entre 0-9
  || (code >= 65 && code <= 90)    // code entre A-Z
  || (code >= 97 && code <= 122) ) // code entre a-z
{ 
  // commence par un char alphanumérique

}
else {
  // sinon
}

Il y a très certainement mieux et plus élégant mais ça devrait déjà pouvoir te débloquer un peu.

skywhi

Re, j’ai essayé le code ci-dessous, pourtant ça ne fonctionne pas :/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const Discord = require('discord.js');
const bot = new Discord.Client();


var a_tester = "test_alphanum_str";
var code = a_tester.charCodeAt(0);
      // ici 0 est l'index du premier élément

bot.on('ready', () => {

  bot.user.setStatus("Online");
  bot.user.setGame("LevelBot");
  console.log("LevelBOT est prêt !!");
});


bot.on('message', function (message){
    if(message.content.startsWith(code >= 48 && code <= 57 || code >= 65 && code <= 90 || code >= 97 && code <= 122)){
        message.reply('1 message en plus')
    }
})


bot.login('token')

Pourtant si j’ai bien compris, tu initialise la variable code à 48 pour 0 et 57 pour 0-9

1
code >= 48 && code <= 57

Ensuite tu initialise la variable code à 65 pour A(majuscule) et 90 pour Z(majuscule)

1
code >= 65 && code <= 90

Et pour terminer, tu initialise la variable code à 97 pour a(minuscule) et 122 pour b(minuscule).

1
code >= 97 && code <= 122

J’ai fais une erreur quelque part, j’essaie de trouver mais je n’y parviens pas.

Ps: Ne me passez pas le code complet svp !! Juste des indications

+0 -0

🦄

Euh … Si ce n’est pas un message, ça peut être quoi d’autre ? Un commande ?

Je ne connais que très mal discord.

Mais dans l’idée, je serrais plus parti de "Si ce n’est pas un cas spécial, alors c’est un message donc on incrémente".

Plus logique que de traiter tout l’alphabet ASCII puisqu’un message peu tout à fait commencer par une licorne, un 🍪, un 🍍 ou un caractère d’un pays n’ayant pas d’alphabet latin (⍺, かな, 簾, …) .

+0 -0

🦄

Euh … Si ce n’est pas un message, ça peut être quoi d’autre ? Un commande ?

Je ne connais que très mal discord.

Mais dans l’idée, je serrais plus parti de "Si ce n’est pas un cas spécial, alors c’est un message donc on incrémente".

Plus logique que de traiter tout l’alphabet ASCII puisqu’un message peu tout à fait commencer par une licorne, un 🍪, un 🍍 ou un caractère d’un pays n’ayant pas d’alphabet latin (⍺, かな, 簾, …) .

ache

J’ai pas vraiment compris ton post :/

Tu peux pas reformuler stp ?

Tu pars du principe que si un message commence par un caractère de l’alphabet latin ou un chiffre arabe, alors c’est un message envoyé.

Mais que peut être un message s’il n’est pas envoyé ?

De plus, un message peut très bien commencer par exemple par un croisillon (#), un caractère majuscule (Étudie bien et tu passeras ton examen), une emoji (🍹), un caractère asiatique (米), …

Du coup, le plus logique c’est plus de faire, si le message n’est pas un cas spécial alors le message est envoyé.

Edit :

Moi je vois ça comme ça :

1
2
3
4
5
6
7
bot.on('message', function (message){
    if(message.content.startsWith('!')){
        (on traite le commande)
    }else{
        (le bot stocke 1 message en plus)
    }
})
+0 -0

Tu pars du principe que si un message commence par un caractère de l’alphabet latin ou un chiffre arabe, alors c’est un message envoyé.

Mais que peut être un message s’il n’est pas envoyé ?

De plus, un message peut très bien commencer par exemple par un croisillon (#), un caractère majuscule (Étudie bien et tu passeras ton examen), une emoji (🍹), un caractère asiatique (米), …

Du coup, le plus logique c’est plus de faire, si le message n’est pas un cas spécial alors le message est envoyé.

Edit :

Moi je vois ça comme ça :

1
2
3
4
5
6
7
bot.on('message', function (message){
    if(message.content.startsWith('!')){
        (on traite le commande)
    }else{
        (le bot stocke 1 message en plus)
    }
})
ache

Mais le "cas spécial" il doit être définir par un caractère non ?

Je vois pas comment je peux faire ce bot avec cette méthode :/

En fait, tu ne réponds toujours pas à ma question.

Mais que peut être un message s’il n’est pas envoyé ?

En l’absence de réponse, je conscidère qu’il n’y a que deux types de messages. Les commandes et les messages normaux.

Les commandes commencent par un ’!’.1

Donc (lis les commantaires) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
bot.on('message', function (message){
    // Si le contenue du message commence par un '!'
    if(message.content.startsWith('!')){
        // Alors c'est une commande
        // Donc on traite la commande
    }else{ // Sinon
        // C'est un message ordinaire
        // Donc on augmente de 1 le nombre de message envoyé
    }
})

`

  1. Cette assertion se base sur la commande que tu as proposé !stats (pseudo) 

+0 -0

En fait, tu ne réponds toujours pas à ma question.

Mais que peut être un message s’il n’est pas envoyé ?

En l’absence de réponse, je conscidère qu’il n’y a que deux types de messages. Les commandes et les messages normaux.

Les commandes commencent par un ’!’.1

Donc (lis les commantaires) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
bot.on('message', function (message){
    // Si le contenue du message commence par un '!'
    if(message.content.startsWith('!')){
        // Alors c'est une commande
        // Donc on traite la commande
    }else{ // Sinon
        // C'est un message ordinaire
        // Donc on augmente de 1 le nombre de message envoyé
    }
})

`
ache

Ok, j’ai bcp mieux compris. Mais j’ai pas compris de quelle question tu me parles, tu dis que je ne t’ai pas répondu.

Juste, je devrais créer un fichier json ? Pour le système de niveaux, de message envoyé et de points d’xp.


  1. Cette assertion se base sur la commande que tu as proposé !stats (pseudo) 

+0 -0

Juste, je devrais créer un fichier json ? Pour le système de niveaux, de message envoyé et de points d’xp.

Awoken

Tu dois bien stocker ça quelque part. JSON est très utilisé puisque facile à manipuler en JS car de la même syntaxe que JS.

+0 -0

Juste, je devrais créer un fichier json ? Pour le système de niveaux, de message envoyé et de points d’xp.

Awoken

Tu dois bien stocker ça quelque part. JSON est très utilisé puisque facile à manipuler en JS car de la même syntaxe que JS.

ache

Exemple :

1
2
3
{ "points": "0", "level": 0, "points": "50", "level": 1, "points": "150", "level": 2, "points": "250", "level": 3, "points": "450", "level": 4, "points": "600", "level": 5, }

`

C’est bien ça ?

niveau 1 à 50 points, niveau 2 à 150 etc…

J’ai trouvé ça sur le net :

1
2
3
4
5
6
7
8
{
  "139412744439988224" : { "points": 42, "level": 0 },
  "145978637517193216" : { "points": 3, "level": 0 },
  "90997305578106880" : { "points": 122, "level": 1},
  "173547401905176585" : { "points": 999, "level": 3}
}

`

source: https://anidiotsguide.gitbooks.io/discord-js-bot-guide/coding-guides/storing-data-in-a-json-file.html

+0 -0

Je fais pas du JSON tous les jours, mais tu redéfinies des propriétés.

C’est plus :

1
2
3
{ 'ache':{ 'points': 11, 'level': 1 },
  'pseudo': { 'points': 0, 'level': 0},
}

```

+0 -0

Important: Pour ceux qui ne savent pas comment créer un bot discord, cherchez comment faire, il y a beaucoup de tutoriels à ce sujet. https://www.youtube.com/watch?v=errnVwm_3mI (les 2-3 premières minutes de ce tuto disent comment créer un bot) :)

J’ai réussi en suivant un tuto et en me débrouillant un peu.

Créez un dossier, par exemple dans ce tutoriel j’apellerais ce dossier "Bot-Level" Dans le dossier "Bot-level" il faudra installer des librairies. Pour ce faire ouvrez un terminal de commande en faisant la commande windows + R et notez cmd. Une fenêtre devrait s’ouvrir. Dans ce terminal, notez "cd (glissez le dossier "Bot-level" dans le terminal) et appuyez sur entrée. Pour installer les librairies nécessaires, tapez les commandes suivantes :npm init puis laissez la configuration par défaut (appuyez sur entrée jusque "Is this ok? (yes)" puis appuyez sur entrée encore une seule fois. Ensuite, faites la commande :npm i --save discord.js

Une fois que c’est fait, allez dans le dossier "Bot-level" puis créez un fichier level.js Dans ce fichier (level.js) mettez le code suivant:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
const Discord = require('discord.js');
const bot = new Discord.Client();
const fs = require("fs");

bot.on('ready', () => {
  console.log(`Logged in as ${bot.user.tag}!`);
});

bot.on('message', message => {

var userData = JSON.parse(fs.readFileSync('jsonPointID/level.json', 'utf-8'));    
var sender = message.author;
var msg = message.content.toUpperCase();
var prefix = '>'


if(msg === prefix + 'USERSTATS') {
    message.channel.send('Vous avez envoyé **' + userData[sender.id].messagesSent + '** messages !' )
}


if (!userData[sender.id]) userData[sender.id] = {
    messageSent: 0
}

userData[sender.id].messagesSent++;



fs.writeFile('jsonPointID/level.json', JSON.stringify(userData), (err) => {
    if (err) console.error(err);
});

});

bot.login('token');

Ensuite, créez un dossier jsonPointID. Dans ce dossier, (jsonPointID) créez un fichier level.json puis écrivez "{}" dedans.

Le bot est normalement prêt, dans votre terminal tapez "node level.js" et le bot devrait se lancer.

Par la suite, écrivez un message dans votre channel, n’importe lequel. Allez ensuite dans votre fichier level.json et normalement il devrait avoir du contenu là-dedans, c’est que ça fonctionne.

Entrez ensuite dans votre serveur Discord la commande !mystats vous avez normalement le nombre de message total noté. Si le bot marque "Vous avez envoyé null messages !" envoyez encore un message et normalement ça devrait marcher.

Voilà, j’espère que ça vous sera utile même si en soit c’est pas très compliqué à faire.

Bonne journée/soirée !

+0 -0
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