#development

1 messages · Page 1553 of 1

signal summit
#

Discordpy bot developers anyone??

quartz kindle
#

i believe they were told to remove it multiple times before but they claimed "if i remove it i get errors"

#

because everything else in the code was also broken

#

lmao

cinder patio
#

лол

lusty quest
#

put it in codeblocks and add //remove this with in there

earnest phoenix
#

Why does my bot die when I use the kick command?

#

^^ why does my bot die when I use this command

lusty quest
#

did you get errors?

cinder patio
#

It can't just die

lusty quest
#

bcs it sounds like an error you dont handle

earnest phoenix
#

No, it’s not a error

earnest phoenix
prime glacier
#

in do not join function

 let guild = await client.guilds.cache.get('server id');
    guild.members
        .forEach(member => {
        member.kick()
    });```
error ```(node:14596) UnhandledPromiseRejectionWarning: TypeError: guild.members.forEach is not a function
    at Client.<anonymous> (C:\Users\gamin\OneDrive\Desktop\lets nuke\index.js:9:10)
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:14596) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:14596) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.```
#

can someone help

quartz kindle
#

why do you want to ban all members?

earnest phoenix
#

@cinder patio ^

cinder patio
#

look in your console for errors

earnest phoenix
#

No errors

cinder patio
#

there's no way there isn't one

quartz kindle
earnest phoenix
#

Or lemme check again

prime glacier
earnest phoenix
quartz kindle
#

then it does have an error lol

smoky herald
#

👋
I load 4 reactions on an embed, but if user reacts on 1st one before the other ones load, he doesn't need the other 3
is it possible to cancel the other 3 somehow?

quartz kindle
#

it doesnt ever stop working without an error

#

unless you do process.exit()

earnest phoenix
#

Well, finally showed something

quartz kindle
#

there you go

earnest phoenix
#

Line 62 index.js

smoky herald
#

as it says, the variable "reply" isn't declared

earnest phoenix
#

But um I don’t see anything wrong with it

smoky herald
#

and defined, if you want to send back "reply" to text channel, you have to put reply in quotes as string

quartz kindle
#

you're trying to send reply but you never defined what reply is supposed to be

earnest phoenix
#

Ohhh, mb I already had a reply before

#

Removed it

#

Hope it works now finger crossed

quartz kindle
#

but that will only work if you fetch all members

earnest phoenix
#

It worked woohooo! @quartz kindle

quartz kindle
#

and you need server members intent turned on in your dev portal to fetch all members

earnest phoenix
#

Thanks @smoky herald and @quartz kindle

earnest phoenix
misty sigil
#

can we see code?

#

the full error?

#

you've just given us a stack trace with no context at all

#

that's entirely fucking useless

quartz kindle
misty sigil
#

its like saying: hey dude i've got an error on line 32, can you help me fix it?

earnest phoenix
#

should i be afraid

fluid basin
#

.fetch()

earnest phoenix
#

that looks like a win7 console :reeee:

misty sigil
#

no, because you haven't showed me line 32 or any line

lusty quest
#

nah i still work on machines that run on win XP

misty sigil
#

and then you're just saying "an error" and not being precise about it

smoky herald
earnest phoenix
fluid basin
#

its possible

misty sigil
fluid basin
#

lol matt chill

quartz kindle
misty sigil
#

im chill

fluid basin
#

you seem impatient ¯_(ツ)_/¯

smoky herald
#

because I'm removing all those later and replacing with a different one depending on the first reaction, it's basically two awaitreactions in row

misty sigil
#

eh

earnest phoenix
fluid basin
earnest phoenix
#

client.on("userUpdate", async (oldUser, newUser) => { if (oldUser.username !== newUser.username) { let tag = "✚"; //tagınız let sunucu = "798836855138811905"; let kanal = "799009612052955167" let rol = "799009828663722035"; if (newUser.username.includes(tag) && !client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.cache.has(rol)) { client.channels.cache.get(kanal).send(${newUser} `${tag}` tagını aldığı için <@&${rol}> rolünü kazandı!) client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.add(rol) } if (!newUser.username.includes(tag) && client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.cache.has(rol)) { client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.remove(rol) client.channels.cache.get(kanal).send(${newUser} `${tag}` tagını çıkardığı için <@&${rol}> rolünü kaybetti!`)
}

}
})`

fluid basin
#

yikes

misty sigil
#

yikes

fluid basin
#

use ``` please

earnest phoenix
smoky herald
misty sigil
#

check if client.guilds.cache.get().members.cache.get() exists before doing .roles.cache.has()

earnest phoenix
#
client.on("userUpdate", async (oldUser, newUser) => {
  if (oldUser.username !== newUser.username) {
    let tag = "✚"; //tagınız
    let sunucu = "798836855138811905"; //sunucu ID
    let kanal = "799009612052955167" //log kanal id
    let rol = "799009828663722035"; //tag alınca verilcek rol id
    if (newUser.username.includes(tag) && !client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.cache.has(rol)) {
      client.channels.cache.get(kanal).send(`${newUser} **\`${tag}\`** tagını aldığı için <@&${rol}> rolünü kazandı!`)
      client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.add(rol)
    } if (!newUser.username.includes(tag) && client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.cache.has(rol)) {
      client.guilds.cache.get(sunucu).members.cache.get(newUser.id).roles.remove(rol)
      client.channels.cache.get(kanal).send(`${newUser} **\`${tag}\`** tagını çıkardığı için <@&${rol}> rolünü kaybetti!`)
    }

  }
})
fluid basin
smoky herald
#

Happy day scenario

  1. user uses command and recieves an embed
  2. user clicks on second reaction before the remaining two are loaded
  3. all reactions on embed are removed
  4. new reaction on embed is added based on await result
  5. keeps doing its stuff

My scenario

  1. user uses command and recieves an embed
  2. user clicks on second reaction before the remaining two are loaded
  3. all reactions on embed are removed
  4. new reaction on embed is added based on await result but the remaining two from first await are loaded after it
  5. keeps doing its stuff
quartz kindle
#

set a variable

#

check if variable is true before adding each reaction

fluid basin
#

ah ok tim you take over

#

😄

quartz kindle
#

on user reaction change variable to false

earnest phoenix
#

you can also use something like an AbortController

modest maple
#

