#javascript-typescript

1 messages · Page 83 of 1

keen narwhal
#

Genre masquer pour les autre

dire latch
#

C'est discord ça

oak turret
#

faut que tu répondes par le bouton

#

button.reply.send() je crois de mémoire

dire latch
#

Ou les / commande nan ?

keen narwhal
#

tkt j'ai la doc devant moi

#

await button.reply.send

oak turret
#

j'en ai pas connaissance des / commandes

#

je les ai pas use du moins

dire latch
#

Ah

#

Ba met toi à jour 😂

#

Même si le truc est mal foutu ptdr

oak turret
#

j'en vois pas l'utilité du coup je les ai pas use

dire latch
#

C'est mal foutu malheuresement

oak turret
#

je sais j'ai déjà regardé vite fait

dire latch
#

Si tu as un bot simple, qui a le prefix /, tu ne peut pas l'utiliser, c'est un peu nul

keen narwhal
#
            if (this.deferred === true || this.replied === true) throw new Error('BUTTON_ALREADY_REPLIED: This button already has a reply');
                                                                       ^

Error: BUTTON_ALREADY_REPLIED: This button already has a reply
    at Object._send [as send] (D:\Téléchargements\discord-button-main\node_modules\discord-buttons\src\v12\Classes\clickButton.js:82:72)
    at Client.<anonymous> (D:\Téléchargements\discord-button-main\ticketbot-reaction.js:56:32)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
oak turret
#

mais bon les linereply vont arrivé assez vite donc à part ça j'en vois pas trop trop l'utilité de vrai

dire latch
#

Ok

oak turret
keen narwhal
#
        if (user_ticket) {
            await button.reply.send ('Tu a déjà créer un ticket !');
        }
oak turret
#

ouais du coup j'ai capté

#

c'est parce que il est defer()

keen narwhal
#

J'ai fait ça je sais si c'est good

oak turret
#

le defer() est compté comme une réponse

keen narwhal
#

Ahhh ouais

oak turret
#

enlève le .defer() et il le fera

keen narwhal
#

Je test att

#

Ok ça fait bien un reply

#

Par contre ça add des channel

#

Genre il me dit bien mon message

#

Mais il creer quand même un 2 ème tickets

oak turret
#

bah parce que ton système de détection doit pas bien fonctionner

keen narwhal
#

On regardera ensemble mais j'ai un autre problème

#

C'est useless les bot discord mdrr

#

J'en peu plus

oak turret
#

tu te tapes tous les problèmes en même temps

keen narwhal
#

Mdrrr

#

C'est pas de ma faute

naive schooner
#

tu utilises discord-buttons ?

#

si oui, fais ça : npm i discord-buttons@latest

keen narwhal
#

J'ai déjà le latent

#

Latest

oak turret
#

déjà réparé mec

keen narwhal
#

@oak turret Tu peux voc ?

oak turret
#

no

keen narwhal
#

Bon en gros il y a bien l'id

#

Mais il re creer quand même un channel

dire latch
#

Code ?

keen narwhal
#
client.on("clickButton", async (button) => {
    if ( button?.id === "message_prive_buttons" ) {
        let cat = button.message.guild.channels.cache.find(cat => cat.id === "860544911955066933");
        let category_channels = Array.from(cat.children.values());
        const user_ticket = category_channels.find(ticket => ticket.topic?.includes(`${button.clicker.user.id}`));
        if (user_ticket) {
            await button.reply.send ('Tu a déjà créer un ticket !');
        }
        button.guild.channels.create(`ticket-${button.clicker.user.username.toLowerCase()}`, {
            type: 'text',
            parent: '860544911955066933',
            permissionOverwrites: [
               {
                 id: button.clicker.user.id,
                 allow: ['VIEW_CHANNEL'],
              },
              {
                id: button.message.guild.roles.everyone.id,
                deny: ['VIEW_CHANNEL']
              },
              {
                  id: button.message.guild.roles.everyone.id,
                  deny: ['VIEW_CHANNEL']
              }
            ],

          })
          .then(async (ticket) => {
            const message_prive = button.clicker.user.id;
            await ticket.setTopic(message_prive)
          })
      } 
  })
dire latch
#

Regarde si le salon existe comme ça:

const user_ticket = await message.guild.channels.cache.find(ch => ch.name === `nom du salon`);
keen narwhal
#

bas non

#

ça passe pas

#

le channel ce créer automatiquement

dire latch
#

Mais il a bien un nom ton salon non ?

keen narwhal
#

ticket-${button.clicker.user.username.toLowerCase()}

dire latch
#

Oui, ba tu vérifies si sur ton discord, un salon nommé ticket-XXX existe

keen narwhal
#
        const user_ticket = await message.guild.channels.cache.find(ch => ch.name === `ticket-${button.clicker.user.username.toLowerCase()}`);
                            ^

