#development

1 messages · Page 2065 of 1

carmine summit
#

the first log is clearly not in order when expanded

bright hornet
#

nahh

sharp geyser
#

Are you only using mentions?

#

Wait better question are you using slash commands rn

carmine summit
#

oh wait shit im dumb, chrome updates the arrays...

sharp geyser
#

I am still confused if you are cause this can be done way easier

sharp geyser
#

then wtf is i

bright hornet
bright hornet
sharp geyser
#

What

bright hornet
#

brutal code

lament rock
#

getting an ID from message content if it has a mention
/<!?@(\d+)>/

bright hornet
sharp geyser
#

I see

lament rock
#

You're using a message collector?

bright hornet
#

I'am making a code without message.mentions

#

bruhahaha

bright hornet
sharp geyser
#

if you are using a message collector how the fuck are you doing i.user.id

lament rock
#

The result of the Promise of a Message Collector.next is a Message

sharp geyser
#

bought to say

#

message doesn't have a user prop

#

its author

bright hornet
#

i forgot that i is for user only

#

i mean author

sharp geyser
#

this is why people should not use single named variables

#

😔

lament rock
#

_

#

All of my variables are _ :)

sharp geyser
lament rock
#

Love you too

sharp geyser
#

<3

#

I am wondering if I should rewrite my lib again

sharp geyser
#

no its not

#

it makes it a nightmare for people to debug your code when they have no idea what i is cause it is not descriptive at all

lament rock
#

Just use the raw API like I keep telling people. I haven't thought about updating my bot or anything related in a long time because I don't have to

sharp geyser
#

Actually ima make a framework for djs maybe

lament rock
#

no stupid abstraction layers with a huge import memory footprint or circular dependencies or volatile arbitrarily assigned naming schemes

sharp geyser
#

if i make a lib it is going to be pretty baremetal

#

just some helper methods and thats it

#

sharding is something you'd do on your own cause fuck setting up that

lament rock
#

Good

#

I fucking hate managed libs because of assumptions they make or their aggressive caching policies

#

I don't need that

sharp geyser
#

caching is also a thing I'd leave up to the user

lament rock
#

Thank god they're now serializing the client's permissions for the channel an interaction was instigated in

bright hornet
#

since bot not going to response

#

ill just create a message if bot got mentioned

#

lmao

lament rock
bright hornet
lament rock
#

Unpopular opinion, but people should stop making bots unless they're smart enough to make something objectively better

bright hornet
lament rock
#

You’ll wish you stopped sooner down the line

bright hornet
#

discord.js is my practice area only anyway

#

soo dont mind me

lament rock
#

You'll always stress about memory management or server costs or active users or cluster sizes and maximizing hardware efficiency and networking and all of this other shit you do not want to try to solve, because there's no real good answer other than to just stop entirely

bright hornet
#

💀

lament rock
#

if it's a source of income, then great. You're a lucky % and you can continue, but it is not worth time and money stressing about a hobby project which is supposed to be fun

bright hornet
lament rock
#

Thanks for coming to my ted talk. It is early as fuck o'clock and I have work tomorrow

sharp geyser
#

how do env files work again?

#

Do they set the values in them to the environment automatically or do you have to read from the file

pale vessel
#

On node they just set the key and value in process.env, it doesn't actually modify the system environment variables

pale vessel
#

It parses the file thou

bright hornet
#

i think that was misty want to ask

pale vessel
#

I didn't know he used php

sharp geyser
#

I don't use php

#

I'd never stoop that low

pine nova
#

🤝

dry imp
#

only fake stoop that low

bright hornet
#

Just found out with diff user and client user in collector

#

f

#

probably i.author.bot i can use to detect if bot got pinged

sharp geyser
#

I am confused on what you are wanting to do anymore

spark flint
#

Lol

sharp geyser
#
import {readFileSync} from 'fs'
import {sep} from 'path';
import {getProperty} from "dot-prop";

export class Localization {
    private localesFolder: string;

    constructor(localesFolder: string) {
        this.localesFolder = localesFolder
    }

    get<T>(locale: string, prop: string, defaultValue?: T): T {
        const contents = this._getFileContents(locale)
        const property = getProperty(contents, prop, defaultValue)

        return property!;
    }

    private _getFileContents(file: string): any {
        const content = readFileSync(`${this.localesFolder}${sep}${file}.json`)

        return JSON.parse(content.toString());
    }

}

How could I make this better

#

Should I allow them to set a default locale they wanna get from if one isn't specified ?

bright hornet
sharp geyser
#

How do you expect us to help if we have 0 clue of your end goal or what you wanna accomplish

bright hornet
#

but short story, i wanted to return the collection or stop if i.author.bot === true inside the collector.on

sharp geyser
#

Alright then you should be good

#

idk why earlier you were trying to compare ids

bright hornet
#

anyway it still not returning tho lmao

sharp geyser
#

you don't need to do that

#

just if(i.author.bot)

#

no need to compare

bright hornet
#

yep tried

#

still ignoring the condition

sharp geyser
#

🤔

#

how though

#

only way it'd ignore the condition is if it isn't a bot's message being collected

bright hornet
#

Cause It'll only collecting the data after the person answer

#

probably after the first collector done, i.author.bot is useless

#

because second collector will came up

sharp geyser
#

🤔

#

the more you try and explain the more it becomes unclear

#

but if it works it works

raw nest
#

How can I generate a random base64 string with custom character length, like YT's unique url id?

#

in JS

sharp geyser
#

do you want it to be unique?

raw nest
#

yeah but I can check that in my DB. First how do I even generate them?

#

There's like nanoid npm package and I can make a custom alphabet with the 64 chars then it generates me a string I can check if it already exists. But is that the way to go?

sharp geyser
#

Well I don't think you can actually set the length of a base64 string I might be wrong but I have never seen/heard of a way

raw nest
#

Hm, I try some things out

#

thanks

bright hornet
#
economy.findOneAndUpdate({
    memberID: i.author.id,
    spouseStatus: true,
    spouse: s.author.username
})

