#javascript-typescript

1 messages · Page 56 of 1

cyan iron
slim anvil
#

« L’erreur évent » c’est un try catch quoi

cyan iron
#

Oui

slim anvil
#

c’est pas dinguo

cyan iron
#

Non

#

J'ai pas dit erreur event

#

J'ai juste eu la flemme de mettre les virgules 😂

odd ether
#

Bah moi, mes bots, c'est l'optimisation en V11 et après, je le passe en v12 ...

cyan iron
#

En gros y'a les erreurs, les event

#

Bah moi, mes bots, c'est l'optimisation en V11 et après, je le passe en v12 ...
@odd ether Aïe bonne chance

odd ether
#

Le ready

cyan iron
#

Je peux test ton bot?

odd ether
#

Sur tels, sa va être chaud de te le passer 😅

#

Quand je rentre, je te le fait rest

cyan iron
#

Ah ok

#

Il est pas hébergé?

odd ether
#

Pas encore

cyan iron
#

Ah bah non du coup 😂

odd ether
#

Et je prie pour que il marche dès qu'il est Online

cyan iron
#

Tu va host chez WH?

#

Moi oui

odd ether
#

Bah oui, même sur un dédier x)

cyan iron
#

😂

odd ether
#

90 GB de RAM seulement pour lui x)

cyan iron
#

En plus on l'a gratos yeah

odd ether
#

Yep

cyan iron
#

Vu qu'on est des BG

#

😂

odd ether
#

#mrcdavid

cyan iron
#

#j'avoue

odd ether
#

Les modos, il taff aussi mdr

cyan iron
#

J'avoue

#

Mais là on se les touche un peu quand même

#

Y'a plus personne qui fait de conneries 😂

#

On devrait parler dans #general plutôt

#

( Déso le staff)

odd ether
#

Quand il m'a dit "tout va être entièrement gratuit à vie", dans ma tête, c'était ça :
yeah yeah yeah yeah yeah

#

Ouaip

cyan iron
peak cedar
#

@cyan iron pas 600€ 😉

#

😂

cyan iron
#

800 alors

peak cedar
#

euxx mdrr nan serieux cb ?

slim anvil
#

@cyan iron tu as tjrs ton soucis pour le lineNumber ?

#
cyan iron
#

@cyan iron tu as tjrs ton soucis pour le lineNumber ?
@slim anvil Oui

#

Ah merci

#

J'ai pas pu tester encore

#

Je travaille là

slim anvil
#

Bah ça sert à rien de tester du coup

cyan iron
#

Je fait le castrage de maïs suefort

#

Ah

#

Att je regarde

slim anvil
#

Marqué sur la doc, pas compatible avec nodejs

#

Après tu peux essayer autrement du coup, mais tu auras pas accès a la clé fileName ni lineNumber

cyan iron
#

Oui je viens de voir

#

Comment je peux faire suefort

#

Je vais être obligé d'afficher toute l'erreur je crois 😭

slim anvil
#

log ton err.stack

cyan iron
#

Oui justement c'est ce que j'ai fait

#

Mais c'est trop le bordel

#

Je voudrais avoir un truc propre ma8s apparement 😩

slim anvil
#

Sinon tu uses un linter

#

il va te les renvoyer les erreurs lui de Syntaxe

cyan iron
#

En fait je veux juste que ça m'envoie les détails en MP

#

Sauf que là avec le truc dégueulasse de discord

#

Le but en fait c'est de Flood le moins possible la console

slim anvil
#

Yes bah là comme ça tu vas galerer pour pas grand chose je pense, sinon tu cut au pire des cas, généralement l'erreur va etre au début

cyan iron
#

Oui

slim anvil
#

prend que le premier "at"

cyan iron
#

Comment je peux faire ça

#

.at? thinkingplayer

slim anvil
#

No, quand je dis "at" c'est que il commence par ça, mais si c'estpas le cas tu seras bloqué

#

Pas trop d'idée de la meilleur façon de faire, moi je laisserai tout et au pire je cuterai a x nbres de caractères

cyan iron
#

Ouais pas bête

#

Mais ça peut causer des problèmessuefort

#

Je verrais tout à l'heure

#

Quand je serais devant mon PC

oak turret
#

ah ouais mais cut chaud, si l’erreur est beaucoup plus longue qu’un simple is not defined

cyan iron
#

Oui

#

Enfin non

#

Elle peut pas être plus longue

#

Ça met juste la ligne et le fichier en plus quoi

oak turret
#

non mais plus longue en terme de caractères

cyan iron
#

Oui voilà

#

Mais ça EZ

oak turret
#

ui

cyan iron
#

on fait juste err.stzck et on enleve err au début

#

Ça laisse que à partir du premier at

oak turret
#

ui aussi

slim anvil
#

tu peux split ta string au "at" et tu prends le premier élément

#

en partant du principe que ça retourne tjrs at

cyan iron
#

Oui

#

Aaaaa Ah

#

J'ai une idée

#

On cut au at suivant

#

¯\_(ツ)_/¯

slim anvil
#

oui c'est ce que je viens de dire

#

tu split au at ca te return un tableau tu affiches l'index 0

cyan iron
#

À Oui ok j'avais mal compris 😂

#

Oui voilà

#

Merci ^^

slim anvil
#

à voir si ca fonctionne good tu nous diras

cyan iron
#

Yep 🙂

#

Déjà j'ai opti le reste

#

Je me suis rendu compte qu'il y avait pas tout le temps un path et un code 😂

#

Donc ça faisait crash

#

Là ça test si y'a un path ça le met sinon ça le met pas

slim anvil
#

yes ça dépend + du type de l'erreur

#

si tu manges une 403 tu auras pas de code ou quoi c'est juste forbidden

#

généralement ca va + etre du 500 internal server error

cyan iron
#

:/ du coup c'etait foireux

#

Oui

#

J'ai fait erreurs d'api

#

Et erreur de code direct avec un try catch dans chaque fichier

#

Et là normalement mon bot crash plus jamais

#

normalement kappa

cyan iron
#

@slim anvil J'ai un petit problème j'arrive pas à trouver la longueur de err :/

#
let only_at = err.stack.slice(err.parse().length)
#

J'ai tenté ça

#

Même sans le parse

#

TypeError: err.parse is not a function

oak turret
#

.parse c'est pour du json

slim anvil
#

non tu dois JSON.parse(err) par exemple

cyan iron
#

j'ai réussi au final

#

J'ai fait avec toString

#

par contre j'arrive pas à isoler le premier at

slim anvil
#

Regarde si un élément dans ta string se répète, et tu split a cas, comme ça ça va te créer un tableau de « sommaire »

#

Ou tu peux cut à chaque nouvelle ligne aussi

cyan iron
#

comment je fait ça

#

Ah on peut cut à chaque nouvelle ligne

#

je vais faire ça plutôt

slim anvil
#

Oui le \n

#

I think

cyan iron
#

je fait comment 🤔

#

pour cut

slim anvil
#

split

#

ou splice me trompe toujours entre les 2

cyan iron
#

split ça transforme en tableau

#

aaaah

slim anvil
#

Yes

cyan iron
#

ah non

#

x)

#

je comprends pas comment je pourrais faire avec splice

#

ah je sais

#

J'ai réussi onset_dab

#
let only_at = err.stack.slice(err.toString().length)
let only_at_arr = only_at.split(" ")
let first_at = only_at_arr.indexOf('at')
let second_at = only_at_arr.indexOf('at', (first_at + 1))
only_at = only_at_arr.slice(first_at, second_at).join(" ").trim()

console.log("Only at stack : " + only_at)
#

J'ai fait comme ceci x)

#

J'ai fait mieux

#

J'ai carrément isolé les parenthèses

#
let only_at = err.stack.slice(err.toString().length)
let only_at_arr = only_at.split(" ")
let first_at = only_at_arr.indexOf('at')
let second_at = only_at_arr.indexOf('at', (first_at + 1))
only_at = only_at_arr.slice(first_at, second_at).join("").trim()
only_at_arr = only_at.split("")
let s_first_at = only_at_arr.indexOf('(') + 1
let s_second_at = only_at_arr.indexOf(')')
only_at = only_at_arr.slice(s_first_at, s_second_at).join("").trim()

( Si y'a moyen d'opti mieux que ça je veux bien x) )

slim anvil
#

Bizarre split direct a « at »

#

Et pas à vide

cyan iron
#

comment ça

#

aaah oui pas con

#
let only_at = err.stack.slice(err.toString().length)
let only_at_arr = only_at.split("at")[1].split("")
let s_first_at = only_at_arr.indexOf('(') + 1
let s_second_at = only_at_arr.indexOf(')')
only_at = only_at_arr.slice(s_first_at, s_second_at).join("").trim()
#

👌

#

Merci pour ton aide :)

oak turret
#

Quelqu'un a déjà use gamedig ?

queen ocean
#

@sand shore l'a utilisé il me semble @oak turret

oak turret
#

Okay, car euh pour gmod ça me semble kc, il me prends pas mon port ni mon host xd

slim anvil
#

Sorry je suis sur le tel donc je t’aide comme je peux wailrone

cyan iron
#

T'inquiètes tu m'as bien aidé là :)

#

Merci je suis trop content

slim anvil
#

Tu peux encore réduire d’ailleurs mais c’est déjà bien comme ça

cyan iron
#

