#javascript-typescript

1 messages · Page 20 of 1

fleet scaffold
#

c'est toi qui sait

empty mauve
#

mais jsp pourquoid mon bot rep plus et j'ais perdu bon badge

torn fog
#

Rip

empty mauve
#

limite jte passe mon index.js et se que je fesais donc une commande update_bot et rich presence

#

att jfait un fil il risque d'avoir beaucoup de truc

torn fog
#

Pose plutôt ton problème

#

Et je pense que telegraf c'est + sur #autres-sujets-dev-tech

gaunt merlin
#

Salut, est ce que si quelqu'un s'y connait un peu avec Sequelize saurait me dire pourquoi je n'arriverais pas à synchronisé mes models avec ma base de donnée ?
La connexion se fait mais les tables ne se créer pas. Je ne trouve absolument pourquoi. Voici un exemple d'un des models :

import {Sequelize, DataTypes} from "sequelize";
import sequelize from "../services/sequelize.js";

const user = sequelize.define('user', {
    id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
    },
    username: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
    },
    displayName: {
        type: DataTypes.STRING,
        allowNull: false,
    }
}, {});

export default user;

Et voici le fichier de configuration de sequelize :

import {Sequelize} from "sequelize";
import config from '../config.js';

const sequelize = new Sequelize(
    config.db.name,
    config.db.user,
    config.db.password,
    {
        host: config.db.host,
        dialect: 'postgres',
        logging: false
    }
);

sequelize.sync({alter: true, force: true})
    .then(() => {
        console.log('Table synced.');
    })
    .catch((error) => {
        console.error('Error while syncing tables :', error);
    });
export default sequelize;

Si quelqu'un aurait une idée, car je ne trouve vraiment pas...

strange thicket
#

Alors je dit peut-être une bêtise, mais je mettrais le sequelize sync dans l'app.js @gaunt merlin

gaunt merlin
#

Non toujours rien... C'est incompréhensible... Je sens que c'est encore un petit truc de rien du tout mais j'arrive pas à trouver...

#

En fait j'ai le log qui dit "Table synced." donc logiquement la connexion est bonne... C'est les tables qui veulent pas se créer je sais pas pourquoi...

strange thicket
#

Active le logging pour voir

gaunt merlin
#

J'ai juste le log par défaut de "Executing (default): SELECT 1+1 AS result"

strange thicket
#

Fait voir ton indexjs

gaunt merlin
#
import express from 'express';
import {glob} from "glob";
import config from "./config.js";

// App from express
const app = express();

// API Routes
glob.sync('./routes/*').forEach(async (file) => {
    app.use(process.env.BASE_PATH, (await import(`./${file}`)).default());
})

// Start express server
app.listen(config.app.port, () => {
    console.log(`🚀 Server running on port ${config.app.port} `);
})
#

Je pense que c'est parce que le sync() de sequelize se fait avant le define() des models...

thin scroll
#
const { TelegramClient, Api } = require("telegram");
const { StringSession } = require("telegram/sessions");
const { PhoneNumberInvalidError } = require("telegram/errors");
const validator = require("validator");

const BOT_TOKEN = "";
const apiID = ;
const apiHash = "";

const bot = new Telegraf(BOT_TOKEN);
const client = new TelegramClient(new StringSession(""), apiID, apiHash, {
  botToken: BOT_TOKEN
});

bot.start((ctx) => {
  ctx.reply("Bienvenue ! Veuillez entrer votre numéro de téléphone :");
});

bot.hears(/.*/, async (ctx) => {
  const phoneNumber = ctx.message.text.replace(/\D/g, ''); // Supprimer les caractères non numériques
  if (validator.isMobilePhone(phoneNumber, "any")) {
    try {
      await client.connect({
        phoneNumber: phoneNumber // Passer le numéro de téléphone correctement
      });

      const { phone_code_hash } = await client.invoke(
        new Api.auth.SendCode({
          phoneNumber: phoneNumber,
          apiId: apiID,
          apiHash: apiHash,
          settings: new Api.CodeSettings(),
        })
      );
      ctx.reply("Veuillez entrer le code de vérification :");

      // Attendre la saisie du code de vérification par l'utilisateur
      bot.hears(/.*/, async (ctx) => {
        const verificationCode = ctx.message.text;
        try {
          const { user } = await client.invoke(
            new Api.auth.SignIn({
              phoneNumber: phoneNumber,
              phoneCodeHash: phone_code_hash,
              phoneCode: verificationCode
            })
          );

          if (user) {
            ctx.reply("Vous êtes connecté sur le compte avec succès !");
          } else {
            ctx.reply("Échec de la connexion. Veuillez vérifier le code de vérification.");
          }
        } catch (error) {
          ctx.reply(`Erreur lors de la connexion : ${error}`);
        }
      });

    } catch (error) {
      ctx.reply(`Erreur lors de la connexion : ${error}`);
    }
  } else {
    ctx.reply("Numéro de téléphone invalide !");
  }
});


bot.startPolling();```

Bonsoir, Lorsque je met mon numéro de téléphone, je reçois bien un code de vérification donc je le rentre sur le bot mais il reste bloqué sur l'étape ou il me demande de rentrer mon num
#

pourtant sur la console log de la module gramjs ça m'indique que je suis co

queen ocean
#

Ta un gros problème de structure dans ton code, déjà tes pas sensé avoir 2 bot.hears avec le même filtre il me semble

thin scroll
queen ocean
#

pas de msg d'erreur ?

thin scroll
#

non

#

je verrais demain si je trouve pas je te ping ?

queen ocean
#

va si après j'ai jamais use l'api telegram

thin scroll
#

elle est bien complexe 😹

#

bonne nuit !

mossy vault
#

Bonjour, j'ai un petit problème sur mon programme js, je code un mini jeu style jeu des allumettes et je passe par un input pour faire une interaction entre utilisateur et programme mais je voudrais que mon programme attende à chaque fois qu'une donnée soit retourné pour continuer mon programme actuellement il ne fait que de boucler et cela fait totalement planter mon site auriez vous une solution ou une partie d'idée sur lequel je pourrais me renseigner ? (je ne sais pas si je suis très claire donc en cas de manque d'infos vous pouvez me mentionner)

mossy vault
#

Ok merci je vais me renseigner sur ce sujet

true marten
glass cargo
rocky oar
#

Yop les gueux ! ✌️
Dites j'aurais besoin que l'ont m'éclaire :
Dans une simple fonction For avec VueJS, j'aimerais récupérer l'index de l'ingredient dans le tableau, un peux comme si on ferais for(i = 0; i<10; i++) et qu'on récupérait i à chaque itérations.

Code :

#

c'est + lisible comme ça :

pallid plume
#

v-for="ingredient, index in recipe"

#

Voilà voilà 🙂

rocky oar
#

Ah tout simplement 🤦‍♂️

#

Merci !

rocky oar
# pallid plume ```v-for="ingredient, index in recipe"```

Et tu ne sais pas si ce serait possible, admettons, avec cet index, en css, de pouvoir gérer le z-index soit via une class ou un id mais dynamiquement sans faire #1 #2 etc .... ?

En gros pour expliquer, comme tu le vois dans le code au dessus, j'aurais plusieurs LI suivant les ingrédients sélectionné, mais les li se mettent au dessus du précèdent (je sais pas si tu arrive à me suivre) hors je voudrais l'inverse donc gérer ça avec le Z-index en CSS

pallid plume
#

Bah si tu peux utiliser les donnés de ton index dans ton :style

rocky oar
#

Par exemple, un equivalent de ```css
&.nth-child({{ index + 1 }}){
blablabla
}

pallid plume
#

genre
:style='`z-index: ${index}`'

#

Moi j'aurai essayé ça

rocky oar
#

Yep, faudrais que je trouve un moyen de faire en sorte que ça fasse un index déscendant genre 5 - 4 - 3 - 2 - 1

pallid plume
#

Bah tu fais la lenght total - index

#

Comme ça c'est dans le cense inverse

rocky oar
#

200iq Pourquoi je me prend la tête

#

Parfait ça marche merci 🤣

#

