#🪅-progaming

1 messages · Page 25 of 1

supple whale
#

aka go down the list if there's no break

royal nymph
#

go switch makes fallthrough explicit

supple whale
#

a LOT of fancy algos do that

fleet cedar
#

Switch statements are slight syntax sugar for goto

royal nymph
#

i.e. instead of writing break you write fallthrough when you do want to fallthrough

fleet cedar
#

Completely worthless in modern coding

royal nymph
#
switch foo {
  case 1:
    print("1")
  case 2:
    print("2")
    fallthrough
  case 3:
    print("2 or 3")
}
#

this is go switch

dusty moth
#

my language has switch as a slightly different alias for match

supple whale
#

so

fleet cedar
#

How does that work

supple whale
#

what ya'll meant to say

#

is switch statements suck

#

but insert unorthodox switch implementation here is good

#

aka that assigment sucks for normal switch

dusty moth
supple whale
#

becaue people like you is why UE5 exists

dusty moth
#

unrelatedly, got an error

supple whale
#

"yeah we dont need it, just use something slower thats simpler, throw more compute at it, it will fix itself"

fleet cedar
#

You're forgetting that match is infinitely more powerful than switch can ever dream to be

supple whale
#

brotha

#

they are different things

fleet cedar
#

Since it's pattern matching, not just constants

supple whale
#

they act similarly

#

but they are different things

dusty moth
supple whale
#

with different purpoe

#

as you said, switch is just goto

#

match isnt just goto

#

there's extra shit there

fleet cedar
#

There are zero uses for switch that are not better handled by structured control flow

#

Other than legacy languages

supple whale
#

i'm not saying they are common

#

but switch has its place

#

and while I agree that match is often a better option for what programmers need

#

saying "match is better than switch" is like saying "just use salt its better than pepper"

#

no, they are different things

#

and i also fucking hate switch and always use some form of match

fleet cedar
#

You can write the exact same control flow graph in better ways

supple whale
#

switch is amazing for math, such as exponent functons etc

fleet cedar
#

??

supple whale
#

ex:

let expo = 0
swtich (order)
  case 9:
    expo += 1
  case 8:
    expo += 2
  case 7:
    expo += 7
  case 6:
    expo += 42
  
return expo
#

fallover has its uses

#

they are rare but they exist

#

i've also seen it a lot in networking hardware, because its simply fast for weridge non-standard shit

supple whale
#

its minor, but this is the shit that matters when you're transferring terabytes of data per second

fleet cedar
#

I would have to compare the generated asm before I could say anything about that

supple whale
#

fair

#

for match you'd need to put all the prev expressions in the next call, which means bigger jumps, which means slower

fleet cedar
#

I'd try with something like ```
if order >= 9 { expo += 1 }
if order >= 8 { expo += 2 }

#

Any decent compiler should optimize that to the same

supple whale
#

in a simple single operation case yeah

#

which is whyi

fleet cedar
#

The body of the cases is irrelevant here

#

But I do admit that I typically work in fields where code quality is more important than squeezing cpu cycles

dusty moth
#

speaking of matches, how should I codegen them

#

should I convert rs match foo { Some(Some(a)) => 2 Some(None) => 1 None => 0 }tors if Some(_1) = foo { if Some(a) = _1 { 2 } else if None = _ { 1 } } else if None = _ { 0 } or would something else make more sense

fleet cedar
#

If the patterns are disjoint, probably a jump table

dusty moth
#

ah, that makes sense ig

long sparrow
#

oh

dusty moth
#

and unflatten the matches?

fleet cedar
#

What do you mean

long sparrow
#

i was about to submit a cool vencord plugin idea, are general plugin requests not allowed?

dusty moth
# fleet cedar What do you mean

like rs match _1 { Some(Some(_2)) => _3 Some(None) => _4 None => _5 }tors match _1 { Some(_a) => match _a { Some(_2) => _3 None => _4 } None => _5 }until I add niches

fleet cedar
#

Yeah sounds like a decent approach

#

Or patterns would complicate slightly maybe, but they're probably just a goto

long sparrow
#

maybe the wrong place to ask... sorry

dusty moth
#
let r = match foo {
  1 | 2 => bar
  _ => baz
}``````rs
jump_table!(foo) {
  1 => 'a
  2 => 'a
  _ => 'b
}
'a:
goto 'c(bar)
'b:
goto 'c(baz)
'c(r):
/* ... */```
dusty moth
#

oh no what did I fuck up this time

fleet cedar
#

Tree sitter?

dusty moth
fleet cedar
#

Yeah I'm procrastinating mine too

#

I need to add parsing and serializing so I can compile my decompiled scripts back, but I'm stuck on figuring out exactly which subexpression each line number instruction belongs to :/

dusty moth
#

insane

dusty moth
#

did i never actually test multi-digit numbers properly

fleet cedar
#

Eh, who uses those anyway

dusty moth
#

nvm they're getting bound as identifiers somehow

dusty moth
#

what the fuck

fleet cedar
#

\w does match digits, so maybe that's somehow

dusty moth
fleet cedar
#

Why do you have emojis as syntactic constructs in your language

analog sail
#

Any Unicode works

dusty moth
#

except for operators

analog sail
#

make quotes allow operators

dusty moth
dusty moth
analog sail
#

like "[operator]" is valid

#

and it stores without the quotes

dusty moth
#

that's already valid?

#

that's a regular string

analog sail
#

allow overriding operators

dusty moth
#

you can

#

just ```rs
fn (a: Foo) + (b: Bar) {

}```

analog sail
#

I want + = -

#

things like that

#

for = +

dusty moth
analog sail
#

DO IT

#

= = ==
== = =

dusty moth
#
fn self + other {

}```compiles to a metatable
#

you can do something similar with metaprogramming

