#๐Ÿ‘พ-core-development

1 messages ยท Page 151 of 1

austere talon
#

in fact there's a watch together adblock pr

quick bear
#

oh shit, really?

#

ill def need to look at that

austere talon
#

there's a plugin that injects js into the spotify iframes

#

it's very easy with electron apis

charred monolithBOT
still wasp
#

oh wow

#

will you ever release it?

#

i reckon alot of people would use it if you did (me included)

shadow mango
#

probably wouldnt be built in

shadow mango
#

i made it stream the responses for long voice messages

#

its not finished but if someone wants to make something cool with it feel free

charred monolithBOT
shadow mango
#

i was going to add a timing thing when you play it and it highlights which line you're on because it supports that idk i'll figure that out later

#

segment.start and segment.end

#

feel free to send a voice message i'll send a ss

verbal pumice
#

you should add an accessory to the message instead of modifying content imo
also since it allows for a custom component you can do fancy shit with it like the aforementioned highlight

still wasp
#

im gonna test it rn, gonna try actually get an understanding of the code since it seems like a good example to learn from for plugin dev

shadow mango
verbal pumice
#

you can force it to be the first accessory so it shows up above the voice message

shadow mango
#

wdym by an accessory

#

like the buttons in the top right when you hover over a message?

verbal pumice
#

content below the message content like embeds or interaction buttons

#

theres an api for it

shadow mango
#

ohhhhhhh

still wasp
#

oh yay my python has randomly decided to break

#

lovely

shadow mango
#

i may not have hardcoded the paths to the libraries

spark pivot
#

if you let vscode import for you it figures it out

shadow mango
#

no

#

like

#

๐Ÿ˜ญ

spark pivot
#

oh in your python lol

shadow mango
#

you need cudnn and cublas
cublas is only cuda 11 but you can just rename the files from 11 to 12 and it works on cuda 12 ๐Ÿ˜ƒ

still wasp
#

my brain is dying

#

i loveeee this pain

shadow mango
shadow mango
still wasp
#

i dont even know dude

#

whenever i try install the whisper dependency it just freaks tf out

shadow mango
still wasp
#

im on 3.12.1

#

ima try swapping to your version

shadow mango
still wasp
#

oop

#

typo

#

mb NAH

shadow mango
#

oh thank god

#

pip install faster-whisper flask

spark pivot
#

i was about to go crazy

still wasp
#

lmaooo

still wasp
#

this is the full cmd output when i try install the dependencies

#

alr im trying with your python verison now

#

oh wtf it works fine now pain

#

fml

charred monolithBOT
charred monolithBOT
charred monolithBOT
#
[Vencord/Vesktop] New branch created: Vendicated-patch-1
#
[Vencord/Vesktop] branch deleted: Vendicated-patch-1
charred monolithBOT
granite vessel
#

im a bit slow how do u make a modal?

charred monolithBOT
thick kestrel
shy veldt
#

same?

frail skyBOT
#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

glass cedar
#

Wow that's nice to see

#

I'm not sure if I've seen everything perfect before lol

faint echo
#

what does the --watch do on pnpm build, because I assume it rebuilds on changes and somehow hot reloads vencord into your client but I am just speculating and I dont find a "DevCompanion" plugin in vencord

limber skiff
#

rebuilds on changes and hot reloads css

faint echo
#

okay

limber skiff
#

for most things to reapply though, because the way vencord is made, you have to ctrl R

faint echo
#

oh quick question is there a possibility I will break my current stable vencord install/config by using the dev version and messing with plugins

limber skiff
#

very unlikely

#

I develop vencord and plugins in the same config/install I use daily

#

as long as don't touch other plugin settings, or in case you do, not forget to change the code to work with the new settings you are fine

faint echo
#

as a test I tried changing a plugin's name but its not injected into my client after reloading with ctrl+r

limber skiff
#

in any case your settings file in prob just include settings for the plugin you are developing, if it's a new one

#

that's irrelevant though because extra settings don't matter

limber skiff
faint echo
#

No I meant just to see if it would appear different in the plugins list

#

I assume at least that all plugins are built into vencord

#

since they're in the repo

limber skiff
#

it should

tropic badge
#

cookies

#

for how long you use vencord?

limber skiff
#

since I joined this discord server

faint echo
#

it needed sudo rights :p

limber skiff
#

not sure cuz I use windows

charred monolithBOT
tropic badge
#

if you know what i mean.

limber skiff
#

yes but either way

#

vns

nimble pendantBOT
faint echo
#

lol

faint echo
#

i Succeeded in blocking input yay

#

maybe vim keybind wont be that hard

#

the modes work at least