(On va dire que c'est le matin hein)

rocky oar
#

(Je n'ai pas encore enlevé le code inutile et corrigé ce que je pourrais mieux faire)

#

Du coup j'ai encore un peu de boulot pour avoir ce résultat mais le plus chiant c'était l'animation du burger (Maquette dynamique AdobeXD)

#

D'ailleurs, je n'ai pas respecté pour l'animation du bouton car c'était trop casse tête, et mon Container principale je l'ai foutu en display Grid

floral bolt
#

c'est tres propre

rocky oar
floral bolt
#

le rendu

#

le code je regarde pas 🥲

rocky oar
#

Je l'ai mis en codeSnap le component car trop de lignes pour Discord 🤣
Mais ça vas j'ai pas énormément galéré à le faire, juste quelques blocage du au réveil difficile que j'ai pu régler grâce à Lucky
J'avais totalement zappé que je pouvais faire du style conditionnel directement dans mon component

misty parcel
misty parcel
rocky oar
# misty parcel ow

Il te fait une image du code sélectionné, et tu clique sur ce que j'ai encadré pour sauvegarder l'image :

misty parcel
#

Attends mais toi c'est en couleur

#

Ah oui non ok j'ai tester sur du code commenté

#

Bête je suis

rocky oar
#

Ah mais tu peux changer les paramêtres de l'extension pour changer en PNG et avoir un fond transparent

rocky oar
keen narwhal
#

bah c'est le meme

rocky oar
#

Ah oui

#

Attend

keen narwhal
#

codesnap prend ton theme

misty parcel
#

ah non ok

#

Oh trop bien

rocky oar
#

Et @keen narwhal c'est Andromeda'84 mon thème

#

Je l'aime bien, et je trouve qu'il fonctionne bien (Je dev principalement du Javascript)

misty parcel
#

mmh, y'a pas un bouton pour enregistrer ? ça n'a pas l'air de marcher

#

Ou alors faut restart vsc

rocky oar
ancient sonnetBOT
#
Citation du message de onivoid#0 posté dans #javascript-typescript

quoteStart Il te fait une image du code sélectionné, et tu clique sur ce que j'ai encadré pour sauvegarder l'image : quoteEnd

Ce message contient également une image, visible à droite de l'embed.

➜ [Voir le message original](#javascript-typescript message)

misty parcel
#

aah

#

okok merci x)

rocky oar
#

Pas de soucis 😄

#

J'aime bien cette extension je trouve ça classe, pour faire des documentations, ou comme moi pour faire des dossiers c'est intéressant

keen narwhal
#
    const embed = new EmbedBuilder()
    .setColor("#2ECC71")
    .setImage(guild.iconURL()!)
    .setTitle(`• Informations du serveur`)
    .setDescription(`
        **• Owner »** <@${owner.id}>
        **• ID »** \`${guild.id}\`
        **• Modération »** \`${guild.mfaLevel}\`
        **• Analyse médias »** \`${guild.explicitContentFilter}\`
        \n
        **• Créé le »** \`${guild.createdAt.toLocaleDateString("fr-FR")}\`
        **• Salon AFK »** \`${guild.afkChannel ? guild.afkChannel.name : "Aucun"}\`
        `)
    .addFields(
        {
            name: "Guild",
            value: `
            > **• Boost »** \`${guild.premiumSubscriptionCount}\`
            > **• Emojis »** \`${guild.emojis.cache.size}\`
            > **• Stickers »** \`${guild.stickers.cache.size}\`
            > **• Channels »** \`${guild.channels.cache.size}\`
            > **• Roles »** \`${guild.roles.cache.size}\`
            > **• Membres »** \`${guild.memberCount}\`
            `,
            inline: true
        },
        {
            name: "Members",
            value: `
            > **• Humains »** \`${guild.members.cache.filter(m => !m.user.bot).size}\`
            > **• Bots »** \`${guild.members.cache.filter(m => m.user.bot).size}\`
            > **• Offline  »** \`${guild.members.cache.filter(m => m.presence?.status === "offline").size}\`
            > **• Online  »** \`${guild.members.cache.filter(m => m.presence?.status === "online").size}\`
            > **• Idle  »** \`${guild.members.cache.filter(m => m.presence?.status === "dnd").size}\`
            > **• DND  »** \`${guild.members.cache.filter(m => m.presence?.status === "idle").size}\`
            `,
            inline: true
        },
    )

Yo quelqu'un saurait me dire pourquoi le setImage ne fonctionne pas ?

keen narwhal
#

Bah nan ?

fleet scaffold
#

le point d'exclamation te gène pas genre ?

keen narwhal
#

La guild aura forcément une icon url

#

J'suis en ts

#

genre

#

x)

fleet scaffold
#

non mais t'as mis un point d'exclamation ici

keen narwhal
#

Oui

fleet scaffold
#

Mais pourquoi ?

keen narwhal
#

C'est pour éviter de devoir faire un if(!guild.iconURL()) return

fleet scaffold
#

la guild n'en aura pas forcément

keen narwhal
#

Ah bon ?

fleet scaffold
#

pas d'icones

#

donc pas d'icon url

keen narwhal
#

Oh fuck je pensais que c'était une iconURL aussi ca

#

que y'avais moyen de la récup

#

c'est relou ca un peu

fleet scaffold
#

nope c'est juste du texte

#

j'ai fait mes test mdrr

keen narwhal
#

bon bah ducoup mon setImage fonctionne c'est juste que y'a pas d'icon sur ma guild de test

#

merci

past nimbus
#

En général quand un champ est typé d'une certaine manière, il y a une certaine raison x)

keen narwhal
#

Mouais le typage de Djs est nul a chier parfois

sudden stump
#

Bonsoir,

Qui pourrai m'aider j'ai un soucis, j'ai une command giveaway pour discord qui fonctionne bien sauf un soucis.

Le soucis c'est que la liste des participants mes que les id est non les Pseudo comme sur les screen que j'ai envoyez.

keen narwhal
#

Avec le code c'est souvent mieux

true marten
#

<@>

true marten
#

Bonjour j'ai besoin d'aide

cyan iron
#

Ok

true marten
#

mdr

#

Avec ejs sur une page nommé dash j'affiche la liste des serveurs de l'utilisateur mais j'aimerais afficher seulement la liste des servuers ou il a la permissions admin comment faire svp ?

slim anvil
#

tu as un champ owner sur la guild normalement

#

et aussi un champ permissions

#

donc tu peux te servir des 2

true marten
#

Comment faire la conditions pour filtrer les serveur ou le user a la perm admin?

violet knot
#

if guild.owner_id == user.id or (guild.permissions & 8)

#

dequoi du genre

true marten
#
 <% guilds.forEach(guild => { %>
            <% if(guild.ownerId == user.id) { %>
          <div class="col">
            <div class="serv">
              <img class="serv-icon" src="https://cdn.discordapp.com/icons/<%= guild.id %>/<%= guild.icon %>.png" alt="<%= guild.name %> icon" />
              <br />
              <p><%= guild.name %></p>
            </div>
          </div>
          <% } %>
          <% }); %>```
violet knot
#

en se moment tu fais juste reguardes si c'est le owner

#

il faut que tu check les perm

#

aussi

#

check si il est admin

true marten
#

Comment

true marten
#

if(guild.members.fetch(user.id).permissions.has('ADMINISTRATOR') )

#

Cannot read properties of undefined (reading 'fetch')

violet knot
#

perso je fais pas de discord js j'ai juste repondu en me bassant sur la doc de discord

#

mais

#

en regardant en ligne

true marten
#

thx

#

J'ai réussi c good

violet knot
#

👍

true marten
#

Sa affiche la liste des serveurs ou je suis admin mais pas tous

#

C'est normal ??

fleet scaffold
#

la Perm pour admin c'est un peu spécial

#

c'est un chiffre très long 😂

#

c'est pas juste 8

true marten
#

Yep même si j'ai la perm admin sa ne marche pas

true marten
fleet scaffold
#

c'est genre 2103.... et plein de chiffre derrière

#

ce que je te conseille c'est de debugger en regardant le permission bitflag afin que tu vois c'est quel chiffre pour admin

true marten
#

Non mais j'ai réussi pas la peine le chiffre

#

tu met Administrator

fleet scaffold
#

???

#

T'utilise pas l'api toi

true marten
#

Discord.js

fleet scaffold
#

Ouais pas l'api

frosty sand
#

bonjour ou bonsoir pourquoi sa envoie aucun message quand quelqu'un rejoint ?
CODE

const { EmbedBuilder } = require("discord.js");

module.exports = {
  name: 'guildMemberAdd',
  async execute(client, channels, member, ) {
    
    console.log(`Salut, je suis ${client.user.tag}\n`);
    channels.reply(`Salut, je suis ${client.user.tag}`)
  },
};
near saddle
#

tu as une erreur ?

frosty sand
#

oui

#

je screen ou l'envoie par message ?

near saddle
#

peu importe

frosty sand
#

ok

#

en gros ils disent que channels.reply c'est pas une fonction

#

dcp jsp comment faire

drowsy ocean
#

C'est normal

near saddle
#

y'a pas de paramètre channels déjà

frosty sand
#

mais comment sa envoie un message alors ?

#

merci

near saddle
#

pour envoyer un message dans un channel :

client.channels.cache.get('ID_DU_CHANNEL').send('Salut !')
frosty sand
#

merci j'allais mettre guild a la place de channels jsp si sa allait macher

near saddle
#

ton .reply() marcherait sur un message

frosty sand
#

ah oui

near saddle
#

redis moi si 'cest bon

frosty sand
#

ok

#

une erreur :

#

ERREUR

at callListener (C:\Users\asmam\.vscode\AylanBot\node_modules\ws\lib\event-target.js:290:14)
    at WebSocket.onMessage (C:\Users\asmam\.vscode\AylanBot\node_modules\ws\lib\event-target.js:209:9)
    at WebSocket.emit (node:events:513:28)
Emitted 'error' event on Client instance at:
    at emitUnhandledRejectionOrErr (node:events:394:10)
    at process.processTicksAndRejections (node:internal/process/task_queues:84:21)
drowsy ocean
frosty sand
#

ok

#

le code entier ?

drowsy ocean
#

Non juste ce que tu a changer

frosty sand
#

ok

#

client.channels.cache.get('1079881958349348904').send(${client.user.tag} a rejoint le serveur dis lui bienvenue !)

drowsy ocean
#

Bah là frérot faut juste lire

#

Ah donc tu avais mis guild ou channel ?

frosty sand
#

channels

#

j'ai essayé avec guild pres mais aucun resultat

drowsy ocean
#

D'acc tu peux envoyer le code entier du fichier

frosty sand
#

ok

#
const { EmbedBuilder } = require("discord.js");

module.exports = {
  name: 'guildMemberAdd',
  async execute(client, channels, member, ) {
    
    console.log(`Salut, je suis ${client.user.tag}\n`);
    client.channels.cache.get('1079881958349348904').send(`${client.user.tag} a rejoint le serveur dis lui bienvenue !`)
  },
};
drowsy ocean
#

Es ce que tu sais ce que tu récupère en argument quand l'event se déclenche ?

frosty sand
#

comment ca en argument désolé ca fait longtemps que jai pas dev

true marten
#

@frosty sand explique tu veux faire quoi ?

frosty sand
#

un message de bienvenue

true marten
#

La tu envoi le pseudo du bot dans ton code

frosty sand
#

non

drowsy ocean
#

si

frosty sand
#

dans mon console.log si je retire le client.channels etc sa met la personne qui rejoint

true marten
#

client.user.tag = pseudo du bot + son tag

frosty sand
#

dcp je met member.user.tag ?

drowsy ocean
#

le client dans client.channels.cache doit être ton bot et pas le membre qui a rejoint

#

De plus channels et member ne servent a rien

true marten
#
const { EmbedBuilder } = require("discord.js");

module.exports = {
  name: 'guildMemberAdd',
  async execute(client, member) {
    
    console.log(`Salut, je suis ${member.displayName}\n`);
   member.guild.channels.cache.get("1079881958349348904").send(`${member} a rejoint le serveur dis lui bienvenue !`)
  },
};
frosty sand
#

merci

#

je teste sa et je te dis

#

aucun message d'erreur mais aucun message

#

att je regarde si l'id c'est le bon

true marten
#

console.log fonctionne ?

frosty sand
#

rien

true marten
#

T'as sauvegarder les modifications ?

frosty sand
#

oui

true marten
#

et il faut relancer aussi

frosty sand
#

je sais

drowsy ocean
#

Essaye de console log client et member au début de ta fonction pour voir ce qu'il te renvoi

frosty sand
#

sa me renvoie Salut, je suis undefined

true marten
#

T'es en quel version ?

#

et comment tu défini ton client

frosty sand
#

v18.14.2

true marten
#

Version discord.js pas node

frosty sand
#

comment on voit ?

true marten
#

package.json

frosty sand
#

14.8.0

true marten
#

Je peux voir ton main ?

frosty sand
#

index.js ?

true marten
#

oui

frosty sand
#
const { Client, GatewayIntentBits, Collection } = require('discord.js');;
const bot = new Client({
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildPresences,
        GatewayIntentBits.GuildMessageReactions,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.GuildVoiceStates,
    ]
})
bot.commands = new Collection();
bot.config = require('./config');

require('./src/Structure/Handler/Events')(bot)
require('./src/Structure/Handler/Command')(bot)



bot.login(bot.config.token)
#

un peu petit

true marten
frosty sand
#

ok

#
const fs = require("fs")

module.exports = async (bot) => {
    const eventFiles = fs.readdirSync('./src/Events/').filter(f => f.endsWith('.js'));
for (const file of eventFiles) {
    const event = require(`../../Events/${file}`);
    if (event.once) {
        bot.once(event.name, (...args) => event.execute(...args, bot))
        console.log(`L'event ${file} à été chargé avec succès !`);
    } else {
        bot.on(event.name, (...args) => event.execute(...args, bot))
        console.log(`L'event ${file} à été chargé avec succès !`);
    }
}

const eventSubFolders = fs.readdirSync('./src/Events/').filter(f => !f.endsWith('.js'));
eventSubFolders.forEach(folder => {
    const eventFiles = fs.readdirSync(`./src/Events/${folder}/`).filter(f => f.endsWith('.js'))

    for(const file of eventFiles) {
        const event = require(`../../Events/${folder}/${file}`)
        if (event.once) {
            bot.once(event.name, (...args) => event.execute(...args, bot))
            console.log(`L'event ${file} à été chargé avec succès depuis ${folder} !`);
        } else {
            bot.on(event.name, (...args) => event.execute(...args, bot))
            console.log(`L'event ${file} à été chargé avec succès depuis ${folder}!`);
        }
    }
})
}```
true marten
#

Ton event a bien été chargé ?

frosty sand
#

oui

sudden stump
# frosty sand oui

Essaye sa dans ton main ou index.js

//Message Bienvenue
bot.on("guildMemberAdd", member => {
    let bv = new Discord.EmbedBuilder()
    .setTitle("**__Nouveau Membre !__**")
    .setDescription(`**${member.user} est arrivè ! Dites lui bonjour !**`)
    .setThumbnail(member.displayAvatarURL())
    .setColor("#00acff")
    .setImage("image que tu veux")
    bot.channels.cache.get("ton channel").send({embeds: [bv]})
})```
frosty sand
#