analog sail
#
temp = ==
== = =
= = ==
analog sail
dusty moth
# analog sail allow that to happen
use swap_eq;``````rs
schema swap_eq {
  fn preprocess(ast: SourceFile) -> SourceFile || Error {
    ast.map_exprs(fn match {
      .Assign(l, r) => Expression.Equal(l.cast(Expression), r)
      .Equal(a, b) => Expression.Assign(a.try_cast(Pattern), b)
    })
  }
}```
valid jetty
#

"the = has no = behind it so it must be a declaration"

analog sail
dusty moth
dusty moth
#

@nimble bone @nimble bone what sso do you use

dusty moth
dusty moth
dense sand
#

hi, im here once again with react problem lol, i have a component, but this useeffect in the component gets run twice, i suppose this is again the same problem with the strict mode, but im not entirely sure when the problem could be in dev

autumn sigil
#

have you considered not using react

dense sand
#

the project is due tommorow >:3

autumn sigil
#

just enough time to rewrite everything

dusty moth
#

including where setSupabase is called

dense sand
#

supabase is not a usestate

dusty moth
dense sand
#

call to createBrowserClient(...)

dusty moth
dense sand
#
export function EndMenu({ score, allChick }: EndMenuProps) {
  const router = useRouter();
  const supabase = createClient();

  useEffect(() => {
    async function updateScore() {
      console.log('[CDS] Updating score...');
      
      const user = await supabase.auth.getUser();

      if (user.data.user) {
        console.log('[CDS] User found:', user.data.user.id);
        
        const resp = await supabase.from('leadeboard').insert({
          "score": score,
          "user_id": user.data.user?.id,
        });

        if (resp.error) {
          console.error(resp.error);
        }
      }
    }
    updateScore();
  }, [supabase]);

  return (
    <div>...</div>
  );
}

heres the whole thing(stripped of stuff you dont need i suppose)

#

createClient(); calls createBrowserClient with few extra params

dusty moth
#

hint: put a log inside createClient

dense sand
#

mm i suppose wrapping it in usestate and remove the supabase dependency would fix the issue, but its not entirely correct, is it

spark tiger
#

Is anyone familiar with how chrome devtools' overriding content works? trying to make a change to some site's js file but pressing override content doesn't seem to do anything on the site

dense sand
#

the thing is, even if i leave it as [] and put createClient into useeffect block, it gets ran twice

dusty moth
fleet cedar
#

useEffect is run twice in debug mode, yes

#

To ensure that there are no side effects

void leaf
#

why did i just get a notification from here

dusty moth
void leaf
dusty moth
#

i thought effects were explicitly not run twice

fleet cedar
dense sand
lost pawn
#

Does anyone know why discord's useSpring makes some modals open in slowmo?

spark tiger
#

just trying to create a simple patch that should simply turn false in one function to true

lapis dove
#

not really programming just some fun xd

jade stone
#

i love when im trying to poke at a website and it does this to __REACT_DEVTOOLS_GLOBAL_HOOK__

nimble bone
#

husk

#

why

jade stone
#

i already made an extension to bypass it

#

(cant use userscript)

past moon
#

hi everybody, i got a vencord plugin idea but idk if it's even possible so please tell me. Since the last attachment size limit change i'm constantly bothered by a popup asking me to get nitro if the file is >10MB, but would it be possible to make a plugin that tries to compress files over 10MB down to <10MB ? Since that's what I end up doing with third party tools I feel like there could be something to do here but i don't know enough about vencord and how it works to tell if it's even a good idea

autumn sigil
#

zig server so based

shy mauve
#

I have tried ai code for small projects before, it's good if you rlly specify what you need

frosty obsidian
#

i deleted any ai generated content

balmy lintel
#

you should enforce in this server

#

(even though its not really a problem here)

frosty obsidian
#

vee said no

ornate quiver
#

whY

frosty obsidian
#

vee doesn't really want to restrict what people post

#

unless it's hate speech

ornate quiver
#

fair

winged mantle
#

i hate vee

nimble bone
#

wing hates ai

lost pawn
#

like

#

"there are ppl here dedicating hours to this lang, and then there is you, the guy who thinks mr. ai will land you a job"

#

or I could be completely off

#

prob the latter one

#

cuz in the end, both humans and ai can write shit code, it's just that ai is more likely ig

valid jetty
#
int main() {
    for (int i=10; i-->0;)
        cout<<2*i+-+-+-+-1<<endl;
    return 0;
}
#

quality

#

(i wrote this a while ago and found it lol)

#

i think you could go as bad as ```cpp
main() {
for (int i=10; i-->0;)
cout<<2*i+-+-+-+-1<<endl;
}

#

at this point this isn't even cpp anymore

dusty moth
#

with -Wno-all

dense sand
#

Can i somehow get discord cdn shit in my app? It seems to have cors

#

Id like to just have gif in my app which is on discord cdn

valid jetty
#

no

#

discord cdn links have expiry arguments

#

they expire after 24 hours if no client fetches them

dense sand
valid jetty
#

not from discord

#

if you want a gif that’s always fetchable upload it to imgur or something

jade stone
#

is there a guide / docs on discords gateway format

#

its just all binary

royal nymph
#

enable gateway log in discord developer settings (enable experiment plugin)

#

and it will log every message

frosty obsidian
#

compressed

#

do what vee said

ornate quiver
dim cave
#

why cant i resize an image in css

  .socialmediaicon{
   width: 32px;
  }
