#development

1 messages Β· Page 273 of 1

stark nymph
#

and how long is that vote valid for?

knotty night
knotty night
stark nymph
#

so a user can vote every 12 hours meaning twice a day, and what timezone is this based on for top.gg?

#

So I can synchronize the validity of the vote

knotty night
#

It’s 12 hours from last vote so

#

Time zones don’t matter

stark nymph
#

ah ok

#

got it perfect, thank you william

#

preciate the help

knotty night
#

You’re very welcome. Let me know if you need any more help.

stark nymph
#

yep just gonna set this up now and wait for verification

#
interface TopGGVote {
  bot: string;
  user: string;
  type: "test" | "upvote";
  isWeekend: boolean;
  query?: string;
}

export async function POST(request: Request) {
  const reqHeaders = await headers();
  const authorization = reqHeaders.get("Authorization");

  if (!authorization || authorization !== process.env.TOP_GG_WEBHOOK_AUTH) {
    return new Response("Unauthorized", { status: 401 });
  }

  const body = (await request.json()) as TopGGVote;
  const cache = await connectCache();

  await cache.set(`topgg-vote:${body.user}`, "voted", "EX", 60 * 60 * 12);
}
#

πŸ‘

slender wagon
#

Does discord allow you to detect if a message is a reply to a certain message?

prime cliff
#

It already has the reference on the message?

prime cliff
#

Also the message type has Reply << 19 flag

slender wagon
#

Thanks!

acoustic bough
prime cliff
#

Yea i did say type

acoustic bough
#

oh I just read flag, idk how I missed the type but yeh

#

no still wrong

#

its just 19

#

it's not a bitboard

#

so there is no bit shifting and no flag

prime cliff
#

That's what enum flags are bitwise operations

acoustic bough
#

there is no bitewise operation for types

small tangle
#

hes talking about the representation of enums "under the hood"

prime cliff
#

Yea... ^

acoustic bough
#

it then would be 19 << 0 = 19

prime cliff
#

I think you might be confused with how different langs show it

acoustic bough
#

what I mean is that you just have like type: 19, unlike with flags where you have flags: (1 << 0) | (1 << 5)

prime cliff
#

Yea 19 code is shorthand for 1 << 19 which is to the power of x19

#

But generally libs use the 1 << 19 syntax

acoustic bough
#