ReferenceError: message is not defined
    at Client.<anonymous> (D:\Téléchargements\discord-button-main\ticketbot-reaction.js:53:29)
    at Client.emit (node:events:394:28)
    at WebSocketManager.<anonymous> (D:\Téléchargements\discord-button-main\node_modules\discord-buttons\src\index.js:35:16)
    at WebSocketManager.emit (node:events:394:28)
    at WebSocketShard.onMessage (D:\Téléchargements\discord-button-main\node_modules\discord.js\src\client\websocket\WebSocketShard.js:296:56)
    at WebSocket.onMessage (D:\Téléchargements\discord-button-main\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (node:events:394:28)
    at Receiver.receiverOnMessage (D:\Téléchargements\discord-button-main\node_modules\ws\lib\websocket.js:970:20)
    at Receiver.emit (node:events:394:28)
    at Receiver.dataMessage (D:\Téléchargements\discord-button-main\node_modules\ws\lib\receiver.js:517:14)
PS D:\Téléchargements\discord-button-main>
oak turret
#

comme je t'ai mis tout à l'heure

keen narwhal
#

Oui oui

#

Avec ce que tu ma donner

oak turret
#
const user_ticket = category_channels.find(ticket => ticket.topic === `${button.clicker.user.id}`);
#

ça

#

ça marchera

keen narwhal
#
client.on("clickButton", async (button) => {
    if ( button?.id === "message_prive_buttons" ) {
        let cat = button.message.guild.channels.cache.find(cat => cat.id === "860544911955066933");
        let category_channels = Array.from(cat.children.values());
        const user_ticket = await message.guild.channels.cache.find(ch => ch.name === `ticket-${button.clicker.user.username.toLowerCase()}`);
        if (user_ticket) {
            await button.reply.send ('Tu a déjà créer un ticket !');
        }
keen narwhal
#

oe

#

Je test

#

Att

#

Toujour le problème

#

Oui ça creer le channel

oak turret
#

ton code

dire latch
#

Pourquoi tu vérifies pas le nom du salon ?

keen narwhal
#

Mais il m'en creer un malgrès le message d'erreur

oak turret
#

quelle erreur

keen narwhal
#
client.on("clickButton", async (button) => {
    if ( button?.id === "message_prive_buttons" ) {
        let cat = button.message.guild.channels.cache.find(cat => cat.id === "860544911955066933");
        let category_channels = Array.from(cat.children.values());
        const user_ticket = category_channels.find(ticket => ticket.topic === `${button.clicker.user.id}`);
        if (user_ticket) {
            await button.reply.send ('Tu a déjà créer un ticket !');
        }
        button.guild.channels.create(`ticket-${button.clicker.user.username.toLowerCase()}`, {
            type: 'text',
            parent: '860544911955066933',
            permissionOverwrites: [
               {
                 id: button.clicker.user.id,
                 allow: ['VIEW_CHANNEL'],
              },
              {
                id: button.message.guild.roles.everyone.id,
                deny: ['VIEW_CHANNEL']
              },
              {
                  id: button.message.guild.roles.everyone.id,
                  deny: ['VIEW_CHANNEL']
              }
            ],

          })
          .then(async (ticket) => {
            const message_prive = button.clicker.user.id;
            await ticket.setTopic(message_prive)
          })
      } 
  })
oak turret
#

il met le topic au moins ?

keen narwhal
#

L'erreur que j'ai creer comme quoi le channel existe deja

oak turret
#

déjà, return await button....

#

mets un return et là ça sera good

keen narwhal
#

Ou ?

oak turret
#
if (user_ticket) {
            return await button.reply.send ('Tu a déjà créer un ticket !');
        }
keen narwhal
#

Oe

#

ça marche

#

ça éxecute l'action

#

Mais par contre il me met echec de l'interaction

oak turret
#

faut que tu le defer après

keen narwhal
oak turret
#

à ce moment là, enlèves le return du await button.reply, et après ça tu mettras return button.defer()

keen narwhal
#

Mais ça créer le channel

#

Mais c'est pas la dessus

#

Ou il y a marquer echec

#

C'est pour créer le channel la première fois

oak turret
#

je peux pas le deviner où ça le fait

#

oui bah normal

keen narwhal
#

^^

oak turret
#

si tu le defer() pas ça fera toujours ça

#

mais tu pourras pas le reply si tu le defer() avant

keen narwhal
#

je le met ou le defer ?

keen narwhal
#

@oak turret ?

#

Je me met ou le defer()

oak turret
#

toujours pas réussi?

dire latch
#

Ta les notifs? @oak turret

oak turret
#

j'ai tout enlevé

dire latch
#

Ah ok je comprends mieux 😅

oak turret
#

je faisais autre chose, du coup j'ai pas vu lol

dire latch
#

OK tkt

keen narwhal
#

@oak turret Non toujours pas

#

Je sais pas ou le mettre le defer

oak turret
#

tu l'enlèves dès le début, et tu ne le defer() qu'au moment où tu créer le channel fin le ticket quoi

uneven kayak
#

Bonjour je tente de récupérer le nom d'un jeu Steam par son ID (npm steam-game-browser) avec une boucle, seulement je n'arrive pas à récupérer la valeur de nomJeu en dehors de la fonction.

const sgb = require("steam-game-browser")
compteur = -1
  nomJeux =  ""
  const arrayJeux = jsonGamesInfos.response.games
  while (compteur != arrayJeux.length) {
    compteur = compteur + 1
    if(jsonGamesInfos.response.games[compteur]) {
      const jeuID = jsonGamesInfos.response.games[compteur].appid
      sgb.searchById(jeuID, async (err, data) => {
        nomJeu = data.name
      })
      nomJeux = nomJeux + `- ${nomJeu}\n`;
    }
  }```
Avec ce code là j'obtient l'erreur "nomJeu is not defined", je la comprends mais je ne sais pas comment <extraire> `nomJeu`
Quelqu'un saurait m'aider svp?
timid loom
#

tu fais pas comme dans leur exemple en même temps (extrait de la page npm)

// Search a game by ID
sgb.searchById("271590", (err, data) => {
    if (err) return console.error(err) // If the game isn't found or you didn't add a string or integer
    console.log(data) // Read the Game Object section, this shows in the console the name, the AppID, required age, if it's free, controller support, dlc, detailed description, short description
})
#

tu peux juste utiliser directement l'api de steam pour ça cela dit je pense

uneven kayak
#

Je les vu l'exemple, mais c'est quoi le problème avec mon code ?

#

jeuID correspond à l'app ID

timid loom
#

nan mais tu fais pas sgb.searchById() en fait

#

ou alors tu le montre pas dans ce que tu nous a donné

uneven kayak
#

si si il y est, regarde bien

timid loom
#

ah oui my bad

#

mais dans ce cas problème de scope

#

parce que tu peux pas faire nomJeu = data.name dans un callback et espérer y accéder dans le contexte de base

dire latch
#

Pourquoi tu met un async aussi ? 🤔

timid loom
uneven kayak
dire latch
uneven kayak
#

le async était dans la fonction de base de l'exemple, j'ai juste pas enlever

#

enfin je l'ai copier d'un autre code que j'avais fait avec un async plutot

dire latch
#

Il y est pas le async mdr dans l'exemple

#

Ouais voilà, c'est toi même 🙂

uneven kayak
#

x)

timid loom
#

200requêtes max toutes les 5 minutes c'est honnête

dire latch
#

@timid loomTu connais un module pour récupérer les infos d'un compte steam ? Pseudo, ses jeux, ect

uneven kayak
#

Je comprends pas

timid loom
dire latch
#

Ok, je regarderai sa

#

Merci

uneven kayak
timid loom
uneven kayak
#

Enfaite l'api steam renvoie que les APPid des jeux qu'un user a, ducoup j'essaie de convertir ces APPid en leur nom

timid loom
#

tu peux essayer de passer par les callbacks mais globalement il faut que tu gères tout le reste du code dans le callback et il se peut que tu aies quelques problèmes vu que ça se fera pas tout de suite

uneven kayak
#

Mhhh je réfléchis à comment faire mais je sais pas

dire latch
#

Tu pourrais partagé pour se connecter à l'api ?

uneven kayak
#

Yes

#
const userInfos = await fetch(encodeURI(`https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${key}&steamids=${utilisateur}`))
const jsonUserInfos = await userInfos.json()

après t'as plusieurs api donc tu fais en fonction de ce que tu recherche

dire latch
#

Merci

timid loom
#

genre tu fetch ça au démarrage de ton app

#

et tu le mets dans un tableau

#

et tu récup les valeurs après

#

mais bon c'est entre 5 et 10 Mo de données JSON donc en fonction de ce que tu utilise ça peut prendre du temps avant que ce soit utilisable

uneven kayak
#

j'ai vraiment rien compris mais c'est pas grave x)

timid loom
#

bah en gros
tu fais une requête sur https://api.steampowered.com/ISteamApps/GetAppList/v2/, récupère le résultat qui est sous forme JSON,
et après avoir parsé le JSON tu stocke ça dans un tableau à l'aide duquel tu pourras trouver le jeu que tu veux trouver
c'est un gros tableau cela dit donc je sais pas si ça sera bien supporté

#

ton extension là elle est bien mais bon à part si tu sais promisifier un truc de cette forme ça risque d'être compliqué à faire

#

je vais chercher un guide pour faire ça attends

uneven kayak
#

ça semble complexe tout ça là

#

mais merci je vais quand même essayer de comprendre

timid loom
#

je vais faire un test pour voir si ça fonctionne

#

ok ça va ça fonctionne

#
const smb = require('steam-game-browser')
const util = require('util')
const searchById = util.promisify(smb.searchById);

const logGtaV = async () => {
  const game = await searchById('271590').catch(console.error);
  console.log(game);
}
#

exemple de base

keen narwhal
#

j'ajoute juste un .defer() ?

timid loom
#

?

uneven kayak
timid loom
#

ah plus haut sans doute

timid loom
# uneven kayak Même avec ça je comprends pas comment l'adapter à mon code ahah..

je vais pas te mâcher tout le travail non plus mais en gros je vais rajouter des commentaires :

const smb = require('steam-game-browser')
const util = require('util')
const searchById = util.promisify(smb.searchById);

// ici je suis dans une fonction async parce que sinon je peux pas utiliser await
const logGtaV = async () => {
  // la constante game contient les infos du jeu, comme documenté ici : https://www.npmjs.com/package/steam-game-browser#game-object
  const game = await searchById('271590').catch(console.error);
  // tu peux faire ce que tu veux dans le contexte de ta fonction, ça remplace l'appel de base
}
#

le code au début avec le util.promisify il va juste utiliser ta fonction et il va faire en sorte que ça puisse s'utiliser comme une promesse

#

c'est comme response.json() quand tu viens fetch quelque chose

#

là t'en dire plus c'est littéralement faire ton code à ta place donc je te laisse te débrouiller avec ça

uneven kayak
#

C'est pas ce que je recherche de donner tout le travail de toute façon, mais là je vais laisser tomber j'essaie mais y arrive pas

burnt perch
timid loom
burnt perch
uneven kayak
#

facile à dire quand on s'y connait à la perfection

timid loom
burnt perch
#

Oui oui biensur mais là il faut juste qu'il test des trucs et c'est bon

#

Mais après j'avoue même moi au début les promise je captais pas trop

keen narwhal
#

bonjour j'ai trouver un code en js qui affiche du texte et qui le supprime par la suite mai il ne veux pas lire mes <br> il les affiche donc il ne fais pas de retour à la ligne, merci d'avance pour votre aide.

idle ice
keen narwhal
slim anvil
#

Là je peux pas j’ai 4% de batterie

keen narwhal
keen narwhal
#

@oak turret

umbral lake
#

hey j'aurais besoin d'aide je n'arrive pas à récupérer un " message"

dire latch
#

Comment ça ? @umbral lake

umbral lake
#

je vais te montrer

dire latch
#

Dac

umbral lake
#

@dire latch

#

en gros j'aimerais récupérer que Bot et après que les valeurs qui y sont join

#

tu as compris ce que je voulais faire ?@dire latch

dire latch
#

Tu veut log que BOT

#

C'est ça ?

#

@umbral lake

umbral lake
#

oui

#

je compte en gros mettre la categorie bot dand un bed moderateur dans un autre etc

dire latch
#

Bot c'est une catégorie non ?

#

Pourquoi tu fais pas que si c'est la catégorie bot, tu l'affiches ici ou là

umbral lake
#

oui

dire latch
#

Ba essaye comme je t'ai dis @umbral lake

umbral lake
#

@dire latch

#

je t'avoue que je suis un peux perdu :p

dire latch
#

Tu récupères bien les noms des commandes pour ton help non ?

#

@umbral lake

#

Tu fais pareil pour les catégories

umbral lake
#

oui c'est cmd.name pour les commande et pour les groupes c'est grp.name je ne sais pas comment récupérer juste une catégorie de groupe

#

genre ça ?

dire latch
#

Ouais voilà

umbral lake
#

il me fait ressortir un boolean

dire latch
#

Hmm

#

Tu utilises un handler?

umbral lake
#

oui mais il est fait par discord.js-commando

dire latch
#

Ah j'utilise pas commando

umbral lake
#

ah du coup tu penses pas pouvoir m'aider

dire latch
#

Ba jsp comment fonctionne commando sorry

timber rune
#

hey

#

je suis entrain de développer un robot en javascript, et j'aimerais avec une commande pouvoir ajouter du contenu dans un fichier json, es ce que quelqu’un peut m'aider? Je n'y arrive pas.

fleet socket
timber rune
#

merci

white sedge
#

(node:3929) UnhandledPromiseRejectionWarning: TypeError: fields.flat is not a function
c normal ça ???

#

mes embeds ne marchent plus

slim anvil
#

Ta version de nodejs

white sedge
#

ah

white sedge
#

c bon mes embed machent merci

timber rune
#

j'ai le demon

timber rune
#

@fleet socket es ce que tu peux m'aider stp?

fleet socket
#

deso j'avais pas trop le tps mais donne plus d'info sur ce qui ne marche pas/ce que t'as tenté si j'i le tps je t'aiderais sinn je suis sur que quelqu'un d'autre le fera mais met plus de precision

keen narwhal
#

bonjour j'ai trouver un code en js qui affiche du texte et qui le supprime par la suite mai il ne veux pas lire mes <br> il les affiche donc il ne fais pas de retour à la ligne, merci d'avance pour votre aide.

#

c'est du js taping

oak turret
#

je sais pas d’où sortent tes echo

#

mais c’pas du js ça c’est clair

#

à moins que je sois fou et que je vois flou mais dababy

keen narwhal
#

En gros je montre juste que ça écrit et supprime un texte que j'ai prédéfini dans le code

#

Mai ce ne lis pas les br ca les ca écrit <br> sur le site

lapis onyx
timber rune
#

Hey

#

Je suis entrain de dev un bot mais cette commande ne fonctionne pas, quelqu’un peut m’aider ?

#

code:

const fs = require('fs');
const config = require('../config');

module.exports.run = async (client, message, args) => {
    if(!message.guild.member(message.author).roles.cache.has(config.team)) return message.channel.send('Tu n\'a pas le droit d\'utiliser cette commande !')
    const fileName = '../file.json';
    const file = require(fileName);
        
    file.push(args);
        
    fs.writeFile(fileName, JSON.stringify(file), function writeJSON(err) {
      if (err) return console.log(err);
    });
        message.channel.send(`Lien envoyé dans la **Base de donnée**`) 
        //message.channel.send('args: ${args}')
}

module.exports.help = {
    name: "uploadgif",
    aliases: ["uploadg"]
}

file.json:

[]
dire latch
#

@keen narwhal json est bien pour stocker des petites choses

#

Puis, il ne veut pas que tu lui refasses le code, il veut qu'on l'aide car sa ne fonctionne pas 👍

keen narwhal
#

salutation
Je voudrais faire en sorte une commande qui envoi un embed avec : @un rôle ( indiqué dans le code ) à actuellement : *le nombre de personnes qui à le rôle.
Mais je sais pas faire, pouvez vous m'aider ?

timid loom
#

plutôt que de passer par une boucle :

let nb = message.guild.roles.cache.get('<id_role>').members.size;

juste il faut garder en tête que ça correspond au nombre de GuildMember dans le cache qui ont le rôle

slim anvil
#

et dans tous les cas le .map est pas bon, tu aurais du use un .reduce

timid loom
#

ou un .forEach si le but était de rajouter un à nb

#

mais dans tous les cas les itérateurs vu que tu boucle dessus normalement t'as toujours moyen d'avoir la taille sans passer par une boucle

keen narwhal
# lapis onyx Change element.value / element.text par element.innerHTML je pense

Merci de ton aide mai je n'e trouve pas ce que tu me propose dans mon code js ```js
const typedTextSpan = document.querySelector(".typed-text");
const cursorSpan = document.querySelector(".cursor");

const textArray = ["<?= $ipl ?>"];
const typingDelay = 25;
const erasingDelay = 5000;
const newTextDelay = 500; // Delay between current and next text
let textArrayIndex = 0;
let charIndex = 0;

function type() {
if (charIndex < textArray[textArrayIndex].length) {
if(!cursorSpan.classList.contains("typing")) cursorSpan.classList.add("typing");
typedTextSpan.textContent += textArray[textArrayIndex].charAt(charIndex);
charIndex++;
setTimeout(type, typingDelay);
}
else {
cursorSpan.classList.remove("typing");
setTimeout(erase, newTextDelay);
}
}

function erase() {
if (charIndex > 0) {

} 
else {
  cursorSpan.classList.remove("typing");
  textArrayIndex++;
  if(textArrayIndex>=textArray.length) textArrayIndex=0;
  setTimeout(type, typingDelay + 20);
}

}

document.addEventListener("DOMContentLoaded", function() { // On DOM Load initiate the effect
if(textArray.length) setTimeout(type, newTextDelay + 2000);
});

slim anvil
#

Non pas comme ça

#

Ah quoi que comme tu veux juste faire +1 et pas récupérer la prochaine value ca peut passer oui

#

Du coup oui

#

je répondais juste à ton .map

keen narwhal
#

il écrit les br

#

sur le site

#

au lieux de faire des retour à la ligne

red torrent
# keen narwhal sur le site

Soit ton <br> est échappé (avec des antislash devant < et > soit le navigateur s'attend à un <br /> au lieu d'un <br>

keen narwhal
#

bas si je mes un <br> dans mon html ça marche mai avec le code js ça l'écrit

red torrent
keen narwhal
#

j'ai des erreur qui vienne de mon site dans les logs mai il me dit rien par rapport à ça

red torrent
#

Ah mais tu remplis ton tableau js avec une variable php

keen narwhal
#

oui

red torrent
#

Ça doit être php qui échappe tes données mais c'est normal c'est ce qu'on fait pour éviter les injections xss

#

Tu peux envoyer le code en entier ?

keen narwhal
#

oui

#
    <div class="col-md-6">
      <div style="background-color: rgb(8, 8, 10); height: 400px;" class="card mb-3">
        <div class="card-body">
          <div class="tab-content" id="myTabContent">
            <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
              <p class="card-title" style="color: rgb(70, 253, 146);">
              
              <?php
if(isset($_POST['resolve'])){
    $username = $_POST['username'];
        strtolower($username);
        if($username == null){
            echo "Insérer un pseudonyme valide!";
        } else 
        // This is blacklist:
        if($username == "" || $username == "" || $username == "" || $username == ""){ // When adding blacklisted username, use lowercase letters.
            echo " Blacklist";
        } else {
      $ipl = @file_get_contents("https://webresolver.nl/api.php?key=M9HNW-VBJYB-WXW02-O9I8D&action=geoip&string={$username}"); // Put own API link with Key in here. ?>
<?php } } else { ?>Localiser une IP<?php } ?><span class="typed-text"></span><span class="cursor">&nbsp;</span>
</p>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</section>
<!--/ Navigation -->



<script> 
  const typedTextSpan = document.querySelector(".typed-text");
  const cursorSpan = document.querySelector(".cursor");
  
  const textArray = ["<?= $ipl ?>"];
  const typingDelay = 25;
  const erasingDelay = 5000;
  const newTextDelay = 500; // Delay between current and next text
  let textArrayIndex = 0;
  let charIndex = 0;
  
  function type() {
    if (charIndex < textArray[textArrayIndex].length) {
      if(!cursorSpan.classList.contains("typing")) cursorSpan.classList.add("typing");
      typedTextSpan.textContent += textArray[textArrayIndex].charAt(charIndex);
      charIndex++;
      setTimeout(type, typingDelay);
    } 
    else {
      cursorSpan.classList.remove("typing");
      setTimeout(erase, newTextDelay);
    }
  }
  
  function erase() {
    if (charIndex > 0) {

    } 
    else {
      cursorSpan.classList.remove("typing");
      textArrayIndex++;
      if(textArrayIndex>=textArray.length) textArrayIndex=0;
      setTimeout(type, typingDelay + 20);
    }
  }
  
  document.addEventListener("DOMContentLoaded", function() { // On DOM Load initiate the effect
    if(textArray.length) setTimeout(type, newTextDelay + 2000);
  });
   </script>
red torrent
#

Et si c'était possible d'avoir un var_dump de $ipl ça serait cool aussi

keen narwhal
#

oui mai ca écrirais plus pareil

#

enfaîte je veux un typed text juste our le style pour faire une genr de console

red torrent
#

Qu'est-ce tu appelles typed text?

keen narwhal
#

attend je te montre

timid loom
#

du texte écrit

red torrent
#

Ah je vois

timid loom
#

mais là oui c'est du php ton truc donc javascript ou non tu auras le même souci

red torrent
#

C'est l'effet console

#

Avec l'underscore qui clignote à la fin

#

Après quand tu veux mettre du php dans du JavaScript c'est mieux de faire une api avec php et appeler ta route avec un fetch en js

#

C'est beaucoup plus propre et ça te permet de tout bien séparer ce qui est plus facile à debugger

keen narwhal
#

bas j'utilise l'api de webresolver mai j'utilise la version html pas JSON

#

ca doit donné ca à la fin

red torrent
#

Je vois, je comprend pas trop l'intérêt du innerHTML dans ce cas

#

Pourquoi ne pas générer ton html avec php?

#

Pourquoi tu veux forcément append un span?

keen narwhal
#

non c'est juste un code que j'ai trouvé sur internet je mi conné pas trop en js

red torrent
oak turret
#

message.guild.roles.cache.get(« id »).members.size

timid loom
#

je réitère ce que j'ai dit plus haut :
#javascript-typescript message
donc ça correspond au nombre de GuildMember dans le cache qui ont le rôle
il faut récupérer tous les membres d'une guild pour être sûr d'avoir le bon nombre

ancient sonnetBOT
#
Citation de Taink9231 posté dans #javascript

Clique sur [📝](#javascript-typescript message) pour accéder au message
QuoteSplutôt que de passer par une boucle :

let nb = message.guild.roles.cache.get('<id_role>').members.size;

juste il faut garder en tête que ça correspond au nombre de GuildMember dans le cache qui ont le rôleQuoteE

keen narwhal
#

Ha merci désolé j'avais pas vus

red torrent
#

Pour avoir le résultat exact même pour les serveurs avec énormément de membres il va falloir fetch la liste complète : ```js
const role = message.mentions.roles.first()
const members = await message.guild.members.fetch();
const membersWithRole = members.filter(member => member.roles.cache.has(role.id));
const membersCount = membersWithRole.size;

keen narwhal
bold sparrow
red torrent
bold sparrow
#

Ce que je fais perso, c'est accéder au cache, si rien n'est return, ça fetch automatiquement le membre via une query en paramètre, ça fonctionne dans 100% des cas.

red torrent
#

Mais l'exemple au dessus c'est pour fetch la liste entière des membres

#

Donc je ne peux pas vérifier si un membre est en cache ou pas avant d'avoir la liste complète du coup je ne force pas le fetch

bold sparrow
#

Bien vu.

#

Je fais différemment mais ta façon de faire est impec aussi.

#

Je me suis créer un resolver lol

red torrent
#

Après tu as aussi un évènement qui est appelé à chaque fois que ton bot reçoit un chunk de l'intent des membres tu peux jouer avec ça

bold sparrow
#

Oh, lequel ?

#

Si tu t'en souviens

#

Je l'ai.

#

Celui-ci ?

red torrent
#

Oui

#

Mais par exemple quand je fais ça sur un bot d'among us france (170k membres) c'est pas la bonne méthode car c'est trop long

bold sparrow
#

Merci beaucoup Eno pour cet Event, super utile 👍🏼

red torrent
#

Il faudra plus d'une minute pour recevoir tous les chunk

bold sparrow
#

Je sens qu'il va me servir

#

Disons que, pour l'utilisation qu'on avait au départ, c'est clairement pas une meilleure idée

white sedge
#

comment je fais pour importer le contenue d'une variable depuis un json
un exemple serait mieux
Ce fichier est une commande pour afficher les Ajouts de la maj du bot qui sont ecrit dans un json

const Discord = require('discord.js');
const { Command } = require('discord.js-commando');
const fs = require('fs');
const resume = require('./notes_de_version.json')

module.exports = class MemberCommand extends Command {
    constructor(client) {
        super(client, {
            name: `${process.env.COM_RESUMEVERSION}`,
            memberName: 'resumé de version',
            group: 'stats',
            description: 'Affiche la liste des ajouts de la derniere mise a jour de bot ',
        });
    }
    async run(msg){
        const embed = new Discord.MessageEmbed()
        .setColor("#42AE87")
        .setTitle(`Ajout de la version ${process.env.VERSION}`)
        //Ajout 1
        .addField(``,``)
        //Ajout 2
        .addField(``,``)
        return msg.say(embed);
    }
};```
aux .addfField je veux mettre les viariables Ajouts1/2 du json
Mon json 
```json
{
    "Version":"Béta 0.5.2",
    "Nom_de_la_mise_a_jour":"Commande & Co",
    "Description_de_la_mise_a_jour":"Cette mise à jour apporte une optimisation plus pousée du bot et de nouvelles commande",
    "contenu1": [
        {
            "Ajout1":[ {
                "nom":"Optimistation et simplification visuelle",
                "description":[
                    "Les commandes on étés simplifiée et optimisée pour que le bot soit plus rapide de plus certaines commande on vues leur systeme d'execution changer radicalement et des fonctionnalitées on été rajouter",
                    "Les resultats des commandes ont été simplifier pour plus de clareté (rajout d'embed)"
                ] 
            } 
            ],
            "Ajout2":[{
                "nom":"Rejout de commandes",
                "description":[
                    "De nouvelles commandes sont disponible pour les membres, il est maintenant possible de voir la version du bot.",
                    "Il est aussi possible de voir le contenu de la prochaine mise a jour mais aussi le contenu de la version acctuelle"
                ]
            }]
        }]   
}```
#

comment je fais ?

dire latch
#

Je ne sais pas, sorry 😔

cyan iron
#

Normalement si tu fais un resume.contenu1.Ajout1.nom t'as "Optimistation et simplification visuelle"

#

à condition que ça soit bien ça que tu fais

dire latch
#

Go le faire en mode brut, écrire dans le code directement 😅

cyan iron
#

@white sedge

cyan iron
dire latch
#

Je sais tkt @cyan iron

cyan iron
dire latch
#

Pour rire oh lala

cyan iron
white sedge
#

merci je vais essayer de ce pas

#

@white sedge, An error occurred while running the command: TypeError: Cannot read property 'nom' of undefined
You shouldn't ever receive an error like this.
Please contact Nom d’utilisateur#9999.

#

ça marche pas

cyan iron
#

console log ton resume pour voir stp

white sedge
#

dans les logs de mon bot y a rien

#

pas d'erreur

cyan iron
#

console log ton resume pour voir stp

white sedge
#

je marque quoi apres

tight lodge
#

console.log(resume);

white sedge
#

console.log(resume);
Uncaught ReferenceError: resume is not defined

#

pourtant...

cyan iron
#

bruh

#

tu fais ça où

oak turret
#

du dois faire like this pour ton contenu

#

"contenu": [  
      {
      "name": "name",
      "description": "description"
      },
      {
      "name": "name",
      "description": "description"
      }
]

pour lire toutes tes données tu feras un .forEach() et tu pourras get les name etc

white sedge
#

hien

oak turret
#

et ton json est où par rapport à ta commande ?

white sedge
#

dans le meme dossier

oak turret
#

screen ton dossier stp

white sedge
oak turret
#

ok et quand t'as fais ton require() ça t'as rien mis comme résultat pour le faire automatiquement ?

white sedge
#

euh je crois pas

oak turret
#

refais ton require et check

white sedge
#

je debute en js donc ...

oak turret
#

donc ?

white sedge
#

je comprend pas trop ce que tu dis 😅

oak turret
#

réimporte ton fichier

#

ton require() quoi

white sedge
#

const resume = require('./notes_de_version.json'); c bon ?

cyan iron
#

javascript sujet 2

#

@white sedge Juste, console.log resume, et voit si ça donne ton JSON

#

Et montre où tu places ton resume

white sedge
#

console.log(resume);
Uncaught ReferenceError: resume is not defined

#

ça donne rien

cyan iron
#

Tu le places où

#

Ton console log

white sedge
#

dans la console de debogage

oak turret
#

mais non

#

faut le mettre dans ton code ça

white sedge
#

const Discord = require('discord.js');
const { Command } = require('discord.js-commando');
const fs = require('fs');
const resume = require('./notes_de_version.json');
console.log(resume);

oak turret
#

oui

white sedge
#

ça me sort mon json

cyan iron
#

Bah voilà

oak turret
#

voilà

#

tu changes ton json comme je te l’ai montré et voilà

white sedge
#
{
    "Version":"Béta 0.5.2",
    "Nom_de_la_mise_a_jour":"Commande & Co",
    "Description_de_la_mise_a_jour":"Cette mise à jour apporte une optimisation plus pousée du bot et de nouvelles commande",
    "contenu": [
        {
                "nom1":"Optimistation et simplification visuelle",
                "description1":
                    "Les commandes on étés simplifiée et optimisée pour que le bot soit plus rapide de plus certaines commande on vues leur systeme d'execution changer radicalement et des fonctionnalitées on été rajouter mais aussi les resultats des commandes ont été simplifier pour plus de clareté (rajout d'embed)",
                
             
                "nom2":"Rejout de commandes",
                "description2":
                    "De nouvelles commandes sont disponible pour les membres, il est maintenant possible de voir la version du bot mais aussi il est aussi possible de voir le contenu de la prochaine mise a jour mais aussi le contenu de la version acctuelle."
    }]
}```c bon comme ça ?
oak turret
#

non

white sedge
#

ah

oak turret
#

les objets doivent être identiques

#

comme je t'ai mis moi

white sedge
#
{
    "Version":"Béta 0.5.2",
    "Nom_de_la_mise_a_jour":"Commande & Co",
    "Description_de_la_mise_a_jour":"Cette mise à jour apporte une optimisation plus pousée du bot et de nouvelles commande",
    "contenu": [
        {
                "nom":"Optimistation et simplification visuelle",
                "description":
                    "Les commandes on étés simplifiée et optimisée pour que le bot soit plus rapide de plus certaines commande on vues leur systeme d'execution changer radicalement et des fonctionnalitées on été rajouter mais aussi les resultats des commandes ont été simplifier pour plus de clareté (rajout d'embed)",
                
             
                "nom":"Rejout de commandes",
                "description":
                    "De nouvelles commandes sont disponible pour les membres, il est maintenant possible de voir la version du bot mais aussi il est aussi possible de voir le contenu de la prochaine mise a jour mais aussi le contenu de la version acctuelle."
    }]
}```
oak turret
#

toujours pas

#

regarde mon exemple

white sedge
#
{
    "Version":"Béta 0.5.2",
    "Nom_de_la_mise_a_jour":"Commande & Co",
    "Description_de_la_mise_a_jour":"Cette mise à jour apporte une optimisation plus pousée du bot et de nouvelles commande",
    "contenu": [
        {
        "name":"Optimistation et simplification visuelle",
        "description": "Les commandes on étés simplifiée et optimisée pour que le bot soit plus rapide de plus certaines commande on vues leur systeme d'execution changer radicalement et des fonctionnalitées on été rajouter mais aussi les resultats des commandes ont été simplifier pour plus de clareté (rajout d'embed)"
        },
        {    
        "name":"Rajout de commandes",
        "description":"De nouvelles commandes sont disponible pour les membres, il est maintenant possible de voir la version du bot mais aussi il est aussi possible de voir le contenu de la prochaine mise a jour mais aussi le contenu de la version acctuelle."
        }
    ]
}```
#

la c bon ?

oak turret
#

oui

white sedge
#

cool

#

merci

oak turret
#

np

white sedge
oak turret
#

bah là non du coup

#

faut que tu fasses un .forEach() pour tout afficher

#

du genre :

#
resume.contenu.forEach(element => {
  console.log(element.name);
})
#

ça va te log tes 2 name

#

essaye tu verras ^^

white sedge
#

ouais mais je veux que ça n'en sorte q'un

dire latch
#
console.log(element.name[1]);
#

Nan ?

oak turret
oak turret
dire latch
#

🤷‍♀️

oak turret
#

à ce moment-là, tu fais pas un forEach()

#

tu fais juste

dire latch
oak turret
#
resume.content[0].name
white sedge
#
   console.log(contenu.name[1]);
        const embed = new Discord.MessageEmbed()
        .setColor("#42AE87")
        .setTitle(`Ajout de la version ${process.env.VERSION}`)
        //Ajout 1
        .addField(`${resume.contenu.name}`,`e`)
        //Ajout 2
        .addField(`r`,`a`)

je souhaite que le premier .addfield sorte le premier name et le deuxieme .addfield sotre le deuxieme name

oak turret
#

oui bah voilà

#

mon forEach() passe dans ce cas

#

tu feras ça :

#
const embed = new Discord.MessageEmbed()
  .setColor("BLUE")
  .setTitle("ton titre")
resume.contenu.forEach(element => {
  embed.addField(element.name, element.description, true)
})
return <message>.channel.send(embed)
white sedge
#

ça marche nickel merci

oak turret
#

np

bold sparrow
#

Hello

#

J'ai un soucis, js const props = new(require(`${commandPath}${path.sep}${commandName}`))(this); ça me dit que require n'est pas un constructor

fickle brook
#

Tu ferme deux parenthèses

#

Alors que y'en a ue' d'ouverte

dire latch
fickle brook
#

A oe mince dsl

dire latch
#

Np, je réponds juste à sa place 🙂

slim anvil
#

@bold sparrow essaye d’enlever la première parenthèse et du coup celle de fin qui correspond

#

d’avoir new require et non new(require(…

bold sparrow
#

Ca ne peut pas fonctionner

#

Puisque je dois load une fonction, avec comme param, mon client

#

@slim anvil

slim anvil
#

tu pourras pas via le new(require()) en tout cas ça c'est sur

bold sparrow
#

Je pense je vais changer ma méthode de faire

#

Je vais tout foutre dans un array et mapper, puis initier les classes que j'aurais dedans

#

Ca fait trop longtemps je suis dessus ça me gave

spring breach
#

Hello !

J'ai une question, est-ce que vous avez un regex pour détecter UNIQUEMENT si quelqu'un écrit avec des écriture comme ça:

𝐚𝐛𝐜𝐝𝐞𝐟𝐠𝐡𝐢𝐣𝐤𝐥𝐦𝐧𝐨𝐩𝐪𝐫𝐬𝐭𝐮𝐯𝐰𝐱𝐲𝐳

𝚊𝚋𝚌𝚍𝚎𝚏𝚐𝚑𝚒𝚓𝚔𝚕𝚖𝚗𝚘𝚙𝚚𝚛𝚜𝚝𝚞𝚟𝚠𝚡𝚢𝚣

𝖆𝖇𝖈𝖉𝖊𝖋𝖌𝖍𝖎𝖏𝖐𝖑𝖒𝖓𝖔𝖕𝖖𝖗𝖘𝖙𝖚𝖛𝖜𝖝𝖞𝖟

𝕒𝕓𝕔𝕕𝕖𝕗𝕘𝕙𝕚𝕛𝕜𝕝𝕞𝕟𝕠𝕡𝕢𝕣𝕤𝕥𝕦𝕧𝕨𝕩𝕪𝕫

𝗮𝗯𝗰𝗱𝗲𝗳𝗴𝗵𝗶𝗷𝗸𝗹𝗺𝗻𝗼𝗽𝗾𝗿𝘀𝘁𝘂𝘃𝘄𝘅𝘆𝘇

𝑎𝑏𝑐𝑑𝑒𝑓𝑔ℎ𝑖𝑗𝑘𝑙𝑚𝑛𝑜𝑝𝑞𝑟𝑠𝑡𝑢𝑣𝑤𝑥𝑦𝑧

𝘢𝘣𝘤𝘥𝘦𝘧𝘨𝘩𝘪𝘫𝘬𝘭𝘮𝘯𝘰𝘱𝘲𝘳𝘴𝘵𝘶𝘷𝘸𝘹𝘺𝘻

𝒂𝒃𝒄𝒅𝒆𝒇𝒈𝒉𝒊𝒋𝒌𝒍𝒎𝒏𝒐𝒑𝒒𝒓𝒔𝒕𝒖𝒗𝒘𝒙𝒚𝒛

𝙖𝙗𝙘𝙙𝙚𝙛𝙜𝙝𝙞𝙟𝙠𝙡𝙢𝙣𝙤𝙥𝙦𝙧𝙨𝙩𝙪𝙫𝙬𝙭𝙮𝙯

𝒶𝒷𝒸𝒹𝑒𝒻𝑔𝒽𝒾𝒿𝓀𝓁𝓂𝓃𝑜𝓅𝓆𝓇𝓈𝓉𝓊𝓋𝓌𝓍𝓎𝓏

𝓪𝓫𝓬𝓭𝒆𝒇𝓰𝓱𝓲𝓳𝓴𝓵𝓶𝓷𝓸𝓹𝓺𝓻𝓼𝓽𝓾𝓿𝔀𝔁𝔂𝔃

abcdefghijklmnopqrstuvwxyz

𝔞𝔟𝔠𝔡𝔢𝔣𝔤𝔥𝔦𝔧𝑘𝔩𝔪𝔫𝔬𝔭𝔮𝔯𝔰𝔱𝔲𝔳𝔴𝔵𝑦𝔷

ᵃᵇᶜᵈᵉᶠᵍʰᶤʲᵏˡᵐᶰᵒᵖᵠʳᶳᵗᵘᵛʷˣʸᶻ

En gros toutes les écritures autre que si je l'avais écrit avec mon clavier

slim anvil
#

fais plutot l'inverse dans ce cas là

#

de vérifier que le caractères est bien alphanumeric

spring breach
#

Mais je veux aussi que ça prenne les caractère de ce type: ,;:!ù*$^?./§%µ£

slim anvil
#

tu veux que ça les autorise ou n'autorise pas ?

spring breach
#

autoriser

slim anvil
#

Bah du coup tu te fais une regex pour les charactères spéciaux + alpha numeric

bold sparrow
#

Bonsoir @spring breach,

J'ai peut-être une piste pour toi, utiliser cette regex /^[a-z0-9]+$/i puis faire un test() sur ce que tu veux, pour les caractères spéciaux, tu peux faire un array, et check chaque valeur si ça contient ou non

slim anvil
#

et si ca match pas ca dégage

bold sparrow
#

Je ne suis pas un pro de Regex, il doit y avoir un moyen d'accepter ce que tu demandes.

bold sparrow
#

Dites-moi, pour un projet single page, j'aurais besoin d'utiliser du TS dans du HTML, est-ce que Angular c'est trop pour du single page ? Lequel serait le plus adapté, Vue, React ? J'ai juste besoin d'afficher des éléments sur la page x)

slim anvil
#

Pourquoi tu le fais pas en vanilla alors

#

et tu compiles ton code

bold sparrow
#

En vanilla .. Pourquoi pas

slim anvil
#

Sinon utilises preact par exemple si tu veux vraiment du react par exemple

#

c'est bcp plus light

bold sparrow
#

Preact, je connaissais pas

slim anvil
#

ou vitejs qui comprend vue et/ou react

bold sparrow
#

Et EJS

#

Ca serait une bonne idée ?

#

Je sais pas s'il supporte TS par contre

slim anvil
#

EJS c'est du templating

loud flint
#

Ca dépend de ce que tu dois, faire, mais si c'est très simple, je pense que du vanilla js c'est la meilleure idée, tu installes TS et après tu transpiles à la main ou alors tu setup un task runner style gulp pour automatiser la transpilation

bold sparrow
#

Ouaip j'utilise gulp

#

Donc en vanilla ça serait plus adapté

#

C'est juste mapper des valeurs que je dois faire

slim anvil
#

Si c'est juste faire ça je vois meme pas l'utilité de ts finalement

bold sparrow
#

L'habitude lol

slim anvil
#

Oui mais bon si tu passes + de temps sur la config de ton projet

loud flint
slim anvil
#

Oui fin ca le rend plus lisible si c'est juste un tableau et un map

loud flint
#

La config se fait une fois et puis il est tranquille

slim anvil
#

ts va rien changer

loud flint
slim anvil
#

C'est pour ça que je dis "SI c'est juste pour faire ça"

loud flint
#

En effet 😉

bold sparrow
#

On va dire que je ferais juste une maquette, après je voudrais bien utiliser la tech PWA

#

Donc là -> Angular me parait adapté

slim anvil
#

Déjà voilà donne toutes les infos dès le début

#

Si tu veux passer par PWA, passe par un framework qui va le gérer complètement

#

Mais angular ca me parait trop gros pour ce si petit projet

bold sparrow
#

Ouais c'est vrai lol

slim anvil
#

D'où vitejs, ou preact si tu veux du light
ou sinon react / vue

bold sparrow
#

En vrai ... Je vais me renseigner sur vite

slim anvil
#

c'est très cool, ils ont leur propre serveur de build donc ils passent pas par webpack ou autre qui est très long

#

ca compile a une vitesse folle

#

Et tu as un support vue / react sur le template, et typescript aussi bien sur

bold sparrow
#

C'est fait par des français ?

slim anvil
#

Vitejs c'est fait par un mec de vuejs

#

Evan you

#

(un des createurs de Vue.js, donc t'as pas trop de soucis a te faire kappa)

bold sparrow
#

Ouais je m'en doute bien du coup

blazing wadi
#

yo vous savez si on peut installer la version 13 de djs ?

tight lodge
#

Oui.

cyan iron
#

npm i discord.js@dev

tight lodge
#

npm i discord.js@dev

#

Ha !

cyan iron
tight lodge
#

;-;

#

Je te préviens juste que tu auras bcp de changements.

blazing wadi
#

merci les mecs

#

après c'est juste pour test

tight lodge
#

👌

dire latch
#

Hey !

#

Quelqu'un qui sais utiliser rethinkdb et qui sais faire une sauvegarde avec ? 🤔

ashen rapids
dire latch
#

Fonctionne pas car sa me fais des erreurs

#

😔

ashen rapids
#

Quelles sont les erreurs ?

white sedge
#

ceci et mon sys de log pour les msg des membres et je souhaite que avant le 'a écrit' il y ait le pseudo du membre et apres le 'a ecrit' le message du membres

module.exports = {
    run:(client)=>{
        client.logger.log('info',`a écrit `)
        const chatbot  =  new  Chatbot({name: "Udit", gender: "Male"});
        client.chatbot.chat("Hello").then(console.log).catch(e => logger.log(e));```
ashen rapids
#

Tu sais comment récupérer le pseudo du membre déjà ?

white sedge
#

je crois que c client.user

ashen rapids
#

C'est un bot Discord ?

white sedge
#

oui

ashen rapids
#

Et ça c'est un évent que tu reçois ? Quel est l'event ?.

white sedge
#

l'envent c 'message'

#

dés que qlq ecrit dans le chat

ashen rapids
#

Ok et bien effectivement ton user ça sera client.user

#

Cependant il te manque un paramètre d'arrivé dans ton évent pour pouvoir récupérer le message

#

Regarde bien la doc de l'event message

white sedge
#

ah

cyan iron
#

client.user c'est ton bot hein

#

Doc je comprends pas l'intérêt de récupérer client.user dans un système de log

#

Franchement @white sedge il faudrait que tu suives un tutoriel histoire d'apprendre les bases

blazing wadi
#

c'est plus message.author?

cyan iron
#

Il importe même pas message

#

Donc ça risque d'être compliqué

blazing wadi
#

ouais effectivement

#

surtout que si c'est dans l'event message tu dois mettre message et pas client

cyan iron
#

Je pense qu'il a trouvé le code quelque part et qu'il comprends pas vraiment ce qu'il fait, c'est pour ça qu'il faudrait que tui suive un vrai tuto

blazing wadi
#

C'est quoi ChatBot?

cyan iron
#

Un module sûrement

#

¯_(ツ)_/¯

blazing wadi
#
cyan iron
#

Ah kappo

blazing wadi
#

c'est bizarre ça

cyan iron
#

Non mais je t'ai dit

blazing wadi
cyan iron
#

Je suis pas sûr qu'il comprenne réellement ce qu'il fait

blazing wadi
#

bah moi je comprends pas vraiment non plus

#

parce que si c'est juste pour récupérer le contenu d'un message

#

faut pas faire ça kapp

cyan iron
#

Tient @white sedge

#

Il me parait pas mal

ashen rapids
#

Je conseillerai plutôt : https://discordjs.guide/

Créé par la communauté, il y a rien de mieux et t'es sûr à 100% que ce qu'ils te feront faire, c'est safe. Et ils te donnent que les bonnes pratiques de dev

cyan iron
#

Oui mais c'est quand même mieux une vidéo

#

Surtout que c'est en anglais

ashen rapids
#

Le problème des tutoriels youtube quand t'es débutant, c'est que tu sais jamais si on t'apprends à faire les choses de la bonne manière ou pas

DiscordJS Guide c'est ultra pédagogique. On va te dire : Pour faire ça, faut faire comme ça, parce que ....
La bonne pratique est de faire comme ça ... Parce que ...

slim anvil
#

Et surtout que en vidéo tu recopies bêtement la plus part du temps

opal harness
#

Yo,
Je fais comment pour delete un channel discord grace à son ID quand le serveur se lance

ashen rapids
# opal harness Yo, Je fais comment pour delete un channel discord grace à son ID quand le serve...

Il faut que tu récupères le channel à partir de ton ID. Du genre :

await client.channels.fetch("L'ID_DE_TON_CHANNEL");

Et qu'une fois que t'as récupéré un object channel, suffit d'utiliser la méthode delete([raison]) pour supprimer le salon.
Si c'est un channel vocal par exemple : https://discord.js.org/#/docs/main/stable/class/VoiceChannel?scrollTo=delete

opal harness
ashen rapids
#

C'est un truc que t'as en dur comme ça ?

opal harness
#

Quand je créer un embed, je l'écrirais dans une bd en json pour ensuite le récup

opal harness
#

@ashen rapids

ashen rapids
#

Oue ok je vois

#

A mon avis si tu stockes l'ID du message, tu devrais aussi stocker l'ID du channel

#

De cette manière tu fetch le channel et ensuite tu fetch le message dans le channel

#

Puis tu supprimes

opal harness
#

Ok

tight lodge
#

Hello !
Actuellement j'essaye de faire une commande pour blacklister des utilisateurs de mon bot. J'ai donc fait ce code : ```js
const target = client.users.cache.get(args[1]); //On prend l'id de l'utilisateur fournit
const reason = args.join(" ").slice(22); //On récupère la raison de ce blacklist
const embed = new MessageEmbed().setTimestamp() // et on fait un embed

switch(args[0]) {
    case "add": 
    if(!target) return message.channel.send("Veuillez mettre l'id une personne !");
    if(target.id === client.config.botId || target.id === client.config.ownerId) return message.channel.send("Cette personne fait partit du personnel du bot !"); //Si l'id est égal au mien ou au bot, on bloque
    if(!reason) return message.channel.send("Veuillez mettre une raison !");

    const newBl = {
        id: target,
        name: target.tag,
        reason: reason,
        author: message.author.id,
        time: moment(new Date()).format("DD/MM/YYYY HH:mm:ss")
    };
    await client.createBl(newBl);
    break;
    default: 
    message.channel.send("Argument invalide !");
    break;
}
Or, si je met mon id, il me blacklist correctement. Si je met l'id d'un ami, j'obtiens cette erreur : ```js
(node:12352) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'id' of undefined
    at Object.module.exports.run (d:\programmation\PicsouBot\commands\Owner\bl.js:15:19)
    at module.exports (d:\programmation\PicsouBot\events\client\messageCreate.js:53:9)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)
(Use `node --trace-warnings ...` to show where the warning was created)

J'ai donc console.log(target) et : quand c'est moi, j'obtiens un object de User et, si c'est un ami : undefined.

#

Le problème est donc : pourquoi moi je me fait blacklist et pas mon ami ?

ashen rapids
tight lodge
#

Gheu.

#

C'est marqué sur la doc ?

#

J'y aurais jamais pensé ;-;

ashen rapids
#

Je te conseille plutôt d'utiliser la méthode fetch pour récupérer un utilisateur

tight lodge
#

Thanks !

#

Donc : user.fetch(param) ?

ashen rapids
#

client.users.fetch(**)

tight lodge
#

Hummm.

#

Presque.

ashen rapids
#

Fais juste gaffe, car ça return une promesse

#

Donc utilise bien await (ou then)

keen narwhal
#

Salut salut salutation
Vous pouvez m'aider, j'ai un mod mail ( support en mp ), je souhaite empêché le bot de transmettre les everyone et les here, par le weebook qu'il crée

#

Avez vous une solution

tight lodge
#
if(message.content.includes("@everyone") return;

Je présume.

red torrent
bold sparrow
#

Si tu peux créer un array ça serait encore mieux

#

Ou alors tout disable et ajouter l’option allowedMentions et choisir ce que tu veux ( rôles, users )

keen narwhal
keen narwhal
red torrent
#

il va te falloir une regex

peak cedar
#

    if (message.content.startsWith("!test")) {
        message.react('✅').then(() => message.react('☑️'));

        const filter = (reaction, user) => {
            return ['✅', '☑️'].includes(reaction.emoji.name) && user.id === message.author.id;
        };

        message.awaitReactions(filter, { max: 1, time: 60000, errors: ['time'] })
            .then(collected => {
                const reaction = collected.first();

                if (reaction.emoji.name === '✅') {

                    message.reply('Tu a réagit avec le pousse vers le haut ');

                } else {

                    message.reply('Tu a réagit avec le pousse vers le bas ');

                }
            })
            .catch(collected => {
                message.reply('T BO SI TU VOIS SA ');
            });



    }

#

comment je fait pour lui ajouter un role avec ce code ?
Merci

ashen rapids
#

Il faut que tu utilises : member.roles.add()

keen narwhal
#

Merci beaucoup

peak cedar
#

entre les () je met quoi ?

#

il faut que je dev un role ?

ashen rapids
#

L'ID du rôle

peak cedar
#

member.roles.add(871377033022812220)

#

ok je test

#

sa fait rien

#

    if (message.content.startsWith("!test")) {
        message.react('✅').then(() => message.react('☑️'));

        const filter = (reaction, user) => {
            return ['✅', '☑️'].includes(reaction.emoji.name) && user.id === message.author.id;
        };

        message.awaitReactions(filter, { max: 1, time: 60000, errors: ['time'] })
            .then(collected => {
                const reaction = collected.first();

                if (reaction.emoji.name === '✅') {

                    message.reply('Tu a réagit avec le pousse vers le haut ');
                    member.roles.add(871377033022812220)

                } else {

                    member.roles.add(871377033022812220)

                    message.reply('Tu a réagit avec le pousse vers le bas ');

                }
            })
            .catch(collected => {
                message.reply('T BO SI TU VOIS SA ');
            });



    }

ashen rapids
#

C'est un STRING qu'il faut mettre

#

Tu sais développer un peu en JS ?

peak cedar
#

member.roles.add("871377033022812220")

bold sparrow
#

Yep

peak cedar
#

jsuis justez genre debile 😂

ashen rapids
#

Mais ton object member doit correspondre à la bonne personne aussi dans ton code

peak cedar
#

cet a dire

#

celui qui react ?

ashen rapids
#

C'est celui qui react qui doit avoir le rôle ?

bold sparrow
#

Chose importante, la personne qui réagit est de classe User

#

Et toi tu dois ajouter à un GuildMember

peak cedar
#

donc

dire latch
#

🤔

peak cedar
#

GuildMember.roles.add("l'id?")

bold sparrow
#

Non

#

C'est une classe GuildMember

#

Je t'invite à apprendre un peu Javascript et lire la documentation DJS

#

Tu n'as pas l'air très familier avec

#

J'ai l'impression que tu fais à taton sans forcément réfléchir

keen narwhal
#

Ou une vidéo youtube 😅

ashen rapids
#

C'est jamais le bon bail les vidéos youtube

#

T'apprends pas avec ça

keen narwhal
#

Car la c'est pas formé comme une commande, sa doit être dans un fichier genre le Index suefort

#

Je te connait twa, Hugo ^^

peak cedar
#

😂

#

koman sa ?

keen narwhal
#

Just Heberg ;)

peak cedar
#

ah uyiiiiiiii

dire latch
#

Tu peut apprendre avec des vidéos youtube hein 🤷‍♀️

keen narwhal
#

Aussi :)

dire latch
#

La docu, ouais ouais

#

Jconnais pas 😂

bold sparrow
#

Tu fais sans la doc Duck ?

#

Si je map un des valeurs d'un fichier en JS vanilla, le fichier sera dans les sources de mon site ?

#

Si c'est le cas, comment mapper sans qu'il y ait quelconque accès, faire une sorte de ngFor avec Angular sans montrer un seul fichier JS ?

dire latch
bold sparrow
#

Je sais pas si c'est clair

dire latch
#

Ou je demande

bold sparrow
dire latch
#

Ba ouais

#

C'est mieux qu'une doc qui donne aucun exemple

bold sparrow
#

Après ... la doc quand tu connais le langage t'as pas forcément besoin d'exemples

#

tant qu'ils typent tout ce qui font, c'est cool

dire latch
#

Ba pas forcément hein, tu peut oublier ou autres 🤷‍♀️

#

Puis, c'est mieux en vidéo avec des exemples/explications

ashen rapids
#

Sauf qu'en vidéo tu recopie ce qui est dit et t'apprends pas

dire latch
#

Ba tu peut apprendre comme ça 🤔

ashen rapids
#

Pas tellement d'accord avec ça

bold sparrow
#

20 ans plutôt je sais pas comment t'aurais fait

#

Lol

ashen rapids
#

Pas si tu recopies bêtement ce qui est dit

dire latch
#

Ba après, chacun à ses manières de faire

bold sparrow
#

Bien sûr

#

C'est tout à fait respectable

#

:p

#

Chaque manière est bonne à prendre tant qu'on y prends du plaisir

dire latch
#

Yep

ashen rapids
#

L'autre soucis des vidéos YouTube, c'est que tu sais pas si ce qu'on te fait faire c'est la bonne manière de faire ou non

dire latch
bold sparrow
#

Aïe

#

Quelle erreur de dire ça

#

:/

#

Tu préfères 10 lignes ou 20 ?

dire latch
#

Le rapport ?

#

Aucun

bold sparrow
#

Tu préfères un chargement de 1seconde ou 0.7s ?

dire latch
#

Merci bien

bold sparrow
#

D'accord.

#

J'appelle ça l'optimisation

#

Il y a rapport

ashen rapids
#

Ho que si ...
Simple exemple : une vidéo guide qui t'explique comment faire un bot modo avec 5 commandes et qui te met tout le code dans un évent messageCreate avec je ne sais combien de if / else

Et en parallèle un guide qui t'explique comment faire un command handler avec un fichier par commande de manière ultra propre

Donc oui il y a toujours plusieurs manières de faire mais tu as toujours des manières mieux que les autres

dire latch
#

Oui, donc aucun rapport avec la manière de faire 👍

bold sparrow
#

D'accord Duck

#

J'y connais rien kappa

dire latch
#

L'optimisation et une manière de faire est différente hein

#

Sa n'as rien à voir

bold sparrow
#

Son exemple est parfait

#

Je parle d'optimisation de lignes, (code)

#

Et pareil, l'optimisation d'affichage sur des sites web, suivant la manière de faire, ça sera différent

dire latch
#

Tu peut faire plusieurs manières et que les deux sois optis ou non 🤷‍♀️

#

Donc bon, sa tient pas la route ce que tu dis

ashen rapids
#

C'est aussi une question de maintenance et de lisibilité de code. C'est des bonnes pratiques à avoir dès le début et ça, les vidéos YouTube ne le proposent pas vraiment (ça dépend qui mais faut connaître un minimum)

bold sparrow
#

Ca ne tient pas la route ce que je dis ?

fast steppe
#

A quoi ça sert de lire les docs, plus personne fait ça en 2021

slim anvil
#

please les gueguerres de code si vous pouviez juste faire un thread pour éviter de trop remplir le channel d’aide js avec votre débat

bold sparrow
#

Yep sorry

slim anvil
#

merci les mecs

fast steppe
ashen rapids
#

Ils ont déplacé la doc de DiscordJS V13 sur la prod

#

Release de la V13 bientôt 😎

blazing wadi
#

Après je suis plus trop sur Djs en ce moment

bold sparrow
ashen rapids
#

Perso j'ai déjà fait la migration de mon bot sur discord@dev, j'attends juste la release pour mettre en prod et être sûr

#

Mais en vrai ils ont fait du bon taff, c'cool 😇

bold sparrow
#

Je créer un thread pour recenser les avis 👀

#

Si ça peut intéresser

#

Aimez-vous la v13 de Discord.js ?

bold sparrow
red torrent
#

Salut, j'ai un utilisateur qui a un problème avec une app que j'ai développé avec electron : il y a quelque chose sur son pc qui empêche mon app electron d'avoir accès à internet, il ne lui est pas possible de fetch une url (ERR_NETWORK_ACCESS_DENIED)

#

Je lui ai fait ajouter une exception à son pare-feu mais ça ne règle pas le problème

leaden flare
red torrent
#

Le fetch qui ne fonctionne pas c'est le fetch du navigateur pas le electron-fetch

leaden flare
#

Ah d'acc, c'est moins évident dans ce cas de le régler ^^

red torrent
#

Pare-feu ou antivirus

leaden flare
#

Non à mon avis ca ne vient pas de là

red torrent
#

En ouvrant la console et en tapant un fetch sur google.fr j'ai la même erreur

#

Ce fameux ERR_NETWORK_ACCESS_DENIED

leaden flare
#

L'erreur provient-elle uniquement de son environnement utilisateur ?

red torrent
#

Donc je suppose que oui, d'autant plus que si je recherche des erreurs similaires avec chromium ça finit toujours sur "désactiver le pare-feu et l'antivirus"

leaden flare
#

Peut-être à-t-il changé ses paramètres réseaux ?

#

Ca ne peu pas venir d'un conflit entre ton app et ses datas sur chromium ?

ashen rapids
#

Un problème de pare-feux ou une connerie comme ça à mon avis

red torrent
leaden flare
#

Soit c'est un problème machine, soit un conflit de ton app avec un environnement utilisateur soit le problème est tous simplement l'utilisateur de la machine

red torrent
leaden flare
#

Check proxy

lone flax
#

Hello, il me semblait avoir vu la possibilité de restreindre les slash commands à des permissions spécifiques.
Impossible de le trouver en tant que propriété sur la doc, et sur les forums rien de bien concluant...
Pourtant j'suis presque sûr de l'avoir vu une fois ! Quelqu'un saurait m'aiguiller ?

#

Et en effet, sur la doc dégeu de discord, il y est bien :

#

Bah du coup j'ai trouvé

ashen rapids
lone flax
#

Faudra leur dire d'update KappaRetard

ashen rapids
#

T'as une explication assez claire ici

lone flax
#

Ah niquel merchi

ashen rapids
#

Faut pas lire la Doc Discord si tu utilises DiscordJS

lone flax
#

Ah bah clairement

#

Elle est horrible

#

je risque pas

lone flax
# ashen rapids T'as une explication assez claire ici

J'essaye de l'utiliser, j'ai ça comme erreur

TypeError [INVALID_TYPE]: Supplied permissions is not an Array of ApplicationCommandPermissionData.
    at ApplicationCommandPermissionsManager.add (D:\Users\spam\Documents\bot-max\node_modules\discord.js\src\managers\ApplicationCommandPermissionsManager.js:225:13)
    at Object.execute (D:\Users\spam\Documents\bot-max\src\events\commands.js:34:33)
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  [Symbol(code)]: 'INVALID_TYPE'
}

alors que ma table de permissions est bien

[ { id: '238299830940598272', type: 'USER', permission: false } ]

C'est chelou

#

Hop my bad j'ai réussi

robust fern
#

le code :

ashen rapids
#

Ton get(e.channel_id) renvoie nul, ça veut dire que ton Channel est pas dans le cache

#

Faut que tu fetch le channel plutôt

robust fern
#

Tu peux m'envoyer la modification a faire s'il te plaît (car ce code là c'est pas moi qui la fait c'est Quentinium)

ashen rapids
#

Je préfère que tu le fasses toi pour que tu apprennes 😇

T'as juste à rajouter une ligne où tu fetch() le Channel directement sur bot.channels

pallid plume
robust fern
#

J'ai mis ça @ashen rapids :

const channel = await bot.channels.fetch(e.channel_id).catch(err => {})
              if(channel) {
                channel.send(e.message)
              }```
slim anvil
#

Hein quoi

#

C’est quoi ce catch ? Tu essayes dans ton catch de voir si y a un channel et de l’envoyer ?

#

ah non pardon bordel

#

J’ai cru que le if était dedans ouf

ashen rapids
slim anvil
#

ça dépend juste de comment tu veux faire la chose cainiven, sois tu englobes tout dans un try catch, mais du coup dès que tu auras une erreur il kill tout le reste qui doit suivre et du coup dans ton catch tu renvoies une erreur ou autre
Sois tu viens juste faire un if (!channel) return
Mais c'est dans le cas ou tu peux faire sans imaginons ou que tu as quand meme du code a exécuter

#

Ou alors tu met pas tout dans ton try catch mais voilà à toi de voir en fonction de ton besoin surtout

ashen rapids
#

Perso je conseille d'englober tous tes events d'un try / catch (dans ton Event Handler) pour catch les erreurs et éviter que ton bot crash

south steppe
#

est ce que vous avez une alternative sérieuse à react.js en framework front ?

spring dock
#

vue

ashen rapids
#

Vue c'est excellent, c'est léger et simple à utiliser

Sinon si tu veux vraiment un bon framework, solide, t'as Angular

#

C'est généralement le framework que j'utilise sur les gros projets et où la durabilité / solidité est importante

south steppe
#

pour des gros projet justement tu conseillerais plutot angular ou react pour du front pur ?

ashen rapids
#

Du Angular plutôt que du React oui

React est trop libertaire et suivant tes paradigmes et façon de développer, ça peut vite devenir le cirque

#

Angular c'est ultra structuré, donc beaucoup plus facile à maintenir et à développer à plusieurs

#

D'autant plus que si une librairie pète sur React, tu dois tout changer à chaque fois. Angular a l'avantage d'être un framework maintenu par une grosse boite quand même

#

(React n'est pas un framework attention)

#

Et bien-sûr, Angular c'est full Typescript, donc maintenance du code beaucoup plus simple si tu l'utilises correctement

slim anvil
#

Angular a l'avantage d'être un framework maintenu par une grosse boite quand même
Pourquoi React c'est la startup du dimanche qui est dessus ? 🤣

ashen rapids
#

Non mais ça reste une librairie !

slim anvil
#

@south steppe mon avis c'est que le choix du framework dépend essentiellement du type de projet
Angular et pas comparable a React/Vue, c'est du MVC, donc forcement plus complet, car c'est ce qu'il recherche
React/Vue sont des "librairies" (comme vient de le redire Calypso) mais ultra complète aussi, sinon ce ne serait pas tant utilisé
L'avantage de celle-ci c'est qu'elle s'accorde a d'autres framework ou autre très facilement, la preuve avec wordpress ou tu peux facilement ajouter une couche React ou Vue, Ghost, Laravel et autre

Ca dépend vraiment de ce que tu recherches

#

Si maintenant ton projet est amené à être exporté sur du mobile, je te conseille React, c'est celui ou plus facilement (voir vraiment facilement) tu vas pouvoir tout réutiliser pour ton app React Native
Si tu veux un projet assez light, mais toujours avec un max d'outils à dispo forcement, je te conseille Vue
Si tu veux un projet très complet, ou vous allez être une grosse équipe dessus vu la charge de travail, je te conseille Angular

Et si tu veux juste changer la couleur du background, je te conseille jquery kappa

#

ET ... si tu arrives pas à te décider, que tu veux faire du React et du Vue, tu peux utiliser Vitejs kappa
Mais en vrai d'ailleurs que ton projet soit light ou non, hésite pas a regarder Vitejs (le monsieur de Vue) qui apporte une vitesse de build juste dingue, qui intègre très facilement React ou Vue (et même du native code)

lone flax
#

Hello, comment puis-je modifier la réponse à une interaction ?

#
interaction.reply(`Test`);

ne retourne rien

ashen rapids
#

Montre tout le code

lone flax
#

Bah le code c'est juste ça mais ça marche pas du coup

        const reply = await interaction.reply(`🤖 Envoi d'une réponse`);
        reply.edit("salut");
#

Il n'y a pas de fonction edit sur l'interaction

spring dock
#

editReply

#

non?

lone flax
#

T'es beau

#

Merci

south steppe
spring dock
# lone flax T'es beau

et tu peux utiliser le .defer pour avoir une espèce de loading au lieu de ton :robot: Envoi d'une réponse

#

en vré

lone flax
#

Yep t'inquiète mais c'est juste pour du debug, c'est pour faire des mini-jeux

lone flax
#

Bordel j'ai cette erreur

#

ça fait 20 minutes je suis dessus impossible de la régler

#
    const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES] });
    require('discord-buttons')(client); // ceci cause l'erreur