``` doesnt work
jade stone
dim cave
#

there issntt

#

but

#

i added display: inline-block; to it

#

and um

jade stone
#

use devtools

#

so good for css

dim cave
#

devtools?

jade stone
#

yes 😭

#

ctrl + shift + i

#

it will tell you things like this

#

(not saying thats your issue here)

dim cave
#

oh shit wait

#

im adding the class to the LINK not the image

#

im fucking stupid

median root
#

ok incredibly random question but are there any other packages that improve commonly used terminal commands

#

like zoxide for cd?

fleet cedar
#

Eza, rg, bat

pseudo sierra
#

atuin

#

dust for du

valid jetty
#

its slightly convoluted

#

but its cute

#

i think

#

it basically implements a builtin method called __fmt__ on all structs created in elle which produces this nice output

#

and then functions can choose to have structs diminish into a string via the @structfmt attribute

#

and if you want no fmt function on your struct for whatever reason you put the nofmt attribute on your struct

#

HOLY SHIT LMAO

#

IT WORKS WITH THINGS NOT CREATED IN ELLE

royal nymph
#

valibot is so nice

autumn sigil
#

valibot very good

dusty moth
#

also you should make it a regex environ

#

so you can set it to /v(e+\s*😭?)?\s*/i

ionic lake
#

i just let neon-env handle it

royal nymph
#

i just use valibot to parse process.env with with schema

pearl stagBOT
# royal nymph https://codeberg.org/vee/bot/src/branch/main/src/env.ts#L10-L55

env.ts: Lines 10-55

const configSchema = object({
    PREFIXES: pipe(
        string(),
        transform(s => s.split(/ +/).filter(Boolean)),
        array(string()),
        minLength(1)
    ),
    DISCORD_TOKEN: string(),
    DATABASE_URL: string(),

    NODE_ENV: optional(picklist(["development", "production"])),

    GUILD_ID: string(),

    COMMUNITY_CATEGORY_CHANNEL_ID: string(),
    COMMUNITY_POST_PASS_ROLE_ID: string(),

    DEV_CHANNEL_ID: string(),
    SUPPORT_CHANNEL_ID: string(),
    BOT_CHANNEL_ID: string(),

    MOD_PERMS_ROLE_ID: string(),
    MOD_ROLE_ID: string(),
    MOD_LOG_CHANNEL_ID: string(),

    MOD_MAIL_CHANNEL_ID: string(),
    MOD_MAIL_LOG_CHANNEL_ID: string(),
    MOD_MAIL_BAN_ROLE_ID: string(),

    HTTP_SERVER_LISTEN_PORT: pipe(
        string(),
        transform(Number),
        number()
    ),
    HTTP_DOMAIN: string(),

    GITHUB_PAT: string(),
    GITHUB_CLIENT_ID: string(),
    GITHUB_CLIENT_SECRET: string(),

    CONTRIBUTOR_ROLE_ID: string(),

    NINA_CHAT_TOKEN: optional(string()),
});

const parsed = mustParse("Invalid environment variables", configSchema, process.env);
jade stone
#

i am going insane

autumn sigil
#

no youre just dumb

jade stone
autumn sigil
#

pull prop acces into variable so ts knows its number

jade stone
#

can tsserver not infer if its not in a var

autumn sigil
#

no, it doesnt know e is the same

#

i mean it does i guess, idk how to explain it

#

but no it just doesnt work like that

jade stone
#

i think i will just as any

autumn sigil
jade stone
#

uhh

#

one moment

#

yea

#

it is

autumn sigil
#

why not push(...Object.values(enum).filter(isnum))

jade stone
#

idk

#

wrote this code a while ago

#

just coming back to it

autumn sigil
jade stone
#

prob if the function asserts that the input is a number

autumn sigil
#

too much zig lately

jade stone
autumn sigil
#

scratchhead no not really

#

i sleep bye

dusty moth
#

if it constrains the input's type

#

T[].filter(fn: (x: T) => x is U): U[] (simplified)

ornate quiver
#

does anyone remember when a guild becomes "large" (requiring an op 13 event to be sent to receive future events)?
was it 50 or 300 members or something

frosty obsidian
#

i thought it was 100

#

but the api will tell you if a guild is considered large

#

you shouldn't need to calculate that

dusty moth
ornate quiver
valid jetty
#

who wouldve guessed that this code causes SO MANY ISSUES

global pub;

struct Node<T> {
    void *next;
    T data;
};

struct LinkedList<T> {
    Node<T> *head;
};

fn LinkedList::new<T>() -> LinkedList<T> {
    return LinkedList { head = nil };
}

fn LinkedList::add<T>(LinkedList<T> *self, T data) {
    Node<T> *new = malloc(#size(Node<T>));
    *new = malloc(#size(Node<T>));

    if !new {
        return;
    }

    new.data = data;
    new.next = self.head;
    self.head = new;
}
#

basically because Node is also generic it needs to also generate monomorphic definitions for that when making them for LinkedList

#

which it was doing on the parser level for structs that define it directly (some struct that defines a field like Node<i32> instead of Node<T>)

#

but in the compiler it was only doing the root struct, which is weird because???????? it was working before

#

i have been experiencing the worst form of torture a human can experience

deep mulch
#

my professor uses var for constants interchangeably and uses single quotes in js 😭

#

@royal nymph

valid jetty
#

imo single quotes arnet bad as long as youre consistent with it

deep mulch
#

@valid jetty

valid jetty
#

the other stuff should be banned though

#

doesnt it literally tell you "var is a deprecated keyword and breaks scoping rules. use let and const instead"

#

unless your profsssor uses a super old editor

deep mulch
valid jetty
#

it should tell you iirc

deep mulch
#

idk it doesn't tell me either

valid jetty
#

horror

deep mulch
#

maybe I need some extension

valid jetty
#

it should just be part of eslint

royal nymph
#

singlequotes in js is sadly very common

#

people are insane

valid jetty
#

no i like them

#

they look more demure than double quotes

deep mulch
#

I only use single quotes if it's the language convention

fleet cedar
#

I like double for string and single for stringly-typed enum

deep mulch
#

do I need to install eslint globally to use with vscode @valid jetty

crimson sparrow
#

Literally did a replace all on a multi thousand line project recently from double to single…

royal nymph
#

but I prefer double quotes because in other languages, single quotes stand for chars

#

double quotes = strings
single quotes = chars

deep mulch
#

yop

royal nymph
#

and imo double quotes look better

deep mulch
#

kotler does that

#

yop

royal nymph
#

makes it easier to run from the terminal

deep mulch
#

I can't get vscode to use it

#

help

valid jetty
#

v3 is written entirely with single quotes

#

i am not joking

deep mulch
#

you should delete the entire project

#

when no one's looking

valid jetty
deep mulch
spark tiger
#

though i’m honestly still not sure what so good about astro is

royal nymph
#

super nice DX

valid jetty
dusty moth
#

my fucking rust code segfaulted

spark tiger
# royal nymph it's amazing

I actually never heard about it before browsing the source of vencord.dev, but it seems to be getting more popular
and I generally just can’t tell what the difference is between all the big js frameworks, like they all… look the same to me. how would i even choose one if i were to do some web dev

valid jetty
dusty moth
valid jetty
#

..?

#

unsafe block

#

??

dusty moth
#

none

valid jetty
#

bad wrapper somewhere then

dusty moth
#

lemme grab code

#

can only paste once every 10 minutes

deep mulch
#
  • before the name
#

is this like C pointer or something else

valid jetty
#

yes

#
  • before the name because Array::new returns a pointer to Array<T>
#

technically pointer formats should be like

fn __ptr__::__fmt__<T>(T *self, i32 nesting) {
  return string::format("<{} at {}>", *self.__fmt__(nesting), self);
}

but theyre more like

fn __ptr__::__fmt__(i64 self, i32 nesting) {
    return string::as_string_wrapped(self);
}

atm

#

need to fix soon

frosty obsidian
#

astro is really good for more static sites, although it does allow for more dynamic stuff

#

its also really good for documentation

#

starlight has been the best experience I've had making documentation

valid jetty
#

HOLY SHIT YES

#

finally

deep mulch
#

I doubt you'll change it but if I could it would be before the type

#

*Array<i32>

valid jetty
#

idk

#

probably too late to change it now

deep mulch
#

wyd @valid jetty

valid jetty
#

being able to visualize arrays again after all this time

#

is so nice

deep mulch
valid jetty
dusty moth
#

where you only actually give the innermost type

valid jetty
#

not really

#

the main reasons you get a pointer instead of a struct directly are:

  • to move it around youre only passing 8 bytes not 16 (size = 4, cap = 4, ptr = 8)
  • methods can edit the array in place (otherwise youd have to do Array<T> arr = arr.push(1) constantly)
    TECHNICALLY elle automatically takes a pointer to the array when calling a method that requires self by reference instead of by value, however in cases such as you passing the array to another function by value, the argument will not have an address that you as the developer have access to, so you cannot call any of those methods that take a reference unless you create a new stack variable and set the array to it and then take the address of that instead
#

this totally isnt gonna be confusing for anyone righttttt

deep mulch
#

Rosie so smart

valid jetty
#

React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED part 2

royal nymph
#

ELLE_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

dusty moth
valid jetty
#

runtime information about what the function is being called with and from where

dusty moth
valid jetty
valid jetty
#

thats how i get like these types here

dusty moth
#

wait what does variadic type the variable as

valid jetty
#

variadic isnt a type lol

#

well

#

oh

dusty moth
#

like what's args's type

valid jetty
#

i64

#

technically it should be a va_list but its not

#

i64 is just like, a raw pointer

dusty moth
#

oh it's just a raw pointer?

valid jetty
#

yes

dusty moth
#

interesting

valid jetty
#

because this is all the compiler is doing

#

just allocates stack memory worth the size you specify and then calls vastart on that ptr

dusty moth
#

oh

valid jetty
#

its then a compiler gimmick but you can do args.yield(some type)

long knot
#

I made a script that adds the title of folders below each of them

#
function insertAfter(referenceNode, newNode) {
    referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
let folders = Array.from(document.getElementsByClassName("folder_bc7085"))
document.querySelector('[aria-label="Servers"]').style = "text-align: center;";
folders.forEach(function(e){
    const label = document.createElement("p");
    label.innerHTML = e.parentElement.parentElement.parentElement.parentElement.getAttribute("data-dnd-name");
    label.style = "color: white; font-size: 12px;"
    insertAfter(e.parentElement.parentElement.parentElement.parentElement.parentElement, label)
    // console.log(label, e.parentElement.parentElement.parentElement.parentElement.getAttribute("data-dnd-name"), e.parentElement.parentElement.parentElement.parentElement)
})```
hollow locust
#