ah merci

sudden stump
#

Car ta mis client.channels.cache.get au lieux de bot.channels.cache.get

foggy mica
#

Salut les gars un dev react sait pourquoi mon state ne rerender pas la page quand je le set depuis une fonction d'un event onClick ?

keen narwhal
#
import { NextApiRequest, NextApiResponse } from 'next';

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method === 'GET') {
    try {
      const response = await fetch('https://discord.com/api/v10/users/@me/guilds', {
        headers: {
          Authorization: `Bot ${process.env.BOT_TOKEN}`,
        },
      });

      if (response.ok) {
        const guilds = await response.json();
        const numGuilds = guilds.length;

        let totalMembers = 0;
        for (const guild of guilds) {
          const guildId = guild.id;
          const guildResponse = await fetch(`https://discord.com/api/v10/guilds/${guildId}`, {
            headers: {
              Authorization: `Bot ${process.env.BOT_TOKEN}`,
            },
          });
          const guildData = await guildResponse.json();
          totalMembers += guildData.approximate_member_count;
          
          console.log(`Guild: ${guildId}, Member Count: ${guildData.approximate_member_count}`);
        }

        console.log(`Number of Guilds: ${numGuilds}, Total Members: ${totalMembers}`);

        res.status(200).json({
          numGuilds,
          totalMembers,
        });
      } else {
        const errorData = await response.json();
        console.log(`API Error: ${errorData}`);
        res.status(response.status).json({ error: errorData });
      }
    } catch (error) {
      console.error('An error occurred:', error);
      res.status(500).json({ error: 'An error occurred' });
    }
  }
}

Salut, j'ai un souci avec ce code je n'arrive pas a choper le nombre de guild du bot
Guild: 721361625747030027, Member Count: undefined
Guild: 987298210617892864, Member Count: undefined
Guild: 1085677476530901082, Member Count: undefined

#

c'est régler

#

J'avais oublié : ?with_counts=true

feral oyster
#

vous me conseillerai quoi pour commencer à apprendre correctement le js?

slim anvil
fleet scaffold
feral oyster
#

j'ai quelque base avec un bot js mais la je pars sur du web

slim anvil
#

yes hésites pas à suivre quelques séries de cours, pourquoi pas des petits jeux sympa aussi, c'est du déjà vu mais c'est tjrs sympa d'apprendre sur des projets intéractifs, comme un puissance 4, tic tac toe etc...

true marten
#

@slim anvil pour ton portfolio tu as fais une maquette avant de commencer à dev ?

slim anvil
#

oui la maquette était déjà prête avant

true marten
#

Je veux apprendre à faire des maquettes tu conseils quoi ?

slim anvil
#

je sais pas si je serai le mieux placer pour répondre, mais je dirai de beaucoup practice, d'essayer de rester à jour sur les tendances actuelles

#

dans un premier temps

true marten
#

Thx

normal lichen
#

Bonjour j'aimerais créer un bot discord en ts via des handlers, j'ai regarder un peu comment cela ce passer en suivant un tuto, j'ai réussi a créer mes handler command et event, mais je n'arrive pas a créer celui pour les components (boutton, selectMenu et modal) pourriez vous m'aider s'il vous plait, merci 😁

glass cargo
normal lichen
keen narwhal
#

Quesque c'est mal opti de faire des handlers

normal lichen
#

non justement rien du tout, j'utilise un fichier de définition également, chose que je n'utiliser pas avant

queen ocean
keen narwhal
slim anvil
#

bah du coup c'est pas un handler de command que t'as fais

#

t'as fais un big switch xD

#

stp remplace moi ce switch par un Dict déjà

#

mais du coup c'est clairement pas comparable

#

en plus tu dis "de l'import a la volé" c'est ce que tu fais aussi, sauf que toi tu dois te faire chier a l'ajouter dans ton switch de l'enfer

#

alors qu'un auto-load des fichiers, au moins c'est réglé

slim anvil
#

Un truc opti ce serait venir de load uniquement les fichiers lorsqu'ils sont appelés à la limite, mais franchement au final tu viendras toutes les loads quasi donc bon

keen narwhal
#

Comme on a fait reste plus opti que comme font la 3/4 des gens mais ca demande un peu plus de galère a mettre en place, on a fait quelque test pour s'en rendre compte

#

après c'est pas pour ca que j'utilise plus Sheweny

slim anvil
#

Mais plus opti à quel moment

past nimbus
#

On se le demande

queen ocean
#

@keen narwhal

bronze carbon
#

J'ai une PWA en VueJS qui utilise Vite, j'aimerai y ajouter un splashscreen, j'ai donc configuré le fichier vite.config.js de la manière ci dessous, mais rien n'y fait, il n'y a aucun splashscreen sur mon appareil IOS

slim anvil
#

sois là mettre à la main sois tu peux l’ajouter directement dans ton vite config je crois

slim anvil
#

ˋ <meta name="apple-mobile-web-app-capable" content="yes" /> ˋ
essaye pour voir 🤔

#

au pire ça enlèvera une option

#

super le markdown, je suis sur tel désolé

bronze carbon
fleet scaffold
# slim anvil Mais plus opti à quel moment

c'est pas une question d'opti, mais une question de lisibilité. Les handler ect ça dépend du FS et c'est foireux, fin javascript ça a toujours été foireux mais bon passons. En chargeant les fichier 1 à 1 Déjà tu t'assure de ne pas avoir d'erreur, et en TYPESCRIPT ?? 👀 Faire un handler, c'est un coup à péter le typage, en important correctement les Fichier aucune erreur de typage (Et pas besoin d'utiliser le unsafe "as")

slim anvil
#

Du coup c’est complètement un autre sujet, il me parlait du fait que c’était plus opti, je cherche encore ou du coup lool

fleet scaffold
#

Non mais il dit du caca 💩

#

Ça a rien avoir avec de l'opti niveau perf, à la limite c'est de l'opti pour éviter des bugs nul, et ne pas casser son typage (Ce qui pour le coup est utile)

#

J'ai arrêté d'utiliser les handler à cause de ça, le typage complètement cassé là

slim anvil
#

Mais faire de l’auto load si c’est bien fait y a pas non plus de soucis, je prend le cas de framework comme Next ou Nuxt, qui vont venir charger automatiquement tes fichiers de route pour venir le générer derrière ça n’a pas de soucis et ça ne casse pas non plus le typage, là c’est encore un sujet différent car ça va surtout dépendre de qui le fait et surtout comment

#

Dans le cas de Sheweny par exemple je ne sais pas si son typage est cassé ou non, donc je pourrai pas parler en son nom

fleet scaffold
slim anvil
#

c’est ce que je dis à la fin

fleet scaffold
#

conseiller un handler à quelqu'un de nouveau dans le dev je pense que c'est une mauvaise idée

slim anvil
#

donc c’est un sujet plus global à qui et comment ça se fait

fleet scaffold
#

Oui

slim anvil
#

Mais du coup dans son cas oui c’est nul de parler d’option

#

car si il parlait d’opti car ça vient pas load tous les files bah du coup si il les import derrière… si kappo

fleet scaffold
#

Typescript nous sauve bien la peau n'empêche avec ces imports dynamique

#

Que lorsque la feature est nécessaire, le fichier est importer

#

Perso je trouve ça génial 💡

slim anvil
#

faut renommer garder en simnJs du coup

#

il a répondu à sa place kappo

#

merci garderJS

fleet scaffold
#

MDRRR

#

Nahh moi je suis un débutant en JS

#

Je suis doué que en PHP

rocky oar
#

Salut tout l'monde !
Dites j'ai un petit soucis d'API incompréhenssible ... 😅

Je bosse avec le CMS Strapi en back, et là actuellement je bosse sur la partie de création de burger de mon projet, et j'ai un petit soucis au moment d'enregistrer ma recette :

mon code : ```js
async saveRecipe() {
try {
//const url = process.env.NODE_ENV !== 'production' ? 'http://127.0.0.1:5200/api' : 'https://fatfood-api.creartcom.fr/api';
const token = this.authData.jwt;
const data = JSON.stringify({
"data": {
"name": this.recipeName,
"ingredients": this.recipe.map(recipe => recipe.id),
"creator": [this.authData.id],
"likes": 0
}
});
let config = {
method: 'post',
url: http://127.0.0.1:5200/api/recipes,
headers: {
'Content-Type': 'application/json',
'Authorization': Bearer ${token}
},
data : data
};
const response = await axios.request(config);
console.log(response.data);
this.recipeName = '';
this.saveMode = false;
} catch (error) {
console.error(error);
}
}

Donc c'est juste le code correspondant à ma requête, et en faite, j'ai une erreur **401**, alors que ... via Postman ça fonctionne nickel ... 😓
#

Ah et sur Postman, je POST exactement avec le même User du coup, je ne comprend pas la 401

#

C'est bon j'ai trouvé mon erreur, et c'est de ma faute x) ....

#

**Solution : ** L'erreur n'était pas dans la requête, mais dans mon localStorage, j'essai de push avec l'ID stocké en localStorage sauf que c'est l'ID discord != id en BDD 🤣

pallid plume
#

Tu feras gaffe mais à vu d'oeuil comme ça t'utilises OptionsAPI et en terme d'évolutivité tu vas surement te retrouvé bloqué quand les versions de Vue vont monté par conventions sur Vue 3 tu dois utiliser CompositionAPI

#

Et quand tu fais des calls API le mieux c'est de mettre tes liens en variables d'environnement pour pas avoir à les changer partout à chaque fois que tu changer l'adresse du back

#

Ah ouais aussi avec axios t'as pes besoin de faire axios.request(config)

rocky oar
pallid plume
#

tu peux faire un axios.get() post() etc

pallid plume
rocky oar
#

Ah les ref() je les utilise

#

J'ai qu'un exemple bidon sous la main dans ce composant mais : ```js
setup(){
const quantity = ref(1);
const total = ref(0 * quantity.value);
return {
quantity,
total
}
},

#

De toute façon ce projet je vais devoir le refacto, c'est juste que j'ai manqué de temps sur la fin donc j'ai "rush"

#

Car quand t'as un composant qui fait 496 lignes ... Bon normalement t'es sensé essayer de compartimenter ça 🤣

pallid plume
#

Si c'est celui qui a sur ton github les components que t'as fais passe les sur CompositionAPI

rocky oar
#

Ouaip c'est celui là, mais il faut que je fasse un Push car j'ai édité pas mal hier

pallid plume
#

Déjà rien que pour l'organisation de ton code ça sera plus claire

rocky oar
#

Hop + 483 insertions ... 🤣

#

Mais oui faut que je le refacto à mort dès que j'ai passé l'exam', je suis concsient de beaucoup de caca dans mon code

#

Pour certain, je vais mériter la pendaison je crois

#

Après bon, en terme de résultat, j'en suis fière (Certains boutons ne sont pas encore designé)

pallid plume
#

Y'a un petit problème de navbar non ?

#

La fatFood est pas au centre

rocky oar
#

C'est peut être parce que je n'ai pas pris le gif en full screen attend

pallid plume
#

Bah non toujours pas ?

#

Les buttons à gauche sont super proche du logo et pas ceux de droite

rocky oar
#

Pourtant ...

#

Ah mais

#

Ah non c'est bon normalement, c'est du 2fr 1fr 2fr donc c'est sensé être centré, moi aussi j'ai une impression bizarre en le regardant depuis le début

#

En faite, il est bien centré, c'est juste que il y a un effet optique désagréable à cause du fait que les éléments de gauche soit proche du logo

pallid plume
#

Ouais bizarre en effet

rocky oar
#

Car ça c'est le css de ma nav (concernant le layout) : ```css
nav {
z-index: 999;
position: fixed;
display: grid;
grid-template-columns: 2fr 1fr 2fr;
height: 100px;
padding: 0 var(--center-padding);
box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
background: var(--mode-color);
@media screen and (max-width: 1024px) {
width: calc(100% - 80px);
padding: 0 40px;
display: flex;
flex-direction: row-reverse;
justify-content: space-between;
}

#

Et la var du padding ressemble à ça : --center-padding: calc((100vw - 1024px) / 2)

#

Ensuite là j'ai la version tablette et mobile :

glass cargo
#

Pour la version tablette, j'aurais inversé le "onivoid" et les trois trais du menu 👀

rocky oar
glass cargo
#

Ah oui pas bête

#

Je disais ça plus pour la cohérence avec la version PC 👀

rocky oar
#

Oui tu n'as pas tors sur ce point 🤔

#

Après je t'avoue que la version mobile n'est pas opérationnelle à 100% j'ai pas toutes les pages responssives 🙃

glass cargo
#

yep tkt

rocky oar
#

Autant, pour la page d'accueil easy mais pour le créateur de recettes .... 😩

glass cargo
#

tu m'étonne 🤣

rocky oar
#

Je vais clairement en chier 🤣

#

Mais ça va, pour l'exam je vais être pardonné, je suis le seul Dev de la formation du coup je peux me permettre de mettre le responssive de la page création dans les perspectives d'évolution 🙃

#

D'ailleurs, si quelqu'un aurait un tuyeau pour unes de mes fonctionnalités :
Quand l'utilisateur enregiste sa recette (Screen 1), j'aimerais enregistré le rendu des images du burger composé pour la liste de burger publique (Screen 2)

#

Car pour le moment, j'ai mis des images fictives, mais ce serait mieux d'avoir les images de la recette

#

Sachant que mes images sont géré de cette façon :

#

(Je cherche de mon côté mais si quelqu'un l'a déjà fait je pose la question)
update : J'ai trouvé ça, je ne sais pas si quelqu'un saurait me dire si c'est bien ? https://html2canvas.hertzen.com

normal lichen
#

Bonjour pourriez vous m'aidez je n'arrive pas a envoyer de bouton a mon message, sur mes bot en js sa fonctionne mais la en ts sa me met une erreur voici le code et l'erreur

Merci beaucoup😁

rocky oar
#

Encore un problème de typage harold

normal lichen
#

c'est a dire ? j'essaye d'apprendre le ts j'ai beaucoup de mal ^^

torn fog
rocky oar
torn fog
#

En gros dans l'erreur c'est marqué que tu lui donne une variable de mauvais type

#

Donc il faut lui donner le bon type

rocky oar
#

Du coup ce que j'allais dire n'était pas une connerie 😮

normal lichen
#

dans types.d.ts ?

torn fog
#

Ou en cas dire à typescript que c'est le bon type

#

Devant const row

glass cargo
torn fog
#

Tu rajoute des : avec le type demandé

normal lichen
torn fog
#

C'est dans l'erreur

keen narwhal
#

J’ai la solution

normal lichen
#

Ah c'est ActionRowData

keen narwhal
#

Mais j’suis sur téléphone bon laisser moi écrire tout ça

rocky oar
glass cargo
#

ah d'acc

#

dsl j'avais mal compris x)

keen narwhal
#

Iradium Wait 2 minutes je t’envoie la solution

normal lichen
#

merci beaucoup ^^

rocky oar
glass cargo
#

ok ok cool

keen narwhal
#

En gros faut caster ton actionrowbuilder avec buttonBuilder

normal lichen
#

j'espère comprendre ce que tu va me donner, j'ai besoin du ts pour le taff mais j'ai pas encore commencer a apprendre x)

keen narwhal
#

J’allume mon pc et je te montre

normal lichen
#

merci beaucoup, la sa va être ma pause alors je vais aller manger, mais a 13h je suis de retour devant le pc 😅

keen narwhal
#

attend

#

j'suis la

normal lichen
#

oui je suis la ^^

keen narwhal
#
const row = new ActionRowBuilder<ButtonBuilder>()

row.addComponents(
   new ButtonBuilder()
   .setCustomId("tes")
   .setEmoji(tonemoji)
   .setStyle(ButtonStyle.Primary)
)


interaction.channel.send({components: [row])}
normal lichen
#

donc il n'ya pas besoin de rajouter de definition dans le fichier .d.ts ?

keen narwhal
#

non

#

le typage de dJS est déja très bon

normal lichen
#

d'accord car j'ai du typer pour les SlashCommand et les event ^^

keen narwhal
#

ducoup ca marche ?

normal lichen
#

merci beaucoup oui sa fonctionne ^^

#

il faudra que je corrige mon componentsHandler avec les interactions mtn x)
merci beaucoup pour votre aide en tout cas ^^

keen narwhal
#

Pas de souci j'ai tellement galérer avec djs et le ts au début que maintenant je connais tout

normal lichen
#

bah j'espere m'en sortir quand même, même si pour l'instant j'ai beaucoup de mal, le js sa va nickel mais je penser pas qu'il y'aurais une différence pareil entre js et ts x)

