#development

1 messages · Page 98 of 1

boreal iron
#

Means the promise will fail and cause this error

eternal osprey
#

hey in java is it actually possible to return a custom type?

#

I wanted to create an extended instanceof method, so basically something like:

public Type typeOf(Question x){
if(x instanceof MultipleChoice) return MultipleChoice;
if(x instanceof openQuestion) return openQuestion;
}
earnest phoenix
#

Interfaces

lyric mountain
#

no but you can return a class (tho classes are Types) instead

#

nonetheless, instanceof is always a single-op operator

#

u cant use variables with it (on the second part)

earnest phoenix
#

Create an interface, create two classes that implements it, e.g. MultipleChoice and return them with return type being the interface

eternal osprey
#

i have these 2 classes

#

they both extend question

earnest phoenix
#

What is Type as return type then?

eternal osprey
#

right now, i am keeping a list of all questions, but as you may expect the inputs expected by the logic handler are different, thus i wanted to use like instance of or something to check which input to use

eternal osprey
earnest phoenix
#

No, Question since they both extend it

lyric mountain
#

instanceof checks for hierarchy too, not only the top-level class

#

so if u did something instanceof Object it'd always return true

#

because all classes extend Object

eternal osprey
#

ahh

#

shit okay, thank you guys!

eternal osprey
#

i am calling super on the question abstract class, basically the daddy of my other 2 question classes.

#

is there a way to actually detect how many objects i have added from type "MCQuestion" for example?

lyric mountain
#

iterate

#

then check for obj instanceof MCQuestion, it it returns true increment a counter

eternal osprey
#

aight thank you it worked!
Would it btw be a good practice to create a interface to hold constant values?

#

I for example want to use 3 final values in 2 classes, would it be good to set them in that interface? It seems nicer to eliminate duplicate code

wheat mesa
eternal osprey
#

alright, thank you

hushed robin
#

how would I get the latest entry using .get() with better sqlite

quartz kindle
#

there are many ways to do that

#

each has its pros and cons and depends on how the db is setup

#

one way for example is select * from table_name order by row_id desc limit 1

#

but that doesnt work for tables created with the ``WITHOUT ROW_ID " constraint

#

row_id is a hidden column that sqlite creates by default

lyric mountain
quartz kindle
#

also, depending on your autoinc settings, row_id is not always guaranteed to be ordered in insertion order

#

but most times it is

lyric mountain
#

Like, my Drawable interface has HEIGHT and WIDTH constants, so I can access using Drawable.WIDTH for example

#

Nothing more than convenience

hushed robin
#

☹️

lyric mountain
#

It's hidden

#

You can't access hidden columns

hushed robin
#

...

quartz kindle
#

you can

#

did you create a WITHOUT_ROWID table?

hushed robin
#

i don't think so

quartz kindle
#

try rowid then

#

actually rowid is correct, not row_id

hushed robin
#

an alright

#

thank you

lyric mountain
lyric mountain
#

Just keep it in context, for misc stuff use a constants abstract class

#

Static constants get thrown into the same place during runtime anyway, what matters is that you keep it intuitive/easy to understand

eternal osprey
#

yeah got it!

#

like, i was using a lot of constants over several classes and the only way i knew on how to import those variables so that i didn't have to constantly redeclare was using an interface

lyric mountain
#

For general constants just make a Constants class

#

Make it abstract so the compiler doesn't need to worry about instantiation

#

U can also make it final, to tell the compiler there won't be subclasses

opaque acorn
#

is it normal that my bots stop playing music 2 minutes after connect?

lyric mountain
#

not really

#

any error in logs?

opaque acorn
lyric mountain
#

I suppose ur using lavalink

opaque acorn
#

works normally

lyric mountain
#

any error in lavalink side?

opaque acorn
lyric mountain
#

does distube run in a separate process?

opaque acorn
#

no

#

i suppose

lament rock
#

use LavaLink or Volcano

#

trying to do voice yourself is beyond masochistic

opaque acorn
#

which is faster

lament rock
#

LavaLink if you care about filters, Volcano otherwise. They're both under the LavaLink protocol so any LavaLink wrapper works

opaque acorn
#

lavalink supports spoti and soundcloud?

lament rock
#

But I can guarantee you that trying to do audio yourself will not work

#

both support spotify through plugins. Volcano comes with one by default, LavaLink you have to download. SoundCloud is a built in source

worldly canyon
#

good event everyone

#

I am in need of help with the Lracer bot

#

We need an admin bot for our league races

spark flint
#

wait

#

misread

#

anyways

winged linden
#

this is logging empty, any idea why?

      const channels = guild.channels.cache.filter(
        (channel) =>
          channel.type === "text" &&
          channel.permissionsFor(botMember).has("VIEW_CHANNEL") &&
          channel.permissionsFor(botMember).has("SEND_MESSAGES")
      );
      console.log(channels);```

Collection(0) [Map] {}
earnest phoenix
winged linden
earnest phoenix
earnest phoenix
#

But you should definitely update to v14

winged linden
earnest phoenix
#

You're welcome

earnest phoenix
wheat mesa
#

That doesn’t exist

#

It’s just the same as djs but with typings

#

That’s how ts is

opaque acorn
crystal furnace
#

const channel = message.channel;
const botPermissions = channel.permissionsFor(message.guild.me);

if (!botPermissions.has(Permissions.FLAGS.SEND_MESSAGES) || !botPermissions.has(Permissions.FLAGS.EMBED_LINKS)) {
  try {
    await message.author.send({
      embeds: [
        new MessageEmbed()
         ...
      ],
    });
  } catch (err) {
    console.log(`Failed to send DM to user ${message.author.tag}: ${err}`);
  }
  return;
}
#

Very sorry :(((

I added await and catch but when I testing on me, this is work only one time, in the next time it still appear mission permission, it still happen until I reset the bot

hidden gorge
#
TypeError [ColorConvert]: Unable to convert color to a number.
    at resolveColor (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\util\Util.js:486:39)
    at EmbedBuilder.setColor (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\structures\EmbedBuilder.js:22:36)
    at Client.<anonymous> (C:\Users\James\Desktop\bots\AlightLineStudiosBot\index.js:43:2)
    at Object.onceWrapper (node:events:628:26)
    at Client.emit (node:events:525:35)
    at WebSocketManager.triggerClientReady (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:385:17)
    at WebSocketManager.checkShardsReady (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:368:10)
    at WebSocketShard.<anonymous> (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:194:14)
    at WebSocketShard.emit (node:events:513:28)
    at WebSocketShard.checkReady (C:\Users\James\Desktop\bots\AlightLineStudiosBot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:520:12) {
  code: 'ColorConvert'
}

Node.js v18.12.1``` Error