economy.findOneAndUpdate({
    memberID: s.author.id,
    spouseStatus: true,
    spouse: i.author.username
})``` overwrites my data, but in my casino it doesnt, what an actual f
raw nest
#

If I create statistics for the apikey if someone makes an api request with an api key, how should I make the stats?

1:
Create an entry for each api key with columns like requests etc. and just increment this value everytime

2:
Create a new db record every request and put stuff like timetamp, requestRoute etc. in it?

Which option is better?

woeful pike
#

usually sites will do a combination of both. You might have detailed stats on how users do requests in the past month or something with #2 and then aggregate any data older than a month into less-specific stats like #1

raw nest
# woeful pike usually sites will do a combination of both. You might have detailed stats on ho...

oh that's actually a smart way.. So like specific data for the last month with all things like requestRoute, timestamp, country etc. and after a month this data gets deleted and the request count for this api keys incremented normally?
The thing is what if someone would like data from the last year? In this case if I want to provide this I need to store every data for a year right?
If you have an app that makes e.g. 1000 requests a day this one app alone is 365k db records in a year.. If the app grows wouldn't this be way to many records? I don't know I think 1m records isn't that much in production for some companies...

woeful pike
#

that's what's tricky about storing timeseries data. You need to think about the granularity of the data you need

#

a question you have to ask yourself is why would someone need data from last year, and what data could they need?

#

because you can keep data from last year without storing every single request

raw nest
woeful pike
#

do you need to store every individual request to answer this question?

raw nest
#

I don't know..

#

It's like I want to be able to provide as much data/statistics as possible but don't have too many db records.
How am I able to store statistics (you can sort after time) for stuff like country, apiRoute, request method etc. without creating a record for every request? Creating a record for every country and just incrementing this value is stupid and I can't sort it after time..

sick agate
#

yup

#

filtering them should do the trick

raw nest
#

filter what?

woeful pike
#

creating a record for every request isn't necessarily a bad thing

#

you can use #2 now and figure out how you want to do data retention when it starts to become a problem

sick agate
#

yup

raw nest
woeful pike
#

you'll be fine with the right indexes

raw nest
woeful pike
#

if space isn't a problem now you don't have to think about it now shrug

raw nest
#

Yeah true, but if I build it stupid now I will have bigger problems in the future as the codebase expands not? xD

woeful pike
#

you will have the raw data available, all you'll have to do is figure out how you want to downsample it

raw nest
#

yeah I guess I need to find it out on the way of development :) thanks

woeful pike
#

there's no one size fits all solution for these. For some you can just drop data after a certain date and it doesn't even matter

raw nest
#

yep

ancient nova
#

hey so I'm about to write a double if statement checking if the either the user is pinged or he messages himself

//afkCache would be a collection
//member would be the person pinged, if anyone does
if (settings.afkNotifSystemOn === true && (client.afkCache.get(message.author.id) || client.afkCache.get(member.id)) {
    // do stuff
}
#

so what I'm asking is, whether there is any way to save on performance (for eg. not cache client.afkCache or member or at least don't cache them until settings.afkNotifSystemOn without having to hoist if statements?

earnest phoenix
ancient nova
#

also using a triple = there because I'm comparing strings as well

#

settings.afkNotifSystemOn can also be a string depending on what you do

boreal iron
#

Oof

earnest phoenix
#

Then yeah as I said, only if it's always a boolean

ancient nova
#

I know it's bad but it works

earnest phoenix
ancient nova
boreal iron
#

Nesting not hosting

ancient nova
#

I did watch a video about hoisting once though.. it didn't really stuck to me

ancient nova
#

it's the same as nesting

earnest phoenix
earnest phoenix
ancient nova
ancient nova
#

do I make the second if statement have both of those conditions in it?

earnest phoenix
# ancient nova what's the difference?

If you have a look at the definitions of both, you'll notice; hoisting means moving something to the top-level or higher in any case, nesting means moving something inside something else, and goes on and on

ancient nova
earnest phoenix
ancient nova
#

okay that's fine. Am I okay with putting it in the messageCreate event?

#

trying to optimize it as much as I can since it's already clustered enough

#

it's got logic from all over the place

earnest phoenix
#

You can put it anywhere you want as long as it makes sense and you've got the things you need to work with

ancient nova
#

around 24KB - the filesize

ancient nova
#

while I'm already asking a lot of questions, may I ask how buttons work in detail?
while trying to do
<interaction>.update more than one times, or doing anything more than one time, even when trying to respond an ephermal message to an user about a wrong choice in the game, the collector always breaks

#

I can only do i.update ONE single time

#

and every person says that buttons are soo good and way better than reactions

#

or am I understanding it wrong?

earnest phoenix
ancient nova
#

"interaction failed" when pressing any buttons

#

for example if I'd send that ephermal message before doing i.update, i.update would never show up

earnest phoenix
#

"Interaction failed" or "Interaction application did not respond"?

ancient nova
dense ruin
#

idk where to ask this but how/where/can i let my bot detect when a user votes for a server

ancient nova
earnest phoenix
ancient nova
ancient nova
#
        //Lets now write functionality for our collectors
        collector.on("collect", async i => { 
            // And now lets write a cool if statement to detect who pressed which button.
            if (i.user.id === message.author.id) {
                //await i.reply({ content: `${i.user.tag} your choice have been acknowledged.`, ephemeral: true });
                authorChoice = i.customId;
            }
            
            if (i.user.id === user.user.id) {
                //await i.reply({ content: `${i.user.tag} your choice have been acknowledged.`, ephemeral: true });
                enemyChoice = i.customId;
            }
            
            // And now let's check who wins and who loses
            if (enemyChoice != null && authorChoice != null) {
                await i.update({ 
                    content: `${message.author.tag} picked ${authorChoice}\n${user.user.tag} picked ${enemyChoice}\n\nWho won? ${whoWon(authorChoice, enemyChoice, message.author.tag, user.user.tag)}`, 
                    components: []
                });
            }
        });
#

that's the entire collector

#

what could I possibly be doing wrong?

earnest phoenix
# ancient nova what could I possibly be doing wrong?

I'm pretty sure the response you're getting isn't "Interaction failed", that only occurs if Discord wasn't able to trigger your interaction, "Interaction application did not respond" occurs if your bot did not respond to the interaction in 3 seconds, or 15 minutes after the response was deferred

ancient nova
#

and while were on the topic

        collector.on("end", async i => {
            if (enemyChoice === null || authorChoice === null) {
                await i.update({ 
                    content: `${message.author.tag} picked ${authorChoice || "Nothing :C"}\n${user.user.tag} picked ${enemyChoice || "Nothing :C"}\n\nWho won? Time sadly run out.`, 
                    components: []
                });
            }
        });
``` this never shows up, regardless of me doing i.update before or not
ancient nova
#