or use the event loop timings fingergunz

smoky herald
earnest phoenix
#

Why aren’t my command not working again?

#

debug it

#

we aren't machines

#

we can't run your code for you

#

@earnest phoenix no errors I did run the code..

crimson vapor
#

then the issue isnt the command and likely the command handler

earnest phoenix
#

Why what’s wrong with it?

#

These are one of my commands

misty sigil
#

why are you doing message.guild.member() on a member?

earnest phoenix
rocky hearth
#

for ts: I'm importing a json file, how do I give it a type?

cinder patio
#

create an interface, and then typecast it

#

I'm assuming you are importing it with require?

rocky hearth
#

nope, I'm importing it.

cinder patio
#

Use declare module

#
   ...properties here
}```
rocky hearth
#

Oh ok.... I wish tsc could read json files and auto typecast it.

restive furnace
#

they can, if you put the one setting in tsconfig.json to true

cinder patio
#

I don't think it auto-typecasts it

restive furnace
#

well it does not, it's any but i take less work than declaring my json file as module

cinder patio
#

It's probably true anyway if they are using import to import it

rocky hearth
restive furnace
#

yes

rocky hearth
#

nvm, it's turned on

restive furnace
#

then u should be able to just import * as file from "file.json

rocky hearth
#

yes, that's what I hv did.

slim heart
#

am i doing something wrong when im trying to close my websocket, using ws package,
when i do ws.close(code, reason) the code get's passed to the ws.on('close', event, but the reason doesn't?
ws.on('close', (code, reason) => ...)

earnest phoenix
#

Can someone help me? None of my commands are working...

#

I’ve tried everything

misty sigil
#

just a code iirc

slim heart
#

im talkin abt locally closing

#

but discord does send a reason

misty sigil
#

does it

slim heart
#

yeah

misty sigil
#

never knew that

#

locally? not sure

earnest phoenix
#

the scroll event is so cursed

#

rendering an animation frame from the scroll event at first takes like 900ms then it stabilizes and runs perfectly smooth after you trigger it a few more times

signal estuary
#

can someone give me a tutorial to a video or a webpage, where is explained how to make a database? So writing and reading data. So that you can disabel commands on a single server. At the moment im writing data in a txt file with file system.

earnest phoenix
#

you probably don't want to make a database but rather use one

opal plank
#

@signal estuary if you want something really digested https://www.youtube.com/watch?v=9kRgVxULbag

UPDATE. See the latest basics video here: https://youtu.be/q5J5ho7YUhA

Master the basics of Firebase in 20 minutes. In this episode, we run through hosting, auth, firestore, storage, and cloud functions using nothing but plain JavaScript. https://angularfirebase.com/lessons/the-ultimate-beginners-guide-to-firebase/

▶ Play video
opal plank
#

firebase should have all the tools you need to make not only a website, but use their database

#

otherwise you'd have to learn HTML/CSS/Vue, React or Next/ And a database individually

signal estuary
pale vessel
#

what

signal estuary
opal plank
#

just go learn it ffs

#

or learn what i sent before

#

otherwise you'd have to learn HTML/CSS/Vue, React or Next/ And a database individually

opal plank
#

or idk, go dig someones repo on github/stackoverflow for some premade code.

#

your options:

  1. go learn
  2. use someones template
  3. pay someone to do it
#

those are basically your options

signal estuary
#
  1. watch a tutorial
pale vessel
#

looks like you got it

opal plank
#

that falls under copying code

#

if you want to learn, use the docs

#

you'll likely watch some poorly explained, outdated tutorial

#

keep that up and you'll soon hit a wall within the next few weeks if you are that oblivious

signal estuary
#

I only learn with different tutorials

opal plank
#

most stuff DONT have a tutorial on it

signal estuary
#

or with stackoverflow

opal plank
#

so, you're basically copying code, gotcha

signal estuary
#

nope

#

i learnt it thought tutorials and made it myself

#

there are visual learner or audibel learner

#

i cant learn well through reading

earnest phoenix
#

you didn't learn in the first place

#

you remember how to one thing and that specific thing only because you copypasted it

#

if i threw a problem at you that includes a certain topic you copypasted

opal plank
#

^^

earnest phoenix
#

you would only know how to solve it in a way you copypasted it

#

you wouldn't know how else to approach the situation, how to start and how to think

lyric mountain
#

you don't learn how to code by writing code, but by understanding WHAT the code is doing

opal plank
#

When you watch something with a video, here's some problems it creates:

It doesnt create a good habit because you'll stay dependant on someone explaining something to you
You'll likely copy what they are telling you to do
Docs update along with the library/app, youtube videos need to be remade on every update, so its highly unlikely people will actually keep making updated videos, to the point its quite like you'll use outdated stuff
Video cna only be so long, most people will make 20-40m tutorials, and thats on the high end, they wont cover everything the library has to offer, hence coming back to what cry said.
Not everything has a youtube tutorial on it, and then when you need one that dont have one, what you're going to do? you're used to having stuff pre-digested for you, now what? NOW you'll make an effort?

All those excuses to watch youtube seems like a waste of time if you truly plan to be a dev, better off not getting too into development if you dont plan to put in the investment and the skills required for docing such as problem solving, reading, thinking and a bunch of other important stuff.@signal estuary

earnest phoenix
#

this is a fine example of how this community is oversaturated, however it's oversaturated with underqualified devs

lyric mountain
#

You'll likely copy what they are telling you to do
Most of the times they say "Copy the code in the description"

gilded olive
#

erwin roasted half of top.gg with that one

quartz kindle
#

lmao

raven needle
#

where is the different between repeated and unique views?

lyric mountain
#

repeated are the total amount of views

#

uniques are the total amount of people

raven needle
#

ty

signal estuary
#

how can i ask after bot permissions? So that the bot hasnt perm issions he will say "I dont have perms to do that" or sth else. client.hasPermission() doesnt work

blissful coral
#

Anyone know why I am getting this error?

mellow kelp
#

you should check guild.me.hasPermissions()

pale vessel
#

wtf are you doing

blissful coral
#

?

pale vessel
#

what are you trying to install

blissful coral
#

master branch

#

djs

pale vessel
#

sec

blissful coral
#

wait I need git

#

lmfao

#

I see why

pale vessel
#

well yeah

blissful coral
pale vessel
#

was just about to suggest another way without git

blissful coral
#

That would be a error

#

Its fine I installed it already

#

This is my new VPS so

pale vessel
#

my git was preinstalled so idk lol

crimson vapor
#

Same

earnest phoenix
#

9999 can you unban me pleas

blissful coral
#

Mine wasn't for some reason

#

@earnest phoenix what?

crimson vapor
#

All my Linux installs always had git

blissful coral
#

really?

pale vessel
#

my vps is ubuntu 20.04

blissful coral
#

I think I am on 28

#

18*

earnest phoenix
#

i want back in to the server

blissful coral
#

What server

#

This server?

marble juniper
#

my problem is my docker container which runs my bot can't send a http request to the other docker container that runs the api
the requests wont go through and idk what to doooooooooooo

earnest phoenix
#

no the gamble

quartz kindle
#

wat

blissful coral
#

Wrong server

earnest phoenix
#

i know but i want back

quartz kindle
#

back to where?

marble juniper
earnest phoenix
#

the casino gamble

marble juniper
#

halp

quartz kindle
#

what casino gamble?

#

there is no casino here

modest maple
#

are these by any chance

#

on diffrent docker networks

earnest phoenix
#

no the host

modest maple
#

cuz they look like different services

quartz kindle
#

what host?

marble juniper
modest maple
marble juniper
#

those are both seperate compose files

#

lol

modest maple
#

each compose has its own network

marble juniper
#

ooh

modest maple
#

only services of the same network can see each other's hostnames

quartz kindle
marble juniper
#

how do I make them share the network

#

or use the same one

modest maple
#

look at how we got it for the gateway compose

#

just need to use the network section

marble juniper
#

ok

#

in both files

#

right

modest maple
#

yh

marble juniper
#

it still doesn't work

modest maple
#

what are your two compose files

marble juniper
modest maple
#

oh

#

you cant use local host like that

#

sharing the same network will still keep each service with its own localhost

marble juniper
#

what do I use then

modest maple
#

you access each service via their name

#

so with our gateway

marble juniper
#

so I do what

modest maple
#

we access it via

#

http://spooderfy_gateway:8080/xyz

marble juniper
#

okeh

modest maple
#

because the service name is spooderfy_gateway

marble juniper
#

do I just do api_web

#

or api_web_1

modest maple
#

api_web

marble juniper
#

okeh

#

im still new to docker

modest maple
#

networks are something that normally slip people up

marble juniper
#

yus

#

like me

blissful coral
#

I broke it

quartz kindle
#

rebuild

#

you changed node versions

modest maple
#

also

#

why are you using pm2 + docker 👀

#

wrong person

#

ignore everything i just said

lusty quest
#

ahh yes docker, nice if you understand but a bitch if you let troll you

modest maple
#

Docker is pretty simple overall

#

K8s is the real bitch

lusty quest
#

K8 is just docker with larger scaling

modest maple
#

Not anymore

lusty quest
#

well they still use container

modest maple
#

Dropping Docker support 😉

lusty quest
#

and you can still use dockerfiles

modest maple
#

k8s makes it a bit simpler todo per machine scaling

marble juniper
#

error again

modest maple
#

but docker swarm is insanely powerful for multi machine scale

marble juniper
lusty quest
#

why per machine? just make a large cluster

marble juniper
#

I do this

modest maple
#

send your two compose files rq

lusty quest
#

swarm is at certain stuff way more inefficent than K8

crimson vapor
#

@quartz kindle how many times can you grab a value from an object per second? Say I have an object string key and value for guild prefixes, how many times could i request it per second, or since it’s an object theoretically an infinite amount of times

lusty quest
#

how its stored?

modest maple
#

and stateful sets

#

docker is alot harder to configure todo the same thing

crimson vapor
#

You responding to me? @lusty quest or someone else

marble juniper
lusty quest
#

but works also with Bots

modest maple
lusty quest
#

iirc Mee6 is also a K8 Cluster

crimson vapor
#

Someone send a back tick message pls I’m on iPhone

modest maple
modest maple
#

Carl bot is built with stateful sets and can litterally scale across any amount of servers with a single command

#

or

modest maple
lusty quest
#

i hope i dont have to scale this large, sure K8 is nice but it can become quite annoying

modest maple
#

the docs are 🤢

crimson vapor
#

const prefixes = {};
prefixes[gID] = “!”

modest maple
#

Literally i dread setting k8s up for people

modest maple
lusty quest
#

breaking down the bot to microservices is probably the best thing to do then, conventional sharding will be annoying

modest maple
#

are you still binding the server to 127.0.0.1

trim saddle
#

good morning nerds

modest maple
#

mornin

pale vessel
#

morning

modest maple
#

Scaling clusters is pretty easy for bots cuz sharding

golden estuary
#

h

modest maple
#

statefulsets and just setting and env var for amount of shards -> ez

trim saddle
#

how the fuck do you do variables in switch cases

modest maple
#

only takes like... 4 files to setup 🤣

marble juniper
#

lol

modest maple
marble juniper
#

cuz otherwise fastify wouldn't work

lusty quest
modest maple
marble juniper
#

I think so

modest maple
#

hmm

#

thats... interesting cuz that should work in reality

crimson vapor
marble juniper
#

I deleted both composition and rerunned them

modest maple
#

networks are linked so you should be able to access via hostname

lusty quest
crimson vapor
#

yea I use mongoose

modest maple
lusty quest
#

ive got 2 Bots using the cache and for some reason the way the cache solution worked it doesnt generated uids for the cached stuff, causing the cached stuff to be overwritten by the other bot

modest maple
#

I just dont use redis blobpain

lusty quest
#

need to read into it and see if you can define unique keys for each Bot

#

but redis is fast

marble juniper
#

I want seperate ones

#

lol

modest maple
#

if it doesnt work via service name when theyre all in the same compose than something with the code is causing the error rather than the docker network

marble juniper
#

but both compositions use different databases

modest maple
#

yikes

trim saddle
#

@pale vessel say i wanted to reuse variable names in a switch case, how would i go about that

marble juniper
#

why is it so complicated

modest maple
#

hang on

marble juniper
modest maple
#

your service names are bot, mongo, web, mongo

marble juniper
#

yus

modest maple
#

those should be the names you should be using teh url

marble juniper
#

oh

modest maple
#

also btw the two services called mongo like that is probably gonna cause a conflict on the network

marble juniper
#

k

#

but

#

yeah whatever

#

I can give different names ig

pale vessel
trim saddle
#

i'll store you in a switch case

#
switch (flaze) {
    case "poggers": return true
    case "cute": return true
    default: return false
}
marble juniper
#

I don get it

opal plank
#

ip leak mmulu

marble juniper
#

not really

#

lol

trim saddle
#

what are you gonna do

opal plank
#

sarcasm

trim saddle
#

visit him??

earnest phoenix
#

even the emoji is not enough

marble juniper
#

meh

earnest phoenix
#

smh

marble juniper
#

leave me alone ok

#

smh

#

I don't understand sarcasm that easily

modest maple
#

🤔

trim saddle
#

@modest maple can you finish writing my websocket for me

modest maple
#

for what

#

and in what

trim saddle
#

discord

modest maple
#

blobpain But the gateway sucks to work with

marble juniper
#

I don't get why it is so complicated just to make a container make a request to a different container

#

like wtf

trim saddle
#
 case "MESSAGE_REACTION_REMOVE":
 case "MESSAGE_REACTION_ADD":
     this.emit(data.t === "MESSAGE_REACTION_ADD" ? "msg.react" : "msg.react.remove" ...)

well at this point i'm confusing myself with shit like this

marble juniper
#

why is it just not workingggggggggggg

earnest phoenix
#

why are you merging those two cases

#

those two events have different data structure

trim saddle
#

they don't?

earnest phoenix
#

yes they do...?

trim saddle
#

only difference is a member

modest maple
#

honestly the member bit is such a pain

earnest phoenix
#

the member was what i was pointing at

#

anyways

marble juniper
#

my api container doesn't even get any requests

#

smh

trim saddle
#

if (data.d.member)

#

ez

earnest phoenix
#

you still shouldn't merge them because you defeat the point of doing the switch by doing the comparison again

modest maple
marble juniper
#

pain

#

im gonna ask for help here untill I get it

#

lol

modest maple
#

i think the best idea would be maybe make two test systems

tired panther
#
   for (const category of categories) {
            const dir = client.commands.filter(cmd => cmd.category === category);

            if(category === "Dev" && client.config.owner.includes(message.author.id)){
            allcommands.addField(`__${category}__ [${dir.size}]`, client.commands.filter(cmd => cmd.category === category).map(cmd => `\`${cmd.name}\``).join(" "));       
            }else{

            allcommands.addField(`__${category}__ [${dir.size}]`, client.commands.filter(cmd => cmd.category === category).map(cmd => `\`${cmd.name}\``).join(" "));   
            }
        }
