#development

1 messages · Page 131 of 1

pale vessel
#

you can use a library like gif-encoder-2 with canvas to create a gif

rustic nova
#

also consider reformatting your code, isn't too readable

lyric mountain
#

no, but u can compose a gif with the individual frames

earnest phoenix
#

ty

#

the annotation above @venady?

#

i removed it and still same err

slender wagon
#

Oh ok, so basically what i am trying to do is get an image and over it insert a gif i already have and then process it as a gif without losing the gf properties yk

pale vessel
#

remove the spaces before @

earnest phoenix
#

ok it worked like a charm

#

there isn't any problem like this on js i think never thought of it

#

ty

slender wagon
earnest phoenix
#

using both

pale vessel
#

no problem, indentation is important in python

lyric mountain
#

but only slightly important topggDoge

earnest phoenix
#

any clues on why this doesnt work?

#

when i put the variable in a f-string it returns this

rustic nova
#

what do you mean with putting it in an f string

#

more code with context would help more

earnest phoenix
#

a string with a "f" before

#

that should let me use variables inside it

#

(according to stackoverflow)

pale vessel
#

yeah, but what are you logging?

#

generated?

earnest phoenix
#

lines

lyric mountain
#

that object simply doesn't implement toString() method

#

so it prints the class + address

#

in js it'd print [object Object]

earnest phoenix
#

ah

earnest phoenix
#

each redeem code for the bot generated adds a new line in the .txt file (\n 1)

lyric mountain
#

why are u using a file btw

#

simply use a database

earnest phoenix
#

for just some lines i don't need it

lyric mountain
#

well, over time it'll accumulate

earnest phoenix
#

maybe when some users get on the bot i'll migrate

#

ye

lyric mountain
#

why leave it for later, simply plug a sqlite db there while it's easy to do

earnest phoenix
#

ok i'll do

#

like this right?

pale vessel
rustic nova
#

still cant really do much myself with screenshots are barely show any code flow

pale vessel
lyric mountain
pale vessel
#

it's just this code with amount renamed to generated right?

lyric mountain
#

I have absolutely no idea

pale vessel
#

I have no clue what that code does either

lyric mountain
#

the image of the output only shows a very slim line

#

so idk if it's a message or an embed body

#

and the code makes no sense as to output that

#

the output shows InvokableSlashCommand, so they're printing the command itself

pale vessel
#

then they didn't say what they actually did

slender wagon
#

do you guys know any gif extractor npm

#

for the frames

#

that can handle large files

lyric mountain
#

How large are we talking?

frosty gale
#

gif and large dont exactly go well together 💀

solemn latch
#

👀 when I think of gif I think large

#

They are so inefficent

frosty gale
#

yeah but gifs are usually very short and low quality for some reason

#

not sure why

solemn latch
#

because they are inefficent

frosty gale
#

maybe because thats their whole purpose

delicate zephyr
#

this one handles 200MB gifs

#

takes a while, but it will

frosty gale
#

i swear gifs are a dying format now since the prehistoric days of the web

#

now youd loop an mp4

solemn latch
#

webp animated ❤️

delicate zephyr
#

svg animated nutton

solemn latch
#

you got a point there

delicate zephyr
#

automatically responsive images are just nut

#

also being able to change colours to whatever

#

being able to give specific elements of the svg their own id so you can colour them specifically too

#

svg's in web are just so much more convienient

lyric mountain
#

apng exists ffs, yet some browsers dont support it yet

#

and discord refuses to allow using it for anything except stickers

frosty gale
#

still remember the random shitty websites back in 2000s that had flashing gifs everywhere and was seen as looking modern

lyric mountain
#

plot twist: the song "Blinding Lights" was written when the author tried to access a site in early internet

frosty gale
#

you are lying

#

i have to verify this

#

it is too good to be true

grim aspen
#

false

#

there aren't any claims about blinding lights

#

being an origin of accessing a sight in the early internet

#

the song is based on the streetlights blinding him while walking down the street while intoxicated

lyric mountain
#

thought the "plot twist" part made it obvious it was a /s lmao

grim aspen
#

i'm not that great at getting that stuff through text

frosty gale
grim aspen
#

i wasn't mad

slender wagon
#

I am gonna have to recheck tomorrow

#

Its like 40mb

slender wagon
#

2 vs 2

#

Beat that

frosty gale
slender wagon
#

Also what i am trying to do with canvas is get the user input image and insert my large gif over it then cut the gif off based on the user image afterwards send the user the gif

#

The watermark is a gif

hushed robin
#

suggestions on how i can make this look nicer

#

mostly the description part

pale vessel
#

how many entries could there possibly be?

hushed robin
#

why are the docs lying

#

🗿

pale vessel
#

oh then it's perfect if you have an embed field for every entry

#

of course it could get very long, but it's ephemeral so it wouldn't spam the channel for everyone else

hushed robin
#

hm

pale vessel
#

just do
Key: Value
for every entry inside an embed field

hushed robin
#

what

#

theres lots

#

actually i get what your saying, i will try it

pale vessel
#

yea, add a newline after every one of them, unlike what you have currently

hushed robin
#

well

pale vessel
#

since that looks hard to read

hushed robin
#

i did tried newlines before but it kinda looked really long

pale vessel
#

yea but if it looks better you should keep it

hushed robin
#

well lets see

pale vessel
#

again, it's ephemeral so it's fine

#

compact is good, but not if it's unreadable

hushed robin
#

do fields have to have a

#

name

pale vessel
#

ye

#

oh

#

you could use an empty space I believe

hushed robin
#

hm ok

pale vessel
#

or just use the ID as the field name and the details as value

#

that could also work and doesn't look janky

hushed robin
#

hm

pale vessel
#

looks good

hushed robin
#

it basically ruins my bot

#

the bulk endpoint does not give me memberCount even though the docs say it should

pale vessel
#

maybe you need to provide an additional query parameter?

#

if not then not much you could do I suppose

hushed robin
#

maybe i'll complain on their forums

#

😁

#

my current bot does a request per group but i wanna do them in bulk

#

it'll be much less requests

pale vessel
hushed robin
#

i can make 1 request instead of 48 requests

pale vessel
#

does it say anywhere that the bulk endpoint doesn't return member count?

hushed robin
#

no

pale vessel
#

yea then make a forum post

hushed robin
#

of what it should return

pale vessel
#

ahh

#

ic

hushed robin
#

yeah