Oui je pense

#

Je vais réfléchir à comment réduire

#

Mdr je crois que j'ai réussi à le réduire à une seule ligne 😂

#

PTDR OUI

#
let only_at = err.stack.slice(err.toString().length).split("at")[1].split("(")[1].split(")")[0].trim()
sand shore
#

@oak turret pour ma part ça marche nickel

#

Essaye sur un autre serveur genre un serveur connu pour voir si ça viens pas de ton serveur

slim anvil
#

Compliqué de lire sur tel mais @cyan iron y a pas mal de truc je pense que c’est pas utile, t’as beau le faire en 1 ligne tu appelles bcp de truc quand même

cyan iron
#

oui mais franchement c'est opti

#

Enfin

#

je pense

#

En fait je veux vraiment récupérer que le lien c'est mieux :)

#

Après si tu sais comment faire mieux je suis prenneur ( à mon avis tu vas trouver 😂 )

slim anvil
#

Je peux check demain matin si tu veux pas d’ordi ce soir juste du chill 😴

cyan iron
#

ok :)

slim anvil
#

Envoie moi en mp un exemple d’erreur que tu reçois

#

Please

#

Dans un pastebin

cyan iron
#

ok

hybrid berry
#

@cyan iron j'ai un soucis avec ton code ici

cyan iron
#

oui att

#

J'ai modifié

#

tu as copié collé bêtement

#

pas le but du truc :/

hybrid berry
#

je teste juste 🙂

cyan iron
#

mouais

#

ok

west plover
#

tu as copié collé bêtement
pas le but du truc :/
après j'ai envie de dire, t'expliques pas grand chose dans ton tuto, c à la limite plus un gist github qu'autre chose 🤔

cyan iron
#

effectivement

#

mais je demande aux gens d'essayer de comprendre à la fin :)

oak turret
#

@sand shore tu peux montrer ton query stp

#

et je test sur les serveurs sur top serveurs

#

pas mon serveur ahah

oak turret
#

Attends mais @idle ice (désolé du ping), comment t'as intégré ta boucle pour show les noms des joueurs dans ton embed ?

idle ice
#

bouge pas j'te montre

oak turret
#

waw tu t'es fais chié

#

c'est quoi ton "players" et ton "embed"

idle ice
#

players c'est ce que tu récup avec gamedig

#

et mon embed, bah c'mon embed x)

oak turret
#

non mais players = state.players.length ? genre tu check si il est "valide" fin ?

idle ice
#

players = state.players

#

Juste j'le fais passer dans une fonction pour que ce soit plus simple

cyan iron
#

Salut, j'utilise ceci pour détecter les erreurs d'API :

process.on('unhandledRejection', error => {

    console.error('✅ Erreur d\'API détéctée : ' + error.stack);
    let precisions = "``\nNom : " + error.name + "\nMessage : " + error.message
    if (error.path) precisions = precisions + "\nPath : " + error.path
    if (error.code) precisions = precisions + "\nCode d'erreur : " + error.code
    if (error.method) precisions = precisions + "\nMéthode : " + error.method

    const api_error_embed = new Discord.MessageEmbed()
        .setColor("#2f3136")
        .setDescription(":small_red_triangle: **Il y a eu une erreur d'API sur le bot :**\n``js\n" + error + "``")
        .addField(":small_red_triangle: Précisions :", precisions + "``")

    client.users.cache.get("393378313663676427").send(api_error_embed)
    
});

Seul problème, j'aimerais récupérer le message d'origine qui a causé l'erreur ou alors le channel depuis lequel l'erreur a été causée

#

savez vous comment faire ?

#

Ps: quand il y a 2 `` il y en a en réalité 3 c'est juste pour éviter de faire bug

slim anvil
#

Quand tu dis erreur d’api tu parles de celle de discord ? Pas que mais aussi sûrement ?

cyan iron
#

oui

#

Que celles de discord

#

par exemple ceci

slim anvil
#

mais si du coup tu as une erreur car leur api est down ou autre ce qui arrive parfois

#

Comment t’envoie l’embed

cyan iron
#

😂

#

Non mais je parle des erreurs qui viennent de mon code

#

Par exemple cannot send O this user

#

Ou autre

slim anvil
#

Ahhh bah du coup c’est pas des erreurs d’API 🤔

cyan iron
#

Bah ça s'appelle comme ça

#

¯\_(ツ)_/¯

#

Oui c'est bizarre mais c'est le nom

#

Ou ça par exemple

slim anvil
#

Oui la première c’est une erreur API de discord

#

Par contre le genre d’erreur que tu as après c’est genre .avatarURL c’est juste que tu vérifies jamais tes variables etc

#

C’est pas censé arriver ce genre d’erreur

cyan iron
#

oui pas faux

#

Là c'était volontaire pour faire un exemple

#

Mais je prévois toujours le " au cas ou "

indigo willow
#

Bonjour j'aimerais utiliser fs pour ecrire des données dans un fichier json mais je n'arrive pas a faire que ca écrive quelqu'un pourrait m'expliquer comment fonctionne fs ?

red snow
#

Ezt ce que tu write a la fin?

idle ice
#

Yo les petits gens, quelqu'un saurait-il m'aider sur les Collectors de Discord, car j'coince pas mal la dessus

#
const filter = m => ((m.author.id === message.author.id) && m.startsWith("<#") && m.endsWith(">"))
collector = message.channel.createMessageCollector(filter, {time: 15000})                        

collector.on("collect", m => {
  console.log(m)
})

collector.on("end", collected => {
  console.log(collected)
})
#

Mon erreur: m.startsWith is not a function

#

Comment puis-je vérifier dans mon collecteur que je récupère bien un canal

#

Si ce n'est via ça

timid loom
#

m.startsWith ne fonctionne pas parce que l'objet Message ne possède pas de fonction startsWith
Si tu voulais vérifier que le contenu commence par un certain texte, tu peux utiliser m.content.startsWith(). Une méthode plus simple pour faire ce que tu recherche serait cependant de vérifier les mentions du Message : https://discord.js.org/#/docs/main/stable/class/Message?scrollTo=mentions
L'objet MessageMentions contient les mentions réalisées par le message, ce qui inclus non seulement les membres, mais les rôles et channels. Ainsi, pour réaliser ce que tu recherche (à savoir vérifier que le message mentionne un channel), tu devrais faire m.mentions.channels.size > 0.

idle ice
#

Super merci Taink! 😄

cyan iron
#

Salut à tous 👋 ,
J'ai un système de mute qui fonctionne avec les timestamp, seul problème c'est pas optimisé car le bot actualisé les mutés à chaque message et toute les minutes un message est envoyé dans un channel

#

Voici le code

#
   db.query(`SELECT * FROM mutes_list`, (err, muterows) => {
            if (!muterows) return
            if (muterows.length < 1) return
            for (let pas = 0; pas < muterows.length; pas++) {
                let get_stamp = muterows[pas].time_stamp
                let mute_time = muterows[pas].ms
                let restant = message.createdTimestamp - get_stamp
                if (restant >= mute_time) {
                    let muted_guild = client.guilds.cache.get(muterows[pas].guild_id)
                    let role_mute = "730422624827605033"
                    let get_role = muted_guild.roles.cache.get(role_mute)
                    if (!get_role) return
                    db.query(`DELETE FROM mutes_list WHERE user_id = '${muterows[pas].user_id}' AND guild_id = '${muterows[pas].guild_id}'`)
                    let to_unmute = muted_guild.members.cache.get(muterows[pas].user_id)
                    if (to_unmute) to_unmute.roles.remove(role_mute)
                }

            }
        })

        db.query(`SELECT * FROM bans_list`, (err, muterows) => {
            if (!muterows) return
            if (muterows.length < 1) return
            for (let pas = 0; pas < muterows.length; pas++) {
                let get_stamp = muterows[pas].time_stamp
                let mute_time = muterows[pas].ms
                let restant = message.createdTimestamp - get_stamp
                if (restant >= mute_time) {

                    let muted_guild = client.guilds.cache.get(muterows[pas].guild_id)
                    db.query(`DELETE FROM bans_list WHERE user_id = '${muterows[pas].user_id}' AND guild_id = '${muterows[pas].guild_id}'`)

                    muted_guild.members.unban(muterows[pas].user_id)

                }

            }
        })
#

Dans mon message.js

#
setInterval(function(){ client.channels.cache.get("735226147217997844").send("**:oui: Les mutes ont été rechargés !**"); }, 60000);

dans mon Index.js

cyan iron
#

Du coup j'ai pas précisé ça me paraissait logique 🤣
Mais comment je peux améliorer ça du coup

timid loom
#

J'ai pas tout à fait compris le principe du système... J'ai pas vraiment lu le code mais tu peux expliquer le principe de fonctionnement ?
Je... devine que c'est un système qui empêche les gens de parler jusqu'à un certain timestamp ?
Je ne comprends pas ce que toi tu as fait cependant...

cyan iron
#

En gros,

1️⃣ Au moment du mute, j'envoie une ligne dans la base de données qui contient les informations du mute : guild id, user id, timestamp et temps de mute en ms.

2️⃣ Ensuite, je vérifie avec le code si dessus à chaque message envoyé si la différence entre le timestamp du message est supérieure ou inférieure à celui inscrit dans la base de données. ( Ce qui veut dire si la personne est encore mute ou non )