I can invite you to a testing server

earnest phoenix
#

Both in the collect and end events of the collectors

ancient nova
#

ERROR Unhandled rejection: TypeError: i.update is not a function

#

what 😭

pine nova
ancient nova
#

actually it does make sense

#

the collector ends

#

so the interaction ends with it

#

gonna edit the original message instead, I hope it works this time

earnest phoenix
ancient nova
#

makes sense

#

and about the interaction failed thing, do you want to check it out for yourself?

earnest phoenix
#

Nah, again try logging those variables and see what they log

ancient nova
earnest phoenix
#

I'm not talking about the end event

ancient nova
#

why would I need to log the variables I set because of the interaction failed error?

earnest phoenix
#

Log the enemyChoice and authorChoice variables in the collect event

ancient nova
earnest phoenix
#

They might be the cause of the error because of incorrect values

#

Just log them God damn, this is why you always fail to debug stuff

ancient nova
#

okay.. give me a second

civic scroll
#

@woeful pike

#

the log didn't fire

woeful pike
#

what's windowRef

civic scroll
#

has resiziable and ref attached

#

windowRef.current is definitely not null at the time of execution

ancient nova
#

@earnest phoenix

#

it waits until both of them are valid

#

to send a message

woeful pike
civic scroll
#

aaaa

#

this is hard

earnest phoenix
# ancient nova to send a message

To debug this further, it's probably better to put a log in the third if statement in the collect event to see how many times the <Interaction>.update() method is actually called, if it's called the expected amount of times, then it's caused by something else rather than the collectors

ancient nova
#

it's called once, I'm absolutely sure of that

#

the collector is limited to 2 button presses from the 2 users who started the RPS match

#

but fine

#

I'll put the log in there

sharp geyser
earnest phoenix
#

Finally you're getting a hang of it, that's how developers truly debug things

sharp geyser
#

I love when people say things like that and then when they actually go to log stuff they turn out to be wrong majority of the time

#

Anyway it's 4am gn peeps

ancient nova
#

the game needs two people to test it

#

it shows the interaction as failed whenever I update

earnest phoenix
#

You don't need other people to test it with

ancient nova
earnest phoenix
#

Then create a new alt account

ancient nova
#

reseting the password to them would be a pain

earnest phoenix
ancient nova
#

and the user can change the answer after it's been called

ancient nova
earnest phoenix
# ancient nova https://pastebin.com/QpqCDq7w

Looking at your code, I don't see anything that could be causing, I still think it's something from your Discord client, or the bot crashes before Discord can send the interaction data to it

#

And the collector in your code doesn't stop even after one of the users have won, because you're not stopping it until 30 seconds has passed

ancient nova
split hazel
#

discord developer team when you ask them to make a linked list

ancient nova
#

won't that break if the same user presses the button twice though?

ancient nova
earnest phoenix
#

You aren't supposed to set a limit/max in this case, you're supposed to stop the collector manually

ancient nova
#

and I think those ephermal messages are the one thing that makes the buttons actually better than reaction "buttons"

earnest phoenix
#

Yeah

ancient nova
#

so that would fix those replies?

earnest phoenix
#

No because it doesn't seem like that's causing that failure, I'm just pointing out a bug in your code

earnest phoenix
#

Invite me to the test server I guess, I'll test it with you

midnight marsh
#

@ancient nova What's your problem? I already have your bot in my server

earnest phoenix
#

is it possible to attach an api to the wesbite from the bot even if they are separate code?

earnest phoenix
#

yea

#

for a status page

#

I meant like that doesn't really make sense, maybe rephrase it?

earnest phoenix
#

uhh..
so i am creating a status page, i want to use an api that would link the website to the bot. My question will it work if the bot and website have a separate code as in separate repos

#

Absolutely

#

oh can i use express? or do i use the in built api next.js has? (i am using next.js for my website)

#

You can use any of them you like

#

ohh alright

#

oh yes, are there any good packages for image gif generation?

spark flint
sage bobcat
#

One message removed from a suspended account.

#

One message removed from a suspended account.

earnest phoenix
# earnest phoenix oh yes, are there any good packages for image gif generation?

Well there's https://www.npmjs.com/package/make-a-gif for simple GIF generation

There's also https://www.npmjs.com/package/gifencoder for generating GIFs using Canvas contexts and buffers

#

ohh alright

#

i will check it out

earnest phoenix
spark flint
#

apologies - thought i sent that lmao

earnest phoenix
spark flint
#

ah

#

oh wait ii've done it the wrong way wround

#

round*

#

fml

#

module.exports not exports.module

earnest phoenix
#

exports.chunk = ... works as well without the module

spark flint
#

ah

#
await Promise.all(smallerCollector.map(async (collection) => {
                await channel.send(`${(loop === 0 ? `**New servers added**\n` : ``)}${await collection.map(async (server) => {
                    `------------------\n${server?.invite ? `**Invite**: .gg/${server.invite}\n` : ``}**Server ID**: ${server.serverID}\n**Reason**: ${server.reason}\n**Reason key**: ${server.key}`
                }).join("\n")}`)
                console.log(loop)
                loop += 1
            }))```
ancient nova
#

but it did work because of @earnest phoenix

#

turns out I should've dropped i.update from the start and just reply to the message, that way the intercation won't fail KEKW

ancient nova
#

Promise.resolve you can use this code to resolve singular promises

#

just loop through your map and resolve it without all the mess

spark flint
#

It’s more readable in VSC

split hazel
#

will doing

some_struct some_array[1024];

int main() {
  some_struct item = some_array[index];
  item.some_prop = 2;
}```
result in a copy or a reference
#

or do i need to add a & after the type

#

this is the shit im still not certain on in c++/c

#

i dont know when something gets copied or referenced

#

or whether something is released prematurely

split hazel
pale vessel
#

No async functions in map()

cinder patio
#

it doesn't even need to be async

pale vessel
#

For Promise.all(), it needs to be an array of promises but you're not returning anything

cinder patio
#

Can't you test it out yourself

#
some_struct some_array[1024];