#

i will make a forum post

pale vessel
#

make sure to ask nicely

hushed robin
#

yes i am very nice

#

oh i can't even use the forum category for bugs

#

i'm not high enough level 😐

hushed robin
#
#

this sucks 🗿

#

might just remove it from my bot tbh

#

I’ve been getting a lot of 429 errors

solemn latch
#

Would caching api responses work?

hushed robin
#

no the bot is suppose to update a voice channel with updated data on your groups member count

#

that would defeat the purpose

solemn latch
#

How often does that number change? And is it by a lot?

hushed robin
#

there’s no set amount

#

whenever a user joins the group

#

it’ll go up

solemn latch
#

Then it probably doesn't need to be updated extremely often.

#

A few times a day maybe?

hushed robin
#

no every 5 minutes

harsh nova
#

Is it really that important that those stats are 5 minutes accurate? You'll want to increase the time as you are already getting ratelimited and it'll only get worse with more servers

hushed robin
#

I already have logic setup to do it every 5 minutes

#

it ain’t changing

harsh nova
#

But you are getting ratelimited 💀

hushed robin
#

Imma just remove it from my bot

harsh nova
#

Guess that's one way to solve the problem KEKW

hushed robin
#

because whoever made the API is stupid

#

why would u remove the membercount from the endpoint then not even update the docs

#

what’s the point of the endpoint if I can’t get the member counts

#

fuckkkk

harsh nova
#

The reason they removed it is probably the very same why you want it

harsh nova
#

The reason they removed it might be that they don't want people to periodically check member counts for purposes such as renaming a voice channel

#

Only speculating ofc. I don't work at Roblox

hushed robin
#

but they have other bulk endpoints that provide statistics on games

#

why wouldn’t they do the same for them too

harsh nova
#

No clue

junior loom
#

stupid question:
I have commands which are admin only (require Manage_Guild) permission to run..
My question is:
Is it more "practical" to:
A: respond to the user with a notification if he does not have the permissions to run that command
B: lock the commands behind discords "default_member_permissions", so that the command does not even get shown to the user

pale vessel
#

that's some amazing coincidence right there

proven lantern
#

i dont want squrespace

#

how dare they

rustic nova
#

You know it's bad when you very often see "this video was sponsored by Squarespace"

uncut sedge
#

why when i send a test nothing gets sent?

rustic nova
#

That does not support discord webhooks

uncut sedge
#

oh i get it

#

mb

rustic nova
#

You might have seen webhooks mentioned in your apps' settings and wondered if they're something you should use. The answer, in a nutshell, is probably yes.
Webhooks are one way that apps can send automated messages or information to other apps. It's how PayPal tells your accounting app when your...

earnest phoenix
#

Hey there...

Working on a project in Next.js and I am trying to use FontAwesomeIcons however I am running into some issues...

Anytime that I have an icon component within the code, I get a hydration error.

I followed the documentation to a tee and looked on the internet.

I would just use ReactIcons however I need dynamic icons, so it's just easier to use the FA package instead once I can get some help figuring out this hydration error.

I made sure that I don't have a <div> tag in a <p> tag or anything like that

Here is my code and I have a screenshot of the error attached as well

Thanks in advance!!!

import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";

export default function SocialMedia({ details }) {
    return (
        <div className='text-center md:text-right'>
            <h3 className='text-xl md:text-2xl font-bold'>{details.title}</h3>
            <div className='text-md md:text-lg mt-1 flex justify-center items-center gap-2'>
                <FontAwesomeIcon icon='fa-solid fa-envelope' />
                <p>{details.emailAddress}</p>
            </div>
            <div className='text-md md:text-lg flex justify-center md:justify-end items-center gap-2'>
                <FontAwesomeIcon icon='fa-solid fa-phone' />
                <p>{details.phoneNumber}</p>
            </div>
            {details.socialMediaPlatforms.map((platform, index) => (
                <div key={index}>
                    <a href={platform.link} className='text-xl'>
                        {/* i will put code here i promise :) */}
                    </a>
                </div>
            ))}
        </div>
    );
}
#

And in the _app.js I have the following:

import "@/styles/globals.css";

import { library } from "@fortawesome/fontawesome-svg-core";
import { fab } from "@fortawesome/free-brands-svg-icons";
import { fas } from "@fortawesome/free-solid-svg-icons";

library.add(fab, fas);

export default function App({ Component, pageProps }) {
    return <Component {...pageProps} />;
}
slender wagon
plucky quail
#

I like would add it

#

But I’ll probably break everything 🔥

slender wagon
#

then you need a dev

plucky quail
slender wagon
#

hi guys i have issue my code is no error but no resul

summer torrent
#

wow

slender wagon
#

all this work and it generates me a fucking static image

#

im gonna go crazy

pale vessel
#

what's the code for the image generation

slender wagon
#

what pastebin do you suggest

#

so let me explain what i am doing

#

I get the image that the user sends and put over it my gif then chop off the remaining parts then i send it back to the user keeping the state of the gif

#

but for some reason it just sends me the image that i sent back but as a gif

slender wagon
#

YOOO I GOT IT WORKINGGG

hushed robin
frosty gale
#

its just fucked

#

maybe you can try loading the library only on client side? perhaps its not ssr compatible

#

something like this

earnest phoenix
#

Gotta love SSR!!!!!!!!!!!!!!

#

I'll give this a shot rn and see what I can't get myself into

#

Yup, got it solved! Thank you so much for the help @frosty gale!!

frosty gale
#

🥰😃😀😁😆🥹😅🥵

hushed robin
#

last emoji is sue

quartz kindle
#

you are sue

deft wolf
frosty gale
#

sorry just got very excited for a second

hushed robin
#

guys should I use buy me a coffee or ko-fi

#

who has experience with them

earnest phoenix
# hushed robin guys should I use buy me a coffee or ko-fi

Buy Me A Coffee and Ko-Fi are similar as they allow creators to accept one-off donations, memberships, and create a shop. The difference is that Ko-Fi offers more features and takes a 0-5% cut, and Buy Me A Coffee offers less and takes a 5% cut but allows supporters to easily donate without creating an account.

frosty gale
#

why does it have to be coffee

hushed robin
#

I like buymeacoffee branding more but ko fi seems better

frosty gale
hushed robin
earnest phoenix
frosty gale
#

thanks for the business idea im on it now

earnest phoenix
frosty gale
#

i found a gap in the market finally