keen narwhal
#

Une fois que tu t'y habitue c'est quand même sympa

leaden prism
#

hey je suis en train de relier mon bot a une db avec quick.db mais j'ai une erreur pouvez vpus m'aider svp

const { QuickDB, MySQLDriver } = require("quick.db");
(async () => {
  const mysql = new MySQLDriver({
    host: "localhost",
    user: "nocteln",
    password: "1234",
    database: "not-bot",
  });
  
  // Important: Connect to MySQL server before using it
  await mysql.connect();
  
  const db = new QuickDB({ driver: mysql });
})();```
near saddle
#

le module ‘mysql2/promise’ est required, mais tu ne l’as pas installé

leaden prism
#

maintentant j'ai sa

near saddle
#

vérifie tes identifiants de connexion je dirais

leaden prism
#

nn jcrois c prcq g pas de db d'allumé

#

comment je peut en créer une?

#

c bon j'ai trouvé

noble bolt
#

Bonjour, c'est ici pour posé une question par rapport au dev bot discord?

noble bolt
#

Voilà j'ai crée une commande de /suggest et celle ci ne marche pas ^^

#

J'ai aucun message d'erreur qui s'affiche dans ma console ::

past nimbus
#

Voleur

keen narwhal
past nimbus
#

Flexeur

noble bolt
#

@pallid plume le voilà ^^

glass cargo
#

Essaie de débug avec des console.log()

noble bolt
#

Sa ne marche pas ^^

rocky oar
#

Et s'il ne Fonctionne pas, la raison doit ce trouvé dans la console quand tu lance ton programme

noble bolt
#

J’ai réussi à crée le code, je reçois bien le message comme quoi la suggestion a était envoyer mais j’ai rien le Channel spécifie

noble bolt
#

La commande

rocky oar
# noble bolt La commande

Ah d'accord, et le salon où tu es sensé avoir la réponse, c'est le channel où tu as lancé la commande

noble bolt
#

Non

rocky oar
#

Car tu n'a spécifié aucuns channels de réponses dans ton code, t'as juste mis un Reply, donc logiquement il va directement répondre dans le salon de l'interraction

noble bolt
#

Non j’ai refait un autre code

#

^^

rocky oar
#

Bah quand tu as un problème avec un code, ce serait bien de le partagé si tu veux que des gens t'aide, t'as cru qu'on allez pouvoir le deviner ton code ? 🤣

#

Et idem, s'il y a des erreurs dans le terminal

rocky oar
# noble bolt Non j’ai refait un autre code

Mais sinon simple question, t'as regardé un tuto ou tu as copié collé un code sur Github ?
Car je trouve ça bizarre le contraste entre le code produit et l'incapacité à résoudre un problème 😄

noble bolt
#

J’ai regarder un tuto ^^

rocky oar
#

Dans ce cas, faut que tu apprenne aussi à débug un programme, c'est bien d'apprendre à développer, mais il faut apprendre les bases 😉

noble bolt
#

J'ai aucune erreur qui apparais dans ma console ^^

rocky oar
#

Pourtant le code me parraît bon ...

noble bolt
#

Oui ^^ j'ai aucune erreur

#

et le message ne s'envoie pas dans le channel que j'ai mis ^^

#

donc y'a un souçis quelque part, mais je ne sais pas d'ou cela viens ^^

rocky oar
#

Tu devrais vérifier si le bot récupère bien le channel : ```js
const channel = bot.channels.cache.get("1118274121772584980");
if (channel && channel.isText()) {
//Ton code à exécuter
}

noble bolt
#

Je mais ceci tout en haut du coup?

rocky oar
#

Nan là ou tu es sensé envoyer l'embed dans le channel

noble bolt
#

Ou sa ? J’y connais trop rien ^^

#

const channel = bot.channels.cache.get("1118274121772584980");
if (channel && channel.isText()) {
bot.channels.cache.get("1118274121772584980").send({ embeds: [EmbedMessage] }).then(function (message) {
message.react("✅");
message.react("❌");
message.startThread({name: Test, autoArchiveDuration: 10080, reason: "Raison"});

    });
}

}

#

comme ceci?

rocky oar
#

à la place du bot.channels.cache.get("1118274121772584980")dans le if, utilise la variable "Channel" Créé juste au dessus

#

channel.send etc...

noble bolt
#

ok

#

marche pas

#

le bot se lance plus

rocky oar
#

Il y a une erreur ?

noble bolt
#

nop

keen narwhal
#

Y’a forcément une erreur s’il ce lance pas

rocky oar
#

Ah attend c'est pas isText() c'est isTextBased()

rocky oar
#

J'ai mal lu ton message sorry xD

rocky oar
# noble bolt nop

Après le soucis là, c'est que tu ne connais pas les bases de NodeJS et de Javascript du coup ça va être très compliqué pour toi de débug les soucis x)
Et très compliqué pour nous de te comprendre / t'aider

noble bolt
#

Ah

#

rocky oar
# noble bolt Ah

Par exemple, c'est comme si tu apprenais à courrir sans avoir appris à marcher

fleet scaffold
rocky oar
fleet scaffold
#

Mdr t'inquiète

rocky oar
#

Mais ouais faire un bot discord, c'est pas spécialement compliqué, mais sans avoir les près-requis c'est ... très très très compliqué, on ne s'improvise pas développeur en 2 jours via un tuto youtube malheureusement, ce serait trop beau

fleet scaffold
#

mdrr

rocky oar
#

Compliqué d'assimiler tout les concepts de bases en 3 jours harold

#

Même moi après 10 ans je fais encore pleins de conneries 🤣

keen narwhal
#

@noble bolt je pense que on devrait arrêter de t’apporter de l’aide ici, @fleet scaffold ta dis hier que pour faire des bots il faut apprendre tu lui a répondu okay pour au final changer de salon et demander la même chose

noble bolt
# keen narwhal <@1113033398735347802> je pense que on devrait arrêter de t’apporter de l’aide i...

J’ai certainement répondu « okay » c’est pas pour cela que j’apprends pas à coter.

En étant débutant dans le domaine, je préfère demander de l’aide pour ne pas faire de « bêtise » si je peux dire.

Après si demander de l’aide est pas très bon pour vous, j’arrête de demander de l’aide. Je ne demande pas qu’on fasse le bot a ma place, je demande juste quelque conseil yeah