int main() {
  some_struct item = some_array[index];
  std::cout << &some_array[index] == &item;
  item.some_prop = 2;
}
pale vessel
spark flint
#
smallerCollector.map(async (collection) => {
                await channel.send(`${(loop === 0 ? `**New servers added**\n` : ``)}${collection.map((server) => {
                    `------------------\n${server?.invite ? `**Invite**: .gg/${server.invite}\n` : ``}**Server ID**: ${server.serverID}\n**Reason**: ${server.reason}\n**Reason key**: ${server.key}`
                }).join("\n")}`)
                console.log(loop)
                loop += 1
            })```
#

removed the Promise bit

pale vessel
#

oh sorry, neither does the first .map()

spark flint
#

the first one does tho for async

#

because await channel.send

hallow compass
#

Any web developer here?

pale vessel
#

You're using Promise.all() though

#

increment the loop first and return the send() method

spark flint
#

not using promise.all now

pale vessel
#

No need for await

spark flint
#

removed that

pale vessel
#

I see

#

Then use a for loop

wheat mesa
hallow compass
#

Ok

spark flint
#

whats the most slash command options possible lmao

solemn latch
#

16?

#

I just made up a number ^_^

spark flint
#

lol

#

i mean for like the drop down options

#

like these

solemn latch
#

choices?

#

25

spark flint
#

ah 😔

solemn latch
#

Choices for STRING, INTEGER, and NUMBER types for the user to pick from, max 25

spark flint
#

i have 65 options i want to add 💀

solemn latch
#

👀 gl

fervent moss
#

How to delete commands in d.js?

earnest phoenix
fervent moss
earnest phoenix
#

For global commands: <Client>.application.commands.delete()
For guild commands: <Guild>.commands.delete()

fervent moss
earnest phoenix
#

If you read the documentation, you can specify the commands you want to delete

quartz kindle
#

your argument is invalid

spark flint
lyric mountain
#

And the best part, the options are based on already supplied options

stark abyss
#

mongodb how do I check if something exist in db? findone method?

split hazel
#

wrong database

#

in mongo i believe the only way is to findOne

#

but you can make it faster by not returning any columns

stark abyss
#

Okay it's working

cinder patio
#

columns in mongodb?

split hazel
#

what else would you call them

pine nova
#

documents

quartz kindle
#

^

pine nova
quartz kindle
#

i believe the preferred way to check if something exists in mongodb these days is either .find() because it returns a cursor, or .countDocuments()

split hazel
#

i was saying you should only return the _id field because you dont need anything else

solemn latch
#

in mongo they are called documents

split hazel
#

really?

pine nova
#

ye

split hazel
#

this is news to me

solemn latch
#

really strange

split hazel
#

what do you call things then

#

things inside of collections

pine nova
#

thats document?

split hazel
#

yeah so why are fields called documents

pine nova
#

each document contains key value pairs of data

split hazel
#

thats called a field

#

or a column

#

if you want to refer to rdms ways

pine nova
split hazel
#

mongodb is cringe

solemn latch
#

database > document > fields

#

in mongo

split hazel
#

yes thats what i meant

#

i thought you all were calling the things inside of the actual documents documents

pine nova
solemn latch
#

ohh

#

no

#

sorry ^_^

quartz kindle
#

or database > collection > document > fields

solemn latch
#

^ that yeah

split hazel
#

i only use speedydb

#

mysql too old

solemn latch
#

I only use json databases

pine nova
#

whats speedydb?

split hazel
#

mongodb too emo

split hazel
pine nova
pine nova
quartz kindle
#

sqlite god

#

lmdb god

pine nova
split hazel
#

oracle db tho

lyric mountain
#

sqlite is a tiny sob that can fit all atoms in Earth inside 1MB

sick agate
split hazel
#

if i dont get my free tier someone at oracle hq is gonna get it

#

where even is it

quartz kindle
#

still at war with them?

split hazel
#

Austin, Texas, United States

#

they will regret banning me

#

booking a ticket

quartz kindle
#

lmao

split hazel
#

i might try play around with some of the information i entered but dont feel it right now

#

the second card wasnt banned but it says "your trial cannot be processed because of a few plain basic reasons"

quartz kindle
#

Lol

sick agate
#

KEKW wha

split hazel
#

and when emailing them i get the same we cannot process the trial and wont tell you why response

quartz kindle
#

dafuq does that even mean

#

does this happen after your card is charged?

sick agate
#

oracle is simply:
we provide nice shit but you need to agree that we can sell your data

split hazel
#

it verifies the card successfully

#

it just wont start the trial

quartz kindle
#

rip

sick agate
#

oof

split hazel
#

i went through all of the reasons and concluded none of them are the reason except the one that says "any software which may be used to obfuscate your identity"

#

i used brave and then tried doing it on chrome but still

quartz kindle
#

i did it on firefox with all extensions disabled

split hazel
#

might also be my internet

sick agate
#

possible

split hazel
#

might also try it when im on break at work

sick agate
#

gl

split hazel
#

they wont tell me tho

#

do their systems think im a criminal or something

sick agate
#

¯_(ツ)_/¯

quartz kindle
#

they found speedyOS and they found it to be of criminal nature

split hazel
#

or it may be the fact indeed that they have an ai which measures the probability of you using the cloud for free without paying and declines you without telling you

split hazel
#

speaking of speedyos i got paging working

#

very cool

quartz kindle
#

nice

split hazel
#

i hope you know what paging is

#

otherwise i may have to go on a ramble

quartz kindle
#

well i know what page files are, and that paging on windows is basically like swapping on linux

#

but i also know memory allocators organize everything into "pages" of memory

#

which are fixed sized blocks, and act as the minimum allocatable amount of memory

split hazel
#

yeah paging is usually known as swapping memory from the ram and disk to free ram

#

but actually its a more complicated process where your second point relates to

#

memory is divided into fixed size blocks (usually 4kb but can be 1mb or 1gb with certain extensions)

quartz kindle
#

yeah depending on the allocator

split hazel
#

and from that point all memory you reference is virtual

quartz kindle
#

for example jemalloc uses "arenas" which are various different sized pages

split hazel
#

you dont refer to physical locations anymore

#

you actually cant do that

#

what allocators do i think is request pages from the os

#

and then its up to the allocator what they do inside of the pages

#

because all memory addresses from the point of enabling paging is virtual the OS can easily make memory appear sequential when its actually located in two completely different parts of ram physically

#

so if an allocator needs more memory it requests more pages which the os sends back in blocks which appear sequential

#

and because all addresses are virtual the os can mark certain addresses as "unavailable" which will cause the cpu to inform the OS everytime a program references a memory location thats unavailable

#

thats whats done when memory is swapped onto the disk

compact pier
#

can I use cloudflare worker to host a backend server?

#

just to get spotify activity

sick agate
#

possible

quartz kindle
sick agate
#

depends on logic

fervent moss
#

How to make numbers like going form 1 to x depending on y fields?

sick agate
#

huh

ancient nova
#

dam I can't find anymore games to add to my bot

#

I've got no ideas

#

my last idea is to make a hangman type game

#

you have to guess a word by typing letters in chat

#

if you type incorrectly you get a strike

#

3 strikes = death

#

but it sounds pretty incoherent

#

so I need a better idea

fervent moss
#

i+1 isn't working

sick agate
#

idk

fervent moss
#

If someone knows what to do then just edit this source bin and resend link ;-;

solemn latch
#

🤔 I'm having a hard time following it just because the variable names are so undescriptive.

compact pier
#

a b c

#

:_)

fervent moss
#

I was tired of thinking of var names so random names

craggy pine
#

Var names should be what they are / do

#

to make it easier to get help

compact pier
#

I just give up, noice, hi, shy, baba

solemn latch
#

var names are not for you, its for the people reading your code(which can be you, down the road)

compact pier
ancient nova
#

just name them what they do

#

for eg name an array ur going to change later to
CHANGEABLE_ARRAY

#

¯_(ツ)_/¯

solemn latch
#

While its not necessarily a rule here, the odds of getting help goes up dramatically if you properly form your code to common standards before asking.

ancient nova
#

I'm so bad at coming up with ideas

solemn latch
#

Blackjack?

ancient nova
#

I've never played it

solemn latch
#

Its pretty simple

compact pier
#

google :D

ancient nova
#

google describes it as pretty complicated

compact pier
#

so it is very simple

#

I think first you get 3 cards

#

if the sum of those 3 cards more then 21

#

u lose

ancient nova
#

I was thinking of adding something like tic tac toe level of simplicity, though I do already have tic tac toe made

compact pier
#

if not, you can either stop or take more cards

fervent moss
ancient nova
#

kinda weird lol

solemn latch
#

Tic tac toe was actually harder than blackjack for me to make.

compact pier
#

if u get like 19

#

there is a high risk to lose

#

and if you stop

fervent moss
compact pier
#

and your opponent have 18

#

then u win

#

if more then 19 then u lose

ancient nova
#

okay that makes sense

#

kinda

compact pier
#

just watch a video how they play

#

or try the game

ancient nova
#

if I'm understanding, 2 people get 3 cards, the one who has the less total number wins?

compact pier
#

but the sum cannot be more then 21

#

and if first 3 cards sum is too small, you can take more cards

compact pier
ancient nova
#

I'm so so lost

compact pier
ancient nova
#

it's not a boolean

#

nor does it return a bool

#

I got confused first time I used it as well

compact pier
compact pier
#

back to the game

#

so first game

#

u get

#

3, 6, 9 = 18

ancient nova
#

okok

compact pier
#

now

#

the sum is 18

ancient nova
#

ok

compact pier
#

and by the rule, the sum cannot be more then 21, if it is more then you lose

ancient nova
#

ok

compact pier
#

now I will play risk, I want to make it 21

#

so I pull 1 more card

#

3, 6, 9, 4 = 22

ancient nova
#

ok ok wait

compact pier
#

I lose

ancient nova
#

ok hold on

solemn latch
#

A video or a guide will be faster.

Or finding someone's bot with a blackjack command will do too.

ancient nova
#

if I create the game, it would start with the bot telling you the 3 cards with an ephermal message, now that ephermal message would have 2 buttons

ancient nova
#

raise number, stay

compact pier
#

pull card, stop

#

yes

ancient nova
#

you choose raise number = 1 more card, stay = go

compact pier
#

yes

ancient nova
#

same for the other person

compact pier
#

yes

ancient nova
#

now once that choice is done

#

the game finishes

#

yes?

compact pier
#

you compare those 2 player's card

solemn latch
#

It goes on until you lose, or you ask for no more cards.

compact pier
#

i dont reaslly remember

ancient nova
#

so how does one lose wtf

#

😭

compact pier
solemn latch
#

Those are 11 iirc.
I've not played in years

ancient nova
solemn latch
#

I've had games with 6 cards before I stood

ancient nova
#

plus what's the point of continusing a game for longer if there is like 99% chance the game will be decided the instant one user makes a choice

#

1 gets 16 other one gets 18

#

no need to continue

#

I'm

#

so

compact pier
ancient nova
#

confused

solemn latch
#

The dealer follows a set of rules

#

The player is facing the dealer, not another player

craggy pine
solemn latch
#

The dealer has to make certain choices.

ancient nova
#

I'd rather not

compact pier
ancient nova
#

this seems more like a chore to play than a fun game

craggy pine
#

You hit, if it's under 21 you can keep going but the bot gets another card aswell

ancient nova
#

so thanks for the help but I think I might pass on this..

craggy pine
#

you stand if you want too and bot will try to either win or they'll lose

solemn latch
#

blackjack is my all time favorite card game 😔

ancient nova
#

nah I'm making my game system to be an online-type game

#

you can only play with other people

craggy pine
#

well its the same thing if you had another player

solemn latch
#

well, blackjack is typically played at a table of 5 people

ancient nova
#

this might be quite hard to get 5 people together then lol

compact pier
ancient nova
#

my bot has only 51 servers atm so even if it was global I doubt a lot of people would acc use it

compact pier
#

both get more then 21

ancient nova
compact pier
#

draw

ancient nova
#

thank you

solemn latch
#

well, its a 1-5 player game in most casinos. you're playing the deck and dealer, but you're watching others moves too

ancient nova
#

you're using emojis as buttons

solemn latch
#

👀 we havent even gone into splits yet ^_^

solemn latch
#

I really need to restart my blackjack bot, that thing was beautiful

compact pier
#

I get 20, so I will stop

solemn latch
#

simulated decks, 5 players, full blackjack support with multiple rulesets

compact pier
#

dealer get 20 too, so tied

ancient nova
#

nah

#

this will be too hard to make online

#

I doubt many people will understand how to play it as well

solemn latch
#

I think its the most popular casino game next to roulette

#

forsure the most popular card game

ancient nova
#

maybe I'll add blackjack once I decide on an economy system

#

but not as a fun game

#

cause it doesn't really seem fun if I'm honest 😭

#

to be honest I was thinking of a 2 person type of game

#

I already made ttt, c4, rps and was thinking a good way to make hangman

#

those seem like the type of games to make like that

#

I think at least..

wheat mesa
#

Blackjack is nice because it’s a simple game at its core, you have two (or 3 depending on the situation) options at all times, mostly based on luck

solemn latch
#

Yeah, its super approachable.

ancient nova
#

I can't really think of a good way to make this into a 2 player game even with the examples you guys showed me

#

so idrk..

wheat mesa
#

Speaking of which, is there any issues regarding Discord ToS when it comes to things like gambling? As in, pure virtual currency, and 0 connection to real currency whatsoever

solemn latch
#

Not that I'm aware of

ancient nova
solemn latch
#

any connection to real currency is taken really seriously.
even if its just a games currency.

#

some gambling communities around mobile game currency have been shut down

#

as they could be sold online

ancient nova
#

that's plain stupid?? discord taking dank memer "memecoin" as currency lol

solemn latch
#

no, I mean like an actual games currency

sick agate
ancient nova
solemn latch
#

👀 really

ancient nova
#

cs;go currency is knives for example

#

and they get sold for millions

ancient nova
#

I used to farm that's y

sick agate
#

nah

ancient nova
#

does anyone know the scroll bar class name for discord?

#

I wanna make it transparent but I can't seem to be able to find it's color property even in inspect element

solemn latch
#

typically scrollbars are just ::-webkit-scrollbar ::-webkit-scrollbar-track ::-webkit-scrollbar-thumb

#

for example,

::-webkit-scrollbar {
  width: 5px;
}

::-webkit-scrollbar-track {
  display:none;
}
 
::-webkit-scrollbar-thumb {
  background: #515151; 
  border-radius: 10px;
}
ancient nova
sick agate
#

which browswr

ancient nova
#

google chrome

sick agate
#

oh

#

it was expected if it was Firefox

wheat mesa
#

Webkit style selectors are for Firefox/IE iirc

sick agate
#

oh

#

.......

wheat mesa
#

Idk though

#

Might be

ancient nova
#

I tried fetching the query, class and ID

sick agate
#

browsers are totally not weird and ultra legacy

ancient nova
#

I got results which werent null and clearly pointed to the scrollbar yet changing the properties didn't have any effect

#

and it makes me so irritated when I look at it

#

looks so out of place

wheat mesa
#

Can you show what code you’re using

ancient nova
#
for (const query of document.querySelectorAll('*')) {
     query.style.backgroundColor = 'rgba(0, 0, 0, 0)';
}
compact pier
#

BetterDiscord ig

wheat mesa
#

Try using a hex color instead

ancient nova
#

right now I'm fetching every query and this makes most of the objects transparent

ancient nova
compact pier
#

omg, discord client disabled f12 or ctrl shift i

wheat mesa
#

Just try it, you might not be allowed to set the transparency of the scroll bar with color properties

compact pier
#

i spamming f12 it doesn't work

wheat mesa
#

See if it’s at least selecting it

ancient nova
sharp geyser
#

Some browsers that won't work on

wheat mesa
#

My dude just try it

sharp geyser
#

I can't remember which browsers but I know that is a thing

ancient nova
#

okok

#

everything changed except the scroll bar

wheat mesa
#

Oh I’m just realizing that the scrollbar probably isn’t even an element

#

Probably just y-overflow of some sort

ancient nova
#

how do I capture that

wheat mesa
#

Idk

sharp geyser
#

wdym waffle?

solemn latch
#

Yeah

sharp geyser
#

ah wait nvm

#

I misread what you said

sharp geyser
# solemn latch Yeah

Also don't know if you knew this

These are the vendor-prefixed properties offered by the relevant rendering engines (-webkit for Chrome, Safari; -moz for Firefox, -o for Opera, -ms for Internet Explorer). Typically they're used to implement new, or proprietary CSS features, prior to final clarification/definition by the W3.

#

if you did sorry for already explaining but hey now its there for those who didn't

wheat mesa
#

So happy that we need 30 different brands of css for 30 different browsers

solemn latch
#

yeah

sharp geyser
#

you'd be taking the fun out of css

ancient nova
sick agate
#

try scrollbar

#

or idek

solemn latch
#

scrollbar is for firefox only

sick agate
#

oh

sharp geyser
#

yea

compact pier
#

isn't it --webkit

sick agate
#

browsers are totally not weird

compact pier
#

i think

sharp geyser
solemn latch
#

I had a rough time dealing with all this too

sharp geyser
#

do we know what browser he is on?

ancient nova
#

it's honestly so infuriating

ancient nova
solemn latch
sharp geyser
#

then -webkit should be working

ancient nova
sharp geyser
#

maybe something is overriding it?

ancient nova
compact pier
#

discord front end dev :>

ancient nova
#

so the properly doesn't exist

sharp geyser
#

well it does 100% exist lol

#

I've used it

ancient nova
#

it doesn't appear to do anything so idk how you managed to get it working

solemn latch
compact pier
#

there are 2 scrollbar, 1 for user list, 1 for chat

sharp geyser
#

also -webkit-scrollbar doesn't change the actual scrollbar it just changes thebackground of the scrollbar, thumb iirc is what changes the sscrolling part

solemn latch
#

yeah, scrollbar is the actual background bar

#

nono wait

#

👀

ancient nova
#

so it's impossible?

compact pier
#

try display:none to see if u access the correct one

#

:>

#

maybe wrong attribute

ancient nova
#

okay it actually worked

solemn latch
#

scrollbar is the container isnt it?

scrollbar > track > thumb

track is the background

compact pier
solemn latch
#

thumb is the sliding part

sharp geyser
#

ah maybe you're right

#

so touching scrollbar there really is no point unless you wanna change the width of the entire thing ig

#

you'd wanna focus track and thumb if you wanna change its color and such

ancient nova
#

uhhh

#

surprising to see there is a scrollbar near the emoji icon

#

why tho?

sharp geyser
#

woah is that a custom background I see

#

def not doing the same

ancient nova
sharp geyser
#

Cause technically the scrollbar stops at where the chat input starts

compact pier
#

just apply to every class :DD

ancient nova
#

though I see changing the backgroundColor property changes the actual element background instead of the scroller background

#

so that's annoying

ancient nova
#

it increases when you type in the chat

solemn latch
#

you're trying to change the track background?

ancient nova
solemn latch
#
::-webkit-scrollbar-track {
  background: red;
}
ancient nova
#

I can't inject custom CSS I need to override the existing property..

#

editing discord CSS is tricky because it constantly changes

#

the trick I used is to track location and update CSS when that changes

#

@sharp geyser how did you do your css edit?

sharp geyser
#

I went towards the smarter people and let them do all the work

solemn latch
#

🤔 isnt it the same process, i'm just saying its the track you need to select, not the scrollbar itself.

ancient nova
#

:/

sharp geyser
#

You can inject your own custom css and js into electron ig

ancient nova
#

I'll try figuring it out in a bit

split hazel
#

@boreal iron @quartz kindle speedyos bouta finally have segmentation faults

#

you can stop laughing at my os being broken because when it is broken i'll know

boreal iron
#

As long as there’s no PHP support I can’t take it seriously

split hazel
#

only c++/c/rust support

#

take it or leave it

#

basically anything that can compile down to assembly

boreal iron
#

leaving the room

split hazel
#

no pages for you

boreal iron
#

😥

split hazel
#

thats like playing minesweeper with no safe zones

quartz kindle
#

make a minesweeper game but if you hit a bomb the os segfaults/bsods

split hazel
#

good idea

quartz kindle
#

make it display random garbage on screen so its different every time

split hazel
#

if you hit a bomb it will wipe your hard drive

boreal iron
#

lol

quartz kindle
#

thats a bit too much

split hazel
#

should be enough motivation

quartz kindle
#

maybe add a hardcore mode that does that

#

disabled by default

boreal iron
#

Or it literally renames and moves all your files

quartz kindle
#

lmao

boreal iron
#

That’s enough I guess

quartz kindle
#

scramble the file table

sharp geyser
#

Only URLs with a scheme in: file, data are supported by the default ESM loader. On Windows, absolute paths must be valid file:// URLs. Received protocol 'c:' tf does this mean

#

😔

split hazel
#

if it detects you pressed the power button during the game it will wipe it anyways

quartz kindle
sharp geyser
#

yes but why

quartz kindle
#

use file://

#

not C:/

sharp geyser
#

I have no idea how i should do that tho

split hazel
#

bro file system support comes later

#

once i have fs support i'll also add disk thrashing

sharp geyser
# quartz kindle use file://

resolve only returns

C:\Users\dyeaa\Documents\github\misty\locale\locales\de.json
C:\Users\dyeaa\Documents\github\misty\locale\locales\en.json```
boreal iron
boreal iron
#