earnest phoenix
#

lmk when you get this up and going

hushed robin
#

kofi looks more art like

earnest phoenix
#

i need this. now.

hushed robin
#

but I’m not going to use it for that

#

🗿

earnest phoenix
#

I would use coffee

#

Especially if you have a broad demographic.. Older people tend to not like to make accounts

hushed robin
#

Ko-fi also automatically deposits the money into your account

#

with buy me a coffee u can only withdraw once a week

hushed robin
earnest phoenix
#

Did I read it wrong?

hushed robin
#

yes

earnest phoenix
hushed robin
#

that’s wrong

earnest phoenix
#

BUT, if you have a demo that is younger, then accounts don't matter, so ko-fi would be better

hushed robin
#

u can donate on kofi without an account

earnest phoenix
#

ko-fi seems to have a lot more benefits tbh

hushed robin
#

yeah

#

but I don’t like the branding tbh

#

It makes it too cutesy

quartz kindle
#

meanwhile here i am with patreon eating a piece of my pie

hushed robin
#

Patreon er

#

no

#

too complex

#

I just need something for people to pay me with

earnest phoenix
#

paypal mock

#

jkjkjkjkjkjk

hushed robin
#

no

#
  1. full name
  2. need to be 18+
earnest phoenix
#

i forgor discord allows MD now

#

Markdown is a W

#

YUHHHHHHH

spark flint
#

i have used paypal since age 11

earnest phoenix
#

real

spark flint
#

and they don't check name

hushed robin
#

idk where your getting that from

earnest phoenix
#

I use it and I'm a minor shush

hushed robin
#

to signup u need to give them id

spark flint
#

not in the UK shrug

hushed robin
#

buymeacoffee is being a pain in the ass to withdraw with

earnest phoenix
#

i'm in the us and i'm all gucci frogstoned

hushed robin
#

they’ve been reviewing my account for 3 days

#

🤬

earnest phoenix
#

prolly cause you're under 18

hushed robin
#

no

#

they don’t ask for your age

earnest phoenix
hushed robin
#

so how would they know that

earnest phoenix
hushed robin
#

and if they did I would simply lie

earnest phoenix
#

above my paygrade

hushed robin
#

PayPal is different cus u need to actually prove ur 18+ lol

earnest phoenix
#

but if they find out you lie

#

that's fraud

#

found that out the hard way when I had lawyers in my email thumbsup

#

So now anytime I need to be over 18, I just create the account under my moms name and DOB

hushed robin
#

how they suppose to find out

#

unless u tattle rn

earnest phoenix
#

by asking when your account is under review

hushed robin
#

nah

#

they didn’t ask

earnest phoenix
#

then u gucci

hushed robin
#

i wanna doordash me some McDonald’s with this

#

but they taking too long

#

after I withdraw this I’m deleting my account and moving to ko fi

lyric mountain
#

and the bank account wont lie to them

frosty gale
#

business idea: make a website thats in the middle of kofi and buymeacoffee and offer fast withdraws, low transaction fees and no account needed

hushed robin
lyric mountain
#

stripe knows your identity

earnest phoenix
#

chloe finna be the new berkshire hathaway

frosty gale
#

i hate stripe idk why every single business feels like using it

#

their transaction fees arent even competitive

lyric mountain
hushed robin
#

so I just need my parent to give me their id

hushed robin
lyric mountain
#

they still know who are you tho

hushed robin
#

I will use that towards hosting my bot

#

the second one I fixed someone’s code for

#

(i will use that for McDonald’s)

slender wagon
#

i remember being able to disable the option of automatic transfer to bank

#

seems like it's not an option anymore

quartz kindle
#

nice refill

hushed robin
quartz kindle
quartz kindle
#

either from his own money or from the outside, aka he got paid

#

i prefer thinking he got paid, so im congratulating him

#

is that enough info for you or should i make you a drawing and a powerpoint presentation?

acoustic bough
#

rich kid

quartz kindle
#

lmao

#

i mean

quartz kindle
#

you can guess how poor we are when 200 bucks deserves a big "nice"

#

:^)

slender wagon
#

wait

#

this is development

#

i was supposed to come here and ask something

#

so big question is i am working with gif's

#

i insert a transparent gif and insert it over a png with canvas

#

and it comes out as not transparent

hushed robin
slender wagon
#

@frosty gale got any clue how i can keep the transparence of an gif when i put it over a image using canvas

acoustic bough
#

I'd wonder how to use canvas with gifs at all

slender wagon
acoustic bough
#

really? I need 3 stupid packages just for that

slender wagon
slender wagon
#

i might not be doing it in the best way possible

acoustic bough
#

what do I do when I have imported those packages? (yes spoon feed me)

#

I wanted to add gif support to my image server a while ago but didn't manage to do it

slender wagon
#

oh lool

#

so basically

hushed robin
#

image is a poop

slender wagon
#
 let frames;
  try {
    frames = await extractFrames({ url: watermarkGifUrl, frames: 'all', timeout: 120000 });
  } catch (err) {
    console.error(`Error extracting frames from GIF: ${err.message}`);
  }
  console.log(`Extracted ${frames.length} frames from GIF`);

i extract the frames off of my gif

acoustic bough
slender wagon
acoustic bough
#

now I know why I didn't continue on image generation

slender wagon
#

but there is an issue with it

#

let me show u

acoustic bough
#

lemme deploy that again

pale vessel
#

so if it's a gif with a green screen you can make the color green and that'll become transparent

acoustic bough
#

@slender wagon kek

slender wagon
#

💀

hushed robin
#

can u measure text in canvas without

slender wagon
#

no

hushed robin
#

context

#

why not

slender wagon
#

cuz i sayso

#

jk idk

hushed robin
#

i want my canvas width to be based on text width 😳

slender wagon
pale vessel
lyric mountain
#

u cant measure something without context

hushed robin
#

i wanna make my canvas width based on text measurement

lyric mountain
#

...just think about it for a split second

#

how tf would u measure something without context? (so no units or scales or anything)

lyric mountain
#

u cant measure text without a context

#

unless it's a monospaced font

civic scroll
#

you still need to spawn one context then measure it

hushed robin
civic scroll
#

you are inefficient

#

see, the thing is, browsers have different scaling (be pixel density or zoom etc.), leading to the graphics being rendered with different physical size

#

the only way to determine its size is by actually rendering it

#

which is, you need to create a context

#