#
    handleKeyDown(k) {
        console.log(k);
        console.log(`Current mode ${mode}`);

        if (mode === VimMode.Nav) {
            if (k.keyCode === KEY_I) {
                mode = VimMode.Insert;
            } else if (k.keyCode === KEY_J) {
                // scroll up
                const shifted = k.shiftKey;
                if (shifted)
                    console.info("Big scroll up");
            } else if (k.keyCode === KEY_K) {
                // scroll down
            }

            k.preventDefault();
            k.stopPropagation();
        } else if (mode === VimMode.Insert) {
            if (k.keyCode === KEY_ESCAPE) {
                mode = VimMode.Nav;
            }
        }
    }```
very happy that this wasnt too hard
#

my hand often hurts because of scrolling discord so I need this ๐Ÿ˜ญ

topaz crown
#

will you guys add a plugin that lets us force see audit logs

olive aurora
#

that's not possible

olive aurora
#

ur mom is rule 9

stoic echo
#

no, ur mom is rule 9

stoic echo
#

works perfectly fine

cunning canyon
#

image not user

stoic echo
#

ah so it is broken

charred monolithBOT
shadow mango
#

guys, gals, and nonbinary pals

#

i have figured out message accessories

#

was easier than i expected

junior olive
#

that's actually really neat

#

good job

livid heath
# charred monolith

@cunning canyon use a negative draft type to prevent collision with discord IF in future they add another draft type

cunning canyon
#

what is negative draft type

livid heath
#

oh you're using an inbuilt draft type

#

my bad

livid heath
jagged cloak
#

loo

#

l

still wasp
shadow mango
#

I'll send the updated code in a bit

keen blaze
charred monolithBOT
lime stone
#

...unless i'm misremembering... maybe it depends on browser too ๐Ÿคทโ€โ™€๏ธ ...

cunning canyon
#

which is better
1 nanosecond slower vs not functional for weeks when classes changed trolley

lime stone
#

if you think about it startsWith("reaction_") is faster than contains("\breaction_fef95b\b")

#

however there's probably some magic optimisation stuff

thick kestrel
lime stone
#

magic optimisation

thick kestrel
#

you have an obvious optimization here which is to not use strings

lime stone
#

aka HashSet probably trolley

#

still, i think someone random in css-development tested it once and partial match was faster lmao

#

(most reliable source)

thick kestrel
#

I can't think of any obvious optimizations for matching by attribute, as it is quite literally string search

#

that said, it could have non-obvious ones

#

I don't really think about it in terms of performance here though

#

more in terms of correctness

austere talon
lime stone
#

do you want to update it every time the class changes?

thick kestrel
#

yes why not

#

I dogfeed anyways

cunning canyon
austere talon
#

do you mean specifically the custom m image option

cunning canyon
#

yes

charred monolithBOT
#

My bad for not explaining. Colonist was recently added as a discord activity. (https://colonist.io/)

On the current version of Vesktop, launching Colonist will result in Error 1003, Third party cookies must be enabled to play this activity.

Colonist is trying to call hasStorageAccess() (https://developer.mozilla.org/en-US/docs/Web/API/Document/hasStorageAccess), which was added in chromium v119.

Updating electron allows the activity to launch as intended.

![image](https://githu...

charred monolithBOT
#

I want to say its something to do with the user agent, it looks like the app is checking for 'discord' in the user agent before it calls hasStorageAccess. I will check whats going on shortly.

does not seem to be the case (its just checking to display different errors based on user agent), not entirely sure how its working on the vanilla client. it does not look like hasStorageAccess is a valid func, so its not been backported.

maybe the vanilla client is being served a different file ...

uncut glen
# charred monolith

plugin has bees siting around for about a month now just want to see if anyone has anything to add/change

austere talon
#

there's an experiment that does the same btw

uncut glen
#

ik but this also allows cloning of sounds and a few more things

#

also we made it before the experiment husk

#

what do you think about it vee?

nimble plaza
#

does setting.onChange fire whenever its changed at all or only when its changed from the settings ui

#

i want to clear a store when the setting is changed thru console for a hidden setting

limber skiff
#

just look at the code or test

charred monolithBOT
nimble plaza
#

thank you, copilot

lime stone
#

copilot is just ai powered Ctrl+C Ctrl+V

#

whether it's yoinking a stackoverflow answer or duplicating your own code with minor changes; both of them often being bad practice

#

(satirical)

shadow mango
charred monolithBOT
#

ideally we don't want to upgrade the electron version if it works on the vanilla client's older version - can we please investigate this further rather than doing a major upgrade, since it has the potential to break other things? for context, canary seems to currently be on Electron 22.3.26 so if it works fine on there then we need to work out why.

i mean worst comes to worst, write a polyfill of document.hasStorageAccess = () => true and it'll fix the game from what i'm hearing, which...

austere talon
#

there's no reason not to bump electron

#

if it works correctly

fossil otter
#

also discord's electron is cherrypicked and has patches

#

it's not vanilla 22.3.26

#

e.g. it has a few security patches backported

still wasp
#

would it potentially be possible to run the py server hidden automatically?

shadow mango
#

probably but i dont want to auto download the dependencies

still wasp
#

oh true

#
Could not locate cublasLt64_12.dll. Please make sure it is in your library path!

any ideas? i probably just fucked something up in the setup knowing me NAH

shadow mango
#

and then you have to add them to the path

still wasp
#

where can i download cublas from?

shadow mango
#

nvidia

#

if you have an nvidia gpu

#

idk if it works without

still wasp
#

oh yay

shadow mango
#

theres another one

#

i forgot where i got it from

#

cudnn is much easier

#

can you spawn a child process from a plugin?

#

doesnt seem like i can import spawn

spark pivot
#

you ahve to use ipc i believe

jagged cloak
#

ipc if u wanna use node or electron stuff

#

iirc

fossil otter
#

and compile it to wasm

#

actually wasm is not that fast

still wasp
#

surely itd be easier to just run the whisper process within the plugin code rather than just hosting it from python

fossil otter
#

probably

#

but this is technoware

charred monolithBOT
charred monolithBOT
austere talon
frail skyBOT
#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

austere talon
#

nop

#

actually true

#

crystal rewrite soon

#

๐Ÿ”ฅ

charred monolithBOT
#
[Vencord/Installer] New branch created: update-giu
austere talon
#

making cli less cbt

#

ignore that im rate limited by github xd

faint echo
#

but scrolling works already :>

austere talon
limber skiff
faint echo
#

I dont do js

faint echo
austere talon
#

once i release this we can remove the linux gui entirely

#

and make linux users use the cli

#

they will love it

faint echo
#
merlijn@arch ~ % cat .bin/update-cord.sh
sudo XDG_CONFIG_HOME="$XDG_CONFIG_HOME" ./vencord-installer --uninstall --location /opt/discord
sudo XDG_CONFIG_HOME="$XDG_CONFIG_HOME" ./vencord-installer --uninstall-openasar --location /opt/discord
paru -S discord
sudo XDG_CONFIG_HOME="$XDG_CONFIG_HOME" ./vencord-installer --install --location /opt/discord
sudo XDG_CONFIG_HOME="$XDG_CONFIG_HOME" ./vencord-installer --install-openasar --location /opt/discord```
#

I already made this tbh

#

but it breaks when discord decides it hasnt fully updated yet via paru

#

then openasar cant launch it

austere talon
#

i will remove the need for you to uninstall to update discord

faint echo
#

๐Ÿ˜

charred monolithBOT
faint echo
#

e.g. 20j would jump 20 messages or something

charred monolithBOT
austere talon
#

GUH THERE IS NO ASAR LIBRARY IN GO

mortal fractal
#

its just a derivative of tar

#

if you dont want to then i might, i need more shit to write in go

austere talon
#

i tried looking for a C/C++ one

#

cause then i could just use cgo

#

but there isnt one either

#

how has noone created a C++ asar library yet wtf

#

i only found one in Crystal and C#

mortal fractal
#

yeah i think the only version is @electron/asar because its only used by electron

mortal fractal
#

c# understandable but fucking crystal????

austere talon
#

but its broken

#

i tried it and the asar it writes is corrupt

mortal fractal
#

fork time

austere talon
#

7y old

mortal fractal
#

horror

austere talon
#

did electron change the asar spec?

#

i tried some forks but theyre also broken

mortal fractal
#

potentially?

#

that or its always been broken for writing

austere talon
mortal fractal
#

oh

#

anyways i came here to say that apparently css nesting is in chromium 120 and thats what electron 28 is on

austere talon
#

ye

#

nesting is even in electron 27

mortal fractal
#

so if and when discord finally updates to 28 we can have css nesting in themes

austere talon
#

vesktop has had nesting for ages

mortal fractal
#

sadly my hh hijack for vesktop is broken and i have no idea why