Already spent 1000$ on a nice boot logo

split hazel
#

if you want to troll the OS make a bunch of processes and make them each allocate multiple blocks of massive chunks of memory and then continuously access them in a loop so the OS cant move them to the drive temporarily

split hazel
#

because i think that makes it so you have to load the rest of the OS from the drive to memory

boreal iron
#

And there’s nothing yet, right?

split hazel
#

and idk how to access fs yet

#

i only know the built in bios emulated way of writing/reading from disk exists

boreal iron
#

Fuck the fs, try something new and innovative

split hazel
#

the rest i think you need usb support

#

well yeah im writing my own file system

#

using someone elses is mid

#

should probably add a waiting for IO status to my os now

#

just so i dont forget

boreal iron
#

I see

#

All you need is a marketing manager

#

I’m available

#

Only taking 90% of your profit and 110$/h

#

🙃

split hazel
#

I'll think about it

sharp geyser
#

I basically save all the stuff from the locales files into a map that I call later when translating using a key/prop

sharp geyser
#

So say I have an json file full of data, some nested some not.
What would be the easiest way to get that data as I need it.
I was trying to use the dot notation of like
get(contentsFromFile, 'bot.welcome.message', 'Nothing at this Path')

#

this would traverse the bot object, and welcome object and finally arrive at message which has an actual value to display