for fast and efficiency you can use a single canvas context instance for quick calculation, assuming they have the same scaling

#

you want faster stuffs? consider not bothering with javascript and learn rust / c++ or sth

quartz kindle
#

compared to other canvas operations, measuring text is really insignificant in terms of performance

civic scroll
#

nanosecond counts yk

quartz kindle
#

gotta boost your process.hrtime

#

:^)

hushed robin
quartz kindle
#

no

hushed robin
#

bruh

#

how else then

pale vessel
quartz kindle
#

measure it on the same canvas you want to draw on

hushed robin
pale vessel
#

he wants to create a new canvas with the text width, so he doesn't have any context

hushed robin
#

can u resize canvas?

pale vessel
lyric mountain
hushed robin
lyric mountain
#

I'll keep this image stored, so many contexts I can use it for

quartz kindle
pale vessel
#

I didn't resize when I used canvas

#

cuz idk

civic scroll
hushed robin
pale vessel
#

yeah ^
but if you could resize might as well resize

civic scroll
#

if you can resize, do it

#

otherwise, create new

civic scroll
#

go search your question up

quartz kindle
civic scroll
#

ah so you can do that

hushed robin
#

so i will make width of canvas 0

#

measure text

#

then make it measurement of text

quartz kindle
#

sure

civic scroll
lyric mountain
#

can canvases have 0-length sides?

civic scroll
#

yes

quartz kindle
#

same way there are 0 length strings, arrays, buffers, vectors, etc

rustic nova
#

width height 0 if thats what you mean

#

yes

civic scroll
#

are there 0 length tims

quartz kindle
#

maybe :^)

lyric mountain
#

asked cuz graphics2d disallows that

#

and canvas is oddly similar to it

quartz kindle
#

well i never tested

civic scroll
#

some might, you know, only measure the space where the text is visible

#

but i doubt

lyric mountain
#

idk if there's a technical reason for that

hushed robin
#

why is my image so

#

weird

#

small

lyric mountain
#

like, at minimum I can make a 1x1 context, but never 0 area

lyric mountain
hushed robin
quartz kindle
#

there shouldnt be any technical reason

civic scroll
#

huh

lyric mountain
#

50pt?

#

shouldn't it be 50px?

civic scroll
#

pt is valid

quartz kindle
#

exdee

lyric mountain
#

js has too many font units

pale vessel
#

css

civic scroll
#

but normally you would do the

ctx.fontFamily = 'Menlo';
ctx.fontSize = '50pt';
ctx.fontStyle = 'bold';
pale vessel
#

oh I've always done the former

quartz kindle
#

same lel

civic scroll
#

or ctx.fontFamily = 'Menlo Bold'

quartz kindle
#

but this way is nicer

pale vessel
#

too much assignments

#

1 is enough

earnest phoenix
quartz kindle
#

how many teemos is a point?

civic scroll
#

Sayuri Thin -1pt

quartz kindle
#

Sayuri gone

civic scroll
quartz kindle
#

thanos'ed

#

what if

#

if you set yourself with negative size

#

you become inside out instead

frosty gale
quartz kindle
#

vertex swap

civic scroll
frosty gale
#

some shitty video service tried charging me extra without my consent for trial by giving my card details to some random service

quartz kindle
#

iruyas*

#

:^)

frosty gale
#

luckily i was using a virtual card tho

frosty gale
#

what i did in revenge was wrote a script which downloads all the parts of the videos and then combine them later in ffmpeg
(because you need to pay extra to download videos)

#

i feel better now

quartz kindle
#

exdee

lyric mountain
frosty gale
lyric mountain
#

you see, gifs don't support transparency, just like jpeg

#

cuz gifs are technically animated jpegs

frosty gale
#

learn something new every day

lyric mountain
#

what it does is, instead, use the index-0 color as a mask color

#

so if that color is, for example, black, every single black pixel in the image will be transparent

#

but for the gif, it'll still be black

#

this is why transparent gifs are so choppy and aliased

#

it can also only hold 255 colors

slender wagon
#

ah shit

#

so i'll have to make the background green

#

well that sucks

frosty gale
#

im still not 100% sure what you want to do

hushed robin
frosty gale
#

do you want it so a gif plays on top of the image or a single frame of the gif is shown on top of the image

lyric mountain
#

you'll also make it incredibly dithered depending on the number of colors (and really big, usually 4-5x as big as the sum of the original file sizes)

frosty gale
hushed robin
#

yeah

slender wagon
#

going over an image

lyric mountain
#

ah, well

#

do u really need to use gif?

#

if u just want an animated image use webp or apng instead

slender wagon
#

can i convert a gif to that?

#

and maybe make it transparent?

lyric mountain
#

yes, both support transparency and the whole int32 range of colors

#

basically the same as png

hushed robin
#

i think i know why my image looks low quality
is it because i'm sizing up my canvases width from 0

lyric mountain
#

while being tiny compared to gif

slender wagon
#

I am gonna have to contact the artist who made the watermarks since this project isn't mine

#

and ask them to convert it most likely

#

got any clue about their size cuz the current gif is like 40mb

lyric mountain
#

Depending on length and dimensions

slender wagon
#

Damn

lyric mountain
#

It's not that animated images are big, it's just that gif is terribly inefficient

lyric mountain
#

Support

#

Also popularity maybe

hushed robin
#

so whats better then gif

#

apng?

lyric mountain
#

If u ask someone "do you know what is a gif" they'll definitely know it

#

Not so much for webp and apng

hushed robin
#

true

lyric mountain
hushed robin
#

gif is a really popular name

hushed robin
lyric mountain
#

It was born outdated

#

But it was good enough

#

Plus it was innovative, people went bananas over it

hushed robin
#

to switch

lyric mountain
#

They can't really switch until every browser and device supports it

#

U can for sure use apngs in ur site, but some devices might not be able to show it

#

Support is big already, but not 100%

hushed robin
#

hm i see

#

so has better support is a major reason ?

lyric mountain
#

Yes?

#

It's like, THE reason many js, html and css features aren't used widespread

hushed robin
#

hm ok

#

no need to be passive aggressive

lyric mountain
#

That's not what passive aggressive means

hushed robin
#

it does

#

🫠

brave saddle
#

can I ask about coding question that are not related to top.gg?

lyric mountain
#

yes sure

brave saddle
#

so I'm trying to convert my emoji reaction to button and I was able to make them work but I'm not sure how to make the button style change color base on what button was clicked on. also I'm using discord.py. is there maybe a better way to do this?