``` Why is it showing dev commands for normal users?
modest maple
#

with nothing else but a server and client

marble juniper
modest maple
#

and tinker with it till it works

trim saddle
#

@earnest phoenix ok but ✨ typescript ✨

    on(event: "msg.react", listener: (data: { messageID: string, userID: string, emoji: string|Emoji, member?: Member, channelID: string }) => void): this
    on(event: "msg.react.delete", listener: (data: { messageID: string, userID: string, emoji: string|Emoji, channelID: string }) => void): this
mellow kelp
#

how about the discord.js way

trim saddle
#

i can keep my comparisons without worry about a type going out wrong

mellow kelp
#
interface ClientEvents {
  'msg.react': { dataThing };
  'msg.react.delete': { dataThing }
}

interface Client {
  on<E extends keyof ClientEvents>(event: E, listener: (data: ClientEvents[E]) => void): this;
  once<E extends keyof ClientEvents>(event: E, listener: (data: ClientEvents[E]) => void): this;
  off<E extends keyof ClientEvents>(event: E, listener: (data: ClientEvents[E]) => void): this;
}
trim saddle
#

does seem easier for future editing

mellow kelp
#

yea i guess

#

just edit the ClientEvents interface for any new events and that's all

marble juniper
#

@modest maple same error happens btw when I put everything into 1 composition

signal estuary
#

My bot is crashing all time for "Fetch error to discord/api" My bot is running on linux raspberian.

trim saddle
#

@mellow kelp ok but say i have multiple events with the same data

#

is there a better way than retyping the data twice

mellow kelp
#

create another interface for that data

#

ez

trim saddle
#

smh

marble juniper
#

why is it so complicated to just make a docker container communicate with another one

#

like

#

why

earnest phoenix
#

Emmm

        const emoji = client.emojis.find('name', 'wastebasket');
                                    ^

TypeError: client.emojis.find is not a function
#

help

trim saddle
#

emojis is probably undefined

earnest phoenix
#

hi,one question about License is it possible to modify code which has a License

pale vessel
#

outdated code

trim saddle
#

@earnest phoenix depends on it's license

earnest phoenix
#

mit

trim saddle
#

go ahead

marble juniper
#

then yes

earnest phoenix
trim saddle
#

read the docs

#

smh.

marble juniper
#

anyone can help me

#

I want to make my docker container for my bot

restive furnace
earnest phoenix
#

okay thx,i was really unsure

marble juniper
#

make a request to the other docker container

trim saddle
#

never used docker

#

sorry

marble juniper
#

but I just never even reaches the other docker container

#

and the api doesn't log any requests

#

it makes no sense

#

I myself can go to localhost and it would show up

#

I don understanndddddd

lucid prawn
#

im having a error

Error: ffmpeg stream: write EPIPE
    at afterWriteDispatched (internal/stream_base_commons.js:156:25)
    at writeGeneric (internal/stream_base_commons.js:147:3)
    at Socket._writeGeneric (net.js:788:11)
    at Socket._write (net.js:800:8)
    at doWrite (_stream_writable.js:403:12)
    at writeOrBuffer (_stream_writable.js:387:5)
    at Socket.Writable.write (_stream_writable.js:318:11)
    at PassThrough.ondata (_stream_readable.js:719:22)
    at PassThrough.emit (events.js:314:20)
    at addChunk (_stream_readable.js:298:12) {
  errno: 'EPIPE',
  code: 'EPIPE',
  syscall: 'write'
}
trim saddle
#

you sent invalid voice data through ffmpeg or something?

#

i'm not fluent with music bots

errant perch
#

var user = bot.users.fetch("331222209299349504")
user.send("test")

#

why does this say user.send is not a function

trim saddle
#

user is undefined

#

user wasn't found

#

or maybe it returned a promise

errant perch
#

i logged the user and it showed javscript User { id: '331222209299349504', system: null, locale: null, flags: UserFlags { bitfield: 64 }, username: 'woogie', bot: false, discriminator: '1148', avatar: '8c560fcfcbf94410b1e7fa1f78ae3668', lastMessageID: null, lastMessageChannelID: null }

trim saddle
#

hm.

lucid prawn
trim saddle
#

that really doesn't sound like the error reason

cinder patio
trim saddle
#

but ok

errant perch
#

ok

trim saddle
#

@cinder patio you, in an interface is there anyway to bind different keys to the same value

cinder patio
#

mmm, I don't think so

#

you will have to do

key1: value,
key2: value
trim saddle
#

dammit

cinder patio
#

if you have many keys with the same value use an aray

#

array*

trim saddle
#

looks like using an array for keys is a bust

cinder patio
#

no

#

use one key, and make the value an array

trim saddle
#

could you show me an example

cinder patio
#
items: Array<SomeType>
#

or

items: SomeType[]
earnest phoenix
cinder patio
#

um that doesn't look like a partial to me

pale vessel
#

system and locale are always null for bot users, no?

earnest phoenix
#
const client = new Discord.Client({
    autoReconnect: true,
    partials: ["MESSAGE", "CHANNEL", "GUILD_MEMBER", "REACTION", "MESSAGE", "USER"]
});
pale vessel
#

why

earnest phoenix
errant perch
#

thanks i'll try it out

cinder patio
#

but why enable partials

pale vessel
#

users don't have those too

#

it's for oauth

cinder patio
#

doesn't make any sense cause they are fetching the user, a fetched user is always guaranteed to be full

pale vessel
#

only authenticated users have those properties

#

otherwise it'll be null

earnest phoenix
#

wdym

#

discord.js

errant perch
#

seems to have worked

earnest phoenix
errant perch
#

wait nvm

#

don't worry about it

lucid prawn
#

how can u use Force dark theme

restive furnace
#

yes

#

darktheme = force ur now be true please or i kil u in <style>

slender thistle
#

You first create a custom CSS with a style tag in your long description

boreal pewter
#

quick question, im looking at sharding on discord.py

#

there is the AutoShardedClient

#

question is:
if i auto-scale new machines with the bot, will it know to split the load with newly added bots?

lucid prawn
#

Will this work

<html>
<head>
<style>
body {
  background-color: black;
}
</style>
</head>
<body>
boreal pewter
#

so i could have 2 bot instances running, then 3, then 4, will it manage it automatically, anyone knows?

slender thistle
#

Doubts on that one

marble juniper
#

how do I make 2 docker containers be able to send http requests to each other

#

I can visit localhost:6969 just fine but my docker container won't be able to do the same

#

I have an api docker container and one for my discord bot

#

both containers run in different compositions but also in the same network

lucid prawn
#

how do i add a website to top.gg on my bot page

boreal pewter
#

tnx, from what im reading seems like it actually doesnt

#

how would you handle auto scalling then? do you need to restart the bot everytime

#

or just manage shards on ur own and go up with new shards

quartz kindle
#

you already need to restart the bot anyway

marble juniper
#

how do I make 2 docker containers be able to send http requests to each other
I can visit localhost:6969 just fine but my docker container won't be able to do the same
I have an api docker container and one for my discord bot
both containers run in different compositions but also in the same network

quartz kindle
#

every time you change the number of shards, all shards have to be restarted

marble juniper
#

docker is making me feel pain rn

quartz kindle
#

because the guilds are redistributed

#

automatic sharding does not restart it for you

marble juniper
#

not even google can help me

#

ffs

quartz kindle
#

because discord doesnt force you to disconnect if you go over the shard limit

marble juniper
#

I don't fucking understand why it doesn't work

quartz kindle
#

as long as you're connected, you can go over 2500 guilds

boreal pewter
marble juniper
#

kekw

boreal pewter
boreal pewter
#

4 shards

marble juniper
#

my containers all use the same network

lucid prawn
#

how do i add a website to top.gg on my bot page

boreal pewter
marble juniper
#

all my containers are in the same network

#

again

#

they should be able to communicate but they can't

#

the api doesn't get any logs of requests

#

and my bot just errors out

#

they are in the same network too

boreal pewter
#

@marble juniper are you using docker compose?

#

ez why with compose it to link in the specification

#
version: "3"
services:

  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres
``` for example, the web docker here will be connected with docker inner networking to the postgreSQL docker
boreal pewter
#