#

I was using the https://npmjs.com/package/dot-prop but it is full esm and I don't wanna go through the headache of making my package esm rn

quartz kindle
#

you can still use esm libs with async imports

sharp geyser
#

wdym

sharp geyser
quartz kindle
#
await import("dot-prop")
sharp geyser
#

don't you need your package.json to have type: "module" for that ?

quartz kindle
#

nop

sharp geyser
#
node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

Error [ERR_REQUIRE_ESM]: require() of ES Module C:\Users\dyeaa\Documents\github\misty\locale\node_modules\dot-prop\index.js from C:\Users\dyeaa\Documents\github\misty\locale\out\struct\Localization.js not supported.
Instead change the require of index.js in C:\Users\dyeaa\Documents\github\misty\locale\out\struct\Localization.js 
to a dynamic import() which is available in all CommonJS modules.
    at C:\Users\dyeaa\Documents\github\misty\locale\out\struct\Localization.js:37:81
    at async Localization.t (C:\Users\dyeaa\Documents\github\misty\locale\out\struct\Localization.js:37:33)       
    at async C:\Users\dyeaa\Documents\github\misty\price-check\main.js:7:15 {
  code: 'ERR_REQUIRE_ESM'
}
#

Then what tf

#
    public async t<T>(prop: string): Promise<T | string> {
        const { getProperty } = await import('dot-prop')
        return getProperty(this.locales.get(this.options.lng), prop, 'Nothing to find at this path.')!
    }