#

ops forgot to fix the graybutton class

earnest phoenix
#

can a bot create/join a GroupDMChannel?

lyric mountain
#

to change the color u need to set the style to either SUCCESS, PRIMARY, SECONDARY or DANGER

#

being blue, gray, green and red respectively

brave saddle
brave saddle
lyric mountain
#

Not in js

#

I don't know any good example project

#

Only one I can speak about is in java

hushed robin
#

🫠

lyric mountain
#

Python whatever

hushed robin
#

js makes sense py doesn’t

lyric mountain
#

Doesn't matter, my point still stands

hushed robin
#

true

#

send your handler

#

i wanna see it

lyric mountain
#

Pagination utils on google

hushed robin
#

or whatever Java handler u were referring to

hushed robin
lyric mountain
#

You wanted to see it, just google that name

#

It's the name of the lib

hushed robin
#

oh ok

peak drum
shadow frigate
#

How do I read this?

    'x-ratelimit-limit': [ '2' ],
    'x-ratelimit-remaining': [ '0' ],
    'x-ratelimit-reset': [ '1686992861.526' ],
    'x-ratelimit-reset-after': [ '3.895' ],

My bot has been rate limited for about 12 hours now

deft wolf
quartz kindle
#

its a regular rate limit, its telling you that you can do 2 requests and you have 0 left, and it will reset in 3.8 seconds

#

so you probably are allowed for 2 requests every 5 seconds, but you are consistently doing more than that

shadow frigate
#

I have no idea what's going on then, it's been happening for 12 hours lmao

#

And I've just began a recode and it only consists of the sharding manager

#

You want to see the code?

#

It's just one file and I can't see any loops / reason why it would try to login multiple times

quartz kindle
#

if you're working with sharding, make sure you are properly queueing shards, as discord only allows one shard to connect every 5 seconds

#

unless you have a large bot (150k+)

shadow frigate
#

ohhh

#

no

#

28k

#
const settings = require(`../settings/client.json`);
const { ClusterManager, HeartbeatManager } = require(`discord-hybrid-sharding`);

const manager = new ClusterManager(`./index.js`, {
    totalShards: `auto`,
    shardsPerClusters: 4,
    token: settings.tokens.production,
    mode: `process`,
    restarts: {
        max: 10,
        interval: 1000 * 60 * 60 // 1 hour
    }
});

manager.extend(
    new HeartbeatManager({
        interval: 2000,
        maxMissedHeartbeats: 3
    })
);


manager.on(`clusterCreate`, cluster => {
    console.log(`[clusters ${cluster.id}] Cluster has been launched.`);
    cluster.on(`spawn`, () => {
        console.log(`[Cluster ${cluster.id}] Cluster has been spawned.`);
    });
});

manager.on(`debug`, message => {
    console.log(`[Manager][Debug]${message}`);
});


try {
    manager.spawn({ timeout: -1 });
}
catch (error) { 
    console.error(error);
}


module.exports = manager;


process.on('unhandledRejection', function(reason) { console.log(reason.headers) });
#

We are utilising discord-hybrid-sharding though so we can get clusters

quartz kindle
#

i dont know the internals of discord-hybrid-sharding, but its not a good idea to override some of their internal stuff, like the heartbeatManager and the timeout

#

better leave those as defaults

shadow frigate
#

yea

#

I'm not sure why they were added tbh

#

oh actually

#

it was used so that if a cluster was offline for longer than the interval & missed heartbeats, it would get them back online

sharp geyser
#

yea thats how that works

#

The discord gateway needs certain information to perform a reconnect, ovveriding internal stuff like that will not end well

shadow frigate
#

So I shouldn't have this?

sharp geyser
#

I would recommend listening to Tim

#

Unless needed I wouldn't mess with the defaults

shadow frigate
#

hmm okay

#

any idea on the rate limit tho? lmao

#

I still can't fathom it out

#

Not sure if this helps but: 'x-ratelimit-scope': [ 'user' ]

#

I looked on discords api site but I can't really understand it properly

sharp geyser
#

I haven't touched the discord api or websockets in ages, so I don't know if I will be of any help in this regard.

shadow frigate
#

it seems like it's trying to launch the same shard at a time.

const settings = require("../settings/client.json");
const { ShardingManager } = require('discord.js');

// Create a new instance of the ShardingManager
const manager = new ShardingManager('./index.js', {
  token: settings.tokens.production,
  totalShards: 'auto', // Set 'auto' for Discord.js to automatically determine the number of shards
});

// Spawn the shards
manager.spawn();

// Listen for the 'shardCreate' event to know when each shard is ready
manager.on('shardCreate', (shard) => {
  console.log(`Launched shard ${shard.id}`);
});

I'm trying it using the Discord.js package instead and it does the same thing.

Launched shard 0
Launched shard 0
node:internal/process/promises:288
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: 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(). The promise rejected with the reason "#<Response>".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Node.js v18.16.0
#

assuming this would be the rate limit error

#

yup

quartz kindle
#

thats just an uncaught promise

#

nothing about the actual limit

#

can you manually make a request to the discod api using a rest client?

#

if so, try fetching the gateway endpoint, and maybe then you can see the actual rate limit information

#

but usually when you get limited on the gateway itself, it usually lasts for 24 hours

shadow frigate
#

I've got it working on my testing one

#

It's a problem with the production environment or something

#

Back to this one (using discord-hybrid-sharding):

const settings = require(`../settings/client.json`);
const { ClusterManager } = require(`discord-hybrid-sharding`);

const manager = new ClusterManager(`./manager.js`, {
    totalShards: `auto`,
    shardsPerClusters: 4,
    token: settings.tokens.production,
    mode: `process`,
    restarts: {
        max: 10,
        interval: 1000 * 60 * 60 // 1 hour
    }
});

manager.on(`clusterCreate`, cluster => {
    console.log(`[clusters ${cluster.id}] Cluster has been launched.`);
    cluster.on(`spawn`, () => {
        console.log(`[Cluster ${cluster.id}] Cluster has been spawned.`);
    });
});

manager.on(`debug`, message => {
    console.log(`[Manager][Debug]${message}`);
});


try { manager.spawn({ timeout: -1 }); }
catch (error) { console.error(error); }

module.exports = manager;

This is the manager file:

const { GClient } = require(`gcommands`);
const { GatewayIntentBits } = require(`discord.js`);
const { ClusterClient, getInfo } = require(`discord-hybrid-sharding`);
const { join } = require(`path`);
const settings = require(`../settings/client.json`);

const client = new GClient({
    dirs: [
        join(__dirname, `commands`),
        join(__dirname, `events`)
    ],
    intents: [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.GuildMembers,
        GatewayIntentBits.DirectMessages
    ],
    partials: [`CHANNEL`, `MESSAGE`, `REACTION`, `USER`],
    shards: getInfo().SHARD_LIST,
    shardCount: getInfo().TOTAL_SHARDS
});

client.cluster = new ClusterClient(client);

let environment = process.env.NODE_ENV;
if(!environment) environment = 'staging';
try { client.login(settings.tokens[environment]) }
catch (error) { console.error(error) }


module.exports.client = client;
quartz kindle
#

if the code is the same in test and in prod but the problem only happens in prod, then it could be a cloudflare ip ban

#

although those should only last for 1 hour

shadow frigate
#

yeah i have no idea

quartz kindle
#

you're only running it once right? you're not using anything like pm2 cluster mode or similar

shadow frigate
#

I'm using pm2

#

but using it normally like pm2 start client.js

maiden gazelle
#

Does somebody know what I'm doing wrong here in this counting game

const arg = message.content.trim().split(/ +/g);
if(!isNaN(Number(arg[0])) && !message.stickers.first() && !message.attachments.first()) {
    let channel = await db.get(`countingchannel-${message.guild.id}`)
    channel = message.guild.channels.resolve(channel)
    if(channel && message.channel.id === channel.id) {
      let count = await db.get(`counting-${message.guild.id}`)
      if(count) {
          console.log("4")
        if(message.author.id === count.user) {
          await db.delete(`counting-${message.guild.id}`)
  console.log("5")
          let embed = new Discord.EmbedBuilder()
          .setColor("#C73D43")
          .setDescription(`${message.author} ruined it at ${count || 0}!`)
 
          message.reply({ embeds: [embed] })
        } else { console.log("6")
          if (Number(arg[0]) === count + 1) {
              console.log("7")
            count++
            await db.set(`counting-${message.guild.id}`, { count:count, user:`${message.author.id}` })
            await message.react("✅").catch((err) => {});
          } else {  console.log("8")
            if(!arg[1] && message.author.id !== user) {
              console.log("9")
              await message.react("❌").catch((err) => {});
              await db.delete(`counting-${message.guild.id}`)

              let embed = new Discord.EmbedBuilder()
              .setColor("#C73D43")
              .setDescription(`${message.author} ruined it at ${count || 0}!`)

              message.channel.send({ embeds: [embed] })
            }
          }
        }
      } else { 
          console.log(arg[0])
if(arg[0] === [1]) {
    console.log('hi')
await db.set(`counting-${message.guild.id}`, { count:1, user:`${message.author.id}` })
await message.react("✅").catch()
}
}
    }
  }
maiden gazelle
#

there isnt a error

deft wolf
#

So what's the problem?

coarse fjord
#

How do I receive the name of those who voted for my bot, given that the hosting where I host my bot does not have a fixed ip?

shadow frigate
errant flax
#

just started learning about building stuff so here ya go, still pretty new abt it 🦖

tepid flax
shadow frigate
spark flint
#

is it possible to restrict file types for attachment slash commands

pale vessel
#

nope

spark flint
#

rip

spark flint
#

ew

#

easiest solution

earnest phoenix
# spark flint

Btw you can use the slash command builder (SlashCommandBuilder) class which is more intuitive to use, it validates input types and also provides good typings to help you catch bugs easily

spark flint
#

but v13 does not have the .addAttachment thing

earnest phoenix
#

Oh, why are you using v13? 👀

spark flint
#

its a bot i wrote last year and i cba to port it over

#

i'd have to move over a lot of stuff and i tried in October and gave up

#

partly because the method i used for disabling buttons no longer works why

earnest phoenix
#

I can help you migrate to v14 if you want

spark flint
#

this does not work anymore

#

you can't adjust the component that was used

earnest phoenix
#

Yeah but you can take the component, and construct new components from them and adjust the data

#

Basically: new <ComponentClass>(<Component>.toJSON())

spark flint
#

ah

brave saddle
peak drum
#

Yes

brave saddle
eternal osprey
#

is there any reason why they use it.remove()?

#

i mean, we are returning the result, so why wouldn't result.add() be enough?

earnest phoenix
eternal osprey
#

yer

earnest phoenix
# eternal osprey yer

I don't see why they're removing the current element from the collection through the iterator, especially considering that Java is always pass-by-value, you can't pass-by-reference

If passing-by-reference was possible in Java and it actually was passed by reference, there would be a reason to remove the elements as it would affect the argument passed to the method, but since this isn't the case I don't see a reason for them to do that

#

I feel like they want to reduce memory usage while the values are being added to the other collection, instead of waiting for the programming language to free it up after the function ends

lyric mountain
#

Oh wait, nvm, I mistook the context

#

They do that so the number of elements stay constant

thorny cargo
maiden gazelle
real phoenix
#

does anyone know how to ban a user without using a command?
I'm trying to make a global ban list using trello and I'd like to ban the user in all servers the bot is in when they get banned from one.

lyric mountain
#

if u want to ban without using the mouse simply do the same way u do with a command

deft wolf
#

I guess he means like global ban system

#

When bot ban someone on every server

lyric mountain
#

same way as making a command

#

that said, this is a heavily opt-in feature

#

as it can lead to account ban if done wrong or without consent

wheat mesa
#

Yeah that gives a lot of power to server moderators

real phoenix
#

Well the ban system if for a bunch of sub servers in a main server

#

so the mods of the main server can ban someone from the main and all the sub communites

lyric mountain
#

then yeah, do it as if u were making a command

#

you might need to setup express tho

#

to be able to receive requests from an external service

real phoenix
#

My current solution is just storing all the servers the bot is in then banning them for each server

#

not sure how effient that is

lyric mountain
#

that's how u do it

real phoenix
#

alr cool

lyric mountain
#

u cant ban in any other way

real phoenix
#

thats what I thought but I wanted to see if theres a better way to do it

#

guess not

lyric mountain
#

only members with BAN_MEMBERS perm can ban, so using the bot is the only way to achieve it

frosty gale
#

my favourite bot permission is the join servers for you permission