if you use a typescript enim it would just be ```ts
enum MessageType {
Reply = 19
// ...
}

const t = MessageType.Reply;

enum MessageFlags {
Crossposted = 1 << 0,
HasThread = 1 << 5,
// ...
}

const f = MessageFlags.Crossposted | MessageFlags.HasThread;

so saying reply is `<< 19` is odd when you just could say `19` (and you're missing the `1`, since nothing woud technically use `0`)
prime cliff
#

Yea ik

acoustic bough
#

(where 0<<n is 0)

prime cliff
#

XD

acoustic bough
#

and it's not the way the docs represents it so it fried my head

acoustic bough
wheat mesa
#

Huh? 1 << 19 is not 19.

prime cliff
acoustic bough
frosty gale
lyric mountain
#

gotta remember it doubles for every additional shift

vital mirage
#

const guildIds = client.guilds.cache.map(guild => guild.id);

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

#

ihave guild intents on

quartz kindle
vital mirage
#

i just realized my command handler or interation handler doesnt pass client in the execute, i fixed it by defining client as interaction.client

pearl trail
#

uh, what in the magic is happening [fixed]

#

ok nvm my fault

prime cliff
#

Why is console underlined Thonk

pearl trail
#

i use eslint

solemn latch
#

notlikenoot I hate mdx

sharp geyser
#

whats mdx

sharp geyser
solemn latch
#

Yeah

sharp geyser
#

Looks...interesting

solemn latch
#

Its great, but also a pain

sharp geyser
#

What is its uses though

#

Can it be exported or I guess turned int oa working md file?

#

does it inline whatever is imported?

solemn latch
#

Has to be in a react file.
Its great for stuff like blog posts.

For example adding a YouTube video embed in markdown.

sharp geyser
#

Ah

#

I thought it was like, to easily create markdown files using jsx components

#

Either way thats rather neat

solemn latch
#

When you're making a website for someone else you never know what they'll want. Easier to do it this way ^-^

#

Next time i might just use markdown though

sharp geyser
#

Honestly fair

#

it also allows them to easily edit it themselves without needing to do much

sharp geyser
#

Whatcha guys think of this idea, I saw it on some github repo

#

I wonder what they would do to accomplish it

#

since receipts don't always show the full name of what you bought

frosty gale
#

sounds like a job for an LLM

#

can be a very low parameter open source one even

vivid fulcrum
#

that's a bit overkill, no?

#

scraping a few recipe websites works well enough

frosty gale
#

besides its 2025 we need 🌟 AI 🌟 in every single thing regardless of whether it helps or not

slim dirge
#

Sounds like something openai might be able to accomplish.

languid sedge
#

guys you rather use local data storage (as in .json files) or through database?

small tangle
#

please dont ever use json as a makeshift database

languid sedge
#

it works fine

#

also i use multiple jsons

#

each for their own storage thing

#

like one json stores the currency part of the bot

#

with server id - > user id

small tangle
languid sedge
#

they have a lot of redundancies

small tangle
#

again, thats not what json is for. You will avoid many issues by simply using a database

languid sedge
#

right

#

ill do it later

#

thats so much rewriting eeeeeeeeee

small tangle
#

But you will be happy about this choice once you look back at it

languid sedge
#

i will probably be happy

#

but the destination to there

#

i dont wanna think about it now

#

idek how to make it work with database

#

host does provide a free database

#

which is pretty nice

shadow dirge
#

using even like sqlite3

#

Is MUCH better

lyric mountain
# languid sedge it works fine
  • You're unable to use multiple threads
  • Jsondb is HIGHLY prone to corruption
  • No types
  • Unable to alter structure without rewriting every single entry
  • Unable to clusterize
lyric mountain
#

also u cant do queries at all, so u lose on data preprocessing

#

oh, and every single access requires u to load the entire "database" in memory

neon leaf
#

thats why you should use a yaml database !!!!!!

frosty gale
#

wait until you guys hear that you can batch changes together + enforce one write at a time to eliminate all corruption and improve performance

#

json dbs arent cursed if you know what youre doing theyre just very simple and wont scale

#

this is inspiring me to make a reliable json db npm module just to prove a point

lyric mountain
#

at that point just use a normal db

frosty gale
#

on a proper note how do you actually synchronize a function in js to ensure it isnt executed by multiple threads?

#

most reliable way i can think of is a queue type system

neon leaf
#

the same instance of a function cant be shared across threads

#

the only shareable data (that does not copy value) are sharedbuffers

frosty gale
#

i mean mostly in terms of async/libuv threads, if you do multiple io async calls these could end up executing on different threads in parallel (which is probably where json db corruption comes from)

neon leaf
#

yeah, multiple async file saves at once is the cause of corruption

#

easiest fix is to mark data as changed and write on an interval

lyric mountain
#

unless you go out of your way to use the node stuff

frosty gale
#

it sort of does though, async doesnt really work if you dont have multiple threads, json db corruption wouldnt be a concern either

lyric mountain
#

async uses event loop

neon leaf
#

^

frosty gale
#

yes but you wont really get performance gains without threads to handle blocking calls in the background

#

so node/libuv always spawn additional threads for those

neon leaf
#

not unless you force it to

#

nodejs has 2 threads normally

#

main code thread

#

and io thread

#

workers/cluster can add additional but its not implicit needs to be invoked manually

frosty gale
#

this looks like multiple threads to me πŸ˜•

neon leaf
#

only one is used for the actual code (same v8 isolate)

frosty gale
#
setInterval(() => {
  console.log("hello world");
}, 2000);
#

yes in async only one thread executes code but it doesnt mean multiple blocking tasks arent processing in parallel

neon leaf
#

parallelism doesnt exist in nodejs without worker threads/cluster

#

only delaying

#

async is nothing more than a delayed function too

delicate zephyr
#

your code is primarily running on 1 thread

#

unless you use something like workers/childprocesses/exec

acoustic bough
neon leaf
#

stuff like fetch appears parallel because the implementation of tcp is not in js itself so it does not follow the event loop fully

delicate zephyr
#

You'll find if you take multiple promises and shove it into a Promise.all it'll use more than one thread afaik

#

but I only saw that with fetch idk abotu anything else

acoustic bough
#

I'd say that promises are running in other threads but that could be wrong

neon leaf
#

unless io related

acoustic bough
#

so it's just purely concurrent outside of io

neon leaf
#

io related = offload it and run rest of pending promises but wait for all to finish

acoustic bough
#

I mean I run 14 child processes (basically as workers) atm so yeh

neon leaf
#

I just use rust grin

acoustic bough
#

I'd use go

#

I mean I'm using go for most of my side projects by now

neon leaf
#

I really hate go syntax tbh

acoustic bough
#

but I don't consider myself proficient enough to write bug projects with it yet

acoustic bough
neon leaf
#

well

#

I didnt use it because I felt its not similar to ts

#

lol

#

idk why but I feel more at home with rust

#

(maybe because I love memory management)

acoustic bough
#

I'm too stupid for menory

#

so I don't want to touch it xd

neon leaf
#

eh, rust does most of it for you

acoustic bough
#

I already create memory leaks with js

#

I mean I fuck GC more than the memory itself

delicate zephyr
#

we use go at topstats for things that we know are gonna need to be multithreaded

acoustic bough
#

I just like it for simple http servers

neon leaf
#

I learned rust by rewriting 3 repos that are active in production in rust πŸ”₯

acoustic bough
#

I got into go pretty fast tbh

delicate zephyr
#

or was it to learn

acoustic bough
#

uh it's just prettier

neon leaf
delicate zephyr
neon leaf
#

very fun experience

acoustic bough
#

just think it looks better but also to learn yes

#

it uses like 1mb memory lol

neon leaf
#

7mb ram usage (6mb of that is the pixel data)

acoustic bough
#

my first was nekostic

#

all the three repos are actively in prod

#

my main language still is TypeScript

#

still wish it was faster (well technically js)

neon leaf
#

but both worth it for learning

acoustic bough
#

I have like one rust project to convert units

#

like mm to km, C to F

#

or F to km, C to milliinches

#

yes

delicate zephyr
#

just wish their vps's weren't so heavily IO space limited

acoustic bough
neon leaf
#

still use drizzle for my db schema lol

#

too much of a hassle to change (closed source backend requires it)

delicate zephyr
#

ah fair

#

I use prisma for the JS backend internal sdk

#

and gorm for golang

neon leaf
#

yeah I switched from prisma to drizzle to sqlx + drizzle

#

very fire πŸ”₯

#

something very cool is that sqlx does build-time sql validation

#

so it will check if this query is syntactically correct and the inputs match whats expected from the db

#

while building the app

pearl trail
prime cliff
#

Pog Found this interesting tool that scans for vulnerable packages in different languages, bad configurations, docker image vulns and other issues.
https://trivy.dev/latest/

Gonna integrate it to my Dev Space project for docker container scanning.

frosty gale
#

(ive seen this happen before)

rare peak
#

Friends, I want to save the --FragXX file in a folder named --Frag, but I can't figure out what to do.

#

When the music bot is playing a new song, it is created between the main files and as the server gets bigger, the files also get bigger. I don't want it to interfere with the config files.

prime cliff
#

πŸ‘€

frosty gale
#

most buffer overflows arent too serious with the exception of probably a crash

#

a lot of conditions have to be just right to get any code execution or info extraction

#

probably good to get it patched though

delicate zephyr
fossil trench
#

Hello, there is something I don't understand, it's how to add webhooks.

deft wolf
#

What webhooks do you mean?

fossil trench
#

I don't know how it works and don't understand anything.

deft wolf
#

You can't use discord webhooks because they only accept a specific data, top.gg sends a completely different one

#

Generally, a webhook is nothing more than a web server that accepts a request from top.gg

#

If you don't care about any rewards and just want a message to be sent on the channel that someone voted for the bot, you can use https://webhook-topgg.com

Simplifying top.gg webhooks for all users, allowing non-developers and developers to use webhooks for their bot and server without confusing configuration.

fresh carbon
#

This is the error I get when I try to send a test message: Something went wrong
An error has occurred while processing your request

#

what's wrong with it?

compact condor
stoic dock
compact condor
#

maybe something was setup wrong? never used topggs webhook tbh

stoic dock
compact condor
#

damn

shadow dirge
#

Its outdated

#

you have to make a server urself

neon leaf
#

why does this take 1.2s

                    SELECT version, percentage
                    FROM (
                        SELECT
                            data->'blueprint'->>'version' AS version,
                            (COUNT(*) * 100.0 / (
                                SELECT COUNT(*)
                                FROM telemetry_data
                                WHERE id IN (
                                    SELECT latest_telemetry_data_id
                                    FROM telemetry_panels_with_latest
                                )
                                AND created > NOW() - INTERVAL '2 days'
                            ))::float8 AS percentage
                        FROM telemetry_data
                        WHERE
                            id IN (
                                SELECT latest_telemetry_data_id
                                FROM telemetry_panels_with_latest
                            )
                            AND created > NOW() - INTERVAL '2 days'
                        GROUP BY version
                    ) x
                    WHERE x.version LIKE 'beta-202_-__'
                    ORDER BY x.percentage DESC;```