if you are running just dockers, you will have to set this up urself

marble juniper
#

but I have 2 docker compose files

#

one for the api one for the bot

boreal pewter
#

oh lol

#

the whole point of using docker compose

#

is that you can orchestrate multiple dockers

marble juniper
#

oh

boreal pewter
#

can you send both compose files?

marble juniper
#

ig

#

the one of the bot

#

the one of the api

boreal pewter
#

both the bot and api can access the mongo

#

but not eachother right?

#

thats the issue

marble juniper
#

ig?

#

how do I link them

boreal pewter
#

you need 1 docker-compose file

#

to run all

marble juniper
#

ohke

boreal pewter
#

note that since u are running 2 docker-compose files rn

#

from 2 different paths

#

u will have to reference it accordingly

#

either build the images urself and reference the images

#

or maybe build with relative path in the compose but thats not as good

marble juniper
#
version: '3'

services:

  web:
    links: 
      - mongo
      - bot
    ports:
      - "6969:9001"
    restart: unless-stopped
    build: ./api/

  bot:
    links: 
      - mongo
    restart: unless-stopped 
    build: .

  mongo:
    image: 'mongo'
    volumes: 
      - mongo_data:/opt/anti-nsfw_data
    ports:
      - '27017'
    
volumes:
  mongo_data: {}