austere talon
mortal fractal
#

well aside from not loading vencord

#

its specifically the vencord loading that breaks for no reason

#

something weird with webpack where nothing loads properly and so it crashes cause Common.React is undefined

#

and i spent like 2 hours on it the other night to no avail

austere talon
#

actually

#

can i cheese it by hardcoding asar bytes and using string.replace

#
๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ๏ฟฝ{"files":{"index.js":{"size":16,"offset":"0","integrity":{"algorithm":"SHA256","hash":"406770e1746833a5ab9dd1fc17b65abc914058212a93e91564eccbeca0194fdc","blockSize":4194304,"blocks":["406770e1746833a5ab9dd1fc17b65abc914058212a93e91564eccbeca0194fdc"]}},"package.json":{"size":44,"offset":"16","integrity":{"algorithm":"SHA256","hash":"d599f28018b12a54ee3e9a9433f95c33e104685e3e21bde4f28ea3fbcd8af455","blockSize":4194304,"blocks":["d599f28018b12a54ee3e9a9433f95c33e104685e3e21bde4f28ea3fbcd8af455"]}}}}๏ฟฝ๏ฟฝrequire("PATH")
{
    "name": "discord",
    "main": "index.js"
}
#

i'd need to recalculate the hashes and size/offset

#

ughh whats blockSize

#

according to wikipedia sha256 block size is 512

#

why is asar saying its 4194304

#

is integrity optional?

#

actually yeah this format seems easy i might just write an encoder

austere talon
#

holy shit this is so easy

woeful sable
#

i just read the conversations here and humanity is saved trolley

charred monolithBOT
austere talon
#

AYYY

#

i did it maybe

#
var PackageJson = `{
    "name": "discord",
    "main": "index.js"
}`

type asarEntry struct {
    Size   int32  `json:"size"`
    Offset string `json:"offset"`
}

func WriteAppAsar(outFile string, patcherPath string) error {
    header := make(map[string]map[string]asarEntry)
    files := make(map[string]asarEntry)
    header["files"] = files

    fileContents := ""

    patcherPathB, _ := json.Marshal(patcherPath)
    indexJsContents := "require(" + string(patcherPathB) + ")"
    indexJsBytes := len([]byte(indexJsContents))
    fileContents += indexJsContents
    files["index.js"] = asarEntry{
        Size:   int32(indexJsBytes),
        Offset: "0",
    }

    fileContents += PackageJson
    files["package.json"] = asarEntry{
        Size:   int32(len([]byte(PackageJson))),
        Offset: strconv.Itoa(indexJsBytes),
    }

    headerBytes, _ := json.Marshal(header)
    headerString := string(headerBytes)
    headerStringSize := uint32(len(headerString))
    dataSize := uint32(4)
    alignedSize := (headerStringSize + dataSize - 1) & ^(dataSize - 1)
    headerSize := alignedSize + 8
    headerObjectSize := alignedSize + dataSize
    diff := alignedSize - headerStringSize
    if diff > 0 {
        headerString += strings.Repeat("0", int(diff))
    }

    f, err := os.Create(outFile)
    if err != nil {
        panic("oh god")
    }
    defer f.Close()

    for _, n := range []uint32{dataSize, headerSize, headerObjectSize, headerStringSize} {
        _ = binary.Write(f, binary.LittleEndian, int32(n))
    }

    _, _ = f.WriteString(headerString)
    _, _ = f.WriteString(fileContents)

    return nil
}
charred monolithBOT
#
[Vencord/Installer] New branch created: proper-app-asar
mortal fractal
#

curious why you're making a new asar

austere talon
mortal fractal
#

what was the problem with the folder method

austere talon
#

conflicts when using various Linux package managers

#

namely pacman

mortal fractal
#

well theres your first problem tr

austere talon
#

maybe others

mortal fractal
#

i am the anti installing anything you're going to mod through a package manager

austere talon
#

the majority of people will

mortal fractal
#

i know, it still annoys me

#

its why i wrote this

#
mkdir -p ~/.local/share/
cd ~/.local/share/
wget "https://discordapp.com/api/download/canary?platform=linux&format=tar.gz" -O DiscordCanary.tar.gz
tar -xf DiscordCanary.tar.gz
rm DiscordCanary.tar.gz

# optional if you use desktop files
mkdir -p applications
sed -i "s|/usr/share/discord-canary|$(echo $HOME)/.local/share/DiscordCanary|" DiscordCanary/discord-canary.desktop
mv DiscordCanary/discord-canary.desktop applications
mkdir -p "${HOME}/.local/share/icons/hicolor/256x256"
cp -f "DiscordCanary/discord.png" "${HOME}/.local/share/icons/hicolor/256x256/discord-canary.png"
sed -i "s|Icon=discord-canary|Icon=${HOME}/.local/share/icons/hicolor/256x256/discord-canary.png|" "${HOME}/.local/share/icons/hicolor/256x256/discord-canary.png"
austere talon
#

horror

#

why not use dvm

short sequoia
#

@austere talon please please please tell me cli installer is real

mortal fractal
#

maybe i should make my own dvm for shits and giggles

charred monolithBOT
charred monolithBOT
#

Since documenting ~120 plugins is a pretty big task, we would likely have to make this a community effort, which means that we ask users to each document one plugin and then combine all these. Would have to think about this more and organise it properly

If it comes to writing README.md for each one of those plugins, I could write them myself, writing is fun after all!
Also, would you have a layout for each README.md or? since without a layout things would probably get quite messy.

tulip garnet
still wasp
#

Is there any easy way to get an array of all text content in a channel?

still wasp
#

I'm trying to make a custom search thingy, there's probably an easier way to do it than just grabbing every message and filtering through tho NAH

lime stone
#

so it's not viable for search

faint echo
#

I'm curious what you think is missing the default search

still wasp
charred monolithBOT
still wasp
#

are there any plugins i can use as an example to learn how to make plugin configs? or documentation of some time

austere talon
#

configs?

still wasp
#

i mean in the plugins menu, where you can configure the settings of a plugin

#

ive figured out how to define a setting but im not sure how to actually grab the value of it

#

ahhh alr got it

jagged cloak
#

settings.store

charred monolithBOT
charred monolithBOT
charred monolithBOT
charred monolithBOT
waxen escarp
#

can client-side profile customizations like profile effects and animated avatars be added (server side if possible)

nimble plaza
#

not serverside

spark pivot
#

vns

nimble pendantBOT
charred monolithBOT
frail skyBOT
#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

#
Bad Patches

None

Bad Webpack Finds

None

Bad Starts

None

Discord Errors

None

charred monolithBOT
austere talon
#

the gui you can just double click and it'll open

for the cli, open a terminal and drag it into the terminal then press enter