lyric mountain
#

that's an application perm, not bot

frosty gale
#

same thing :(

lyric mountain
#

to be more specific, a scope

lyric mountain
frosty gale
#

they go hand in hand

lyric mountain
#

nope

frosty gale
#

yes

lyric mountain
#

for example, sites and games are applications

#

bots are just a type of application

frosty gale
#

but some applications can be different :)

#

its ok we dont discriminate

#

some have bots some dont

#

but theyre all equal

lyric mountain
#

...idk if ur being sarcastic

frosty gale
#

youre too serious

lyric mountain
#

in this channel, yeah

#

else people will get wrong info

real phoenix
#

from discord import app_commands, option
ImportError: cannot import name 'option' from 'discord'
uhh am I importing option wrong?

lyric mountain
#

show code

real phoenix
lyric mountain
#

mouse over it

#

yellow squiggly line means a warning, never ignore them

real phoenix
#

its saying option is unused

frosty gale
#

warnings are meant to be ignored:)

#

otherwise theyd be errors

real phoenix
#

thats cuz i commented out the part that was using it

lyric mountain
#

hm

#

what editor are u using?

#

most have auto-import feature

real phoenix
#

wait

#

nvm

#

i didn't even need the module

#

🤦🏿‍♂️

lyric mountain
#

is option supposed to be the slash command option?

real phoenix
#

yes

lyric mountain
#

ah, then yeah u dont need to import, it comes with the command itself

tulip ledge
real phoenix
#

alr back again. Something is wrong with how im pulling data from my trello
Anyone know whats the issue?

def ping(f_stop):
  now = datetime.now()
  print(now)
  id = os.environ['blacklistID']
  url = f"https://api.trello.com/1/lists/{id}/cards"
  query = {'key': APIKey, 'token': APIToken}
  response = requests.request("GET", url, headers=headers, params=query)
  res = json.loads(response.text)
  url2 = f"https://api.trello.com/1/lists/{store}/cards"
  query2 = {'key': APIKey, 'token': APIToken}
  guilds = requests.request("GET", url2, headers=headers, params=query2)
  for v in res:
    print(v["name"],v["desc"])
    for guild in guilds:
      print(guild)
      a = json.loads(guild) # Error is here
      print(a["desc"])
      member = guild.get_member(v["desc"])
      if (member):
        member.ban()
  if not f_stop.is_set():
    # call f() again in 60 seconds
    threading.Timer(60, ping, [f_stop]).start()
thorn tulip
#

Have anyone did math command? I need a command to calculate expression. Eval() isn't safe. I tried sympy, but it lags when user inputs very big number like "9^9^9^9^9", and same with similar modules.

wheat mesa
#

You could use an api like wolframalpha, I think that’s free to use

rustic nova
#

can I just make aware of this shid path name

thorn tulip
#

And it's too much for just math expressions

spark flint
#

replit 🗣️

digital swan
wheat mesa
#

Could also maybe use docker + child process

#

Or just build your own expression parser 🧌

real phoenix
rustic nova
#

replit skill issue

pale vessel
# thorn tulip Have anyone did math command? I need a command to calculate expression. Eval() i...

fun fact, mathjs has their own API so you don't have to use it in your machine and have it potentially crash your bot (not like you could anyway, since you use python)

https://github.com/flazepe/aeon-rs/blob/master/src/commands/utility/calculate.rs#L22

GitHub

Your ultimate Discord bot with many utilities and API integrations. - aeon-rs/src/commands/utility/calculate.rs at master · flazepe/aeon-rs

#

I believe the API still crashes for big numbers (last time I tried it did) so you might need to handle that

thorn tulip
pale vessel
#

I think there was a way the BRs used to check

#

lots of bot got declined for it

thorn tulip
#

Lol, copilot knows something

pale vessel
#

