#development

1 messages Β· Page 1982 of 1

pulsar bone
#

asking question = doing something

#

doing something != laziness

dry imp
#

you cant fetch message by content

pulsar bone
dry imp
#

noone said to fetch the message using the api

#

you must do it manually

#

thats why ben said it is not recommended

#

since you are checking through the whole message

#

you must fetch all of the text channel history messages and check if it contains the phrase

#

god i hope we dont meet again

cinder patio
#

the basics*

earnest phoenix
#

they have a snapchat pfp

#

daff ain't stupid

they just have an anime pfp

#

@dry imp privacy policy and tos should be in page footer

pulsar bone
cinder patio
#

nice save

dry imp
#

not in a mood to fix the website and the bot

spark flint
#

@rose warren

#

Still going, trying to everyone ping this time πŸ˜‚

split hazel
#

@pulsar bone thought seriously bro you need to take a programming/python basics course, not to insult you but to set you up for future code

#

if you dont understand the basics you wont understand people trying to help you all that much

#

if you're motivated enough it wont take very long to complete and get a good grasp

dry imp
#

he wont, instead he called others helpless person

carmine summit
#
DiscordAPIError: Interaction has already been acknowledged.
```whats this?
dry imp
#

answer is in the error

carmine summit
#
JSON.parse(JSON.stringify(obj));
``` what does this do exactly?
carmine summit
earnest phoenix
carmine summit
earnest phoenix
#

{ ...obj }

carmine summit
#

i have an object and the only way to call the keys is to stringify it then parse it again, otherwise its broken

earnest phoenix
#

It can also be done using the spread operator

earnest phoenix
hazy pasture
#
cron.schedule('* * * * *', async () => {
    console.log("test")

    const row = new MessageActionRow()
            .addComponents(
                new MessageButton()
                    .setCustomId('primary')
                    .setLabel('Primary')
                    .setStyle('PRIMARY')
            )
    console.log("other test")
});

it doesn't execute the script I put after the const row... can any1 help?

quartz kindle
hazy pasture
#

this is from djs guide

sudden geyser
#

still takes an array

quartz kindle
#

it should work without an array too tho, from the source code

#

where is your code hosted?

hazy pasture
quartz kindle
#

whats your node.js version?

hazy pasture
#

latest

#

16.6.1

quartz kindle
#

thats not latest but its good enough, shouldnt be an issue

hazy pasture
#

how should i use array??

#