if on linux, you need to

cd /tmp
wget https://cdn.discordapp.com/attachments/1015063227299811479/1189004827842322442/VencordInstaller-CLI-linux
chmod +x VencordInstaller-CLI-linux
sudo ./VencordInstaller-CLI-linux
#

the gui hasn't changed one bit but there are a lot of under the hood improvements and fixes

and the cli has got a full remake, now it's an interactive prompt

willow garden
#

you should make it reopen it, the gui version worked fine for me

austere talon
#

reopen it = automatically start discord again after patch?

willow garden
#

yes

austere talon
#

thats effort ๐Ÿ˜”

#

but maybe

limber skiff
#

what happened to the web version of the installer

willow garden
#

is the code you just sent available on the github?

austere talon
#

yes

willow garden
#

the cli version works fine too

austere talon
# austere talon the binaries i just sent are just the latest code on the main branch on github

but there have been tons of changes since the last release (what u get when downloading from releases)

https://github.com/Vencord/Installer/compare/ca03a38b8976edafd14684afba698247feabcc92...HEAD

GitHub

A cross platform gui/cli app for installing Vencord - Comparing ca03a38b8976edafd14684afba698247feabcc92...HEAD ยท Vencord/Installer

willow garden
#

oh god its in go

limber skiff
#

nice you fixed killing the process on window

austere talon
limber skiff
#

it kept failing cuz it wasn't killing in time

#

๐Ÿ˜ž

austere talon
#

wait wdym

willow garden
#

i was gonna look at it and see if i could help with the autoopen but its in go

austere talon
grave mangoBOT
# austere talon my hatred for windows api is unreal https://github.com/Vencord/Installer/blob/ma...

**find_discord_windows.go: **Lines 135-151

func findProcessIdByName(name string) uint32 {
    snapshot, err := windows.CreateToolhelp32Snapshot(windows.TH32CS_SNAPPROCESS, 0)
    if err != nil {
        return 0
    }

    procEntry := windows.ProcessEntry32{Size: uint32(unsafe.Sizeof(windows.ProcessEntry32{}))}
    for {
        err = windows.Process32Next(snapshot, &procEntry)
        if err != nil {
            return 0
        }
        if windows.UTF16ToString(procEntry.ExeFile[:]) == name {
            return procEntry.ProcessID
        }
    }
}
limber skiff
#

the old powershell method failed cuz it tried to kill but the code continued to run before it fully killed

austere talon
#

worked on my machine xd

limber skiff
#

it wasn't all the time

#

prob cuz my cpu is millennial

limber skiff
austere talon
#

i dont understand how it works i just copy pasted from stackoverflow xd

#

wtf is a CreateToolhelp32Snapshot

turbid hatch
#

eug

#

h

#

that is awfully low level for a go api

#

jesus

austere talon
#

cause its just raw winapi bindings

turbid hatch
austere talon
turbid hatch
#

ye ik

#

xd

#

i've worked with these apis before

#

wouldnt wish it on anyone

austere talon
#

๐Ÿ˜ญ

austere talon
#

the fucking fact that there are A/W suffixes for ascii and unicode

#

the HORRIBLE naming

#

and OH MY GOD THE FUCKING HUNGARIAN NOTATION

#

AND HORRIBLE CONTRACTIONS OF ALL WORDS

turbid hatch
#

and yeah

limber skiff
#

I figured lol

turbid hatch
#

winapi is awfully inconsistent and just really shit

turbid hatch
#

cause all process memory is accessible via /proc/mem

#

and you can write to it too through there! it's really neat

austere talon
#

isnt that protected

turbid hatch
#

depends

austere talon
#

only the process that owns it can read it i think=

limber skiff
#

welp

turbid hatch
#

i know a rust program that killed itself by overwriting its own stack

limber skiff
#

internet died so now my message is out of context

turbid hatch
#

but i have seen tools read /proc/mem before

#

lemme double check

#

might be a root thing

austere talon
limber skiff
#

you said yesterday there is asar encoding and decoding in c# and crystal

turbid hatch
limber skiff
#

rust too ๐Ÿ˜‚

austere talon
#

i just ported the crystal library's pack function to go

limber skiff
#

ik ik

turbid hatch
limber skiff
#

I'm not saying to use

austere talon
#
_, err = f.WriteString(headerString)
if err == nil {
    _, err = f.WriteString(fileContents)
}
if err != nil {
    return fmt.Errorf("Failed to write asar data: %w", err)
}
limber skiff
#

just saying it exists

austere talon
#

is there a better way to write this

#

god i hate go error handling

turbid hatch
#

yes

#

dont

#

the err == nil to continue the operation is weird and not go-like at all

austere talon
#

yeah but then i need to copy paste the same if block twice

#
if _, err = f.WriteString(headerString); err != nil {
    return fmt.Errorf("Failed to write asar data: %w", err)
}
if _, err = f.WriteString(fileContents); err != nil {
    return fmt.Errorf("Failed to write asar data: %w", err)
}
#

MY HATRED

turbid hatch
#
if _, err := f.WriteString(headerString); err != nil {
    return fmt.Errorf("Failed to write asar data: %w", err)
}

if _, err := f.WriteString(fileContents); err != nil {
    return fmt.Errorf("Failed to write asar data: %w", err)
}
#

yup

austere talon
#

go error handling is so goddamn awful

lime stone
#

WHAT what the hell

austere talon
#

i hate that you cant have one single catch block that handles all

turbid hatch
#

rust does it significantly better

#

? handling is nice

charred monolithBOT
austere talon
#

go's abyssmal error handling makes me want to abandon it

turbid hatch
#

that is also a valid solution

#

actually

#

i was about to recommend something like that

austere talon
#

yeah thats what i did above so now it's consistent

lime stone
#

who decided "try catch has its flaws, so we should implement a much worse system"

jagged cloak
#

i always wondered why it was like that

grave mangoBOT
# austere talon https://github.com/Vencord/Installer/blob/main/app_asar.go#L64-L74

**app_asar.go: **Lines 64-74

for _, n := range []uint32{dataSize, headerSize, headerObjectSize, headerStringSize} {
    if err = binary.Write(f, binary.LittleEndian, int32(n)); err != nil {
        return fmt.Errorf("Failed to write asar bytes: %w", err)
    }
}

for _, s := range []string{headerString, fileContents} {
    if _, err = f.WriteString(s); err != nil {
        return fmt.Errorf("Failed to write asar data: %w", err)
    }
}
austere talon
#

nice and clean

jagged cloak
#

go ogle moment

austere talon
#

AT LEAST ITS NOT C

#

in c its even worse

turbid hatch
#

returning errors in a language is fine as long as the language has facilities to make it easy to work with said errors

#

go does not have these facilities