and this 30ms
```sql
                    SELECT version, percentage
                    FROM (
                        SELECT
                            data->'blueprint'->>'version' AS version,
                            (COUNT(*) * 100.0 / (
                                SELECT COUNT(*)
                                FROM telemetry_data
                                WHERE id IN (
                                    SELECT latest_telemetry_data_id
                                    FROM telemetry_panels_with_latest
                                )
                                AND created > NOW() - INTERVAL '2 days'
                            ))::float8 AS percentage
                        FROM telemetry_data
                        WHERE
                            id IN (
                                SELECT latest_telemetry_data_id
                                FROM telemetry_panels_with_latest
                            )
                            AND created > NOW() - INTERVAL '2 days'
                        GROUP BY version
                    ) x
                    ORDER BY x.percentage DESC;```
#

the like should only check on 4 rows, no?

#

(subquery result: (39ms))

prime cliff
#

percentage should also be no decimal (or rounded) mmLol

neon leaf
#

.,

lyric mountain
neon leaf
#
  Sort Key: (((((count(*))::numeric * 100.0) / ((InitPlan 1).col1)::numeric))::double precision) DESC
  ->  GroupAggregate  (cost=16495.22..16495.26 rows=1 width=40)
"        Group Key: (((telemetry_data.data -> 'blueprint'::text) ->> 'version'::text))"
        InitPlan 1
          ->  Aggregate  (cost=8234.52..8234.53 rows=1 width=8)
                ->  Hash Join  (cost=8231.88..8234.50 rows=8 width=0)
                      Hash Cond: ((max(telemetry_data_3.id)) = telemetry_data_2.id)
                      ->  HashAggregate  (cost=8198.89..8200.89 rows=200 width=4)
                            Group Key: (max(telemetry_data_3.id))
                            ->  Hash Join  (cost=8117.62..8191.47 rows=2968 width=4)
                                  Hash Cond: (telemetry_panels_1.id = telemetry_data_3.panel_id)
                                  ->  Seq Scan on telemetry_panels telemetry_panels_1  (cost=0.00..64.52 rows=3552 width=16)
                                  ->  Hash  (cost=8080.52..8080.52 rows=2968 width=20)
                                        ->  HashAggregate  (cost=8050.84..8080.52 rows=2968 width=20)
                                              Group Key: telemetry_data_3.panel_id
                                              ->  Seq Scan on telemetry_data telemetry_data_3  (cost=0.00..7728.89 rows=64389 width=20)
                      ->  Hash  (cost=30.79..30.79 rows=176 width=4)
                            ->  Index Scan using telemetry_data_created_idx on telemetry_data telemetry_data_2  (cost=0.29..30.79 rows=176 width=4)
"                                  Index Cond: (created > (now() - '2 days'::interval))"
        ->  Sort  (cost=8260.69..8260.70 rows=1 width=32)
"              Sort Key: (((telemetry_data.data -> 'blueprint'::text) ->> 'version'::text))"
              ->  Nested Loop Semi Join  (cost=8117.91..8260.68 rows=1 width=32)
                    Join Filter: (telemetry_data.id = (max(telemetry_data_1.id)))
                    ->  Index Scan using telemetry_data_created_idx on telemetry_data  (cost=0.29..32.11 rows=1 width=702)
"                          Index Cond: (created > (now() - '2 days'::interval))"
"                          Filter: (((data -> 'blueprint'::text) ->> 'version'::text) ~~ 'beta-202_-__'::text)"
                    ->  Hash Join  (cost=8117.62..8191.47 rows=2968 width=4)
                          Hash Cond: (telemetry_panels.id = telemetry_data_1.panel_id)
                          ->  Seq Scan on telemetry_panels  (cost=0.00..64.52 rows=3552 width=16)
                          ->  Hash  (cost=8080.52..8080.52 rows=2968 width=20)
                                ->  HashAggregate  (cost=8050.84..8080.52 rows=2968 width=20)
                                      Group Key: telemetry_data_1.panel_id
                                      ->  Seq Scan on telemetry_data telemetry_data_1  (cost=0.00..7728.89 rows=64389 width=20)```

full
#
"  Group Key: (((telemetry_data.data -> 'blueprint'::text) ->> 'version'::text))"
  InitPlan 1
    ->  Aggregate  (cost=8234.52..8234.53 rows=1 width=8)
          ->  Hash Join  (cost=8231.88..8234.50 rows=8 width=0)
                Hash Cond: ((max(telemetry_data_3.id)) = telemetry_data_2.id)
                ->  HashAggregate  (cost=8198.89..8200.89 rows=200 width=4)
                      Group Key: (max(telemetry_data_3.id))
                      ->  Hash Join  (cost=8117.62..8191.47 rows=2968 width=4)
                            Hash Cond: (telemetry_panels_1.id = telemetry_data_3.panel_id)
                            ->  Seq Scan on telemetry_panels telemetry_panels_1  (cost=0.00..64.52 rows=3552 width=16)
                            ->  Hash  (cost=8080.52..8080.52 rows=2968 width=20)
                                  ->  HashAggregate  (cost=8050.84..8080.52 rows=2968 width=20)
                                        Group Key: telemetry_data_3.panel_id
                                        ->  Seq Scan on telemetry_data telemetry_data_3  (cost=0.00..7728.89 rows=64389 width=20)
                ->  Hash  (cost=30.79..30.79 rows=176 width=4)
                      ->  Index Scan using telemetry_data_created_idx on telemetry_data telemetry_data_2  (cost=0.29..30.79 rows=176 width=4)
"                            Index Cond: (created > (now() - '2 days'::interval))"
  ->  Sort  (cost=8234.66..8234.68 rows=8 width=32)
"        Sort Key: (((telemetry_data.data -> 'blueprint'::text) ->> 'version'::text))"
        ->  Hash Join  (cost=8231.88..8234.54 rows=8 width=32)
              Hash Cond: ((max(telemetry_data_1.id)) = telemetry_data.id)
              ->  HashAggregate  (cost=8198.89..8200.89 rows=200 width=4)
                    Group Key: (max(telemetry_data_1.id))
                    ->  Hash Join  (cost=8117.62..8191.47 rows=2968 width=4)
                          Hash Cond: (telemetry_panels.id = telemetry_data_1.panel_id)
                          ->  Seq Scan on telemetry_panels  (cost=0.00..64.52 rows=3552 width=16)
                          ->  Hash  (cost=8080.52..8080.52 rows=2968 width=20)
                                ->  HashAggregate  (cost=8050.84..8080.52 rows=2968 width=20)
                                      Group Key: telemetry_data_1.panel_id
                                      ->  Seq Scan on telemetry_data telemetry_data_1  (cost=0.00..7728.89 rows=64389 width=20)
              ->  Hash  (cost=30.79..30.79 rows=176 width=702)
                    ->  Index Scan using telemetry_data_created_idx on telemetry_data  (cost=0.29..30.79 rows=176 width=702)
"                          Index Cond: (created > (now() - '2 days'::interval))"```
subquery
#