.addcomponents([

#

?

quartz kindle
#

ye

hazy pasture
#

lemme try

#

sends test log but doesn't send message

quartz kindle
#

does it log other test log?

hazy pasture
#

I am adding a new one rn

coral sigil
#

where do you send the message?

hazy pasture
#

wdym

hazy pasture
#

it's like the code after const row doesn't exist

coral sigil
#

do you send that row somewhere?

hazy pasture
#
    const msg = await client.channels.cache.get("941750305022947331").send({ content: "test", components: [row]})
``` here
coral sigil
#

ookay πŸ‘πŸ»

quartz kindle
#

so "other test" is never logged? do you have any code in between the row and "other test"?

hazy pasture
#
cron.schedule('* * * * *', async () => {
    console.log("test")

    const row = new Discord.MessageActionRow()
            .addComponents([
                new MessageButton()
                    .setCustomId('primary')
                    .setLabel('Primary')
                    .setStyle('PRIMARY')
            ])
    console.log("test2")
    const msg = await client.channels.cache.get("941750305022947331").send({ content: "test", components: [row]})
});```

this is the code
#

and this is the log

quartz kindle
#

hmm

#

and if you remove the addComponents part?

#

just create an empty action row

hazy pasture
#

lemme try

#

it sends the second log too

#

so the problem is at addcomponents

quartz kindle
#

also, did you import MessageButton? it seems youre using Discord. for one but not for the other

hazy pasture
#

my god I am so stupid

quartz kindle
#

that should definitely how thrown an error tho

#

do you have any global unhandled error handler?

hazy pasture
#

I did the same error on actionrow (not used Discord.) and didn't gave error too

hazy pasture
#

btw it sends the button now, thank you so so much

quartz kindle
#

check if there is any process.on("unhandledException") or similar in the code

hazy pasture
#

do you know if there is a way to search up on the code without checking every file?

quartz kindle
#

your code editor should be able to do that

#

what code editor are you using?

hazy pasture
#

on visual studio code ctrl f just searchs up into the file u are editing

quartz kindle
#

on the left side, click the search icon

coral sigil
#

theres a search button in the "taskbar"

pulsar bone
hazy pasture
#

oh ok

#

no it seems like there is no process.on("unhandledException")

quartz kindle
#

search for process.on

hazy pasture
quartz kindle
#

weird

carmine summit
quartz kindle
#

is the handler in a separate package in node_modules?

hazy pasture
#

the handler is defined into index.js

quartz kindle
#

the entire code is there? or is it a require()?

hazy pasture
quartz kindle
#

and where does Handler come from?

hazy pasture
#

a node_modules package

quartz kindle
#

i dont think the search button searches inside packages

carmine summit
#

im pretty sure it redirects to the class

hazy pasture
quartz kindle
#

is this package public? can it be found on npm or github?

hazy pasture
#

yes

#

can I send it to you in dm?

quartz kindle
#

sure

hazy pasture
#

sent

earnest phoenix
#

Or actually I'll send them my favourite gif

sudden geyser
quartz kindle
#

lol stop bullying him

boreal iron
#

I don’t trust all these links…

sudden geyser
#

your computer has virus

#

pay me $500 and give me your ssn and I remove it

quartz kindle
#

i dont get it tho, the dude asks about how to fetch messages by content, and people start going on and on about the in operator and "learn python" lol

#

without touching the fetch subject

boreal iron
carmine summit
sudden geyser
#

accomplishing the goal does involve the use of in

#

I think someone mentioned looking up messages but more people went on to talk about in

sudden geyser
boreal iron
#

One sec

carmine summit
#

isnt that illegal

boreal iron
#

You saw nothing!

carmine summit
sudden geyser
#

legal so long as no one sees it

#

oh euros

#

bleh

quartz kindle
#

my soul for a few packs of those

boreal iron
#

Shh

#

lmao

#

I had quite a few good weeks tbh

#

months not weeks tho

sudden geyser
#

I've made a whopping $0 the last 3 months

#

or -$300 depending on how you do math

quartz kindle
#

dayum

carmine summit
boreal iron
quartz kindle
#

yesterday i got 100 euros, from a job i did 1 year ago and never got paid

#

@_@

boreal iron
#

poor Tim

#

Im gonna send you another motivation

quartz kindle
#

nopls

#

yespls

boreal iron
quartz kindle
#

lmao

boreal iron
#

Ok enough of that

quartz kindle
#

i have a certain dilemma i need to deal with now with my api

#

i have a file containing a list of entries, indexed by number like an array

#

however

#

updates to this file involve creating new entries

#

and the way they are sorted means all the ids get screwed up

lyric mountain
#

Use line numbers as index

#

Empty lines for missing entries

boreal iron
quartz kindle
#

i dont know what entries there will be in the future, so i cant reserve space for them

#

i need to change the entire thing to not be sorted

#

but at the same time preserve the existing order because people are already using it

#

which will make it ugly

#

sorted until X, then everything else is appended to the end

#

lul

earnest phoenix
#

senpai are you using a file as a database

sudden geyser
#

nah man who'd do that

boreal iron
#

And now Tim being bullied, oh noo

sudden geyser
#

would rather write a source file and fill up some array with the actual values

#

db.js and write to that and fill up let entries = [...]

#

would be a fun weekend project

lyric mountain
#

Does empty lines still count on file size?

sudden geyser
carmine summit
lyric mountain
#

Ye

#

Like, it'd be very negligible wouldn't it?

carmine summit
#

how would the system know that there is a newline if it isnt stored

#

but yes very negligible

quartz kindle
#

here's an example of the existing file

earnest phoenix
#

OH MY GOD

#

PLEASE JUST TELL ME THAT IS A CSV

lyric mountain
#

Just use lines as index

sudden geyser
#

doesn't look that bad

quartz kindle
#

people used it by the line number, for example S4 would get the data for the star Arietis A

#

this is the updated file

earnest phoenix
#

how is s4 a number

boreal iron
#

Ahh ohh

quartz kindle
#

there are a lot of new entries mixed up

#

Arietis A is no longer id 4

carmine summit
boreal iron
#

Can’t you just pick the name as index as it’s unique?

quartz kindle
#

my options are, either i tell everyone the ids have changed, or i give up on sorting it, and put all the new ones at the end

earnest phoenix
carmine summit
quartz kindle
#

the names can be complicated to remember, as they dont really follow any pattern

carmine summit
#

its so expensive for so little benefits

#

except that you can make discord your cloud database

quartz kindle
#

and all other non-star objects already have the same numeric ids

carmine summit
#

but still

earnest phoenix
quartz kindle
#

anyway i need to rework the entire star system

boreal iron
#

lmao

carmine summit
#

wait you could actually make discord your file database if you could upload multiple 100 mb files

boreal iron
#

See you again in 3020, Tim

#

bai

quartz kindle
#

because previously organizing it by lines was my only option, because thats what the C library uses as an input

#

but now i modified the C library into accepting manual string inputs instead of reading lines from files

#

so it doesnt matter anymore how i organzie the data

boreal iron
#

Why do you actually need the file to be sorted tho?

neat ingot
#

^ i wrote a custom console logger system πŸ˜„

quartz kindle
#

i dont technically need it, but i wanted a way to make it look nicer with some sort of predictability

#

to have for example star 453 and star 454 be related somehow

#

and not be completely random

boreal iron
#

And why is it important to not change the entry (line) order?

quartz kindle
#

because people are already using the existing numbers

#

there are pinned messages in discord servers telling people which numbers are specific stars

neat ingot
#

wait... tim...

#

is your database just a file?

quartz kindle
#

its not a database, its a list of stars

#

its read only

#

until i manually update it with new stars

boreal iron
#

Ahh okay and instead of using line numbers, how about an unique key, a short not too long one?

neat ingot
#

ahh ok, so more like a static db file type deal πŸ˜„

quartz kindle
#

ye

quartz kindle
#

i think im going for the second option, keep all existing ids as they are, and add the new ones to the end

boreal iron
#

Yeah but it would be future proof as long as the key has enough variations to deal with your list for the next years

carmine summit
neat ingot
#

uhh

earnest phoenix
neat ingot
#

the one shown in my snippet above creates a console like object but saves the logs to a file! πŸ™‚

carmine summit
boreal iron
carmine summit
#

im just confused whered you get the file name, but i guess you could just define it in a function that calls the global logger

#

or isnt there no global logger?

boreal iron
#

As long as you remember where you did put your stuff, things are ok

neat ingot
# carmine summit or isnt there no global logger?

nah, I could make one, but the way I use it, I manually require the module in each file I want to log things, and I pass the __filename, which is shown in the logs as [filename].

I use the module something like this:

earnest phoenix
neat ingot
#

// EXAMPLE USAGE: 
// opts are OPTIONAL!
const log = require('logger')(__filename, {
    file_options: {
        filename: 'somefile.log',
        options: {flags: 'a', encoding: 'utf8},
    },
    file_record: {
        fatal: true,
        error: true,
        warn: false,
        http: false, 
        info: false, 
    },
    log_colors: {
        fatal: 'red',
        error: 'red',
        warn: 'yellow',
        http: 'green', 
        info: 'cyan', 
    },
});

log.info('my awesome log');
// => 21:22:36 PM [filename] my awesome log


// to extend class functionality: 
class KustoomLoog extends log.Logger {}
#

stupid formatting.

neat ingot
earnest phoenix
carmine summit
neat ingot
carmine summit
neat ingot
#

I wrote a snippet to stop the context menu on webpages, so people couldnt view source, and converted it to jsfk. πŸ˜„

carmine summit
#

My 10 chars code turned into 12,000 chars of code...

neat ingot
#

maybe run it through a minification tool next? πŸ˜‚

earnest phoenix
neat ingot
#

hhmmmm

#

that is a fairly impressive site

#

I can see why the person would want to hide its implimentation πŸ˜„

#

im determined to find the source code for that site.

#

i gotta go out atm, but im bookmarking it for later πŸ˜„

earnest phoenix
quartz kindle
#

working as intended

#

well maybe not as intended, but its working correctly

earnest phoenix
#

Hmm how can i run client.on("event") then

quartz kindle
#

its already working

#

if you want it to show with your exact code, you need to add delays

#

because right now everything is sync

#

when working with sync code, you need to follow everything line by line

#

so what is happening there?

#

client = new Manager() -> constructor -> super -> eventemitter contructor -> back to constructor -> this.ready = false -> _init() -> this.ready = true -> emit event true -> console log seems ok -> back to constructor -> emit ready -> back to script -> console.log client -> create event listener -> end of code

earnest phoenix
quartz kindle
#

those are not promises, adding await wont do anything

neat ingot
#

hence the ... on the word 'await' πŸ˜›

earnest phoenix
#

.logger() function worked

#

_init() doesn run event event

quartz kindle
#

yes because you call it after you create the event listener

neat ingot
earnest phoenix
#

My brain just blowed

quartz kindle
#

events are used to process asynchronous code, but events by themselves are not asynchronous

#

you dont have any asynchronous code inside it

#

so everything is done before the manager is created

earnest phoenix
#

So how can i block everything is done after manager crated

quartz kindle
#

you need to add a delay

#

for example setTImeout

#

if you want to force the init function to only run after the manager is created, you can add something like setImmediate

#
constructor() {
  this.ready = false;
  setImmediate(() => this._init())
}
neat ingot
#

basically, create the instance, then register your event listeners, then any time your object emits the event, it can be listened to. Its like, you plug in the radio, then tune it in, then you can listen ~ no? πŸ™‚

earnest phoenix
#

setImmediate is the only javascript function that is supported in IE but not in any other browser

quartz kindle
#

lul

woeful pike
#

process.nextTick that bad boy

#

now no browser supports it

earnest phoenix
#

setTimeout(0) kek

quartz kindle
#

yes

#

because instead of this

#

client = new Manager() -> constructor -> super -> eventemitter contructor -> back to constructor -> this.ready = false -> _init() -> this.ready = true -> emit event true -> console log seems ok -> back to constructor -> emit ready -> back to script -> console.log client -> create event listener -> end of code

#

you are now doing this

#

client = new Manager() -> constructor -> super -> eventemitter contructor -> back to constructor -> this.ready = false -> setImmediate -> back to script -> console.log client -> create event listener -> end of code -> check for pending operations -> imediate operation found -> _init() -> this.ready = true -> emit event true -> console log seems ok

rigid maple
#
let object = { user: "TuranGe" }
...
{ object.user } // undefined
let object = { user: "TuranGe" }
let user = object.user
...
{ user } // TuranGe
#

I'm using Svelte

earnest phoenix
#

how can you even display asd without it showing object Object

carmine summit
#

Had this problem a while ago

#

Its frustrating when you know its there but code says no

rigid maple
quartz kindle
#

well, works fine in the svelte playground

rigid maple
#

so what could be wrong with my code

quartz kindle
#

is that the full code?

earnest phoenix
#

_function() is meaning private function?

earnest phoenix
quartz kindle
#

its just a name

neat ingot
#

ive never used svelte, but it looks kinda like ejs templating

quartz kindle
earnest phoenix
#

it's just an indicator that says don't run this code if you're not the guy who wrote it

quartz kindle
#

svelte is a compiler

#

like ts

earnest phoenix
#

Okay thanks

quartz kindle
#

lel

neat ingot
#

πŸ˜“ ive never used ts either... please dont @ me 😨

earnest phoenix
#

@neat ingot

neat ingot
#

😭

carmine summit
earnest phoenix
#

Svelte doesn't know the object properties at compile time

carmine summit
#

When you turn json into string then turn it back to json, you are removing weird things about that json and receiving a normal json that i think you need

#

Jsons have personality you know

rigid maple
carmine summit
#

By cloning the json, you are creating a new json, but the old json will teach the new json when he learned from his mistakes

earnest phoenix
#

There's Good JaSON then there's Bad JaSON

carmine summit
#

Trust me, it'll work

sudden geyser
#

my older brother is named jason and I can't get over it

neat ingot
#

give him a ball of string and see if he can parse it.

rigid maple
#

so why does it give the output at the top but not when I use it?

#

if it was, wouldn't it return undefined in both places?

carmine summit
#

Because bad json

#

But in technical terms, it has something to do with linking and virtual objects that is relative to another object

rigid maple
#

Oh I understand

#

Thanks

cinder patio
#

πŸ€” What you said doesn't make much sense

carmine summit
#

Bro I just remembered this... this is so cringe. Im so dumb

green kestrel
#

anyone else excited for discord API v10?

sudden geyser
#

no

#

it doesn't add much

#

or do much

earnest phoenix
sudden geyser
#

it doesn't change that much though

#

except for the message intent

earnest phoenix
#

exactly that

#

that's the main problem

earnest phoenix
cinder patio
#

replaceAll doesn't modify the original string, it returns a new one

earnest phoenix
#

i got it thanks

green kestrel
earnest phoenix
#

mod bots

green kestrel
#

it doesn't change mod bots

#

you just send an extra bit value in the intents

marble juniper
green kestrel
#

intents bit 1 << 15 for message intent

#

so far that's it

marble juniper
#

Idk what even that is gonna do

green kestrel
#

lets you see message content

marble juniper
#

I see

green kestrel
#

yeah you do, if you send that intent lol

#

otherwise you don't see kekek

marble juniper
#

I already have access to the message intent so yeah

sudden geyser
proven harbor
#

forms are out? completely?

sudden geyser
#

sort of

proven harbor
sudden geyser
#

they suck, but they're out there

green kestrel
#

so yeah on v10 just send 1<<15 alongside other intents when you identify

marble juniper
green kestrel
#

why do they suck?

proven harbor
marble juniper
proven harbor
#

and maybe embed building

sudden geyser
#

because all it's useful for is multiline editing

#

they don't add anything else, like selection from a set

green kestrel
#

where on a screen are you going to fit more than 5 lol

marble juniper
#

desktop

proven harbor
marble juniper
#

Besides you could make a modal scrollable

earnest phoenix
green kestrel
#

is everyone's screen as big as your screen?

marble juniper
green kestrel
#

it has to work on the smallest

#

and from what I can tell discord don't believe in scroll bars

sudden geyser
#

or handle relations, like if input x and y are mutually exclusive

marble juniper
#

Bruh

green kestrel
#

they still haven't added one to the server list in 2022

sudden geyser
#

but that's not limited to modals

green kestrel
#

feature requests only been there since 2019

marble juniper
#

They should add one to modals so we can have more modal fields

sudden geyser
#

just interactions in general

earnest phoenix
sudden geyser
marble juniper
#

lol

earnest phoenix
#

You mean a literal scroll bar?

green kestrel
#

with a scroll wheel sure try it when you don't have a 3 button mouse

marble juniper
#

Skill issue

green kestrel
#

skull issue

cinder patio
#
err.stack.matchAll(/:(?<line>\d+):(?<col>\d+)/gm).next(1);
Argument of type '[1]' is not assignable to parameter of type '[] | [undefined]'.

Why is typescript complaining here πŸ€” πŸ€”πŸ€”πŸ€”πŸ€”

green kestrel
#

the match is returning nothing

marble juniper
cinder patio
#

Except this is a typescript error

green kestrel
#

has it determined the regex will always be false?

cinder patio
#

typescript can't do that

#

the code's fine, next's signature is messed up

#

oh wait that's not how next works

#

Annoying js making me turn it into an array

earnest phoenix
#

is it possible

#

x.obj is a property that doesn't exist

#

Yes i know

#

try array.flat(1)

#

I want replace obj to x

#

For example if x.rand exist obj = x.ran

cinder patio
#

What do you want to know if it's possible?

earnest phoenix
#

Well you could replace the object key with the property if it exists

#

Object.keys(x).forEach(key => replace the key in text with the value);

cinder patio
#

or for...in

earnest phoenix
#

A for loop inside a for loop

#

noice

#

For(x of array) {
Object.keys(x).forEach?
}

cinder patio
#

forEach is also a for loop lol

#

Object.keys(x).forEach iterates through the object keys twice, in fact

earnest phoenix
#

what why

#

are you the new tim of performance issues

sudden geyser
#

no it's just basic logic

#

just look at it

#

get all the keys then do something with all the keys

cinder patio
#

Object.keys, then forEach

earnest phoenix
#

i see the problem now

sudden geyser
#

but that distracts from the problem

earnest phoenix
#

Actually i am lazy too replace all text for translate so i want to do that

if(botName) data.text = data.text.replace("{botName}", botName)

#

for (const [property, value] in x) text.replace(property, value):

cinder patio
#

you can't iterate objects like that

earnest phoenix
#

I forgor it's in

cinder patio
#

that's still wrong

#

in just gives you the key

sudden geyser
# earnest phoenix is it possible

How about something like this:

let text = "{rand} is a number, {me} is me"

for (const item of array) { // `item` is an object
  for (const [key, value] of Object.entries(item)) {
    text = text.replace(`{${key}}`, value);
  }
}
#

note the use of text = text

#

since replace returns a new string

earnest phoenix
#

i was going to suggest a method that would again iterate twice

#

Yes lemme try

cinder patio
#
for (const key in item) {
  const value = item[key];
}

Iterates only once

rocky hearth
#

Can I respond a button interaction with nothing. I just want to ignore it.

sudden geyser
#

how about just letting the interaction timeout

earnest phoenix
jovial nexus
#

can a webhook have a button? (like a url button)

rocky hearth
#

yeah that what i dont want

earnest phoenix
#

because the webhook can't respond to interactions

#

not sure about url buttons

sudden geyser
#

well responding with nothing is questionable

#

you could respond like you normally would but with nothing changed

earnest phoenix
#

@wheat mesa does detritus allow responding to interactions on messages that were made like a day ago?

after a few minutes my poll bot stops responding to buttons

jovial nexus
#

you cant respond to an interaction with a button, thats sure

earnest phoenix
#

maybe detritus kills the run function

earnest phoenix
#

should i listen for the interaction on rest api instead?

#

You just saved my life lol

sudden geyser
#

I think interactions only last for an hour for reply

earnest phoenix
#

i just realized i have a never ending event listener for EVERY poll

sudden geyser
#

that's a party

#

I'd rather have a single event listener since the number of polls is arbitrary

earnest phoenix
#

yeah

#

when poll command is run add the new poll to the database

sudden geyser
#

An even better solution:

let obj = Object.assign(...array);
let text = `${obj.rand} is a number, ${obj.me} is me`;
quartz kindle
#

discord is adding official support for multilanguage bots

pale vessel
#

now we can have portuguese support for astrobot

sudden geyser
#

well they've had it in the api for a while now

#

but did nothing with it

quartz kindle
#

they already added region indicator to slash commands, both guild region and user region, and they will soon add localized names and descriptions for slash commands

marble juniper
#

ngl

sudden geyser
#

when should you use the guild or user region though

lament rock
#

How I do it is; If the guild language is not en and the user's lang is en, then use the guild's lang, else use the user's

fallen holly
#

How do i host my bot and keep it online 24/7 with no downtime for free

earnest phoenix
#

You can't

sudden geyser
#

If you mean that you're not paying for it, depends on what you're paying for. An old laptop that you'll leave in your basement running? Well, you need that thing to charge, so there's some electricity + keeping it on.

#

Or maybe you want an online host, such as Heroku, which does fit that "free"ness you want, but has its own problems.

marble juniper
#

Just use something like replit

#

and uptimerobot

earnest phoenix
#

lets not

sudden geyser
#

that won't work

marble juniper
#

although this is defenitly not recommended

earnest phoenix
#

also using uptimerobot with replit breaks their TOS doesn't it?

sudden geyser
#

repl.it still tries to kill the project, so 24/7 isn't achieved

marble juniper
earnest phoenix
#

iirc they stated it did

sudden geyser
marble juniper
#

Ye

earnest phoenix
#

Let me see if I can find it, I might of been thinking of another service tho

marble juniper
#

Basically any host that is "free" is gonna suck

earnest phoenix
#

Ah yea you're right, I must of been thinking of something else

#

ye I think it was glitch

marble juniper
#

So you either pay or use a machine at home

sick agate
marble juniper
#

Either way you're gonna pay

sudden geyser
#

glitch doesn't run 24/7

#

they also try to kill the project if it's running for too long

#

even if you use pingers

earnest phoenix
#

Just buy a 3/month vps if the bot is small it will be sufficient

marble juniper
#

no way around it if you want to have a good hosting solution that doesn't suck and is actually 24/7

#

Its like asking to have food delivered to you 24/7 for free

#

its just not realistic

earnest phoenix
#

I mean link wanna deliver me food 24/7 for hugs?

sudden geyser
#

or just have some good friends

#

delegate the paying to them

earnest phoenix
#

Oh so klay wanna be friends?

sudden geyser
#

sure but I don't have a vps for you

#

never put anything in the cloud

earnest phoenix
#

πŸ˜”

neat ingot
#

just get a server yo, they are cheap af.

boreal iron
#

Or go work in the nearest mine and earn some cash smirk

earnest phoenix
#

this isn't 1919 why would I work in a mine

#

you can get a lot of money quick is easy

#

Just rob a bank and hope you don't get caught after

boreal iron
#

lol we’re in 2022 Sir

#

Banks don’t store much money any longer

earnest phoenix
#

Alright rob the treasury

boreal iron
#

Err 2023 lol

#

You actually make more cash when robbing a drug dealer than a bank nowadays

wheat mesa
#

Rob an NFT trader’s eth wallet

boreal iron
#

Jokes aside, things aren’t for free

earnest phoenix
#

Unless you want them to be

#

Anything is free if you have the balls

boreal iron
#

You gotta pay for your server, Sir, now!

marble juniper
#

Besides a vps isn't expensive

#

There are ones out there for 4.99$

#

As much as nitro classic lol

crimson vapor
sudden geyser
#

Is there a de facto guide for creating a bot application on the developer portal?

eternal osprey
#

I tried the networking tab in the hope to find a json or api response, but unfortunately there was none

proven lantern
#

is it possible to create an interaction button that opens another text channel in the guild when a member clicks it?

sudden geyser
#

By "open", do you mean switch the user's channel on their client?

#

Or something else, like unhiding a channel from the user.

craggy pine
#

Id imagine they mean the first option and I believe that’s a no but i could be mistaken

proven lantern
sudden geyser
#

yeah no

proven lantern
#

shucky dang darn

queen needle
#

what if you use the in app links?

sudden geyser
#

@quartz kindle does Discord have any API docs on how localized slash command descriptions will be done

boreal iron
#

Wut… World of Warcraft still exists… wow

woeful pike
#

WoW

quaint wasp
#

anyone ?

quartz kindle
quartz kindle
# quaint wasp anyone ?

i literally just added these 2 lines, and removed all of the column crap and the problem is gone

quaint wasp
#

thanks

green kestrel
#

my existing examples give an example of a message based comand, i'd like to move away from all that

fallen holly
#

What is this err
err:

/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/commands/moderation/timeout.js:30
    if (member.permissions.has("ADMINISTRATOR"))
               ^

TypeError: Cannot read properties of undefined (reading 'permissions')
    at Object.execute (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/commands/moderation/timeout.js:30:16)
    at Object.execute (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/events/Message/messageCreate.js:54:17)
    at Client.<anonymous> (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/Handlers/eventsHandlers.js:13:58)
    at Client.emit (node:events:402:35)
    at MessageCreateAction.handle (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/discord.js/src/client/actions/MessageCreate.js:26:14)
    at Object.module.exports [as MESSAGE_CREATE] (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/discord.js/src/client/websocket/handlers/MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/discord.js/src/client/websocket/WebSocketManager.js:351:31)
    at WebSocketShard.onPacket (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/discord.js/src/client/websocket/WebSocketShard.js:301:10)
    at WebSocket.onMessage (/Users/dhruvshah/Documents/GitHub/Archer-Bot/Bot/node_modules/ws/lib/event-target.js:199:18)

Code:
https://sourceb.in/LvBcTVt4Ar

earnest phoenix
#

member is undefined

#
const member =
      message.mentions.members.first() ||
      message.guild.members.cache.get(args[0]) ||
      message.guild.members.cache.find(
        (x) =>
          x.user.username.toLowerCase() === args.slice(0).join(" ") ||
          x.user.username === args[0]
      );

whatever the output of this is, is not a member

#

console log it

wheat mesa
#

member isn't cached then

fallen holly
#

i'm making timeout cmd if a mod run this cmd on admin i'm gonna return

boreal iron
#

Doesn’t change the fact you need to fetch the member as it’s not cached

#

Which probably requires the member intent

fallen holly
#

Could u tell me and example i don't understand

boreal iron
#

Well spoken trivial your bot doesn’t know that member, that’s why it has to ask Discord about him

fallen holly
#

aight

boreal iron
#

Keep in mind you probably need the privileged member intent to fetch members if I’m not wrong

quartz kindle
#

you dont need the intent if you're fetching a member by id

boreal iron
#

Just if you wanna fetch all members?

quartz kindle
#

ye

#

or more than 100 ids

boreal iron
#

Roger that

fallen holly
#

this is how i do it right ('Haven't coded in js in a while')

const member =
    message.mentions.members.first() ||
    message.guild.members.cache.get(args[0]) ||
      message.guild.members.cache.find(
        (x) =>
          x.user.username.toLowerCase() === args.slice(0).join(" ") ||
          x.user.username === args[0]);

    guild.members.fetch(member);

    if (member.permissions.has('ADMINISTRATOR'))
      return message.reply("You cannot put admin on timeout").then((sent) => {
        setTimeout(() => {
          sent.delete();
        }, 2000);
      });

austere surge
#

for a second i thought all of that was just to define membercause of the weird tab spacing at the first line lmao

fallen holly
#

try what

#

and if i do !timeout @[user] it does say u cannot put admin on timeout if i don't i give me the err

proven harbor
dry imp
#

lmao why?

proven harbor
#

"You'll waste it"

hybrid cargo
#

But ofc, it only works if the user clicking the button has access to that channel

hybrid cargo
carmine summit
#

either way, a laptop running in the basement costs only about $1-2 for about a month, if your laptop can handle the load

carmine summit
carmine summit
#

wait which is better? args.length or !args[0]

fallen holly
#

TypeError: Cannot read properties of undefined (reading 'permissions')

i added
guild.members.fetch(member).then(console.log(member));

carmine summit
#

maybe get the guild first if you havent gotten it already?

fallen holly
#

const guild = message.guild;

carmine summit
#

can you log member?

wheat mesa
fallen holly
#

the command works if i !timeout @[someone] but it does not work when i do !timeout

carmine summit
#

did you put the !args[0] return yet?

fallen holly
#

yes

carmine summit
#

maybe do something with the response?

fallen holly
#

huh

carmine summit
#

youre not doing anything with guild.members.fetch(member)

#

its just sitting there

#

and put !args[0] return up higher

#

and please use async/await if you can

fallen holly
#

none still not working

carmine summit
#

whats not working

fallen holly
#

still saying the same err

#

it works now after 5 hrs

dry imp
proven harbor
dry imp
#

doesnt make any sense, still dont know why that is your mom's problem

lofty musk
earnest phoenix
wheat mesa
#

The error itself means that you’re not giving it a parameter it requires

austere surge
#

hi

#

oh i know you

carmine summit
#

are you coding a website that has login or bot that logins to a website?

craggy pine
#

Would anyone know why this would be flip-flopping the result? It's a emoji check, probably trash code but just starting and trying out things.

const emoteRegex = /<:.+:(\d+)>/gm
findEmoji = (e) => {
  console.log(e)
  if(emoji = emoteRegex.exec(e)) {
    console.log("yes")
    return emoji
  } else if(emoji = animatedEmoteRegex.exec(e)) {
    return emoji
  } else {
    console.log("no")
    if(/\p{Extended_Pictographic}/u.test(e)) return e
    if(!/\p{Extended_Pictographic}/u.test(e)) return false
  }
}

https://scs.twilightgamez.net/swnLj.png
e = ![coiny](https://cdn.discordapp.com/emojis/944092741476974632.webp?size=128 "coiny") as seen in the console

carmine summit
#

oh you need oauth

#

in the discord dev page

austere surge
carmine summit
craggy pine
# carmine summit does it return the emoji or a bool?

so ig it's meant to output something like this

[
  '![coiny](https://cdn.discordapp.com/emojis/944092741476974632.webp?size=128 "coiny")',
  '944092741476974632',
  index: 0,
  input: '![coiny](https://cdn.discordapp.com/emojis/944092741476974632.webp?size=128 "coiny")',
  groups: undefined
]
#

I'm mainly just trying to grab the id itself

#

nope

carmine summit
#
austere surge
#

what do you want to access from the user

carmine summit
#

yeah I think you need identify

austere surge
#

most user information is from identify
guild info is from guilds

#

i recommend just getting identify and guilds

#

you probably didnt set one

carmine summit
#

add a uri

austere surge
#

theres another tab for the uri

craggy pine
# carmine summit https://www.w3schools.com/jsref/jsref_match.asp

not 100% sure if this is what I'm needing, tho I don't have much experience working with emojis. But the user would input something like reactrole <id of msg> xmiyukACheer <role> ( xmiyukACheer being the custom ) and I'd extract the ID of the emoji used. Atleast from research, a decent approach is with exec with the regex shown in the example !xmiyukACheer

carmine summit
#

id and the name of the emoji?

craggy pine
#

nah simply the id

carmine summit
#

or the id only?

austere surge
#

whatd you set it to

carmine summit
#

do you need to get multiple emojis?

craggy pine
#

single

austere surge
#

did you use http(s):// ?

craggy pine
#

the reason for the function is if the emoji they provide is a global emote like πŸ˜„

#

so it can check both

austere surge
#

ok

carmine summit
#

@craggy pine/<.*:(.*)>/gi.exec("wdfeawd<wdafesgr:asvawdaw>awdawdadwdeg")[1] gosh why is regex so hard.... btw if [1] is undefined just search for global

#

oh wait, i forgot the colon at the start

/<:.*:(.*)>/gi.exec(str)[1]
craggy pine
#

interesting

round cove
#

Oh you're doing what I used to lmao.

craggy pine
#

Oh ya?

round cove
#

Are you not using slash commands?

craggy pine
#

Nah

round cove
#

I mean my main bot is a react role bot.

#

Xd

#

Best bet for checking for custom Discord emojis is doing /\d{17,19}/.match(myAssumedEmoji)

#

If it doesn't match the 17-19 decimal range check it against a unicode list.

#

There is a nice package out there that handles that and the regex for you.

craggy pine
#

/\p{Extended_Pictographic}/u.test(e)

#

is what I use for globals

round cove
#

Did you make your own

craggy pine
#

stinky copy pasta πŸ˜›

round cove
#

yikes

#

here

#
craggy pine
#

im like 100% new to this. But hey I'll take a package to simplify my life anyday

round cove
#

yeah trust me

#

I wish I did this at the start

#

lmao

carmine summit
#

bro i cant understand why regex is so hard

round cove
#

it's not

craggy pine
#

it melts my brain

carmine summit
#

the simplest thing I took like 15 minutes

round cove
#

It's only complicated when you start going schitzo mode trying to solve everything with it.

craggy pine
#

also another stink that discord does.

#

Doesn't allow @&20982390480 in an embed field for a role ping

carmine summit
carmine summit
#

iirc global is <:1234:> right?

craggy pine
#

well I do use the <> obv

#

lol

carmine summit
#

and custom is <abc:1234:>

#

?

round cove
#

My bot for comparison.

craggy pine
#

da fuk

carmine summit
#

v11 cringee

round cove
#

I'm on latest.

#

But thanks

craggy pine
#

I still use emojis in v13 sometimes

round cove
#

Buttons are ugly

#

Having 25 buttons on a thing is nasty.

craggy pine
carmine summit
#

they look better imo

round cove
#

It looks right.

craggy pine
#

so da fuk

craggy pine
round cove
#

  public static reactRolesFormattedString = (reactRoles: ReactRole[]) => {
    return reactRoles
      .map((r) => `${r.emojiTag ?? r.emojiId} - <@&${r.roleId}>`)
      .join('\n');
  };```
#

<@&ID> so yeah

craggy pine
#
<@&${guildRole.id}>
#

litterally what I do basically

#

guildRole = your r

round cove
#

Is it in the title possibly on accident?

craggy pine
#

nope

round cove
#

Remove the bold. it's not gonna do anything but.

#

Also if you copy and paste that does it ping a role for you?

craggy pine
#

yap

pale vessel
round cove
#

Just to confirm the ID is right.

pale vessel
#

why not buttons?

round cove
#

stay + mad

#

I literally hate how they look.

craggy pine
#

it's only bold because it's in the first part of the field. thing, blank text, false

round cove
#

Oh.

hybrid cargo
round cove
#

Make it your embed description.

craggy pine
#

ah

hybrid cargo
#

Roles dont get pinged in field name

round cove
#

^

craggy pine
#

That LITTERALLY what i asked you dylan

round cove
#

I completely misunderstood.

#

Xddd

craggy pine
#

but ty

#

πŸ˜›

hybrid cargo
#

How you doin dylan πŸ‘€

round cove
#

To reiterate my point I dislike buttons because big + ugly + on mobile with 25 buttons? bye.

solemn cipher
round cove
#

I'm fine, yourself?

hybrid cargo
#

Yee

hybrid cargo
#

But again that could be messed up at times

austere surge
#

yes

round cove
#

I use select menu for some things

#

But it only allows 10 max so.

hybrid cargo
#

what?

#

Select menu max is 25

#

πŸ‘€

round cove
#

Oooh.

#

But still.

#

:))

hybrid cargo
#

And a message can have upto 5 select menus

#

aka 125 πŸ’€

austere surge
#

diff categories of roles in one message >:D

round cove
#

That'd be an interesting setup.

hybrid cargo
#

yeah, categorize the roles and give the option to have 5 categories per message

round cove
hybrid cargo
#

Oh open sourced

round cove
#

open source gang vivinaenae

craggy pine
carmine summit
austere surge
#

imagine not

craggy pine
#

bruh it's such a bad habbit now

#

i dont care anymore KEKW

carmine summit
hybrid cargo
#

all we need is a role for testing, who cares what the name or how the name is written

hybrid cargo
round cove
#

I was proud of it

hybrid cargo
#

well i dont have those button or select menu handler tho, since i dont have any use for em

round cove
#

clean enough code

hybrid cargo
#

yeah pretty clean, although u followed a bit of py formatting πŸ’€

#

But we dont do that here in the js/ts gang

craggy pine
round cove
#

I've never done python development seeing I've only done C++/TS

hybrid cargo
round cove
#

It'll match it yeah

#

But that's why my code had r.emojiTag because I save in the db <(a)?:nn:id>

#

Because it's possibly animated.

hybrid cargo
#
/\<(a)?\:.+?\:(\d{17,19})\>/g
```Is what i use
round cove
#

And ensure it's a custom discord one or unicode.

#

I should've replaced the 10,20

#

it's old code pelase don';t hurt me

hybrid cargo
#

Lol

#

But this is where i got stuck. I was using \w too until i realized some emojis had underscores and other characters in name, so i moved to the lazy . operator instead

round cove
#

Ah I see.

#

Good point.

craggy pine
#
    if (customEmoji) {
      /**
       * 0 - Matched regex
       * 1 - 'a' if it is animated. Otherwise it's empty.
       * 2 - ID
       */
      isEmojiAnimated = customEmoji[1] === 'a';
      emojiId = customEmoji[2];
    } else {
      const unicodeEmoji = emoji.match(this.emojiRegex);
#

I see how you do the global vs custom

round cove
#

yeah

craggy pine
#

a lot better than my shitty function bs I was trying to do ngl

hybrid cargo
#

is it? πŸ‘€

pale vessel
#

yeah

round cove
#

Thought only whitespace would be

hybrid cargo
#

afaik i thought it only includes a-zA-Z0-9

round cove
#

I always refer to regexr(site) when doing this stuff

hybrid cargo
#

Time to find out

hybrid cargo
round cove
#

poggers.

hybrid cargo
#

Okay thats cool

#

But

#

How about special characters πŸ’€

round cove
#

can you make an emoji with that

pale vessel
#

\w- GuraCool

#

- isn't supported for emojis

round cove
#

there we go

hybrid cargo
#

Oh okay then, time to move to \w back

round cove
pale vessel
#

unrelated but discord uses \w- for slash command names

#

^[\w-]{1,32}$ to be specific

round cove
#

makes sense I guess

hybrid cargo
#

wait what does \w- do again

round cove
#

it's a capture group

#

so either alpha or -

#

some combo of them

hybrid cargo
#

Oh wait im dumb

#

I thought \w- itself is a type of.. uk

#

πŸ’€

#

zoned out for a sec there boohoo

round cove
#

Oh to show select/button

#

click button

pale vessel
#

but they look ugly!

round cove
#

exactly

hybrid cargo
#

Shit

round cove
#

this is only to make it super smooth to add to category

hybrid cargo
#

U could use select menu to display all the not in category too and let users select multiple roles (options) to add at once πŸ‘€

round cove
#

How does Discords thing handle multiple selections and how does it know when to submit them?

hybrid cargo
#

Just sends the array of all the selected items

craggy pine
round cove
#

I've not seen it but.

craggy pine
hybrid cargo
#

dont even make me remember this, i got so tired trying to parse all emojis in a string like 4 days ago πŸ’€

round cove
#

I don't miss doing that from message contents

#

The only reason slash commands are good

#

getting all my arguments.

hybrid cargo
round cove
#

Was happy with my slashcommand abstract class

#

extract variable

hybrid cargo
round cove
#

Nice

craggy pine
#

that's pog

hybrid cargo
#

also ignores emojis if its from the current guild

round cove
#

Interesting

#

I've wanted to mess with the apps thing

#

currently trying to find motivation to finish the dashboard

hybrid cargo
#

I just match all the emojis from strings and construct the partial emoji object, and then for all the ids, just check it with the guild's emoji's IDs before adding em

hybrid cargo
round cove
#

Pulls from a test DB of a server of mine.

hybrid cargo
#

Oh damn, looks great

round cove
#

Most of my work has been going into ensuring user auth/jwt shit

hybrid cargo
#

the fact that the interaction in the website is really close to discord itself makes it more cool

carmine summit
hybrid cargo
round cove
#

Everytime I see a bot dashboard I doubt it has real authorization

carmine summit
#

maybe darken the div when mousehovered, add the pfp, bolden the BOT text...@round cove

round cove
#

the font i'm using doesn't look great bolded so I left it.

#

I need to import discords font to use for that component though

carmine summit
#

maybe change the font?

solemn cipher
carmine summit
#

see what font discord is using

#

its porbably in their css

round cove
#

it is

#

I just have not done it

#

laziness

hybrid cargo
#

For some reason when i open videos on fullscreen from discord, it plays it in like 5 fps

solemn cipher
# round cove ?

i have a rules bot and i shipped the two since i thought it would be funny

round cove
#

ahhhhhh

slender thistle
#

It fails with 4k videos for me

#

Keeps loading like my internet is single-digit Kb/s

orchid nebula
#
const client = new Discord.Client() // Your discord.js or eris client (or djs ShardingManager)
const { AutoPoster } = require('topgg-autoposter')

const ap = AutoPoster('Your Top.gg Token', client)

ap.on('posted', () => {
  console.log('Posted stats to Top.gg!')
})

Will it work for posting server count of on top gg page

#

I tried this but it is not working like stats didn't posed on page

#

I used this code in my index file!

cinder patio
#

Is this the exact code you used?

#

like, all of it?

orchid nebula
#

Ohh it is working now maybe some lag in site there is wasn't showing

bright thorn
#
const { Schema, model } = require("mongoose");

module.exports = model(
  "History",
  new Schema({
    userId: { type: String },
    tracks: { type: Array },
    createdAt: { type: Date, expires: null, default: 604800 },
  })
);
``` Schema delete after 10 to 20 sec but i mentioned `604800` why its happening anyone can tell me
timber fractal
#

how would i import a different JS file, while using JS in a browser?

pale vessel
#

use the script tag

cinder patio
#

or a bundler

earnest phoenix
#

can anyone help me with mongodb? just a bit of explaining in the indexing part and a few more functions

#

I just don't get it

#

is this possible? ```js
const db = client.mongo.db("User");
const info = db.collection("author")
let queryo = {author: message.author.id }
let result = info.findOne(queryo)
let query = {author: vote.user, coins: 800, silver: 1 }
let quer = {coins, silver };
if(!result) info.insertOne(query)
info.updateOne(quer, { $set: { coins: 800, silver: 1 } })

pulsar bone
green kestrel
#

if the end goal is simplicity, the intents are not needed in this example yes?

const Discord = require('discord.js')

let BOT_TOKEN   = 'enter your token';
let MY_GUILD_ID = '825407338755653642';

let bot = new Discord.Client({
    intents: [
        Discord.Intents.FLAGS.GUILDS,
        Discord.Intents.FLAGS.GUILD_MESSAGES,
        Discord.Intents.FLAGS.DIRECT_MESSAGES
    ]
});

bot.on('interactionCreate', (interaction) => {
    if (interaction.isCommand() && interaction.commandName === 'ping') {
        interaction.reply({content: 'Pong!'});
    }
});

bot.once('ready', async () => {
    let guild = await bot.guilds.fetch(MY_GUILD_ID);
    await guild.commands.create({
        name: 'ping',
        description: "Ping pong!"
    });
});

bot.login(BOT_TOKEN);

the intents just means another thing to explain to the reader?

earnest phoenix
#

the intents are supposed to give you access to some information that the bot can't get without intents

green kestrel
#

the only one it looks like it needs is guilds

earnest phoenix
#

a bot can work without them

green kestrel
#

the only one there is, is bot.guilds.fetch

#

at no point does that example need to receive DMs or guild messages? its purely slash commands

earnest phoenix
#

you can remove what you think is unnecesary and try

green kestrel
#

i dont do js πŸ˜›

#

i asked someone to make me this example to put side by side with my C++ example for a tutorial

#

considering i dont even have node installed, it was faster to ask

pale vessel
#

you don't even need guilds actually, that's for receiving guilds on startup and slash commands don't need them, although it might not work on discord.js since it relies on cache

green kestrel
#

yeah it looks like the registration of the slash command relies upon the cache @pale vessel

feral aspen
#

We can't tell, honestly.

carmine summit
#

do I have to export.functionName every function in my file that I need to export? or can I so something like export the whole file?

slow ibex
#

Okay.. i know this has to be a really simple thing.. but i cant get my head around that..
Im currently reworking my Bot for use with slashcommands.. but for some reason i get this error for this core

Error:
TypeError: Cannot read properties of undefined (reading '879376100273311774')

Code:

const guildID = interaction.guild.id;
const voiceChannelID = interaction.member.voice.channel.id;
const channel = interaction.channel;

// console.log(guildID);
if(!queues[guildID] || queues[guildID] === "undefined") {
          ^ 
  queues[guildID] = new Queue(guildID, voiceChannelID, channel);
}
green kestrel
slow ibex
#

Also.. since i started using the CommandBuilder i get this Warnings at Startup:

(node:8640) Warning: Accessing non-existent property 'defaultTimeout' of module exports inside circular dependency
(Use `node --trace-warnings ...` to show where the warning was created)
(node:8640) Warning: Accessing non-existent property 'queues' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'client' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'lavacordManager' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'client' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'defaultTimeout' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'firebase' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'database' of module exports inside circular dependency
(node:8640) Warning: Accessing non-existent property 'randomstring' of module exports inside circular dependency
summer acorn
#

WHAT THE FUCK IS THAT ERROR

quartz kindle
#

you have an if in a wrong place?

quartz kindle
#

meaning you are requiring file A which requires file B which requires file A again and makes an infinite require loop

slow ibex
#

Now my main issue is that Lavacord is not updated for Discord.JSv13

quartz kindle
#

get some other lavalink library then

#

there are several

slow ibex
#

Yup currently rewriting to erela.js

#

Okay.. ive got it almost to work.. but.. Erela.JS errors out with "No current Track"... but i give it a track?
await this.player.play(nextSong.track);

azure lark
#

what is a good api that i can use for image manipulation with node?

quartz kindle
#

sharp

boreal iron
#

blurry

maiden nimbus
#

How can I set the status of my bot to show how many votes there are, please explain in more detail.

tawdry delta
#

Should add 'ssdnodes' to that list πŸ™‚

maiden nimbus
#

@spark flintI have nothing to put in the status of a bot, so I wanted to put how many votes there are and the command that will reach the voting link

spark flint
#

Just doesn’t seem like a good idea putting top.gg vote count

earnest phoenix
#

i agree

spark flint
#

What if I wasn’t a top.gg user?

#

Why would top.gg vote count be relevant to me)

split hazel
#

@zealous veldt update the list you cunt

maiden nimbus
#

Do you have any idea what to put on the status?

spark flint
#

That’s why you put something like server count or user count

split hazel
#

my guy chinoman10 just gave a good suggestion

maiden nimbus
#

and you're right

maiden nimbus
#

when I last managed to see how many members there were, there were 100,000 and more

spark flint
#

Popular VPS Providers
Being on this list does not in any way shape or form represent a partnership or endorsement from me or Top.gg, all prices shown in USD unless otherwise noted

If you have suggestions to add to this list please let me know and I'll look into adding them

spark flint
#

Updated with latest prices/deals

boreal iron
#

not really the best prices

spark flint
#

I’ll add Contabo

#

Just on a train lol so wifi sucks

earnest phoenix
#

and thats not cheap

split hazel
#

who is my favourite moderator

#

um uh

#

@rustic nova@rustic nova@rustic nova@rustic nova you ig pin this pls

boreal iron
#

that list is totally shit tbh

spark flint
#

I’m trying to change now

split hazel
#

lmao it really is

#

first 2 are good

#

add GCP's free tier VM

rustic nova
#

???

boreal iron
#

lol mentioning digital ocean and good in one sentence wtf

quartz kindle
#

hetzner, kamatera, google compute engine, amazon aws

spark flint
#

AWS no

#

They charge so much for bandwidth

split hazel
quartz kindle
#

but its free for 12 months

#

good for starting

spark flint
#

90% is from the original list, gimme suggestions and I’ll update fully

#

With newest deals

boreal iron
split hazel
#

lmao

boreal iron
#

wrong mention

quartz kindle
#

also, wasnt oracle offering pretty good deals?

spark flint
#

Yeah oracle is good

split hazel
#

and make sure to mention for GCP the specific settings you need to set to qualify for free tier otherwise you'll end up paying accidentally like me

quartz kindle
#

heard good things about upcloud

boreal iron
spark flint
#

Good idea

split hazel
#

something like
- GCP
- Free tier Micro instance
- make sure to change the disk to a standard 30GB otherwise you'll PAY

#

cheeky of google to make the premium disk the default