#

Il y a des flags spéciaux à mettre pour les buttons discord ? (rien n'est dit dans la doc)

lone flax
#

up 😦

#

ça va faire 1h

dire latch
#

Peut être que ya pas le d ?

#

Jsp 🤷‍♀️

lone flax
#

genre iscord-buttons ?

dire latch
#

Nan -__- Je parlai de ton screen mdrr, j'y connais rien là dedans

lone flax
#

ptdr

#

ok

#

le d vient du module

#

donc j'imagine qu'il n'y a pas d'erreur dans leurs trucs

dire latch
#

button.reply.edit

#

C'est ça dans la doc

#

Pour edit

dire latch
lone flax
#

non mais je veux pas edit un bouton

#

je veux en ajouter un

#

mais juste quand j'essaye de require le module ça veut déjà pas

#

j'ai une erreur

ashen rapids
#

Pour utiliser les buttons, tu dois apporter de cette manière :

const { MessageButton } = require('discord.js');
lone flax
#

discord.js ? 😮

ashen rapids
#

Oui

lone flax
#

C'est intégré dedans?

dire latch
#

await button.reply.think(true) nan ?

ashen rapids
#

Oui

lone flax
#

incroyable

#

et il y a une doc pour ça ?

ashen rapids
#

Ensuite pour créer le bouton, rien de plus simple:

new MessageButton().setLabel('. . .')....```
lone flax
#

Ahhh

#

Moi j'utilisais discord-buttons

ashen rapids
#

Utilise ce qui est prévu par DiscordJS, t'auras moins de soucis

#

Et t'as bien une doc

lone flax
#

Je ne savais même pas, merci

ashen rapids
robust fern
keen narwhal
#

J’avais même pas vu qu’ils l’avaient ajouté, bien joué

robust fern
#

Wow le boss le vrai @keen narwhal

keen narwhal
#

😜

blazing wadi
blazing wadi
ashen rapids
blazing wadi
ashen rapids
#

Mais tu peux déjà dev dessus pour que une fois qu'elle sorte, tu as juste à deploy

blazing wadi
#

Ouais mais je préfère dev quand elle est sortie et puis flemme de dev MTN en JS

blazing wadi
#

Après j'ai surtout 0 chance

#

Parce que je fais juste mon handler

#

TypeError: Cannot create property 'shardCount' on string

#

direct

keen narwhal
blazing wadi
#

Tqt j'aurais dû mettre un ?

#

😂

keen narwhal
#

En effet

blazing wadi
#

Bah ça m'énerve j'ai des erreurs internes moi là =)'

keen narwhal
#

xD

#

Envoie si faut on peut t’aider

ashen rapids
#

Oue envoie car même si c'est toujours en dev chez eux, ça fonctionne très bien

bold sparrow
#

Pas tout fonctionne, les options d'intéractions déconnent

#

En tout cas il y a quelques semaines, à voir si c'est corrigé

ashen rapids
#

Aujourd'hui j'ai pu tester tout sans problème

blazing wadi
#

Je vous enverrai ça plus tard

keen narwhal
#

Dac

#

Super 👍

ashen rapids
#

Par hasard, quelqu'un connait un bon Form Builder open-source qu'on pourrait intégrer dans une application JS existante ? 😇

nocturne fable
#

Bonjour, j'ai un problème avec mon help.js ça me dit que fs.readdirSync('./commands') n'est pas une fonction mais je ne comprend pas l'erreur. J'ai essayer de mettre fs.readdir(..) ca ma mis la même erreur, j'ai aussi essayé de réinstaller fs la même chose aussi. Donc je viens ici pour vous demander de l'aide.

#

voici le code

#
const discord = require('discord.js');
const fs = ('fs')
const embed = new discord.MessageEmbed()

module.exports = {
    name: 'help',
    description: 'Affiche la liste des commandes.',
    syntax: '`<commande>`',
    alias: null,
    run(message, args, client) {
        const commandFiles = fs.readdir('./commands');
        for (const file of commandFiles) {
            const command = require(`./${file}`)
            embed.addField(command.name, command.description)
            message.channel.send(new discord.MessageEmbed()
                .setTitle('__**:question:・Aide**__')
                .setColor('#00ff00')
                .setDescription(`__**🛠️・Utilitaires**__\n\n\`\`\`help,ping\`\`\`\n\n__**:shield:・Modération**__\n\n\`\`\`kick,ban\`\`\`\n\n__**:moneybag:・Économie**__\n\n\`\`\`withdraw,deposit,balance,top,work,slut,crime,rob\`\`\``))
        }
    }
}
#