keen narwhal
#

Mais on commence pas les leçons de conduite avec une Ferrari

rocky oar
keen narwhal
#

On te dit d’apprendre les bases de JS et de nodeJS

rocky oar
#

Je pense qu'avant de nous demander de l'aide pour ton bot, il va te falloir une bonne petite période de 1 - 2 mois d'apprentissage sérieux des bases de Javascript & NodeJS

keen narwhal
#

Sinon moi en ce moment je fais du NestJS j’ai pas l’impression de faire du Typescript c’est un autre monde et c’est un peu dure mdr

#

J’ai l’impression de découvrir un autre langage

rocky oar
#

D'ailleurs concernant mon apprentissage de Typescript, j'y arrive pas trop, j'aime pas le délire du typage même si je reconnais son utilité xD

keen narwhal
#

Ouais mais c’est obligatoire avec certains framework

#

Par exemple NestJS

#

Enfin c’est pas obligatoire mais Gl sans

noble bolt
rocky oar
fleet scaffold
#

Perso avec une porshe

rocky oar
keen narwhal
#

Et moi une buggati c’était demain

#

C’était génial

fleet scaffold
#

Bref, je vous recommande les tuto de cette homme, génial

#

Comment ça c'est moi ?

keen narwhal
#

Non

#

En vrai pour apprendre getcodingknowledge c’est bien

rocky oar
fleet scaffold
#

Je suis bien aussi

keen narwhal
fleet scaffold
#

moi l'an prochain

rocky oar
fleet scaffold
#

je dois d'abord percé sur toktok

rocky oar
#

Raaah bordel .. 🤣

#

en vrais, ça à l'air de donner un coup de boost ce réseau pour les créateurs de contenus

keen narwhal
#

Moi j’ai un script qui prend les top clips twitch dans une catégorie qui crée une vidéo et la poste sur YouTube

rocky oar
#

J'ai une connaissance qui est passé de 20-30 viewers sur twitch à 50-60 en postant des clips sur TokTok

rocky oar
keen narwhal
#

Ça prend le titre du top clip

novel crow
#

Salut, est-ce que quelqu'un sait utiliser l'API de Stripe en js ?

true marten
novel crow
true marten
novel crow
true marten
#

Tu fais le total puis tu redirige vers stripe

novel crow
true marten
novel crow
#

J'en ais codé un mais je l'ais désactivé parce que j'utilise les liens Stripe (mais c'est pas très flexible donc j'essaie d'utiliser l'API)

#

@true marten Au pire est-ce qu'il y a un moyen dans les paramètres de l'url de choisir les produits à afficher ?

true marten
true marten
novel crow
#

Oui je pense que je l'ais

fleet scaffold
#

contenu de crotte

true marten
# novel crow Oui je pense que je l'ais

Redirection vers la page de paiement de Stripe :

Lorsque l'utilisateur est prêt à effectuer le paiement, redirigez-le vers la page de paiement de Stripe en utilisant l'API de Stripe depuis votre backend.
Incluez l'identifiant ou l'information unique du produit sélectionné lors de la création de la session de paiement avec l'API de Stripe.
Transmettez les informations pertinentes à Stripe, telles que le montant total à payer, la description de la commande, etc., en fonction du produit sélectionné.

novel crow
true marten
#
// Étape 1 : Configuration de la clé publique de Stripe
const stripePublicKey = 'VOTRE_CLÉ_PUBLIQUE_STRIPE';

// Étape 2 : Gestion du choix du produit (exemple avec un bouton "Payer" pour chaque produit)
const produits = [
  { id: 1, nom: 'Produit 1', prix: 10.99 },
  { id: 2, nom: 'Produit 2', prix: 19.99 },
  { id: 3, nom: 'Produit 3', prix: 5.99 }
];

function payerProduit(idProduit) {
  // Étape 3 : Redirection vers la page de paiement de Stripe
  const produitSelectionne = produits.find(produit => produit.id === idProduit);
  
  if (produitSelectionne) {
    const montantTotal = produitSelectionne.prix * 100; // Stripe utilise des centimes
  
    // Appel à votre backend pour créer une session de paiement avec l'API de Stripe
    fetch('/create-stripe-session', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        produit: produitSelectionne,
        montantTotal: montantTotal
      })
    })
    .then(response => response.json())
    .then(data => {
      // Redirection vers la page de paiement de Stripe
      stripe.redirectToCheckout({
        sessionId: data.sessionId
      });
    })
    .catch(error => {
      console.error('Une erreur s\'est produite :', error);
    });
  }
}

// Exemple d'utilisation avec des boutons "Payer" pour chaque produit
produits.forEach(produit => {
  const boutonPayer = document.createElement('button');
  boutonPayer.textContent = 'Payer ' + produit.nom + ' (' + produit.prix + ' €)';
  boutonPayer.addEventListener('click', () => {
    payerProduit(produit.id);
  });
  document.body.appendChild(boutonPayer);
});
#

Un exemple

true marten
novel crow
#

Nan mais je comprend 3% de ce code et j'ai jamais vraiment utilisé une API, je vois pas trop comment m'en sortir, et si je cherche un projet github je vais pas pouvoir remplacer les bonnes parties parce que je vais pas comprendre le code

true marten
novel crow
#

async function createStripeCheckout(products) {
    try {
        const session = await fetch('/votre-endpoint-de-creation-de-session', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ products })
        }).then(response => response.json());

        // Rediriger l'utilisateur vers la page de paiement Stripe
        const { error } = await stripe.redirectToCheckout({
            sessionId: session.id
        });

        if (error) {
            // Gérer l'erreur de redirection vers la page de paiement
            console.error(error.message);
        }
    } catch (error) {
        // Gérer toute autre erreur
        console.error(error);
    }
}

// Exemple d'utilisation
const products = [
    { id: 'prod_O42XpvPxpa6UOF', quantity: 2 },
    { id: 'prod_O4JaxyLVgnUfsb', quantity: 1 }
];

createStripeCheckout(products);``` ça c'est la code que tu m'as donné, j'ai remplacé les ID de produit et la clé API mais après je comprends pas
queen ocean
#

aide discordjs - command suggestion

true marten
novel crow
#

@true marten j'ai remplacé mais je fais quoi du bouton ? Je dois le coder à la main ou pas ? parce que il y a un "document.createElement('button');"

true marten
#

Pour la suite je sais pas

misty charm
#

Bonjour à tous !

J'ai quelques questions :

  1. Est-ce qu'il y a des sites qui proposent des minis projets à réaliser en JavaScript pour pratiquer ce qu'on a appris ?

  2. Est-ce qu'il y a des astuces simples pour transposer un problème ou un projet en code JavaScript.
    Lorsque l'on débute, on a souvent tendance à prendre de longs chemins pour faire quelque chose qui pouvait être résolu en quelques lignes..
    Je ne sais pas si j'ai été assez clair ?

Merci !

sleek pollen
#

Bonjour à tous j'ai un problème avec mon code ts !

Voici mon code:

import { Client, REST, Routes } from 'discord.js';
import { readdirSync } from 'fs';
import { join } from 'path';
import { SlashCommand } from '../types';

module.exports = async (client: Client) => {
    const body = []
    let SlashCommandsDir = join(__dirname, "../slashCommands");
    

    readdirSync(SlashCommandsDir).forEach(file => {
        if(!file.endsWith(`js`)) return;

        const command: SlashCommand = require(`${SlashCommandsDir}/${file}`).command;
        
        body.push(command.data.toJSON())
        client.slashCommands.set(command.name, command);
    });

    const rest = new REST({ version: '10' }).setToken(process.env.TOKEN);

    


    try {
        await rest.put(Routes.applicationCommands(process.env.CLIENT_ID), { body: body});

    } catch (error) {
        console.error(error);
    }


}

Et voila mon erreur :

 PS C:\Users\canai\Desktop\Bot_VaucluseRP2> npm run start

> bot_vaucluserp2@1.0.0 start
> node dist/index.js

{
  name: 'ping',
  data: SlashCommandBuilder {
    options: [],
    name: 'ping',
    name_localizations: undefined,
    description: 'Affiche le ping du bot',
    description_localizations: undefined,
    default_permission: undefined,
    default_member_permissions: undefined,
    dm_permission: undefined,
    nsfw: undefined
  },
  execute: [Function: execute]
}
undefined
Evenement interactionCreate correctement chargé
Evenement ready correctement chargé
C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:23
        body.push(command.data.toJSON());
                          ^

TypeError: Cannot read properties of undefined (reading 'data')
    at C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:23:27
    at Array.forEach (<anonymous>)
    at C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:18:45
    at Generator.next (<anonymous>)
    at C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:4:12)
    at module.exports (C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\handlers\commandHandlers.js:15:30)
    at C:\Users\canai\Desktop\Bot_VaucluseRP2\dist\index.js:42:39
    at Array.forEach (<anonymous>)

Node.js v20.3.0```
#

voila ! j'espere trouver de l'aide , merci a tous !!

keen narwhal
#

mes le en codeblock stp