3️⃣ Dans ce code, je supprime le rôle mute.

⚠️ Le problème : Ca spam dans un channel " Mute rechargés " pour pouvoir répéter l'action dans message.js car il me faut un timestamp obligatoirement

#

Le système est foireux, j'ai simplement besoin d'avoir votre avis sur comment l'améliorer / faire mieux :)

cyan iron
#

Ce vent international

slim anvil
#

Mais pourquoi tu spam un message embed ?

#

Tu vérifies a chaque message envoyé ? ou à chaque msg envoyé d'une personne mute ?

#

car ça change tout déjà

cyan iron
#

A chaque message envoyé

#

Oui c'est totalement foireux

slim anvil
#

Quand tu mutes quelqu'un tu lui ajoutes un rôle ?

#

tu devrais lors d'un mute ajouté le rote "muted" ou meme un role invisible et a chaque envoie de message, déjà tu vérifies si le mec est muted juste via son role

#

ca va grandement réduire le nombre de requête

cyan iron
#

Quand tu mutes quelqu'un tu lui ajoutes un rôle ?
Oui

#

tu devrais lors d'un mute ajouté le rote "muted" ou meme un role invisible et a chaque envoie de message, déjà tu vérifies si le mec est muted juste via son role
C'est justement ce que ça fait

slim anvil
#

Ensuite aucune utilité d'envoyé un msg "Les mutes ont été rechardés" tu vas juste spam un truc pas utile

cyan iron
#

Mais j'envoie un message toutes les minutes avec mon bot pour que les mutes soit rechargés

slim anvil
#

a la limite juste envoyé 'Vient de se faire mute" "A été démute"

cyan iron
#

Oui mais si personne n'écrit pendant 3 ans

slim anvil
#

AH

cyan iron
#

Le mec est mute 3 ans

#

😢

slim anvil
#

Tu peux sinon lui laisser la possibilité d'écrire, et si il doit etre encore mute tu delete son message, si c'est ok tu removes le role

cyan iron
#

non mais en fait c'est pour un bot multifonction du coup ça va être le bordel

#

JE vais tout refaire

slim anvil
#

Ou alors tu run un script toutes les heures qui va vérifier tout les champs de ta base et unemute ceux qui doivent l'être

#

ou toutes les 10 minutes au pire

#

Mais pas une bonne idée de tout de faire parler ton bot pour vérifier

cyan iron
#

Ou alors tu run un script toutes les heures qui va vérifier tout les champs de ta base et unemute ceux qui doivent l'être
C'est ce que je voudrais farie justement mais y'a moyen de faire un timestamp ?

#

Du genre toutes les 5 min par exemple ça check tout

#

Mais il me faut un timestamp de l'instant présent pour faire ça

#

Pas bête je check merci

slim anvil
#

Tu as des modules npm pour faire un systeme de cron en gros

cyan iron
#

new Date sinon

#

🤔

#

@slim anvil
J'ai fait ça voici le code :

let time = new Date().getTime()
        console.log(time + " | " + message.createdTimestamp)

Je voulais juste savoir, si je met un date.getime ça va fonctionner non

#

1700 ms de plus

slim anvil
#

Pour faire quoi

cyan iron
#

Evitez le spam de msgs :)

cyan iron
#

Au fait ça fonctionne j'ai réussi

#

J'ai oublié de le dire

timid loom
#

Pour un système de mute le truc classique c'est de rajouter un rôle qui empêche de parler et de vérif toutes les x intervalles que le timestamp est dépassé pour lui enlever (alternativement tu peux utiliser des CronJobs).
Pour la vérification typiquement tu vas avoir une backup en base de données mais tu enregistre les infos que tu veux dans une Collection par exemple ; une Collection qui associe par exemple à un id d'utilisateur un timestamp. Au démarrage du bot tu recharges cette collection via des requêtes db et dès qu'il y a un nouveau mute tu le rajoute à la fois dans la db et dans la collection. Quand le mute arrive à son terme tu enlève de la collection le mute, ainsi que dans la db, et tu réalise l'action "un-mute", qui consiste à enlever le rôle à l'utilisateur.
Je sais pas si c'est clair mais c'est le système le plus logique qui me vient en tête @cyan iron, autrement ça paraît peu opti

cyan iron
#

Pour un système de mute le truc classique c'est de rajouter un rôle qui empêche de parler et de vérif toutes les x intervalles que le timestamp est dépassé pour lui enlever (alternativement tu peux utiliser des CronJobs).
C'est ce que ça fait

Pour la vérification typiquement tu vas avoir une backup en base de données mais tu enregistre les infos que tu veux dans une Collection par exemple ; une Collection qui associe par exemple à un id d'utilisateur un timestamp. Au démarrage du bot tu recharges cette collection via des requêtes db et dès qu'il y a un nouveau mute tu le rajoute à la fois dans la db et dans la collection. Quand le mute arrive à son terme tu enlève de la collection le mute, ainsi que dans la db, et tu réalise l'action "un-mute", qui consiste à enlever le rôle à l'utilisateur.
Okkk pour éviter de faire 50k requêtes SQL

#

Merci je vais faire ça ^^

timid loom
#

okep, glhf

cyan iron
#

^^

oak turret
#

Dites moi, comment je peux détecter si un user dis un mot ou une phrases ?

Genre j'ai fais ça :

const phrases = ["ok", "test"];
if ( message.content.includes[phrases] ) {
  console.log("fonctionne");
} 

Je vois pas comment faire d'autres

west plover
#

y a Array.prototype.includes pour ça

oak turret
#

Ouais ça j'ai vu

west plover
#

ça donne phrases.includes( message.content )

oak turret
#

mh pas bête je test

#

non plus xd

west plover
#

hm show your code

oak turret
#
   const phrases = ["ok", "test"];
    if ( phrases.includes( message.content ) ) {
      console.log("fonctionne");
    } 
west plover
#

et tu rentres bien les mots complets, genre ok pour tester?

oak turret
#

oui justement je mets que ça

west plover
oak turret
#

wtf

#

c'est mon vscode qui est cassé ou quoi xd

timid loom
#

tu écris juste "ok" dans ton message?

#

tu es sûr

oak turret
#

yes

#

je vais refaire un bot tout neuf pour voir mais c'est bizarre

#

ah mais attend, en plus le includes ne détecte que si le content = un des index mon array

timid loom
#

ouais

#

il faut le faire à l'envers

oak turret
#

like this that's work

#
  const word = "ouvre quand"
    if ( message.content.includes(word) ) {
      message.reply("avant 2021");
    } 

thx ^^

timid loom
#

yep

cyan iron
#

@timid loom Salut ! Du coup pour les collections, je n'ai pas trouvé de doc dessus, je voudrais savoir comment ça fonctionne pls :)

#

Si ça te déranges pas

timid loom
#

C'est pareil qu'une map

#

Normalement c'est sur la doc de Discord.js

cyan iron
#

Je ne connais ni l'un ni l'autre

#

¯_(ツ)_/¯

#

Et j'ai pas trouvé sur la DOC

#

Peut être que je ne sais pas chercher

timid loom
#

Hmm si tu regarde par exemple le cache d'un Manager tu devrais trouver que c'est une collection

#

Je vais te chercher un lien

cyan iron
#

Je vais voir

#

Merci ^^

timid loom
cyan iron
#

ooooh merci

fleet socket
#

Hey ! j'ai un petit souci avec mon code j'ai un await qui ne fait pas son boulot, en gros la ligne var data = await get_userdata(params) est censé me retourner un objet avec les infos de l'utilisateur à l'interieur sauf que là la valeur de data est systematiquement undefined alors que le await est censé retourner qqch (il ne peut pas me renvoyer un undefined)

Du coup ma question est : y'a t-il un probleme avec mon await ? est-ce que je l'utilise mal ?

async function loterie_opti(message, args) {
  var memberid = message.member.id;
  var time = Date.now();
  var data = await get_userdata(memberid); // c'est ce await qui pose probleme

  console.log(`[DEBUG loterie] : data`);
  console.log(data); // affiche undefined
  if (!data)
    return create_userstamp(memberid);
  if (time - data.timestamp < 12 * 60 * 60 * 1000) {
    console.log(`[DEBUG loterie] : pas assez de tps`);
    return message.reply("Vous avez déjà participer il y a moins de 12h !");
  }
  data = await  update_userstamp(memberid);
  return 0;
}
#

Au passage get_userdata ressemble à ça

async function get_userdata(userid) {
  var sql = "SELECT * FROM donadab WHERE userid = ?";
  var params = [userid];
  var db_res = null;

  db.get(sql, params, (err, row) => {
    if (err) {
      console.error(err.message);
      return 84;
    }
    if (row) {
      console.log(`[DEBUG loterie] :`);
      console.log(row); //afiche la bonne valeure
      db_res = row;
      return db_res; // du coup retourne la bonne chose
    }
  });
}
#

je precise que le console.log à l'interieur lui m'affiche bien ce que je veux

magic orbit
#

Il faut que ta fonction retourne un promise pour que le code attend la reponse

#

Regarde sur la doc comment ça fonctionne

shell cedar
#

Bonjour,
Je viens vers vous après plusieurs heures de recherche non-concluante.
Je rencontre un problème avec une commande !banlist. Je ne sais absolument pas pourquoi celle-ci ne fonctionne pas. Tout se passe bien elle renvoie le nombre d'utilisateurs banni, mais impossible d'avoir le nom des utilisateurs.
Si vous pouvez m'aider, ce serais sympa 🙂