can I make proxyLazy handle undefined properly?
this is the current result when factory returns undefined:
Uncaught TypeError: Reflect.get called on non-object

serene elk
#

what would be handle properly

hollow locust
royal nymph
#

and I don't understand this use case

hollow locust
#

okay I'm insane

#

I need to find another way

#

thanks

serene elk
#

you can actually

#

but there isn't really a point

hollow locust
#

I mean, I'm using this for a lazy workaround for a complex situation

#

but I guess I need to resolve this the hard way

royal nymph
#

explain ur use case 😭

#

why does the error matter

#

ur code should never run into error

hollow locust
#

like I said it's kinda complex,
well I built the plugin loading system in you know what project so that first the plugin code is ran and then when preparation is done a plugin details object is returned but the thing is that some plugins want to use their own plugin details during initial execution and it doesn't exist yet at the time lol

#

so I thought that maybe adding a proxy lazy would make a workaround but this introduces more issues

serene elk
#

I dont think using a proxy lazy to throw errors when its ran to early is a good solution

#

proxy lazy is more suited for when you need to return an object which is only going to be available later

#

like webpack finds

#

but not for errors

#

you can probably get it to work but there might be a better solution

hollow locust
#

yes a better solution is to first push the plugin details and then fill them as needed

#

but I didn't think of that a year ago

serene elk
#

how exactly are details accessed

spark tiger
pearl stagBOT
# serene elk https://github.com/Vendicated/Vencord/blob/immediate-finds/src/utils/lazy.ts#L63...

lazy.ts: Lines 63-76

/**
 * Wraps the result of factory in a Proxy you can consume as if it wasn't lazy.
 * On first property access, the factory is evaluated.
 *
 * IMPORTANT:
 * Destructuring at top level is not supported for proxyLazy.
 *
 * @param factory Factory returning the result
 * @param attempts How many times to try to evaluate the factory before giving up
 * @param err The error message to throw when the factory fails
 * @param primitiveErr The error message to throw when factory result is a primitive
 * @returns Result of factory function
 */