voici l'erreur

#
TypeError: fs.readdir is not a function
    at Object.run (C:\Users\neird\OneDrive\..\commands\help.js:11:33)
    at Client.<anonymous> (C:\Users\neird\OneDrive\..\index.js:24:65)
    at Client.emit (events.js:375:28)
    at MessageCreateAction.handle (C:\Users\neird\OneDrive\..\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (C:\Users\neird\OneDrive\..\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\neird\OneDrive\..\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)        
    at WebSocketShard.onPacket (C:\Users\neird\OneDrive\..\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\neird\OneDrive\..\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\neird\OneDrive\..\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (events.js:375:28)
#

me ping svp

spring dock
#
const fs = ('fs')

->

const fs = require('fs')
spring dock
nocturne fable
#

ah mais oui, j'avais oublier mercii

keen narwhal
keen narwhal
tight lodge
#

À ce stade, ce n'est plus une pendaison mais une torture qu'il faut.

blazing wadi
nocturne fable
blazing wadi
#

DISCORD.JS 13 yeah

blazing wadi
#

Pouah je suis passé de la v12.18.1 de node à la v16.6.1 😂

sharp grail
#

rip ça va être super long de tout passer en v13

blazing wadi
#

yes

bold sparrow
#

Welcome to DJS v13 !!

ashen rapids
#

Enfin 😎

queen ocean
#

good bye Commando 😦

burnt perch
#

En plus ya des bot gca qui tourne avec commando nn ?

#

Tu va devoir redev des trucs lors du passage en v13

queen ocean
queen ocean
queen ocean
burnt perch
#

Je confirme

#

Je comprend pas pk plus de commando c'était archi cool ce ptit framework après ça fait longtemps que j'ai pas touché du d.js

hard iris
oak turret
#

flemme en vrai des packages le font en v12, commando c’est très bien

nocturne fable
#

La v13 de discord.js est sorti quand ?

queen ocean
nocturne fable
#

Ah Okk

#

Je ne savais pas

#

Je pensais que ça faisait longtemps

#

Eh bien merci !

bold sparrow
#

C'est possible en définissant un type en TS de faire :

type group = {
  GROUP: {
    name: string
    // Pour chaque clés mises dans GROUP, elles auraient automatiquement le type name: string
}```
#

Typer automatiquement les valeurs dans GROUP quoi

loud flint
bold sparrow
#

Je vais expliquer plus simplement en tout cas j'espère

#
type group = {
  GROUP: {
    GROUP1: {
       name: string
    },
     GROUP2: {
       name: string
    }
   // J'aimerais ne pas avoir besoin d'écrire GROUP1, GROUP2, que tout ce qui se trouve dans GROUP prenne le type name: string
}```
#

@loud flint Est-ce mieux ?

loud flint
#

Pourquoi tu ne fais pas un array au lieu de plein d'objets ?

bold sparrow
#

Parce que je m'en sers après, c'est important que ça soit une multitude d'objets.

loud flint
#

Ah

bold sparrow
#

Pas pratique je sais

#

Mais à la fin ça me facilite la vie

#

C'est qu'une mauvaise passe lol

loud flint
#

Non pas vraiment, je pense que c'est pas une bonne chose, m'enfin bon, là n'est pas ta question

#

C'est vraiment pas ouf car tu pourrais avoir l'objet groupe de type any et ensuite insérer group1, group2 etc comme tu le souhaites

#

Ou alors utiliser un dictionnaire

#

Mais une nouvelle fois tu te retrouves avec group1/group2 etc

#
const group = {
  GROUP: [
    {
      name: "",
    },
    {
      name: "",
    },
    {
      name: "",
    },
    {
      name: "",
    }
  ]
};

C'est si simple avec un tableau :/

bold sparrow
#

Comme je t'ai dit, avec un tableau j'aurais plus de mal à récupérer mes propriétés.

loud flint
#

Elles doivent absolument être nommées ?

bold sparrow
#

Yes.

loud flint
#

Si oui, autant prendre une map

#

(Un dictionnaire)

bold sparrow
#

Créer une map de tout ça tu veux dire ?

#

Ah oui c'est pas bête quand j'y pense

loud flint
#

Bah en gros avoir un système de clefs valeur

bold sparrow
#

Oui oui, c'est pas bête tient

#

Là je pourrais typer à 100%

#

Indirectement tu as résolu mon problème lol

loud flint
#
class MyThing {
  name: string;

  constructor(name: string) {
    this.name = name;
  }
}

const GROUP = new Map<string, MyThing>();
map.set("GROUP1", new MyThing("nom"));
// ...
#

Quelque chose dans le style

bold sparrow
#

J'allais pas faire exactement comme ça

#

Mais ça revient totalement au même

loud flint
#

A implémenter selon ton projet bien sûr :p

bold sparrow
#

Yep.

loud flint
#

Content d'avoir pu t'aider :p

bold sparrow
#

Et bah écoute je te remercie grandement

#

J'avais pas pensé à faire un dico !

#

Tu m'as sauvé un peu de temps

loud flint
#

Dans le cas où ta clé doit avoir absolument un nom, le dico c'est la meilleure piste :p

bold sparrow
loud flint
#

Ou alors un any, mais dans ce cas c'est un peu contourner Typescript lol

bold sparrow
loud flint
#

Et ça reste moins flexible avec le any

keen narwhal
#

Comment faire svp

bold sparrow
#

Je fais pas du TS pour revenir au JS

loud flint
keen narwhal
#

je suis pret a payer car j'ai vraiment besoin d'aide

bold sparrow
keen narwhal
#

Pas forcement de code

loud flint
#

"Comment faire" => Donne un peu plus de détails sur ce que tu veux on pourra te donner des pistes

bold sparrow
#

Ah ok c'est ce que j'avais compris avec ton " je suis prêt à payer "

#

Excuse-moi.

keen narwhal
#

Pas de soucis 🙂

keen narwhal
#

sans donner ce resultat pas ouf

keen narwhal
bold sparrow
#

Ce que tu peux faire, c'est créer une division invisible, qui devient visible en premier-plan

#

Lorsque tu cliques sur un bouton ou quelque chose de la sorte

#

C'est ce que j'aurais fait en tout cas

#

Tu jouerais sur les props z-index et display

#

Si mes souvenirs sont bons

#

Ou visibility plutôt !

loud flint
#

Oui, personnellement j'imagine une div display: none par défaut (ou alors cachée autrement si tu veux l'animer).
Tu la stylises comme tu veux, et en appuyant sur un bouton tu ajouterais/enlèverait une classe "active" et cette classe comporterait le "display: block"

bold sparrow
loud flint
#

Si tu veux l'animer, joue avec visibility, max height etc plutôt que display none

#

Cependant, si tu veux être user-friendly niveau accessibilité, si tu utilises PAS display none, n'oublie pas "aria-hidden"

bold sparrow
#

@loud flint La doc va me complexifier la vie,

#

J'ai réfléchis dans ma tête

#

Mais c'est un type d'objet que je veux, pas un objet

#

Mais je pense avoir trouvé une alternative

loud flint
#

Si ça correspond à ce que tu veux why not !

bold sparrow
#

La généricité correspondait plus effectivement

loud flint
#

Mais attends du coup là classe MyThing dans mon exemple tu la voulais générique ?

#

Je suis pas sur de bien piger ce dont tu as besoin du coup

bold sparrow
#

C'est le " supportant plusieurs niveaux de profondeurs " qui m'a interpollé

#

Sous entendu que je peux typer dans une profondeur tous les éléments se trouvant dedans

#

Si j'ai bien compris

#

Je ne vais pas utiliser de class, mais un type

keen narwhal
#

vous savez d'ou proviens l'erreur ?

nocturne fable
#

Sais-tu que discord.js est sur la v13 maintenant ?

keen narwhal
#

donc si j'installe la v13 cela fonctionnera ?

nocturne fable
#

Non

#

Je pense que ton erreur proviens du faite que discord.js a changé de version. Et donc des parti de ton code aussi on probablement change

#

Après je me trompe peut être

keen narwhal
#

Je t'avoue je ne suis pas plus au courant que toi

nocturne fable
#

Tu peux t’aider de la documentation discord.js pour essayer de trouvé l’erreur.. mais moi je n’est pas encore codé en étant dans la v13 donc..

keen narwhal
#

je vais aller voir encore merci 😉

nocturne fable
#

Avec plaisir, et désolé de ne pas pouvoir t’aider plus que ça :/

keen narwhal
#

t'inquiète 😉 je vais trouver un autre moyen

nocturne fable
#

D’accord

bold sparrow
#

Il a juste mal renseigné ses intents.

bold sparrow
keen narwhal
sharp grail
#

les changements pour passer en discordjs v13 ;_;

dire latch
#

@slim anvil regarde mp quand tu as le temps 🙂