quartz kindle
#

it says you're still using require?

sharp geyser
#

But I'm not

#

I only use require when I'm testing my package in a js file

#

Could that cause it to have issues?

quartz kindle
#

are you using ts-node?

sharp geyser
#

No

quartz kindle
#

check the compiled js file

#

see what typescript did with that import

sharp geyser
#

Alright

sharp geyser
#

they used require

fallen holly
#

can you guys help me.
I'm making games for my discord bots and going to give coins to them
what should i do with that coin

quartz kindle
#

try setting "module": "node12"

wooden ember
#

anyone know how to resent the voice connection? on a bot

#

everynow and then my internet cuts off for a second or two and i have to reboot the entire bot for voice to start playing again

#

even if the bot wasnt in a chat at the time

#

or if i kick it and make it join again

#

is there any fix for this other than just make my bot reboot every hour?

sharp geyser
# quartz kindle try setting "module": "node12"

node12 errors saying tsconfig.json:3:15 - error TS6046: Argument for '--module' option must be: 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext'.

lyric mountain
#

well, the pink elephant would be finding why a vps is losing connection

#

or are u self-hosting?

sharp geyser
#

already did

#

same thing happens

quartz kindle
sharp geyser
#

import transpiled into require

quartz kindle
#

then try the es ones

