#development

1 messages Ā· Page 8 of 1

lone wing
#

What buttons should I use instead?

iron vector
#

can i add these below buttons to it v12 version from glitch

hard wraith
#

Then why is @ancient nova breaking the code at 10 šŸ˜‚

earnest phoenix
hard wraith
#

You have have 20 buttons…

iron vector
boreal iron
#

I mean if you can dream it, you can do it

hard wraith
#

DJs has modals now… am I stupid or didn’t they also add text input boxes?

wheat mesa
#

he's using v5.2.0 it seems

sudden geyser
lone wing
#

how strict are the requirements to get on top.gg

sudden geyser
#

looks good and cool

earnest phoenix
boreal iron
#

They are around for a while already

ancient nova
solemn latch
ancient nova
#

add my bot and see how my system works

hard wraith
lone wing
#

oh oops

#

i have time to fix this right?

boreal iron
#

lol

stuck dawn
#

how can i filter a key and then set a style for that word a sentence and then return it? (sorry for your eyes i tried this way cause i don't know how i can do it)

earnest phoenix
#

Discord bot developers on their way to use the oldest versions of the dependencies they use

boreal iron
ancient nova
#

if I have
resolvedKey.length which returns say 20?
how I split it into 2 pages 10 and 20?

wheat mesa
#

cough npm update cough

lament rock
#

Djs voice uses ffmpeg-static v4 when v5 exists

#

:((

lyric mountain
#

when embeds unbug, align the text to the right so u have a literal calculator

earnest phoenix
lament rock
#

My current PR to fix thread locking is still being bitched about iirc

eternal osprey
#

hey is that webhook url really needed or would the following code still works with only using the authorization key:

const Topgg = require("@top-gg/sdk")
const express = require("express")

const app = express()

const webhook = new Topgg.Webhook("auth")

app.post("/dblwebhook", webhook.listener(vote => {
    console.log(vote)

app.listen(80)
wheat mesa
#

For a command I used to list guilds, I did something more like this: ```ts
const MAX_LENGTH = 8;
let page = 0;
let offset = MAX_LENGTH * page;

let data: string[] = [];
let totalMembers = 0;
let totalServers = 0;

const cc = payload.commandClient;

for (const cclient of (payload.client.cluster as ClusterClient).shards.values()) {
  for (const guild of cclient.guilds.values()) {
    data.push(`${guild.name} | ${guild.memberCount} Members`);
    totalMembers += guild.memberCount;
    totalServers++;
  }
}

let totalPageCount = Math.ceil(data.length / MAX_LENGTH);
hard wraith
#

Am I stupid or should I make it possible for the person testing my bot to have access to my test join and test leave command?

solemn latch
#

If its dev only we don't need to test it

hard wraith
#

Ok

earnest phoenix
ancient nova
eternal osprey
hard wraith
#

The issue is I was also gonna get it to work to trigger the stripe command with a test user to show it working as if you had an account when you don’t šŸ˜‚

wheat mesa
#

you have to limit it at something unless you want to make it more complex

ancient nova
lament rock
earnest phoenix
#

Without it, Top.gg isn't gonna magically guess where it's supposed to send the data

eternal osprey
#
const Topgg = require("@top-gg/sdk")
const express = require("express")

const app = express()

const webhook = new Topgg.Webhook("auth")

app.post("/dblwebhook", webhook.listener(vote => {
    console.log(vote)

app.listen(80)```doesn't this code already create a suitable server?
earnest phoenix
#

That just listens to the webhook requests

wheat mesa
# ancient nova 10

Then you can calculate the amount of pages you need by doing ```js
const MAX_LENGTH = 10;
const pageCount = Math.ceil(myLength / MAX_LENGTH);

ancient nova
#

how does it work exactly?

wheat mesa
#

Math.ceil takes any decimal and rounds it up to the whole number above it

lament rock
#

Math.floor rounds down and ceil is just short for ceiling, so it's the opposite of floor

wheat mesa
#

^

#

For pages you always want to round up otherwise you'll cut off some objects

eternal osprey
#
const Topgg = require("@top-gg/sdk")
const express = require("express")
const app = express()
const webhook = new Topgg.Webhook("your webhook auth")
app.use(bodyParser.json())
app.get('/', (req, res) => {
    console.log(req.body) 
    res.status(200).end() 
  })
app.post("/dblwebhook", webhook.listener(vote => {
    console.log(vote)
})

app.listen(3000, () => console.log(`Server running on port 3000`))
```I finished up the code, now the server would be online at localhost:3000 right?
lament rock
#

This could also be helpful

earnest phoenix
wheat mesa
earnest phoenix
#

The webhook URL in this case should look like http://<your IP address>:<your port>/dblwebhook

eternal osprey
lament rock
wheat mesa
#

this is the only real import fuckery I've done, it's nothing special

#

because you can't just export a json file straight out of a barrel file for some reason

lament rock
#

you can import json no problem, just need to type it

wheat mesa
#

yeah I just wanted to export it under a central name

lament rock
#

I just assign config to a passthrough

#

no need to reimport all the time

wheat mesa
#

I like using constants almost like it's a static class since it's easier to read for me

lament rock
#

You'd like C# more

wheat mesa
#

I do like C# quite a bit

#

Definitely in the most loved languages for me

lament rock
#

I'm just now getting into Cpp with unreal engine. Trying to make a VR game to replace VRChat since that shit just tanked

ancient nova
#

okay now I have page 2 of 30 items if there is 10 per page
how do I display only the 10 from page 2 if i have them all in a single map?

wheat mesa
#

In order, my favorites are Rust, C#, Typescript, and Java

digital swan
wheat mesa
#

that sounds unnecessary

lyric mountain
#

(postgres) is there any penalty for having varchar higher than 255?

boreal iron
#

death

wheat mesa
#

I don't think so

#

but don't quote me on that

boreal iron
#

Why don’t u use text then?

wheat mesa
#

yeah I'd just use text at that point

ancient nova
#

how should I do that guys?

boreal iron
#

I mean you edit the structure and try 500 for example

ancient nova
#

I keep confusing myself

boreal iron
#

Either there’s an error or not

lyric mountain
#

text is a bit too overkill

wheat mesa
#

Yeah you shouldn't have any issues with varchar from what i'm reading

boreal iron
#

I hope you don’t wanna use it as index

ancient nova
#

how do I remove all fields from an embed when editing it?

boreal iron
#

If not text wouldn’t be an issue, too

wheat mesa
#

@lyric mountain varchar can handle 16 bit ints as n, up to 65535 bytes

boreal iron
#

I think it was null

wheat mesa
#

so you'll be just fine with 300 or so

ancient nova
#

but I've made a loop of addField will that remove them all?

boreal iron
#

Huh wut?

#

You don’t need a loop

#

You asked how to remove all fields of an embed when editing it

#

<embed>.fields = null;

wheat mesa
#

my paginator was slightly large because I did this in an un-optimal way

#

and I was lazy

#

(I'm aware you can't read it btw)

#

Too small text

boreal iron
#

Tf is that solution

#

Can’t even zoom in

wheat mesa
#

I wrote this a while ago with erwin's help

#

This was before detritus really supported the run prop on components

#

nowadays this would be incredibly easy

hard wraith
#

ā€œThe webhook for my bot votes isn’t workingā€
They never passed in a webhook endpoint irl or authorisation key to the top.gg page on their bot…

#

🤦

ancient nova
#
        for (i = 0; i < resolvedKey.length; i++) {
            if (i >= 10) break;
            warningsEmbed.addField(`WARN ${i + 1} (ID: ${resolvedKey[i]})`, `${resolvedValue[i].slice(0, 512) || "Couldn't resolve value."}`);
        }
``` should I now keep working with this loop? I need to find a way to display page 0 = first 0, page 1 = everything after 10 up to 30 and so on
#

gotta find a way to make this modular

boreal iron
wheat mesa
#

also you probably want to be doing for(let i = 0; ...)

ancient nova
#

oh I forgot javascript doesn't auto assing variables

hard wraith
ancient nova
#

anyway then what should I do?

hard wraith
#

It says to include it in the docs.

boreal iron
# hard wraith Ed but recommended.

Because you think somebody could send webhooks with the data structure like topgg without malicious code inside, since you parse the data anyways?!

hard wraith
ancient nova
#
                if (i.customId === "backwardsBtn") {
                    if (currentPage === 0) {
                        await replyOrFollowUp(i, { content: `${i.user.tag} you can't go further backwards.`, ephemeral: true });
                    } else {
                        // Remove one from the page and remove all of the old fields.
                        currentPage -= 1; warningsEmbed.fields = null;
                        
                        // Update embed.
                        warningsEmbed.setFooter({ text: `Page ${currentPage} out of ${maxPages}`});
                        for (let i = 0; i < resolvedKey.length; i++) {
                            // We are breaking if the length is over 10 as to not go over discord's char limit.
                            if (Math.ceil(resolvedKey.length / 10 * currentPage)) {
                                warningsEmbed.addField(`WARN ${i + 1} (ID: ${resolvedKey[i]})`, `${resolvedValue[i].slice(0, 512) || "Couldn't resolve value."}`);
                            }
                        }
                        
                        // Send the updated embed.
                        m.edit({ 
                            embeds: [warningsEmbed], 
                            components: [ new MessageActionRow().addComponents(backwardsButton, forwardsButton) ] 
                        });
                    }
                };
``` something like this maybe?
lyric mountain
#

then there's groovy ```groovy
resolvedKey.length.each {
// "it" is your iterator, it's already assigned, have fun
}

boreal iron
#

You can leave the authorization password empty

#

As well as in your code if you use the sdk

hard wraith
#

Ah ok

#

Well they still need the ip that it’s listening on put into the webhook url.

boreal iron
#

If not the sdk checks if the authorization header matches your input

cursive musk
#

can someone help me with this error?

npm ERR! path /Users/allaboutishaan/Documents/Any-Bot/node_modules/youtube-dl-exec

Been trying to fix it for ages, I don't even have youtube-dl-exec mentioned anywhere in the code

boreal iron
#

If both are empty nothing will be validated

hard wraith
#

Meh true…

boreal iron
hard wraith
#

The php one for my server needs it because it’s a common webhook endpoint for my company.

boreal iron
#

I mean you either read the headers or not

#

If not you don’t need to check the authorization header

#

Like I said there’s no real need of it

hard wraith
#

Yeah but because of my company policies under a lot of legislation I have to authenticate that each webhook request received is from who it’s meant to be from.

#

And it’s best practice.

#

Who taught you how to make a webhook endpoint? You cover 0 security with your method…

boreal iron
#

Best practice never is a restriction on the application layer but already on the network layer

#

I would restrict incoming requests only to the topgg IP

hard wraith
#

I can’t

#

That webhook server is the server that runs my custom api.

#

Well the public one…

boreal iron
#

That wasn’t specifically meant for your case

hard wraith
#

Always follow best practices..

#

Especially around endpoint security.

boreal iron
#

But in general calling the app layer restriction as best practice without restricting the access on the network layer was wrong

ancient nova
#

almost works idk

boreal iron
#

But if you can’t then you can’t of course

hard wraith
#

Yes but you can have two webhooks to the same endpoint from top.gg then you can use differing auth keys for each. So when it makes a server vote request it passes the auth key, and it that doesn’t match server vote it rejects.

boreal iron
hard wraith
#

It’s just multi stage error prevention šŸ˜‚

hard wraith
ancient nova
#
            // If someone presse the button, this event will activate.
            collector.on("collect", async i => {
                if (i.customId === "backwardsBtn") {
                    if (currentPage === 1) {
                        await replyOrFollowUp(i, { content: `${i.user.tag} you can't go further backwards.`, ephemeral: true });
                    } else {
                        // Remove one from the page and remove all of the old fields.
                        currentPage -= 1; warningsEmbed.fields = null;
                        
                        // Update embed.
                        warningsEmbed.setFooter({ text: `Page ${currentPage} out of ${maxPages}`});
                        for (let i = 0; i < resolvedKey.length; i++) {
                            // We are breaking if the length is over 10 as to not go over discord's char limit.
                            if (Math.ceil(resolvedKey.length / (10 * currentPage)) === currentPage) {
                                warningsEmbed.addField(`WARN ${i + 1} (ID: ${resolvedKey[i]})`, `${resolvedValue[i].slice(0, 512) || "Couldn't resolve value."}`);
                            }
                        }
                        
                        // Send the updated embed and update the user.
                        await replyOrFollowUp(i, { content: `${i.user.tag} your embed has been updated.`, ephemeral: true });
                        m.edit({ 
                            embeds: [warningsEmbed], 
                            components: [ new MessageActionRow().addComponents(backwardsButton, forwardsButton) ] 
                        });
                    }
                }; if (i.customId === "forwardsBtn") {
                    if (currentPage >= maxPages) {
                        await replyOrFollowUp(i, { content: `${i.user.tag} you can't go further forwards.`, ephemeral: true });
                    } else {
                        // Remove one from the page and remove all of the old fields.
                        currentPage += 1; warningsEmbed.fields = null;
                        
                        // Update embed.
                        warningsEmbed.setFooter({ text: `Page ${currentPage} out of ${maxPages}`});
                        for (let i = 0; i < resolvedKey.length; i++) {
                            // We are breaking if the length is over 10 as to not go over discord's char limit.
                            if (Math.ceil(resolvedKey.length / (10 * currentPage)) === currentPage) {
                                warningsEmbed.addField(`WARN ${i + 1} (ID: ${resolvedKey[i]})`, `${resolvedValue[i].slice(0, 512) || "Couldn't resolve value."}`);
                            }
                        }
                        
                        // Send the updated embed and update the user.
                        await replyOrFollowUp(i, { content: `${i.user.tag} your embed has been updated.`, ephemeral: true });
                        m.edit({ 
                            embeds: [warningsEmbed], 
                            components: [ new MessageActionRow().addComponents(backwardsButton, forwardsButton) ] 
                        });
                    }
                }
            }); collector.on("end", async i => {
                m.edit({ 
                    embeds: [warningsEmbed], 
                    components: [] 
                });
            });
``` anyone know why it doesn't display the seond page?
wheat mesa
#

wow just spent 15 minutes debugging my fucking database just to find out that my auth wasn't working because for some reason my linter is replacing _ with * in my env file

boreal iron
#

Well it’s not djs but the fact he doesn’t really understand how interactions are properly used and responded to

#

Continuously using collectors instead of utilizing the event

hard wraith
wheat mesa
#

There's no autocorrect

reef berry
#

hi i can add html tags in my bot page?

wheat mesa
#

I've never had this issue with prettier before

boreal iron
ancient nova
#

the buttons fully work

reef berry
hard wraith
boreal iron
#

No you can’t use JS

#

Html and css will be parsed

boreal iron
reef berry
boreal iron
#

By adding your code into the description

reef berry
#

I know html, but I don't know how to add a tag inside another tag

boreal iron
#

Without html, head and body tags

hard wraith
#

I spent 4 hours doing just that lol

ancient nova
boreal iron
#

Into the description

reef berry
boreal iron
#

What don’t u understand?

hard wraith
boreal iron
#

You simply insert your code as I already mentioned

hard wraith
#

LITERALLY!

boreal iron
#

Into the description

#

3rd time now

hard wraith
#
<h1>Title</h1>
<h2>Subtitle</h2>
<p>Paragraph</p>
boreal iron
#

Css code has to be placed into style tags

#

That’s it

hard wraith
#

just put like that into the description. Like sheesh.

#

no really

ancient nova
#

ERROR Unhandled rejection: TypeError: Cannot read properties of null (reading 'push')

                        for (let i = 0; i < resolvedKey.length; i++) {
                            // We are breaking if the length is over 10 as to not go over discord's char limit.
                            if ((Math.ceil(resolvedKey.length / (10 * currentPage)) + 1) === currentPage) {
                                warningsEmbed.addField(`WARN ${i + 1} (ID: ${resolvedKey[i]})`, `${resolvedValue[i].slice(0, 512) || "Couldn't resolve value."}`);
                            }
                        }
``` push? where?
hard wraith
#

you could do ```html
<style>
.red {
color: red;
}
</style>
<p class="red">This is red</p>

reef berry
#

I said I know how to edit css and add an html tag, but I don't know how to add inside a tag

boreal iron
#

Well we can’t help you to learn simply html

#

That’s your part

wheat mesa
#

how many characters should I make snowflakes, I know they grow infinitely but there's a point where we will all die before I run out of characters

hard wraith
wheat mesa
#

(Doing this for database simplicity reasons, I don't want to be casting from string to bigint all the time and such)

#

although bigint is probably a lot more efficient

boreal iron
#

It is

#

You can simply tell your pool connection to return strings for bigints

#

So you don’t have to convert them

wheat mesa
#

the other way around is the problem

boreal iron
#

Just pass strings? The database converts them to bigints automatically

wheat mesa
#

It does?

hard wraith
boreal iron
#

Of course

hard wraith
#

🤣

ancient nova
#

so I can't do embed.addField after doing embed.fields = null;

#

who tf told me to do that

wheat mesa
#

alright it works

boreal iron
#

As well as converting true or false for example to the right tinyint case

hard wraith
boreal iron
#

Since it’s a synonym of boolean

ancient nova
#

no I haven't

wheat mesa
#

easy enough

reef berry
#

I know css & html

boreal iron
#

As we learned a while ago

digital swan
boreal iron
#

That’s all

wheat mesa
#

I'm sure it'll try to fuck me if it's not a bigint, but that's my job to prevent anyways

boreal iron
#

Without html, head and body tags

hard wraith
wheat mesa
#

It'll be guaranteed to be a user id anyways C:

eternal osprey
#
const Topgg = require("@top-gg/sdk")
const express = require("express")

const app = express()

const webhook = new Topgg.Webhook("myauth")
app.get('/', (req, res) => {
    console.log(req.body) 
    res.status(200).end() 
  })

app.post("/dblwebhook", webhook.listener(vote => {
    console.log(vote)


app.listen(3000, () => console.log(`ðŸŔ€ Server running on port 3000`))

    
}); 
```Why didn't it console.log(vote) after I voted? (Webhook url is localhost:3000)
#

I made sure the webhook url and auth code is set right

boreal iron
hard wraith
boreal iron
#

It will be converted

eternal osprey
hard wraith
boreal iron
#

SQL is more clever than u think waffle

eternal osprey
hard wraith
#

hmm

#

oh ffs...

#

add /dblwebhook to the end of the url on the top.gg page @eternal osprey

boreal iron
#

On a server or at home?

eternal osprey
wheat mesa
#

wonderful

boreal iron
eternal osprey
#

I see fuck

wheat mesa
eternal osprey
#

should be ip forwarded?

hard wraith
wheat mesa
#

which is why I make typeorm do the work for me

boreal iron
hard wraith
#

you can get that by opening command prompt and typing ipconfig and copying your ipv4 address

eternal osprey
#

Any other way to test without using the ports of my vps?

boreal iron
#

So forget about it

hard wraith
#

You heard of heroku?

boreal iron
#

I doubt you have a proper firewall in case you would need to configure

#

No literally no issue over there

#

To receive incoming requests

hard wraith
#

lmao

boreal iron
#

There’s no difference to a virtual server except your provider puts one in place

wheat mesa
#

Anyone know how long I should cache db users for? The likelihood is that there will be a query to update a user nearly every command sent

boreal iron
#

Which you can disable or configure in the UI

hard wraith
#

no I mean not everyone has a server!

wheat mesa
#

I'm thinking maybe a 1 or 2 hour cache

#

But that might be a little much

ancient nova
#

kinda?

wheat mesa
#

that's annoying

boreal iron
hard wraith
#

Oh no you have to use vps ports lol

wheat mesa
hard wraith
#

Listeners always have to be on a port.

wheat mesa
#

whatever djs's equivalent is

hard wraith
#

if you did interaction.differ() that is

wheat mesa
#

That's not what I'm talking about

boreal iron
#

editReply()

hard wraith
#

You added defferred...

#

that only works on a reply deffer

wheat mesa
#

There's different types of interaction deferrals, that one is specifically for updating a previous reply

pearl trail
#

int.deferUpdate() for rows etc

hard wraith
#

oh yeah djs is eassier lol

wheat mesa
#

djs is a mess

#

you can't convince me that this isn't easier/cleaner

boreal iron
hard wraith
#

Ok multiple people are having issues with this code but I tested it for my webhooks and it worked.

wheat mesa
#

idk how it works for djs, I just know how it works for detritus

hard wraith
#

I spoofed a post request to mimic top.gg

ancient nova
#

no I'm literally having trouble with listing the warns I want them to do it in incements of 10
for example we have 25 warns
so page 1 = 10
page 2 = 10
page 3 = 5

wheat mesa
#

glad I'm not dealing with this sql shit manually lmao

pearl trail
#

search javascript chunk array in google

wheat mesa
lyric mountain
#

why not just regular numbers?

wheat mesa
#

yeah I'm wondering the same

hard wraith
#

who had the issue with the webhook?

wheat mesa
#

I'm going to hope those are UUIDs of some form, it would be hilarious if you generated 2 of the same IDs but I'm sure that's not the goal lol

lyric mountain
wicked grove
#

ananızı bacınızzı sikim lan sizin

wheat mesa
lyric mountain
#

like, the whole reason for using hashed ids is so people cant simply guess other people's url

wheat mesa
#

nvm, 380million

lyric mountain
#

but that makes little sense in that context

ancient nova
#
                        for (let i = 0; i < resolvedKey.length; i += 10) {
                            const chunk = resolvedKey.slice(i, i + 10);
                            for (let i2 = 0; i2 < chunk.length; i2++) {
                                warningsEmbed.addField(`WARN ${i2 + 1} (ID: ${resolvedKey[i2]})`, `${resolvedValue[i2].slice(0, 512) || "Couldn't resolve value."}`);
                            }
                        }
``` so I got something like this?
wicked grove
#

Türk yokmu amk

wheat mesa
wicked grove
#

yes bro

hard wraith
#

@eternal osprey try to send your server webhook to the endpoint http://testendpoint.jconet.co.uk/dblwebhook with the auth simpleauth

ancient nova
#

but I don't think it works properly? the first page it shows nothing and on the second page it shows the first page

lyric mountain
#

so u can call anywhere

#

simply apply it to that array

hard wraith
ancient nova
lyric mountain
#

make it generic

wheat mesa
#

I know this isn't what you meant but on that topic I love generics

#

beautiful

#

java does generics poorly imo tho

#

since you have to use boxing/autoboxing etc

#

no primitives allowed

#

:C

hard wraith
#

im so tired lol

ancient nova
#
                        const result = resolvedKey.reduce((resultArray, item, index) => { 
                            const chunkIndex = Math.floor(index / 10);
                            if (!resultArray[chunkIndex]) {
                                // start a new chunk.
                                resultArray[chunkIndex] = [];
                            }; resultArray[chunkIndex].push(item);
                            return resultArray;
                        }, []); const result2 = resolvedValue.reduce((resultArray, item, index) => { 
                            const chunkIndex = Math.floor(index / 10);
                            if (!resultArray[chunkIndex]) {
                                // start a new chunk.
                                resultArray[chunkIndex] = [];
                            }; resultArray[chunkIndex].push(item);
                            return resultArray;
                        }, []); for (let i = 0; i < chunk[currentPage].length; i++) {
                            warningsEmbed.addField(`WARN ${i + 1} (ID: ${result[currentPage - 1][i]})`, `${result2[currentPage - 1][i].slice(0, 512)}`);
                        }
#

what am I doing wrong 😭

#

no errors

wheat mesa
#

I'm gonna have to pass on trying to read that

hard wraith
hard wraith
boreal iron
#

We don’t recommend builders here

#

Never!

hard wraith
#

I do when someone is trying to do something messy and complicated when an easy option is available.

wheat mesa
#

fake let him have this

#

he aint gonna not use the builders no matter who recommends it lol

hard wraith
#

Yeah... Like the builders make for tidy and easy code lol

wheat mesa
#

go back to driving šŸ™„

hard wraith
#

and that makes the dev time shrink

wheat mesa
#

but that's something we already discussed in this channel like yesterday

#

so

ancient nova
#

I have

#

fixed it

boreal iron
#

Builders make code harder to read

ancient nova
#

almost

hard wraith
hard wraith
ancient nova
#

the last problem is that it still numbers the warns from 1 to 10 instead of 11 to 20

wheat mesa
#

for some things I prefer builders

#

but most of the time not really

boreal iron
#

Yeah or do you wanna tell me an object is hard to read and understand?

hard wraith
#

But when working with an embed? Or a slash command?

ancient nova
hard wraith
#

This is easier.

#

but thats just me

wheat mesa
#

oh wait slash command permissions are a thing now aren't they

hard wraith
#

Ye

#

lmao

wheat mesa
#

haven't done discord bots in a while, this is my first time in a while

hard wraith
#

and modals

wheat mesa
#

yeah I know about modals

boreal iron
wheat mesa
#

I forgor about perms tho

hard wraith
#

I am working on my first command using modals on sat morning

wheat mesa
#

I prefer this style

hard wraith
#

idk... just looks nicer to me.

boreal iron
#

Ok placing a note in your profile

#

ā€œThis guy is weirdā€

wheat mesa
#

see I'm redeeming myself to fake for being a java user

hard wraith
boreal iron
#

Oh my

#

This is escalating

wheat mesa
#

lol

hard wraith
#

then again I have hated java since my last time making a minecraft plugin

wheat mesa
#

well that's why you hate java

hard wraith
#

Fake is just one of those elitist people that like to rain on anyone coding using the easy way out that the library gives you for free lol.

wheat mesa
#

no

hard wraith
wheat mesa
#

I wouldn't call it the "easy way out"

hard wraith
#

0/10 would not recommend mc plugin making.

wheat mesa
#

I much prefer the raw structure, you don't rely on things changing in the future

hard wraith
#

Oh that case sure, hell... You could even make your own builder for commands if thats the case lol

wheat mesa
#

No reason to use builders

hard wraith
#

If you wanna be fancy...

boreal iron
#

And also free KEKW

hard wraith
#

pft...

#
{
  name: 'yeet',
  description: 'yeet yeet'
}```
boreal iron
#

The builders simply is bloat nobody needs

hard wraith
#

This just doesnt... look good to me.

boreal iron
#

What in the world

#

I need a hammer to bonk someone

#

Do you also dislike arrays?

hard wraith
#

Ive used both ways and the builders were faster and easier for me to migrate commands over from v12 to v14 lol

boreal iron
#

The builders aren’t since they have changed any version of djs

hard wraith
#

meh. I like my method, it works effectively and my dumbass teammates are able to understand how to do it.

boreal iron
#

I mean think about the nonsense to call the constructor and methods to RETURN the object literally exactly as you can write it per hand

#

Which is less code and exactly as the API expects

hard wraith
#

ye...

#

but effort.

boreal iron
#

And you will never have to update it

ancient nova
boreal iron
#

Let’s better not do that (again)

ancient nova
boreal iron
#

Let’s be gentle and say your style is unique

hard wraith
#

UNIQUE

ancient nova
#

ah yes, unique

#

🤣

hard wraith
#

ffs

proven escarp
hard wraith
#

well stuff that

boreal iron
# hard wraith but effort.

lol effort to write two brackets?
I mean instead of writing the names of the methods you directly type the object properties which is less chars

proven escarp
#

you can't just start a if statement after a ;

#

that's illegal

boreal iron
#

Bannable offense

proven escarp
#

yes

#

definitely

ancient nova
#

yeah but doing an else would cause errors so I just separated them

boreal iron
#

lmao

proven escarp
boreal iron
#

He didn’t get it

hard wraith
boreal iron
#

loom being evil

#

I like it

ancient nova
#

😭

boreal iron
hard wraith
#

lmao ITS OK

boreal iron
proven escarp
boreal iron
#

This channel… today… is idk

#

Somehow confusing on another level

hard wraith
#

its on POINT!

lyric mountain
#

al dente 🤌

boreal iron
#

Amen

hard wraith
#

Ok but anyone used modals yet?

boreal iron
#

Sure

#

That’s the reason I’m complaining about the missing field types, select menu support etc

#

Like lots of other too waiting for the implementation

hard wraith
#

Its there...

boreal iron
#

All it is atm is an experimental state which isn’t really supported in the UI yet

sudden geyser
#

hastebin just got 10x worse

earnest phoenix
#

That's been like that since the last year

sudden geyser
#

really? just noticed

boreal iron
#

Toptal = evil?

sudden geyser
#

yes

#

it be evil

boreal iron
#

Hmm actually don’t know that name

ancient nova
boreal iron
#

Idk the company as I said above

ancient nova
#

my entire warns command is 300 lines 😭 is that good or bad I can't tell

boreal iron
#

Can’t judge them yet

earnest phoenix
#

Why the hell is it 300 lines?

boreal iron
#

But I will soon

lyric mountain
boreal iron
ancient nova
#

warns can list and check a specific warn

earnest phoenix
#

The average warn commands I've seen are barely 70 lines

wheat mesa
#

The well designed ones*

earnest phoenix
ancient nova
#

an example of the warn check

#

it's pretty cool

wheat mesa
#

The classic Title Case Moderation Message

lyric mountain
#

is that only visible within the same guild?

ancient nova
#

yeah

lyric mountain
#

why do u show the guild then?

earnest phoenix
lyric mountain
#

That's Visual Basic Case Actually

ancient nova
#

I just looked it up to show u guys an example

lyric mountain
#

I just wanna know why show the guild if it's visible only within the same guild

wheat mesa
ancient nova
#

I should probably change that

earnest phoenix
lyric mountain
ancient nova
#

there we go

#

(don't ask why I'm comparing strings)

boreal iron
#

Just experimental

earnest phoenix
lyric mountain
boreal iron
#

Obviously not meant to be implemented correctly in the UI yet

ancient nova
#

and here is for the warn list

lyric mountain
#

other guilds don't need to know there are other warns

ancient nova
earnest phoenix
# ancient nova

The expression in that if statement is never going to be true because an empty array is not a falsy value

hard wraith
#

Nah nothing experimental about it, This works as intended for the test command I created. What is your excuse for not using it again Fake?

boreal iron
#

The backend still works

#

Doesn’t mean it’s implemented and ready to use

#

Since things can change

#

My gosh

earnest phoenix
boreal iron
#

Wait for the announcement until it has been released

hard wraith
#

Its on the discord api docs...

boreal iron
#

Link

lyric mountain
ancient nova
#

it never actually executed though?

lyric mountain
#

js is weird

ancient nova
earnest phoenix
ancient nova
#

oh that's really confusing me now

earnest phoenix
#

If you want to check if the array is empty, do array.length === 0

boreal iron
hard wraith
#

Ok its limited, but DJS allows you to put select menus.

earnest phoenix
boreal iron
hard wraith
#

So something aint right

boreal iron
#

Nothing has changed on the modal docs yet

#

For a long time@now

wheat mesa
#

v8 migrating to carbon when :troll:

earnest phoenix
#

Maybe when it becomes stable (probably never)

boreal iron
wheat mesa
ancient nova
#

somehow I think adding that check broke my warns list?

earnest phoenix
boreal iron
#

Yes! Compile me daddy

ancient nova
#

oh no

boreal iron
#

Compile me hard

wheat mesa
#

Decompile you*

boreal iron
#

Auto correct is a bitch

ancient nova
#

is it becaue they changed the guilds name and I'm comparing the guilds name instead of the guilds ID 😭

proven escarp
#

šŸ‘æ

hard wraith
wheat mesa
#

I was able to get select menus into modals as well, but for me I’m unable to get the selected value when the modal is submitted

boreal iron
#

Haven’t you noticed it doesn’t look ā€œrightā€?

wheat mesa
#

It’s too short, it’s actually not fully aligned whenever I did it either

boreal iron
#

It’s yet not implemented in the UI, it just uses the style like being posted into@the chat window

wheat mesa
#

It’s not official yet

#

It’s just being implemented into the api

boreal iron
#

Yeah

hard wraith
#

I get that, but thats minor, I only want modals for submitting support tickets lol

boreal iron
#

And things can change and usually will

wheat mesa
#

If anything people using select menus in modals before the official support comes out helps the devs to solve bugs with them lol

hard wraith
#

I dont need the select menu as a lot of the data is automatically stored lol.

wheat mesa
#

It’s not finished yet, so you shouldn’t be using them for any production use yet

#

Otherwise you might have platform compatibility issues

hard wraith
#

Im not. The support command is linking to my support helpdesk... So I am being cautious as hell and testing overly.

ancient nova
#

guys I would have to save the guilds ID instead of the guilds name but the thing is I then would have to change every command to filter the guilds name for ID and oh god

hard wraith
#

Its to get a ticket logged on the helpdesk using stats from discord directly.

sudden geyser
#

you saving guilds by their name is a bad idea

hard wraith
#

im more concerned about getting the required data passed into the helpdesk database properly.

boreal iron
#

The select menu will probably be announced with new field types support for modals
Let’s hope soon

#

That’s all we know atm

ancient nova
#

I wish I knew this before doing that 😭 gonna have to clear the damn warns again

hard wraith
#

i think its next month

#

something is telling me august will bring news about discord api

boreal iron
#

August 2030

wheat mesa
#

Probably when message intent is enforced

hard wraith
#

OOF

ancient nova
#

how do you fetch a guilds name by their ID again?

boreal iron
#

I guarantee you djs will rename the select menu builder

hard wraith
#

It’s already enforced… sorta…

boreal iron
#

Because the methods of the modals creating select menus will have that name as well

hard wraith
#

It’s following the same naming convention of the other builders.

#

So unless they change them all, I doubt it.

boreal iron
#

Soon chatselectmenubuilder

boreal iron
#

Yeah

#

I bet this will be the case

hard wraith
#

Oh no Cus yeah… modal selects need a label and chat ones don’t have that…

boreal iron
#

That’s how djs thinks

#

Yeah

hard wraith
#

So two types of select menu builders needed…

boreal iron
#

How can fuck up people again

quartz kindle
hard wraith
#

Or you end up having one builder with a ā€œtypeā€ option that then requires you to have the label if you add a it to modal.

boreal iron
#

Probably a base select menu builder and one expanding it just with a different name KEKW

ancient nova
#

hate me

boreal iron
#

Those var names

#

My gosh

ancient nova
#

that's the thing you're worried about NJ_Kek

lyric mountain
#

tryget

ancient nova
#

I'm just gonna wait til u guys notice

lyric mountain
#

the inline if?

quartz kindle
lyric mountain
#

if ((resolvedResults = tryGet)[4] !== message.guild.id) is more cursed

wheat mesa
#

but why did you even set another variable to that in the first place

#

I don't understand

lyric mountain
#

idk, just did what they did there

ancient nova
#

for some reason doing tryGet[4] directly returned undefined, that's why I did the double variable thing

#

don't ask me why cause I don't know

quartz kindle
wheat mesa
boreal iron
#

I don’t know what to say anymore

wheat mesa
#

bruh

#

it's const, it's not going to suddenly change from an array to undefined

#

your issue is the fact that tryGet[4] is undefined

boreal iron
#

Probably a broken constant

#

Who knows

sudden geyser
boreal iron
#

Let’s call it djs originals

wheat mesa
sudden geyser
#

I see that in a lot of languages sadly

#

cough swift

boreal iron
wheat mesa
#

why not something like ```
Func<TResult, TArgs...>

boreal iron
#

I’m driving sir

#

Looking at this may let’s me hit a tree

wheat mesa
#

then drive without being distracted!

boreal iron
#

on purpose of course

boreal iron
lyric mountain
sudden geyser
#

here's what we have

#

I don't remember the exact reason why this is done across languages

ancient nova
sudden geyser
#

I know Swift's case is just because they wanted to save a few characters (i.e. DSL)

wheat mesa
ancient nova
#

I think detection by ID broke? any idea why?

ancient nova
#

for some reason it just didn't want to work unless I reassigned it to a new variable

boreal iron
#

Or message mentions for some absurd reason

earnest phoenix
#

anyone know why the embeds are stretched?

boreal iron
#

A change in the UI, a bug, a drunk dev pressing the wrong keYs…

#

Nobody knows

wheat mesa
#

When a shard closes with an opcode of 4801, what does that mean? I can't seem to find anything in the docs about that code

hard wraith
wheat mesa
#

I already looked there, it’s not listed

hard wraith
#

You sure it’s 4801? And not 1084

#

Lmao that’s not even an op code either.

#

You use discordjs for shards right?

#

Ask in their server… they might know more about that op code.

hard wraith
wheat mesa
#

No data. It just closed, then reconnects and resumes as normal. Happened while I was away from my pc, probably just a quick internet connection interrupt

quartz kindle
#

4801 dafuq

#

only thing i can think of is a custom library close code

#

for example i use 4099 in my lib

abstract dirge
#

Yo any one play dbl

quartz kindle
#

yes i play discord bot list

abstract dirge
#

No I meant dragon ball legend

rustic nova
#

same tim

#

wrong server then here

abstract dirge
#

Can you kick me

civic scroll
#

C# doesn't have a way to do that since ain't proprocess

#

so just return a result object at this point

bright hornet
#

How do we actually catch the time error in createMessageCollector without using collector.on('end')?

civic scroll
#

collector.on('error')

#

but usually it will to one of the errors defined, whichever hits first

#

so depends on reason you can figure what tripped the collector to end iirc

wheat mesa
#

and 1006

#

but from looking that up it's an internet interruption I think

lament rock
#

Sometimes, my lib just decides to spam try to identify

wheat mesa
#

internal from detritus-client-socket it seems

lament rock
#

why is that an enum if there is no auto increment used lmfao

wheat mesa
#

to make it more clear what the codes mean? Helped me to understand what those random numbers mean

lament rock
#

I don't think you understand what an enum compiles to

wheat mesa
#

That's basically the point of enums (at least in languages in ts where they don't do a whole lot)

#

The point isn't what it compiles to, it helps readability

lament rock
#

an enum is a fancy object.
Its values get auto incremented in between assignment operations

wheat mesa
#

enum is just more proper imo

lament rock
#

so, it could literally just be

export const SocketCloseCodes = {
   NORMAL: 1000,
   GOING_AWAY: 1001,
   ...
}
#

No it isn't XD

#

It's just overhead for the compiler

wheat mesa
#

he could've done like ```ts
const SocketCloseCodes = Object.freeze({
STUFF: 15,
});

#

it really doesn't matter

#

if people cared about compiler overhead that much then they would just be js pros and not bother with typescript at all šŸ˜‰

#

cough cough tim

lament rock
#

That's why I'm so confused. The only real benefit of enums is like this

export enum Values {
  Zero = 0,
  One,
  Two,
  Three,
  Four...
}
wheat mesa
#

It doesn't matter that much

#

The likelihood is he kept it like that for people like me searching for what the codes mean

#

Since I wouldn't have found it so easily without being able to search for it

civic scroll
#

sometimes you still need to explicitly define the code for easier search

#

also think about refactoring

#

in short, my throat stucks

sharp geyser
#

I see no issue using enums either

cinder patio
#

const enums

#

use const enums

hard wraith
#

Sat here wishing there was an api to get better stats about my cod performance and the new vanguard guns because the tracker network doesn’t show new guns and is a whole prestige level off…

unkempt ocean
#

Bot cannot add or remove roles.

  • Bot's role at the top
  • Invited the bot with required perms (even tried with administrator)
  • Bot has GUILDS intent
  • It was working on my test server and it doesn't work on different server
method: 'delete',
path: '/guilds/GUILD_ID/members/MEMBER_ID/roles/ROLE_ID',``` 

**Fixed**
> It was 2fa issue, apparently bot owner needs 2fa enabled as well if 2fa is enabled on server
near stratus
#

How do you tell discord.js to not cache channels?

quartz kindle
#

new Client({ makeCache: Options.cacheWithLimits({ ...Options.DefaultMakeCacheSettings, ChannelManager: 0, GuildChannelManager: 0 }) })

#

but keep in mind that:

zinc dawn
#

Any fixes? think


DiscordAPIError: Invalid Form Body
components[0].components[1].url: Scheme "1000421766751072296" is not supported. Scheme must be one of ('http', 'https', 'discord').
hard wraith
#

yeah...

#

pass it a url

#

What is the thing you are trying to put that url into?

zinc dawn
#

yh ik normaly https

hard wraith
#

Like what is it you are trying to make...

zinc dawn
#

maybe package error

#

hmm

hard wraith
#

What is it erroring when you do?

zinc dawn
#

Only /botstats

#

slash command

hard wraith
#

you literally pasted the minimum of the error...

#

like what line of code is generating the error?

hard wraith
#

what is thi sline?

zinc dawn
#

never have i see this error

hard wraith
#

well you know what your issue is right?

#

wait what is your botstats command file?

#

something isnt right... that should work.

zinc dawn
#

i have a idea

hard wraith
#

its something in botstats that i causing that line to fail. Cus other commands work right?

zinc dawn
#

Yes

hard wraith
#

Then show me this via the whole of botstats

civic scroll
#

that was the last call where it caused the issue

#

add a breakpoint before the call and inspect arguments' values

hard wraith
#

Yeah... so botstats

#

thats the only command that broke the handler

civic scroll
hard wraith
#

a string of numbers it seem

civic scroll
#

check the part where it may possibly add that string of number

#

you use vscode on debug config right

hard wraith
#

This aint me

civic scroll
frigid robin
#

Is it possible that certain data that makes it into 1 table in MySQL database fucks up the collation of another table in the database??

hard wraith
civic scroll
#

ah

#

man still didn't give me what Command.js looks like at line 225 character 7

hard wraith
#

Right?

#

I wanna see the botstats command...

civic scroll
#

@zinc dawn gimme the block where it contains line 225

zinc dawn
#

Ok

#
try {
      await interaction.deferReply({ ephemeral: this.slashCommand.ephemeral });
      await this.interactionRun(interaction);
    } catch (ex) {
      await interaction.followUp("Oops! An error occurred while running the command");
      this.client.logger.error("interactionRun", ex);
    } finally {
      this.applyCooldown(interaction.user.id);
    }
  }
#

idk how to fix

hard wraith
#

Oh this is pure node not typescript... I know this

#

ethemeral should only be bool for one...

#

also...

#

What line is 225?

civic scroll
#

also

hard wraith
hard wraith
zinc dawn
#

await this.interactionRun(interaction);

#

225

civic scroll
#

then

#

interaction

hard wraith
#

this.interactionRun(interaction); is maing the error?

civic scroll
#

is the culprit

hard wraith
#

are you even retrieving interaction after passing it in?

zinc dawn
#

i think yes

hard wraith
#

.executeInteraction() inside of the command botstats

civic scroll
#

the error is only possible by user-defined error

hard wraith
#

show me where you define that function. Like where in botstats do you define executeInteration()

zinc dawn
#

can you connect to my anydesk

civic scroll
#

sure

hard wraith
#

yep

#

I can even give you a one time remote support url if that would make you feel safer

#

or use quick assist

civic scroll
#

i only have teamviewer

hard wraith
#

im fully licensed for remote support cus of work lol

#

I think im overkill on remote support tools

#

Also, dont use teamviewer... Its insecure as hell.

zinc dawn
#

sayuri check dm

hard wraith
#

Sure go with Sayuri lol... We both know how to fix your bot... But I think I know where your error is originating from in your code...

civic scroll
#

couldn't download it

hard wraith
#

both of you use windows...

#

use quick assist

civic scroll
#

was asking if man has teamviewer

#

or remote desktop connection

hard wraith
#

Why?

civic scroll
#

nvm i have quick assist

hard wraith
#

Quick Assist is the windows default support app lol

#

Its how microsoft support techs help you lol

#

I would be annoyed if it wasnt installed. As its a windows essential app.

earnest phoenix
#

@worldly mesa

zinc dawn
#

Anydesk is better lol

hard wraith
civic scroll
#

got quickassist

#

couldn't install anydesk since they had internal server error

hard wraith
#

I always recommend using quickassist on windows as its native... less likely to have issues

zinc dawn
#

ok wait

civic scroll
#

open quick assist

zinc dawn
#

i install it

#

download exe?

#

i cant find

#

never i download microsoft store

#

very laggy

civic scroll
#

i'm ready

hard wraith
#

Sayuri you need to click the bottom option lol

#

You are giving support

zinc dawn
#

pray that my PC does not crash as soon as Webstorm is open and Microsoft store lags everything

civic scroll
#

i know

#

but i'm waiting

hard wraith
#

ah... wait what?

#

How bad is your pc?

#

Love how I have been on this tryna help and sayuri just swipes it... Means I can get back to support tickets lol!

civic scroll
#

what

zinc dawn
civic scroll
#

type "quick assist"

#

man i'm boutta have dinner

hard wraith
civic scroll
#

can't just bring laptop to the kitchen table

hard wraith
#

Why are you even in the ms store?

civic scroll
hard wraith
#

It auto updates... It shouldn't need to open ms store...

lyric mountain
#

nope

civic scroll
#

i had to tho

lyric mountain
#

first time u open it it asks to update the app

civic scroll
#

^

hard wraith
#

tf...

#

I never had to...

lyric mountain
civic scroll
#

because you have auto updates turned on ig

civic scroll
hard wraith
#

Maybe thats windows enterprise vs pro or standard lol

civic scroll
#

oh yeah

#

mine's enterprise

hard wraith
#

Wait then you shouldnt have had that?

zinc dawn
#

I have enterprise

lyric mountain
civic scroll
#

^

hard wraith
#

Like... My account is registered to do remote technical support on windows machines so maybe that?

civic scroll
#

most likely

hard wraith
#

Nah cus like it installs the latest one. Like I see it install the update when I click it, without needing to open ms store.

brittle zealot
#

hello , is this where to ask for help? well if it is , how do i check if my bot was submit?

civic scroll
zinc dawn
hard wraith
brittle zealot
civic scroll
#

HWCF2F

zinc dawn
#

i pinged

#

you

hard wraith
civic scroll
#

hold on

brittle zealot
#

ah it says i dont have any projects

civic scroll
#

lemme restart quick assist

#

it tripped

brittle zealot
#

that mean ill have to resend it right

civic scroll
#

@zinc dawn 3LH9G8

hard wraith
civic scroll
#

awaiting

winter pasture
hard wraith
zinc dawn
#

Wait my pc ist laggy...

brittle zealot
hard wraith
winter pasture
winter pasture
civic scroll
#

@zinc dawn 520 seconds

bright hornet
brittle zealot
#

alrightt, hopefully my mom wont find out my laptop been on all night loll

hard wraith
zinc dawn
#

This app crashes

lyric mountain
brittle zealot
hard wraith
lyric mountain
#

you simply cannot offer a service that's only online when u are

civic scroll
brittle zealot
hard wraith
#

and $200 credit...

brittle zealot
#

ah

civic scroll
#

i'm old

hard wraith
#

Yes

lyric mountain
#

unless u got a million dollars spare money

hard wraith
lyric mountain
#

azure can become a wallet trap very easily

civic scroll
#

@zinc dawn paste the whole Command.js file to a paste bin, i will look from there

hard wraith
civic scroll
#

cool

hard wraith
#

The first thing they showed us was how to use all the features for free for life lol

zinc dawn
#

@civic scroll dm

lyric mountain
#

I mean, yes you can, but the safety margin is very easily broken if ur not cautious

civic scroll
#

alright

#

ima convert this to typescript rq

hard wraith
#

If you get stuck, give me a DM

lyric mountain
#

if ur going heroku just use replit

hard wraith
#

I mean... Yeah...

brittle zealot
#

oh my free vps

#

oh

#

does it support asyncpg?

hard wraith
hard wraith
civic scroll
#

@hard wraith

brittle zealot
civic scroll
#

by inspection all the code above in this function block does not modify interaction parameter

#

which means we have to go up one level in the stack

hard wraith
#

it isnt even defining as a function

civic scroll
#

it is an async method

hard wraith
#

no its being efined as a function

lyric mountain
hard wraith
#

it needs a space after executeInteraction to make it not try to work as a function

lyric mountain
#

heroku is...idk what it's called, container?

hard wraith
civic scroll
#

no?

#

it's the same

#

it's the same as async execute(interaction)

hard wraith
#

I get the same linter error when I remove the space

civic scroll
#

that's linter error

lyric mountain
#

@brittle zealot oracle has a free vps, if you got a credit card

civic scroll
#

not syntax / type error

hard wraith
#

oof

civic scroll
#

the thing is

hard wraith
#

wait its saying they arent defined tho

civic scroll
#

it's defined

hard wraith
#

or is it something else causing the underscore...

civic scroll
#

i pasted the source

#

that does not matter

#

once again

hard wraith
civic scroll
#

we are trying to figure out what reads from and writes to interaction

hard wraith
#

These shouldn be there

brittle zealot
civic scroll
#

not that piece of crap

lyric mountain
civic scroll
#

why would you care

lyric mountain
#

they require cc for verification

civic scroll
hard wraith
civic scroll
#

again

brittle zealot
#

fake cc info it is!🤣

civic scroll
#

man i'm not even in a file

#

it's an untitled file

lyric mountain
civic scroll
#

@zinc dawn can you send me the stack again?

zinc dawn
hard wraith
#

@zinc dawn can I remote on and check?

civic scroll
#

if you remember, send me the file one level up in the stack

hard wraith
#

I can literally use any method you want lol

civic scroll
hard wraith
#

I wanna but my head through a wall...

civic scroll
#

i'm in pastebin mode

hard wraith
#

ah that would do i

civic scroll
#

the ts parser just kicked in

zinc dawn
civic scroll
#

despite there's no other files to reference

#

that's why you see those underlines

#

but again it's not relevant to our problem at hand now

hard wraith
#

Yeah i said hat would do it lol... I thought you were on the man's machine

#

Also why isnt this code in a repo?

#

Like if it was in a repo we could make a test branch and clone that and try to fix it for you

civic scroll
#

that's for later

hard wraith
#

Fair...

#

I like it when I can add someone to my repo for my bot as a guest so they can see my code if the error isnt solved in the command file lol.

zinc dawn
civic scroll
#

istg

#

something is writing into the interaction UI components

hard wraith
#

Its done been open for half an hour

zinc dawn
hard wraith
civic scroll
#

@hard wraith the error gave it away
anything involves 2nd button of the first component row being a link button