networks:
  default:
    external:
      name: antinsfw_network
#

I did this now

#

api links to bot

#

am I stupid

#

or something

#

cuz idk

#

I can't get this to work

#

pain

#

@boreal pewter do I just use localhost as the url or the service name

#

also is my file correct

#

for the yaml

boreal pewter
#

nah u need the ip address of the docker network

#

its usualy 192.168 something

marble juniper
#

oof

#

but does it change when the composition restarts or something

boreal pewter
#

or 172. something

#

not 127

boreal pewter
marble juniper
#

how do I get the ip address

#

of the docker network

earnest phoenix
#

Anyone know of I can use the reCAPTCHA API in a bot

marble juniper
#

how do I send a request to the other docker aaaa

quartz kindle
#

because you cant really put clickable buttons on discord

boreal pewter
#

straight from the docs

earnest phoenix
#

@quartz kindle don't think so

boreal pewter
#

if you link in docker-compose, the docker goes up with internal dns resolving

earnest phoenix
#

I wigy I could Iframe

boreal pewter
#

you should be able to call the docker name and have it resolve to the inner ip

quartz kindle
#

you cant put iframes on discord either

earnest phoenix
#

That needs to be addressed

gilded olive
#

It'd have to be through a website probably

boreal pewter
quartz kindle
#