message.guild.fetchBans()
      .then(banned => {
        let list = banned.map(user => user.tag).join('\n');
    
        if (list.length >= 1950) list = `${list.slice(0, 1948)}...`;
        message.channel.send(`**${banned.size} utilisateur(s) banni:**\n${list}`);
      })
west plover
#

ça vient de ta fonction map

#

laisse moi chercher un peu dans la doc 🤔

#

donc

#

banned c une collection d’instances de BanInfo 🤔

#

et un BanInfo contient les propriétés user et reason

#

donc ton map devrait peut-être être :
banned.map( ban => ban.user.tag )

shell cedar
#

Merci beaucoup, je vais essayer ça de suite :p

#

(ça marche parfaitement merci beaucoup)

slim anvil
#

pourquoi quand vous testez vous mettez juste pas un console.log

#

si tu avais console.log(user) tu aurais vu que dedans il y avait user et reason

shell cedar
#

Je n'y ai pas pensé 🤔

keen narwhal
#

quelqu'un a déja testé les fichiers de Invite Manager sur GiftHub en open source ?

#

||( pas pour skid mais pour le fun )||

timid loom
#

Pourquoi la question ?

outer raven
#

Pourquoi cette question ?

sand shore
#

Qui ferait ça pour le Fun ??

keen narwhal
#

Et surtout pourquoi préciser que c'est pour le fun, c'est encore plus louche

flint eagle
#

Salut, je veux bien avoir comment on change de couleur dans le message embed
quand je fais dans .setcolor(0xff0000) ça me donne le couleur rouge

keen narwhal
#

Parce que le code Hex est certainement rouge

#

.setColor(edeb58) tu auras du jaune ^^

#

@flint eagle

oak turret
#

tape couleurs html sur google

#

t’auras les codes couleurs

#

prends le hex

#

commence par #

terse salmon
cyan iron
#

Salut j'ai besoin de vous encore :)
J'ai fait ceci mais j'ai un petit problème, on me ressort que results is not iterable :

for (const data of results) {
    inscriptions_embed.addField(`🗃️ Inscrit : ${data.user_name}`,`**Pseudo :**           ${data.minecraft_name}\n**ID unique :** ${data.id}`);
}
slim anvil
#

log ton results ?

cyan iron
#

ok je tente

#

Apparement il est undefined 🤔

slim anvil
#

du coup ceci explique cela

cyan iron
#

normalement c'est censé prendre les 5 premiers résultats

slim anvil
#

Faut que tu regardes avant

#

et toi qui fais de la "gestion d'erreur"

cyan iron
#
db.query(`SELECT * FROM hdv ORDER BY id ASC LIMIT 5 OFFSET ${page_request}`, (err, results) => {

                const inscriptions_embed = new Discord.MessageEmbed()
                    .setTitle(`📙 Voici la page ${page} des inscriptions !`)
                    .setColor("#2f3136")
                    .setFooter(`Page ${page}/${max_pages} des inscriptions.`)


                console.log(results)
                for (const data of results) {
                    inscriptions_embed.addField(`🗃️ Inscrit : ${data.user_name}`,`**Pseudo :** ${data.minecraft_name}\n**ID unique :** ${data.id}`);
                }
                return message.channel.send(inscriptions_embed);
            })
#

Ca vient de la requete

slim anvil
#

faut tjrs vérifier qu'un object/ tableau existe

cyan iron
#

et toi qui fais de la "gestion d'erreur"
x)

slim anvil
#

avant de taper dessus

cyan iron
#

oui je le fait normalement

#

Mais avant

#

c'est ma requête qui pose problème

slim anvil
#

Oui elle te renvoie rien, ça se trouve tu as 0 results ?

#

quoi que tu aurais un tableau vide au pire

cyan iron
#

att tu vas comprendre

#
        db.query(`SELECT * FROM whevent`, (err, allresults) => {
            let row_lenght = allresults.length
            let max_pages = Math.ceil(row_lenght / 5)

            if (max_pages === 0) return message.channel.send(":nope: **Il n'y a encore personne d'inscrit à l'event**")
            let page = 1
            if (args[0]) {
                page = parseInt(args[0])
                if (isNaN(page)) return message.channel.send(":nope: **Saisi un numéro de page valide !**")
                if (page <= 0) return message.channel.send(":nope: **Saisi un numéro de page valide !**")
            }

            if (page > max_pages) return message.channel.send(":nope: **Cette page est introuvable, la dernière page est la page " + max_pages + " !**")

            let page_request = (page - 1 ) * 5
            db.query(`SELECT * FROM hdv ORDER BY id ASC LIMIT 5 OFFSET ${page_request}`, (err, results) => {

                const inscriptions_embed = new Discord.MessageEmbed()
                    .setTitle(`📙 Voici la page ${page} des inscriptions !`)
                    .setColor("#2f3136")
                    .setFooter(`Page ${page}/${max_pages} des inscriptions.`)


                console.log(results)
                for (const data of results) {
                    inscriptions_embed.addField(`🗃️ Inscrit : ${data.user_name}`,`**Pseudo :** ${data.minecraft_name}\n**ID unique :** ${data.id}`);
                }
                return message.channel.send(inscriptions_embed);
            })
        });
#

Voilà

#

En gros je regarde d'abord si c'est vide justement

#

et ça me dit personne n'est inscrit

#

Sauf que là je suis inscrit dans la bdd justement

#

Le truc que je trouve bizarre c'est que j'utilisais exactement le même système pour un HDV et ça marchais nickel :(

slim anvil
#

je gère pas trop les requetes SQL

#

mais si ton page_request = 0

#

ça plante pas ?

#

ou si il est négatif ?

cyan iron
#

normlement il est pas négatif

#

ah possible

#

Att

slim anvil
#
let page_request = (page - 1 ) * 5

car si page = 0 de base tu l'as met à -1

cyan iron
#

page = 1 de base

slim anvil
#

donc elle sera a 0, ca fonctionnera quand meme ?

cyan iron
#

mais peut être que t'as raison si ça vaut 0

#

oui voilà

#

je tente

#

aaaaaah mais non

#

vu que offset c'est pour démarrer à

#

donc ça démarre à 0

#

Enzo

#

Tu vas rire

slim anvil
#

si je rigole pas on fait quoi kapp

cyan iron
#

tu vas rire je le sais x)

#

Je me suis trompé de table 😂

slim anvil
cyan iron
#

😂

#

J'ai juré je suis trop con

slim anvil
#

ça arrive sue

#

top

keen narwhal
#

quelqu’un saurait comment changer le nom et la photo d’un bot uniquement avec le token svp

humble storm
keen narwhal
#

thks

oak turret
#

@idle ice Yop, dis moi pour ton query t'as fais comment sur ton bot de status ? je capte pas pourquoi il me fail mon query, "error udp", thx ^^

idle ice
#

Je te met le code bouge pas

#
const game = require("gamedig")
const moment = require("moment")
const {MessageEmbed} = require("discord.js")

let serverIP = "144.76.220.146" 
let serverPort = "27015"

async function status(bot, name, players) {
    let status = require("../../data/status.json")
    
    const server = bot.guilds.cache.get("718598017795751937")
    const channel = bot.channels.cache.get(status.status_channel)
    const message = await server.channels.cache.get(status.status_channel).messages.fetch(status.status_message)

    if(channel) {
        if(message) {
            const embed = new MessageEmbed()
                .setColor("#0099ff")
                .setTitle(name)
                .setTimestamp()

            let plys = ""
            if(players) {
                players.forEach(ply => {
                    if(!ply.name) return
                    let time = moment().startOf("day").seconds(ply.time).format("HH:mm:ss")

                    plys = plys + `\n- ${ply.name} (${time})`
                })
            
                embed.addField("Joueurs en ligne", plys)
            }

            message.edit(embed)
        }
    }
}

module.exports = (bot) => {
    /* Server Status */
    setInterval(() => {
        try {
            game.query({
                type: "garrysmod",
                host: serverIP,
                port: serverPort
            }).then((state) => {
                status(bot, `__Clone Wars__\n🔰 Joueurs en ligne: ${state.players.length}/${state.maxplayers}\n💥 ${serverIP}:${serverPort} (${state.ping}ms)`, state.players)
            }).catch(() => {
                status(bot, `__Clone Wars__\n❌ Serveur hors-ligne ❌`)
            })
        } catch (error) {
            console.error(error)
        }
    }, 30 * 1000); // Ms
}
marble kindle
#

Bonsoir, je suis débutant dans le développement bot. J'ai une petite question, comment puis-je faire pour que mon bot reste en route h24 ?

dapper coral
#

Bonjour, il faut l'heberger chez un hebergeur

marble kindle
#

Ah ok...

#

Ok

dapper coral
#

Sa reste le meme principe il faut l'heberger quoi

oak turret
#

faut t-il savoir encore savoir use nodejs pour l’heberger

#

sur le raspberry

#

si il est débutant c’est pas la peine

zealous palm
#

une idée de pourquoi mon bot ne log pas le channel create

magic orbit
#

Le console.log marche ?

oak turret
#

euh j’ai pas fais comme ça pour créer un channel

zealous palm
#

C’est une logs de création de channel @oak turret

#