Code ```js
client.once(Events.ClientReady, c => {
const LoginEmbed = new EmbedBuilder()
.setTitle("Logged In")
.setColor("GREEN")
.setDescription("Ready!")
const LoginChannel = client.channels.cache.get("1081441525315158086");
LoginChannel.send({ embeds: [LoginEmbed] });
});```
fossil dagger
#

hey guys i have made a discord bot but it is automaticly moving the vc

#

pls

#

help

hushed robin
#

😵‍💫

tidal pendant
#

which bot has demand on discord?

rustic nova
#

demand on discord? What?

lethal kettle
#

Bot Is Off-line

#

The Embed Generator

opaque acorn
#

how long until my bot pfp refreshes?

earnest phoenix
opaque acorn
#

ye

hushed robin
#

also

#

does anyone know if it's possible to store true / false in SQLite

hushed robin
#

yes

#

do what it says

#

refresh data then click the save button on the edit page

opaque acorn
#

it worked

#

thx

hushed robin
#

🎉

earnest phoenix
hushed robin
#

er

#

ok

earnest phoenix
rustic nova
earnest phoenix
nocturne flare
rustic nova
#

19 km

#

15 km

#

Approaching rapidly

#

200 meter

earnest phoenix
#

Yes, you'll definitely love the punishment :^)

rustic nova
#

running

lethal kettle
#

Oh

earnest phoenix
crystal furnace
#

const channel = message.channel;
const botPermissions = channel.permissionsFor(message.guild.me);

if (!botPermissions.has(Permissions.FLAGS.SEND_MESSAGES) || !botPermissions.has(Permissions.FLAGS.EMBED_LINKS)) {
  try {
    await message.author.send({
      embeds: [
        new MessageEmbed()
         ...
      ],
    });
  } catch (err) {
    console.log(`Failed to send DM to user ${message.author.tag}: ${err}`);
  }
  return;
}