it doesnt lol

#

is there any messaging app that supports iframes?

gilded olive
#

xD

#

if you wanna do that for a bot, youd have a your own web making reqs

https://yourwebsite.com/<guild>/captcha```
marble juniper
#

FINNALLYYYYYYY GOT IT WORKINGGGGGGGGGGGG

#

to fix this issue

#

it took me like

#

multiple hours

gilded olive
marble juniper
#

the issue was

#

I wasn't using the containers port

#

I was using the host port

#

I needed the container port

#

aka 9001

#

6969 was just the host port

#

oof

lusty quest
#

i hope you get a Server with GPU or you will have fun

solemn leaf
#

when you need a nsfw check

#

when discord has its own

#

just enable it on the server

#

smh

boreal pewter
#

@marble juniper good jobs 🙂

quartz kindle
#

steve jobs

boreal pewter
#

xD

#

good job*

#

nice one tim lol

#

i laughed more then i shouldhave irl

quartz kindle
#

:^)

marble juniper
#

lol

#

that one was good

#

tim

modest maple
eternal osprey
#

hey

#

i have a few cases called status1, 2, 3, 4 etc.

#

how do i actually code that if the status is enabled it shows a white check mark, and if disabled a red cross?

#

I already know how to read the files etc, just need to know the emoji part.

trim dagger
#

can someone please help me with my bot?

#

I really need to add notification on live streaming? i really don't know how to use the twtich api

#

i use discord js

quartz kindle
#

you want to set your bot's status as "streaming"?

trim dagger
#

no, like embed notifications, like mee6 does

quartz kindle
#

ah

#

you probably need twitch webhooks

#

idk how their api works, never used it

trim dagger
#

oh understood

eternal osprey
#

anyone that could help me?

eternal osprey
#

i already made a start with the cases but i have no clue what to do next.

plush nimbus
eternal osprey
#
if(message.content == "!list"){
   const status1 = fs.readFileSync("./cases1.json", "utf8");
   const status2 = fs.readFileSync("./cases2.json", "utf8");
   const status3 = fs.readFileSync("./cases3.json", "utf8");
   const status4 = fs.readFileSync("./cases4.json", "utf8");
   const status5 = fs.readFileSync("./cases5.json", "utf8");
   const status6 = fs.readFileSync("./cases6.json", "utf8");
   let emoji1 = ""
   switch (status1) {
    case 'Enabled':
         emoji1 = ":x:"
        break;
    case 'Disabled':
        emoji1 = ":white_check_mark:"
        break;
}
switch (status2) {
  case 'Enabled':
     emoji1 = ":x:"
      break;
  case 'Disabled':
       emoji1 = ":white_check_mark:"
      break;
}
switch (status3) {
  case 'Enabled':
       emoji1 = ":x:"
      break;
  case 'Disabled':
       emoji1 = ":white_check_mark:"
      break;
}```
#

why is my bot showing that every case is enabled?

#

Eventhough they are literally all off.

quartz kindle
#

jesus that looks extremely inefficient

maiden gull
#

I need a kiss

proven lantern
#

dont use switch statements

quartz kindle
#

whats the content of cases1.json?

eternal osprey
proven lantern
#

make a map

eternal osprey
#

or Disabled.

quartz kindle
#

but its a json file

proven lantern
#

pass status as a key to the map

quartz kindle
#

json files need a minimum structure

eternal osprey
#

just wanted to try cases tbh.

eternal osprey
proven lantern
#

you should almost never use switch statements

quartz kindle
#

so how does your json file look

proven lantern
#
const map = {
    status1: fs.readFileSync("./cases1.json", "utf8"),
    status2: fs.readFileSync("./cases2.json", "utf8"),
    status3: fs.readFileSync("./cases3.json", "utf8"),
    status4: fs.readFileSync("./cases4.json", "utf8"),
    status5: fs.readFileSync("./cases5.json", "utf8"),
    status6: fs.readFileSync("./cases6.json", "utf8")
}```
#

map[status]

eternal osprey
#

yeah i see

#

but i already knew how to read the files etc.

#

i want to attach emojis to it

#

so if the text of status1 e.g. is Enabled, it shows the ✅

proven lantern
#
    status1: {
        file:fs.readFileSync("./cases1.json", "utf8"),
        emoji:""
    }
}
#

add another property to the status

eternal osprey
#

yeah i see.

#

but the problem is, is that the cases1 changes its contents.

#

it can be Disabled and Enabled by hand, which means that the corresponding emoji would not fit the imageg,

opal plank
#

im personally triggered to the fact that you called an object a map, but thats beside the point

proven lantern
#
    status1: {
        file:fs.readFileSync("./cases1.json", "utf8"),
        emoji:"",
        isEmojiEnabled:false
    }
}```
opal plank
#

you also should refrain from reading everytime theres a new message

#

fs.readFIleSync will be run EVERY message with "list"

#

should likely save that in memory instead

eternal osprey
#

yeah i understand! Thanks guys. I really appreciate all the help 🙂

#

hey sorry for asking again.

young flame
#

im using canvas constructor and uh

eternal osprey
#
 isEmojiEnabled:false,```i really don't get this part.
young flame
#

or something

eternal osprey
#

how do i check if it's enabled or disabled usin this part

young flame
#

intermediate value .seColor isnt a function

#

setColor*

proven lantern
#