lime stone
jagged cloak
#

they wanted to c how worse they could make it

lime stone
#

how could it be worse?

turbid hatch
#

in classic C

#

you had a global error code

#

that was it

#

in fact, in modern C

#

this is still the case sometimes

#

fortunately not really that much

#

but in windows API programming, GetLastError() is needed to get the last error from the last thing you called

#

its stupid

austere talon
#
// go
result, err := doThing()
if err != nil {
  println(err)
}
// c
#include <errno.h>
Type result;
if (doThing(&result) != THING_OKAY) {
  puts(strerror(errno));
}
#

it's fucking unreal how bad C has it

turbid hatch
#

dont worry

#

linux programming is funny

#

-EPERM

lime stone
turbid hatch
#
let result = doThing()?;
austere talon
#

literally the go devs want you to write insane boilerplate code

they refuse to add better error handling
they refuse to add ternary (the alternative they want you to use is an if else that sets a variable)
they refused to add slices.Map (js array.map port) because they don't consider it go-like (the alternative they want you to use is a for loop that manually writes to a new array)

#

go has so much potential but it's ruined by the designers of it being boomers

turbid hatch
#

is this a genuine riicr/r/anything else moment

austere talon
#

RIICR

turbid hatch
#

rewrite it in crystal

willow garden
#

just use rust man

austere talon
#

IK

turbid hatch
#

it is time

austere talon
#

rust is even worse than go to me

#

i dont like it

turbid hatch
#

rust is terse but sane

#

imo

willow garden
#

rust is for the non sane

austere talon
#

i tried to like rust, i really did

i gave it so many shots

limber skiff
#

only reason I would use go is when I don't want to deal with rust borrow checker

austere talon
#

but i just dont like it

turbid hatch
#

rust is not very easy to write

#

it is easy to read

willow garden
#

you have to be insane

austere talon
#

i hate rusts borrow checker and rust is unreadable

#

you can do memory safety without INSANE CBT BORROW CHECKER

turbid hatch
#

i found once i understood rust's syntax a bit more it made sense when i was reading stuff and i found it easy to follow, but writing it was never easy to me

willow garden
#

fav language rn is nodejs lol

turbid hatch
#

i constantly fought against the compiler

#

to do what i thought were relatively basic things

limber skiff
turbid hatch
#

and i get why its done like this, its strict by design

#

but holy shit

#

let me use a variable twice

willow garden
#