looks pretty much the same

#

actuially

#
"                          Index Cond: (created > (now() - '2 days'::interval))"
"                          Filter: (((data -> 'blueprint'::text) ->> 'version'::text) ~~ 'beta-202_-__'::text)"
"                            Index Cond: (created > (now() - '2 days'::interval))"
#

it seems like its running like on all rows of telemetry_data, not the grouped results

lyric mountain
#

intellij REALLY helps reading those things

#

I believe it does run on the grouped results, since x.version doesnt exist otherwise

#

this is indeed a weird case, they shouldn't have such a big disparity

neon leaf
#

yeah im really confused

#

...

#

@lyric mountain

#

I ran ```sql
DROP INDEX IF EXISTS "telemetry_data_created_idx";
CREATE INDEX IF NOT EXISTS "telemetry_data_created_idx" ON "telemetry_data" USING brin ("created");

#

now its 100ms

lyric mountain
#

brin?

neon leaf
#

ye

#

it was btree before

lyric mountain
#

ah

#

btw, how often do these telemetries update?

neon leaf
#

well the panels send data every 24h, currently theres 1.2k active panels

lyric mountain
#

hm, asked cuz count() is fairly expensive, since it requires a full scan

neon leaf
#

yeah, these queries arent quite optimized currently, but anything under 300ms is fine for now

#

I dont know how im gonna be able to do historical data though (since panels shouldnt be counted twice and not if too old, etc)

#

for performance reasons prob a mat view

lyric mountain
#

if you only ever need last 2 days, then you can use triggers + secondary table for holding counts

neon leaf
#

well the date - 2 days is just when telemetry data is considered "out of date", I only ever need the latest value of a panel for a specific time

lyric mountain
#

like, you put in an AFTER INSERT trigger to increment a value on a count table - key being the date itself - and the next 2 dates as well

#

for example, if you insert an entry today, you'd increment the count for dates 31/03, 01/04 and 02/04

neon leaf
#

ah

lyric mountain
#

when you needed the total count you'd just retrieve the value for the current date

#

since it'd include the past 2 days + today

surreal sage
#

stop trolling

prime cliff
#

Update it now πŸ”« πŸ€–

deft wolf
#

Free 50$, no way

prime cliff
#

@zinc fable

zinc fable
#

ty

prime cliff
#

@zinc fable

zinc fable
#

oh dear

prime cliff
#

Derek playing scam bot tower defense LUL

zinc fable
#

fr πŸ’€

frosty gale
#

they are extremely underappreciated but so powerful

neon leaf
prime cliff
#

πŸ‘€ How's this

lyric mountain
#

you exceed the available storage which allows you to "seep" into the next memory section

#

so u can execute arbitrary code by invading your neighbor's area

snow ingot
#

How to get bot developer role ?

heavy rock
#

..

heavy rock
heavy rock
snow ingot
#

NyronBot

#

I can send you a link

heavy rock
#

Your bot was accepted to add top.gg ?

snow ingot
#

Yes

sharp saddle
#

someone saw this message?

#

sent on wrong channel lmao

robust vine
#

How can i get Bot Developer role too please?

sharp geyser
wheat mesa
sharp geyser
lament rock
#

How can I get Team role amandapleading

sharp geyser
#

Bribe veld with 200$

#

Just send the money to me and I will relay it

crimson vapor
robust vine
delicate zephyr
#

@crimson vapor weeb

crimson vapor
muted horizon
#

..

prime cliff
#

WOOO it works

shadow dirge
prime cliff
#

Magic πŸ™‚

stoic dock
#

do i need to use a third party for my webhook then?

shadow dirge
stoic dock
#

do you have any documentation or guides you recommend because the topgg ones have been driving me mental

pearl trail
mighty lotus
#

Hello y’all I wanna know why my bot doesn’t display any Images in top.gg πŸ€”πŸ€”

deft wolf
#

What images

mighty lotus
#

I meant profile

deft wolf
mighty lotus
#

Thank you

proud mist
#

Does discordjs have the forward message feature already? 😭

zealous fiber
#

Yes discord has the feature

#

Why asking

deft wolf
#

He's asking about discord.js library

proud mist
#

Yes I just saw ty tho

wheat mesa
#

Does anyone know how to use playwright to automate the browser? I'm trying to use it in tandem with an extension called Testim that also automates the browser, but I keep getting errors related to the extension. I'm wondering if there's a way to automate the browser exactly as if I had manually pressed the button without interfering with chrome's internals

shadow dirge
sharp geyser
#

Don't quite understand why on mobile the card inside the accordion goes beyond the screen's width

#

I am really stumped on this one

#

I am trying everything and nothing seems to fix the width

pearl trail
#

is that shadcn?

sharp geyser
#

Yep

pearl trail
#

how you do your flexes

#

or grid

sharp geyser
#

wym

sharp geyser
#

This is my main layout

pearl trail
sharp geyser
#

Oh

pearl trail
#

the Card one

sharp geyser
pearl trail
#

there we go

#

add flex-wrap

sharp geyser
#

to the main div of the card content?

pearl trail
#

to the div inside cardcontent where there are flex flex-row gap-8

sharp geyser
#

thank you

pearl trail
sharp geyser
#

I swear

#

this looks ugly as fuck still

#

😭

#

Oh wait

#

this is kind of cringe

#

eh nvm

pearl trail
#

wow, a love letter FlushedPeek

sharp geyser
#

Yea so im making a website for my gf for her birthday

#

and this looks ugly

pearl trail
#

ahhh, nah your gf must be proud having her bf making a site just for birthday

sharp geyser
#

I have a navbar so I might just move it into it, but idk

sharp geyser
#

she knows im making something using my programming skills

#

but beyond that she has no clue

pearl trail
#

:0 a surprise

sharp geyser
#

Yup!

#

Thought i'd do something personal and something I can easily do

#

or so I thought

#

I underestimated how much it'd take to make this look pretty

#

and idk what to do

pearl trail
#

πŸ˜„ good luck!!

sharp geyser
#

WYM GOOD LUCK

#

ANY ADVICE?

#

😭

pearl trail
#

lmfao, hmmmm

#

i've never made smth like that, used to want to, but i dont have idea

sharp geyser
pearl trail
#

πŸ˜” πŸ™

sharp geyser
#

@radiant burrow u are a design nerd any idea?

sharp geyser
#

I think this looks attrocious

radiant burrow
#

are you coding in normal html or react or something

sharp geyser
#

I am using react (specifically with nextjs but yea)

radiant burrow
#

ok cool

sharp geyser
#

and nah im talking in regards to the entire screenshot

#

Like hte accordion idk if i need, and the navigation thing just looks out of place

radiant burrow
#

a fun idea could be to add sticker/stamp elements that scatter the website, they can just be whatever but can help fill the space

sharp geyser
#

This is what it looks like without an accordion

radiant burrow
#

oh ok ok then you could keep that or do something like I said and use that template but allow for selection of different dates. imo that looks cool having each time value counting

sharp geyser
#

yuh! I wish it was in realtime, meaning the seconds and what not countup

#

but idk how to do that 😭

#

I will have to look it up

radiant burrow
#

make a time component that takes a date and updates once a second

sharp geyser
#

You'd cry if you saw how I currently do it

#

like you might burn me

#
    function parseDate(date: number) {
        let delta = Math.abs(date - Date.now()) / 1000;

        const years = Math.floor(delta / (365 * 24 * 60 * 60));
        delta -= years * 365 * 24 * 60 * 60;

        const months = Math.floor(delta / (30 * 24 * 60 * 60));
        delta -= months * 30 * 24 * 60 * 60;

        const days = Math.floor(delta / (24 * 60 * 60));
        delta -= days * 24 * 60 * 60;

        const hours = Math.floor(delta / (60 * 60));
        delta -= hours * 60 * 60;

        const minutes = Math.floor(delta / 60);
        delta -= minutes * 60;

        const seconds = Math.floor(delta);

        return { years, months, days, hours, minutes, seconds };
    }

    const talkingDate = parseDate(1741302147500)
    const datingDate = parseDate(1743201242286)
pearl trail
#

oh my oh my

sharp geyser
#

Yeaaaa

radiant burrow
sharp geyser
#

I have...4 days

#

her birthday

#

is in 4 days

sharp geyser
#

I haven't programmed in so long

#

its been 2 months at least

radiant burrow
#

i meannn... at least it works

#

i'm not even much better i'm sure my backend code is rough and i just don't know it

#
export default function Timestamp({className}: {className?: string}) {
    const [currentTime, setCurrentTime] = useState(new Date());

    useEffect(() => {
        const interval = setInterval(() => {
            setCurrentTime(new Date());
        }, 1000);

        return () => {
            clearInterval(interval);
        };
    }, []);

    function formatTime(time: Date): string {
        return time.toLocaleTimeString('en-US', {
            hour: 'numeric',
            minute: '2-digit',
            second: '2-digit',
        });
    }

    return <span className={className}>{formatTime(currentTime)}</span>;
}
#

here's a component i have that creates a timestamp for the current time, you can take the basic concept and adjust it to instead take in a date object and return the time since that date

sharp geyser
#

πŸ™

pearl trail
#

Mar 07 2025?

sharp geyser
#

6th

sharp geyser
#

but I got it!

#

Thanks for the nudge in the right direction :))

sharp geyser
#

cause I can't be arsed to make it better

#

if you guys are curious bout the code

vital mirage
#

You guys think i should add anything to this Join message?

lament rock
#

I'd actually recommend removing eveything and just not doing install messages. Too many permissions checks and complexity to determine an "appropriate" channel to send it to, plus the message isn't really useful knowledge to anyone imo. The person who added the bot probably already knows most or all of that info. If you still intend to do it, it should be meaningful

#

I think I worded that a bit more harshly than I meant it. I adopt a philosophy of trying to stay out of the way of people until they intend to use my bots because I personally find it annoying when bots act "on their own accord" so to speak

#

and most of the time when they do, I find what they're doing to be not meaningful

pearl trail
#

instead of sending that embed on join, in my opinion, better to send that embed when someone mentioned the bot. by that, the user actually dont know how to use it thus send the instruction embed.

small tangle
deft wolf
#

But won't that result in bot quarantine?

#

I personally would avoid anything related to DMs

#

Also it seems to me that there is no way to check who added the bot to the server except via Audit Logs but that's another permission + API request afaik

#

Oh, okay. You can do this with webhooks. I thought it only worked for account authorization, but this works for server authorization too

small tangle
#

At the end of the day, i think its fine to assume some general knowledge the user is expected to have

#

Just provide a help command, that should be recognized by users

sharp geyser
#

I know if a bot dms me randomly I immediately hate it

compact condor
#

Heyo, I wanted you guys to ask for feedback!

I just finally released my own async Discord Api Client in rust with a python wrapper for learning purposes at first but then continued until I was ready to push this on PyPI and Open-Sourced it. I tried my best to make the code understandable with comments but I think I overused them πŸ˜…
I would really appreciate any feedback and suggestion on this πŸ™

Current features:

  • Asynchronous Python interface using asyncio
  • High-performance Rust core for Discord API interactions
  • Support for Discord REST API and Gateway (WebSocket) connections
  • Resilient WebSocket connection
  • Event-based architecture for handling Discord events
  • Slash command support with command registration and interaction responses
  • Support for ephemeral responses, embeds, and deferred responses
  • Minimal memory footprint and CPU usage

/project/rustcord/ on PyPI
https://github.com/ghulq/rustcord/

-# I thought this would be the best way to get constructive feedback on my project since this server is for discord bots and I hope that I may ask for this here, if not tell me and I delete this. This is not a advertisement but for feedback and suggestions around my project.

sharp geyser
#

@radiant kraken sounds like ur territory

#

Rust and python nerd

compact condor
#

πŸ‘€

compact condor
small tangle
#

ws_sender: Arc<Mutex<futures::stream::SplitSink<tokio_tungstenite::WebSocketStream<tokio_tungstenite::MaybeTlsStream<tokio::net::TcpStream>>, WsMessage>>> simplest rust type

sharp geyser
small tangle
#

what even is a MaybeTlsStream<>?? like

sharp geyser
#

Arc<Mutex<SplitSink<WebsocketStream<MaybeTlsStream<TcpStream>>, WsMessage>>>

#

Looks cleaner

#

It may be a tls stream or it may not

#

I guess

radiant kraken
sharp geyser
#

null is the smartest rust user here

#

I highly recommend at least looking at their recommended changes iara_hehe

radiant kraken
sharp geyser
#

looks interesting

radiant kraken
#

best of luck!

sharp geyser
#

and I haven't seen someone mix python and rust before

compact condor
#

thx gonna need that xD
-# I'm going insane

radiant kraken
#

my rust project mixes rust with C and JavaScript

sharp geyser
#

ew

#

javascript

#

🀒

#

I hate using js

radiant kraken
#

javascript is nice sometimes

compact condor
sharp geyser
#

I get chatgpt to do it all for me

#

🧌

radiant kraken
#

ewwww

pearl trail
sharp geyser
compact condor
#

js is not too bad tbh

radiant kraken
#

i mean js is nice yea

#

not the best imo but still a nice lang to program in

sharp geyser
#

Once you've had a taste of a typed language

#

you can't go back

#

C# ftw

pearl trail
#

ts

radiant kraken
#

rust ftw

sharp geyser
#

ts puts a bandaid on the problem

wheat mesa
#

js is fucking horrendous for actual applications

sharp geyser
#

yea

wheat mesa
#

If you’re the only one writing it, sure, it’s fine

sharp geyser
#

its "allow anything" behaviour pisses me off

wheat mesa
#

But the second you have to work in a team you want to jump off of a tall building

sharp geyser
#

and leads to people implementing bad practices

#

which leads to problems when as waffle said gets into team usage

#

Using a language that enforces types and good practices is better imo

radiant kraken
#

i can see that

sharp geyser
#

Hard to do stupid shit if the language doesn't really allow it

#

even stupid things in C# run somewhat ok

radiant kraken
#

@compact condor wait is there a 2025 edition now?

sharp geyser
#

for rust?

radiant kraken
#

mhm

sharp geyser
#

Im sure

#

its 4 months in

radiant kraken
#

how do i get it

#

i've done rustup update

sharp geyser
#

it might be a preview version

compact condor
sharp geyser
#

latest stable is 1.86 released april 3rd it looks like

#

So today?

sharp geyser
#

as in the rustfmt edition?

radiant kraken
#

the one in Cargo.toml

sharp geyser
#

oh

#

honestly haven't used rust in ages

#

πŸ’€

radiant kraken
#

i haven't used rust in a year

sharp geyser
#

I am dumb boy now

radiant kraken
#

nuh uh!

#

you are a smart boi

sharp geyser
#

Nah

#

I bet I couldn't decipher any rust code

radiant kraken
#

@compact condor the latest valid rust edition is 2024

compact condor
radiant kraken
#

not 2025

#

rust editions are in 3 year intervals, 2018, 2021, 2024

pearl trail
#

ooo

compact condor
#

gonna need to change that then good to know what it means now

radiant kraken
#

i'll include it in my pull request

#

honestly i also need to update my rust projects to use the 2024 edition

#

they still use 2021

compact condor
#

also forgot to change the version in the Cargo.toml πŸ’€

radiant kraken
#

0.1.0?

compact condor
#

the version of rustcord is currently 0.1.2

sharp geyser
#

Imagine following the normal versioning conventions

#

just be like djs

#

release breaking changes so every release is a major release

radiant kraken
radiant kraken
compact condor
#

I also updated this on github

radiant kraken
#

@compact condor just wondering, can't this all be just one Arc?

sharp geyser
#

a lot of clone

radiant kraken
#

yeah, but i can see what they were going for since they are all Arc

compact condor
#

I had problems when I did just Arc so I did Mutex and then it worked smh

radiant kraken
#

yeah it happens

#

Arc<Mutex<>> is the ultimate duo

compact condor
#

true xD

radiant kraken
#

@compact condor is it required for every python ffi method to return a PyResult?

sharp geyser
#

How can I make the carousel take up the full height

#

cause I cant seem to get it

#

I've tried setting the height in numerous places and it doesn't do anything

delicate zephyr
#

or you can do h-[100vh]

sharp geyser
#

Well I know this

#

but the problem is no matter where I set it

#

it doesn't actually do anything

delicate zephyr
#

what component library are you using it from

sharp geyser
#

shadcn

delicate zephyr
#

cc @coral trellis :^)

#

maybe you know

radiant kraken
delicate zephyr
#

whilst I look at the docs

delicate zephyr
sharp geyser
#

and nextjs for the actual web portion

#

I also use tailwind obv for css utilities

delicate zephyr
#

huh

#

where are you importing Carousel from?

#

(yes it matters)

sharp geyser
#

import {Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious} from "@/components/ui/carousel";

#

The path it adds it to when I run the pnpm command

delicate zephyr
#

yea okay

#

hmmm

sharp geyser
#

Then what is your question

#

oh nvm

delicate zephyr
#

yea sorry misstyped

sharp geyser
#

I also hate how no matter what I do, its not responsive val_Sadge

delicate zephyr
#

I know why I think

#

its the div

#

remove the md: temporarily

#

i think it's literally just the div you're containing it in

sharp geyser
#

I dont think the md has anything to do with it

pearl trail
#

try set height here, try one by one, or all

#

not the carousel wrapper

sharp geyser
#

no dice

delicate zephyr
#

it's supposed to be on the Carousel component

#

Aaron

sharp geyser
delicate zephyr
#

for sanity sake can you try just putting it outside of the <div> container you put it in for now

#

and try changing the height on the Carousel component then?

coral trellis
#

Actually shouldnt really make a difference

sharp geyser
delicate zephyr
#

I think it might be the div

sharp geyser
#

Thisi s what happens when I do what you say luke

delicate zephyr
#

honestly

#

oh

#

weird

sharp geyser
#

The carousel gets bigger

delicate zephyr
#

can you check it's not the parents height

sharp geyser
#

but the content inside doesnt

#

Same thing happens

delicate zephyr
#

huh

#

weird

sharp geyser
#

even when its in a div and I set the height directly on the carousel

delicate zephyr
#

wait the carousel is bigger

#

but the card isnt?

sharp geyser
#

So the div isn't the problem

sharp geyser
#

even setting the height on the card doesn't do anything tho

delicate zephyr
#

try setting h-full on the iframe?

sharp geyser
#

It already is

coral trellis
#

Go into the CarouselContent component and change the className to this

 className="overflow-hidden h-full w-full"
sharp geyser
#

it has w-full and h-full

delicate zephyr
#

ah okay

delicate zephyr
#

spent too much time dealing with shad the last couple days huh :^)

coral trellis
#

I mean lets see if it actually fixes it

#

:^)

sharp geyser
#

Like this? cause if so this is the result

#

Also in more context, its now slightly less bigger than the cards above it

#

so it messes with my ocd

coral trellis
#

CNTRL + CLICK CarouselContent component

#

And it'll jump to the component under /ui/carousel

sharp geyser
#

OH

#

in the component itself

coral trellis
#

And you want to change it here

#

I am assuming

sharp geyser
#

nothing

delicate zephyr
#

weird

sharp geyser
#

still not conforming to the height of the div

delicate zephyr
#

wait

#

try getting rid of overflow hidden?

#

tho that may also not fix it

sharp geyser
#

that just makes it so every item shows

delicate zephyr
#

true

pearl trail
#

how about you try h-full on the carousel

delicate zephyr
#

ignore me

sharp geyser
delicate zephyr
pearl trail
#

i only use nextui so might not big help

pearl trail
#

not the carousel

delicate zephyr
#

he has

sharp geyser
#

even on the carousel

#

it doesnt do anything

pearl trail
#

oh wait, i saw the old code

sharp geyser
#

it makes it bigger

#

but the card inside doesn't adhear to the new height

#

and remains the same

delicate zephyr
#

bizarre

pearl trail
sharp geyser
#

as you can see

#

The inner content doesn't change tho

pearl trail
#

can you push your changes 😎

sharp geyser
#

This isn't on github

pearl trail
#

ah different proj

sharp geyser
#

yea

coral trellis
#

@sharp geyser Would you mind sending the code in dms or here, and I will slap it in and see if I can figure it out

sharp geyser
#

its the web for my gf

coral trellis
#

Just what you have with the carousel

delicate zephyr
#

if you push this to topstats dev build xig i might die from laughter

coral trellis
#

nah i wont lol

delicate zephyr
#

we should do a carousel of bot pages kekW

sharp geyser
#
import {Button} from "@/components/ui/button";
import Link from "next/link";
import {Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious} from "@/components/ui/carousel";
import {Card, CardContent} from "@/components/ui/card";

export default function Main() {
    const videos: Array<string> = ["https://www.youtube.com/embed/rn1ph-gmoLA?si=LnxkVqZ7LTiv_4rh", "https://www.youtube.com/embed/evJ6gX1lp2o?si=8IZ4tZcqQcA_B0zg"];
    return (
        <>
            <div className="h-full w-full flex flex-col items-center space-y-4">
                <div className={"space-y-4 md:w-3/4 h-full"}>
                    <Carousel className={"h-full"}>
                        <CarouselContent>
                            {videos.map((url, index) => (
                                <CarouselItem key={index}>
                                    <Card>
                                        <CardContent>
                                            <iframe
                                                            className={"w-full h-full"}
                                                    src={url}
                                                    title="YouTube video player" frameBorder="0"
                                                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
                                                    referrerPolicy="strict-origin-when-cross-origin" allowFullScreen></iframe>
                                        </CardContent>
                                    </Card>
                                </CarouselItem>
                            ))}
                        </CarouselContent>
                        <div className={"md:block hidden"}>
                            <CarouselPrevious/>
                            <CarouselNext/>
                        </div>
                    </Carousel>
                </div>
            </div>
        </>
    );
}
delicate zephyr
#

space-y-4

#

πŸ‘€

#

surely thats not causing it

sharp geyser
#

I wouldn't imagine so

delicate zephyr
#

try

#

cant hurt

sharp geyser
#

it doesn't mess with the height

#

just did nothing

delicate zephyr
#

πŸ‘Œ

sharp geyser
#

it only adds space between elements

#

:p

delicate zephyr
#

yea fair

sharp geyser
#

Also fuck discord formatting

#

why does it look so ugly when copy pasting

#

Should of put it in a pastes instead but oh well

pearl trail
#

set the iframe to static height

#

h-96 for example

coral trellis
#

Yeah its likely the iframe needing a static height

sharp geyser
#

oh my fucking god

#

WHY CANT IT JUST TAKE UP THE FULL SPACE

delicate zephyr
#

btw

#

if you need a static height you can always make it programatically grab the parents height and use that

#

it's jank but it works

pearl trail
#

it's actually

delicate zephyr
#

also dont use iframes kekW

sharp geyser
#

I have no other choice

#

its a yt video

#

Gotta use iframe

pearl trail
#

something is blocking the h-full

delicate zephyr
#

I mean, download it, and host it locally on the page with a custom video player

#

:^)

#

thats a joke

sharp geyser
# pearl trail

maybe instead of overflow-hidden I do overflow-x-hidden

delicate zephyr
sharp geyser
#

nope

#

πŸ’€

pearl trail
#

that element is not in the elements in your code

sharp geyser
#

cuz its from a component

#

that overflow-hidden is from the CarouselContent component

pearl trail
#

oh yeah, if you've tried adding h-full in that, then it's your parent problem

#

your element does not know what to fill the 100%

sharp geyser
#

then how do I tell it

#

because i've added h-full to every fuckin thing

#

and still no dice

pearl trail
#

put a static height on the top parent

#

this works for me

sharp geyser
#

doesn't work for me

pearl trail
#

you sure added this right

sharp geyser
#

huh

#

wym

#

what is that a screenshot of

pearl trail
#

put h-full in the CarouselContent class name inside your /components/ui/carousel file

sharp geyser
#

alright well there we go

#

I am so fucking confused

#

I did this already

#

and it didnt work

#

Apparently this works flawlessly now

#

and I added h-full to CarouselContent like last time

#

I dont need a static height on the parent apparently

pearl trail
#

somewhere on top of that must've

sharp geyser
#

Well thanks guys

#

I think I really pulled this together

#

page looks much better

#

πŸ™

radiant kraken
sharp geyser
#

Should I have everything centered or like this

#

I kind of like it like this

#

but im not sure 😭

radiant kraken
#

i'd rather want you to have margins on both sides of the page

sharp geyser
#

Okay well there is

#

sorry thats not the full page

#

the stuff itself is centered

#

I was mainly talking about like the text and buttons

#

I think if EVERYTHING is centered it looks weird

radiant kraken
#

yeah i can see that

sharp geyser
#

proper image

#

I am so tempted to show this to my gf now

#

but I HAVE to wait

radiant kraken
#

aaron, how about this?

sharp geyser
#

How the fuck did you do that

#

πŸ’€

radiant kraken
sharp geyser
#

Either way

#

yea that would work

#

on desktop anyway

#

On mobile it'd still be col

radiant kraken
#

@compact condor what is gateway.rs.bak for?

sharp geyser
#

wtf

#

Why is it so bad

sharp geyser
radiant kraken
sharp geyser
#

huh

#

W mspaint ig

zinc fable
sharp geyser
#

Yes

radiant kraken
#

yes

#

he made it for his gf

sharp geyser
#

All me

radiant kraken
#

from scratch

#

very cute

sharp geyser
#

Wait until you guys see the love letter

#

I swear ima get so beet red

#

πŸ’€

zinc fable
#

its v nice

radiant kraken
#

wait you are leaking it πŸ’€

sharp geyser
#

I mean

#

Its going to be out there for anyone who can find it

compact condor
radiant kraken
#

yippeee

sharp geyser
#

There we go

#

Looks so much better

radiant kraken
#

YEAAAAHHHH

sharp geyser
#

ty for the recommendation

radiant kraken
#

now we're talking

#

why not put navigations in the navbar?

sharp geyser
#

I am

#

Just needed something quick

#

I had no navbar at the time

radiant kraken
#

oh alrighty

sharp geyser
#

πŸ’€

#

The navbar is so overengineered when it won't be seen in most of the pages

#

It has an animation effect

#

that only works on 1 page so far

radiant kraken
#

oooo can i see

compact condor
sharp geyser
#

its just that

radiant kraken
#

uhm you don't have to hahahaha

sharp geyser
#

but the actual home page has a cool rain effect

#

that rains down hearts

radiant kraken
#

cuuteeee

sharp geyser
radiant kraken
sharp geyser
#

I made use of a npm package meant to add a snowflake effect

#

but it allows custom images

#

soooo

radiant kraken
#

big dedication

#

i like

#

so u plan on revealing this to her in her bday?

sharp geyser
#

Yup!

radiant kraken
#

slay!

sharp geyser
#

I plan on making a discord bot for it as well

#

since I plan on adding a gallary section

#

it will allow for easy uploading of images

#

:p

#

probably wont be until after her bday but ima try

#

Since I have to incorporate cloudflare r2 into this

radiant kraken
#

fancyyyyy

sharp geyser
#

I saw waffle typing

#

I wonder what he was going to say

#

I rounded the iframe as well

#

sharp corners was ugly

pearl trail
#

based

sharp geyser
#

navbar update

wheat mesa
sharp geyser
#

Guys crazy idea

#

do I make this an actual lock & key situation

#

where she has to put the key into the lock

sharp geyser
#

But when and if it happens for sure you will get one

wheat mesa
#

Make her mine a Bitcoin block to find the hash that unlocks the page

sharp geyser
#

😭

#

You can have access to this page in 10000 years

sharp geyser
wheat mesa
#

make her brute force a sha256 hash

sharp geyser
#

WAFFLE

#

SHE ISN'T A PROGRAMMER

#

😭

wheat mesa
#

By hand

sharp geyser
#

WTF WAFFLE

#

I WANT TO LOVE HER NOT TORTURE HER

#

😭

wheat mesa
#

Start with all zeroes and work your way up

#

Simple enough

sharp geyser
#

waffle...

#

how did you get your wife

#

dont tell me

#

you made her brute force a sha256 hash by hand

wheat mesa
#

I waited 6 years in the friendzone and then got saved by covid texting since I was awkward irl

sharp geyser
#

LMAO

#

felt that

#

Honestly you two seem perfect together

#

im happy for ya

wheat mesa
#

I missed my chance when I was in 5th grade when she gave me a flower for Valentine’s Day

#

Couldn’t get the hint

sharp geyser
#

oh you dunce

#

she hit on you

wheat mesa
#

But it’s okay because 5th graders shouldn’t be dating anyways

sharp geyser
#

and you missed it

#

I mean fair enough

#

but still

#

luckily she didn't give up then

#

πŸ™

wheat mesa
#

I asked her out in 8th grade and got hard friendzoned

sharp geyser
#

Also, I think my wedding invite got lost in the mail

#

soooo

wheat mesa
#

Then she asked me out in 10th grade and that’s when we started dating 😎

#

Don’t worry I don’t even have a wedding invite for myself yet

sharp geyser
#

yo big

#

Did you guys not get married?!?

#

Im confusion

wheat mesa
#

We got married

#

No wedding

sharp geyser
#

Ah

wheat mesa
#

Courthouse thing, small event

sharp geyser
#

Court house steps?

#

gotcha

wheat mesa
#

10 closest family members since we were only allowed 10 people

sharp geyser
#

Still where was my invite smh

#

We've known each other since 2020 or 2021

wheat mesa
#

But lowkey getting a courthouse wedding is so much better than stressing over wedding plans for 2 years then spending $50,000 for a day

sharp geyser
#

Started out as the 3 amigos

#

Pancake, Waffle, Misty

wheat mesa
#

Very true

sharp geyser
#

Wonder what happened to pancake

wheat mesa
#

Idk, he bought me a domain for a year

sharp geyser
#

lmao

#

Still got it?

wheat mesa
#

Nah, but I just recently got a domain for free that’s very similar to the old one

sharp geyser
#

Oh cool

wheat mesa
#

Got waffledev.me instead of waffledev.tech

sharp geyser
#

I used my github education pack to get 200 credits at do

#

not ovh

sharp geyser
#

change my mind (ps you cant)

wheat mesa
#

True

sharp geyser
#

What the fuck is this supposed to mean react

pearl trail
#

you use client components on server component

sharp geyser
#

Oh

#

is that what that means

#

Gotcha

#

thanks

pearl trail
#

your welcome

sharp geyser
#

I wont be doing any SSR in that page

#

so I can just make it and its components use "use client"

pearl trail
#

yeah, use β€œuse client”

#

yep

sharp geyser
#

Thanks

#

I am really hoping my idea works

#

it'd be legit if it did

#

😭

#

I dont know if I can make it with my skills tho

pearl trail
#

actually, you dont need to put that on every component. if the page that renders the component is already client, then everything in it is client, so you dont need explicitly add use client

radiant kraken
sharp geyser
#

yes

radiant kraken
#

i see i see

pearl trail
sharp geyser
#

Thanks

#

ima need it

#

cause I have no fucking clue what im doing

pearl trail
sharp geyser
#

All this

#

for some effect

#

its worth it but my god am I in pain

#

My idea is to have a key thats draggable, can be put into a lock, turned, and then it unlocks the rest of the site

pearl trail
#

o wow, that’s quite tricky

sharp geyser
#

Yuh

queen needle
sharp geyser
#

I am trying right now

#

and my god is it kicking my ass

#

I have no fucking clue what im doing

#

Terrible artwork, but im using a mouse and keyboard

#

Essentially my idea is chains on 4 corners, lock in middle, key draggable, key goes into lock, key turns, lock unlocks, falls, and then the chains fall

#

Rather ambitious if I may say

#

and I have 3 days to do it (and I still have other shit to do)

radiant kraken
queen needle
#

Good luck πŸ’€πŸ’€

sharp geyser
#

@solemn latch

lyric mountain
sharp geyser
#

RIGHT

#

@civic scroll come make it for me πŸ˜‰

civic scroll
sharp geyser
#

😭

#

with ur skills