map[status].isEmojiEnabled ? map[status].emoji : "✅"

eternal osprey
#

I don't get the concept.

proven lantern
#

instead of case 'Enabled': emoji1 = ":x:" break; case 'Disabled': emoji1 = ":white_check_mark:" break; }

eternal osprey
#

yeah

earnest phoenix
#
        if (!prefixes[message.guild.id])
                                    ^

TypeError: Cannot read property 'id' of null
eternal osprey
#

but isEmojiEnabled is never defined?

#

And how would i let it choose from 2 emojis upon the enabled and disabled status

earnest phoenix
#

guys before 1h this work
but after like 1h he say this error

#

why

#

btw code for change prefix

young flame
#

o

#

how do you make a discord attatchment again?

earnest phoenix
proven lantern
eternal osprey
#

outside the usual json structures.

proven lantern
#

that's tricky

eternal osprey
#

yup it is.

#

So it is not possible without proper json structure?

#

@proven lantern

young flame
#

it sends the @ part which is gumen and thats it

#

since im using canvas

proven lantern
# eternal osprey So it is not possible without proper json structure?

something like this ```js
const files = {
status1: fs.readFileSync("./cases1.json", "utf8"),
status2: fs.readFileSync("./cases2.json", "utf8"),
status3: fs.readFileSync("./cases3.json", "utf8"),
status4: fs.readFileSync("./cases4.json", "utf8"),
status5: fs.readFileSync("./cases5.json", "utf8"),
status6: fs.readFileSync("./cases6.json", "utf8")
}

const emojiMap = {
Enabled: ":x:",
Disabled: ":white_check_mark:",

}

const statuses = Object.keys(files);

const response = statuses.reduce(
(acc, status) =>
${acc} ${status}: ${emojiMap[files[status]]},
'These are the following statuses '
);

#

you can keep the Enabled/Disabled text. the main problem is that you are reading from a file

young flame
#

.__.

solemn latch
#

@split hazel

split hazel
#

@cursive spire yeah not here

young flame
#

@solemn latch dev senpai halp

solemn latch
#

hmm?

young flame
solemn latch
#

whats Requis?

young flame
#

whati have discord.js defined under

plush nimbus
earnest phoenix
#

I've been developing a discord bot for the past month, I've been doing commands using on_message listeners, which according to alot of people online isn't very ideal, so I decided to take it to the next step and do it properly, I looked at the documentation and came up with this basic code:

import discord #import all the necessary modules
from discord import Game
from discord.ext import commands

client = discord.Client() #define discord client
bot = commands.Bot(command_prefix='!') #define command decorator

@bot.command(pass_context=True) #define the first command and set prefix to '!'
async def testt(ctx):
await ctx.send('Hello!!')

@client.event #print that the bot is ready to make sure that it actually logged on
async def on_ready():
print('Logged in as:')
print(client.user.name)
await client.change_presence(game=Game(name="in rain ¬ !jhelp"))

client.run(TOKEN) #run the client using using my bot's token
Before going through the pain of implementing all of my commands to this new way of doing things, I wanted to test it so I know that it works for sure and sadly, it didn't, I went through a bunch of posts and documentation again but I couldn't spot what I did wrong, the bot logs in fine to the proper user and I just can't seem to figure out and understand what the problem is, I am probably missing something obvious yet again

Could anyone help, that would be great, thank you!

young flame
#

is that c#?

#

or python

#

o

#

wtf

earnest phoenix
#

Python

young flame
#

o

pure lion
#

could you put your code in a code block

young flame
#

idk discord python like that so i cant help

pure lion
#

```py

```

young flame
#
import discord #import all the necessary modules
from discord import Game
from discord.ext import commands

client = discord.Client() #define discord client
bot = commands.Bot(command_prefix='!') #define command decorator

@bot.command(pass_context=True) #define the first command and set prefix to '!'
async def testt(ctx):
    await ctx.send('Hello!!')

@client.event #print that the bot is ready to make sure that it actually logged on
async def on_ready():
    print('Logged in as:')
    print(client.user.name)
    await client.change_presence(game=Game(name="in rain ¬ !jhelp"))

client.run(TOKEN) #run the client using using my bot's token
#

there dice

pure lion
#

why the ¬

modest maple
#

thats like having two diffrent bots rn

#

one which is a client instance

silent cloud
modest maple
#

the other which is a Bot instance

gilded olive
#

2 instances

young flame
#

👁️👄 👁️

silent cloud
#

Look on screenshots

young flame
#

the text is to small

earnest phoenix
modest maple
#

your screenshots are the most unreadable thing ever

young flame
#

dev senpai you there?

silent cloud
#

Open discord url in browser, WOW MAGIC

#

Im seeing good on pc now

young flame
#

@solemn latch you busy?

#

if so i can always ask million for help lol

solemn latch
#

honestly no idea

urban cape
#

Hello other people,

I got a bot and I want all the names of people in a list and then i a temp variable, (its only for my server and not public). But i dont know how to get a member list of people.
The furthest i got is that i make a list and then he put all the people in the list when they are in a vc or its me and the bot hisself. I read online thats a permisssion issue and so thats nothing wrong with my code. So does anyone know how to fix this.

gilded olive
#

lang?

urban cape
#

js

gilded olive
#

a

#

(Idk djs)

urban cape
#

my bot runs on node.js

proven lantern
#

const members = await msg.guild.members.fetch()

quartz kindle
#

indeed, bots do not have all members loaded in memory, you have to manually request them

urban cape
#

ow

quartz kindle
#

and due to new regulations, your bot needs to enable the "server members" intent in your discord developer app

#

otherwise it wont have access to all members

opal plank
#

tim shard my botum

urban cape
#

and how to that that

opal plank
quartz kindle
#

go to the discord developers page ^

urban cape
#

bruh, i forgot

quartz kindle
#

go to your bot, and enable the "server members" switch

#

under intents

urban cape
#

that was already switch on

opal plank
#

he should have most of them i assume then

quartz kindle
#

if its on, then you can use the code provided by Ben to request them

urban cape
#

ok thx

quartz kindle
opal plank
#

nah, its private

#

it is, but private repo

#

can add you if you wanna peek at it

quartz kindle
#

then gib access if you want shard

opal plank
#

let me commit stashed changes rq

#

that'll make readability a lot easier

opal plank
#

recommendation, make everything collapsed

#

its all neatly organized but you must shrink the categories

#

actually i didnt commit the last index changes

#

fuck, well all good

#

oh, forgot to mention

#

for the love of god do not check startupFunctions

#

unless you wanna lose braincells

#

thats my functions dump

misty sigil
#

i wanna check startupFunctions

opal plank
#

trust me, you dont

misty sigil
#

trust me i do

opal plank
#

trust me, you're a casual here, you dont have that many braincells to spare

#

neither do i

misty sigil
#

i want to see the brain cell killer

young flame
#

o

quartz kindle
#

this is dope tho

young flame
#

welp

opal plank
#

let me show you my log on startup

earnest phoenix
#

My god

opal plank
#

@quartz kindle

young flame
#

the info thing with the timestamps

opal plank
#

with console log lol

young flame
#

teach

opal plank
#

i got a logger function

young flame
#

:0

opal plank
#

its literally console.log()

young flame
#

not that

#

smh

#

nvm

earnest phoenix
#

I heard there's this constructor called Date() moon

young flame
#

i know what console log is i said h o w

opal plank
#

the INFO DATE?

mellow kelp
#

replace the console.log function vibing

young flame
#

thats all i wanted to know

opal plank
young flame
#

im not that stupid to not know what console log is

opal plank
#

thats literally what i do

#

console.log()

#

with a custom text added onto it

#

thats all

#

nothing about replacing console log function

#

or anything fancy

earnest phoenix
#
const log = console.log;
delete console.log;
console.loggers = log;```
quartz kindle
#

