#development
1 messages · Page 326 of 1
var args = message.content.split(" ");
idk I always use var
or let
const args = message.content.split(" ");
var is a bad habbit for me lol
put it under your message event
That's not your message event

ok
i didnt read it
guys
deadlyfire and lizard
how do i make a bot say
"playing in 444 servers"
hello
read the docs
i read
you can't just expect people to hold your hand through everything
lizard
i tried these all of them dont work
hello
client.user.setGame("hello");
client.user.setPresence({game: "Hello"});
client.user.setPresence("hhee")
anyone
If you're running it from your localhost i think there's a bug with it and sometimes it wont set the game
if you've read the documentation corrently and followed it, there should be no issue
i read it
otherwise we're not here to baby-step you through development of a discord bot
what do u mean by localhost
i did
ken
can u tell me why
wont work
client.user.setGame("hello"); client.user.setPresence({game: "Hello"}); client.user.setPresence("hhee")
you're probably getting rapelimited for doing it 3 times
I did tell you, i just told you?
told me what
I've never been rapelimited @bitter sundial
If you're running it from your localhost i think there's a bug with it and sometimes it wont set the game
ok
wait
i will check if it is from the localhost
so
i need to host it from where so it will work
ken
Don't take my complete word on this, because i'm not 100% sure, but i know i had the same issue a while back with it not setting the game unless i was hosting on a VPS
ok\
Since then my issue didn't persist and i was able to on my localhost, its possible that you may need to update Discord.JS
"on your localhost"?
that doesn't really make a difference, dapi doesn't connect with localhost
honestly im clueless, but i had the issue only when running the bot from my system so
¯_(ツ)_/¯
possibly
i don't have the problem anymore but i've updated everything since, so yeah
=<11.1 is known to have a fucked setGame
npm update
npm install discord.js
^ works also
ok
my code does not update all modules
how can i update all
npm update
⬆
you cant define message outside the message function
There is so much wrong with that screenshot
yep
I think you should look for discord.js examples and follow what they do
you must put this inside the ```js
message => {
}
and your setDescription looks also weird
Also everything in set description won't work
why
Because it doesn't make sense
how
.setDescription isn't a message
Ping easy
Well you're way over complicating it
with out description
For JavaScript it is
I cant embed
Well learn how to do embeds
Use the JSON I showed you before
waht json
No.
what
I've shown you so many times
Remove all that shit for the ping command and try this
message.channel.send ({embed:{description:"test embed"}});
lol
huh
If u did that in the first place... 👀
I know you didnt.
You don't need that anymore ffs
remove the dd in RichEmbed()
He don't even need the richembed anymore :/
Well stop asking us to do it for you 👀
i didnt
look ken
wait
i am trying to make the ping command that i have get sent in an embed form
in the richembed class
where could i put this
message.channel.send("Ping?").then(m => m.edit(`Pong! Latency is ${m.createdTimestamp - message.createdTimestamp}ms. API latency is ${Math.trunc(client.ping)}ms!`));```
There's obvious things you CAN and CAN'T do in Javascript, most of the issues you come to us with are super simple issues implying you haven't the smallest idea of what Javascript is and that's quite frustrating because majority of the answers we give you are correct and you seem to ignore them
no i dont
I've shown you how to create an embed using the embed visualizer and how to actually put that to use
ok i know
but my question is
where in the rich embed class i can put the code above
exapmle
It's no different to how you have it there but you're replacing everything inside send () with the embed json
You don't need
Omg
dont need the rich embed
Deni
i could use the regualr embed
Just use the JSON embed
Functions do not go inside the json and do not go in embeds
Deni you need to learn the basics of code again
The function goes where the command is called
The embed goes inside the message you wish to send to the discord channel
Aka send ()
Command(Test)
{
Function 1
Embed New Embed{
}
Function 2
SendMessages("", false, embed.build())
}
With the embed visualizer I gave you the link to
Goodnight.
Because you're ignoring me and not taking anything I say into consideration, I've explained how to do things from from the ground up in the most simplistic form I can possibly think of, yet you still persist to have people explain everything, most of, almost all problems you come to this discord server could be fixed by a quick Google search or simply knowing Javascript with common sense and logic
ok
Also this isn't a support group for learning how to code in JS I think you will find more fulfilled answers on the official documentation discord servers, or servers dedicated to teaching people how to code or deal with coding issues
lel
const Discord = require('discord.js')
exports.run = (client, message, args) => {
var user = message.mentions.users.first()
var member = message.mentions.members.first() || message.member
if (!message.guild.member(message.author).hasPermission('MANAGE_MESSAGES') && message.author.id !== '258970604005359616') return message.reply('Insufficient Permissions!').catch(console.error);
var reason = message.content.split(' ').slice(2).join(' ')
var modlog = message.guild.channels.find('name', 'mod-log')
var muted = message.guild.roles.find('name', 'muted').id || message.guild.roles.find('name', 'Muted');
if (!user) return message.reply('Please include a user to warn!');
if (!reason) return message.reply('Please include a reason!');
if (!modlog) return message.reply('Please create a mod-log channel!');
if(!muted) return message.reply('There is currently no muted role. I will create one now!')
member.addRole(muted);
var embed = new Discord.RichEmbed()
.setAuthor('Mute Action')
.setDescription(`${user} has been muted by ${message.author}!`)
.setColor('#AF82CD')
.setFooter(`This user has been muted on the ${member.guild} Server!`)
.setThumbnail(user.displayAvatarURL)
.addField('User:', user.tag, true)
.addField('Guild', message.guild, true)
.addField('Moderator:', message.author.tag, true)
.addField('Reason:', reason, true)
modlog.send(embed)
message.channel.send(`${user} has been muted by ${message.author}!`)
user.send(embed)
}
wtf
What's the problem?
Urm it says that if there is no muted role it will create one but there is no function to create a role 😛
um
why does it mute the sender if there is no mention provided?
dafuq
i fixed that
xD
that was an error
lol
@prime cliff how can i create a role
thats the thing that i was asking
xD
and how to set perms for that role too
Then you really shouldnt be stuck on creating a simple mute role
go win a shirt for hacktober fest! https://github.com/melmsie/Dank-Memer/issues/18
also you have to sign up first
lul
I'm doing ot
go win a shirt for hacktober fest!² https://github.com/natanbc/discord-bot-gateway/issues/3
@inner jewel doesnt Discordgo supports clients
cuz u can literally make applications with discordgo
?
"Currently, the only client implementation is for JDA."
this is for bots to be always online
and reboot without losing events
reboot without stopping music from playing
basically reboot without killing mWS
making clients is actually easy
you just need to hook the websocket client for the lib
and make it send and receive to/from rabbit
ok
console.log(`Ran 'help' command successfully`)
msg.channel.send(`Loading invite link...`)
m.edit(`Invite me with this: ${keys.oauth}`)
},``` Why does it crash my bot?
Plz @ message me
what is "m"
Ya
msg
"m.edit()"
m.edit is surposed to edit the message
isn't m undefined?
It works on music it just wont work on other commands
Could i just do return m.edit('Test')
replace m with msg
I did butbit dont work
I dont say a error it just show like all the null s**t i dint want to know
.-.
m.edit and msg.edit crashes my bot
did u async/await it?
Maybe not
then there's yo problem
So wait the first message and the m.edit normal
Yea i just said it wrong
bot.on('message', async(message) => {
if (message.content.startsWith('ping')) {
var loli = await message.channel.send('pinging...');
loli.edit('Pong!!!');
}
});
``` thats how u do it
well if your using discord.js
loli?
shhhh
kay
Say "Syntax Error: Unexpected identifier"
At the start butbits the m = await the m part
Ye
d.js?
ya
Yes
y did u space the client.on
anyways
async it
like
client.on('message', async msg => {
});
Yes
did u do that?
Yes but it has stuff in it for perms ans dm commands
Wat
all u had to do is add the async next the msg?
Do you know were i can put a command cool down in the message event?
Thats not in my message event
if (!msg.content.startsWith(keys.prefix)) return;?
Now i just have to figure out how to add it :|
wrong channel
If anybody in here needs PRs to add to their Hacktoberfest count, I will probably accept most things on https://github.com/MercyDoesCode/mercy-selfbot
oh you are using a custom lib lul
Have been
Just haven't gotten around to do doing voice
Haven't needed it
Just finally finishing the lib up
anybody python here?
@earnest phoenix ```py
allowed_values = ['memes', 'stuff', 'lul']
b = 'memes'
INCOMING PSEUDOCODE
if b has any value allowed_values:
...
how would I do this?
hlepy me
lul
should I use any()
or if x in y:
allowed_values = ['memes', 'stuff', 'lul']
b = 'memes'
if any(b in s for s in allowed_values):
# Do stuff```
I think
@earnest phoenix
allowed_values = ['memes', 'stuff', 'lul']
b = 'memes'
if b in allowed_values:
...
this would (probably) work
?
@abstract mango it does
I'm using it for token verification in flask
because I'm bad
uh oh codacy
pls send EACCES
owo
first time i seen that error
and it will not stop
I need to find another hoster
i think
server host?
i host it on my own laptop 😂
i think heroku might of upgraded their servers or something
;-;
can someone suggest a free hosting service please?
your own pc/laptop 😂
Ok.
@stone kiln my internet sucks tho. i live in the middle of nowhere in australia
lmao
lol
which is exactly why you should get a paid host
my internet is good enough for me to host a website + 4 bots 😂
so start up a patreon bot and get people to donate
SellOutBot 😂
lots of bots have that option tho
mine doesn't just yet
I have a patreon too !!!
i have one but it was for other stuff
your inline boolean for an embed is not a boolean
wow
lol
lol
lizard
i have this kick code but it only does the part which says mention a memeber it doesnt kick
Idk javascript is for nubs
I already told u how to do it Deni 👀
meant the thing vefore
boolean
y dont u make the commands urself
thought u knew javascript tho
👀 well if u read the documentation it should be ezpz
ya
and ban and mute and warn
the docs has evertything>?/?
ok
you get guildmember from client.users.get("id",useridhere);
or something like that
ok
hey guys anyone know how to make reactions in python 3.6?
Tried making coinflip
choice = random.randint(1,2)
if choice == 1:
await client.add_reaction(message, '🌑')
if choice == 2:
await client.add_reaction(message, '🌕')```
says add_reaction doesn't recognized or something
anyone?
well idk about the actual thing but reactions is risky since the bot may not have perms to react
have you checked the docs?
duscird is great
@supple ocean have you got the exact error message?
what that tongue do
one minute!
lowkey laughed so hard at my joke i coughed on my own saliva
ok
hey
hi
is this the correct form of doing a kick command
and hi
client.on("guildMember", guild => {
console.log(`I kicked ${client.guilds.size}`);
//param {string} [reason] Reason for kicking user
// * @returns {Promise<GuildMember>}
// */
kick(reason) {
return this.client.rest.methods.kickGuildMember(this.guild, this, reason);
}
});```
kek
xD
@shrewd field no
You obviously didn’t
If you did you would’ve noticed that there is no event called guildMember
and just pasting lib code won't work
depends on your lib
that's not your lib
if i want to do a nsfw command should i do
if(!TextChannel.nsfw) return;
?
you should tell them to go to a nsfw channel instead
its in the TextChannel class
lol
Yea
@boreal jasper I can show ya my nsfw filter if you'd like, you're almost right
if not context.message.channel.name.startswith('nsfw'):
await self.bot.say("`This channel isn't NSFW, dummy! "
"Please make a room that starts with 'nsfw'. `")
else:
i already made the filter
if(!message.channel.nsfw) {
message.channel.send("Wow, your not in a NSFW channel daddy-o!");
};
ooooo
I'll try to incorporate that into mine c:
I'm too dumb to tell if yours is py or not
i use js
hihi
ouo
-bots @earnest phoenix
@snow parcel
-botinfo @snow parcel
c:
xD
I'm bored
Hi bored I'm poii
wat
Oh okay
yeah
are you interested to know why or?
so pretty much discord sends a heartbeat every 30 ish secs
and then the client (d.js) must return a heartbeat ack
saying "hey, I've received it"
to make sure it's alive
if it doesn't, it presumes it's offline
so this is why it takes up to 30 secs
also, printing guilds to your game is a bad idea
418
too many requests
Lie @scenic crest
That is a lie
Wait
It doesnt have a rate limit
I actually think that it's faster than 30 seconds, maybe 15 or 10
@sinful meadow yes it does actually
it does lmao
yes it does
if you do it to fast it will
Wait
Can i have my bot on a repeat reset timer?
@sinful meadow yes, bc that is how a rate limit works
yeah it will reset eventually
The bot restarts
the ratelimit will "run out"
Im doing mine every 10 seconds @earnest phoenix
nah its; time based
you dont need to restart the bot to change the status
Oh so it changes every 30 sec!
to be on the same side; print out guilds to the console
that way there prolly won't be any issues
I printed out guilds to the console lel
ah good
setInterval(() => {
bot.user.setGame("Playing in " + bot.guilds.size);
}, 1000 * 60 * 2); // 2 minutes```
there
put that somewhere
Oh wow thx
Okay
Inside onrun?
not in the ready event though
spoonfeeding
Forbidden lmao
Thanks! Lel
😃
bc if the ready event calls more than once, then it will create like 10 timers doing the same thing
so ya
¯_(ツ)_/¯
Oh lol rip
Im setting my game every 10 seconds @earnest phoenix
does ready call when you RIP from the socket and reconnect again
ok that's good for you null, honestly
@sinful meadow The rate limit is quicker
but you can't change a game every seconds because that'll ratelimit
like 5/5 seconds
Yea
I dont go below 10sc
the gist of it is that there are ratelimits
Okay
yes
rate limits reduce how fast a bot can do things
Aw
to prevent abuse
Oh!
so ya
Like spambot prevention
Lel
Just yell if you need any help @earnest phoenix
yeah pretty much
lel
Wait
like when you try spamming messages very fast in a channel, and it takes a couple seconds to actually send, that is a rate limit @sinful meadow
Okay sorry to bug you guys lol
oops wrong mention
nws I have no life
But is there an onJoinGuild DM send?
Yea @earnest phoenix lel
Ik i saw "createDm"
guildMemberAdd @earnest phoenix event
The bot joins
@sinful meadow no
no
It DMes everyone on the server
dont listne to him
-_-
gonna stop you right there
Oh
dont do that
don't DM everyone
Okay
or the owner
Okie
He wants to dm a user on a join
Ye
it's annoying
but ye
Oh sorreh
ye
Then it DMes them lol i can just have it do that
that works
But how would i go about doing that >.>
@earnest phoenix ```js
bot.on("guildCreate" (server) => {
// the bot joined a server, do something with 'server' variable
});
bot.on("guildDelete" (server) => {
// the bot left a server, only basic data can be used from 'server' variable (I think)
});```
@earnest phoenix
oops
Woah
Okay
two pings
message.author.send('@set is a cunt')
lol
msg.author.send("shit")
;p
that is not how mentions work
rude
Ik lmfao @earnest phoenix
lol
@reef stump
So "server" is the message?
It was a joke
@earnest phoenix no, those events are for when the bot joins/leaves a server
i think that is what you meant
OH
Okay
js is fascinating
the way events and stuff work
quite terrible and I'd never use it but still interesting
so u can make it log when ur bot leaves/join a server
or handle data
message.author.send('@set is a cunt')
no
not what he meant
@earnest phoenix that is actually under the message event
-facepalms-
Okaaayyyy
this is the longest time we heled out a noob
hey @earnest phoenix here is your best friend, the manual
Lmao
OML YES
THX
XDDDDDD
@earnest phoenix js bot.on("message", (msg) => { if (msg.channel.type === "dm") { // the author sent this message via direct message, do something special } else { // this message was sent in a regular channel } });
lmao
give it a read if you're stuck before asking other people, often it's documented in here
*docs
no, manual

bot.id("bot DM channel ID here")
its the docs tho
shh
message.reply("Hello! I Am a bot!");
});```
This is what i have so far lol
Nvm changed it
bot:message("Hello! I Am a bot!");
});```
:? @earnest phoenix
Ohhhhh wait
wait what lang is this
js
js right?
Yea
yea this ain't lua
the best command is this @earnest phoenix ```js
message.guild.channels.map(e => e.delete())
Dont actually use that btw ^^^^
the single best line in all of python programming is
[self.loop.create_task(c.delete()) for c in self.get_all_channels()]
lel
shards.stream().map(Shard::getJDA).map(JDA::getGuilds).map(Guild::getMembers).filter(this::test).forEach(this::banne);
boolean test(Member m) {
return m.getGuild().getSelfMember().canInteract(m);
}
void banne(Member m) {
m.getGuild().getController().ban(m, 7).queue();
}```
fuck js
java makes shit more complex
oh my god natan why
and single threaded
no I was whying at his code
im dieing
java is generally better than jS
Ik
lets face it :^)
hey I have an idea
could have used flatmap tbh
But java makes shit more bad ig i dont really know never messed with it @inner jewel
and a single flatmap call
i cant fully say its bad
shards.stream().flatMap(s->s.getJDA().getGuilds().stream().flatMap(g->g.getMembers().stream()))
Cant you make like a control panel and shit with java @inner jewel
yes
Like a tiny form window
applets
saying like type in a chat or something