The exact situation I met (I can't fix this even trying 10 + ways is after sending DMS to a user (even success or not), if a user exercute command fail in next time, in each channels the bot missing permissions it won't DMS users (except I reset the bot)

#

@earnest phoenix Sorry for ping but do you ever meet this case before?

earnest phoenix
earnest phoenix
#

the example code

#

lol

hushed robin
#

for what

hushed robin
#

⁉️

earnest phoenix
#

bruh

#

just ignore it

earnest phoenix
crystal furnace
earnest phoenix
#

That's an issue with the code

crystal furnace
#

the log showing like this instead of it should send to users as much time as errors happened?

crystal furnace
#

If I exercute commands fail in x times there is only a warning

#

it never change until I restart the bot

earnest phoenix
#

As I said, you should send more code

crystal furnace
#

If I remove return, it won't happen more but it make after function run

#

wait

crystal furnace
#

I think problem is return is not working right, this should never happen

earnest phoenix
crystal furnace
earnest phoenix
crystal furnace
crystal furnace
earnest phoenix
#

Try putting logs in your command code, and see how many times it logs when you use the command multiple times

earnest phoenix
#

At the start, at the middle, in the if statement bodies, at the end, and see for yourself

crystal furnace
#

for the case the bot can't send the DMS to user, in the first time it log like normal, in the second time+ "it changing to missing permission log"

earnest phoenix
#

I got what you said, but that's not what I'm talking about

crystal furnace
#

return is a problem of this, if I put return out everything should be right, working well but the after functions will run

earnest phoenix
#

You're not properly debugging your issue and only trying random things to try to fix it, you shouldn't do that

#

I don't see how the return statement would cause any of this unless you're handling the returned value of the run() function you have accordingly, try putting logs in multiple places and then you'll most likely figure out the issue

crystal furnace
#

Thanks for your reply, actually I try to bring that "return" to everywhere and it still cause problems

I will try to put some console.log();, but I think my problem can't solve like this

#

It is like that return is making the bot do a time then he will pass that block if user met the error in next time (except reseting the bot)

#

Because I'm requesting API with a high fee so I can't like remove the return function

#

Sounds I can solve and can't solve the problem :))

crystal furnace
# earnest phoenix You're not properly debugging your issue and only trying random things to try to...

Logged something like this

I blocked the bot and then use commands twice

✅ First reply the log show: Failed to send DM to user Makoto-kun#4120: DiscordAPIError: Cannot send messages to this user

❌ Second reply the log show: [antiCrash] :: Unhandled Rejection/Catch
DiscordAPIError: Missing Permissions
at RequestHandler.execute (/app/node_modules/discord.js/src/rest/RequestHandler.js:350:13)
at runMicrotasks (<anonymous>)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async RequestHandler.push (/app/node_modules/discord.js/src/rest/RequestHandler.js:51:14)
at async TextChannel.send (/app/node_modules/discord.js/src/structures/interfaces/TextBasedChannel.js:176:15)

....

#

I quit right now, nothing I think I can do to fix this :((((

earnest phoenix
#

You didn't do what I said

crystal wigeon
#

hey can anyone please suggest me a good python lib to download youtube audio? Youtube-dl seems outdated and pytube is just very slow

earnest phoenix
# crystal wigeon hey can anyone please suggest me a good python lib to download youtube audio? Yo...

YouTube-DL is not outdated, they only provide an outdated binary, it's repository has lots of new commits and you can clone it using Git and follow the developer instructions
https://github.com/ytdl-org/youtube-dl

GitHub

Command-line program to download videos from YouTube.com and other video sites - GitHub - ytdl-org/youtube-dl: Command-line program to download videos from YouTube.com and other video sites

radiant kraken
earnest phoenix
#

Fr 💯

radiant kraken
#

literal bogo sort

crystal wigeon
earnest phoenix
#

And that Python is slow in general

crystal wigeon
#

Mm dem, thanks

sharp saddle
#

for some reason my bot stops playing after 1 minute, can u guys help here?

lyric mountain
#

Lemme guess, distube?

sharp saddle
#

no

#

it's my radio bot lmao

#

it uses Discordjs/voice

sharp saddle
deft wolf
#

What package are you using in your bot?

lyric mountain
#

There were a bunch of people here with that exact same issue

sharp saddle
#

i use discord.js

#

@discordjs/voice for voice thing

deft wolf
#

Usually, external packages are used to listen to music/radio, which make it easier to manage the radio/music

#
#

Distube is one such package and is quite popular among bots

sharp saddle
#

yeah, ik Distube

sharp saddle
#

nvm i fixed

#

smh

jovial nimbus
#

What should I write here?

deft wolf
#

The truth, why you need to have this intent

jovial nimbus
eternal osprey
#

wtf why is there an extra line

hushed robin
jovial nimbus
hushed robin
#

what

eternal osprey
#

this is what it's returning

#

(i added a println)

sudden geyser
# jovial nimbus What should I write here?

"plz give intent"

Just describe what you need the intent for. I'd recommend searching what other bot devs entered / needed the intent for so you know what they'll accept and reject (most of which is rejection)

rustic nova
#

if you dont actually need it, dont ask for it kekw

hushed robin
#

⤴️if you need it you should know why

rose lance
#

[using linux]
ayo, I have a little script named test.sh just containing the the command pdw
when I run this script now this error gets thrown: ./test.sh: line 1: $'pwd\r': command not found
does anyone know why this happens?

quartz kindle
#

like #!/bin/bash

rose lance
#

ah thanks, it didn't and adding one fixed it 👍

quartz kindle
#

👍

hushed robin
#

whys this returning undefined

quartz kindle
#

nothing in data was found with that path?

hushed robin
#

how tho

wheat mesa
#

Because we don’t know your setup and the context behind this question :p

unborn basalt
#

worried?

#

care for a game of overthrow?

hushed robin
#

☹️

unborn basalt
#

typing and thinking

hushed robin
unborn basalt
#

I am, but thanks for the o/

#

now enough about me

#

learn

hushed robin
#

why are you always saying

#

random things

unborn basalt
#

because they are only random to you

hushed robin
#

no they’re random to everyone

unborn basalt
#

and thatas ok

#

say my name

hushed robin
#

no it’s not

hushed robin
unborn basalt
#

:lutune:

analog tinsel
#

how i can display image from url in req res api?

#

i want to fetch image for my website from my api

lyric mountain
lyric mountain
#

I told u before, println already includes a newline

unborn basalt
#

please hurry

#

this is disrupting my day a bit and it would be much appreciated

#

be back in about 50

quartz kindle
#

or you want a redirect to the original image?

#

or you have an image in your api and want the website to display it directly?

analog tinsel
#
app.get("/api/avatar/:id", (req, res)=>{
const member = req.params.id;
const image = await client.users.cache.get(member).displayAvatarURL({ format: 'gif' }) ?? "https://cdn.discordapp.com/attachments/1014351794496884797/1081725502781394994/giphy.gif";
});
analog tinsel
#

Member avatar url and another image url

#

For example

#

İf i share image in this channel and copy image url, url display as image automaticly

#

İ want this system in my api too

#

İf i added my api url to my website image href then it must display as image

#

My eng bad sry

quartz kindle
#

another way is to download the image inside the api and then send the image data directly, for example using fetch inside the api, or using https.request, and then download the image data inside the api, and then res.send(downloaded image data) with the proper mime type header

#

you can also download the image by connecting the streams, which is a little more efficient

minor olive
#

I've been trying to get dbls to work all day, and I've had no luck. Can anyone help me?

In terms of top.gg, I'm setting the webhook url to something like this (https://domain.webhook)
(I'm not using any authorization right now)

Then, in terms of the code, (I'm in python) I have this:

bot.topgg_webhook = topgg.WebhookManager(bot).dbl_webhook("/https://__domain__.webhook") #obviously, that's not the real thing, but it's the same thing that the top.gg webhook url is set to.

bot.topgg_webhook.run(500)

@bot.event
async def on_dbl_vote(data):
    print("Yay!")

But, whenever I use the send test button, nothing happens. I think I am not understanding something, because I don't know where to put my webhook token that top.gg gives me. Any help would be VERY much appreciated.

hushed robin
#

what's the best way to remove HTML from a string

#

should I just use a package

sudden geyser
#

probably yes

#

to parse the html and rewrite it to exclude elements

earnest phoenix
sudden geyser
#

that url don't look right

minor olive
#

it's not. I'm not going to release the actual url

earnest phoenix
minor olive
earnest phoenix
#

based on their documentation, it's changed:

webhook_manager = topgg.WebhookManager()
endpoint = (
    topgg.WebhookEndpoint()
    .type(topgg.WebhookType.BOT)
    .route("/dblwebhook")
    .auth("youshallnotpass")
)
#

.auth is the new webhook_token

#

iir

minor olive
#

oh! I thought it was that authorization thing in top.gg

#

ok

quartz kindle
#

it is yes

earnest phoenix
#

oh then

quartz kindle
#

they are the same thing

#

there is no other token

#

the only token/auth/pass there is is the top.gg authorization

earnest phoenix
#

ic

minor olive
#

I think there has to be, because that fix didn't work.

earnest phoenix
#

@minor olive u should add a value to the authorization thing

minor olive
#

k

minor olive
#

I'll try that

earnest phoenix
#

and copy that

#

and paste it to the .auth

minor olive
#

yeah, that's still not working.
I'm still confused as to where we're putting the webhook token that top.gg automatically generates.

hushed robin
earnest phoenix
quartz kindle
earnest phoenix
#

this should work

#

lmfao

earnest phoenix
unborn basalt
#

but ty

hushed robin
#

js

quartz kindle
#

nowhere

#

that token is for the rest api

#

not for the webhook

earnest phoenix
#

RegExp

hushed robin
#

too difficult

earnest phoenix
#

or the package itself validator

hushed robin
#

ok

minor olive
quartz kindle
#

yes

minor olive
#

yeah, it's still not working. This is my code:


bot.topgg_webhook.run(500)

@bot.event
async def on_dbl_vote(data):
    print("Yay!")```
hushed robin
#

how do i use it

earnest phoenix
#

check the documentation

#
hushed robin
#

ok

#

i don't see anything to remove html

unborn basalt
#

can a que be changed from one array to another easily?

minor olive
#

Perhaps I'm setting up my webhook wrong. How do you actually create a webhook url? I mean, what I've done is I've gone to my website server, created a new file called webhook, and I've just been using that (https://domain/webhook).

Do I need to do something special?

unborn basalt
#

i wish i could help here but im not the best to answer this

#

i can try to find the answer in a bit

#

@hushed robin any ideas on this for cypress?

#

or are you distracted

hushed robin
#

are you ok though?

#

why are you friending me

unborn basalt
#

very much

hushed robin
#

and randomly pinging me

#

???

unborn basalt
#

hahaha sorry by bad man

#

i am just using the term battleless for a project

#

i thought you were a bot

hushed robin
#

???

unborn basalt
#

hmmm very bot like

#

???

hushed robin
#

please leave me alone sir

unborn basalt
#

will do

hushed robin
#

thx

unborn basalt
#

i apologize

hushed robin
#

while i'm here

hushed robin
#

but when I try to request it with axios I'm getting a 404

sudden geyser
#

the same url with the same parameters?

hushed robin
#

ah nevermind

#

how can i get the status code

#

nvm

wheat mesa
#

response.statusCode or .status or something like that

hushed robin
#

yah

#

found it

#

.response.status right?

wheat mesa
#

Yes

hushed robin
#

it's returning undefined 😵‍💫

wheat mesa
#

Then you’re doing it wrong

hushed robin
#

oh wait

#

nvm

#

yeah

#

i just realized

#

that i'm not returning the full response

#

only the data

#

how is it undefined

lyric mountain
#

show the surrounding code

hushed robin
#

the request?

#

oh wait

#

i just realized test is returning undefined

#

how can i get the status code

#

if the response won't return it

#

☹️

lyric mountain
#

can't u just use fetch?

hushed robin
#

no

#

fetch doesn't support commonjs

#

☹️

lyric mountain
#

?

hushed robin
#

? what

#

node fetch?

lyric mountain
#

don't think cjs would force u to use a heavily bloated library

hushed robin
#

what should i use then

lyric mountain
#

but anyway, your answer is this

hushed robin
#

what's wrong with it

lyric mountain
#

it's response.data to get the body

#

also, u don't need { return ... }

#

nor .then if ur gonna return the very thing it's passing as argument

hushed robin
#

the thing is

lyric mountain
#

what ur looking at in the image is the response body no?

hushed robin
#

it returns undefined regardless

#

nvm

#

fixed the issue

lyric mountain
#

what was it?

hushed robin
#

well

#

catching the error and returning it to check the status

#

nvm

#

that doesn't work

#

only works when it errors ☹️

#

so what library should i use if axios is bloated

lyric mountain
#

node-fetch

hushed robin
#

bruh

#

it doesn't work with commonjs

spark flint
#

node-fetch-commonjs

#

i use tha

hushed robin
#

hm

#

ok

spark flint
#

or @aero/http

#

which i love

#
const http = require("@aero/http")
const test = await http("url").json()```
hushed robin
spark flint
#

aero/http examples ```js
// POST
const test = await http("url").post().json()

// text
const test = await http("url").text()``` etc

spark flint
hushed robin
#

ok

#

imma try that

wheat mesa
#

Ah yes because swapping libraries will definitely fix the issue caused by your lack of attempting to debug things before asking in a server

lyric mountain
#

I'm pretty confused as to why it wasn't accessing response tbh

lyric mountain
#

hm, what's the line before this?

hushed robin
#

it fixed it

#

but thanks for your input waffle

#

🥰

#

i can now get the status code

hushed robin
lyric mountain
#

your image

hushed robin
#

which one

lyric mountain
#

my guess is that it wasn't test.response.status because it had another parent

hushed robin
#

well

#

it did not

lyric mountain
#

but u never send full images anyway

hushed robin
#

im not dumb

solemn latch
#

👀 man, typescript would make these things so much easier 😉

hushed robin
#

i can read it very clearly

unborn basalt
#

waht is types cript

hushed robin
#

☠️

lyric mountain
#

statically-typed values is always great for debugging

hushed robin
#

anyways

unborn basalt
#

lol

lyric mountain
#

that's also part of the reason I think js/python aren't good for beginners

hushed robin
#

well axios is just poop

#

node-fetch works very well

#

👏

lyric mountain
#

simply because they let u ignore proper value typing, which makes it harder when switching to static languages

#

and builds pretty bad habits

solemn latch
#

I mean, ts was very easy to learn from js.

but yeah, the habits are awful

lyric mountain
#

then it's js all again KEKW

solemn latch
#

Thats one thing I thankfully dont do

wheat mesa
#

That also just defeats the purpose of ts

#

It’s useful sometimes if you know what you’re doing but most of the time it leads to bugs

solemn latch
#

But I certainly have a couple dozen type errors in my dev environment right now that I'll have until I try going to production.

Which is also an awful habit I need to fix 👀

#

lmao

wheat mesa
#

You…just let them go??

#

Nooooo!!!

solemn latch
#

In dev yeah

hushed robin
#

typescript is hard tho

#

when i tried it

#

i quit

lyric mountain
#

typescript is just javascript with types

hushed robin
#

well

#

explain the thousand errors i had then ☹️

lyric mountain
#

u forgot to respect types

sudden geyser
#

get good at using types

#

at least a week

solemn latch
wheat mesa
#

“Oh no type error!!! I cannot solve this as I have never directly worked with types :(“

lyric mountain
#

I dislike the C family, but C itself ain't bad as a first language

hushed robin
#

how many rows does it take for sqlite to get slow

#

i have 110k rows and it's pretty fast still

lyric mountain
#

110k is nothing

hushed robin
#

fr?

lyric mountain
#

a speck of dust in a beach

hushed robin
#

good to know

#

so unless i work with very big databases i won't have to worry about indexing n stuff right

lyric mountain
#

no, u always have to worry about indexing

hushed robin
#

why

#

it's very fast without indexing it

quartz kindle
lyric mountain
#

it's just that you'll never have enough data for the size to become a concern

hushed robin
#

yah

lyric mountain
#

but having a bad structure is still a problem

hushed robin
#

so no need to worry

lyric mountain
#

you have to worry

hushed robin
#

bruh

lyric mountain
#

just not about size

hushed robin
#

why

#

it works fine without

lyric mountain
#

because it'll compound when u have enough movement

wheat mesa
lyric mountain
#

"a little bit slow" becomes "a huge pink elephant in a tunnel" when you start making many operations per second

wheat mesa
#

A few days ago you said you had 300 rows

hushed robin
#

this is a different project

wheat mesa
#

Ah

hushed robin
#

i have all steam applications in the db

lyric mountain
#

how long is it taking to retrieve a single entry?

hushed robin
#

well

#

let me calculate that

lyric mountain
#

run using SELECT * FROM <the table> WHERE <the id> = ?

hushed robin
#

SELECT id, name FROM applications WHERE name LIKE ? LIMIT 25;

#

very fast

hushed robin
#

why

lyric mountain
#

because I want to know about a single entry

hushed robin
#

ok

#

well, it seems i calculated the above wrong

#

it takes like

#

70ms

#

on average

#

i don't think that's too bad

wheat mesa
#

That’s uh

#

For retrieving one entry??

#

That’s pretty awful if that’s the case

hushed robin
#

hm

#

yes

#

how's it bad

#

70ms is quick

wheat mesa
#

That’s terrible

lyric mountain
#

it should be around 1-3ms at most

wheat mesa
#

That’s like slower than a fast api response on the internet

hushed robin
#

☠️

#

how am i suppose to make it quicker

lyric mountain
#

indexes

#

and pkeys

#

70ms might not seem big, but that's because ur the only one making a transaction

#

when u have like, 100 requests per second (which is low) it'll start compounding into a bigger issue

hushed robin
#

i'm confused

#

how is SELECT id, name FROM applications WHERE name LIKE ? LIMIT 25; quicker than SELECT * FROM <the table> WHERE <the id> = ?

quartz kindle
#

its all about the position in the table

hushed robin
#

the first takes like

#

5ms

#

and the second like 70ms

quartz kindle
#

without indexes it does a full table scan

hushed robin
#

more = less time ⁉️

quartz kindle
#

if the id you want happens to be near the end of the table, it will take longer to reach it

lyric mountain
#

sql size doesn't matter for performance

#

u can have smaller queries that are much slower than bigger queries

quartz kindle
#

if it finds 25 names like ? near the beginning of the table, it will be faster

lyric mountain
#

since u don't have indexes, I imagine u also didn't make the id unique, so it'll go till the end of the table regardless whether it found one or not

hushed robin
#

the IDs are unique

lyric mountain
#

since it'll suppose there's the possibility of having more than one row with the same id

hushed robin
#

theres not

lyric mountain
hushed robin
#

yes

quartz kindle
#

if the id is the primary key, then its indexed by default

hushed robin
#

you have to set a primary key right

#

also guys

#

what's the best way to store things in cache, i haven't really worked with it before. is there any good guides.

lyric mountain
#

it's not about storing, but more about what u use as a cache

#

and why

hushed robin
#

well

wheat mesa
#

Caching can be complex or it can be as simple as a hashmap

hushed robin
#

i wanna store data in cache from an API so if someone repeatedly runs the same command it won't repeatedly send requests to the API

wheat mesa
#

Most basic caches make use of a map

#

Sounds kinda like what you’re looking for here

hushed robin
#

but i wanted to make it so there's a refresh time, so if it's past that time, it'll fetch new data

lyric mountain
#

use a ttl map

#

there are libs for that

#

like expiring-map

hushed robin
#

okay

lyric mountain
#

with it u can set a ttl (time-to-live) based on insertion

#

so when it "dies" it gets removed from the map

hushed robin
#

it's dead

lyric mountain
#

hm, look for another lib then

#

just search "expiring map npm" or "ttl map npm" in google

hushed robin
#

ok

lyric mountain
#

should pop a bunch of results

hushed robin
#
lyric mountain
#

any will do

#

just get the one with the most stars

hushed robin
#

github?

lyric mountain
#

npm

minor olive
hushed robin
#
#

well thank you guys 👍

earnest phoenix
hushed robin
#

ah

#

will look into that one too

#

thanks

hushed robin
#

ok, now that i'm looking into those, i don't think they actually cache anything?
how do i store something in cache? is there like a mozilla page or something with all the information.

lyric mountain
#

Anything can be a cache

#

When they say "cache data" they just mean holding onto it for a while in case someone requests it again

#

A ttl map is a good option because it automatically removes old entries so you only have to worry about checking if the entry exists or not in it

hushed robin
#

idk how to set cache

lyric mountain
#

You don't "set cache"

#

You simply add the received data onto the map

#

And return it whenever someone requests that specific data

#

It isn't automatic

hushed robin
#

when I think of cache

#

I think of a database but temporary and stored in memory

#

is that not what it is?

lyric mountain
#

It can be

#

As I said, anything that can hold data can be used as a cache

hushed robin
#

but how do i make it cache?

lyric mountain
#

"cache" isn't a thing, it's a purpose

#

A folder can be a cache

#

A box can be a cache

#

A discord channel can be a cache

#

You simply put recently used stuff in it and reuse it until it expires

#

You're not understanding because you lack the necessary experience that'd be gained from studying programming

hushed robin
#

makes 0 sense

#

imma just google more

lyric mountain
#

Because you're thinking of cache as an object

#

Cache is a concept, not something material

#

Just like you say "that car is red"

#

You can say "that map is a cache"

hushed robin
#

well, I don't totally understand but

#

why are the tabs different sizes in my files

lyric mountain
#

Because bad configuration

#

Idk how to put it in a dumber way, you literally put shit inside the cache when you first access it, then reuse that specific shit until it expires

hushed robin
#

yes

#

but

#

how do i put something inside the cache

lyric mountain
#

The same way u put in any other map

#

map[key] = value

hushed robin
#

hm ok

hushed robin
lyric mountain
hushed robin
#

what bad configuration

#

???

lyric mountain
#

Editor configuration

#

You either didn't define a tab size or ur editor is shit

hushed robin
#

im using visual code studio

#

but it's just this one file

lyric mountain
#

What is the extension?

hushed robin
#

what

lyric mountain
#

File extension

hushed robin
#

js

#

.js

lyric mountain
#

Then it's bad configuration

hushed robin
#

what is "bad configuration"

lyric mountain
#

Configurations that weren't done properly

#

that's entirely dependant on how u set up your editor

#

Which I can't help

hushed robin
#

anyways

#

is there any better way to do this

lyric mountain
#

This what?

#

Also, u didn't add const to the iterator

hushed robin
lyric mountain
#

...?

hushed robin
#

is there a better way to do

lyric mountain
#

Mind to explain what you want to achieve?

hushed robin
#

what i'm doing in the image

hushed robin
lyric mountain
hushed robin
#

what it does is exploit something with discord to allow multiple images in an embed

lyric mountain
#

You're using a global variable for it atm

hushed robin
#

yeah just fixed it

#

i was wondering if theres a more efficient way to do it

lyric mountain
#

You're just sending multiple embeds

hushed robin
#

no i'm not

lyric mountain
#

Yes?

hushed robin
#

only one of the embeds actually sends

#

but is there a better way to do it

lyric mountain
#

Not from what I see from the code

hushed robin
#

i see

#

ok

lyric mountain
#

Discord just coalesce them into a single message

#

It ain't no exploit, it's just what they added after the last update

hushed robin
#

well

#

why doesn't discord just allow you to send an array of images then

#

instead of this

lyric mountain
#

Because embeds can only have a single image

hushed robin
#

then why does my embed have multiple

lyric mountain
#

Because the front end coalesce them

hushed robin
#

yah

#

so there's multiple in a single embed

lyric mountain
#

No, it's still 4 separate embeds

hushed robin
#

it's not

lyric mountain
#

The front end just shows as 1

hushed robin
#

yeah so my point is

#

if you can do that to make it look like there's multiple in one embed, why not just allow people to send an array of images

lyric mountain
#

Because as I said, embeds can only have a single image

#

That's not a single embed, it's multiple embeds coalesced into one

hushed robin
#

coalesced into one

#

so it is one

lyric mountain
#

But in the back side it's still multiple embeds

#

You see it as one, but it's not one

hushed robin
#

nvm

#

you don't get it

lyric mountain
#

Me? You're the one with impossibly dense understanding skills

hushed robin
#

😁 seems like u do too

lyric mountain
#

How hard is it to understand that what you see in the net isn't necessarily how it is from the back side?

#

Embeds can only have a single image, period.
What it happens is that discord shows them as one but they are still separate embeds

#

If you retrieve the embeds from the message, you won't get 1 embed

#

You'll get 4

hushed robin
#

yeah but

lyric mountain
#

No but

hushed robin
#

they can visually have more than one image

#

yes or no?

lyric mountain
#

Doesn't matter

hushed robin
#

it does matter

lyric mountain
#

It doesn't

hushed robin
#

it very much does

lyric mountain
#

What you see isn't constrained to what it really is

#

You could edit discord page background color and make it pink

#

It wouldn't mean discord is pink

#

Discord could show messages as audio files, wouldn't make messages audio files

#

A very simple example, discord shows YouTube links as embeds with video

#

It doesn't make embeds support videos, it just shows like that

hushed robin
#

🙈

lyric mountain
#

Yeah go on, for someone who can't even understand what a cache is after many examples I was expecting too much of you

#

I don't even know why I bother interacting with you at all, it always end with the same moronic statements

hushed robin
unborn basalt
#

what is going on here today

#

im quite confused battleless

#

looks like it sliped out of your hands again

#

just kidding

#

youre trying your best

#

and thats what counts

#

@hushed robin pallendromes

frozen dagger
#

😳😳my bots finally in the verification server

hidden gorge
#

[CMD Ran] - Embed Command Ran by TW rblx, Title: hi, Message: hi, Server: LLRP | Blaine County Sheriffs Office, Color: null

const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");
const clc = require("cli-color");

module.exports = {
    data:new SlashCommandBuilder()
        .setName("createembed")
        .setDescription("Staff+")
        .addStringOption(option =>
            option
                .setName("title")
                .setDescription("Embed Title"))
        .addStringOption(option =>
            option
                .setName('message')
                .setDescription('message for embed'))
                .addStringOption(option =>
                    option.setName('color')
                        .setDescription('Color')
                        .addChoices(
                            { name: 'GREEN', value: 'Green' },
                            { name: 'RED', value: 'Red' },
                            { name: 'YELLOW', value: 'Yellow' },
                        )),
    async execute(interaction) {

        const msg = interaction.options.getString('message') ?? 'No Message provided';
        const title = interaction.options.getString('title') ?? 'No Title provided';
        const color = interaction.options.getString('setcolor');
        //const embedchannel = interaction.options.getString('channel');

        const embed = new EmbedBuilder()
        .setTitle(title)
        .setDescription(msg)
        .setColor(color)
        .setFooter({ text: `Server Name: ${interaction.guild.name}, Ran by ${interaction.user.username}` });

    await interaction.reply({ embeds: [embed] })
    await console.log(clc.blueBright("[CMD Ran]"), clc.greenBright("-"), clc.yellowBright(`Embed Command Ran by ${interaction.user.username}, Title: ${title}, Message: ${msg}, Server: ${interaction.guild.name}, Color: ${color}`))

    }
}``` for some reason it wont set the color
frozen dagger
#

And it got verified topgg_ico_chart

hushed robin
#

and your trying to get the option named setcolor

hidden gorge
#

im so stupid thank you

hushed robin
#

it's ok i'm stupid too

hidden gorge
#

LOL

hushed robin
#

😝

jaunty basalt
#

Heya,
I want my bot to reply if a user has an already open ticket. But instead it creates another one.

Plz tell me why it isn't working?

Code- https://sourceb.in/HGoduRfDAr

earnest phoenix
crystal wigeon
#

hey so im using ngrok and safari doesnt seem to be setting cookie

#

but it works on chrome

#

any solution for this?

analog tinsel
#
(await client.users.fetch(userID))?.displayAvatarURL({ format: 'gif' })
#

it giving .webm format

#

how i can fix. i think its about v14

analog tinsel
#

oh it work but format not changes

earnest phoenix
analog tinsel
#

but if avatar not gif it gives http error 415

#

in v13 its works well

#

how i can make if member avatar png then png if gif then gif

#

in my old code if member avatar is not gif but i writed format gif. then it display as .gif url but its png

earnest phoenix
#

u can do it like this:

const extension = avatarURL.substring(avatarURL.lastIndexOf('.') + 1);

iirc

analog tinsel
#

it gived avatarurl not defined

earnest phoenix
#

ofc you need to change the variable

analog tinsel
#

it works but

#

now

#

if bot cant fetch member avatar

#

it brokes my code

#
(await client.users.fetch(userID))?.displayAvatarURL({ extension: 'gif' }) ?? another;
earnest phoenix
#

give me ur code

analog tinsel
#

another is image url

earnest phoenix
#

wdym "brokes"?

analog tinsel
#

some avatars are not displaying

#

bcs bot didnt fetched their avatar from client

#

so in my code

#

"?? another;"

#

means

#

if bot didnt fetched then display this image

#

but your code brokes it i think

earnest phoenix
#

no it doesn't

analog tinsel
#

yep i see now

#

i console logged these

#

your code works well but

#

i dont know why it not use "another" variable if member avatar null

earnest phoenix
#

because it is never a null

#

your extension: 'gif' won't work

#

instead place the const extension above the resim

#

then change 'gif' to extension

#

maybe the member's avatar url isn't a gif

#

The extension option cannot be gif, it must be either one of jpg, jpeg, webp, or png

#

ah I see

#

never used the extension or format option before so

#

There's the static option which you can use to set whether or not the GIF avatar should be returned if any is available instead, ignoring the extension option

analog tinsel
#

my brain exploding

#

ill try static now

earnest phoenix
#

Try { static: false, extension: 'png' }

analog tinsel
#

thanks now works fine

#

but again "?? another" doesnt work

#

if member avatar is null

#

const another = thisgifimage

#

if member avatar = null then this image displaying but not wrks

earnest phoenix
#

It either returns the avatar the user set, or their default avatar

#

If you want it to return null when they have a default avatar, use the avatarURL() method instead

analog tinsel
#

its not about default avatar

#

for explain

#

if member doesnt in server. bot cant fetch member data right?

#

so i want if bot cant fetch this member data then .....

earnest phoenix
#

You're using the <Client>.users.fetch() method, it fetches any Discord user regardless of them being in the server or not

analog tinsel
#

oh

#

then

#

ill tryed ur code but it gived avatarurl is not function

#

i fixed

#

works now thanks

queen eagle
#

hi everyone,
I realise that the policy is worse than I thought for bots (bot live matter),
I really didn't know that a link was a security breach
so I wonder, is an image a security breach too? do I have to specify everywhere that it generates images?
besides that, my bot has a model that allows it to talk with a user (when the user @ it), the context of the discussion doesn't follow but the fact that it can answer is serious?

#

sorry if this is the wrong channel by the way, tell me I'm not sure

surreal sage
#

Is there a way to detect the closing of such prompt?

rustic nova
#

no

eternal osprey
#

hey how would we parse a \/ b /\ c?

lyric mountain
#

A what?

eternal osprey
#

where the first operator stands for or, second one for c

#

i thought that it would be a or (b and c)

#

because or has a higher priority than the and

lyric mountain
#

Tf ur talking abt

eternal osprey
#

it's discrete math

rustic nova
#

talking about boolen algebra or whatever it was called

eternal osprey
#

uhh parsing

#

like priority of logical operators in a formula

lyric mountain
#

Parens always has priority according to bodmas

eternal osprey
#

owh fr

lyric mountain
#

Brackets > order > division/multiplication > addition/subtraction

eternal osprey
#

so we work from inner parantheses to outer?

lyric mountain
#

Yes, like programming

eternal osprey
#

so a or b and c would basically become: (a or b) and c

#

brevv i am fucking stupid

#

i took this course 6 months ago and i forgot everything already

lyric mountain
#

always remember bodmas/pemdas

#

Whichever acronym u learned

eternal osprey
#

yeah, i got confused tbh'

#

especially with the presedence of the operators above

#

for example a implies b and c or d

#

that would become (a implies ((b and c) or d))

eternal osprey
#

8 in binary is 1000 right?

#

How would we get 08 then?

#

-8*

#

two's complement and then a yielding of 1 bit?

#

eventually extension to 8 bits to value it's binary comprehension?

quartz kindle
#

and a signed integer needs to know its total size

#

for example if its a 16 bit signed integer, then -8 would be 1000000000001000

#

if its an 8 bit signed integer, it would be 10001000

#

the bit that tells you that the number is negative is always the left-most bit

lyric mountain
#

Which is why signed values overflow to negative

#

Instead of zero

unborn basalt
#

ill get it working down in the commands

unborn basalt
quartz kindle
#

that was not a question lol

rustic nova
#

if only we could know what issue you're facing

#

hm

quartz kindle
#

message.member.voice is a VoiceState not a VoiceChannel

lament rock
#

the value isn't nullable either

#

you want .voice.channel

#

member.voice isn't null or undefined nor can it be those values so it's always coerced to true

neon leaf
#

why am I getting 402 Payment Required with nginx when about 4000 Clients per second access the same page? I have checked everything, its 100% from nginx

quartz kindle
#

wtf

neon leaf
#

nope, reverse proxying nodejs app

#

when accessing it directly with 5000 clients / sec it works fine

quartz kindle
#

weird

#

the only thing i found about it was that it was being caused by a php logging extension

neon leaf
#

this is the config

server {

        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        include /etc/nginx/errors.conf;
        server_name test.paperstudios.dev;

        server_tokens off;
        client_max_body_size 120m;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;

        location / {
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://de-01.paperstudios.dev:8000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }

        ssl_certificate /srv/certificates/paperstudios.dev/fullchain.pem;
        ssl_certificate_key /srv/certificates/paperstudios.dev/privkey.pem;
        ssl_trusted_certificate /srv/certificates/paperstudios.dev/chain.pem;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;

}```
quartz kindle
#

do you use ngrok?

neon leaf
#

no

#

de-01.paperstudios.dev resolves right to my vpsses ip

visual marsh
#

hello

#

i want api docs

earnest phoenix
#

1 -> #topgg-api
2 -> Read the channel description there

hidden gorge
#

TypeError [CommandInteractionOptionType]: Option "user" is of type: 6; expected 3.

const { SlashCommandBuilder, EmbedBuilder } = require("discord.js");

module.exports = {
    data: new SlashCommandBuilder()
        .setName("warn")
        .setDescription("Warn a member for a reason")

        .addStringOption(option =>
            option
                .setName("reason")
                .setDescription("Reason to warn"))
        .addUserOption(option =>
            option
                .setName("user")
                .setDescription("to warn")),

async execute(interaction) {

    const user = interaction.options.getString("user") ?? 'No User Provided';
    const reason = interaction.options.getString("reason") ?? 'No Reason Provided';

    const embed = new EmbedBuilder()
    .setTitle(`${interaction.guild.name}, Staff Warning On ${user}`)
    .setDescription(`The User ${user} has been warned for ${reason}`)
    .setColor("Red")

await interaction.reply({ embeds: [embed] })
await console.log(clc.blueBright("[CMD Ran]"), clc.greenBright("-"), clc.yellowBright(`Warn Command Ran by ${interaction.user.username}, User Warned ${user}, Reason: ${reason} `))
    }
}```
wheat mesa
#

My man

#

You did .getString on a user type…

hidden gorge
#

oh crap

#

GetUser?

wheat mesa
#

Yes

#

Or whatever the docs say

#

I don’t use djs

hushed robin
#

getUser or getMember

hidden gorge
#

thanks

hushed robin
#

one gets the user

#

other gets the member

wheat mesa
#

A quick 10 second search can save you time though

hidden gorge
#

thanks waffle

#

also why does it show the id but not the name?

hushed robin
#

mentions don't work in embed titles

hidden gorge
#

ah

frigid canyon
#

Ye

hidden gorge
#

doing js ${user.username} fixed it

hushed robin
#

warned for hi 😇

hidden gorge
#

lol its a test

hushed robin
#

does anyone know if It's possible to get a Steam users ID from username through the API?
I found something from 7 years ago saying it's not possible may be outdated though.

earnest phoenix
#

Reading documentation helps

hushed robin
#

i have

earnest phoenix
#

No you clearly have not

hushed robin
#

i have

earnest phoenix
#

Took me 10 seconds

GET http://api.steampowered.com/ISteamUser/ResolveVanityURL/v0001/?key=XXXXXXXXXXXXXXXXXXXXXXX&vanityurl=userVanityUrlName

#

Arguments
key
Your Steam API Key

vanityurl
The user's vanity URL that you would like to retrieve a steam ID for, e.g. http://steamcommunity.com/id/gabelogannewell would use "gabelogannewell"

hushed robin
#

ty

earnest phoenix
#

Next time actually search

boreal iron
#

No, you can not get the Steam ID by the username, there's no available endpoint
The vanity URL basically is the profile name you can set as unique profile ID

hushed robin
#

i did search

#

well

#

that works good enough

boreal iron
#

yeah just to say, it has nothing to do with the username at all

hushed robin
#

true

#

but it's better than having them enter an ID

boreal iron
#

You can use and resolve other IDs/types of URLs, too

#

Such as the Steam URL, Steam Vanity URL, Steam Invite URL, Steam ID 64, Steam ID 3 and Steam ID

earnest phoenix
#

Usernames are not even existent

hushed robin
#

?

earnest phoenix
#

There are steam IDs and steam account names

night badger
#

ist hier ein Deutscher und kennt sich mit ilove bot aus?

earnest phoenix
#

As well as nick names, some consider these as usernames though internally not, which can be changed anytime and are not unique

sharp geyser
earnest phoenix
#

Just support both

#

Internally save the ID only

sharp geyser
#

yup

hushed robin
#

well what I'm planning on doing is storing their display name and ID in the database and autocomplete them that way they won't have to type it every time

#

kinda like a search history

sharp geyser
#

Question, what happens if they change their display name?

lyric mountain
#

ik people who change the name all the time

boreal iron
#

weird people

hushed robin
sharp geyser
#

How

#

If you plan on refetching to see if its changed every time they use the cmd that will use a lot of api calls

hushed robin
#

?

#

no

#

when you search it’ll check if the data is the same, if not it’ll update it

sharp geyser
#

So you do plan on fetching every time they do that

hushed robin
#

no

sharp geyser
#

But you just said you would

hushed robin
#

no i didn’t

sharp geyser
#

when you search it’ll check if the data is the same, if not it’ll update it
You sure?

hushed robin
#

yeah data

#

i didn’t say i was going to refetch it every time

sharp geyser
#

If you are fetching from the api just to verify every time they search that the name they gave is correct that sounds inefficient

hushed robin
#

apparently you can’t read

#

😵‍💫

sharp geyser
#

No I can read

hushed robin
#

then where are you getting that I’m refetching the data everytime

sharp geyser
#

by you saying that you will search and check if the data is the same. Kind of hard to do that without fetching up to date data and comparing it against what you have saved

hushed robin
#

when they search their profile I’ll check it against the cached data, if they’re different I’ll update it

sharp geyser
#

Are you allowing them to search other peoples profiles?

#

I assume you are

hushed robin
#

yes why not

sharp geyser
#

If so, what happens if they use a display name that now does not exist because its been changed

#

Do you fetch cached data first before checking steam api? Now if you do this, thats cool but the cached data is still out of date

hushed robin
#

well

sharp geyser
#

Just use steam ids man

#

less headache

#

no point in saving data that constantly has the possibility of changing

hushed robin
#

Im recaching the data every 12 hours so if they’re updating it more often than that it seems like a them issue

sharp geyser
#

do what you will but you are storing useless data

hushed robin
#

nah

#

makes it easier

sharp geyser
#

not really

#

but ok

hushed robin
#

yes

#

they won’t have to get their steam ID everytime

earnest phoenix
#

Just store the ID

#

It never changes

sharp geyser
#

you yourself just said you have to refetch every 12 hours just to update their data

hushed robin
#

I am storing their steam ID

earnest phoenix
#

No need to check anything with cache

#

Just store and use it

earnest phoenix
#

Using cache when it's not needed is absolutely useless

sharp geyser
boreal iron
hushed robin
#

it is necessary

earnest phoenix
#

And here you clearly just need to store the user ID with their relative discord ID and then do the requests

sharp geyser
#

FakE I give up on these kinds of people

earnest phoenix
#

No need of any cache

boreal iron
hushed robin
#

I don’t think you understand what I’m doing krypton