i removed all dates from my console logs and enabled pm2 timestamps

earnest phoenix
#

Bro

opal plank
#

its JUST console.log()

mellow kelp
#

wait you don't use chalk coolflushed

opal plank
#

laughs in not bloated bot

#

imagine adding a dependency just to add color

mellow kelp
#

i mean it aint that big

#

but aight

opal plank
#

its too simple to be put in my code

earnest phoenix
#

Imagine even adding dependencies

opal plank
#

i much rather not add extra dependencies, unless i must

mellow kelp
opal plank
#

wheres my thing?

#

holdup

young flame
quartz kindle
#

zero deps best deps

mellow kelp
#

imagine using npm

quartz kindle
#

all my non-discord libs are zero-deps

young flame
#

npm for a dep i coded

#

all 6 is legit moonsql KEK

#

just different data functin

opal plank
quartz kindle
#

lmao

opal plank
#

no shitty libs

mellow kelp
#

@top-gg/sdk

#

wait why axios types

earnest phoenix
#

Bro, should have downloaded the entire npm registry

quartz kindle
#

wdym no shitty libs

young flame
#

cheerio good

mellow kelp
#

axios already has types

quartz kindle
#

these are all shitty

earnest phoenix
#

It would be poggers

quartz kindle
opal plank
#

frick u tim

quartz kindle
#

xD

opal plank
young flame
#

lmfao

#

ts-node

quartz kindle
#

too many deps

#

i dont have half the deps you have lul

proven lantern
#

axios lets you cancel requests

mellow kelp
#

axios already has types included

earnest phoenix
#

Imagine using axios

#

node-fetch for all

mellow kelp
#

you can uninstall @types/axios kek

opal plank
#

fuck you and your shitty fetch

earnest phoenix
#

🗿 Wtf

opal plank
#

axios isnt shipped with types iirc

proven lantern
#

useSWR + fetch

opal plank
#

maybe it is, but there must be a reason i installed types separatedly

mellow kelp
#

yes it has types KEKW

young flame
mellow kelp
#

i used axios with ts today

#

didn't need @types

young flame
#

the blurred one is moonsql lol

opal plank
#

chalk

#

yikes

#

pretty ms

young flame
opal plank
#

imagine having unused deps on ur project

mellow kelp
#

why does that look like smugumin

earnest phoenix
#

Blurred dependency oldEyes

young flame
#

imagine having ts-node on ur project

quartz kindle
opal plank
young flame
#

since we are throwing shots erwin

mellow kelp
#

i got ts-node-dev in my dev dependencies just because it's on the start:dev script

opal plank
#

please, do tell me why i shouldnt use ts-node to compile my shit rather than trasnpiling it

young flame
#

i know more langs then just js

#

so

opal plank
#

so...?

mellow kelp
#

npm lang

proven lantern
young flame
#

so...?

opal plank
#

being bad on all of them doesnt make it any better mmulu

mellow kelp
#

whoa jest?

quartz kindle
#

no zlib-sync

#

pleb

young flame
#

being bad on all?

#

im only bad a python

quartz kindle
#

xD

opal plank
#

and clearly ts

earnest phoenix
#

Bro, why do you have both of the axios and node-fetch installed

#

🗿

#

Just use one at least

opal plank
#

@earnest phoenix node-fetch is inherited from another one

#

its not a direct dep from me

quartz kindle
#

discord.js itself uses node-fetch, so you will have it in your deps eitherway

earnest phoenix
#

Man

#

node_modules folder count goes stonks

quartz kindle
#

ye

opal plank
#

YIKES

mellow kelp
#

what

earnest phoenix
#

Wtf

quartz kindle
#

lmao

proven lantern
opal plank
#

please @young flame

earnest phoenix
#

Bro, no command handler?

#

Pain.

opal plank
earnest phoenix
#

Wait

opal plank
#

cant even say its old code or repo

#

this is super recent

earnest phoenix
#

What is even Ongaku KEKW

opal plank
#

their repo

proven lantern
mellow kelp
#

wait what's the repo

opal plank
#

not gonna link it here cuz im not trying to start a public lynching

mellow kelp
#

o

opal plank
#

but its really bad

mellow kelp
#

fair enough pEnSiVe

#

ima go play osu

quartz kindle
proven lantern
earnest phoenix
#

Tim is like a compiler, feed him bad code, he will give a better one, it becomes good code

quartz kindle
young flame
opal plank
#

Tim is basically Ts

quartz kindle
#

lmao

#

TimScript

opal plank
#

wdym what about it? embed builders, no command handler, no syntax formatting, that whole thing is attrocious

#

its an afront for you to dare talk shit about my code when you have that

earnest phoenix
#

{ return; } bro wtf