#javascript-typescript
1 messages · Page 28 of 1
interactionCreate est un event, qui est déclenché par l'instance de DJS, donc ton client
tout mon code si vous voulez:
https://pastebin.com/JA0mKg5Z
MDP : gca
donc ça serait :
client.on("interactionCreate", (interaction) => {});
Pas besoin, c'est ça la souci
okay je vais testé
client = la variable qui contient le new Client({})
j'ai fait ça,
client.on("interactionCreate", (interaction) => {
interaction.user.send("Coucou!")
})
c'est bien ça ?
à tester, mais ça me parait ok
at Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\commands\utility\commander.js:53:11)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\events\interactionCreate.js:16:4)```
montre moi ton code update stp
const confirm = new ButtonBuilder()
.setCustomId('confirm')
.setLabel('Prendre la commande')
.setStyle(ButtonStyle.Success);
const cancel = new ButtonBuilder()
.setCustomId('cancel')
.setLabel('Annuler la commande')
.setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder()
.addComponents(confirm, cancel);
client.on("interactionCreate", (interaction) => {
interaction.user.send("Coucou!")
})
ton fichier entier stp
https://pastebin.com/bbxwdb6N
mdp : gca
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Ouais ok non c'est pas bon ton require est faux
client ne fait pas partie de discord.js
Tu as bien un new Client() quelque part, tu dois l'avoir dans ton fichier, t'utilises une lib ou quoi ? ou tu fais tout toi-même ?
c'est un command handler
lequel ?
const fs = require('node:fs');
const path = require('node:path');
const { Client, Collection, GatewayIntentBits } = require('discord.js');
const { token } = require('./config.json');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.commands = new Collection();
const foldersPath = path.join(__dirname, 'commands');
const commandFolders = fs.readdirSync(foldersPath);
for (const folder of commandFolders) {
const commandsPath = path.join(foldersPath, folder);
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
const filePath = path.join(commandsPath, file);
const command = require(filePath);
if ('data' in command && 'execute' in command) {
client.commands.set(command.data.name, command);
} else {
console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
}
}
}
const eventsPath = path.join(__dirname, 'events');
const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js'));
for (const file of eventFiles) {
const filePath = path.join(eventsPath, file);
const event = require(filePath);
if (event.once) {
client.once(event.name, (...args) => event.execute(...args));
} else {
client.on(event.name, (...args) => event.execute(...args));
}
}
client.login(token);
celui du wiki
ta fonction execute dans ton pastebin, essaie de passer client en deuxième argument, et console.log(client) stp
je console.log ou ?
juste en dessous
undefined
je fais quoi ?
for (const file of eventFiles) {
const filePath = path.join(eventsPath, file);
const event = require(filePath);
if (event.once) {
client.once(event.name, (...args) => event.execute(client, ...args));
} else {
client.on(event.name, (...args) => event.execute(client, ...args));
}
}
et dans ta fonction execute :
async execute(client, interaction) ...
j'ai une grosse erreur
lequel
ça faut modifier dans ton index.js, fin là où ce code est
Et le deuxième, là où tu fais ta commande
Fin bref montre ton code
ta commande
tout le js ?
ton index, et ta commande
index.js
const fs = require('node:fs');
const path = require('node:path');
const { Client, Collection, GatewayIntentBits } = require('discord.js');
const { token } = require('./config.json');
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.commands = new Collection();
const foldersPath = path.join(__dirname, 'commands');
const commandFolders = fs.readdirSync(foldersPath);
for (const folder of commandFolders) {
const commandsPath = path.join(foldersPath, folder);
const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
for (const file of commandFiles) {
const filePath = path.join(commandsPath, file);
const command = require(filePath);
if ('data' in command && 'execute' in command) {
client.commands.set(command.data.name, command);
} else {
console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
}
}
}
const eventsPath = path.join(__dirname, 'events');
const eventFiles = fs.readdirSync(eventsPath).filter(file => file.endsWith('.js'));
for (const file of eventFiles) {
const filePath = path.join(eventsPath, file);
const event = require(filePath);
if (event.once) {
client.once(event.name, (...args) => event.execute(client, ...args));
} else {
client.on(event.name, (...args) => event.execute(client, ...args));
}
}
client.login(token);
commander.js (part 1)
const { ActionRowBuilder, SlashCommandBuilder, EmbedBuilder, ButtonBuilder, ButtonStyle, client } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('commander')
.setDescription('Commander votre repas')
.addStringOption(option =>
option.setName('nom')
.setDescription(`Votre nom de famille.`)
.setRequired(true))
// Option 2
.addStringOption(option =>
option.setName('prenom')
.setDescription('Votre prénom.')
.setRequired(true))
// Option 3
.addStringOption(option =>
option.setName('repas')
.setDescription('Le repas que vous voulez manger.')
.setRequired(true))
// Option 4
.addStringOption(option =>
option.setName('localisation')
.setDescription(`Ou-est-ce que vous nous attendez ?`)
.setRequired(true))
// Option 5
.addStringOption(option =>
option.setName('code-promo')
.setDescription(`Avez-vous un code promo ?`)
.setRequired(false)),
async execute(client, interaction){
console.log(client)
await interaction.reply({ content: ':incoming_envelope: Votre commande a bien été envoyé.', ephemeral: true });
const recu = interaction.client.channels.cache.get('1192145289788788756');
commander.js (part 2)
const confirm = new ButtonBuilder()
.setCustomId('confirm')
.setLabel('Prendre la commande')
.setStyle(ButtonStyle.Success);
const cancel = new ButtonBuilder()
.setCustomId('cancel')
.setLabel('Annuler la commande')
.setStyle(ButtonStyle.Danger);
const row = new ActionRowBuilder()
.addComponents(confirm, cancel);
client.on("interactionCreate", (interaction) => {
interaction.user.send("Coucou!")
})
let nom = interaction.options.getString("nom");
let prenom = interaction.options.getString("prenom")
let repas = interaction.options.getString("repas")
let localisation = interaction.options.getString("localisation")
let promo = interaction.options.getString("code-promo") || "Aucun code promotionnel utilisé.";
const commande_embed = new EmbedBuilder()
.setColor('Green')
.setTitle(":bell: **Ding ! Nouvelle commande reçu** :bell:")
.addFields(
{ name: ':family: Nom de famille :', value: `\`${nom}\`` },
{ name: ':adult: Prénom :', value: `\`${prenom}\`` },
{ name: ':fork_knife_plate: Repas :', value: `\`${repas}\`` },
{ name: ':round_pushpin: Localisation :', value: `\`${localisation}\`` },
{ name: ':label: Code promo :', value: `\`${promo}\`` },
{ name: ':person_in_tuxedo: Client :', value: `${interaction.user}` }
)
recu.send({ embeds: [commande_embed], components: [row]});
},
};
enlève le client de ton require
quel file?
commander
essaie de voir ce que ça te log maintenant
bah ça me met encore full error
renvoie un pastebin stp
de quel code ?
commander
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
Déjà ton event ne doit pas être dans une commande, mais dans un ficheir séparé donc déjà règle ça
et après on verra
bah c'est juste pour ranger, tu vois bien qu'avec les embed ça marche
?
tu parles de quel event ?
interactionCreate est un event du client, donc évidemment ça cause des souci, les events doivent être seul et le code des events c'est juste le traitement des events
il à un fichier hein
Events -> interactionCreate.js
j'en ai déjà un
Bah pourquoi tu l'as mis dans ta commande alors
comment ça ?
https://discordjs.guide/slash-commands/response-methods.html
Look ça, et essaie de faire une commande simple pour voir
même erreur
fait voir ton fichier interactionCreate.js
const { Events } = require('discord.js');
module.exports = {
name: Events.InteractionCreate,
async execute(interaction) {
if (!interaction.isChatInputCommand) return;
const command = interaction.client.commands.get(interaction.commandName);
if (!command) {
console.error(`No command matching ${interaction.commandName} was found.`);
return;
}
try {
await command.execute(interaction);
} catch (error) {
console.error(error);
if (interaction.replied || interaction.deferred) {
await interaction.followUp({ content: 'There was an error while executing this command!', ephemeral: true });
} else {
await interaction.reply({ content: 'There was an error while executing this command!', ephemeral: true });
}
}
},
};
met client en premier argument, et ça fonctionnera
quel ligne ?
async execute ?
oui
alors ducoup pour mon ping.js ça marche
que je viens de créer comme tu m'a dis
mais pour mon commander.js
ça me log ça
TypeError: Cannot read properties of undefined (reading 'reply')
at Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\commands\utility\commander.js:35:21)
at Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\events\interactionCreate.js:16:18)
at Client.<anonymous> (C:\Users\Andsley\Desktop\ClickAndEat\index.js:36:50)
at Client.emit (node:events:513:28)
at InteractionCreateAction.handle (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\discord.js\src\client\actions\InteractionCreate.js:97:12)
at module.exports [as INTERACTION_CREATE] (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\discord.js\src\client\websocket\handlers\INTERACTION_CREATE.js:4:36)
at WebSocketManager.handlePacket (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\discord.js\src\client\websocket\WebSocketManager.js:355:31)
at WebSocketManager.<anonymous> (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\discord.js\src\client\websocket\WebSocketManager.js:239:12)
at WebSocketManager.emit (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\@vladfrangu\async_event_emitter\dist\index.cjs:282:31)
at WebSocketShard.<anonymous> (C:\Users\Andsley\Desktop\ClickAndEat\node_modules\@discordjs\ws\dist\index.js:1173:51
console.log client et interaction dans ta commande
t'as log les deux ?
Le print que tu m'as envoyé, il a été print en premier ou deuxième ?
premier
ok donc, supprime client de la function execute sur ta commande
je l'enlève de console.log aussi dcp
oui
le .reply devrait marcher maintenant alors
le .reply marche mais ducoup j'ai mon
client.on("interactionCreate", (interaction) => {
interaction.user.send("Coucou!")
})
qui me fait une erreur
je dois genre faire interaction.on
?
non, vu que tu gères ça dans ta commande normalement non
bah ça me met comme même une erreur ducoup
tu l'as enlevé ?
de?
ReferenceError: client is not defined
at Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\commands\utility\commander.js:54:4)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async Object.execute (C:\Users\Andsley\Desktop\ClickAndEat\events\interactionCreate.js:16:4)
enlevé quoi ?
Pastebin.com is the number one paste tool since 2002. Pastebin is a website where you can store text online for a set period of time.
enlève le client.on du coup
oui
okay, mais ducoup après, je fait comment pour envoyer un message directe (privé quoi) à la personne qui à fait la commande slash et pas celui qui à appuyer sur le button
t'as fait quoi ?
Hey, j'ai un problème avec eslint mais je n'arrive pas à trouver comment le régler. Pouvez vous m'aider svp
le code :
import styles from "./CityList.module.css";
import Spinner from "./Spinner";
function CityList({ cities, isLoading }) {
if (isLoading) return <Spinner />;
if (!cities.length) return <p>No cities found</p>;
return <ul className={styles.cityList}>List</ul>;
}
export default CityList;
finalement j'ai pas réussi
ça envoyait un mess a la personne qui appuyais sur le button
et pas celui qui avait fait la commande
et là ça envoit rien du tout, sans erreur
Bonjour, je suis entrain de créer un bot discord js en v14 avec ts, j'aimerais ajouter un système pour savoir qui a inviter la personne, je suis conscient que discord js ne permet pas de détecter qu'elle lien d'invitation a utiliser la personne pour rejoindre, mon alternative est de stocker les liens d'invitation en base de donnée et lorsqu'un membre rejoins je compare les liens d'invitations de la base de données avec ceux sur discord et regarde lequel a une utilisation en plus, mon soucis actuellement est que dans l'event guildMemberAdd je ne sais pas trop comment je peut faire pour récupérer la liste des invitation dans cette event, pourriez vous m'aiguiller s'il vous plait 😅
Je vous remercie !
Bonne journée
Honnêtement, ce n'est pas une idée viable, car il suffit que ton bot soit hors ligne et tout est cassé.
Mais sinon, tu as cette propriété :
:property: Guild#invites
A manager of the invites of this guild
Je vois mais du coup je doit tout de même comparer avec les invitations que j’ai stocker en base de données ?
Ouais
Je vois que comme ça
Après, tu peux peut-être chercher sur github des bots qui font la même chose pour voir qu'est-ce qu'ils utilisent 👀
Je t’avoue c’est pas trop mon truc
Je préfère chercher et demander de l’aide plutôt que de reprendre des codes, sa fait travailler ma logique 🤣
Mais oui je regarderais, le soucis dans mon idée est que le nombre d’utilisation de l’invitation sois pas fiable si je comprends bien ?
C'est le nombre d'invitations dans ta base de données qui ne sera pas fiable
T'inquiète, je suis pareil, mais quand je sèche vraiment, je vais juste jeter un coup d'oeil pour ensuite le réécrire à ma façon ^^
Oui je vois merci du conseil, je regarderai a cela ! x)
Bonjourr, j'ai envie d'utiliser axios, pour faire un bot qui contacte une api, mais comment je peut faire sachant que j'ai que un token d'api
Je fais partir du fait que l'API a une authentification "basique" :
const axios = require("axios")
axios.get("https://example-api.com/users", {
headers: {
Authorization: "Bearer <token>"
}
}).then(res => /* Handle res */).catch(res => /* Handle error */)
axios.post("https://example-api.com/users", {
username: "Didier"
}, {
headers: {
Authorization: "Bearer <token>"
}
}).then(res => /* Handle res */).catch(res => /* Handle error */)
username: c'est quoi ?
Le body
j'ai mis un truc au pif
Mais après, tu remplace par les bons trucs ^^
okay, et ça je le rentre au moment d'executer la commande, ou avant
ça dépend ce que tu veux faire 🤷♂️
Mais une fois la commande exécutée me parait plus logique x)
okay je vais faire ça merci
bon, j'ai tenté quelque chose,
code :
const { SlashCommandBuilder } = require('discord.js');
const axios = require('axios')
module.exports = {
data: new SlashCommandBuilder()
.setName('view-warns')
.setDescription(`Regarder les warns d'un joueur spécifique.`)
.addStringOption(option =>
option.setName('pseudo')
.setDescription(`Pseudo du joueur d'ou vous voulez regarder les warns.`)
.setRequired(true)),
async execute(interaction) {
let pseudo = interaction.options.getString("pseudo");
axios.get("https://dashboard.kobralost-rp.com/tokens/9583/67/authorize?scopes=punishments-moderation.read,punishments-team.read", {
headers: {
Authorization: "MON_TOKEN_API"
}
})
axios.post("https://dashboard.kobralost-rp.com/tokens/9583/67/authorize?scopes=punishments-moderation.read,punishments-team.read", {
username: `\`${pseudo}\``
}, {
headers: {
Authorization: "MON_TOKEN_API"
}
})
console.log(axios)
},
};
et ça à pas l'air de marche
et je sais pas si c'est ça qu'il faut faire
J'en sais rien moi x)
Si t'es certains qui c'est comme ça que fonctionne l'API, va leur demander directement à eux :)
okay
Peut-être que les gens ont eu un accès à Google pour noel 
Ou alors ChatGPT a été entrainé grâce à nos réponses 😄
Salut est-ce que quelqu'un sait comment faire une animation de slide comme sur : https://www.rolex.com/fr/watches/gmt-master-ii/m126720vtnr-0001 , sachant que ce n'est pas de la vrai 3D mais une animation frame par frame ?
Si c’est de la 3D
Ah non tu as raison, je vais regarder un peu plus je te tiens au courant
@floral bolt d'ailleurs j'ai déjà codé l'animation de la montre qui tourne au scroll avec gsap, je pourrais peut-être la réutilisée pour ça, le code: ```var images = [];
function preload(index) {
images[index] = new Image();
images[index].src = assets/rolex-img/frame-${index}.avif;
}
for(let i = 0; i < 180; i++){
preload(i)
}
const scrollAnim2 = document.getElementsByClassName('scroll-anim-2')[0];
const timeline2 = gsap.timeline({
scrollTrigger: {
trigger: '.scroll-anim-2',
start: 'top top',
end: '+=3785',
scrub: true,
pin: true
}
});
timeline2
.to('.scroll-anim-2', {
duration: '2840',
onUpdate: () => {
const animDuration = 2840;
const scrollPercentage = timeline2.time() / animDuration * 100;
var currentImage = Math.round(179/100 * scrollPercentage);
currentImage = currentImage < 180 ? currentImage : 179;
scrollAnim2.style.background = url('assets/rolex-img/frame-${currentImage}.avif');
scrollAnim2.style.backgroundPosition = 'center';
scrollAnim2.style.backgroundSize = '100%';
},
animation: 'frame'
}, 0)```
tu dev sur quoi ?
je recode une page du site de rolex que je trouve intéressante, c'est cette page : https://www.rolex.com/fr/watches/gmt-master-ii
Oui mais avec quel framework
@floral bolt après j'avais pensé à faire une scrollbar custom invisible pour l'animation et mettre un smooth scroll pour que ce soit plus fluide. J'utilise pas de framework, juste gsap et un peu tailwind.
Ok en gros tu dois utilisé les event listener
wheel, touchmove ect
j'ai testé de calculer la vitesse de swipe puis de calculer de combien d'images il faut avancer dans l'animation etc avec onClick et onMouseUp mais j'aime pas trop cette solution
enfaite tu vas plutot check le x ou le y de ta page
faire un delta pour avoir tant d'image par x ou y
en gros eux ils utilisent canvas pour afficher les images
apres je ne sais pas comment marche le code derriere
ah oui j'utilise pas trop les canvas, pourquoi en utiliser pour afficher des images ?
mais sinon tu en pense quoi de faire une scrollbar invisible avec smooth scroll ? Vu que j'ai déjà l'animation au scroll j'aurais juste à faire la barre de scroll, mais je sais pas si c'est très propre
je penses que c'est pour l'optimisation les images sont prechargé et donc des que le x ou y change ca le change dans le canva
mais même sans canvas je précharge les images avec ```var images = [];
function preload(index) {
images[index] = new Image();
images[index].src = assets/rolex-img/frame-${index}.avif;
}
for(let i = 0; i < 180; i++){
preload(i)
}```
bah test tu verras bien
si ça fonctionne parce que quand je retire ce morceau de code, dans source il y a que la première image de l'animation, alors que quand il y est il y a toutes les images
Si seulement
@floral bolt j'ai testé de custom scrollbar mais ça fonctionne pas très bien : https://codepen.io/JFR001/full/OJGyQyy
J'ai tapé la commande "node main" pour la vidéo de coder un bot dans la deuxième partie, et j'ai une erreur, je n'arrive pas a retrouver qu'est-ce que c'est
Est-ce que tu peux fournir le code où tu fais appel à discord.js
?
tu parles de ça?
Est-ce que tu as installé dotenv ?
T'as pas indiqué le bon path dans ton require sur ta variable loadCommands
T'indiques loaders/ pourtant t'es à la racine même
Donc ça devrait être commands/loaders/loadCommands
c exactement le meme chemin??
js
oui
Dans son état actuel, ton code cherche le dossier loaders dans music (qui n'existe pas), il faut préciser correctement le chemin comme l'a indiqué Pizu
Soit d'abord entrer dans le dossier commands puis loaders
oe?
Dans VSCode, tu peux clic droit sur un fichier pour copier son chemin relatif
donc music jdevrais le deplacer
Non
Juste ici regarde tu essayes d'accéder directement au dossier loaders depuis ton main.js

Qui est lui-même dans un autre dossier commands
Si t'ouvres ton explorateur de fichier windows
Tu va pas accéder à loaders direct
euh??
oui
okok
Il va aller dans commands, dans loaders et prendre ton fichier
jvoi
Mais pour ça il faut lui indiquer
Il est bête et mêchant ton interpréteur
Il lit ce que tu lui a dis
oe
jle remplace par l'autre dcp
jveux bien hein
mais sa met tjrs la mm erreur
./commands/
ah
Suffit juste d'ajouter un petit slash après ton point normalement
Bon maintenant le soucis doit venir de ton loadCommands lui-même
Tu peux envoyer le code de ton loadCommands ?
Ok, tu as installé fs ?
npm i fs ?
Oui
oui
Ok
vsy
C’est quoi ton problème maintenant ?
@marsh nexusTu devrais arrêter de te faire chier et passer sur Sheweny qui est une superbe lib pour faire tes bot
Tu me présentes ?
Y'a Sapphire aussi 🤷♂️
Pcq Sheweny n'est plus maintenu
Pas très grave qu'il soit plus maintenu pour le moment, toutes les fonctionalités sont supportés
Oui c'est vrai mais sur le long terme c'est po bien nan ? 🤔
Enfin je crois
Ah oui ? Sur quel points ?
Rien qu'à la façon d'utiliser, sur une commande tu dois la register etc, pas sur Sheweny fin il a l'air plus chiant
oui mais on conseille pas une lib plus maintenu
discord évolue trop vite pour se dire "c'est bon"
bonsoir à tous j'ai un soucis sur l'interaction de mes bouttons en ts pour ajouter un role lors de l'acceptation du reglement discord
j'ai ce bout de code
Voici un extrait de code en typescript partagé sur ShareMyCode.io
mais je n'arrive pas à résoudre cette erreur
En JavaScript tout à une couleur 😉
Fait ta propre lib 🙏
bonjour je developpe un evenement pour créer un embed de bienvenue mais j'ai cette erreur
voici mon code
Voici un extrait de code en typescript partagé sur ShareMyCode.io
Ajoute une condition pour vérifier qu'il s'agit d'un channel texte
Bonjour, comment on fait pour corriger cette erreur, j'ai envie de faire une commande lock
module.exports = {
data: new SlashCommandBuilder()
.setName('lock')
.setDescription('lock the current channel'),
async execute(interaction) {
await interaction.reply('salon fermé avec succès !');
interaction.channel.permissionOverwrites.edit(interaction.guild.everyone.id, {
VIEW_CHANNEL: false,
SEND_MESSAGES: false,
READ_MESSAGE_HISTORY: false,
ATTACH_FILES: false
});
}
}
mais j'obtiens cette erreur
E:\dev\discord\ondabot\src\commands\moderation\lock.js:11
interaction.channel.permissionOverwrites.edit(interaction.guild.everyone.id, {
^
TypeError: Cannot read properties of undefined (reading 'id')
at Object.execute (E:\dev\discord\ondabot\src\commands\moderation\lock.js:11:82)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
Node.js v20.11.1
je comprend pas, je suis sur la meme base de donné meme requette mais 2 reponse différente entre mes logs et datagrip, la db et le script tourne sur la meme machine de dev et meme UTC
datagrip:
SELECT DATE(sessionEndTimeStamp) AS day,
SUM(time) AS total_time,
SUM(deaths) AS total_deaths,
SUM(kills) AS total_kills
FROM gm_server_stat_session
WHERE serverID = 'Q9SuZQRFmR'
AND steamID64 = '76561198200175111'
AND sessionEndTimeStamp > DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY day
->>>
2024-03-02,720,11,7
2024-03-03,8942,64,46
2024-03-05,2149,4,4
2024-03-07,4946,70,5
2024-03-08,9145,56,62
2024-03-09,9562,0,20
log (result, de la query dans mon bot js)
[
{
day: 2024-03-01T23:00:00.000Z,
total_time: '720',
total_deaths: '11',
total_kills: '7'
},
{
day: 2024-03-02T23:00:00.000Z,
total_time: '8942',
total_deaths: '64',
total_kills: '46'
},
{
day: 2024-03-04T23:00:00.000Z,
total_time: '2149',
total_deaths: '4',
total_kills: '4'
},
{
day: 2024-03-06T23:00:00.000Z,
total_time: '4946',
total_deaths: '70',
total_kills: '5'
},
{
day: 2024-03-07T23:00:00.000Z,
total_time: '9145',
total_deaths: '56',
total_kills: '62'
},
{
day: 2024-03-08T23:00:00.000Z,
total_time: '9562',
total_deaths: '0',
total_kills: '20'
}
]
le log donne toute les sessions auparavant du joueur
c'est ça enfaite
L'un est formaté en JSON et l'autre en CSV
C'est tout x)
bonjour, j'essaie de faire une commande statistiques pour mon bot discord mais ça ne correspond pas, seul la totalité des membres est juste
voici mon code
Voici un extrait de code en typescript partagé sur ShareMyCode.io
La propriété guildMembers donne le nombre total de membres sur le serveur alors que members.cache.filter().size donne le nombre de membre en cache.
pour les chauffeurs par exemple members.cache.filter().size me retourne 1 cependant j'en ai plus
Oui, car il n'y a qu'un seul chauffeur en cache
du coup je peux pas le faire comme ça
au bout d'un moment mes stats ne seront plus à jour
si plus dans le cash
Exact
@crude bramble Je te recommande pas trop d'utiliser ça pour un bot qui doit gérer un gros serveur ou plusieurs serveurs, mais il semblerait qu'il soit possible d'ajouter tous les membres d'un serveur au cache manuellement : https://discord.js.org/docs/packages/discord.js/14.14.1/GuildMemberManager:Class#fetch
ah oui nickel du coup il serais plus judicieux de faire la maj uniquement à l'ajout ou suppression d'un role
Je pense que ça serait mieux de le faire au démarrage du bot
Comme ça tu met tous les membres en cache, et les nouveaux s'ajouteront tout seuls :)
ok je te remercie pour tout
finalement voilà ce que je fait au chargement du bot
Voici un extrait de code en typescript partagé sur ShareMyCode.io
👌
Bonjour bonjour !
Je suis en train de dev un petit script Google app script pour faire de l'automatisation. Mais j'au une erreur dans mes variables apparemment.
Quelqu'un serait disponible en vocal en ou en message ?
Par message, poste ton problème directement si tu veux de l'aide
un peu rouillé je sais plus comment faire ça lol
j'ai ça dans mon code actuellement
Ok je vous explique...
Je travaille sur Google App script pour automatiser un G SHeet
Je vous montre mon code et l'erreur
.setDescription(<#${membre.user.tag}> **Action**: Ban **Raison**: ${raison});
ça fait une demi heure que je m'acharne sur le misubishi lol
donc membre.user.id
dans ton cas
function testFunction(e) {
var timestamp = e.values[0];
var testVariable = e.values[1];
var file = DriveApp.getFileById('168Q1IQ46j6PdTZseGFrYksCkL4x3_RXEyINGEPeCjR8');
var folder = DriveApp.getFolderById('1aLIzJU1CupUUA3R4NuQ9koR39mVqvhPd')
var copy = file.makeCopy ( timestamp + testVariable + '_' , folder);
var doc = DocumentApp.openById(copy.getId());
var body = doc.getBody();
body.replaceText('<<testVariable>>', testVariable);
body.replaceText('<<timestamp>>', timestamp);
var editors = ['oxi.lol13@gmail.com', 'drixizerpoff@gmail.com'];
for (var i = 0; i < editors.length; i++) {
doc.addEditor(editors[i]);
}
doc.setSharing(DocumentApp.Access.ANYONE_WITH_LINK, DocumentApp.Permission.VIEW);
doc.setCopyable(false);
doc.setDownloadable(false);
doc.setPrintable(false);
// Exporter le document en tant qu'image PNG
var exportURL = "https://www.googleapis.com/drive/v3/files/" + doc.getId() + "/export?mimeType=image/png";
var response = UrlFetchApp.fetch(exportURL, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
});
var blob = response.getBlob();
var pngFile = folder.createFile(blob);
// Créer un fichier PNG dans le dossier spécifié
var pngFolder = DriveApp.getFolderById('19qC47nKkbabBM1cq036OVMccr4jqFjPj');
var pngFile = pngFolder.createFile(blob);
// Exporter le document en tant qu'image PNG
var exportURL = "https://www.googleapis.com/drive/v3/files/" + doc.getId() + "/export?mimeType=image/png";
var response = UrlFetchApp.fetch(exportURL, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
});
}```
ptdr c'était aussi con que ça 😅
merci à toi en tout cas
Pas de prob bg
Rien a voir, en js avec mysql2 la réponse est donné sous forme du objet, avec datagrip qui permet de visualiser c'est toi qui décide, mais le contenu devrais être le meme car c'est la meme requête
Nan, c'est la meme requête qui est exécuter
Donc sa ne devrait pas être le cas
je pense a un problème de timezone
Salut: le pb c’est ta , a la fin de la ligne précédente
Au lieu de mettre la virgule apres setValue déplace la après set emojis
jviens de me co, j'allais lui donner la réponse t'es trop rapide 
bonjour
bonjour.
Bonsoir !
j'aurais besoin de quelqu'un qui connaisse la doc dev de discord pour faire les embeds. C'est un problème de merde vraiment. Je suis persuadé que quelqu'un qui connais un minimum va me débloquer en 2 secondes. Ce qui n'est pas mon cas.
Voici l'erreur :
Exception: Request failed for https://discord.com returned code 400. Truncated server response: {"embeds": ["0"]} (use muteHttpExceptions option to examine full response) at sajp(Code:180:15)
Je précise que je n'utilise pas de librairie, c'est inutile dans mon cas, je veux juste envoyer en embed via un webhook
Voici mon code :
function sajp(e) {
// morceau de code innutile...
// Référence à l'objet File correspondant au doc
var file = DriveApp.getFileById(doc.getId());
// Définir les autorisations de partage pour que n'importe qui ayant le lien puisse voir le document
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
doc.saveAndClose();
// Exporter le document en PDF
let exportURL = 'https://www.googleapis.com/drive/v3/files/' + doc.getId() + '/export?mimeType=application/pdf';
let response = UrlFetchApp.fetch(exportURL, {
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
}
});
let blob = response.getBlob();
let pdfFile = folder.createFile(blob);
// URL webhook
let discordWebhookUrl = 'mon webhook'; ```
// Message channel Discord
let discordEmbed = {
'embeds': [{
'author': {
'name': ':warning: __TEST__ - NE PAS PRENDRE COMPTE :warning:'
},
'title': ':scales: JuriSys - SAJP',
'description': '***S**ystème **A**utmatisé de **J**urisprudence **P**énale*.\n\n**SAJP** est un service de JuriSys®, votre système de traitement de documents et actes juridiques sécurisé.\n\n:ring_buoy: Pour toute demande de support technique merci de joindre __Jordan Walpole__.\n\n━━━━━━━━━━━━━━━\n:mega: **NOUVELLE DECISION PENALE**\n━━━━━━━━━━━━━━━',```
'fields': [
{
'name': ':card_box: Identification Procédure',
'value': 'N°TAJ: ' + casier,
'inline': true
},
{
'name': ':judge: Magistrat du siège',
'value': prenomJuge + ' ' + nomJuge + ' ' + gradeJuge,
'inline': true
},
{
'name': ':police_officer: OPJ/APJ en charge',
'value': ':construction:*En développement...*:construction:'
},
{
'name': '⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼⎼',
'value': 'ㅤ'
},
{
'name': ':identification_card: Identité du mise en cause',
'value': prenomMisEnCause + ' ' + nomMisEnCause,
'inline': true
},
{
'name': ':telephone_receiver: Contact mis en cause',
'value': ':construction:*En développement...*:construction:',
'inline': true
},
{
'name': ':mag:Chef(s) d\'inculpation',
'value': chefs
},
{
'name': ':crossed_swords: Condamnation',
'value': sanctionCourte,
'inline': true
},
{
'name': ':page_facing_up: Original de la décision',
'value': '[Cliquer ici]' + '(' + pdfFile.getUrl + ')',
'inline': true
}
],
'color': '#429bff',
'footer': {
'text': ':scales: JuriSys® SAJP® | ALPHA VO.4'
},
'timestamp': 1710164479319
}]
};```
// Option de requête
let params = {
method: 'post',
headers: {
'Content-Type': 'application/json'
},
payload: JSON.stringify(discordEmbed)
};
// Envoi de la requête à Discord
UrlFetchApp.fetch(discordWebhookUrl, params);
}```
Je ne comprend pas mon erreur...
J'avoue que je suis un peu perdu 😅
Si tu as le temps de m'aider je suis pas contre ...
Surtout que je suis deg, c'est le dernier truc que j'ai à fix, après j'ai terminé mon script xD
console.log(JSON.stringify(discordEmbed))
j'ai légalement le droit d'obtenir l'adresse ip de ceux passant sur mon site ?
pas pour les enregistrer dans une bdd mais juste pour le mettre dans le local storage du navigateur comme ça jpeux verif s'il sont déjà passer sur le site juste avec un if
Oui
Ben déjà, par défaut, le serveur web l’enregistre dans les logs d’accès (du moins pour nginx)
Il faut juste que tu pense à le préciser dans ta politique de confidentialité
Salut !
J'ai un problème avec requestAnimationFrame (API Canvas). J'aimerais ajouter des arguments à la fonctions, mais je sais pas comment faire et Google ne m'a pas trop aidé || 😅 ||.
Comment faire ?
dmd à chat gpt
tu lui envoie la doc si il trouve pas
C’est pas trop le principe du serveur ça …
Tu cherches à faire quoi enfaite ?
il a dit demande à ChatGPT sur un serveur entre-aide 😂
et pour ta question, essaye de checker là : https://developer.mozilla.org/fr/docs/Web/API/Canvas_API
Ajouté en HTML5, l'élément est un nouvel élément qui peut être utilisé pour dessiner des graphismes via des scripts JavaScript. Par exemple, Il peut être utilisé pour dessiner des graphes, faire des compositions de photos, des animations, ou même faire du traitement ou de l'affichage de vidéos en temps réel.
y'a un tutoriel canvas
C'est toujours de là où je part...
Y'a rien pour mon problème.
draw(scene, tileset, sprite) {
let ctx = scene.canvas.getContext("2d");
ctx.drawImage(tileset.image, tileset.left(sprite), tileset.top(sprite), tileset.blockWidth, tileset.blockHeight, this.posX, this.posY, this.width, this.height);
}
beginDraw(scene, tileset, sprite) { this.drawAnimation = requestAnimationFrame(this.draw); }
Je veux que ça exécute draw ||Lui n'est pas beuggé|| en boucle. C'est tout.
while (true) {
draw()
}
Oui, certes, mais requestAnimationFrame est optimisé pour (https://developer.mozilla.org/fr/docs/Web/API/window/requestAnimationFrame). Sinon, c'était effectivement le while ma 1ere idée.
Honnêtement, je te fais confiance, j’ai jamais utilisé canva 😅
Nan, y'a pas de mal !
Tu peux sans doute t'en sortir avec un truc qui ressemble à ça
beginDraw(scene, tileset, sprite) {
this.drawAnimation = requestAnimationFrame(() => {
this.draw(scene, tileset, sprite);
this.beginDraw(scene, tileset, sprite);
});
}
Leur code d'exemple repose sur le même principe :
const element = document.getElementById("un-élément-à-animer");
let debut, tempsPrecedent;
let fini = false;
function iteration(chrono) {
if (debut === undefined) {
debut = chrono;
}
const ecoule = chrono - debut;
if (tempsPrecedent !== chrono) {
// Math.min() est utilisée ici afin de s'assurer
// que l'élément s'arrête exactement à 200px
const compteur = Math.min(0.1 * ecoule, 200);
element.style.transform = `translateX(${compteur}px)`;
if (compteur === 200) fini = true;
}
if (ecoule < 2000) {
// On arrête l'animation après 2 secondes
tempsPrecedent = chrono;
if (!fini) {
window.requestAnimationFrame(iteration);
}
}
}
window.requestAnimationFrame(iteration);
Ici, la section avec le if (ecoule < 2000) { ... } rééxécute le callback iteration et permet de boucler récursivement ; le code que je t'ai donné fait la même chose mais en fournissant une fonction anonyme en callback ce qui te permet de passer des paramètres à tes fonctions.
Il se peut que tu rencontre cette erreur cependant : https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Errors/Too_much_recursion
Il faudra que tu regarde comment faire pour exécuter la fonction en boucle sans passer par de la récursion mais c'est généralement possible, juste pas toujours "trivial"
Le plus simple ça sera peut-être de faire ce qui est suggéré ici : https://stackoverflow.com/a/159777
Ca marche, merci !!!!!!!!!!!
Tant mieux 👌
Hésite pas à expérimenter avec les notions de récursivité dans le futur ça pourra te servir
Ok!
Bonjour !
Est ce que quelqu'un pourrait expliquer comment marche le flux de données en react? J'ai regardé la vidéo de grafikart mais ça ne m'eclaire pas ..
merci d'avance
Hello, il y a des dev react native par ici ?
En gros je requête mon API via axios et en dev tout marche bien, par contre quand je compile l'APK ça marche plus
Si tu appels localhost c’est normal 🙂
Nop j'appel une API bel est bien déployé en pre-prod ^^
J'ai plusieurs pistes, je passe par des secrets et un secure storage pour stocker les clés d'api ça vient peut-être de là
Ou alors il me manque un certificat TLS
J’avais eu le même soucis avec des variable d’environnements
Le pb c'est que je vois pas trop comment debug
Vu que la request est pas émise bahhhhhh
Tu avais mis en env var l'URL de l'API ?
Oui
Et comment avais-tu résolu le soucis du coup ?
En enlevant les env 😄
bonjour , est ce que qql sait pq ma console est remplie d'erreurs ? ( par exemple la ya 10 fois la même erreur )
Parce-que la fonction est appellé plusieurs fois je pense.
ah effectivement merci
Hello, j'ai un petit probléme, j'ai mon fichier js "modal-exemple.js" qui n'arrive pas a acceder au path par aller dans le fichier "storage/data.json".
?
Ton chemin est pas bon en gros
oui je sais, mais justement, quelle est le bon chemin ?
./src/storage/data.json
Bonjour, je bosse sur un projet pour mon ecole pour faire une application VueJS. Je me demandais comment j’allais faire mon back sachant que c’est une appli en temps réel où les utilisateurs sont connectés à des sockets communs. Je vois souvent dans les projets qu’il y a une appli back et une appli front utilisant différents framework. Hors je cherche la simplicité et l’efficacité d’où le choix de VueJS pour le front.
Que me conseillerez-vous ?
Comment s’y prendre est-ce que je fais le tout au même endroit où dois-je compartimenter le back et le front ? Si oui comment la connexion entre le back et le front se fait ?
Sachez que j'ai fait des recherches, ce sont des questions aux quels je n'ai pas réussi à avoir une réponse claire pour pouvoir prendre une décision. Je préfère demander à ceux qui ont l'expérience pour m'aiguiller.
Pour te donner une réponse détaillée en rapport avec mon expérience et de ce que j'ai pu voir, je peux te donner cette réponse là :
Pour ton projet d'appli VueJS, séparer le front du back, c'est vraiment la meilleure approche pour plusieurs raisons. Voici pourquoi c'est super important et comment ça peut faire une grosse différence pour ton projet.
Quand tu sépares le front et le back, tu organises ton projet en deux grandes parties qui communiquent entre elles via des API. Cela rend ton code plus clair parce que chaque partie a son propre rôle bien défini : le front s'occupe de tout ce qui est interaction avec l'utilisateur, tandis que le back gère la logique métier, l'accès aux données, etc. Cela simplifie beaucoup le développement et le debug, car tu sais exactement où aller pour modifier une fonctionnalité spécifique.
Avoir le front et le back séparés facilite énormément la maintenance et les mises à jour. Imaginons que tu veuilles changer de techno côté front ou ajouter des fonctionnalités back-end ; si tout est séparé, tu peux le faire sans impacter l'autre partie. Cela te permet d'être plus agile et de répondre plus vite aux besoins de ton projet ou aux retours des utilisateurs.
Séparer le front du back ajoute une couche de sécurité à ton appli. Tu peux, par exemple, mieux contrôler l'accès aux données sensibles en ne les exposant jamais directement au front-end. Tout passe par des API qui peuvent être sécurisées avec des tokens d'authentification, des vérifications de permissions, etc. Cela réduit le risque de failles de sécurité exploitables.
Si dans le futur, ton appli doit monter en charge, avoir une séparation claire entre front et back te facilitera la vie. Tu pourras scaler les parties indépendamment selon leurs besoins. Par exemple, si ton interface utilisateur devient plus complexe et requiert plus de ressources, tu pourras scaler le front sans toucher au back, et vice versa.
Séparer le front et le back te donne une flexibilité incroyable en termes de choix technologiques. Tu peux choisir les outils les plus adaptés pour chaque partie de ton projet. Par exemple, VueJS est génial pour le front, mais pour le back, tu pourrais opter pour Node.js, Express, ou même FastAPI si tu es plus à l'aise avec Python. Cette flexibilité te permet d'optimiser chaque partie de ton application pour les meilleures performances et la meilleure expérience utilisateur.
Chercher la simplicité et l'efficacité, c'est crucial, mais ça ne veut pas dire qu'il faut précipiter les choses ou compromettre la qualité du projet
Les autres pourront compléter. Je pense que j'ai oublié beaucoup de choses mais tu as les gros points important par rapport à ta question
D'accord merci ça m'aide beaucoup à comprendre, je vois. Étant donné que l'on a 3 mois faire ce projet, on m'a conseillé Adonis et d'utiliser TypeScript. Ce que j'ai du mal à concevoir c'est les calls API comment ils se font à quel endroit, à quel moment ? Je me projette difficilement, car avec les frameworks js ou ts on est souvent éparpillé et libre.
Tu vas d'abord définir des routes qui correspondent à différentes actions que ton application peut effectuer. Ces routes seront définies dans des fichiers de route, souvent dans le dossier routes de ton projet Adonis.
Chaque route sera liée à une fonction spécifique dans un contrôleur. Les contrôleurs contiennent la logique pour répondre aux appels API. Par exemple, si tu as une route pour récupérer la liste des utilisateurs, tu auras un contrôleur qui contiendra la logique pour interroger la base de données et renvoyer les données des utilisateurs.
Du côté de ton application VueJS, tu vas faire des appels HTTP à ces routes définies dans ton back-end AdonisJS pour récupérer des données ou effectuer des actions. Ces appels peuvent être déclenchés par des interactions utilisateur, comme cliquer sur un bouton, ou par des événements dans le cycle de vie des composants VueJS, comme le montage d'un composant.
Une fois que l'API back-end a traité la demande, elle renvoie une réponse (généralement au format JSON) que ton application VueJS peut alors utiliser pour mettre à jour l'interface utilisateur, afficher les données, etc.
C'est du MVC comme fait Next.js, Laravel et d'autres frameworks.
Yes je vois d'accord donc pour le back on est sur du Model Controller et sur le front on a les données modélisés et la vue
et il ya des astuces pour mettre en commun la modélisation des données ?
par exemple je souhaite typé mes données vu que c'est possible en TypeScript, afin d'être sûr d'avoir un objet du même type et accéder aux méthodes de celui-ci ect ?
d'habitude comment s'organise le front et le back dans ce cas de figure
car il s'agit d'une communication de données bilatérales à certains moments
d'où l'intention de typer mes données correctement avec des comons classes (c'est comme ça que je faisais en Java)
(un package comon et dedans toutes les classes communes lorsque j'avais une partie client et une partie server)
D'abord, une chose super pratique avec TypeScript, c'est qu'on peut définir des modèles ou des interfaces pour nos données. Du coup, si tu veux être sûr que tes données respectent un certain format ou une certaine structure à travers ton appli, tu peux définir ces structures sous forme d'interfaces ou de classes dans TypeScript. Par exemple, si tu as un objet utilisateur, tu définis une interface User avec toutes les propriétés attendues et leurs types. Comme ça, que ce soit côté front ou back, tu peux t'assurer que tes utilisateurs seront toujours manipulés de la même manière.
Pour la partie partage de ces types entre le front et le back, y a plusieurs façons de le faire. Si ton front et ton back sont dans le même repo (monorepo), tu peux simplement avoir un dossier types ou models à la racine de ton projet, où tu stockes tous ces types TS. Ensuite, tu les importes là où tu en as besoin, que ce soit côté front ou back. Cela rend les choses super pratiques et centralisées.
Si par contre, ton front et ton back sont dans des repos séparés, là ça devient un peu plus compliqué mais pas impossible. Une solution serait de créer un package npm privé contenant tous tes modèles TypeScript partagés. Tu le publies ensuite dans un registre npm (privé ou public, selon tes besoins de confidentialité), et tu l'installes comme dépendance dans tes projets front et back. Cela demande un peu plus de setup initial, mais c'est hyper efficace pour garder tout synchronisé.
Pour ce qui est de la communication de données bilatérale, surtout en temps réel, utiliser des sockets c'est super, mais ça ajoute une couche de complexité pour s'assurer que les données échangées sont bien du type attendu. Là encore, TS peut t'aider. En définissant des types ou interfaces pour les messages échangés via les sockets, tu peux t'assurer que les données envoyées et reçues sont correctement typées. Cela te permet de profiter du système de types de TS pour sécuriser et documenter la communication entre ton front et ton back.
En gros, l'idée c'est de vraiment tirer parti de typescript pour définir des structures de données communes et les partager entre ton front et ton back. Cela demande un peu d'organisation et parfois de setup technique, mais les bénéfices en termes de maintenabilité, de sécurité et de clarté du code sont énormes. Et puis, c'est assez similaire à ce que tu faisais en Java, donc ça devrait te parler.
Et tu ferras gaffe ton portfolio que tu as fais, je sais pas si il est terminé ou non, mais, il est pas du tout adapté sur les écrans mac
pc portable non plus apparament
le texte je le vois en gigantesque
je sais j'ai pas fait le responsive en tout cas j'avais commencé
pourtant sur les écrans 1920*1080 ça marche chez moi
Personnellement écran macbook c'est 1440*900
Bonjour ! Est-ce-que quelqu'un saurait pourquoi ma navbar nbe marche pas ? :
import { BrowserRouter , Route , Switch } from 'react-router-dom'
import Home from './pages/Home'
import Portfolio from './pages/Portfolio'
import Contact from './pages/Contact'
import Knowledges from './pages/Knowledges'
import NotFound from './pages/NotFound'
const App = () => {
return (
<>
<BrowserRouter>
<Switch>
<Route exact path='/' component={Home} />
<Route path='/competences' component={Knowledges} />
<Route path='/portfolio' component={Portfolio} />
<Route path='/contact' component={Contact} />
<Route component={NotFound} />
</Switch>
</BrowserRouter>
</>
);
};
export default App; ```
<Route path='/contact' element={<Contact />} />
Salut, je rencontre un pb avec la lib koffi et une dll, si il y a des gens qui ont déjà fait affaire a cette lib j'ai besoin de vous !
Pose ton problème directement
Ce sera plus simple ^^
Bah en gros j'essaye d'exécuter la fonction pcap_findalldevs de wpcap.dll et de récupérer sa sortie mais impossible de la récup
C'est-à-dire ? Y a plus de détails ?
Bah tout simplement j'arrive a exécuter la fonction mais je n'arrive pas récupérer son return avec koffi
https://www.tcpdump.org/manpages/pcap_findalldevs.3pcap.html
Et ton code ça donne quoi ?
import koffi from 'koffi';
const libpcap = koffi.load('C:/Windows/System32/Npcap/wpcap.dll');
const sockaddr = koffi.struct('sockaddr', {
sa_family: 'ushort',
sa_data: 'char[14]',
});
const pcap_addr = koffi.struct('pcap_addr', {
next: 'pcap_addr *',
addr: sockaddr,
netmask: sockaddr,
broadaddr: sockaddr,
dstaddr: sockaddr,
});
const pcap_if_t = koffi.struct('pcap_if_t', {
next: 'pcap_if_t *',
name: 'char *',
description: 'char *',
addresses: pcap_addr,
flags: 'uint',
});
const pcap_init = libpcap.func('int pcap_init(unsigned int opts, char *errbuf)');
const pcap_findalldevs = libpcap.func('int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf)');
//const pcap_freealldevs = libpcap.func('void pcap_freealldevs(pcap_if_t *alldevs)');
const errbuf = Buffer.alloc(2048);
let alldevsp = {};
const init = pcap_init(0, errbuf);
const find = pcap_findalldevs(koffi.as(alldevsp, 'pcap_if_t *'), errbuf);
console.log(`init: ${init}`);
console.log(`find: ${find}`);
console.log(`errbuf: ${errbuf.toString()}`);
console.log(alldevsp);
Premier truc que je vois, c'est que tu initialises alldevsp comme un objet vide.. Tu as besoin d'un pointeur vers un pointeur de pcap_if_t
Et ça donne quoi en code ?
Alors attend je me tord un peu la tête histoire de comprendre
Koffi fonctionne de manière similaire à ffi et tu peux juste pas passer par un objet vide. Tu dois créer un buffer qui peut agir comme un pointeur vers un pointeur
Et j'essaie de look pour le code
Enfaite, tu veux une référence vers une zone de la mémoire qui pourra stocker l'adresse de la structure pcap_if_t
Ouais c'est ce qu'il me semblais mais j'ai l'impression que koffi nous donne pas les outils pour lire cette zone
J'ai vu sur un forum de 2013 que certains utilisais la lib ref mais je pense qu'elle est déprécié
// Créer un pointeur vers un pointeur (pcap_if_t **)
const pcap_if_tPtrPtr = ref.refType(ref.refType(pcap_if_t));
// Allouer de la mémoire pour le pointeur vers le pointeur
let alldevsp = ref.alloc(pcap_if_tPtrPtr);
// La mémoire en 8 octets, tout dépend de l'architecture
let alldevsp = Buffer.alloc(8); // 8 pour du 64 bits
let alldevspBuffer = Buffer.alloc(8);
const find = pcap_findalldevs(koffi.ref(alldevspBuffer), errbuf);
tu dois créer un buffer qui peut agir comme un pointeur vers un pointeur.
Ensuite, lorsque tu passes alldevsp à la fonction pcap_findalldevs, tu passes réellement un buffer qui agit comme pcap_if_t **. Après l'appel de la fonction, ce buffer contient l'adresse de la structure pcap_if_t.
Tu dois passer ce buffer à pcap_findalldevs. Après l'appel de la fonction, alldevsp devrait contenir l'adresse mémoire de la structure pcap_if_t retournée par la fonction. Ensuite, tu pourrais utiliser les méthodes fournies par koffi pour accéder à cette structure et itérer sur la liste des interfaces.
Ce que chatgpt m'a dit car côté js jsp du tout
J'essaie de voir ce qui y'a
C'est vachement restreint
Et avec koffi tu pense que c'est pas possible de le faire directement ? parce que ref utilise gyp-node et j'ai pas envie de l'utiliser
Avec les buffer de njs pour le coup
yes ducoup je reviens sur un pb que j'ai, je reçois des données mais elle sont impossible a traiter + elle changent alors que ça doit être une valeur fixe de mes devices:
Données non interprétables pour le coup
Fin une mauvaise interprétation des données
Dans tous les cas, il y aura une mauvaise interprétation si tes pointeurs sont pas correctement utilisés
T'es sur de la taille de ton buffer?
Lorsque tu passes alldevsp à pcap_findalldevs, tu dois passer l'adresse du buffer, pas le buffer lui-même
Oui meme si je le met a 2000000 ça marche pas
Après pour le coup moi j'te dirais d'utiliser un .ref
Mouais ref je suis vraiment pas chaud, normalement koffi a prévu quelque chose pour ça mais j'ai pas encore trouver
le .as de koffi etait prometteur
koffi.as(alldevsp, 'pcap_if_t *')
C'est sensé le faire par rapport au message que j'ai mis
Mais faut s'assurer que c'est bien le cas
Ouais mais je vois toujours pas
C'est bon, j'ai enfin trouver !
Bonjour, je viens de commencer à apprendre à coder en JavaScript. Voici mon code, il doit servir à calculer l'IMC d'une personne.
Cependant, sur mon site quand je rentre des valeur dans mes input et que je click sur le bouton Calculer mon IMC il m'affiche toujours la même catégorie de poids. Pouvez vous m'aider à trouver l'erreur. je vous remercie.
@moi si vous avez trouvé
Voici le code
Pour l’instant la seule chose je vois c’est les var et functions 
@alpine bane l'expression 18.5<=IMC<25 est l'erreur
D'après toi pourquoi elle fonctionne pas
Je pense a cause du = ?
En gros, 18.5<=IMC<25 est évaluée en deux parties
Premièrement, 18.5<=IMC est évalué, ce qui peut être true ou false
Jusque la tu me suis ?
oui
Puis, parce que true est considéré comme 1 et false comme 0 en JavaScript, l'expression devient 1<25 ou 0<25
les deux donnant true, indépendamment de la valeur de IMC
ok c'est pour cela que cela mets a chaque fois corpulence normal
En gros, ça signifie que cette condition sera toujours vraie pour tout IMC supérieur à 18.5, et le code n'exécutera jamais les blocs de conditions suivants
Du coup, dit moi comment tu dois le modifier ton code ?
je pense en faisant plusieurs fonction qui s'active par rapport a la valeur de IMC ?
Non du tout même pas besoin
Fin celui à 25-30-35-40
Sont les erreurs
Mais si tu corriges celui à 25
Tu auras les erreurs sur la deuxième et ainsi de suite
on peut faire : 18.5<IMC , IMC<25 ?
oui ça j'ai compris
Tu y es presque mais tu dois utiliser un opérateur logique
à la place de la virgule
& ?
Presque
and ?
&&
ah
18.5 <= IMC && IMC < 25
En gros ça donne ça :
if (IMC < 18.5) {
Text = "Insuffisance pondérale";
} else if (IMC >= 18.5 && IMC < 25) {
Text = "Corpulence normale";
} else if (IMC >= 25 && IMC < 30) {
Text = "Surpoids";
} else if (IMC >= 30 && IMC < 35) {
Text = "Obésité modérée";
} else if (IMC >= 35 && IMC < 40) {
Text = "Obésité sévère";
} else {
Text = "Obésité morbide";
}
Pas de soucis, si ça a permis de te débloquer et de comprendre 🙂
oui j'ai compris et appris !
je te remercie
aurais tu des exercices ou des choses a rajouter a mon code ?
comme ça j'apprends d'autre chose et je m'entraine.
Pour le coup pas spécialement après, essaie de créer une validation des entrées, des conversions d'unités, des conseils de santé en fonction de la catégorie d'IMC
Des petites choses comme ça
C'est comme ça que tu apprendras
En faisant des petites choses et en créant plus de fonctionnalités même si inutile dans ton projet mais des trucs tout bête qui vont te permettre de te créer la logique, de retenir, etc...
ok juste c'est quoi "une validations des entrées" ? c'est si j'appuie sur entrée sa calcule directement l'IMC ?
ok je vais faire ça
Ajoutez une validation pour s'assurer que l'utilisateur entre des nombres valides pour le poids et la taille. Par exemple, vérifiez que les valeurs ne sont pas négatives et ne sont pas nulles
apres si tu as un autre projet je veux bien
ah ok
je vais essayer
je te remercie
Pas de soucis ! Hésite pas à poster tes questions, etc... J'y répondrais et les autres membres de ce discord y répondront aussi !
ok merci, je n'hésiterais pas !
J'ai des petites idée si tu veux
- calculatrice
- Todo
- Chronomètre
- Generateur de mot de passe
ok je pensais faire Calculatrice
ou un calculateur de moyenne
et c'est quoi un Todo ?
@floral bolt
todolist
ah ok cela peut être bien
fait un switch case
@alpine bane
The switch statement evaluates an expression, matching the expression's value against a series of case clauses, and executes statements after the first case clause with a matching value, until a break statement is encountered. The default clause of a switch statement will be jumped to if no case matches the expression's value.
Plutôt cette partie 👀
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/switch#an_alternative_to_if...else_chains
The switch statement evaluates an expression, matching the expression's value against a series of case clauses, and executes statements after the first case clause with a matching value, until a break statement is encountered. The default clause of a switch statement will be jumped to if no case matches the expression's value.
😵💫
ca manque d'un else if
Petit miss seulement x)
@alpine bane pour les conditions je te conseille de toujours rester a 2 , if et else, allez on peut pousser a 3 en rajoutant un else if mais ensuite stop
Si tu en as plus c'est que tu n'utilises pas ce qu'il faut, une condition comme son nom l'indique c'est
SI....
SINON...
si tu commences a rajouter des
SI...
SINON SI...
SINON SI....
SINON SI...
SINON
tu devrais t'orienter vers un switch et dans certains cas un Dict 👍
Ok je vais essayer
Ok je vais me renseigner la dessus
Merci pour vos conseils
Après c'est le genre de choses comme les scoops etc quand j'ai mis je vois des functions et var que tu vois après pour optimiser pour le coup
En débutant tu peux pas te permettre de t'éparpiller partout
Au moins qu'il comprenne son code quoi
Si il faut qu'il passe par la alors go et il verra plus tard avec l'expérience ^^
ce que j'ai dis c'est pas s'éparpiller partout, c'est juste le principe meme d'une condition 🤔 pas sur de comprendre ou tu veux en venir
Pour un débutant, il est crucial de commencer avec des concepts simples et de construire progressivement une compréhension des structures plus complexes. La simplicité aide à la compréhension et à la maintenance du code, ça deviendra naturel avec l'expérience après c'est ça que je veux dire
C'est déjà un très bon début pour commencer et il approfondira ces détails la plus tard
Hello, quelqu'un saurait m'expliquer comment je peux mettre mon site sur github sans que les clé d'API soient visibles ? J'ai testé plein de truc mais je me perd un peu. Thanks !
Avec le gitignore ?
Tu le met pas directement visible sur ton code tu mets dans un .env et hop
Pour répondre concrètement avec ce qu'a dit Vrizix :
Tu fais un .env
API_KEY="TON API KEY"
Tu fais un .env.example avec le même contenu mais sans les valeurs qui lui est accordé au push (pour que tu le c/c en .env en prod)
Dans ton code tu modifies les valeurs par process.env.VALEUR_DU_ENV donc pour l'api key : process.env.API_KEY
Et dans ton .gitignore
.env
Et voilà, tout est good
@oak turret oui c'est ce que j'ai fait mais je sais pas pourquoi ça ne veut pas, il ne reconnait pas "process" justement alors que j'ai bien fait npm i dotenv
il faut l'initialiser
require('dotenv').config()
require('dotenv').config();
ou
import dotenv from 'dotenv';
dotenv.config();
Mais le premier en général suffit largement
quand je fais la version avec le require, il ne reconnais pas require justement
je vais jeter un oeil à ça
si t'es en ES6
import 'dotenv/config'
import dotenv from 'dotenv';
dotenv.config();
pour es6
Ptn mais @oak turret arrête d'être plus rapide que moi stp 😢

j'ai vrmt l'impression d'avoir 2 de QI alors que c'est hyper simple, juste ça ne veut pas mdr
Comment ça
fait voir ton code
mdrr
Copieur 
qui est vraiment le copieur, je me le demande 

ouais alors dcp faut que je remodifie mes dernieres retouches
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.9.0/firebase-app.js";
import { getDatabase, ref, set, child } from "https://www.gstatic.com/firebasejs/10.9.0/firebase-database.js";
const firebaseConfig = {
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
};
const app = initializeApp(firebaseConfig);
const db = getDatabase(app);```
je sais plus comment on formatte en js sorry avec les couleurs
ton .env est bien à la racine et tout hein ?
Failed to resolve module specifier "dotenv/config". Relative references must start with either "/", "./", or "../".
alors que j'ai fait comme je disais "npm i dotenv" dans le dossier de mon projet quoi
parce que ça me mets bien le bon chemin pourtant
T'essaie de le run sur un navigateur ?
oui je fais live server
C'est pas compatible du coup ... Les navigateurs ne peuvent pas exécuter de tels modules directement et n'ont pas accès au système de fichiers de l'utilisateur pour des raisons de sécurité
je suis censé faire comment du coup ?
essaie de le node app.js
ça interprète ton script quoi voit ce que ça te met
NodeJS utilise CommonJS par défaut, donc c'est :
require("dotenv").config()```
là solution que j'avais trouvé c'est de mettre type="module" dans mon html mais dcp c'est pas possible de ce que tu me disais
Oui aussi x)
Sauf qu'il reconnait pas require
XD
Essaie de renommer ton app.js en app.mjs
et sinon oui, type="module" dans ton package.json
ça je le modifie comment en require ?
npm i firebase
import { initializeApp } from "firebase/app";
import { getDatabase } from "firebase/database";
Il me semble
Après c'est bien comme il est
met l'extension de ton fichier en .mjs
ok
ou alors comme j'ai mis " et sinon oui, type="module" dans ton package.json "
comment je le lance dcp mtn ?
j'en ai pas de package.json"
node app.mjs
ahhh
C'est normal ^^
l'importation de modules depuis une URL avec le schéma https:, ce qui n'est pas pris en charge par défaut dans Node.js
npm i firebase
import { getDatabase, ref, set, child } from "firebase/database";
comme ça ?
Non tu enlèves le lien
Il aime pas les liens 😉
tant que tu l'as npm i firebase
c'est bon
import dotenv from 'dotenv';
dotenv.config();
c'est dejà mieux mais nouvelle erreur dcp
je sais pas si tu auras la solution
alors que mon code est là
Toutes tes clés sont bonnes ? Tu es sûr ?
Fait voir tout le code
ton .env est sensé ressembler à ça dcp :
apiKey=ton_api_key
authDomain=ton_auth_domain
databaseURL=ta_database_url
projectId=id_de_ton_projet
storageBucket=ton_storage_bucket
messagingSenderId=ton_messaging_sender_id
appId=ton_app_id
measurementId=ton_measurement_id
oui oui il ressemble à ça
ah non mdrrr
bah voilà 😉
j'ai tt en MAJ
ouais ok c'est bon, j'ai juste un autre prblm
Vas-y
je fais des document.getElementById mais dcp j'ai l'erreur ReferenceError: document is not defined
genre :
import dotenv from 'dotenv';
dotenv.config();
import { initializeApp } from "firebase/app";
import { getDatabase, ref, set, child } from "firebase/database";
const firebaseConfig = {
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
};
const app = initializeApp(firebaseConfig);
const db = getDatabase(app);
document.getElementById("submitButton").addEventListener('click', function () {
event.preventDefault();
const date = new Date();
const currentDate = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
set(ref(db, 'users/' + document.getElementById('firstName').value + " " + document.getElementById('lastName').value + " " + document.getElementById('postalCode').value),
{
prenom: document.getElementById('firstName').value,
nom: document.getElementById('lastName').value,
email: document.getElementById('email').value,
quantity: document.getElementById('quantity').value,
postalCode: document.getElementById('postalCode').value,
dateEnvoi: currentDate
}).then(() => {
console.log("Données envoyées avec succès !");
// Masquer le formulaire et afficher la page de confirmation
document.getElementById('confirmationPage').classList.remove('hidden');
document.getElementById('formPage').style.display = 'none';
alert("Envoi réussi")
});
})
```
c'est normal, c'est un élément DOM seulement éxécutable sur un navigateur
Node.js ne peut pas le reconnaître
hmmm
Tu mélanges le côté serveur et côté client
dcp je bouge le listener dans mon script.js ?
yes c'est ce que je viens de me dire
et comment j'appelle mes values de l'autre côté dcp ?
Bah en gros tu sépares simplement les deux : server.js par exemple pour firebase et ton code avec les document etc dans un client.js par exemple que tu inclus dans ton HTML
donc oui ton idée de ton script.js fonctionne
donc dcp je vais avoir un scrpit.js, un server.js, et un client.js ?
ou je peux mettre scrpit et client juste dans le script.js ?
Nan mais genre tout ce qui est côté client de ton app.js tu l'enlèves et tu le mets dans ton script.js
ouais je comprends bien mais là je fais pas encore la diff entre quoi va de quel côté
dans ça dcp
document.getElementById("submitButton").addEventListener('click', function () {
event.preventDefault();
const date = new Date();
const currentDate = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
set(ref(db, 'users/' + document.getElementById('firstName').value + " " + document.getElementById('lastName').value + " " + document.getElementById('postalCode').value),
{
prenom: document.getElementById('firstName').value,
nom: document.getElementById('lastName').value,
email: document.getElementById('email').value,
quantity: document.getElementById('quantity').value,
postalCode: document.getElementById('postalCode').value,
dateEnvoi: currentDate
}).then(() => {
console.log("Données envoyées avec succès !");
// Masquer le formulaire et afficher la page de confirmation
document.getElementById('confirmationPage').classList.remove('hidden');
document.getElementById('formPage').style.display = 'none';
alert("Envoi réussi")
});
})
Tu enlèves ça tu le sépares
C'est côté client
ça :
import dotenv from 'dotenv';
dotenv.config();
import { initializeApp } from "firebase/app";
import { getDatabase, ref, set, child } from "firebase/database";
const firebaseConfig = {
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
};
const app = initializeApp(firebaseConfig);
const db = getDatabase(app);
C'est côté serveur et ne doit pas être exécuté dans le navigateur
ok ok et ça c'est bon du coup :
non tu dois pas mettre ton app.mjs
ça marche
il doit pas être exécuté sur ton html
oui je suis con tu viens de me le dire
du coup c'est ce que je me disais, le set n'est plus reconnu, sans doute prcq mon app.mjs n'est pas relié ?
tu dois mettre le CDN de firebase dans ton .html
cdn ?
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-database.js"></script>
c'est ça un CDN
ok je vais essayer de trouver le html de firebase
ah okk
Tu dois l'ajouter à ton index.html ou jsp comment tu l'as appelé
Ah bah biensur
okay
Toutes les initialisations comme ça c'est dans le <head>
ça ne veut tjrs pas
Tu dois mettre ton code d'initialisation de ton firebase dans ton script.js
const firebaseConfig = {
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
};
const app = initializeApp(firebaseConfig);
envoie ton script.js je te le fais ce sera plus simple
du coup c'est ce que tu m'a fais bouger tt à l'heure :
const db = getDatabase(app);
document.getElementById("submitButton").addEventListener('click', function () {
event.preventDefault();
const date = new Date();
const currentDate = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
set(ref(db, 'users/' + document.getElementById('firstName').value + " " + document.getElementById('lastName').value + " " + document.getElementById('postalCode').value),
{
prenom: document.getElementById('firstName').value,
nom: document.getElementById('lastName').value,
email: document.getElementById('email').value,
quantity: document.getElementById('quantity').value,
postalCode: document.getElementById('postalCode').value,
dateEnvoi: currentDate
}).then(() => {
console.log("Données envoyées avec succès !");
// Masquer le formulaire et afficher la page de confirmation
document.getElementById('confirmationPage').classList.remove('hidden');
document.getElementById('formPage').style.display = 'none';
alert("Envoi réussi")
});
})
fin y'a tt le reste qui gère mon html mais c'est pas censé affecté quoi que ce soit dans mon prblm
Je finis ma pause clope et je te le fais en rapide
t'inquiète pas ! c'est deja hyper gentil t'en fais pas
window.addEventListener('DOMContentLoaded', (event) => {
const firebaseConfig = {
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
};
// Initialisez Firebase
firebase.initializeApp(firebaseConfig);
const db = firebase.database();
document.getElementById("submitButton").addEventListener('click', function (event) {
event.preventDefault();
const date = new Date();
const currentDate = `${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}:${date.getSeconds().toString().padStart(2, '0')}`;
const firstName = document.getElementById('firstName').value;
const lastName = document.getElementById('lastName').value;
const postalCode = document.getElementById('postalCode').value;
const userRef = firebase.database().ref('users/' + firstName + " " + lastName + " " + postalCode);
userRef.set({
prenom: firstName,
nom: lastName,
email: document.getElementById('email').value,
quantity: document.getElementById('quantity').value,
postalCode: postalCode,
dateEnvoi: currentDate
}).then(() => {
console.log("Données envoyées avec succès !");
// Masquer le formulaire et afficher la page de confirmation
document.getElementById('confirmationPage').classList.remove('hidden');
document.getElementById('formPage').style.display = 'none';
alert("Envoi réussi");
}).catch((error) => {
console.error("Erreur lors de l'envoi des données : ", error);
alert("Échec de l'envoi");
});
});
});
Normalement, c'est sensé être good avec ça
tout les trucs comme ça "votre-apiKey" j'en fais quoi ?
apiKey: process.env.apiKey,
authDomain: process.env.authDomain,
databaseURL: process.env.databaseURL,
projectId: process.env.projectId,
storageBucket: process.env.storageBucket,
messagingSenderId: process.env.messagingSenderId,
appId: process.env.appId,
measurementId: process.env.measurementId
Je te l'ai modifié dans le code
Juste que je garde les explications que je fais de côté pour des sortes de cours
Et je trouvais intéressant ton cas xD
fin dcp ça c'est script.js ou app.mjs ?
dans le script.js mais c'est normal j'ai merdé att
okay
c'est des clés publiques ou privée ?
jsp c'est firebase qui me les donne pour mettre dans mon code
mais le but c'était de les cacher dcp
Je réfléchis comment on peut faire ça facilement
Tu utilises pas express ou de frameworks ?
Mais en soit en général on utilise les clés publiques pour les mettre côté client
Ils seront accessibles
ouais mais là ça craint si je mets les clés de ma base de données mdr
nope
Mais les clés firebase il me semble en soit qu'elles sont publiques
ah ouais ?
Yep
@oak turret j'te tag pour poser la question jsp si tu sais mais normalement les clés api firebase sont publiques ?
genre ma clé d'api et tout le reste peu importe si tt le monde les voit ???
Bah les publiques, oui
ouais, bah je sais pas quoi faire dcp
" Les clés API de Firebase sont conçues pour être publiquement visibles et utilisées dans le code client "
donc tout ça depuis le début j'ai pas besoin de les cacher ??? prcq pour moi n'importe qui peut ecrire dans ma bdd dcp
non de memoire c'est uniquement pour te faire reconnaitre
Si vous utilisez l'authentification Firebase par mot de passe et que quelqu'un met la main sur votre clé API, il ne pourra accéder à aucune base de données de votre projet Firebase ni aux données Cloud Storage tant que ces données sont protégées par les règles de sécurité Firebase . Ils pourraient cependant utiliser votre clé API pour accéder aux points de terminaison d'authentification de Firebase et effectuer des demandes d'authentification sur votre projet.
tu crains rien, mais faut toujours faire attention au reste
c'est quoi "le reste"
ce qu'il a ecrit en haut
cad ?
@hasty shoal
Pour éviter la possibilité qu'une personne utilise à mauvais escient une clé API pour tenter une attaque par force brute, vous pouvez resserrer le quota par défaut des points de terminaison identitytoolkit.googleapis.com pour refléter les attentes normales de trafic de votre application. Sachez que si vous resserrez ce quota et que votre application gagne soudainement des utilisateurs, vous risquez d'obtenir des erreurs de connexion jusqu'à ce que vous augmentiez le quota. Vous pouvez modifier les quotas d'API de votre projet dans la console Google Cloud
ouais ok docn ej peux revenir à mon code inital où je cherchais pas à cacher quoi que ce soit ?
En soit oui, après on rendu plus lisible ton code et tout c'est tjr bien ^^
ouais ça c'est une autre histoire que je sais pas régler mdrr
mais en gros avec le code que je t'ai passé, c'est fonctionnel et c'est une bonne manière ^^
Après en général au début de t'es projets hésite pas à npm init ^^
pour avoir ton package.json et tout
ouais mais là mon code c'est devenu un de ces bordel dcp
D'ou le but de faire attention dès le début à bien tout initialiser et ranger tes scripts, etc...
ouais ouais j'avais pas prévu ça c'est la première fois que je le fais
Bah encore " pire ", quand tu commences et que c'est la première fois faut y réfléchir
ça prend forcément plus de temps mais au moins c'est structuré
ok donc histoire que j'ai un modèle bien clean, je mets quoi dans le app.mjs ?
et dans mon script ?
..
il reconnait pas firebase dcp
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/9.0.0/firebase-database.js"></script>
<script src="client.js" type="module"></script>
dans ton index.html
C'est bon @hasty shoal ?
là j'ai juste remis comme j'avais fait avant de demander de l'aide, et ça marche mais j'arrive pas à bien séparer tout, fin là je vois un "client.js" dans ce que tu m'envoies ??
@noble mountain
Oui mais c'est script.js jsp j'ai mis client.js en parlant du côté client
a ce rythme fais le de ton coté 
xd
c'est pas prcq y'a du coté client et serveur au meme endroit ?
La bdd dans le client 
Je connais pas firebase, mais rassure moi, la connexion se fait pas dans le browser
ok bah jsuis perdu alors
nop
Côté serveur
ok autant pour moi x)
Ya pas besoin de demander a l'utilisateur pour pouvoir enregistrer tout ce qu'il tape sur son clavier sur le site dans le cas ou c'est stocker nul part autre que sur une variable qui s'efface a chaque chargement de la page non ?
Sachant que ya aucune page de connexion ou truc du genre
C'est juste pour cacher un easter egg
Légalement c'est bon ?
Tu peux checker certaines lettres
Après récupérer tout ce que la personne écris c’est pas ouf
Mais regarde les rgpd
oui y a pas de soucis
pas besoin de demander, c'est comme ca qu'on fait pour des easter egg genre Konami code etc
C’est pas du troll ?
Non, c'est juste une variable coté front ou tu stock les event de key et qui sera reset si tu refresh donc bon
tu demandes pas aux gens leurs autorisations pour faire des onClick
donc onKeyPress ca reste un event navigateur, il le stock temporairement (sur la session de la tab finalement) donc sans pression
(faut que j'arrete de troll sinon on me croit jamais enfaite merci du conseil snox
)
Ahah, les trucs des rgpd me perdent complètement
rgpd c'est surtout tout ce qui va etre tracking, analytics et ce que tu sauvegardes de ton coté
tu vois par exemple un site pour convertir un timestamp en vrai il a pas besoin de te demande l'autorisation de quoi que ce soit car tu as ecris dans l'input, car il a pas de raison de save quoi que ce soit (dans un cas super simple)
si la il se limite a le stock dans un tableau qui est reset, c'est good! (pour l'instant, on sait jamais ce que ca peut donner par la suite
)
Ok mrc
Mais ducoups pour l'ip ça serait pas pareil dans le fond ? Si c'est stocké en local et reset a chaque chargement
ça je peux pas te le confirmer, comme c'est de la data du user, bonne question
je dirai non a premiere vue, mais renseigne toi pour etre sur
Top thx
L'un de met but premier concrètement ct de compter le nombre de personnes différentes a avoir cliqué sur x bouton sur mon site et pour ça je voulait juste get l'ip et envoyé +1 dans ma bdd , et mettre leurs ip dans leurs local storage du navigateur, comme ça si elle y est déjà ça envoie pas +1
Je pendais procéder ainsi car ça me paraissait assez simple
Mais jviens de me rendre compte que j'en avais pas besoin enft peut-être
Bonsoir alors je cherche a faire une commande pour mon bot discord en JS qui consiste a faire !addrole role et que sa ajoute instantanément le role a la personne qui a écris le message j'ai une première version mais la le role est déja écris dans le code
@queen ocean toi tu as l'air chaud en dev discord ^^
Faut ajouter un argument !addrole @keen narwhal @role
Ton role name va etre = à message.member[2] dcp pas loin de sa
J'ai jamais touché à djs mais sa doit pas etre loin de la vérité
Donc je fais quoi la ? xD Je débute en JS j'ai pas trop compris
Tu veux que je fasse un argument !addrole ?
Ben en gros ta commande c est si je veux te rajouter un role
!addrole @keen narwhal @role
Ya deux arguments dans la commande, ton pseudo et le role
Non enfaite je veux que la personne qui écrivent !addrole lenomrole l'ai directmeent pas besoin de mention n'y rien
Le deuxième argument tu le stockes dans ta variable roleName
Ah c est pas une cmd pour modo
Oui
Ben dcp ya juste besoin de ma mention du rôle
Ce serait le meme principe que un reaction role
Jsp comment sa marche sans mention le rôle mais sa doit etre sensible à la casse donc jsp
Tu peux essayet
je veux juste trouver un moyen de remplacer sa
const roleName = 'role';
const roleToAdd = message.guild.roles.cache.find(role => role.name === roleName);
par le truc ecris
Ben ça va etre ton roleName c est tout
Const roleName = message.member[1]
Jsp comment on récupère un argument sur djs
Bah jsp pas non plus je débute en JS et en plus sur le dev discord ahah ^^
const roleName = args[0] à l epoque je crois
Alors j'ai fais la modif dcp et quand je fais la commande sans le nom du role sa me met bien un message Le rôle spécifié n'existe pas. mais si je met le role rien ne se passe
// Vérifier si la commande est 'addrole'
if (command === 'addrole') {
// Vérifier si l'utilisateur a mentionné un rôle
if (!args.length) {
return message.reply('Tu dois spécifier le nom du rôle à ajouter !');
}
// Récupérer le nom du rôle à ajouter (en supprimant le préfixe '!')
const roleName = args[0];
// Récupérer le rôle depuis le serveur
const role = message.guild.roles.cache.find(role => role.name === roleName);
// Vérifier si le rôle existe
if (!role) {
return message.reply('Ce rôle n\'existe pas sur ce serveur !');
}
// Ajouter le rôle à l'utilisateur qui a envoyé la commande
message.member.roles.add(role)
.then(() => {
message.reply(`Le rôle "${roleName}" a été ajouté avec succès !`);
})
.catch(error => {
console.error('Une erreur s\'est produite lors de l\'ajout du rôle :', error);
message.reply('Une erreur s\'est produite lors de l\'ajout du rôle.');
});
}
});
Sa doit etre un truc du style
@keen narwhal
Alors ok mais comment je modifie mopn code actuel avec sa ducoup xD
Déso je suis vraiment débutant la dedans dmr
Edit v edt tout
Ton roleName tu mets args[0]
( c est ptet 1)
Et essaie sa déjà
Erreur dans le code ?
Apres jai pas touché à du djs depuis la V12 mtn on fait ptet plus comme ça
Dans ton terminal ya rien ?
clc le bot mdrr
non il y avait rien
Là hange juste ligne 10
= args[0]
Et fais en dessous console.log(roleName)
Normalement t auras un log
Je veux savoir c est quoi
Ptn si on m'avait dit j allais aider qqun à 23h20 sur du djs 🤣
non j'ai mis le console log mais il y a rien justement mdr
Remet ton clde d avant
Le tout debut
Lui
Et tu changes ce que je t ai dit
Oublies le mien
att je suis con
j'avais pas changer mon nom de commande dans le main js
ducoup sa me fais bien une erreur
Montre
Alors c'est bizarre sa me fais pas d'erreur quand je fais !addrole le nomdurole mais parcontre quand je fais juste !addrole sa me fais un ererreur
Quoi ?
Sa marche même plus quand je le démarre mdr
Montre
Ah non c'est bon j'avais pas delet un }
non toujours rien la ligne 9 on est d'accord c'est bien
if (command === 'addrole') {
Ahahah ^^
Oui
Erreur
?
pareil rien quand je fais !addrole lenomrole par contre si je fais juste !addrole
Bon
Je vais te le redire
Pour la 6e fois
Tu reprends ton code de base
Et à la place de const roleName = 'role'
Tu mets const roleName = args[0]
Et en dessous console.log(roleName)
oki
Et bah rien non plus j'ai repris mon code de base et juste modifié ce que tu ma dit et rien quand je fais !addrole monrole
😕
Donc franchement je sais pas
Si tu veux faire ta commande en mentionnant le role dedans genre !addrole @membre alors tu remplaces :
const roleName = 'role'
const roleToAdd = message.guild.roles.cache.find(role => role.name === roleName);
Et a la place tu mets :
const roleToAdd = message.mentions.roles.first()
@queen oceanMerci de ta réponse je l'ai fais et non rien je ne se passe
même pas un message d'erreur
🤔
ajoute un console.log(roleToAdd)
zut trompé xd
ha bah c'est pour ca
quoi
Change ta condition
if (message.content === "!addrole")
Et a la place tu met
if (message.content.startsWith("!addrole")
Après tu devrais te renseigner pour faire un command handler plus propre, mais bon pas grave tu regarderas ca plus tard
@keen narwhal
mais j'ai une erreur
laquelle ?
ha bah ca c'est ta gestion des commandes justement
ta suivit un tuto de base ?
Oui
lequel ?
J'ai fais jusqu'au handler de commande
Mais pourquoi ma toute première commande ou je mettez le role dans le code marcher et celui la non ?
Recommence les vidéos, ta du mal copier quelque chose
Ah ouais ? Pourtant comme je te le disais certaine de mes commandes marcher
Bizarre
renvoie ton fichier de la commande 🤔
j'ai re regarder tout le code de la vidéo tout est bon normalement
@queen ocean je déco si tu trouve dit le moi ^^
en tout cas merci
Salut, je viens de recommencer le JS (ça fait +de 4 ans donc autant vous dire que j'ai tout oublié), donc je recommence tout et j'ai du mal sur certaines notions. quelqu'un de qualifié peut-il me donner un coup de pouce ? 🥹
@queen ocean Bonjour, aurais tu trouvez une solution ?
J'ai chercher des solution et je crois juste que le bot ne capte pas le rôle enfaîte
Non j'ai pas regardé, envoie un zip ou un git du dossier et je regarde ce soir si j'ai le temps
Ok je te ferais sa ! Merci en tout cas de prendre de ton temps pour m'aider ahah 
@queen ocean Ducoup j'ai recommencer de zero le bot donc j'ai le fichier main.js le loadCommand.js et le addrole.js
main.js
loadCommand.js
La je pense que les bases sont propres enfin je crois , donc la ducoup je crée un addrole.js dans le dossier commands et utils
C’est quoi ton soucis enfaite ?
que commands non ?
je t'aurai conseillé de prendre une base de bot déjà existante
mais surtout d'apprendre JS
Oui c'est prévu sa ^^
et pourquoi pas à lire une doc
ben tu aurais du prévoir avant de commencer...
C'est comme si jte faisais lire un roman alors que je t'ai pas appris à lire
Oui enfin je voulais pas apprendre tout un langage juste pour faire deux trois commandes a la con sur un truc discord
Tu as une base de bot ou pas ducoup ?
ben t'as appris à lire pour lire 2-3 livres à la con en français 😂
github
xDD
pour faire ça github
et copies colle
mais crée pas sa sert à rien
ou BDFD
ou tu invites un bot déjà existant
@buoyant compass Alors ducoup j'ai repris mon ancien bot d'hier j'ai tester la commande et sa marche
...
Je ne sais pas comment
mais sa marche mdrr
ben je savais que mon truc marchait
sa fait longtemps j'ai pas fait de djs mais qd meme
ben oui
Maintenant @keen narwhal
=> https://developer.mozilla.org/fr/docs/Web/JavaScript
JavaScript (souvent abrégé en « JS ») est un langage de script léger, orienté objet, principalement connu comme le langage de script des pages web. Mais il est aussi utilisé dans de nombreux environnements extérieurs aux navigateurs web tels que Node.js, Apache CouchDB voire Adobe Acrobat. Le code JavaScript est interprété ou compilé à la volée ...
Oui ^^
En tout cas merci de votre aide à vous deux
de rien
C'est quoi le mmieux apprendre en vidéo ou des sites ?
Bonjour!
J'ai un problème avec mon bot je crois 
J'aimerais que quand dans le menu choose_language, quand je choisit exit_lang, ça nous rammène à choose config, comment puis-je faire ?
Mon code :
const { ActionRowBuilder, StringSelectMenuBuilder, StringSelectMenuOptionBuilder, SlashCommandBuilder, EmbedBuilder } = require('discord.js');
module.exports = {
data: new SlashCommandBuilder()
.setName('configure')
.setDescription(`Configure the bot to have a nice use!`),
async execute(interaction) {
const select_language = new StringSelectMenuBuilder()
.setCustomId('choose_language')
.setPlaceholder('Choose A Language!')
.addOptions(
new StringSelectMenuOptionBuilder()
.setLabel('Français')
.setDescription('Changer la langue du bot en français.')
.setEmoji('🇫🇷')
.setValue('french_lang'),
new StringSelectMenuOptionBuilder()
.setLabel('English')
.setDescription('Change the bot language to english.')
.setEmoji('🇺🇸')
.setValue('english_lang'),
new StringSelectMenuOptionBuilder()
.setLabel('Exit')
.setDescription('Return to the config menu.')
.setEmoji('◀️')
.setValue('exit_lang'),
);
const select_config = new StringSelectMenuBuilder()
.setCustomId('choose_config')
.setPlaceholder('Choose A Configuration Option')
.addOptions(
new StringSelectMenuOptionBuilder()
.setLabel('🏳️ - Languages Settings')
.setDescription('Language Configuration')
.setValue('config_flag')
);
const row_lang = new ActionRowBuilder()
.addComponents(select_language);
const row_config = new ActionRowBuilder()
.addComponents(select_config);
const configEmbed = new EmbedBuilder()
.setColor("#00FF00")
.setTitle("Configuration Panel")
.setDescription(" ⚙️ - What do you want to configure?");
const langEmbed = new EmbedBuilder()
.setColor("#00FF00")
.setTitle("🏳️ - Language Settings");
await interaction.reply({ embeds: [configEmbed], components: [row_config], ephemeral: true });
const filter = (interaction) => interaction.customId === 'choose_config';
const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });
collector.on('collect', async (interaction) => {
if (interaction.values[0] === 'config_flag') {
await interaction.update({ embeds: [langEmbed], components: [row_lang] });
} else if (interaction.values[0] === 'exit_lang') {
await interaction.update({ embeds: [configEmbed], components: [row_config] })
.catch(console.error);
}
});
}
}
(j'ai pas mis de comments sur cette comande déso
)
Hello
J'ai un problème avec ErrorBoundary en react, dans mon code j'ai volontairement mis une variable qui n'existe pas dans un children de l'error boundary , mais le fallback ne s'affiche pas ..
import { ErrorBoundary } from "./components/ErrorBoundary"
function App() {
return <div>
<ErrorBoundary fallback={<p>Je suis une erreur</p>}>
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quo, consequuntur iure! Perferendis optio at voluptatem cum vitae nesciunt repudiandae neque, exercitationem nostrum maiores temporibus, eveniet explicabo sequi obcaecati beatae repellat.
<button>{login}</button>
</ErrorBoundary>
</div>
}
export default App
en l'occurence le "je suis une erreur" ne s'affiche pas
merci d'avance
ouais? ils ont quoi
Ah merde j'avais mal compris mdrr
Je pensais que tu voulais pas que ça te ramène à select_config
ok ok