Oui y’a pas d’erreur dans le terminal @magic orbit

oak turret
#

ah donc quand un user créer un channel c’est censé le log

#

j’vais look si y a un event pour ça

#

event channelCreate

timid loom
#

J'imagine que c'est appelé dans une boucle de chargement d'évènements, tu peux montrer cet élément là également ?

zealous palm
#

C’est le seul code qu’il y’a dans mon fichier

fleet socket
#

Ah

#

Bah voilà le problème

#

Il faut que ce soit appelé dans un event "channelCreate" en l'occurrence

oak turret
#
client.on("channelCreate", (channel) => {
  console.log(`${channel.name} a été crée.`);
});
magic orbit
#

Bah en soit son code peut fonctionner malgré qu il soit le seul présent dans le fichier, si la fonction est appelé d un autre fichier lors de l évent c est sensé fonctionner

timid loom
#

Yes justement je veux voir ce bout de code là

zealous palm
#

Je ne l'ai aps je vais test je le met au dessus des lignes écrite ?

brave coral
#

Salut j'aimerais savoir comment je pourrais mettre un méssage d'erreur quand une personne fait ![un mot] pour lui dire que la commande est introuvable ou invalide ?

oak turret
#

mh

#

un array avec toutes tes commandes

#

tu vérif si message.content !== de ton array

#

si oui l'erreur, sinon return true ( il m'semble )

#

exemple en js vanilla, msg = message.content

const msg = "!help";
const commandes = ['!help', "!ban", "!kick"];
if ( commandes.includes(msg) ) {
  console.log('Commandes utilisée ' + msg);
}
else {
  console.log('Invalide');
}
cyan iron
#

En fait, il cherche d'abord à trouver la mention

#

Mais si celle-ci n'est pas présente il prend quand même l'ID

#

Est-ce que quelqu'un saurait comment je pourrais régler ce petit problème ?

#

Le problème aussi c'est que si je met args[0] ou message.author en premier ils existerons forcément donc la mention ne sera jamais testée :(

slim anvil
#

tu peux sinon faire des ternaires

#

client?.users?.cache?.get(....

#

Alors plus trop sûr que ce genre de chaining soit encore appelle ternaire mais c’est le même opérateur alors je pense que oui mais t’as saisi l’idée

cyan iron
#

aaah je ne savais pas

#

Donc si j'ai bien compris

#
let target = client.users.cache.get(message.mentions.members.first()?.id || args[0] || message.author.id)

Je dois faire ça ?

slim anvil
#

bah non du coup regarde mon message

cyan iron
#

🤔

#

Il faut que je le mette sur le get

#

Mais ça va faire quoi exactement je comprends pas

slim anvil
#

tu sais ce que c’est qu’une ternaire ?

cyan iron
#

Non

slim anvil
#

Regarde déjà ça, et pardon mon exemple du coup c’est dû optional chaining

#

Regarde un peu sur Google tu vas voir c’est pas compliqué

cyan iron
#

Ok merci ^^

slim anvil
#

ça te permet en gros de tester à chaque fois si la clé existe

cyan iron
#

Aaaaah !

#

Mais c'est génial

#

y'a le point quand même

#

Il veut pas quand je met le point 🤔

slim anvil
#

Check ta version de node ou autre, je crois que ça s’utilise avec Babel aussi, mais si tu as pas tout ça d’installer laisse tombé je pensais que si my bad

#

fais juste ça avec une ternaire basique alors ce sera ok la

#

besoin de rien

cyan iron
#

Je regarderais ça demain je dois partir mais merci beaucoup ;)

timid loom
#

Normalement c'est utilisable

obsidian siren
#

Bonjour, depuis la mise à jour de l'api je n'arrive plus à get les émojis voici le code que j'utilise

#

J'ai aussi essayer avec seulement l'id mais toujours pareil

humble storm
#

Essaie peut-être client.emojis.resolve( "id" )

oak turret
#

y a eu une maj quand?

obsidian siren
oak turret
#

ah la v12 mdr ok c'pas nouveau

obsidian siren
#

Ouai mais voilà

#

😂

#

ouai dcp client.emojis.get à été changer

#

@humble storm

#

avec client.emojis resolve

oak turret
#

tu veux afficher un emoji ?

obsidian siren
#

oui

oak turret
#
const emoji = message.guild.emojis.cache.find(emoji => emoji.name === 'nomdelemoji');
#

ou .get('id');

obsidian siren
#

Genre ça c'est senser work ?

oak turret
#

yep

obsidian siren
oak turret
#

ah mais non

#

j'avais po vu

#

att

#
 .setTitle(message.guild.emojis.cache.get('id'));
obsidian siren
oak turret
#

l'émoji est sur ton serveur ?

obsidian siren
#

oui

oak turret
#

alors fait

#

:nomdelemoji:

#

.:nomdelemoji:

#

oh

#

\:emoji_name:

#

dans ton serveur

#

et envoie moi l'id

obsidian siren
#

739107138366079097

oak turret
#

dans le .get('id') mets l'id dans id

#
 .setTitle(message.guild.emojis.cache.get('739107138366079097'));
obsidian siren
#

déjà fait

oak turret
#

et undefined ?

obsidian siren
#

oui

oak turret
#

et ça :

#
client.emojis.cache.get('739107138366079097');
#

t'avais pas mis le bon id dans ton premier screen

obsidian siren
#

toujours

oak turret
#

alors essaye ça

#

\:emoji_name:

#

donc

#
 .setTitle(\:emoji_name:);
obsidian siren
#

mais ça marchera pas sur tout les serveur ça ducoup

oak turret
#

bah c'pareil avec l'id

obsidian siren
oak turret
#

oh bah wtf

obsidian siren
oak turret
#

essaye de test dans un message normal

obsidian siren
#

pareil

dire latch
#

Pourquoi quand je fais ceci:

module.exports.run = async (bot, message, args, bdd) => {
    const member = message.mentions.members.first() || message.guild.members.get(args[0])

    bdd.query(`SELECT * FROM level WHERE discord_id = '${message.author.id}'`, (err, rows) => {
    let data = rows[0];

    const canvas = createCanvas(1000, 333);
    const ctx = canvas.getContext("2d");
    const background = await loadImage("./justiceleague.jpg");
    ctx.drawImage(background, 0, 0, canvas.width, canvas.height);

ça me met cet erreur ?

slim anvil
#
bdd.query(`SELECT * FROM level WHERE discord_id = '${message.author.id}'`, async (err, rows) => {
dire latch
#

Merci 🙂

dire latch
#

Es-ce que c'est possible de vocal ? @slim anvil J'ai quelques choses à te demander et je ne sais pas si tu vas comprendre à l'écris 🙂

slim anvil
#

explique moi a l'écrit déjà sinon on ira en vocal 😉

dire latch
#

Sa aurait plus simple en vocal mdr

#

En gros, sur mon système de rank

#

Pour que la "barre de progression" avance

#

Faut que je fasse xp - xpmax

#

Mais quand je fais ceci

#

Ma barre va de droite à gauche

#

Et moi je voudrai l'inverse

#

Pire explication ever

slim anvil
#

c'est l'inverse qu'il faut

#

je pense, att je finis juste ma game et je suis la

dire latch
#

Ok merci 🙂

slim anvil
#

Ok, donc @dire latch ton xpmax correspond à quoi ? au % de progression maximum a afficher sur la barre ? donc par exemple 100% ?

dire latch
#

Re

#

Oui, c'est ça

#

Si tu veux venir vocal, tu peux, sa seras mieux avec les images et les explications 🙂

slim anvil
#

ok tu me laisses 10 min ?

dire latch
#

Oui tkt, va si 🙂

cyan iron
#

Omg Enzo qui voc

dire latch
#

Mdrr

#

Et que avec moi, la grande classe 🙂

cyan iron
dire latch
#

Ptdrr

dire latch
#

J'ai une autre petite question 🙂 @slim anvil

Tu sais comment faire pour indiquer son rank ?

slim anvil
#

Comment ça

dire latch
#

Par exemple

#

Si toi et moi

#

On as de l'xp/level

#

Tu es genre lvl 2, et moi lvl 1

#

Si je fais !rank

#

ça me dis que je suis 2ème

#

Et ainsi de suite

slim anvil
#

Ah tu peux get toute ta table, et tu fais un sort et tu récupères le premier

dire latch
#

Ok, je ne sais pas faire ça mdrrr

slim anvil
#

Bah déjà commences par récupérer toutes tes datas dans un format Array, quand tu as ça tu me dis

dire latch
#

@slim anvil

oak turret
#

no ping

cyan iron
oak turret
#

et il te parlait d'un array mais dans ton code à mon avis

dire latch
#

😦

slim anvil
#

bah je sais pas trop si tu veux tous les afficher ou non, mais dans tout les cas il te faut un tableau dans ton code ou tu reçois tout tes users avec l’xp et ensuite tu fais un .sort dessus pour le trier du plus grand au plus petit

#

et si ensuite tu veux sa position, tu fais un .findIndex

#

Et tu auras sa position

dire latch
#

Je voudrais que le top 10

slim anvil
#

Bah tu le sélect tous, tu sort et tu .slice(0, 10)

#

Je vais m’absenter là je sors le chien je serai dispo après si tu veux

#

Mais ça te donnerai ça:
array. sort((a, b) => { return b.xp - a.xp })

#

et ensuite dessus tu slice(0, 10)

dire latch
#

Dac

slim anvil
#

C'est good ?

#

@dire latch

dire latch
#

Euh on va dire ça 😂

slim anvil
#

t'en es ou là actuellement

dire latch
#

Je fais mon array

#

Avec un tuto

slim anvil
#

Mais ton array tu le reçois déjà de base lors que tu SELECT toute ta table

dire latch
#

AHHHHHH

#

Mdr

#

Tu veux pas venir me dire ? Mdrr

#

Jsuis nul

slim anvil
#

J'arrive dans 5min

dire latch
#

Merci 🙂

dire latch
#
// CERCLE POUR IMAGE DE PROFIL
ctx.arc(170, 160, 120, 0, Math.PI * 2);
ctx.lineWidth = 6;
ctx.strokeStyle = "#ffffff";
ctx.stroke();
ctx.closePath();
ctx.clip();
const avatar = await loadImage(message.author.displayAvatarURL);
ctx.drawImage(avatar, 40, 40, 250, 250);
// CERCLE POUR LE ROND ROUGE
ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
ctx.strokeStyle = "#ffffff";
ctx.stroke();
ctx.closePath();
ctx.clip();
const presence = statut;
ctx.drawImage(presence, 200, 208, 80, 80);

Comment enlever le deuxième cercle sur mon image de profil :(

https://media.discordapp.net/attachments/738491420314173450/739560739890790500/rank.jpg

unborn igloo
#

J'y connais rien mais c'est pas le ctx.drawImage(presence, 200, 208, 80, 80); qui fait ça ?

dire latch
#

Jsp

unborn igloo
#

Si tu le retire ça fait quoi ?

dire latch
#

Ya tjr les deux cercles

unborn igloo
#

Beh je vois aps alors, j'y connais rien en bot je laisse les autre t'aider

dire latch
#

Oui, ya Enzo qui vas m'aider après 🙂

slim anvil
#

là c'est du canvas héhé on check après yes quand j'ai finis de play

#

sauf si quelqu'un se sent de check avant 😛

dire latch
#

Enfête, j'ai sois, le cercle rouge sans contour, et un grand cercle

#

Sois j'ai le cercle autour du cercle rouge mais j'ai 2 grands cercle

fleet socket
#

je sais pas avec quel lib tu fais ça mais ce ne serait pas ctx.arc(240, 248, 35, 0, Math.PI * 2, true) qui dessine tes cercles ? car tu en as une au début et une plus tard 🤔

dire latch
#

Oui normal

#

J'en ai une pour faire le contour de ma pp

#

Et l'autre pour le rond rouge

#

Mais quand je fais ça

#

J'ai deux cercles sur ma pp

#

Et non 1

fleet socket
#

ahhh oui j'avais pas vu le rond rouge

#

le true à la fin il represente quoi ?

#

c'est quoi la lib que tu utilises ? ce sera plus simple ^^

dire latch
#

Franchement, j'en sais rien, mais que je l'ai ou non, ça ne change rien 😦

#

Canvas

hazy mirage
#

C’est la librairie Canvas 😊

dire latch
#

Enzo l'as dis plus haut

oak turret
#

tu veux faire quoi j’ai pas suivi

hazy mirage
#

Tu voudrais enlever le fond blanc du cercle rouge, c’est bien ça ?

dire latch
#

Quel fond blanc ? 🤔

hazy mirage
#

Tu veux enlever quoi en gros

oak turret
#

c’est le fillstyle

dire latch
#

Je te laisse relire 😂

oak turret
#

non mais mdr

hazy mirage
#

Oui mais ça ne m’éclaire pas

oak turret
#

quel deuxième cercle

hazy mirage
#

C’est quoi le deuxième cercle pour toi?

oak turret
#

c’pas précis

dire latch
#

Mais faut savoir lire -__-

oak turret
#

non mais mdr

hazy mirage
#

Ok super, je laisse les autre t’aider vu que je sais pas lire

dire latch
#

"Comment enlever le deuxième cercle sur mon image de profil"

oak turret
#

mais mec

dire latch
#

Je ne peux pas être plus claire que ça 🤷‍♀️

oak turret
#

quel deuxième cercle

hazy mirage
#

C’est quoi le deuxième cercle pour toi?

oak turret
#

celui du status ou de la pdp

fleet socket
#

il parle de la pdp

dire latch
#

"Comment enlever le deuxième cercle sur mon image de profil"

#

Sois vous êtes aveugle, sois vous cherchez pour un rien

hazy mirage
#

C’est quoi le deuxième cercle pour toi sur ta pdp ?

oak turret
#

strokestyle

dire latch
#

Donc à un moment donner, stop

oak turret
#

c’est toi qui a fait le code?

fleet socket
#

pas besoin d'être aussi agressif par contre ^^ surtt quand tu parles à des gens qui cherchent à t'aider

hazy mirage
#

Bon avant de copier coller du code sans comprendre go l’apprendre plutôt

oak turret
#

ouais mdr

hazy mirage
#

Parce que demander de l’aide en ayant copié colle sans comprendre c’est facile

oak turret
#

car là tu vois que c’est une couleur

hazy mirage
#

Si tu veux partir de ce principe

oak turret
#

une seule fois define

#

donc faut juste savoir LIRE

dire latch
#

@hazy mirage Ok

oak turret
hazy mirage
#

@dire latch bon, je me suis calmé.
On va repartir sur de bonnes bases si tu le souhaites :)
Alors pour nous ce n’est pas évident de comprendre ce que tu entends par le deuxième cercle... serait-ce possible de l’entourer en rouge sur une capture d’écran ?

oak turret
#

Pilot, c'est le strokestyle

#

vu que c'est define dans le cercle de la pdp

#

y a que ça

#

test ça

dire latch
#

Je vais attendre Enzo

hazy mirage
#

Comme tu le souhaites :€

dire latch
#

Car quand je marque quelques choses, et ya que toi qui ne comprends pas

fleet socket
#

il parle du cercle qui entoure la pdp si tu zoom un peu tu vois bien les deux cercles mais il se voit quasiment pas comme ça

hazy mirage
#

@oak turret ah il parlait du contour de la pdp

dire latch
#

Quand c'est écris blanc sur noir, c'est un peu du foutage de gueule

#

Ou noir sur blanc

hazy mirage
#

Met ton ctx.lineWidth à 0

#

Normalement cela fera l’affaire

oak turret
#

ah

#

oui le lineWidth

fleet socket
#

Quand c'est écris blanc sur noir, c'est un peu du foutage de gueule
@dire latch Bon allez debrouille toi ❤️ (il voyait juste pas le cercle sur la pdp)

dire latch
#

@fleet socket Ba m'aide pas 🤷‍♀️

oak turret
#

@dire latch Par contre une chose, tu demandes de l'aide, tu restes poli, patient, et courtois.
On veut juste aider, et tu réponds comme si on était des chiens, c'est stop, sinon tu vas dans #rules et tu lis, c'est écris noir sur blanc comme tu dis si bien.

dire latch
#

Mdr

hazy mirage
#

@dire latch je sais pas si t’a vu:

Met ton ctx.lineWidth à 0

dire latch
#

C'est écris et on se fout de moi, donc je ne pense pas que c'est moi le soucis

oak turret
#

on se fout de toi ? t'as de l'audace mon garçon

hazy mirage
oak turret
#

et c'est le lineWidth yes

hazy mirage
#

(Celui la au cas où tu ne le vois pas malgré qu’il soit écrit blanc sur noir)

dire latch
#

@oak turret Totalement, quand j'écris le problème et on me demande ce que c'est, sa s'appelle du foutage de gueule

ancient sonnetBOT
#

:two: Respectez le but des channels.
Si tu as un doute pour savoir où poster ton message, demande le nous dans #general :ok_hand:

slim anvil
#

le prochain c'est un warn

#

On revient au sujet principal qui est le probleme de canvas

#

merci

#

on peut pas jouer en paix sue

oak turret
#

on lui a dit de mettre le lineWidth à 0, plusieurs fois sinon

slim anvil
#

T'as essayé @dire latch ??

dire latch
#

Oui

#

ça fonctionne pas

oak turret
#

mets une autre couleur que blanc pour test

#

si il y est encore c'est ton image

hazy mirage
#

Ah mais enlève
de ctx.arc a ctx.clip()

#

Normalement c’était juste pour le cercle blanc ça je crois

dire latch
#

Oui, mais j'ai plus le cercle blanc sur mon rond rouge après

oak turret
#

fais un screen stp

dire latch
#

De ?

hazy mirage
#

Ah c’est étonnant

oak turret
#

ton rendu

dire latch
#

En enlevant ce que tu m'as dis ?

oak turret
#

non, actuel

dire latch
#

Pareil qu'aux dessus, sauf j'ai un cercle avec une autre couleur

hazy mirage
hazy mirage
hazy mirage
#

Le cercle jaune il sort d’où

slim anvil
#

je comprend pas en testant ton truc

#

j'ai bien ça moi

hazy mirage
#

Oui mais lui

#

Il veut pas le cercle extérieur

dire latch
#

C'est totalement ça que je veux mdr

hazy mirage
#

Wait

dire latch
#

Faut lire un petit peu ...

hazy mirage
#

"Comment enlever le deuxième cercle sur mon image de profil"

oak turret
#

donc tu veux enlever le cercle jaune ou blanc ?

#

si tu veux enlever le blanc, tu enlèves le strokestyle

dire latch
#

Je vais test

oak turret
#

#ffffff = blanc

dire latch
#

Je sais oui

#

J'ai enlever les deux strokestyle

#

Et j'ai toujours les deux cercles

oak turret
#

et donc là tu veux enlever le blanc ?

dire latch
#

Je voudrais enlever un cercle oui

oak turret
#

celui de ta pdp

#

ok

#

envoie ton code actuel stp

dire latch
#

Le deuxième oui

#

Le plus petit des deux

oak turret
#

oui alors le plus petit des deux je le vois pas enft

dire latch
#
                    ctx.arc(170, 160, 120, 0, Math.PI * 2, true);
                    ctx.lineWidth = 6;
                    ctx.stroke();
                    ctx.closePath();
                    ctx.clip();
                    const avatar = await loadImage(message.author.displayAvatarURL);
                    ctx.drawImage(avatar, 40, 40, 250, 250);

                    // ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    // ctx.fillStyle = "#ffffff";
                    //ctx.stroke();
                    //ctx.closePath();
                    //ctx.clip();
                    ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    //ctx.strokeStyle = "#ff9e00";
                    ctx.stroke();
                    ctx.closePath();
                    ctx.clip();
                    const presence = statut;
                    ctx.drawImage(presence, 200, 208, 80, 80);```
#

Clic sur l'image et zoom 🙂

#

Tu vois mieux les deux

oak turret
#

le linewidth à 0, et pourquoi tu mets un .stroke() ?

#

si c''est pas le linewidth test avec une autre image de pp

dire latch
#

Ce n'est pas ça

#

Même avec une autre pp

#

J'ai pas de contour blanc non plus sur ma pp

#

Et si j'enlève le .stroke(), j'ai plus le rond blanc qui s'affiche

timid loom
#

À mon avis c'est un artefact dû à la compression, perso je le vois pas vraiment donc je me trompe sans doute

oak turret
#

je vois rien d'autre non plus

#

compression de la pp je pense aussi

dire latch
#

Non, dutout

timid loom
#

Après c'est vrai qu'autour du cercle rouge ça fait moins large du coup

#

C'est difficile à voir sur tel je t'avoue

dire latch
#

Avec le code actuel

#

ça donne sa

#
                    ctx.arc(170, 160, 120, 0, Math.PI * 2, true);
                    ctx.lineWidth = 0;
                    ctx.stroke();
                    ctx.closePath();
                    ctx.clip();
                    const avatar = await loadImage(message.author.displayAvatarURL);
                    ctx.drawImage(avatar, 40, 40, 250, 250);

                    // ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    // ctx.fillStyle = "#ffffff";
                    //ctx.stroke();
                    //ctx.closePath();
                    //ctx.clip();
                    ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    //ctx.strokeStyle = "#ff9e00";
                    //ctx.stroke();
                    ctx.closePath();
                    ctx.clip();
                    const presence = statut;
                    ctx.drawImage(presence, 200, 208, 80, 80);
#

Mais ducoups, j'ai plus le cercle sur le rond rouge

timid loom
#

Je t'aiderais bien mais pour le coup les canvas en étant sur tel j'ai du mal du coup je laisse aux autres

dire latch
#

Pas de soucis tkt

timid loom
#

Mais Enzo a le bon résultat nan ?

dire latch
#

Oui

slim anvil
#

Bah ouais c'est ça je comprend pas mais j'ai pris son code

timid loom
#

T'as rien changé toi ? Super bizarre

slim anvil
#

La seule chose que je n'ai pas

#

c'est les photos enfaite

#

je les laisses juste vide

dire latch
#

Ta peut être pas le reste ?

#

Tu veux que je t'envois ? @slim anvil

slim anvil
#

oui envoie moi tout ton canvas pour voir

timid loom
#

Ouais c'pour ça que je dis que c'est à cause de la compression

dire latch
#

Je t'envois ça en mp

oak turret
#

c'est sûrement ça Taink

slim anvil
#

Essaye mcduck pour tester

#

d'enlever les images dans la photo

timid loom
#

Mais ce qui m'étonne c'est que la compression en général ça fait pas ça quoi

slim anvil
#

juste pour voir

oak turret
#

ouaip

timid loom
#

Glhf à tous hein du coup

oak turret
#

c'est donc ton image

dire latch
#

Et je règle ça comment ducoups ?

hazy mirage
#
                   
                    const avatar = await loadImage(message.author.displayAvatarURL);
                    ctx.drawImage(avatar, 40, 40, 250, 250);

                    // ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    // ctx.fillStyle = "#ffffff";
                    //ctx.stroke();
                    //ctx.closePath();
                    //ctx.clip();
                    ctx.arc(240, 248, 35, 0, Math.PI * 2, true);
                    //ctx.strokeStyle = "#ff9e00";
                    //ctx.stroke();
                    ctx.closePath();
                    ctx.clip();
                    const presence = statut;
                    ctx.drawImage(presence, 200, 208, 80, 80);
slim anvil
#

j'ai 0 probleme avec ton code 🤔

#

après je test en web mais ca revient au meme je pense

dire latch
#

Test avec mon code que je t'ai mis en MP si tu veux 🙂 Enzo

slim anvil
#

yes ce que j'ai fais tkt

oak turret
#

j'ai test aussi, c'est fonctionnel

slim anvil
#

Franchement là no sé 🤔

dire latch
#

Ah

#

Tu peux screen ce que sa donne ?

#

Stp

oak turret
#

l'image de l'avatar y a que ça

slim anvil
#

Merde je viens de couper l'editeur en ligne

dire latch
#

Pg tkt

slim anvil
#

Je sais pas si c'est l'image ou non, c'est peut etre du a un .clip() ou autre, la je sèche

dire latch
#

Sans le .clip(), ma pp dépasse du cercle

slim anvil
#

ouais du coup

#

no sé sorry

oak turret
#

humm j'ai peut-être une idée

slim anvil
#

pas mon truc favoris le canvas kappa

dire latch
#

🙂

#

Nul Enzo mdrr

oak turret
#
const avatar = await loadImage(message.author.displayAvatarURL({format: 'jpg'}));
#

test avec les formats

#

jpg, png

#

je sais pas si svg ça marchera

dire latch
#

TypeError: message.author.displayAvatarURL is not a function

oak turret
#
    const avatar = await Canvas.loadImage(message.author.displayAvatarURL({ format: 'jpg' }));
#

je l'ai pris comme ça

dire latch
#

Canvas n'est pas définis

#

Et si je met canvas comme j'ai mis plus haut,

#

J'ai le même erreur que aux dessus

oak turret
#

mets juste loadImage

oak turret
#

wtf

#

ouais bah je sais po

dire latch
#

😦

#

Merci en tout cas

keen narwhal
#

Vous me conseillez quoi pour débuter mon apprentissage sur le JS ?

oak turret
fleet socket
#

perso j'ai appris le js sur openclassroom

brave coral
#

Salut quelqun pourrait m'expliquer comment faire un embed pour mon bot discord en js ? car j'ai éssayer ce code

#
client.on('embed', message => {
  .setTitle("This is your title, it can hold 256 characters")
  .setAuthor("Author Name", "https://i.imgur.com/lm8s41J.png")
  /*
   * Alternatively, use "#00AE86", [0, 174, 134] or an integer number.
   */
   
  .setColor(0x00AE86)
  .setDescription("This is the main body of text, it can hold 2048 characters.")
  .setFooter("This is the footer text, it can hold 2048 characters", "http://i.imgur.com/w1vhFSR.png")
  .setImage("http://i.imgur.com/yVpymuV.png")
  .setThumbnail("http://i.imgur.com/p2qNFag.png")
  /*
   * Takes a Date object, defaults to current date.
   */
  .setTimestamp()
  .setURL("https://discord.js.org/#/docs/main/indev/class/RichEmbed")
  .addField("This is a field title, it can hold 256 characters",
    "This is a field value, it can hold 1024 characters.")
  /*
   * Inline fields may not display as inline if the thumbnail and/or image is too big.
   */
  .addField("Inline Field", "They can also be inline.", true)
  /*
   * Blank field, useful to create some space.
   */
  .addBlankField(true)
  .addField("Inline Field 3", "You can have a maximum of 25 fields.", true);
 
  message.channel.send({embed});

})
#

Mais il m'affiche une errreur donc si quelqun pourrait m'envoyer un code embed sans erreur ou m'aider a comprendre comment en faire un ce serait sympa merci 🙂

slim anvil
#

T’as l’impression d’avoir déclarer embed quelque part ?

#

Tu .setTitle sur rien

#

Regarde sur discordJs embed

oak turret
#

c'est

#
const embed = new Discord.MessageEmbed()
  .setColor()
  .setTitle()
message.channel.send(embed)

etc

queen ocean
#

Et je pense pas qu'il y ai un event embed sur le client 🤔

oak turret
#

tiens ça t'aideras

tidal niche
#

Bonjour, comment je peux faire une fonction dans ma commande clear pour récupérer tout les message et les mettre dans un fichier et après les renvoyer dans un channel que j'ai prédéfini ?

timid loom
#

Tu get les x derniers messages du channel où tu clear, écris leur représentation dans une string, t'envoie ça en attachment dans un message et voilà

tidal niche
#

Oki merci

dire latch
#

Hey 🙂

#

J'ai une petite question, pour faire une annonce quand quelqu'un live, il faut utiliser quel module ? Ou autre ?

queen ocean
#

Pour twitch tu peux directement utiliser leur API

dire latch
#

Car j'avais trouver un bout de code et des trucs à gauche et à droite mais je comprends pas tout tout encore 🙂

#

J'avais ceci:

const Discord = require('discord.js');
const snekfetch = require('snekfetch');
const client = new Discord.Client()

const streamer = 'Dragounnet56';

const api = `https://api.twitch.tv/helix/streams?user_login=${streamer}`
let bottwitch = client.channels.find(r => r.id === "738811585992065114")

client.on('ready', function () {
  console.log(`Bot has started, with ${client.users.size} users, in ${client.channels.size} channels of ${client.guilds.size} guilds.`);
  client.user.setGame(`on ${client.guilds.size} servers`);
});

snekfetch.get(api).set('Client-ID', "iddemonappli").then(r => {
  if (r.body.stream === null) {
    setInterval(() => {
      snekfetch.get(api).then(console.log(r.body))
    }, 10);
  } else {
    console.log(r.body);
    const embed = new Discord.RichEmbed()
     .setAuthor(`${r.body.stream.channel.display_name} is live on Twitch`,`${r.body.stream.channel.logo}`,`${r.body.stream.channel.url}`)
     .setThumbnail(`http://static-cdn.jtvnw.net/ttv-boxart/${encodeURI(r.body.stream.channel.game)}-500x500.jpg`)
     .addField('Stream Title', `${r.body.stream.channel.status}`, true)
     .addField('Playing', `${r.body.stream.channel.game}`, true)
     .addField('Followers', `${r.body.stream.channel.followers}`, true)
     .addField('Views', `${r.body.stream.channel.views}`, true)
     .setImage(r.body.stream.preview.large)
    return bottwitch.send(embed);
  }
});
#

Mais je ne sais pas si je suis dans la bonne direction 🤷‍♀️

slim anvil
#

Tu peux pas le faire avec des webhooks directos ?

dire latch
#

Non, je voudrai sans justement 🙂

queen ocean
#

la partie helix de l'api a changé

#

tu dois avoir un client_id et client_secret mtn

dire latch
#

Euh

#

J'ai juste mon client_id

#

Comment j'ai le client_secret ?

queen ocean
#

https://id.twitch.tv/oauth2/token?client_id=${authHelix.clientID}&client_secret=${authHelix.clientSecret}&grant_type=client_credentials

#

ca te permet de récupérer un token

#

Et ensuite tu pourras faire une requete sur https://api.twitch.tv/helix/streams?user_login=${streamer} avec comme header :

'Client-ID': this.authHelix.clientID,
'Authorization': `Bearer ${accessToken}`,
dire latch
#

Ok mais ducoups, j'ai comment mon client_secret ?

queen ocean
#

(jvais etre sur la route donc je serais plus dispo pour répondre le temps que je rentre)

dire latch
#

Dac tkt

#

Si j'y arrive pas, j'attendrai 🙂

tidal niche
#

Hey, c'est quoi le nom de évènement pour récupérer la personne qui a boost le discord ?

keen narwhal
#

client.on('nitroBoost', (booster) => {
})

#

je crois

timid loom
#

Ça existe pas cet event

#

Tu dois listen les changements de rôles et vérifier que ça correspond au rôle de nitro boost

#

Le nom de l'évent c'est genre guildMemberEdit ou quelque chose comme ça

#

C'est sur la doc pour le coup

tidal niche
#

Ah d'accord mais du coup si il boost 2 fois le 2 eme ne sera pas afficher si il a deja le role ?

timid loom
#

Malheureusement non

#

Tu peux sans doute bidouiller mais c'est à toi de regarder comment et ça ne sera sans doute pas aussi constant que les autres events

tidal niche
#

D'accord je vais check merci

dire latch
#

guildMemberUpdate pour l'event aussi 🙂

timid loom
#

Yes c'est ce que j'ai envoyé plus haut

dire latch
#

Ta marquer edit 🙂

keen narwhal
#

je voulais savoir si cetait vraiment possible je n’ai vu personne le faire ^^

dire latch
#

Idk

unborn igloo
#

Oui, par contre fait attention, pour avoir un serveur faut mettre une cb et tu fait une fausse manip (genre t'active un truc payant sans savoir) il te facture sans prévenir

#

Et un bon prix

keen narwhal
#

ok cimer et ça oklm

#

je fais une CB prepaid

#

genre une nouvelle CB avec seulement 5€ dessus par exemple

unborn igloo
#

Ouais, je sais pas si il accepte ce genre de carte

keen narwhal
#

ça dépend des banques

unborn igloo
#

Après si tu fzit bien attention t'as pas de soucis normalement

keen narwhal
#

bref tu t’y connais un peu en Vps ?

#

je sais pas trop lequel prendre

oak turret
#

prends heroku mdr

#

plus simple

#

sinon n'importe quel vps fera l'affaire

#

tu lance un tâche node avec ton bot et ça tourne h24

keen narwhal
#

enft jvais lancer un bot giveway et je prévois environ 100 servs même pas mais jpense ça va pas tenir si ?

#

je sais pas du tout quoi prendre x(

oak turret
#

ça tiendra je pense

keen narwhal
#

azy cim

#

question conne : si j’héberge sur plusieurs truc en même temps genre Heroku, Glitch ,j’aurais une plus grosse puissance ou juste toute mes commandes en 2 fois et tout x)

#

aws c'est super mais pas forcément pour héberger des bots. La force de aws c'est le serverless donc tout le contraire de ce dont tu as besoin

keen narwhal
#

ah

#

ducoup c’est mieux quoi : /

#

dans ces VPS gratuit

#

Pour les bots heroku c'est très bien et facile à prendre en main

#

yes jvais faire ça j’ai juste peur que ça tienne pas D:/

fleet socket
#

Le pb avec heroku c'est que ton bot sera pas allumer h24

#

Perso j'héberge mon bot sur raspberry 🤔

dire latch
#

Sois tu le fais sur ton pc

#

Sois tu prends un petit vps 🙂

keen narwhal
#

@fleet socket pourquoi pas h24 et c’est gratuit RasBerry ?

#

@dire latch un gratuit ? 😎

slim anvil
#

Heroku ca reste h24

dire latch
#

Rien n'est gratuit 🙂

slim anvil
#

enfin je sais po j'use plus trop, mais prend toi un petit vps

#

ca fera large l'affaire

dire latch
#

Yep

keen narwhal
#

ouil le budget

dire latch
#

Tu peux avoir un vps à 1€/mois 🤷‍♀️

keen narwhal
#

du genre ?

#

lql

dire latch
#

Jt'envois le lien en mp pour éviter la pub

keen narwhal
#

azy

oak turret
#

raspberry c'un truc externe

#

une sorte de mini pc

keen narwhal
#

vous connaissez des hébergeurs avec des mois d’essais ?

dire latch
#

Moi j'avais entendu que Heroku récupérais les tokens, après, je ne sais pas si c'est vrai ou non

#

@keen narwhal Tu auras pas d'hébergeur avec des mois d'essais 🙂

keen narwhal
#

oh

dire latch
#

🙂

keen narwhal
#

why

#

ça existe pas

dire latch
#

J'en ai jamais vu perso

keen narwhal
#

vous avez des plugins sympa ou utilise svp pour discord js

#

comme canvas, fidglet, etc

oak turret
#

bah

#

faut savoir ce que tu veux

keen narwhal
#

rien j’ai envie de découvrir des trucs

oak turret
#

bah

#

tu verras quand tu voudras faire un truc que t'as jamais fais

keen narwhal
#

hm ok

#

y’a un plugin pour récupère une info sur un site ??

#

genre un compteur d abonne par exemple

oak turret
#

api youtube

keen narwhal
#

nice

#

et petite question pour l’hébergement, si j’héberge mon bot sur Heroku et en journée sur pc (tout en laissant tourner sur Heroku) car je peux pas laisser mon pc allumer toute la nuit genre, est ce qu’en journée mon bot sera plus puissant ou au contraire ça fera les commandes en double et tout ?

slim anvil
#

Ça fera en double si t’as 2 instances qui tournent en même temps

#

Mais ça ne changera rien à la puissance

keen narwhal
#

ah k et c’est possible de transformer un pc portable en serveur dédiée ?

#

déjà ça coûte pas mal d’électricité oe

#

et un serveur dédié coûte minimum combien ?

slim anvil
#

Prend un VPS simple

#

T’as pas besoin de +

keen narwhal
#

ok ok 👍

zealous palm
#

Salut need help please

#

Where is the problem ?

slim anvil
#

logton user.guild.channels.get('') mais il a pas l'air d'etre defined

#

donc met juste tes logs jusque remonter au soucis

zealous palm
#

donc si je comprend bien je met un console.log c'est ça

slim anvil
#

Oui tu fais du debug quoi

zealous palm
#

chelou car mon guildmemberadd fonctionne

#

bon ça m'a l'air de fonctionner bizarre x'D

keen narwhal
#

quelqu’un a le badge développeur svp ?

#

pour des renseignements

oak turret
#

faut un bot qui soit sur 80 serveurs je crois

#

mais je connais des tocards qui l'ont