sleek pollen
keen narwhal
#
\`\`\`ts
...code
\`\`\`
#

sans les /

sleek pollen
#

c'est bon

keen narwhal
#

n'hésite pas a rajouter le mot ts pour mettre les couleurs

sleek pollen
fleet scaffold
#

Voilà voilà encore quelqu'un qui utilise un handler et qui a une erreur

fleet scaffold
#

l'erreur indique que "command.data" n'existe pas

#

Aussi en utilisant Typescript, tu casse actuellement ton typage là

sleek pollen
fleet scaffold
#

Aussi, ont utilise pas require en Typescript, mais import

sleek pollen
keen narwhal
#

tu as déja fais du ts ?

sleek pollen
fleet scaffold
#

command.data n'existe pas

#

c'est l'erreur

keen narwhal
#

Car très mauvaise idée de faire du ts si t'es bases en js sont pas très solides

fleet scaffold
keen narwhal
#

j'espère

rocky oar
#

xD

sleek pollen
#

Mais dcp jsp comment régler ça puisque le programme marchait très bien avant le redémarrage

fleet scaffold
#

typescript c'est du typage, et les imports dynamique des handler défonce le typage

#

bah recheck tes fichier et vérifie que si t'as oublié ou non un .data

#

Malheureusement, ont pourra regarder pour toi cette partie

#

pas***

#

AH NON MY BAD

#

j'ai mal lu l'erreur

#

LA COMMANDE EST UNDEFINED

#

pas data

#

"Je ne peux pas lire data de rien du tout"

sleek pollen
#

et ?

#

je sait ça

fleet scaffold
#

Bah réfléchis ? 👀

#

T'as décidé de ne pas respecter typescript

sleek pollen
#

mais pourtant j'ai bien la bibliothèque d'installée pour cette commande

fleet scaffold
#

Tu as cassé la raison principale d'existence de ce langage

#

Mais la commande n'existe pas

sleek pollen
#

dcp force a moi

rocky oar
#

Un Onivoid Junior qui ne réfléchis pas beaucoup dit donc 👀 KappaCringe

fleet scaffold
#

LE FICHIER que tu require n'as pas de .command

sleek pollen
#

Bah le gars du tuto à des erreurs à cause de ça et quand il met le .command ca fonctionne

keen narwhal
#

Si le mec fait ca dans son tuto change de tuto

fleet scaffold
#

le gars du tuto, je vais te le dire sèchement

#

C'est une sombre crotte défectueuse

#

(J'ai du trouver une version poli pour mon insulte c'est grave)

rocky oar
#

Et surtout est-ce que t'es sure d'avoir le même environnement de travail que lui (Même version etc ....)

keen narwhal
#

what is hes name

fleet scaffold
#

il s'appelerais pas Androzz par hasard ? 👀

#

Ou nolhan ? 👀

rocky oar
#

Eh allez après le Onivoid junior, sa troll les autres 🤣 🤣 🤣

keen narwhal
#

ou garder500 ? 👀

fleet scaffold
#

Bref je vais sérieusement devoir faire un tuto Youtube moi

keen narwhal
#

Ou cardia ? 👀

fleet scaffold
rocky oar
#

Tellement de balles perdues ... xD

fleet scaffold
#

ont peut setup des fonctions maintenant

rocky oar
#

ChatGPT il m'fait cablé, j'ai le premium pour un besoin autre que du code, et quand j'ai voulu use l'API bah ... c'est pas inclus 🙃

fleet scaffold
#

pour faire des recherches google, où bien d'autre chose 😏

fleet scaffold
rocky oar
#

Le monde de l'IA est trop flooder d'informations en ce moment du coup je ne sais pas c'est quoi cardia

keen narwhal
#

tu connais pas

#

omg

#

c'est la plus grande ia

fleet scaffold
#

C'est mon IA perso qui utilise Chatgpt en cœur

rocky oar
#

AAAAAAAAAAAAAAAAAAAAAAAAAAAH

#

J'ai du oublié alors car le nom me dit quelque chose

keen narwhal
#

c'est ca cardia

sleek pollen
#

c'est lui

rocky oar
#

Mon cerveau est trop préoccupé par le ban d'EA que je viens de bouffer c'est pour sa

sleek pollen
#

mais dcp je suis encore bloque 😭

fleet scaffold
keen narwhal
#

il a surtout pris une image en mauvaise qualité et rajouter un texte dessus x)

glass cargo
fleet scaffold
#

tu peux me montrer une commande ? Voir un peu leur structure

rocky oar
#

6 mois d'ancienneté la vidéo il est peut être la le soucis si discordJS a fait des MAJ depuis

fleet scaffold
#

je veux voir le code d'une de tes commandes

glass cargo
fleet scaffold
keen narwhal
rocky oar
sleek pollen
#

dcp @fleet scaffold

#

??

fleet scaffold
#

puis fait

const command: SlashCommand = /* code */
 export {
     command
}
#

la ça marchera

keen narwhal
#

Ducoup @odd thunder's#0500 je te recommande cette playlsit comme ca tu apprend le ts et après tu arrivera par toi même a faire la migration de t'es projets JS
https://www.youtube.com/watch?v=uOuulpBs8dQ&pp=ygUPYXBwcmVuZHJlIGxlIHRz

Article ► https://grafikart.fr/tutoriels/typescript-installation-1950
Abonnez-vous ► https://bit.ly/GrafikartSubscribe

Dans ce chapitre nous allons voir comment installer TypeScript et l'utiliser pour compiler nos premier fichiers TypeScript. Nous allons aussi voir l'utilisation du fichier [tsconfig.json](https://www.typescriptlang.org/tsconfig...

▶ Play video
strange thicket
#

Mauvais quentin ^^

keen narwhal
#

Ups

#

ah bah plus sur le discord

fleet scaffold
#

@sleek pollen

#

ah oui il a leave

slim anvil
#

étonnant tiens

normal lichen
#

Bonsoir, savez vous comment je peut faire pour detecter si un membre est connécté dans un channel vocal ? actuellement j'ai réussi a faire quelque chose, mais si le bot n''est pas redemarrer il ne detecte pas le changement, si je suis dans un channel vocal au moment ou je restart le bot sa écrit toujours oui même si je quitte, et inverssement

merci beaucoup 😁

fleet scaffold
normal lichen
#

j'ai essayer ceci

module.exports = {
    data: new SlashCommandBuilder()
        .setName("join")
        .setDescription("connecte le bot au channel"),

    async execute(interaction, bot) {
        if (interaction.member.voice.channel) {
            console.log('oui')
        }else {
            console.log('non')
        }
    },

je pense qu'il faut utiliser l'event voicestateupdate non ?

fleet scaffold
#

mhhh

#

Laisse moi check mon code

#

Bah non

#

c'est sencer être bon ton code

fierce plank
#

Hola

#

Quelqu'un saurais me dire le probleme ?

#
                    const res = await guild.channels.cache.get(transcripts).send({ embeds: [transcriptEmbed], files: [transcript] });
#
TypeError: Cannot read properties of undefined (reading 'send')
    at Object.execute (G:\DEV\Admiration\AdmirationBot\events\tickets\ticketActions.js:55:76)     
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
daring raptor
#

Il n'arrive pas à lire le send car il y a un problème avec le get

novel crow
#

Est-ce quelqu'un a déjà utilisé l'API de Stripe svp ?

rocky oar
#

Quelqu'un pourrait me dire quel est le Schéma d'exécution de la fonctionnalité de Ticketing des bots discord ?
Je compte en faire un pour un besoin personnel, mais je n'ai jamais eu à en faire, du coup je vous demande ça juste pour connaitre le schéma de cette fonctionnalité (Pas de code).

Par exemple : Appuis du bouton créer un ticket => Le bot GET le USER à l'origine de la demande => Création du salon Textuel.
ça pour moi c'est le début du shéma mais après je n'ai jamais su ce que faisais un bot de ticket lambda :x

#

@fleet scaffold il me semble que tu avais déjà fais ce genre de bot à moins que je me trompe ?

fleet scaffold
rocky oar
rocky oar
keen narwhal
#

Comment ça le scénario ? C’est pas bien compliqué quand on appuie sur le bouton le bot crée un Channel en ajoutant l’user et les permissions voilà c’est tout

rocky oar
#

Enfin j'avais un doute mais je n'étais pas sûre

keen narwhal
#

Bah il a rien d’autre à faire

#

Dans le salon tu push t’es boutons de fermeture et tout

rocky oar
#

D'accord, donc ouais vraiment rien de compliqué

keen narwhal
#

Oui c’est très basique

#

Mais ça fais peur pour une raison que j’ignore

rocky oar
#

Je cherche toujours compliqué notlikethis

keen narwhal
#

C’est tout le temps vu comme une épreuve l’es système de ticket

#

Alors que c’est juste un salon qui a certaines permissions

rocky oar
#

Moi pour le coup, je ne m'y intéressais clairement pas du coup je m'imaginais un truc + complexe que ça xD

slim anvil
#

ça dépend de ce que tu manages enfaite

#

déjà typiquement si tu veux gérer du multicatégorie dynamiquement

#

c'est plus le meme taff

keen narwhal
#

Bah c’est sûr que ça dépend de ce que tu veux faire mais le système de base est pas compliqué

slim anvil
#

si tu gères aussi le ratelimit proprement sur le nombre de channel que tu peux créer, et que donc tu supprimes pas les channels forcément, mais tu les met de côté et tu les réutilises, pareille pas le meme taff

#

ouais la base de la base c'est assez rapide

#

du coup bon oui ca peut vite faire peur un systeme de ticketing

rocky oar
#

En faite, suivant le sujet sélectionné avant de créer le ticket, le ticket tombera dans une catégorie précise oui, puis j'aurais 2 boutons accessible via les admins seulement, un "Archive" qui enlèvera juste l'utilisateur de la boucle, et un delete qui supprimera le channel

keen narwhal
#

T’façon sur un bot public un bon système de ticketing je pense que t’es obliger d’avoir une interface web c’est chiant a setup avec des commandes ou alors faut très bien le faire

slim anvil
#

yes

keen narwhal
rocky oar
#

Juste une, bot privé

keen narwhal
#

Bah c’est assez simple

#

Tu setup t’es catégories directement dans ton code et puis c’est tout

rocky oar
#

Enfin, "Privé", si quelqu'un veut Fork le repo il le pourra, mais c'est pour une utilisation mono-guild

#

Je vais fonctionner avec une commande setup() qui avec des prompt te demandera les catégories et les options, pour update le .env

keen narwhal
#

Une commande setup qui update un .env ?

rocky oar
#

My bad je me mélange les pinceaux ça c'est l'init, le setup c'est pour le .json des paramêtres du bot

keen narwhal
#

Le but d’un .env c’est pas trop d’être modifié comme ça, tu fais un simple fichier de config ou une bdd pas un env

rocky oar
#

Le token et les clefs API sont dans le .env, généralement à l'init du bot avant de le lancer, je fais une commande npm InitBot pour initialiser le projet et lancer le bot

#

Puis je fais généralement une commande discord setup pour modifier les paramêtre dans un config.json

#

La commande d'initialisation prend le .env.template pour créer le .env, après j'y touche plus au .env xD

fleet scaffold
#

Hey j'aurais besoin d'aide à mon tour (lol oui)
J'aimerais lier le terminal de mon VPS ou autre à un process nodejs

le programme nodejs enverra donc des commandes, enverra la console à une interface web via un socket

J'ai actuellement aucune piste !

Merci de votre aide

PS: J'ai déja fait des recherche sur google, et je ne vois que child_process, mais je ne vois pas comment l'implémenter pour répondre à ce besoin

slim anvil
#

et que le projet est sur github je vois pas l'intérêt de te faire chier avec des commandes de setup

#

laisse juste les gens setup un fichier de config, ce sera + simple pour toi, et meme pour eux mdr

keen narwhal
#

Perso je fais juste un config.ts avec des interfaces pour typé tout ça correctement mais rien de plus

rocky oar
slim anvil
slim anvil
#

dans tous les cas les gens vont devoir ouvrir vscode ou au minimum ouvrir le projet

#

pour le token du bot ^_^

#

donc bon

rocky oar
#

Attend je vais envoyé ce dont je parle je crois que je m'explique mal xD

keen narwhal
#

Il a une commande npm init qui lui demande les infos pour le env

#

C’est plus chiant que d’ouvrir un fichier env

slim anvil
#

si tu veux te faire chier fais une bonne CLI mdr

#

comme ca à l'installe ca demande tout et voilà

#

sans ouvrir le projet

rocky oar
#

Le projet est vieux mais j'avais fais ça : ```js
const fs = require('fs');
const readline = require("readline");
const colors = require('colors');

let envData = (token, botStatus) => \ BOT_TOKEN = "${token}" BOT_STATUS = "${botStatus}" ;

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

rl.question("\nBot's token : ".green, token => {
rl.question("Bot's status (ex : Beodara): ".green, async botStatus => {
let data = envData(token, botStatus);
await fs.writeFile('./config/.env', data, (err) => {
if (err) throw err;
rl.close();
});
});
});

rl.on("close", function() {
console.log("\nThe bot's config was succefully configured !\n".green);
process.exit(0);
});

keen narwhal
#

L’art de se faire chier pour rien mdr

rocky oar
#

Exactement comme SimnJS dis, l'art de ce faire chier pour rien XD

#

Mais quand je host sur mon VPS par exemple, je le fais via SSH en invite de commande, donc, claquer un nano ./config/.env etc ... flemme 😴

keen narwhal
#

Ah bah c’est la vérité perso je préfère 1000 fois ouvrir un .env que suivre des instructions

rocky oar
#

Chacun ses préférences 😉

#

Mais j'aime pas éditer des fichiers via invite de commande quand je suis sur mes VPS du coup si je peux me faciliter la tâche via CLI c'est mieux xD

keen narwhal
#

Comme ça si t’a un settings à changer tu dois remettre tous les autres x)

slim anvil
#

car il y a un toujours un mais

#

tu vas l'installer une fois ton bot

#

ou 2

#

c'est pas comme si t'allais en faire des milliers d'install

rocky oar
#