export function proxyLazy<T = any>(factory: () => T, attempts = 5, err: string | (() => string) = `proxyLazy factory failed:\n${factory}`, primitiveErr = "proxyLazy called on a primitive value.", isChild = false): T {
serene elk
#

however this implementation might help

#

but first lets try to get a better solution

hollow locust
#
PluginsHolder = {
// ...
  get: function (name) {
      return this.getAll().filter(x => x.name == name)[0] ?? this.getAll().filter(x => x.originalName == name)[0];
  },
  getAll: () => {
      return window.GeneratedPlugins as AssembledPlugin[]; // idk why is this on window, don't remember
  },
// ...

this is the Plugins.get and getAll
GeneratedPlugins is populated after completing of running the actual plugin code

valid jetty
#

you don’t need proxyLazy js has it as a feature itself

serene elk
spark tiger
frosty obsidian
#

how the site looks is still just css

#

astro has support for preprocessors like scss though

hollow locust
frosty obsidian
#

and also has support for mdx

serene elk
#

do plugins store the return value of get in a top level variable or something

#

and never call get again

spark tiger
frosty obsidian
#

scss is very good

spark tiger
#

i'm no webdev guy nikopensive

frosty obsidian
#

i prefer it for more complex styling

#

theres also tailwind but that takes some getting used to

spark tiger
#

oh yeah i've heard of that one a lot recently

lament bay
#

scss was useful when css didn't have all the bells and whistles it has today but now scss is just an unnecessary abstraction in most cases and can easily vomit out some horrible css

frosty obsidian
#

it still massively improves organization

#

imo

shell crag
#

i like scss mixins

hollow locust
# serene elk and never call get again

yeah some do that

const plugin = Plugins.get(config.name) // top level

but other one does this:

getInstalledPlugin (plugin) {
    if (!plugin || typeof plugin.authorname != "string") return;
    const iPlugin = SomethingSomething.Plugins.get(plugin.name);
    if (iPlugin)
        doSomethingWith(iPlugin)
frosty obsidian
#

and I didn't really notice anything wrong with the output

serene elk
#

unless you change when details are set you are gonna need to use a proxy

hollow locust
#

as you can see if (iPlugin) will success even if the real result is undefined

serene elk
#

or

hollow locust
serene elk
serene elk
hollow locust
serene elk
#

I dont think there is another sadly

#

besides fixing the real problem

hollow locust
#

yeah i guess

#

thanks anyway

serene elk
#

do you still want help with implementing the proxy lazy solution

hollow locust
#

nah it wouldn't really help, it was my first thought before I noticed other problems

serene elk
#

yikes

#

goodluck then

dusty moth
#

found the culprit I think

#

one of the blocks in this mf...

#

specifically checking if it's threadsafe lmao

#

and... creating a connection reaches that codepath unconditionally

severe zealot
#

does anyone know how webpack patches work? im trying to create a client mod for slack and im struggling.

spark tiger
dense sand
#

could someone tell me the cause of this? _cpu function symbol is defined in vmdef.h which has include guards, theres no reason to have this defined twice

fleet cedar
#

What do you mean has include guards

#

Include guards don't prevent it from being included in multiple different compilation units

dense sand
#

main.c includes vmdecode.h which includes vmdef.h

fleet cedar
#

Don't define function bodies in headers

#

Unless they're static or inline

dense sand
#

ah i see

valid jetty
#

you can actually visualize the garbage collector now lmao

#

that’s fun

dense sand
fleet cedar
#

I love immutability that throws at runtime

#

Especially when mislabeled

royal nymph
dense sand
spark tiger
dense sand
#

i cannot believe this shit

viscid grove
clever musk
#

Hey @winged mantle A friend of mine wanted a plugin that also removes profile effects. I was wondering if you wanted to merge it as one plugin for themes and effects or I could just make a seperate plugin for it.

winged mantle
#

you can remove effects with css

#

i made the plugin because it was hard to do right with css

clever musk
#

alright then

#

I just thought it was more ideal to implement it into one (noprofilethemes) then make others search for css?

spark tiger
viscid grove
#

oh
why did it say Safari

#

oh wait it's < Safari
so ig you opened youtube from safari?

jade stone
#

this feels wrong

formal belfry
#

@livid light what do you wish to do?

livid light
small osprey
#

Hemmliii

civic flare
livid light
dense sand
#

Which C library to draw simple text and pixels would yall recommend? raylib works, but is kinda uhhh

shy mauve
#

29 husks

#

O dyamn

#

That bro is hella cooked

woven mesa
#

gm

#

hiiii oomf

winged mantle
#

SDL is very popular

jade stone
#

GUHHHH

#

WHY DO DISCRIMINATED UNIONS LOSE INFRENCE AFTER DESTRUCTRING

viscid grove
#

i read that as a weird spelling of onions at first

winged mantle
valid jetty
#

i love how you can do this

#

structs are genius

fleet cedar
#

Are you not quoting your strings when you debug-print them?

valid jetty
#

its just display not debug print

#

however no

#

technically they should be tho

fleet cedar
#

It looks like a debug print

royal nymph
#

kinda misleading

valid jetty
#

specifically strings in formatting functions arent quoted

#

if you printed just a "string" it would be quoted

valid jetty
#

sorry that came out wrong

#

lmao

#

but basically when you allocate the memory for a struct you get back a pointer to the start of that segment, which is the first field

royal nymph
#

yes and it makes no sense to store a struct in an i32 pointer lol

valid jetty
#

in this case the first field is an i32

royal nymph
#

the Foo* in question

valid jetty
#

you do not get Foo* you get just Foo

royal nymph
#

why are u even adding pointer arithmetics 😭

#

unsane

fleet cedar
#

Does that mean type Foo is pointer sized?

royal nymph
valid jetty
#

obviously you woudlnt actually do that in a real codebase

#

yopu can just foo.a or foo.b

fleet cedar
#

Does type Foo mean a pointer to struct Foo?

valid jetty
#

but when you do this

use std/libc/io;

struct Foo {
    i32 a;
    string b;
};

fn main() {
    Foo (2)foo = (1) Foo { a = 1, b = "hi" };
    (6)io::cprintf("%d, %s\n", (4) foo.a, (5)foo.b);
}

the compiler does this essentially

export function w $main() {
@start
        ; (1) declare the foo struct
    %struct.Foo.1720 =l alloc8 12
    %offset.1721 =l add %struct.Foo.1720, 0
    storew 1, %offset.1721
    %offset.1723 =l add %struct.Foo.1720, 4
    storel $.1722, %offset.1723

        ; (2) store it as a stack variable (when you do Foo foo = Foo {} it puts that struct into `foo` thats what this is)
    %foo.addr.1724 =l alloc8 12
    storel %struct.Foo.1720, %foo.addr.1724

        ; (3) load the struct back from `foo` (intermediate step)
    %foo.1719 =l loadl %foo.addr.1724

        ; (4) load member a
    %offset.1726 =l add %foo.1719, 0
    %field.1727 =w loadw %offset.1726

        ; (5) load member b
    %offset.1728 =l add %foo.1719, 4
    %field.1729 =l loadl %offset.1728

        ; (6) print them
    %tmp.1730 =w call $printf(l $.1725, ..., w %field.1727, l %field.1729)
    ret 0
}
valid jetty
fleet cedar
valid jetty
#

the way Foo is made is that it allocates memory of its size right, and what you pass around is a pointer to the start of that allocation

#

well the first field is an i32 so that pointer would be an i32*

fleet cedar
#

Either a value of type Foo is a pointer, or it is not

valid jetty
#

it is a pointer internally, yes

#

but not a Foo *

#

specifically here

%struct.Foo.1720 =l alloc8 12
%offset.1721 =l add %struct.Foo.1720, 0
storew 1, %offset.1721
%offset.1723 =l add %struct.Foo.1720, 4
storel $.1722, %offset.1723
fleet cedar
#

So then #size(Foo) is the size of a pointer?

valid jetty
#

when you put a struct into another struct it is memcpy'ed into it

royal nymph
#

that makes no sense

fleet cedar
#

So it is not the size of a value of type Foo

royal nymph
#

you're saying Foo is a pointer, not a value, yet its size is not that of a pointer

valid jetty
#

that is how structs work in C too

#

it is simply semantic that they are a value

fleet cedar
#

So a local variable of type Foo is a pointer but a struct field of type Foo is the raw data?

valid jetty
#

you would never directly work with that pointer though

#

the compiler would automatically calculate offsets for you

valid jetty
#

because getting a field from a local variable Foo is deref(fooptr + offset)

royal nymph
#

in C, structs are values

valid jetty
#

getting a field frm a field of foo is deref(otherstructptr + fooptroffset + offsetintofoo)

valid jetty
fleet cedar
#

Structs are passed by pointer in many ABIs

valid jetty
#

but if you look at the llvm ir they are not

#

i can actually show you this right now

fleet cedar
#

But the ABI is not exposed in language semantics

valid jetty
#

1 sec

#

^^^

royal nymph
#
struct whatever {
  int x;
};

struct whatever w1 = {0};
struct whatever w2 = w1;

w2.x = 42;

w1.x == w2.x; // false
#

it's a value not a pointer

fleet cedar
#

How values are passed in the ABI does not leak into the language

valid jetty
#

in c when you make a struct and pass it around it passes a pointer to the start of the struct, allocates new memory in the other function, and copies the original struct's memory into it

#

so that when you use it it feels like its a value

#

so in the example you showed when you set w2 to w1 it actually allocates new memory and copies w1 into it

fleet cedar
#

In most abis yes, because that's faster than copying the whole thing

valid jetty
#

^

fleet cedar
#

But that is not part of the language

royal nymph
#

it doesnt matter what it does under the hood lol

#

it only matters what it is in usage

#

and that's a value

fleet cedar
#

It's on the stack

#

What happens under the hood is irrelevant

#

The language is the hood

valid jetty
fleet cedar
#

What matters is language semantics; compilers can then write whatever asm they want as long as all observable behavior matches those semantics

fleet cedar
#

When you say allocate or allocation without qualifying, that means heap

valid jetty
#

just pointer arithmetic is done by element and structs are padded by default and stuff like that

fleet cedar
#

Yes but then you cast the pointer to a pointer

valid jetty
#

so its a little bit more annoying

fleet cedar
#

Which makes sense

valid jetty
#

true

#

i suppose that is something that i did wrong in the language on a semantic level

valid jetty
#

is this easy to read 🙏

#

im still kinda torn on whether <> is a good idea for concatenation

fleet cedar
#

<> for string concat husk
<> for monoid operator blobcatcozy

valid jetty
#

TRUE

#

i was gonna overload + and make it just use concat if its a string and add if its a number

#

however,,

#

this is a low level language

valid jetty
#

sometimes if you wanna do pointer arithmetic manually for example

#

like if you wanna do str + 1 to get the 2nd char

fleet cedar
#

Kinda nasty, but legit

valid jetty
#

you would expect the b not abcd1

fleet cedar
#

How does memory management work with those strings?

valid jetty
#

well

#

thats essentially non existent lol

#

theyre null terminated

#

but any operation you do on them it creates a new string and leaks memory

fleet cedar
#

That's not excellent

valid jetty
#

its not

#

a todo i have is to make it sized

#

technically you can work with it as sized by turning it into an Array<char>

#

there are apis in place to go from 1 to the other

#

im also torn on whether this is a good idea

fleet cedar
#

But array<char> takes four times the memory

valid jetty
#

therefore 2 times the memory

#

not 4

fleet cedar
#

I mean for the actual content

#

"a" is one byte, ['a'] is one char so four bytes

valid jetty
#

how 4

#

wouldnt that be 3

#

2 bytes for the struct itself then 1 byte to store that char

fleet cedar
#

A char is 21 bits, rounded up to 32

valid jetty
#

even so, that fits in 1 byte

#

or o

#

no

#

wait

fleet cedar
#

A char does not fit in one byte unless you're racist

valid jetty
#

in the case of elle chars are 1 byte

fleet cedar
#

💩

valid jetty
#

also cstrings are not necessarily 1 byte thats just if you assume theyre utf8

#

(they are typically not)

fleet cedar
#

Okay sure, if you want the null terminator it'd be two bytes

valid jetty
#

either way you can do this idk

valid jetty
#

its just a constant term

royal nymph
royal nymph
#

doesnt mean it makes any sense

valid jetty
#

in the c code i provided it actually results in a working Foo struct

royal nymph
#

no it actually wont

valid jetty
#

well

#

it would print the pointer to the start of that string truncated to 32 bits

#

still not anything useful

fleet cedar
#

What does from_string do with non-ascii?

valid jetty
fleet cedar
#

I expect complete bullshit, if char is a u8

valid jetty
#

it interprets each byte as a character and prints gibberish

#

yes

fleet cedar
#

Meaning the char type is complete bullshit

valid jetty
#

i will make a c_char type u8 and then make a normal char type which is a u32

#

so that unicode still works

fleet cedar
#

That sounds better

valid jetty
#

the reason its not always u32 is because sometimes you interact with padded structs from C libraries like raylib

#

if char was u32 it would calculate a completely wrong offset here

fleet cedar
#

Using char for numeric values is already nonsense

valid jetty
#

no, actually

fleet cedar
#

Yes please set my red value to {

valid jetty
#

in c people use char all the time to refer to 1 byte

#

because theres no explicit byte type

fleet cedar
#

uint8_t

valid jetty
#

true

#

but in the case of raylib it is just unsigned char iirc

royal nymph
valid jetty
fleet cedar
#

Except you're making it part of the hood

valid jetty
#

true,, but that was also kind of a joke originally,,,,

#

like youre not actually meant to do that to make a struct its just fun that you have the ability to do so if you wanted

valid jetty
#

i added 1 + 1,,,,

fleet cedar
#

A bit clunky, but looks legit

autumn sigil
#

zig is fun

#

parsing to u1234 blobCatCozy

valid jetty
#

what the fuck

dense sand
#

Anyone who knows spring security here?

spark tiger
#

how do u fuckin read c code. i wanted to look at this method implementation which call i found in the code and i found NOTHING. and this func should definitely be in this repo judging from ff (fastfetch) prefix

fleet cedar
#

Could be that the function name is spliced together by the preprocessor somewhere

#

Which is cursed

#

Or maybe that function actually doesn't exist and the code that calls it, which you're looking at here, is ifdeffed out

spark tiger
#

also how do I make image rendering work in windows terminal blobcatcozy

#

need it for fastfetch

dense sand
spark tiger
dense sand
#

i dont quite get what you mean

spark tiger
#

in some terminal emulators (kitty, iterm2, wezterm, etc.) there is support for cli apps to render images in terminal. yazi docs page (https://yazi-rs.github.io/docs/image-preview) says windows terminal (>= v1.22.2702.0) has support for it but it doesn’t work for me for some reason

How to preview images in Yazi.

spark tiger
#

fucking macros 😩

#

i dont even wanna know why they dont wrap ff inside double quotes

#

this language is cursed icl

fallen nebula
#

Macros w

spark tiger
#

this might have worked ig??

dense sand
#

please is there anyone whos knowledged enough in multiboot2

valid jetty
#

try the next planet along

#

2.3 ly

fallen nebula
#

why not just use git bash ?

fleet cedar
#

Why not just use linux

formal belfry
still jolt
#

a lot of people unfortunately ​​​​​​​​​​​​​​​​​​​​​​​​​​

fallen nebula
fleet cedar
#

But most of the annoying problems can be solved

#

Unlike on windows

fallen nebula
#

eeeeeeeh

#

while i like using linux and i wish i could daily drive it, it's just too much of a pain because issues are too common
especially because stuff like nvidia

#

and also linux people are the champions to make 10 apps that do the same exact jobs except they all have flaws when they could unite and make 1 good software

formal belfry
#

in my experience linux is super reliable up until the point where you want to do something new

#

but i also did debian minimal and wiped windows cuz i'm a dumbass

#

not to mention is always heavily depends on distro

fallen nebula
#

i mean i daily drived linux during 1.5y and i'm still alive
and some of the stuff i do on windows is linux heavy
like i mostly only use git bash because bash > cmd/powershell
most of the software i use is FOSS
like i use Gimp, LibreOffice, Firefox, etc

formal belfry
#

how do i submit quickcss code stuff

formal belfry
#

@programmers

#

grr

#

ignore my stupidity lmao

#

i'm bored and tryna make vesktop look more like the DC mobile app

#

i got the channel list looking identical

viscid grove
viscid grove
willow knot
#

clock :)

formal belfry
#

wait a sec that's more than 7 segments

willow knot
#

3x5 pixel font defined by a u15 (zig)

viscid grove
willow knot
#

its a typographic clock - looks better when smaller / at a distance

autumn sigil
willow knot
#

holy shit thats actually a great idea

celest lodge
serene narwhal
cerulean plover
serene narwhal
cerulean plover
valid jetty
#

i added object files to elle

formal belfry
#

what should I learn for typescript with making vencord plugins

#

:P

autumn sigil
valid jetty
#

no

#

@volatile is an attribute that basically says “don’t perform dead code elimination on this function and don’t optimize it, please just leave it alone” to the compiler

#

without that the function won’t be generated in the object because it’s not used anywhere

#

i did make that the default for generating object files specifically since that screenshot

#

when you pass -c:

  • all public functions are exported
  • it no longer expects an entry point
  • the implicit string module methods are removed right before the IR is generated
  • it generates .o instead of an executable by default
  • creating generic functions or structs throws an error
valid jetty
#

static libraries are real now too i guess (i fixed linker flags)

#

this may be cleaner idk

#

i got rid of the -Dtime and -Clink-flag stuff because that was ugly

dawn dragon
#

@valid jetty

valid jetty
#

hi

celest lodge
valid jetty
#

yes

#

if you return from multiple places it will throw an error if they dont all match

#

you can also specify an explicit return type

#

for recursive functions you kinda have to

#

otherwise the compiler wont be able to infer it

autumn sigil
#

blobcatcozy

winged mantle
valid jetty
#

technically yeah sure

#

it wont optimize it for you but you can do it

use std/io;

fn sum(i32 x, i32 total) -> i32 {
    if x == 0 {
        return total;
    } else {
        return sum(x - 1, total + x);
    }
}

fn main() {
    io::dbg(sum(12, 0), sum(8, 0));
}

the traditional way

use std/io;

fn sum(i32 x) -> i32 {
    if x == 0 {
        return 0;
    } else {
        return x + sum(x - 1);
    }
}

fn main() {
    io::dbg(sum(12, 0), sum(8, 0));
}
#

note that elle has no default parameters so you must pass 0 as the initial total

#

i can actually even

use std/io;

fn tail_call_sum(i32 x, i32 total) -> i32 {
    if x == 0 {
        return total;
    } else {
        return tail_call_sum(x - 1, total + x);
    }
}

fn traditional_sum(i32 x) -> i32 {
    if x == 0 {
        return 0;
    } else {
        return x + traditional_sum(x - 1);
    }
}

fn main() {
    io::assert(tail_call_sum(12, 0) == traditional_sum(12), nil);
    io::assert(tail_call_sum(5, 0) == traditional_sum(5), nil);

    io::println("The test has passed!".color("green").reset());
}
ruby shuttle
#

ew rust

valid jetty
#

its not rust

sick swift
#

.

winged mantle
#

otherwise it will stackoverflow

valid jetty
#

no but that is technically easy to do

#

i just need to convert function calls into a jmp to the start label and replace the parameters

errant mesa
#

Hello everyone!

#

I'm a happy coder

viscid grove
#

wow

fleet cedar
#

Make your lies believable next time

valid jetty
#

maple mono

winged mantle
#

is it insane to edit nautlius source code for personal use to change it to use iec

fleet cedar
#

That's pretty much the whole point of open source

winged mantle
#

is there a way to automate updates for a personal patch

#

it'd be cool if i could have automatic updates in general

pseudo sierra
#

for arch you can use .patch files with PKGBUILDs

#

gentoo and nix also have a way to patch stuff but it's a bit more complicated

#

apt rpm etc idek

winged mantle
#

dnf

#

whatever imagine a cve in a file manager

#

would never happen

#

wait

#

i could use hooks

#

modifying os in the same way as video game haks

autumn sigil
#

idk how to stream decompress discord ws zstd

ornate quiver
#

gzip still works fine too

autumn sigil
#

oh yeah i was using zlib but i wanna switch ^^

winged mantle
#

i wonder why this doesn't work....

autumn sigil
#

wonder if they append some stuff

#

? it wants to read 3 bytes but there arent any more

ornate quiver
#

decompile the android app
the decompressor is in java and isn't obfuscated

autumn sigil
#

im not decompiling the mobile app

#

thank you :3

ornate quiver
#

its kotlin but whatever

#

gu

autumn sigil
#

@frosty obsidian when will you give me repo access

#

hm

royal nymph
autumn sigil
autumn sigil
frosty obsidian
#

private

autumn sigil
#

youre mean

autumn sigil
#

it looks like the single block i get doesnt have the last block flag set

#

so it tries to read more block headers and ofc it fails

#

now what do i do?

#

does that mean discords serverside impl is faulty?

#

it looks like i can reasonably expect a frame to have more than a single block so i cant just set the flag for every block..

autumn sigil
#

scratchhead wait nvm ofc it doesnt have the next block, its a stream

dense sand
#

okay so i just finished the end of evangelion, what the actual fuck was that

#

wrobng chane

#

l

autumn sigil
#

are you sure this is the right channel?

dense sand
#

mb

autumn sigil
#

xd

dense sand
#

even wrong server huh

lost pawn
#

I love when I can't create a custom hook with svelte's runes

hazy pine
#

i beat minos prime after so long

#

i think i finally might be pro gaming

dawn ledge
pseudo sierra
dawn ledge
winged mantle
#

ended up using LD_PRELOAD

#

don't ask why i need so many minecraft launchers

pseudo sierra
#

what did you even do?

fleet cedar
#

LD_PRELOAD my beloved

winged mantle
pseudo sierra
#

I see

fleet cedar
#

What formatting? Size? Date? Filename?

winged mantle
#

size

#

GB -> GiB

crisp harness
#

Is there a better way to see the lifetime of my code without having to run npm build and pnpm inject?

autumn sigil
#

kp was du willst, sag mal auf deutsch

crisp harness
#

haha

#

ja ob ich immer discord neustarten muss

#

oder ob es nen dev build gibt. der live updatet oder sowas

#

kp

median root
#

and does that mean wilst is "will"?

fleet cedar
#

No need to reinject, it's already inside

crisp harness
#

Is it possible to create a fullscreen modal? So that you only see the servers on the left and I can do everything myself on the right. Like the SHOP tab, for example.

fleet cedar
#

Check how the shop tab does it

solid gazelle
#

is this approach good

let fecha = null;
let faltas = [];
for (let elem of doc.querySelector("tbody").querySelectorAll("tr")) {
    if (elem.children[0].tagName == "TH") {
        fecha = elem.children[0].innerText.trim();
        continue;
    }
    faltas.push({
        fecha,
        ...[
            'hora', 
            'materia', 
            'tipo', 
            'motivo', 
            'comentario'
        ].reduce((a,b,i)=>(a[b]=elem.children[i].innerText.trim(),a), {})
    })
};
signal oakBOT
crisp harness
fleet cedar
#

In the code

#

Same way as literally anything else

median root
#

Use the search function in the dom

valid jetty
#

holy shit

royal nymph
#

@lone helm @ornate quiver WTF whatsapp web started using metro

#

cursed

#

so it's react native web ?

#

@calm ruin

calm ruin
#

probably trolldayruined

royal nymph
#

lol yeah it is

#

you can tell if it's react native web by checking css classes

#

react native web makes individual classes for every single css property

calm ruin
#

webpack was fine 😢

#

why did they switch to metro 🤢

royal nymph
#

cause react native uses metro xd

calm ruin
#

worse

royal nymph
#

facebook is so insane

calm ruin
#

yet they use webpack

lone helm
lone helm
#

looks like it

royal nymph
#

maybe metro didn't exist back then

autumn sigil
#

strencher tried to make a mod many years ago

frosty obsidian
#

wait i didn't backread enough

#

web is just regular react iirc

royal nymph
#

react native web

frosty obsidian
#

how can you tell

#

nvm i looked back literally 10 messages

royal nymph
#

yea xd

#

css classes

#

and because it uses react native components like View and Text

frosty obsidian
#

is the ios app react native or something

#

bc otherwise i don't know why they would use that over regular react

ornate quiver
#

react native Web needs to die

spark tiger
#

what's so bad about it smilethink

nimble bone
#

react needs to die

ornate quiver
#

sooooo husk

royal nymph
#

the entire point of react native is write code once use everywhere

#

but in reality it doesn't really achieve that because normal react and react native use very different components and styling approach so you still have to write two separate ui implements

#

so the logical conclusion is to make react native run on web so you truly only have one single codebase

ornate quiver
#

so bad

#

just because it's cost efficient doesn't man it's good

still jolt
frosty obsidian
#

companies don't care about good

#

they care about profit

ornate quiver
dawn ledge
#

return to jquery

dense sand
#

i just tried astro and i absolutely hate it

#

please add usetstate to astro 🙏

dawn ledge
#

whar

#

astro is supposed to be static rendering

#

there's no client side interaction

#

you have to byof

dense sand
#

bruh i want to have 2 buttons which toggle rendering of 2 different components

#

imma just do it on a different page

dawn ledge
#

youre solving the wrong problem with the wrong tool

#

normally i would have agreed and trashed on astro (or any other js framework fwiw)
but this is a you issue

dense sand
#

its just a simple utility site, what other thing would you recommend? i didnt want to generate bloated nextjs project for such a simple site

#

its literally supposed to be 2 forms

#

lol

dawn ledge
#

perhaps write a simple js snippet then?

#

if it is a simple site and youre looking for usestate somethings wrong

ionic lake
#

if you want a simple store theres nanostores

autumn sigil
dense sand
autumn sigil
#

you just put css display none on the forms and toggle it with event listener

autumn sigil
#

i just meant you need to get used to writing simple code if you want to use pure astro

dawn ledge
#

and fwiw, its perfectly valid to have custom props on html elements
you can opt for data-foo pattern (and access it in js with elem.dataset.foo) or just elem.foo = thing

dense sand
dawn ledge
#

then do the latter

#

(which supports functions, well any type really)

royal nymph
#

that's like saying your microwave isn't good because it can't cool food and they should add a fridge to it

#

if you want reactivity, use svelte

dense sand
#

it was a joke cmon 😭

royal nymph
dense sand
#

altough it mightve sound pretty seriously given the shit i wrote afterwards

royal nymph
#

astro is build framework + ssr adapter + static site generator

#

it is not an ui framework

#

that's why for anything with lots of reactivity you combine astro with a ui framework like svelte

frosty obsidian
#

astro is really great if all you want is reusable components

dense sand
#

youre true, seems like i picked wrong tool for what i want, i guess ill keep using react Clueless