oh sorry, ignore (it didn't copy the link properly somehow)

#

^^

thorn tulip
pale vessel
#

you could add a timeout for your request

#

3s or so should be okay

thorn tulip
#

Also idk why, but I only get text not json

#

But docs says that response is json

frosty gale
#

result = 5 + 6 ❌
result = await fetch("/api/solve?expression=" + "5+6", { method: "GET" }).then(r => r.json()).answer ✅

pale vessel
#

but yeah, it returns plain text

frosty gale
#

this was a joke to say you should offload addition to some api instead of your cpu

#

its doing enough work as it is give it a break

pale vessel
#

just shut the bot down

#

no CPU usage needed

thorn tulip
#

So it only returns either answer, Infinity or Error?

pale vessel
#

maybe LUL3D

thorn tulip
#

Dividing by 0 returns []

frosty gale
#

will try it

#

postman is so shit is there a better open source alternative

#

postman become bloated proprietary business monetary shit

pale vessel
#

use postwoman

#

👍

frosty gale
#

i'll just use curl

pale vessel
#

reqbin has a redesign that looks pretty nice

pale vessel
#

that's cool

frosty gale
#

approaching postman territory but fine

#

136mb http client yes please

#

could fit an entire game in that

#

thanks electron

#

cant do simple algebra trash api

thorn tulip
#

Why 5:5 is [5], and 5+5 is 10

frosty gale
#

maybe : can return multiple numbers depending on input idk

pale vessel
#

that...looks correct?

#

5 to 5 is just 5

thorn tulip
#

And why 10:2 returns []

pale vessel
#

because it doesn't go backwards ig

thorn tulip
#

I guess api doesn't recognise : as /

#

So I need to replace it before requesting

frosty gale
#

goofy api

thorn tulip
#

Hah, so 1:10 will return list

pale vessel
#

: is for range

#

I think you misunderstood what it was for

frosty gale
#

thats pretty cool it can do variables

thorn tulip
#

I didn't see it

thorn tulip
#

It tries to create a list from 1 to 999...

pale vessel
#

yup

thorn tulip
#

I'm replacing : with /, as I don't need it

frosty gale
#

ah it does it in a special timed worker that has a timeout

#

smart

harsh nova
#

ah yes the ole 1:9999999999999999999999999999999999999999 trick

thorn tulip
#

I guess it works

#

Another day spent only for one command xD

pale vessel
#

it do be like that sometimes

thorn tulip
#

Yesterday I was trying to calculate daily compund interest using formula for years

#

Hah

#

Like this

pale vessel
#

mafs

#

at least you had a productive day

frosty gale
#

bros gonna make his own bank now

#

business idea: make a bank in a discord bot that supports mastercard and visa

#

!loan 500000

thorn tulip
#

And crypto

thorn tulip
#

So u can make customizable virtual economy on server

rustic nova
#

day 500 of asyncio pissing me the fuck off

#

mimimimi loop already running

#

fuck you asyncio

frosty gale
rustic nova
#

cant use an await outside an async function

#

you gotta promise it too

#

but its more easier to do in js

#

on python you need a fucking degree in that shit

frosty gale
#

python has weird af classes too

rustic nova
#

nah these are fine

frosty gale
#

why tf do you need to use __init__ for a constructor like youre accessing some super secret method that youre not supposed to use

#

just name it constructor or the class name bro 😭

rustic nova
#

init = initialize

#

makes sense to me

frosty gale
#

yeah but the underscores

rustic nova
#

constructor sounds like you're making some sort of blueprint for a class rather than initializing it

frosty gale
#

actually kinda makes sense

#

i think they wanted to go with the flow of adding funcitonality to classes

#

so you can make a class stringify in a special way with __str__

#

and you can go from there

#

not a fan of passing the self parameter everywhere though instead of the class doing it automatically

pale vessel
#

you wouldn't like rust then

frosty gale
#

classes do this low level under the hood but out of all languages i wouldnt expect python to expose this kind of logic

#

c++ doesnt even do it

rustic nova
#

fuck python

#

literally on the edge on just giving myself pain and doing this discord bot and fucking webserver in plain c

#

literally so easy to setup an express server and discordjs and have them run in parallel

frosty gale
#

how bad can it be

#

its just tcp and some special letters

hushed robin
#

what’s a good way to measure the rate limit on an endpoint?

rustic nova
#

reading the docs

pale vessel
#

by spamming the hell out of the API (don't actually do this)

hushed robin
rustic nova
#

Then Ratelimit headers

hushed robin
#

there aren’t any

pale vessel
#

ask them

hushed robin
#

I don’t think they’ll reply

#

they’re a big corporation

pale vessel
#

try first

hushed robin
#

and if they do it’ll take a long time

pale vessel
#

still, it's not that hard to ask

hushed robin
#

no

pale vessel
#

exactly

hushed robin
#

there’s no point in asking

pale vessel
#

maybe there is

hushed robin
#

if you could ask and get an answer it would be out there somewhere

#

but it ain’t

pale vessel
#

it takes 10s max to write an email

hushed robin
#

I’ve searched

pale vessel
#

or whatever form of contact they use

pale vessel
#

lol that sounded rude

hushed robin
#

I was told this by a guy who is very experienced with the API

#

bc I am having rate limiting issues

rustic nova
#

Why don't they just tell you the Ratelimit

hushed robin
#

idk

rustic nova
#

Moment

pale vessel
#

because they don't know

hushed robin
#

but how can I test it to see what it is

pale vessel
#

every time you make a request, log the timestamp and response from the API

hushed robin
#

ok

#

also it’s kinda weird

#

he told me non residential IPs have a more strict rate limit

pale vessel
#

maybe that'll give you a glimpse of how much requests you could make under a specific time window

hushed robin
#

so that means I need to run it on my server to see

#

which is going to be annoying

#

😵‍💫

pale vessel
hushed robin
#

idk maybe he hasn’t tested it

#

all the endpoints have no documented ratelimits

hushed robin
#

honestly I'm just going to remove that feature from the bot

#

the rate limiting is way too strict and it have no scalability

#

🙃

#

just did some testing and it seems I can make 100 reqursts before getting ratelimited

#

now lets see how long it takes for me to stop getting 429s

hushed robin
#

ok so if i send over 100 requests i get blocked for 20 minutes

#

😵‍💫

pale vessel
#

100 requests under what? a minute?

hushed robin
#

instantly

#

not instantly but

#

like a few seconds

#

i'm going to test with an interval to see if it does the same thing

pale vessel
#

yeah do every 1 second

hushed robin
#

i did 2 seconds

#

and it lasted the same amount of requests

#

and this is on my home ip too if it's stricter on server IPs 😵

split patrol
#

How do I fix this? As you can see on the right, the scroll bar is not all the way up. Whenever the website launches, it automatically scrolls down to there instead of the very top of the page. I don't know why.

harsh nova
hushed robin
#

Roblox's API is primitive

#

no documented rate-limits nor headers

#

split patrol
short cape
#

I'm using the Top.gg Autoposter but, all of a sudden, it stopped sending regular updates. It only will send an update upon startup of the bot. No errors are logged either. Has anyone else run into this issue? I'm using the shard version

chilly gyro
#

Owo vote is 404

sharp geyser
#

They couldn't give any fucks

#

How hard do you guys think it would be to setup a file hosting service like meganz or any other ripoffs?

rustic nova
#

not hard

#

if the ignore the security aspects ofc

#

just a simple upload page, send file to backend, store in a folder, store a key for that, send when requested, done

#

also ignoring the aspect of what can and cannot be uploaded

#

or have a pogu project and make your own one Pog

sharp geyser
#

or I can do it myself

sharp geyser
#

Especially making sure nothing illegal is uploaded

#

Last I want is a repeat of mega

#

That won't do shit

#

Discord itself had an influx of illegal content

rustic nova
#

one thing you can directly enforce natively by cloudflare is csam scanning

sharp geyser
#

csam?

rustic nova
#

so you had the majority of things to not worry about

#

child sexual abuse material

sharp geyser
#

Ah

rustic nova
#

cloudflare has that as a scanning tool

sharp geyser
#

Yea

#

That's a definite must

rustic nova
#

movies etc can probably just be removed manually

#

so would need a reporting system

#

if thats in js, might wanna help since I'm kinda thinking about going into js

sharp geyser
#

The thing with a file "safe" is you don't want people to know what you are storing unless you're openly sharing it

#

So a report system is really out of the question here.

#

At least

#

In terms of private files

#

Publicly displayed files can still be reported, but something else will have to be figured out for anything private

#

While also not giving off the sense of an invasion of privacy

sharp geyser
rustic nova
sharp geyser
#

Indeed,

#

Anything private though is a gray area

rustic nova
#

yeah

rustic nova
sharp geyser
#

I'll appreciate the help if you do wanna help

sharp geyser
# rustic nova yeah

One thing I can say is if they get too many reports, their account can be under review meaning all files public or private is exposed to the moderator. Yet, they could also just never have public files to be reported so idk.