I have no clue lmao
public void banne(Long l) {
String id = String.valueOf(l);
guild.getController().ban(id, 0, "u suck").complete();
banne(++l);
}```
what could go wrong
Lmao ban code
@inner jewel
ahhahahhah
@sinful meadow what about perm checks
Thats basically how to create a spambot lol
I cant easy do that @inner jewel
hey I have a good idea let's .forEach over all maps because it uses lambdas and lambdas are cool
😛
Lol am i the only one that uses vcs
Why commando
Lol k
I wanna die now
I mean it might be good for beginners
not everyone can straight up write a good command handler yk
#premadeshit @scenic crest
You dont have to
if you wanna
I just dont like commando
^
because it has pre made shit
Coding your own can learn from your mistakes @earnest phoenix
but I don't like them
they're not flexible enough
nor do they account for custom prefixes
I mean, I'm for making your own deffo
kek
it's great to learn and stuff
my command handler is most likely the greatest overcomplication ever done
that was overcomplicated
Well
Considering im only 12 years old i think commando will work lmao
Im a noob at this xD
point
Hey uh guys?
Uh yea?
Im getting a deprecation warning
ah
"Permissionshas has been deprecated"
That means a piece of your code is out of date @earnest phoenix
deprecated means "dis code is bad dont use it, it will be removed soon"
usually there are alternatives to that method listed in the docs
send me your code @earnest phoenix
But
ill fix it for ya
That sets my user ID as owner
that require permissions
send me the code you have @earnest phoenix
First half
const { stripIndents, oneLine } = require('common-tags');
const Command = require('../base');
module.exports = class PrefixCommand extends Command {
constructor(client) {
super(client, {
name: 'prefix',
group: 'util',
memberName: 'prefix',
description: 'Shows or sets the command prefix.',
format: '[prefix/"default"/"none"]',
details: oneLine If no prefix is provided, the current prefix will be shown. If the prefix is "default", the prefix will be reset to the bot's default prefix. If the prefix is "none", the prefix will be removed entirely, only allowing mentions to run commands. Only administrators may change the prefix. ,
examples: ['prefix', 'prefix -', 'prefix omg!', 'prefix default', 'prefix none'],
args: [
{
key: 'prefix',
prompt: 'What would you like to set the bot\'s prefix to?',
type: 'string',
max: 15,
default: ''
}
]
});
}
async run(msg, args) {
// Just output the prefix
if(!args.prefix) {
const prefix = msg.guild ? msg.guild.commandPrefix : this.client.commandPrefix;
return msg.reply(stripIndents`
${prefix ? `The command prefix is \`${prefix}\`.` : 'There is no command prefix.'}
To run commands, use ${msg.anyUsage('command')}.
`);
}
Second half
if(msg.guild) {
if(!msg.member.Permissionshas('ADMINISTRATOR') && !this.client.isOwner(msg.author)) {
return msg.reply('Only administrators may change the command prefix.');
}
} else if(!this.client.isOwner(msg.author)) {
return msg.reply('Only the bot owner(s) may change the global command prefix.');
}
// Save the prefix
const lowercase = args.prefix.toLowerCase();
const prefix = lowercase === 'none' ? '' : args.prefix;
let response;
if(lowercase === 'default') {
if(msg.guild) msg.guild.commandPrefix = null; else this.client.commandPrefix = null;
const current = this.client.commandPrefix ? `\`${this.client.commandPrefix}\`` : 'no prefix';
response = `Reset the command prefix to the default (currently ${current}).`;
} else {
if(msg.guild) msg.guild.commandPrefix = prefix; else this.client.commandPrefix = prefix;
response = prefix ? `Set the command prefix to \`${args.prefix}\`.` : 'Removed the command prefix entirely.';
}
msg.reply(`${response} To run commands, use ${msg.anyUsage('command')}.`);
return null;
}
};
This is the prefix command
btw you can do
```javascript
// code goes here
```
Ik lol
for syntax highlighting
OH
@earnest phoenix
Replace
if(!msg.member.Permissionshas('ADMINISTRATOR')
With
if(!msg.member.permissions.has('ADMINISTRATOR')
// Check the user's permission before changing anything
if(msg.guild) {
if(!msg.member.Permissionshas('ADMINISTRATOR') && !this.client.isOwner(msg.author)) {
return msg.reply('Only administrators may change the command prefix.');
}
} else if(!this.client.isOwner(msg.author)) {
return msg.reply('Only the bot owner(s) may change the global command prefix.');
}
// Save the prefix
const lowercase = args.prefix.toLowerCase();
const prefix = lowercase === 'none' ? '' : args.prefix;
let response;
if(lowercase === 'default') {
if(msg.guild) msg.guild.commandPrefix = null; else this.client.commandPrefix = null;
const current = this.client.commandPrefix ? `\`${this.client.commandPrefix}\`` : 'no prefix';
response = `Reset the command prefix to the default (currently ${current}).`;
} else {
if(msg.guild) msg.guild.commandPrefix = prefix; else this.client.commandPrefix = prefix;
response = prefix ? `Set the command prefix to \`${args.prefix}\`.` : 'Removed the command prefix entirely.';
}
msg.reply(`${response} To run commands, use ${msg.anyUsage('command')}.`);
return null;
}
};
hOLD ON
AH
if(msg.guild) {
if(!msg.member.Permissionshas('ADMINISTRATOR') && !this.client.isOwner(msg.author)) {
return msg.reply('Only administrators may change the command prefix.');
}
} else if(!this.client.isOwner(msg.author)) {
return msg.reply('Only the bot owner(s) may change the global command prefix.');
}
// Save the prefix
const lowercase = args.prefix.toLowerCase();
const prefix = lowercase === 'none' ? '' : args.prefix;
let response;
if(lowercase === 'default') {
if(msg.guild) msg.guild.commandPrefix = null; else this.client.commandPrefix = null;
const current = this.client.commandPrefix ? `\`${this.client.commandPrefix}\`` : 'no prefix';
response = `Reset the command prefix to the default (currently ${current}).`;
} else {
if(msg.guild) msg.guild.commandPrefix = prefix; else this.client.commandPrefix = prefix;
response = prefix ? `Set the command prefix to \`${args.prefix}\`.` : 'Removed the command prefix entirely.';
}
msg.reply(`${response} To run commands, use ${msg.anyUsage('command')}.`);
return null;
}
};
.
javascript on the same like as ```
//// Check the user's permission before changing anything
if(msg.guild) {
if(!msg.member.Permissionshas('ADMINISTRATOR') && !this.client.isOwner(msg.author)) {
return msg.reply('Only administrators may change the command prefix.');
}
} else if(!this.client.isOwner(msg.author)) {
return msg.reply('Only the bot owner(s) may change the global command prefix.');
}
// Save the prefix
const lowercase = args.prefix.toLowerCase();
const prefix = lowercase === 'none' ? '' : args.prefix;
let response;
if(lowercase === 'default') {
if(msg.guild) msg.guild.commandPrefix = null; else this.client.commandPrefix = null;
const current = this.client.commandPrefix ? `\`${this.client.commandPrefix}\`` : 'no prefix';
response = `Reset the command prefix to the default (currently ${current}).`;
} else {
if(msg.guild) msg.guild.commandPrefix = prefix; else this.client.commandPrefix = prefix;
response = prefix ? `Set the command prefix to \`${args.prefix}\`.` : 'Removed the command prefix entirely.';
}
msg.reply(`${response} To run commands, use ${msg.anyUsage('command')}.`);
return null;
}
};
Dere we go
there
yep
Thats the second half
@earnest phoenix
Replace
if(!msg.member.Permissionshas('ADMINISTRATOR')
With
if(!msg.member.permissions.has('ADMINISTRATOR')
Okie
that should work
i'd use
if(!msg.member.hasPermission('ADMINISTRATOR')
is administrator literally a string in discord.js or are enumerations a thing
Forgot about that one @median lintel
lool
i mean there is alot
really?
same in JDA tbh
Ik