vee make it auto reopen discord >:(

limber skiff
#

I really like rust syntax though

austere talon
#

the majority of popular languages have memory safety without such a restrictive system (go, crystal, java, javascript, kotlin, etc) and guess what theyre REALLY USABLE

turbid hatch
#

yes, but they all have garbage collectors

limber skiff
#

ngl kotlin is good

austere talon
#

noone asked for such insane memory safety as rust has it agony

austere talon
turbid hatch
#

i havent got an issue with it, they're fine

austere talon
#

it does not matter in 99.99% of programs

limber skiff
#

we need garbage collection version of rust

austere talon
#

i like GC

turbid hatch
#

but in systems programming i understand why its a pain

turbid hatch
austere talon
#

yeah but hardly anyone does systems programming

#

i want to add self updating to the installer too

turbid hatch
#

RIIK/N

austere talon
turbid hatch
#

separate process

austere talon
turbid hatch
#

on windows

#

you cant overwrite an open file

#

you CAN rename it

austere talon
#

you can?

turbid hatch
#

yes

#

renaming is allowed

austere talon
#

wait i had that happen actually earlier

turbid hatch
#

a process can rename its own file

#

it is perfectly legal

austere talon
#

it renamed my installer to VencordInstaller.exe~

turbid hatch
#

it just cant be modified or deleted

austere talon
#

i was so confused why but guess thats why

turbid hatch
#

yeah i used that trick a lot

austere talon
#

wait so i can rename it then write to the old file?

turbid hatch
#

yes

austere talon
#

so go is smart and renames the file

turbid hatch
#

so you'd rename your current binary to like

#

VencordInstaller.exe.old

#

and then write to new VencordInstaller.exe

austere talon
#

awesomeee

turbid hatch
#

run new one, die

#

new one cleans up old file

austere talon
#

can i move it too?

#

to a different folder

turbid hatch
#

let me check

austere talon
#

i can probably just on start up make it check if {argv[0]}.old exists and delete it

#

no need for special logic

turbid hatch
#

the answer is potentially

#

in the end, when windows loads an exe, it doesnt keep reference to the name of it

#

it keeps reference to the actual binary data

#

inode i guess would be the correct term in terms of filesystems

austere talon
#

i hate that windows even does this

turbid hatch
#

so you can do what you want with it as long as it isnt changed or deleted

austere talon
#

why does it do that

#

linux/mac let u delete them no problem

turbid hatch
#

because windows is meant to be foolproof since some applications read their own binaries later

#

so it puts a lock on it

austere talon
#

im gonna kill whichever devs do that

turbid hatch
#

you could probably just bruteforce the lock

#

but i dont know what consequence that would have

#

so i do not recommend it

austere talon
#

bruteforce??

turbid hatch
#

you can force a file lock to be destroyed

#

yes

#

its even part of microsoft's own tools

#

file locksmith tells you what has it open but there is another piece of software that allows you to force break locks

#

its pretty cool

#

oddly enough renaming it causes file locksmith to not know what's holding it open

#

presumably because the act of locking a file is based on the name, not the inode

#

yet it is still locked

#

however even windows goes like "by some application" rather than discord

#

anyway windows is a terribly designed system

#

oh yeah @austere talon another windows top tip

#

a binary application does not need .exe to be runnable

#

you shrimply just have to call it with the shell and it'll run it as a binary application

#

might be useful for certain things

charred monolithBOT
austere talon
turbid hatch
#

^ tbf im quite confused on why it has its own separate one

turbid hatch
#

oh its cause its not building it from scratch

#

ic

austere talon
#

sucks

turbid hatch
#

strange

austere talon
#

clueless

turbid hatch
#

well anyhow

#

back to windows update insanity

austere talon
#

you're not supposed to specify git as makedep because base-devel is a prerequisuite for aur

#

how do you even install an aur package without git

turbid hatch
#

explode

austere talon
#

remove git from makedeps @dapper tiger

#

this guy doesnt know what hes talking about

turbid hatch
# turbid hatch back to windows update insanity

the two main ways of doing it are separate updater executable or the move tactic i described earlier, so for cleanliness i'd do the latter

check for `.old` -> wait for old process to die -> delete
check for updates -> rename self to .old -> download in-place update -> launch new -> exit
#

for the delete part, the old executable can use the windows task scheduler to schedule its deletion (and the deletion of the task) or it can use the windows API to delete on reboot

#

i think its MoveFileEx(path, NULL, MOVEFILE_DELAY_UNTIL_REBOOT)

#

although i think DELAY_UNTIL_REBOOT requires admin which sucks

austere talon
#

actually nvm git is not in base-devel

#

i could have sworn it was??

turbid hatch
#

hold a common mutex open like VencordInstaller_Update

#

when the old app dies it'll drop the mutex

#

or just keep trying to delete the .old until it works

austere talon
#

girl what

#

that seems overly complicated

turbid hatch
#

or just dont! leave it there and then when a new update is available it deletes it then

turbid hatch
austere talon
#
spawnNewInstance()
os.Exit(0)
turbid hatch
#

nuh uh

#

race condition

austere talon
#

how

turbid hatch
#

new instance might spawn before old has died

austere talon
#

so

#

just keep trying to delete the file every second or smth

turbid hatch
#

new instance cant do operations on old executable's file

austere talon
turbid hatch
#

there's many different ways of doing it

austere talon
#

or move the old one to %TEMP% and let the system deal with eventually deleting it

turbid hatch
#

uh

#

haha

#

funny joke

#

i like it

#

(%TEMP% is not autocleared by windows)

austere talon
#

Windows never automatically cleans the %TEMP% directory by default. In Windows 10 you have to enable this feature in Settings, and with earlier versions you must delete the files yourself or use programs like Disk Cleanup or cCleaner.

#

fuck you microsoft

turbid hatch
#

(it requires manual clearing)

#

yes

#

because SOME APPLICATIONS

austere talon
#

can we stop using windows already??

turbid hatch
#

store stuff in temp

#

to persist across reboots

austere talon
#

we have surpassed the need for windows

turbid hatch
#

because they're fucking stupid

austere talon
turbid hatch
#

storage sense fortunately fixes a lot of this and it is on by default

#

but it can still take a long time

austere talon
#

the contract is that temp files are temporarily which means they are only guaranteed to exist until next reboot

#

why would any app expect anything else

swift fjord
#

i store all my files in temp

turbid hatch
#

at which point they'll delete it

austere talon
#

i HATE programming docs in german

#

it's so awkward and horrible

#

programming docs were not supposed to be localised

turbid hatch
#

programming docs in any language other than english

#

are awful

austere talon
#

horror

#

Temporary files whose names have been created by this function are not automatically deleted. To delete these files call DeleteFile.

turbid hatch
#

ใƒญใƒผใ‚ซใƒซ ใ‚ณใƒณใƒ”ใƒฅใƒผใ‚ฟใƒผไธŠใฎใƒ•ใ‚กใ‚คใƒซใพใŸใฏใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใฎๆ–ฐใ—ใ„ๅๅ‰ใ€‚

ใƒ•ใ‚กใ‚คใƒซใ‚’็งปๅ‹•ใ™ใ‚‹ๅ ดๅˆใ€ใ‚ณใƒ”ใƒผๅ…ˆใฏๅˆฅใฎใƒ•ใ‚กใ‚คใƒซ ใ‚ทใ‚นใƒ†ใƒ ใพใŸใฏใƒœใƒชใƒฅใƒผใƒ ใซ้…็ฝฎใงใใพใ™ใ€‚ ๅฎ›ๅ…ˆใŒๅˆฅใฎใƒ‰ใƒฉใ‚คใƒ–ใซใ‚ใ‚‹ๅ ดๅˆใฏใ€dwFlags ใง MOVEFILE_COPY_ALLOWED ใƒ•ใƒฉใ‚ฐใ‚’่จญๅฎšใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’็งปๅ‹•ใ™ใ‚‹ๅ ดๅˆใ€็งปๅ‹•ๅ…ˆใฏๅŒใ˜ใƒ‰ใƒฉใ‚คใƒ–ไธŠใซใ‚ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚

dwFlags ใŒMOVEFILE_DELAY_UNTIL_REBOOTใ‚’ๆŒ‡ๅฎšใ—ใ€lpNewFileName ใŒ NULL ใฎๅ ดๅˆใ€MoveFileEx ใฏใ‚ทใ‚นใƒ†ใƒ ใฎๅ†่ตทๅ‹•ๆ™‚ใซๅ‰Š้™คใ™ใ‚‹ lpExistingFileName ใƒ•ใ‚กใ‚คใƒซใ‚’็™ป้Œฒใ—ใพใ™ใ€‚ lpExistingFileName ใŒใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅ‚็…งใ—ใฆใ„ใ‚‹ๅ ดๅˆใ€ใ‚ทใ‚นใƒ†ใƒ ใฏใ€ใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใŒ็ฉบใฎๅ ดๅˆใซใฎใฟใ€ๅ†่ตทๅ‹•ๆ™‚ใซใƒ‡ใ‚ฃใƒฌใ‚ฏใƒˆใƒชใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚

austere talon
#

i dont think microsoft knows what temporary means

turbid hatch
#

i love reading programming documentation in japanese

#

because every now and then you'll just get random english

austere talon
#

its not even possible to program without knowing english

turbid hatch
#

for the most part yeah

austere talon
#

are there any programming languages that dont use english....

turbid hatch
#

that one arabic one

#

there's a russian one

austere talon
#

also i love the new cli

turbid hatch
#

oo pretty

austere talon
#

so much better than the old thing

#

its an interactive prompt

turbid hatch
#

APL invented its own symbols!

austere talon
#

im really happy with how it turned out

#

much more user friendly

turbid hatch
#
use Lingua::Romana::Perligata;
 
adnota Illud Cribrum Eratothenis
 
maximum tum val inquementum tum biguttam tum stadium egresso scribe.
da meo maximo vestibulo perlegementum.
 
maximum comementum tum novumversum egresso scribe.
meis listis conscribementa II tum maximum da.
dum damentum nexto listis decapitamentum fac
    sic
        lista sic hoc tum nextum recidementum cis vannementa listis da.
        dictum sic deinde cis tum biguttam tum stadium tum cum nextum
        comementum tum novumversum scribe egresso.
    cis
#

anyway

#

weirdness aside

austere talon
#

use

turbid hatch
#

!

#

okay elon

#

wqait

#

wait

#

was it elon that said cis was a slur

#

it was wasnt it

austere talon
#

and only providing the cli

#

cause the gui is a bit quirky on wayland and i hate the fact that we need separate binaries for x11/wayland

turbid hatch
#

dont see why not

#

if you installed linux you should be able to handle a terminal

#

that was it

#

@austere talon ah ok i have unearthed a very very old thing

#

it was an in place updater i wrote

#

so it is literally just

#

delete an existing .old if one exists

#

move self to .old

#

download update in place

#

run updated executable

#

die

#

although for safety reasons

#

you should download the update first to a temp file

#

(go should have a facility for generating temp files?)

#

and then do the entire movement shenanigans

austere talon
#

ofc

turbid hatch
#

because if the update fails at least your app still works

#

and you havent just destroyed accidentally uninstalled it

#

so lets see

austere talon
#

instead of

rm app.asar
rename _app.asar app.asar

it does

rename app.asar app.asar.tmp
rename _app.asar app.asar
rm app.asar.tmp
#

and if a step fails it restores the backup

turbid hatch
#
import (
    "net/http"
    "io"
    "os"
    "os/exec"
)

func main() {
    us, err := os.Executable()
    if err != nil {
        // wtf? this should never error but apparently we have to handle it...
        panic(err)
    }

    // download the update
    f, err := os.CreateTemp("", "vencordinstaller-update-*")
    if err != nil {
        panic(err)
    }
    // whilst we do consume the temp file in the end, this cleans it up if we panic elsewhere
    defer os.Remove(f.Name())
    
    resp, err := http.Get("...")
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    
    if _, err := io.Copy(f, resp.Body); err != nil {
        panic(err)
    }
    
    if err := f.Close(); err != nil {
        panic(err)
    }

    if err := os.Remove(us + ".old"); !os.IsNotExist(err) {
        panic(err)
    }

    if err := os.Rename(us, us + ".old"); err != nil {
        panic(err)
    }

    if err := os.Rename(f.Name(), us); err != nil {
        // try and put us back in place first - we're panicking anyway so no error handling
        // (if this fails anyway something's gone horribly wrong!)
        os.Remove(us)
        os.Rename(us + ".old", us)

        panic(err)
    }

    cmd := exec.Command(us)
    if err := cmd.Start(); err != nil {
        panic(err)
    }

    if err := cmd.Process.Release(); err != nil {
        panic(err)
    }
}
#

@austere talon

#

this is what i was cooking

#

i think this would work?

#

with edits of course but you get the point

austere talon
#

wtf this should never error
why not just check source code

func executable() (string, error) {
    var procfn string
    switch runtime.GOOS {
    default:
        return "", errors.New("Executable not implemented for " + runtime.GOOS)
    case "linux", "android":
        procfn = "/proc/self/exe"
    case "netbsd":
        procfn = "/proc/curproc/exe"
    }
    path, err := Readlink(procfn)

    // When the executable has been deleted then Readlink returns a
    // path appended with " (deleted)".
    return stringsTrimSuffix(path, " (deleted)"), err
}
turbid hatch
#

wow it seriously doesnt have a windows impl?

#

that's fuck awful

#

ugh

austere talon
#

it does silly

turbid hatch
#

o

#

does it

austere talon
turbid hatch
#

oh ๐Ÿ™

#

well anyway it should never error

austere talon
#

it absolutely can

#

wdym

turbid hatch
#

yes but it shouldnt

#

its basically the equivalent of getting os.Args[0] but absolute, so if it errors something is extremely wrong with the environment we're in

austere talon
#
ln -s binary link
./link &
rm binary
#

very easy way to make it error

turbid hatch
#

fortunately not possible on windows

#

๐Ÿ™

austere talon
#

oh wait what

#

// When the executable has been deleted then Readlink returns a
// path appended with " (deleted)".

turbid hatch
#

cant delete

#

although i dont know what happens if you rename the executable and call os.Executable

#

though i suppose at that point a lot of apps would get confused

austere talon
#

oh okay even delete wont cause an error

turbid hatch
#

ye

#

its specifically just in the event of it like

austere talon
#

its not reading the link itself, it's reading /proc/self/exe

turbid hatch
#

not .. being able to get it

#

ye

#

also i hate go

#

why are there two operators for variable assignment

#

why not just

#

one

#

if it knows the variables dont exist yet

#

just make them

austere talon
#

TRUE

#

but thatd be too pythony ๐Ÿค“

austere talon
#

especially cause no new variables on left side of assignment and unused variable are FUCKING COMPILER ERRORS

turbid hatch
#

i would rather drag my balls through broken glass than having to mix walrus and standard equals just to do error handling

#

anyhow

austere talon
#

yop

turbid hatch
#

fuck it

#

lets go to C

austere talon
#

tbf if you're panicking anyway you can make an unwrap func

turbid hatch
#
#define yoink malloc
#define yeet free
#

make it a bit spicy

turbid hatch
#

i didnt want to write actual error handling logic here but we probably should

austere talon
#

go really just needs some sugar for returning the error to the caller or handling it in a central place

#

like rusts ?

turbid hatch
#

yeah exactly

#

a lot of go would be resolved if it just had rust's error handling

#

that''s the one thing rust did exquisitely right

austere talon
#

and like

#

go already has default values for all types

turbid hatch
#

apparently go 2 might have try/catch

austere talon
#

so it would be trivial to even auto return tuple errors

#
func thing() (Type, error) {
  i := strconv.Atoi("not a number")? // returns Default(Type), err
}
#

or heck even this would be accpetable

func thing() (Type, error) {
  i, return := strconv.Atoi("not a number") // returns Default(Type), err
}
#

or similar keyword

austere talon
# turbid hatch oh ๐Ÿ™

I HJATE WINDOWS

func getModuleFileName(handle syscall.Handle) (string, error) {
    n := uint32(1024)
    var buf []uint16
    for {
        buf = make([]uint16, n)
        r, err := windows.GetModuleFileName(handle, &buf[0], n)
        if err != nil {
            return "", err
        }
        if r < n {
            break
        }
        // r == n means n not big enough
        n += 1024
    }
    return syscall.UTF16ToString(buf), nil
}

func executable() (string, error) {
    return getModuleFileName(0)
}
#

sanest winapi code

willow garden
#

windows w

#

jk

turbid hatch
#

THIS IS SUCH A STRANGE PROPOSAL

#

I DONT GET WHAT IT IS

willow garden
#

linux on top

turbid hatch
#

f := try(os.Open("..."))

#

but then it seems to randomly set err somehow

#

i dont get it

austere talon
#

kinda based

turbid hatch
#

oh i think it

#

ahhhh

#

okay

#

your function has to return error

#

and it'll set that

#

i think

austere talon
#

thanks wasm target

turbid hatch
#

and early return if what you're doing fails

#

wasm

willow garden
#

windows bad

#

we need to delete windows entirely

turbid hatch
#

also the idea that a path name > 1024 bytes terrifies me

#

i know its possible but

#

the ntfs default limit is 260

#

(reasoning: actual path is 256 bytes max, but it needs to allow room for \\?\ so there's an extra 4 bytes tacked on)

#

(or something like that, i dont remember)

#

anyway im going to sleep

#

my head hurts

wanton wasp
charred monolithBOT
charred monolithBOT
charred monolithBOT
#

@Vendicated yeah, that's unfortunately very true. Do you think is there any way to leverage the VAAPI codecs already present in FlatHub? If you tap into those builds you should be able to have a fast video rendering with HW acceleration no? To give an idea this package has the full support for hardware rendering.

org.freedesktop.Platform.ffmpeg-full

This would be the best way to fix screen sharing using any discord client on Linux until Discord fixes it themselves.

Someone was ...

charred monolithBOT
charred monolithBOT
charred monolithBOT
still wasp
#

is there a way to add headers to organise settings in a plugin? say if theres alot of configurable values and you wanna divide them into different categories

charred monolithBOT
charred monolithBOT
charred monolithBOT
livid heath
#

just add h{1|2|3|4|5|6} tags

austere talon
#

oh do you mean in the settings page

still wasp
austere talon
#

no there isn't

still wasp
#

damn alr yeah

austere talon
#

you'd need to use settings type custom and write ur own ui

still wasp
#

do you mean with the Component option type?

austere talon
#

we could probably add it

#
definePluginSettings({
    "My Cool Section": {
          .... 
    }
})
still wasp
#

that would be useful tbh

austere talon
#

but also if your plugin has this many settings, chances are you have too many

still wasp
#

im converting my theme into a custom plugin to allow configuration, so theres a ton of color options and things like that

turbid hatch
#

i would just wait for usercss to be merged

#

and define your configuration options as usercss variables

#

that would be the better choice

#

usercss is not that far off tbh

charred monolithBOT
turbid hatch
#

i did it again

charred monolithBOT
turbid hatch
#

what

#

well anyway

verbal pumice
#

merge commit jumpscare

turbid hatch
#

yeah for some reason the merges for usercss are completely fucked

#

you have to manually merge anything that edits the theme tab

#

i dont know why

surreal fiber
#

69 commits, nice

charred monolithBOT
turbid hatch
#

but even in the vscode conflict editor its like

#

broken

#

it says the base commit is completely blank and comes from 4 different branches or something

#

idk why

#

but usercss really needs to be like

#

looked at xd

#

i am unsure of what else to do with it and the longer it remains open the harder it becomes to work on themes and stuff

#

since its a huge change to how the system works and people already really want to use it

charred monolithBOT
#

In my case, it reloads everything upon gaining focus without any loading animations, simply all nicknames in the chat turn white for a brief moment, and I also stop receiving notifications until I pull discord back into focus. This happens only when I launch any game, and the only way to return the normal behavior is to restart Vesktop.

The only workaround I'm testing right now is to disable Game Mode (Win + I > Gaming > Game Mode), it seems to mitigate the issue for now. Try this out.

turbid hatch
#

so anyway if you want to test usercss

#

please do

#

and report bugs

#

kthx

charred monolithBOT
still wasp
#

i mean, eh, im not really bothered about usercss. Id prefer to have more control anyway

turbid hatch
#

just fyi you wont be able to get it in mainline vencord

#

we dont allow plugins that are just themes

#

also idk what extra control you get by making it a plugin instead of a usercss theme xd

thick kestrel
#

yeah if you aren't satisfied by CSS preprocessing then what are you even doing

#

fyi you can use CSS preprocessors anyways

#

you just need to get users to build your theme instead of just copy-pasting a link

#

@turbid hatch I love what you are doing btw

#

can't wait

turbid hatch
#

hmm?

#

o with usercss?

thick kestrel
#

yes

turbid hatch
#

aha, hope you enjoy it when it comes out for realsies

charred monolithBOT
still wasp
#

i dont want to :3

turbid hatch
#

alrighty

slim marsh
#

oh nvm theyre talking about waking windows up from sleep

turbid hatch
#

they're also talking about game mode

#

which throws things into efficiency mode and the like

#

which can cause things to go kaboom

slim marsh
#

yeah makes sense

#

got confused for a sec

turbid hatch
#

it seems like electron going into efficiency mode will cause it to pause websocket connections

#

so

slim marsh
#

does anyone even use game mode lmao

turbid hatch
#

i do

#

it does help a little

#

but honestly ive never had the issue they're experiencing

#

so i dont know what it is

slim marsh
#

oh shit im using it

#

i think i mistook it for uh

#

the xbox thing

turbid hatch
#

yeah its on by default

#

it prevents windows update from doing shit in the background whilst you're playing a game and lowers system process priority

#

its actually quite nice

slim marsh
#

yeah sounds pretty cool actually i mistook it for the game bar i think

turbid hatch
#

game bar is required for amd drivers though so

#

๐Ÿฅด

slim marsh
#

huh

turbid hatch
#

(the drivers, for some only known to god reason, require game bar to be enabled if you want it to optimize correctly)

#

(like moving game processes onto the more efficient dies for the 7950x3d)

slim marsh
#

doesnt game bar actually hurt performance

#

thats funny

turbid hatch
#

its

#

questionabl

charred monolithBOT
charred monolithBOT
charred monolithBOT
#

Content

Today one of my friends got deleted and in the notification name was something like queued for deletion. I dont know who it is and I am really curious who that person was.
One of the ways to fix this is maybe save the channel id and name so that it will show the last saved info if it cant find it.
Also I checked the logs and RelationshipNotifier source code and in the console log one of the [UserProfileModalActionCreators] functions gave a error 50001 warning after failing to...

still wasp
#

google that plugin :3

#

because i was tired of manually doing it lmao

slim marsh
#

spaces in slash cmd

still wasp
slim marsh
#

cursed

still wasp
#

fair enough lmao

#

fixed it

slim marsh
#

having lmgtfy as an alias might make sense too

still wasp
#

oh yeah thats probably a better idea

charred monolithBOT
dapper crest
#

I would have Google as an alias

slim marsh
#

that makes a lot of sense yeah lol

still wasp
dapper crest
#

I don't see why not you couldn't

#

Even if there is no built-in way to do that, just build a helper function that the commands point to

still wasp
#

was just wondering if theres a built in way for it

dapper crest
#

I haven't looked into making commands with vencord, you would know better than me

charred monolithBOT
still wasp
dapper crest
#

The fastest I learned about plugin dev was when my PR finally got reviewed and they pointed out 9 million ways I could do things better

still wasp
#

welp time to upload a purposefully terrible plugin to get free tech support trollf

keen grail
#

hello question is there a way to add custom plugins to vencord?

still wasp
austere talon
#

NEWLEAF

#

SJSJSJSKSNSJDJSJAKSMXNDNKSSKSK

austere talon
#

rule 5 @slim marsh

median rapids
#

yea don't do this it can get you termed :)

half notch
#

bug with canary i think, dx12 games cant be screenshared

#

why did i type this like yoda