#

es2020 es2022 esnext

sharp geyser
#

yea that made it transpile into import but other things get broken in the process

#
C:\Users\dyeaa\Documents\github\misty\locale\out\index.js:1
export * from './struct';
^^^^^^

SyntaxError: Unexpected token 'export'
    at Object.compileFunction (node:vm:353:18)
    at wrapSafe (node:internal/modules/cjs/loader:1040:15)
    at Module._compile (node:internal/modules/cjs/loader:1076:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1166:10)
    at Module.load (node:internal/modules/cjs/loader:988:32)
    at Module._load (node:internal/modules/cjs/loader:834:12)
    at Module.require (node:internal/modules/cjs/loader:1012:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (C:\Users\dyeaa\Documents\github\misty\price-check\main.js:1:26)
    at Module._compile (node:internal/modules/cjs/loader:1112:14)
#

Now this becomes an issue

#

my barrel files break

quartz kindle
#

welcome to ts

sharp geyser
#

😔

#

Fucking love this conundrum

quartz kindle
#

lmao

#

apparently the only 100% reliable solution is this ```ts
Function('return import("abc")')() as Promise<typeof import('abc')>

#

lmao

wheat mesa
#

well then

sharp geyser
#

What the actual fuck

quartz kindle
#

basically set the import as a string and eval it

#

that will prevent ts from transpiling it

sharp geyser
#

😩

quartz kindle
#

someone else said that it works now with "module":"nodenext" on ts 4.7+ but you get warnings for being nightly/unstable

sharp geyser
#

🤔

quartz kindle
round cove
#

That is funky

sharp geyser
#

TS2349: This expression is not callable.   Type 'Promise<typeof import("C:/Users/dyeaa/Documents/github/misty/locale/node_modules/dot-prop/index")>' has no call signatures.

round cove
#

are you having mjs issues

sharp geyser
#

I am having trying not to use esm issues

#

esm bad rn

round cove
#

esm sucks DICK

#

I agree

#

🤝

sharp geyser
#

It would be good

#

if it was actually fully released

quartz kindle
#

show code

sharp geyser
#

and not experimental

#
    public async t<T>(prop: string): Promise<T | string> {
        const importDotProp = Function('return import("dot-prop")')() as Promise<typeof import('dot-prop')>;

        const { getProperty } = await importDotProp();

        return getProperty(this.locales.get(this.options.lng), prop, 'Nothing to find at this path.')!
    }
round cove
#

Yo wait wtf

#

dynamic import?

quartz kindle
#

try removing the () from importDotProp

#

or just await Function directly

sharp geyser
#

Actually that makes sense tim

round cove
#

What's this supposed to achieve anyway? I'm interested

sharp geyser
#

dot-prop is a esm package

#

I don't wanna swap to esm to support it

quartz kindle
#

prevent ts from transpiling import to require

sharp geyser
#

and that ^

#

you can't require a esm package so you have to use import

quartz kindle
#

but for some dumb reason ts transpiles dynamic imports to require

round cove
#

Does this need to be imported in the function to begin with?

quartz kindle
#

dynamic imports are async

#

there is no top-level await in cjs

sharp geyser
#

now to figure out why I am getting the default value instead of what I am actually looking for

#

😔

#
bot.message
{ lng: 'en' }
{ bot: { mesaage: 'Hello, World' } }
Nothing to find at this path.

Tell me bot.message doesn't exist

#

smh

round cove
#

Sorry just trying to figure out if this needed to be dynamically imported.

sharp geyser
#

it does

round cove
#

mesaage

sharp geyser
#

cause cjs can't import esm packages

#

with require*

sharp geyser
round cove
#

I thought you were making a joke lmfao

#

Hmm I THOUGHT it was possible to import esm with es2020

#

I might be misremembering

#

I just remember hating esm so much lol

sharp geyser
#
bot.message
{ lng: 'en' }
{ bot: { message: 'Hello, World' } }
Hello, World
sharp geyser
#

that is one of the reasons a lot of people are swapping to esm

#

One thing I am wondering is though

#

Is it good to be saving all the contents of their locale files to a map?

#

Right now I am reading the data of their locale json files and saving its content to a map with the file's name being the key which is also the files locale key e.g en

quartz kindle
#

i dont see why not

round cove
#

Watcha making though @sharp geyser

pale vessel
#

^ that's just a fork to fix it crashing on Windows

round cove
sharp geyser
snow urchin
#

How can I stop node-gyp trying to use multiple visual studio versions? I have 2022 version installed, and both yarn and npm config are set to use the 2022 version.

https://i.callum-is.gay/KOPokEhO84.png

wheat mesa
#

Is that the actual syntax? Seems… odd

sharp geyser
#

I was logging some stuff

#
const { Localization } = require("locale");
(async () => {
  const locale = new Localization({ lng: "en" });

  await locale.addMultipleIn("locales");

  console.log(await locale.t("bot.message"));
})();

this an example of how I was doing it

#

lng would be set with some kind of language detector what not. (I could probably do something better but this is my first version of it so leave me alone before you bully me waffle)

wheat mesa
#

locale.t is getting the message you set for bot.message right? Shouldn’t you make this a synchronous operation?

sharp geyser
#

Well it is kind of hard to when I have to do what tim suggested above

wheat mesa
#

Why not load the locale file into a Map

sharp geyser
#

I am dummy

wheat mesa
#

O(1) access too

sharp geyser
#

I am

#

dummy

#

what you think addMultipleIn does?

#

it takes the files in locales folder and reads it's contents putting it into a map with the locale as the key

wheat mesa
sharp geyser
#

WELL TS IS JUST DUMB WAFFLE

wheat mesa
#

Why not store all your locales as Map<Map<string>>

sharp geyser
#

here is the entire Localization folder

#

Map inside a map?

#

tf

wheat mesa
#

Where the first map key corresponds to the locale, and the second key corresponds to the message

sharp geyser
#

waffle if you wanna make this better

#

go ahead

#

I am tired