Uhm ... C'est vrais

#

Mais bon ... On va dire que j'ai tellement fait de script fénéants, que c'est devenu une habitude

#

Comme faire une CLI perso du style npm createPage juste pour éviter un clique droit et faire nouveau fichier dans le dossier page d'un env de travail 🙃

keen narwhal
#

Va falloir s’habituer à faire des commandes sur un vps x)

rocky oar
#

Dès l'instant où je peux transformer 3 actions en une seule, je le fais, même supprimer le cache de FiveM je me suis fais un scrpt Bash 🤣

rocky oar
fleet scaffold
rocky oar
#

Exemple :
Je préfère faire npm run initbot que cp ./config/.env.template ./config/.env puis nano ./config/.env taper mes modifs puis ctrl+x et cat ./config/.env pour vérifier que c'est good xD

rocky oar
fleet scaffold
keen narwhal
#

Et ton initbot tu prend plus de temps à le dev que de faire t’es 3 commandes

fleet scaffold
#

Oui c'est un navigateur

keen narwhal
#

Vrai dev utilise Heroku et les variables d’environnement herokuPepeClown

rocky oar
keen narwhal
#

Mais j’ai 10€/mois offert chez heroku en tant qu’étudiant donc j’en profite

#

Même si j’aime pas

rocky oar
#

Ah mais il dit pas tout le monsieur 👀

fleet scaffold
#

c'est ce que je dit

#

C'est dev pauvre

#

heroku c'est le pire environnement possible à mes yeux

rocky oar
#

Je l'ai utilisé pendant longtemps quand c'était free, j'avais bien aimé en vrais 🤔

#

API sur Heroku Front sur Vercel / Netlify

keen narwhal
fleet scaffold
#

J'ai toujours utilisé un VPS

#

That's why i guess

rocky oar
#

Dans pas longtemps je serais plus emmerder à choisir un serveur de Hosting je vais pouvoir souffler 😴

#

J'ai commencé les VPS quand j'ai commencé à vouloir Host des bots discord personnellement

fleet scaffold
#

J'aimerais pouvoir dire ça

#

Mais je suis pas rassuré pour la maintenance

#

Mon WIFI qui ce redémarre tout seul là...

rocky oar
fleet scaffold
rocky oar
#

fibre optique, + machine directement cablé en RJ45 Cat 5

fleet scaffold
#

(j'ai fait éléctricité au lycée oui)

rocky oar
#

Mais avant de souffler et de faire quoi que ce soit, je vais configurer le reverse proxy etc ....

#

Cat 7 t'en trouve facilement en magasin ?

fleet scaffold
rocky oar
#

👀 Moi qui était content de DL à 100Mo/s

rocky oar
#

6€ 🤯

fleet scaffold
#

La qualité ça se paye après mdrr

rocky oar
#

Et moi qui faisait le Rat quand mon ancienne entreprise se débarrassait de leurs anciens câble

#

Bah non mais c'est pas cher

#

justement

fleet scaffold
#

Le nombre attribué décrit la quantité de données que le câble peut traiter : le Cat 5 atteint une vitesse maximum de 10/100 Mbit/s avec une bande passante de 100 MHz, le Cat 5e atteint 1 000 Mbit/s, et le Cat 6 atteint 10 gigabits et jusqu'à 250 MHz.

#

Pour les détails de pourquoi un CAT 7 vaut le coup

#

surtout si t'es fibré

rocky oar
#

Je n'arrive pas à trouver la longueur du câble que tu m'a envoyé par contre

fleet scaffold
#

1 metre

rocky oar
#

Quel c**

#

Bah écoute, mois prochain j'investis dans 1 5m, 1 2m et 1 10m 🤣

rocky oar
#

Au moins je suis tranquil pour les 3 pc

fleet scaffold
#

Mais pourquoi pas acheté 1 15 metre ?

rocky oar
#

Les 3 pc sont à distances différentes de mon routeur, le mien est à meme pas 1m, mais je prend 2 pour être large, le serveur lui est à 3-4 metres facile, et celui de ma femme est dans l'autre pièce mais un 10m suffit

#

J'avais déjà fait les calculs au préalable

fleet scaffold
#

Ahh okay

#

Yep je comprend mieux du coup

#
rocky oar
#

Mais merci, car mes connaissances en électroniques s'arrentent au Raspberry Pi 🤣

#

40m carré, c'est un appartement en centre ville

fleet scaffold
#

Ah oui

#

bon j'imagine que tu capte partout mdrrr

rocky oar
#

Ouais, même mon casque Bluetooth capte quand je vais chercher le courrier au Rez de Chaussée 🤣

fleet scaffold
#

après le bluetooth capte sur 15 metre

rocky oar
#

J'ai très peu de Wifi environnante qui parasitent en +

fleet scaffold
#

Moi et mon appli qui devait fonctionné en PeerToPeer via le bluethoot loll

rocky oar
#

Tiens dans pas longtemps quand j'aurais fini ma formation, je vais me mettre sur un projet P2P justement harold

fleet scaffold
#

j'ai vu

#

Je suis callé sur le p2p

#

et c'est foireux

rocky oar
#

Foireux à quel niveau ?

fleet scaffold
#

ça fait confiance à une petite faille sympa des anciennes box

#

qui laissait l'option upnp activé

#

upnp = découverte de port sur le réseau

#

ça ouvre les port automatiquement pour toi comme un grand

rocky oar
#

Du coup, le P2P via websockets c'est foireux aussi ou je peux m'amuser à connecter 2 sockets entre eux via le port 443 ?

rocky oar
#

Car si le P2P est foireux, autant lancé un serveur socket entre deux qui fera l'intermédiaire via les ports dédiés au Web

#

Le seul truc c'est que mon projet de base est juste sensé connecter les sockets entre eux, sans intermédiaire, sans stockage

rocky oar
rocky oar
#

ElectronJS + VueJS + Socket.io, c'est le stack prévu

rocky oar
fleet scaffold
#

même Torrent utilise un intermédiaire afin de lister les serveurs P2P

rocky oar
#

Ah oui ?

fleet scaffold
#

Bah oui ? Tu fais comment sinon ?

rocky oar
#

Je pensais que le P2P c'était juste de client à client

fleet scaffold
#

Oui

#

la communication ce fait de client à client

#

Mais la connexion tu l'entame avec l'intermédiaire pour qu'il trouve un client pour toi

rocky oar
#

D'accord 🤔
Et admettons que cet intermédiaire soit corrompu pour X raisons, personne ne peut intercepté les communications qu'il y a entre deux Socket ?

#

Avec un chiffrage de bout en bout je précise

#

(Client1) Chiffrage => Réception (Serveur) Envois => Déchiffrage (Client2)

#

Si quelqu'un ce pose entre les deux à la place du serveur, sans la clef de déchiffrage, je veux être sûr qu'il ne sera pas capable d'intercepter les coms' car c'est l'argument premier de mon projet

fleet scaffold
#

donc aucun risque que la connexion soit intercepté entre 2 sockets

rocky oar
#

D'accord, il sert juste de liaison donc

fleet scaffold
#

oui

#

rien d'autre

rocky oar
#

J'irais me coucher moins c** ce soir 🤣

#

Bon du coup en + de mon stack pour l'app, faut que je prévois un petit serveur bidon avec Express et Socket.io

frosty sand
normal lichen
#

Bonsoir, j'aimerais envoyer un embed qui liste toute les lignes retourner par ma requete sql, pourriez vous m'aider s'il vous plait ? merci😁

rocky oar
#

WOH je vois dans le FUTUUUR ! #LePcPortableQuiNaPasMisLheureAJour

rocky oar
fleet scaffold
#

C'est complicado à mon humble avis

past nimbus
#

🤨

#

Pourquoi compliqué ?

fleet scaffold
#

pas de le faire

#

Mais les limitations pose problèmes

#

1 > la limite de caractères
2 > La limite de caractères

past nimbus
#

Truncate

fleet scaffold
#

t'affiche pas toute les lignes du coup

#

c'est nul

past nimbus
#

Si, en plusieurs messages

fleet scaffold
#

c'est nul en plusieurs messages

#

Non la vrai solution ici, c'est d'envoyé un FICHIER.txt avec les différentes lignes/colonne

past nimbus
#

Bah non, t'as le même résultat visuel au final

fleet scaffold
#

De cette façon la limite de caractère passe à 25 000 000

past nimbus
#

Bah non, si il le veut en message c'est sûrement pour le voir d'un coup

fleet scaffold
#

Avec la maj de discord tu vois le texte sur PC

#

des fichiers

past nimbus
#

Il est truncate

#

Donc useless

fleet scaffold
#

Il est pas truncate

past nimbus
#

Si le visuel est truncate au dessus d'un certain nombre de ligne

fleet scaffold
rocky oar
#

Uhm ... Il faudrait qu'il puisse faire un GET précis (findOne), et s'il fait un GET complet, on pourrait imaginer un système de pagination à coup de bouton qui va simplement remplacer l'embed par la page suivante dans le cas où il aurait énormément de ligne à retourner ?

fleet scaffold
fleet scaffold
#

Mais comment tu fais pour affiché les lignes que tu va truncate

rocky oar
#

Je dis ça parce que j'ai déjà vu ça venant d'un bot

fleet scaffold
#

faudrais donc prévoir un bouton qui fera office de "curseur"

past nimbus
#

L'idée de base est pas logique de base, donc on peut y réfléchir encore longtemps avant de le rendre logique chadThink

rocky oar
#

C'est vrais que ... Pourquoi il veut le contenu de ça DB en embed ? xD

past nimbus
#

Probablement car il a pas cherché les outils existants 😉

fleet scaffold
#

Si ont part du principe qu'on affiche tout dans un embed (ici meilleure solution car la limite est de 4000 caractères)
Il faudrais prévoir de truncate chaque ligne à une certaine limite, pour que ça soit "digeste" à l'écran

Suite à ça, il faudra ajouté 4 boutons (affiché +/affiché avant/ affiché la suite des textes truncates..... revenir en arrière)

rocky oar
#

Après il n'a pas approfondi sont besoin, mais ça ce trouve il veut juste une fonction qui fait office de LeaderBoard pour montrer le classement des membres xD

fleet scaffold
#

j'ai pas les noms des boutons mais globalement c'est simplement des curseurs à prévoir

#

Ont peut aussi utilisé un menu, ou bien + simplement une modal qui demandera une page

rocky oar
#

Les Modals ça me fascine par contre comment les bots discord ont évolué 👀

#

(J'en développe jamais voir très rarement, je me suis arrêté à la v10)

fleet scaffold
#

faut trouvé leurs utilité aux modals

rocky oar
#

Tu peux faire ce que tu veux dans une modal ?

fleet scaffold
#

Nope

#

juste demandé du texte

rocky oar
#

Domage, un mini jeu aurait était drole kappa

rocky oar
#

Imagine que dans les modal tu pourrait inclure du HTML, CSS, JS, ce serait un délire sans noms xD

fleet scaffold
#

car en vrai les "mini-jeu" que t'as en tête Discord prévoit de démocratiser les activités

#

Pour les développeur

rocky oar
#

😮

fleet scaffold
#

ont pourra littéralement créer nos propres activités

rocky oar
#

Bon bah, j'irais pas sur le nouveau TeamSpeak moi ... 🤣

#

Nan mais c'est good en vrais

fleet scaffold
#

c'est ici

rocky oar
#

C'est quoi l'url de ces pages ?

fleet scaffold
rocky oar
#

Ça à l'air génial 😮

fleet scaffold
#

ça l'est

#

faut avoir un site qui vaut le coup pour faire une activité

rocky oar
#

En plus de redécouvrir le dev de bots, je découvre d'autres trucs aux quels je ne m'étais pas intéressé xD

fleet scaffold
rocky oar
#

Mais je vais très certainement explorer ça dès que c'est disponnible

#

Je vais en parler à un amis qui avait commencer à développer un jeu Hack'n Slash avec VueJS ça pourrait l'intéresser xD

rocky oar
normal lichen
# rocky oar Tu as déjà un début de code qui récupère les lignes via la requête SQL ?

oui le voici

module.exports = {
    data: new SlashCommandBuilder()
        .setName('listclient')
        .setDescription('liste tout les clients')
        .setDefaultMemberPermissions(PermissionFlagsBits.Administrator),

    async execute(interaction, bot){
        db.query('SELECT username, bot, datedebut, facturation FROM client', (err, rows) => {
            const embed = new EmbedBuilder()
                .setTitle('Liste des clients')
                .setDescription('Voici la liste des clients')
                .setTimestamp(Date.now())
                .setFooter({
                    text: bot.user.username,
                    iconURL: bot.user.displayAvatarURL(),
                });

            rows.forEach((row) => {
                const ligneFormat = `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`;
                console.log(ligneFormat)
            });
            interaction.reply({embeds : [embed]})
        })
    }
}
rocky oar
#

Umh ... Ce qu'il faudrait pour ton ```js
rows.forEach((row) => {
const ligneFormat = Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation};
console.log(ligneFormat)
});

C'est que tu en fasse un map au lieu du forEach, que tu stock dans une const, dans laquelle tu return 
```js
{name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`}
```  pour chaque ligne (C'est un exemple)

Puis en dessous de setDescription tu fais un `.addFields(tableau.forEach(item => item))`

Je ne sais pas si ça fonctionnerait correctement
#

D'autant plus que si tu as 4985156189451891 lignes à retourné, il va falloir que tu trouve une alternative pour pouvoir tout afficher

normal lichen
#

comment je peut faire un map ? ^^

rocky oar
#

Là mon exemple est valable pour peu de lignes (en prenant en compte que tu ne dépasse pas 4k caractères)

normal lichen
#

pas de soucis j'aurais 10 lignes au maximun ^^

rocky oar
#

Comme le ForEach : ```js
const FormatedArray = rows.map( {username, bot, datedebut, facturation} => {name: 'Ce que tu veux en Titre', value: Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}});

Là j'utilise la destructuration qui t'évite de faire row.quelquechose à chaque fois
#

il faut que tu le fasse avant ton Embed, puis au moment de la création de l'embed tu as juste à faire .addFields(FormatedArray.forEach(item => item))

#

Libre à toi de choisir le nom de la const biensur

normal lichen
#

merci beaucoup je vais essayer cela !

#

et du coup le foreach disparait entierement ?

rocky oar
#

Pas de soucis, et si la Destructuration te pose soucis, tu peux refaire row => row.quelquechose

Oui en faite la diff entre ForEach et Map c'est que ForEach te permet d'agir sur chaque entrée d'un tableau, Map lui te génère un nouveau tableau avec les modifs que tu auras fais sur chaque entrées du tableau de base

#

Avec le Map que je t'ai fais faire et le ForEach que tu vas faire dans le addFields, ça donnera un résultat final comme celui-ci :

.addFields(
 {name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`},
 {name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`},
 {name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`},
 {name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`},
)
#

Sauf si j'ai fais une erreur mais normalement ça devrait être bon

normal lichen
#

mais ce que je ne comprend pas (excusez moi) c'est comment le map va stocker tout les résultats s'il ne sont pas parcouru 😅

rocky oar
#

Justement ils sont parcouru, Map c'est comme ForEach, sauf qu'il recréé un tableau 😉

#

Et c'est stocké car ton map tu le met dans une const

normal lichen
#
    async execute(interaction, bot){
        db.query('SELECT username, bot, datedebut, facturation FROM client', (err, rows) => {
            const embed = new EmbedBuilder()
                .setTitle('Liste des clients')
                .setDescription('Voici la liste des clients')
                .setTimestamp(Date.now())
                .setFooter({
                    text: bot.user.username,
                    iconURL: bot.user.displayAvatarURL(),
                });

            const ArrayFormat = rows.map( {username, bot, datedebut, facturation} => {name: 'Ce que tu veux en Titre', value: `Username: ${row.username} Bot: ${row.bot} Debut: ${row.datedebut} Facturation: ${row.facturation}`});
            interaction.reply({embeds : [embed]})
        })
    }

j'ai cela et l'erreur expected "," sur le "=>"

rocky oar
#

Euh ... Ah

#

attend je le test de mon coté

#

Ah oui pardon xD
ici : {username, bot, datedebut, facturation}
J'ai oublié les () donc ça devient ({username, bot, datedebut, facturation})

normal lichen
#

alors j'ai essayer quelque chose de mon coté qui a fonctionner mais je ne comprend pas ce qui change avec vous 😅

#

const formattedArray = rows.map((row) => ({
  name: 'Titre',
  value: `Username: ${row.username}\nBot: ${row.bot}\nDebut: ${row.datedebut}\nFacturation: ${row.facturation}`,
}));
#

j'ai fait ceci, et a première vue mon embed affiche bien mon résultat de base de donnée 😅

#

c'est quoi la différence entre mettre row et mettre username, bot, datedebut, facturation ? 😅

rocky oar
#

J'ai fais pas mal d'erreur en gros le code que je voulais donné c'était ça xD


const ArrayFormat = data.map( ({username, bot, datedebut, facturation}) => {
  return {name: 'Ce que tu veux en Titre', value: `Username: ${username} Bot: ${bot} Debut: ${datedebut} Facturation: ${facturation}`}
  });

Mais sinon c'est pareil que ton code

#

Et la différence c'est que j'utilise la destructuration, attend je t'envoie une documentation

normal lichen
#

d'accord j'était sur la bonne piste je me doutait que c'etait en utilisation de la destruction et je vien d'essayer de ce code x)

#

du coup sa donne ceci

const formattedArray =  rows.map(({username, bot, datedebut, facturation}) => {
  return { name: 'Ce que tu veux en Titre', 
  value: `Username: ${username} Bot: ${bot} Debut: ${datedebut} Facturation: ${facturation}`
}});
rocky oar
#

Imagine que ```js
const data = [
{username: "TestUsername", bot:"TestBot"},
{username: "TestUsername", bot:"TestBot"},
{username: "TestUsername", bot:"TestBot"},
{username: "TestUsername", bot:"TestBot"},
];

Si tu prend ton exemple avec ```js
data.forEach(item => {
  console.log(item.username); // retourne tout les Usernames
});

En faite tu peux faire : ```js
data.forEach( ({username}) => {
console.log(username); // retourne tout les usernames
});

Ce sera pareil
normal lichen
#

oui je vois a la place de passer le tableau la destruction donne uniquement les variable

rocky oar
#

Car quand tu fais {username} à la place de l'objet, c'est comme si tu faisais object.username directement

normal lichen
#

ceci est le même fonctionnement que lorsque l'on importe discordjs de la sorte const{} = require('discordjs')
a la place de recuperer un tableau on recupere uniuqment le champ qui nous intéresse

#

d'accord je vois, merci beaucoup pour votre aide 😅

rocky oar
#

C'est un avis perso, mais cette synthaxe je la trouve beaucoup plus agréable 🙂

normal lichen
#

oui je trouve aussi 😅
merci beaucoup en tout cas pour votre aide, excusez moi du dérangement 😅

rocky oar
#

Non pas de soucis, j'étais motivé xD

normal lichen
#

moi j'avais beaucoup de mal a comprendre comment envoyer comme sa plusieurs ligne dans un embed mtn j'ai compris sa va m'aider pas mal ^^

rocky oar
#

C'est assez flou quand on a pas l'habitude oui

normal lichen
#

par hasard vous ne sauriez pas comment formatter mes date ? 😅

#

comme c'est en base de donnée champ date sa m'affiche plein de truc a la place de juste la date x)

rocky oar
#

J'ai rencontré les mêmes soucis pour rendre plusieurs données dans des <li> xD
Alors pour formater les Dates c'est très simple mais je vais t'envoyer la documentation 😉

normal lichen
#

super je vous remercie je vais regarder a sa ^^

rocky oar
#

Pas de soucis, et MDN c'est ton meilleurs ami oubli pas 😉

normal lichen
#

oui je trouve pas mal de chose dessus 😅

rocky oar
normal lichen
#

oui la j'ai trouver, pour le coup de l'embed sa me bloquer vraiment mdrr sa faisait longtemps je chercher xD

rocky oar
#

C'est chiant au début, puis à force de pratiquer ça ira tout seul xD

leaden prism
#

Bonjours, normalement avec cette description de commande, je suis sensé avoir 2 choix quand je fait la commande or je n'ai rien pouvez vous m'aider svp

.addStringOption((o) =>
      o
        .setName("etat")
        .setDescription("Etat du systeme de bienvenue : on ou off")
        .setRequired(true)
        .addChoices({name: "on", value: "on"}, {name: "off", value: "off"})
        
    )```
rocky oar
#

Pour ma part je ne suis pas encore à jour sur DJS14 du coup je passe mon tour xD

leaden prism
#

ah xD

normal lichen
leaden prism
#

hein?

normal lichen
#

ton choix correspond a un on off si je comprend bien ?

leaden prism
#

oep

normal lichen
#

un on off revient a faire un true false

leaden prism
#

ui

normal lichen
#

tu peut donc utiliser l'option booleenne a la place de string, comme ceci

.addBooleanOption((option) =>
    option
        .setName("etat")
            .setDescription("Etat du système de bienvenue")
            .setRequired(true)
),
leaden prism
#

a oe

#

mais dans tout les cas j'aimerai bien saoir pk sa fonctionne pas pour des futures commandes

normal lichen
#

je vais regarder

leaden prism
#

ok mrc

normal lichen
#

ton code est bon et fonctionne pour moi, voila le code que j'ai mais c'est le même que toi

        .addStringOption((o) =>
            o
              .setName("etat")
              .setDescription("Etat du systeme de bienvenue : on ou off")
              .setRequired(true)
              .addChoices(
                {name: "on", value: "on"}, 
                {name: "off", value: "off"})  
          ),

leaden prism
#

bizare

#

tu sait d'ou sa peur venir?

#

jpeut voir ton interaction create stp

vernal sluice
#

Helloo tous le monde, j'ai besooin d'aide je comprend pas mon erreur :

Est ce que vous pouvez m'aidez ?

glass cargo
vernal sluice
vernal sluice
#

fs.readFileSync('C:/Users/gauth/Desktop/links.json', 'utf-8');
Ces cette valeur qui le suit

glass cargo
#

Parce que si c'est le contenu d'un fichier .json, pourquoi après tu l'utilise à la ligne 36 comme un chemin d'accès ?

vernal sluice
#

Bah enfaite je pensais qu'en faisant sa je récupérer le contenue du fichier JSON

glass cargo
#

Là, ton code cherche un fichier ayant comme nom le contenu de links.json

vernal sluice
#

Bah en faite j'veux pas le fichier je veux son contenue ..

#

Enfaite mon JSON contient tous les liens afficher dans l'erreur et je veux que le programme les télécharge un par un pour m'éviter de le faire manuellement

glass cargo
#

ton fichier index.js :

const fs = require("fs")
const content = fs.readFile("config.json")

ton fichier config.json :

{
  "x": "y"
}

et donc la variable content prendra pour valeur le contenu du fichier config.json dans une chaîne de caractères

glass cargo