#🧩-plugin-development

1 messages · Page 88 of 1

tacit locust
#

clicking on a message?

silk sorrel
#

it immediately updates the message component if it's currently rendered on screen
if that wasn't a forced behavior, you would have to click away or interact with the message to trigger a rerender

warm elk
#

Hey! I'm currently working on an EditUsers plugin for Vencord (ported from BetterDiscord) and I'm looking for testers.

obsidian shell
#

you don’t need to go to DMs or anything

tacit locust
#

Is there any way to edit the content of messages on screen?

#

For example by taking the actual text of the message and scrambling with words or something

#

The actual operation on the words don't matter just the ability to read them and change the text shown

tacit locust
#

not to be pushy but i would like if someone available could answer :)

tacit locust
#

oh amazing

#

how's it done?

quick zephyr
#

find: "!1,hideSimpleEmbedContent",

#

you want to patch c

#

c is the message content

tacit locust
#

where is this in the api?

quick zephyr
#

you have some reading to do if you dont understand

#

it's the find for a patch

#

search up patches

humble tulip
#

the reading is pins btw

#

The top pin has a guide that's kinda outdated in terms of its specific example but the concept is still valid

tacit locust
quick zephyr
#

you can look through all the current plugins to see how patches work

verbal granite
quick zephyr
#

you're writing regex to match the minified code and replace it

verbal granite
#

ofcofc, but how do you find the minified code in the first place, cus ive been having a tough time with that ;-;

#

wait theres a video omagah

tacit locust
verbal granite
tacit locust
#

danke

verbal granite
#

Bitteschöönn :3

quick zephyr
#
  1. Go to settings
  2. Enable react inspector
  3. Full restart Discord. Tray > Quit
  4. Launch Discord
  5. Reload Discord (ctrl + r)
  6. Now that it is installed, every time you full restart Discord, you will need to reload after. It only attaches after a reload.
  7. ctrl + shift + i -> component inspector
tacit locust
#

jesus that looks like a maze

#

how are you supposed to find anything

verbal granite
tacit locust
#

i know lol

#

butt i'd like to make other stuff in the fututr

quick zephyr
#

break points, inspecting multiple layers in the hierarchy, and using Sadan's dev companion in vscode which actually lets you go through the call chain for patches and finds

tacit locust
#

oh nice

#

thanks!

quick zephyr
humble tulip
#

You also just get more familiar with it over time and it becomes less of a maze

#

Sometimes it's still a maze though

tacit locust
#

weird

humble tulip
#

Searching for the css classes on the component you want to patch can be a good way of finding things too

tacit locust
#

i followed all the steps but all i got was this

humble tulip
#

For react dev tools?

#

You'll need to full restart discord and then also ctrl+r reload for it to show up

tacit locust
#

i did that

quick zephyr
#

you probably didnt actually fully close discord

#

you probably just clicked X and it minimized to tray

tacit locust
#

nope i fully closed it

quick zephyr
#

you need a dev build

#

pnpm build --dev
or
pnpm watch --dev

tacit locust
#

ah.

#

that did the trick

#

thanks

humble tulip
quick zephyr
#

ah I dont ever use watch lol

humble tulip
#

Me neither lol

#

Build and Reload my beloved

quick zephyr
#

up arrow + enter + ctrl-r my beloved

silk sorrel
#

do you guys not actually use watch 😭

quick zephyr
#

watch is insane behavior

#

I don't want the mf tweaking at every character I mistype

#

like let me do my thing and reload on my own terms

#

thank you very much

silk sorrel
#

watch is so goated cuz I just hit ctrl S and reload discord

#

also using jetbrains for vencord is something I had not ever even considered

humble tulip
#

Does vscode save whenever you click off the file?

#

IDEA does and I don't want it reloading every time I do that lol

#

But I do like the autosave

silk sorrel
tacit locust
#

i feel like i'm missing something really obvious lol

#

same goes for my custom plugin, putting it in a folder and renaming the file index.tsx doesn't make it show up

#

this is a really elementary question i know but i'm following the instructions exactly

silk sorrel
#

are you using vesktop or vencord

tacit locust
#

vencord

quick zephyr
#

how is your folder named userDevTools

#

if you cloned off the repo I sent it should be named vc-userDevTools

tacit locust
#

i renamed it from vc-userDevTools

silk sorrel
#

idk what the instructions are but try running pnpm run inject ig

tacit locust
#

i did that lol but i'll try again

tacit locust
tacit locust
quick zephyr
#

did you actually git clone vencord or are you just trying to do this in the vencord folder created by a normal install

tacit locust
#

i did git clone vencord

tacit locust
silk sorrel
#

wtf

tacit locust
#

oh so i'm not dumb lovely

#

love it when it's not my fault

quick zephyr
#

this is most likely your fault somehow

#

just not sure how

tacit locust
#

Yeah probably lol

quick zephyr
#

you rebuild in dev and reload?

tacit locust
#

Yep

humble tulip
#

You're not using any relative paths for imports or anything that are broken by introducing a folder?

#

I feel like that'd still appear but error anyway but I dunno what else to think

tacit locust
#

And no errors are thrown in console from what I can see

quick zephyr
#

why would devcompanion not be showing up tho

humble tulip
#

Surely the only other thing could be the build script not checking subfolders in userplugins

quick zephyr
#

if you didnt name it userplugins but some weird unicode abomination

#

zws hiddin within

tacit locust
quick zephyr
tacit locust
#

no theres the types folder with stuff in it too

quick zephyr
#

guess it wasnt made to be

tacit locust
#

Could it be a system error?

#

I'm running Linux mint

quick zephyr
#

im on cachy

#

no errors in console?

#

make sure it isnt filtering or searching anything

tacit locust
#

Nothing out of the ordinary

#

hang on i think this second one is new

#

i don't think thats it tho

#

no vencord errors

humble tulip
#

If you launch discord from command line does anything stand out in there? There's logs from the native process in that one too

#

It's harder to read though, kinda spammy

tacit locust
#

not sure how to do that lul lemme figure it out

#

nope nothing in particular

#

wait does this mean anything?

humble tulip
#

I don't get that line on windows but I also don't think it's from vencord so suffoPeepoShrug

#

I think you're just not allowed to make plugins

tacit locust
normal wagon
#

show ur index.tsx

quick zephyr
#

cause it's not working

humble tulip
#

I'm just joking

normal wagon
#

u probably messed up define

quick zephyr
#

oma

#

you need to backread before talking

#

it's not even working for a git clone of sadan's dev companion

normal wagon
#

😭 he's probably building it to the wrong dir i bet

tacit locust
#

She

#

And I haven't done anything but run pnpm build --dev and pnpm install

#

And as I say

#

My custom plugin works fine when it's not in a folder

normal wagon
tacit locust
#

Index.tsx

normal wagon
#

and no build errors interesting and murphy mentioned how even sadan's dev companion is not working

tacit locust
#

Yes.

normal wagon
#

what about the actual folder where u have that all placed

#

is it named "userplugins" within the src?

normal wagon
#

vencord > src > userplugins

#

interesting

quick zephyr
#

where did you clone vencord to

#

this some sort of permission issue?

humble tulip
#

Do you have any empty folders in your userplugins folder?

#

I remember that caused an issue in the past

#

Or maybe it was an empty index.ts in there, something like that

tacit locust
tacit locust
humble tulip
#

You'd see it error at build anyway

#

Dunno, I'm stumped

tacit locust
#

I'll try putting it inside plugins instead of userplugins

tacit locust
#

what the fuck

#

i only put dev companion in plugins but both of them now work??????

humble tulip
#

That dev companion is the regular one that appears when you build with --dev unless you renamed it

tacit locust
#

userdevcompanion is also enabled

humble tulip
#

Sick

tacit locust
#

but seriously

#

what the fuck

#

i moved it back into userplugins and it now magically works

tacit locust
#

i'm struggling to understand what /i does in the regex?

#

or actually this entire chunk of the regex in the example

tropic ice
#

oh wow they changed the look

#

and backend apparently

humble tulip
#

Yeah \i just matches variable names, so by doing something like src:\i.url to match src:xj.url, you avoid the match breaking if Discord's minifier decides to change it to src:ey.url

tropic ice
#

ok found what it converts to

#

that should probably be pinned

tacit locust
#

why does it need the greedy expression?

quick zephyr
tacit locust
#

the {0,400}

quick zephyr
#

wheres that

quick zephyr
#

can I see full line?

#

context matters

tacit locust
quick zephyr
#

so after src:<variable> there's 400 characters or less of stuff we don't care about and that manually matching would be a nightmare for long term maintainability. but we need stuff on both sides of the 400 characters but dont care whats in the middle so we just say "anything up to 400" and we cap it at some number close to the actual number of characters so it doesnt accidentally match something too far

tacit locust
#

ohhh

#

and why does it match that arbitrary string in the code block?

quick zephyr
#

wdym

#

are you asking why \i matches <variable>?

tacit locust
#

here is the referenced code block. why does it match for primaryEmoji, src:\i when the code they want to patch is fourish lines below?

quick zephyr
#

cause they are capturing the variable src:(<variable>) now <variable> is usable in the replacement as $1

#

the .primaryEmoji, is to anchor it to that instance of src: because src: is a very common occurrence in code

tacit locust
#

ohh that' so interesting

quick zephyr
#

did you truncate the code there or is that how it looks

#

cause if thats how it looks the 400 is way too much imo lol

tacit locust
#

so the idea is to bring the src variable down to that code section

#

am reading this

quick zephyr
#

ok they probably truncated it for the example yeah

tacit locust
#

but they're adding a thing instead of replacing it

tacit locust
#

what if i want to make $1 be something that isn't in the code block?

quick zephyr
#

the $& means "everything the match matches regardless of capture groups"

quick zephyr
tacit locust
#

capture it how?

quick zephyr
#

exploring existing plugin patches with dev companion would be helpful

tacit locust
#

sorry about all the questions i've never written regex before

#

will do

#

ah

quick zephyr
#

(capture and overwrite)
(?:dont capture but group this in the regex and overwrite it)
(?<=dont capture and put the replacement after this group, not overwriting it)
(?=dont capture and put the replacement before this group, not overwriting it)

tacit locust
#

thanks for the help!

tacit locust
quick zephyr
#

from my own code

#

it was a nightmare to find when I was originally doing it

tacit locust
#

ohh

tacit locust
#

i can't find the whole code snippet and there's nothing distinctive in the screenshot to match

quick zephyr
#

!1,hideSimpleEmbedContent is the unique bit

#

1 result

quick zephyr
#

top/bottom dont count, 2nd is the modified version of the 3rd

tacit locust
quick zephyr
#

embeds will still render so you'd need to handle that differently if that matters

tacit locust
#

not for now thanks

tacit locust
#

the function i call in my patch needs to be async because it calls a function that returns a promise, but when i make it async discord shoots itself in the head, what am i supposed to do?

#

can i make an async patch??

vast karma
#

Not without also patching everything that calls it, and everything that calls that

#

So practically, no

tacit locust
#

fuck

#

is there a workaround?

vast karma
#

Depends on what you need the async for

#

If it's in a react component, use a hook

tacit locust
#

waiting on a promise to be fulfilled

vast karma
#

That tells absolutely nothing y'know

tacit locust
#

good point lol

vast karma
#

You want to use async to do async, oh my

tacit locust
#

i'm waiting on the decrypt function from subtle crypto

#

which returns an arraybuffer promise as previously stated

vast karma
#

Wat, why would decryption be async

#

Webworker or something?

tacit locust
#

prolly just cuz it takes time to decrypt stuff

#

i don't know how it works under the hood lol

quick zephyr
#

you tryna encrypt messages? lol

vapid oar
tacit locust
vapid oar
#

but yea it really depends on what you're trying to do

tacit locust
#

Encryption is all done

quick zephyr
#

why

tacit locust
#

Why not?

quick zephyr
#

is it for actual protection or protection against normies. cause anyone with half a brain and access to your pc could just type ctrl+shift+i and type the code to fetch the message you're visually hiding in the chat

tacit locust
#

no the message is encrypted before it's sent

quick zephyr
#

ah

#

so you just dont want discord to see it

#

sus

#

or anyone else I guess

#

other than receiver

tacit locust
#

it's the same way whatsapp group chats work lmao

#

how is that sus

#

it just seemed like a fun project and i'm not sure i like what you're insinuating

tacit locust
vast karma
#

Just use a platform with builtin encryption tbh, rather than shoehorning it into one that doesn't

tacit locust
#

i'm not expecting to get genuine security out of this

verbal granite
normal wagon
#

both users have to have the plugin

humble tulip
#

Doesn't hurt to make it yourself as a learning excercise

normal wagon
#

well honestly it's really not that difficult at all

#

intercepting received, and sent encryption / decryption depending on author and having a context menu patch on user to enable that

#

i just don't see the use case in this mainly because the other author you're sending / receiving from has to have the plugin enabled also

tacit locust
#

Can I not just do a thing for the sake of doing it?

tacit locust
#

Why would I do something harder

#

This is plenty difficult for me

normal wagon
normal wagon
verbal granite
tacit locust
#

what is classname needed for?

vapid oar
tacit locust
#

what does that mean?

vapid oar
#

custom css classes

tacit locust
#

ahh

vapid oar
#

react uses className because class is a reserved js keyword

tacit locust
#

got it

#

i hate css brave

#

fuck this modal stuff is so complicated

tacit locust
#

got it working!

#

where on earth is this variable defined???

#

i can't find it anywhere

verbal granite
# tacit locust where on earth is this variable defined???

Isnt that not just some styling property? I looked it up, stack overflow says this

HTML uses color whereas SVG uses fill and stroke. You can get fill or stroke to use the value of the color CSS property by using the value currentColor e.g. fill="currentColor"

tacit locust
#

that would make sense but the translate icon turns green once enabled

#

so something must be changing it

verbal granite
#

I think the currentColor value sets the color of the path to the color css attribute. So maybe check there?

tacit locust
#

ah that would make sense

#

found it

verbal granite
quick zephyr
#

if anyone could send this in console and lmk what it says for you that'd be great.
more people the merrier.

await Vencord.Webpack.Common.RestAPI.get({
    url: "/quests/@me"
}).then(r => r.body.quests[0].traffic_metadata_raw)
tropic ice
#

EAE=

quick zephyr
#

bro is E 💔

tropic ice
#

what does it mean

quick zephyr
#

trying to figure that out. running theory is rollout order for new quests. idk though

tropic ice
marble sable
#

what is the proper way to see if a plugin idea would be likely to be accepted? CONTRIBUTING.md says to open a request and say you want to work on it but requests are closed now

quick zephyr
#

cause gemini said so

marble sable
quick zephyr
#

idk how it got E to 4

#

insane

#

this was 3 pro model too

#

none of my alts are EAE smh

#

testing if it's rollout order is gonna be annoying

tropic ice
#

what isn't it 16 01

marble sable
tropic ice
#

oh in hex

#

mine's in decimal

marble sable
#

ah

marble sable
#

i'd use it anyway

tropic ice
#

you could say what it is here

marble sable
#

would add giphy alongside tenor for gifs

tropic ice
#

that way if it already exists or something, someone can say

tropic ice
marble sable
#

really

tropic ice
#

dev://experiment/2025-10-gif-providers-multi-treatment

marble sable
#

yeah i see

#

cool

tropic ice
#

giphy is 1, klipy is 2

#

according to some random person in discord previews

marble sable
#

they're right

bronze cosmos
#

Hello, is anyone familiar with the process of patching the router component(s) and/or rendering a component on a 'custom' route?

I have reviewed many brief discussions on the topic in this server, including dated examples and resources.

If anyone has a current working example or preferably resources for learning how to investigate discord's code to find what I am looking for and patch it, that would be appreciated.

vital tree
inner monolith
#

Would vencord accept a plugin that rewrites the entirety of the discord audio stack to increase quality?

#

I've written up one that uses ffmpeg for encoding/decoding and it matches the original audio much closer

#

before

#

white line = original audio

#

red line = recieved audio

#

(tested through a loopback on two clients, one unmodified, one with the custom voice stack)

#

audio is sent through the custom stack and recieved through the default client

#

also, i discovered that audio loudness is decreased by exactly 6db at discords end

#

boosting it by 6db before sending cancels the offset

#

I'm aware there used to be issues with some plugins that enable stereo and such which never got accepted into vencord

inner monolith
#

this is with the default audio artificially boosted by 6db

viscid marsh
tropic ice
viscid marsh
#

that's what it feels like lmao

valid portal
#

Right so, I think I've taken things too far.

valid portal
#

maybe we have.

tropic ice
valid portal
#

u right

broken storm
vapid oar
valid portal
obsidian shell
valid portal
#

uhhh have you ever wanted to render graphs and make complex algebraic equations in a discord command palette?

#

no? well now you can

granite dune
dull magnet
#

why are we making DiscordOS

valid portal
#

yes

iron epoch
signal goblet
#

I actually dont know why he thinks im gonna approve this

valid portal
#

oh ur gonna

obsidian shell
#

Equicord has ten times more useless plugins

signal goblet
#

just add geforce now atp

obsidian shell
#

add it as hidden true so you can say equicord runs doom

signal goblet
#

discord running doom before gta 6

viscid marsh
#

Coming back to working on a new plugin after a few months.. when I have the plugin included in the build and inject, every patch errors on start with the same error and Vencord fails to initialize - any ideas what it could be that's causing it?

dull magnet
#

update ur vencord

viscid marsh
#

I'm pretty sure my branch is up to date

#

is 12da7a08fbbfe118ffdb293488745cc991c1c8a6 the latest commit? bump to 1.14.3?

#

for clarity, if I remove my two plugin files and build and inject, it works, adding the two plugin files back in and I get all those errors and Vencord doesn't initialize

viscid marsh
#

ah that did end up being it, weird I swear I didn't see any new commits

#

vscode being buggy as usual 😔

broken storm
#

Vencord: v1.14.1 • af708b4 (Dev) - 4 Mar 2026
Client: stable ~ Vesktop v1.6.5
Platform: MacIntel
⚠️ Vencord DevBuild

#

Oh yeah then 1.14.3 should be decently up to date, mine's a couple months old

sharp crane
prisma imp
#

hi, what is the canonical way to get into a bundle? I want to see what the datastructre is for dave voice packets is as they get parsed

viscid marsh
#

dumb question, how would I know what fields are valid for embeds? I tried setting author.url, but apparently that's not valid. I'm just going off of what messageLinkEmbeds uses, const Embed = findComponentLazy(m => m.prototype?.renderSuppressButton);

humble tulip
#

I'd just use ViewRaw on a message with an embed in it

#

Oh the component

#

Then I guess react dev tools on an embed or use that find and see what the component it finds uses in its code

#

Places like this where it destructures props are your best bet

humble tulip
viscid marsh
#

I could never figure out how to get React DevTools to show up for me lol - I see it in %appdata%\Vencord\ExtensionCache, do I still need to create an extensions folder and put it in there like for BetterDiscord?

#

(obviously I have it enabled in the Vencord settings)

humble tulip
#

You also have to ctrl+r discord after fully restarting for it to appear, if you've done that I guess delete the folder in extensioncache and let it try again?

viscid marsh
#

I'll try the latter

#

nop

#

skill issue ig ¯_(ツ)_/¯

#

let me try on vanilla vencord

#

still no lol wtf

#

I don't need to be in dev mode or whatever, do I?

quick zephyr
#

yes

viscid marsh
#

I get no errors, devcompanion starts up correctly... surely I'm just doing something wrong here? would it not work on canary for some reason?

#

nothing on stable ArsSad

quick zephyr
#
  1. pnpm build --dev
  2. Tray > Right Click Discord > Quit
  3. Launch Discord
  4. ctrl + r in Discord once launched
viscid marsh
#

reading docs is hard.... it wasn't working with pnpm build --watch

#

sigh thanks

quick zephyr
#

isnt the watch command pnpm watch

#

which implictly uses --dev

viscid marsh
#

uhhh

#

To use it you also need to compile Vencord with DEV (aka pnpm build --watch or pnpm buildWeb --watch) and enable the "DevCompanion" plugin. Then just start Discord

prisma imp
#

hi, i want to analyze how the discord client responds to a given RPC command; is there a way to dig into the webpacks of the native side like you can on the browser side

#

im familiar with electron's structure but not how to debug the other runtime

prisma imp
#

alright i got it (thanks to @modern cave), does anybody know of a module that I can use to get a list of current users in the current voice session

quick zephyr
prisma imp
#

i was planning on just hooking whenever a user joined and then querying the channel but I have a better idea I'm just going to patch

quick zephyr
#

Stores.VoiceStateStore.getVoiceStatesForChannel(Stores.VoiceStateStore.getCurrentClientVoiceChannelId())

#

patch what

prisma imp
#

createUser on the type with the first couple lines


            class O extends f.A {
                mediaEngineConnectionId = `Native-${N++}`;
                goLiveSourceIdentifier;
                selfVideo = !1;
                codecs = [];
                videoEncoderFallbackPending = !1;
                videoDecoderFallbackSent = new Set;
                desktopDegradationPreference = (0,
                g.lE)().DegradationPreference.MAINTAIN_FRAMERATE;
#

although I'm not quite sure how I could select for a patch

quick zephyr
#

why are you patching that though

prisma imp
#

oh to run some logic on every user that joins a call

quick zephyr
#

FluxDispatcher

#

then just filter for whatever you need

prisma imp
#

what is FluxDispatcher

#

haven't heard of that type

quick zephyr
#

every time something happens an event is sent out

#

thats how you listen for or send out events

prisma imp
#

could you send any documentation/sample code regarding that? i believe you're right that it would be a better idea to listen there instead of patching the type i found before

quick zephyr
#

VcNarrator looks like it listens for voice states

#

use that as an example

prisma imp
#

gotcha

#

this is separate but is r.A in this line a module?

                    if (null != n && r.A.setLocalPan(t, n.left, n.right),

i haven't looked at much expanded webpack code so I'm not familiar with the codegen for accessing modules looks like

quick zephyr
prisma imp
#
          , r = n(827343)
quick zephyr
prisma imp
#

is n maybe the generated require?

prisma imp
# quick zephyr

how do you get findByProps in the console's scope btw I tried to do it with the esModule import but that didn't work

#

just a cjs require?

quick zephyr
#

Vencord.Webpack.find<thing> or enable console shortcuts plugin

prisma imp
#

alr i did the latter i got it now

#

thanks

#

i noticed that in the dev array it was bigints for the snowflakes instead of strings; are userIds normally stored as BigInts?

quick zephyr
#

discord only ever provides snowflakes as strings

#

vencord just uses bigints for the dev array

prisma imp
#

makes sense

quick zephyr
#

take it up with V Shrug

prisma imp
#

alright thanks you've been a huge help

#

i think i get the flux structure now

quick zephyr
#

you can inspect events in-client in here

prisma imp
#

i noticed that a while ago when poking around good to know it's the same system

#

does findByPropsLazy have a significant profile? i.e should I hold onto the result or is it performant to call repeatedly

quick zephyr
#

uh it'll just wait til you use the object for the first time to resolve it

prisma imp
#

oh i see

quick zephyr
#

so you can define StoreName = findByPropsLazy("function") and it wont try to resolve it on boot just when you first use it

#

then it'll never look it up again for that session

quick zephyr
#

yeah

prisma imp
#

i was under the impression it needed to be called at runtime didn't realize that it wrapped the return value with a lazy getter

#

that's much more ergonomic

hushed loom
#

for the most part you should avoid findByProps and use findByCode

quick zephyr
#

findByProps my goat tho

#

you know what broke when QuestsStore became QuestStore? findStore("QuestsStore")

#

you know what didnt? findByPropsLazy("claimedQuests");

prisma imp
#

at least for the module I'm targeting it's had setLocalPan and setLocalVolume exposed since at least 2021

#

so I don't think it's going anywhere

#

(i'm porting an older plugin)

quick zephyr
# hushed loom for the most part you should avoid findByProps and use findByCode

horror?

const findDefaultSounds = findLazy(module => module.resolve && module.id && module.keys().some(key => key.endsWith(".mp3")), false);
...
    defaultSounds ??= (findDefaultSounds.keys() || []).map(key => {
        const match = key.match(/((?:\w|-)+)\.mp3$/);
        return match ? match[1] : null;
    }).filter(Boolean) as string[];
prisma imp
#

ah the setLocalPan/getLocalPan updates internal state but the internal state doesn't actually influence the media mixing

#

shaaaame

#

so this RPC method must just not work ebcause I'm using the same mechanism

#

i confirmed that I was actually writing it with getLocalPan

#

i guess i just have to patch back in panning

#

does anybody know how to get the current MediaEngine? (or rather, the methodology i should use to identify some internal tooling that would help me identify the method that could get me the current instance of MediaEngine)

quick zephyr
prisma imp
#

sounds right

#

oh weird actually

#

im in Vesktop and it initalized MediaEngineWebRTC

#

shouldn't it initalize MediaEngineNative?

#

i'm not sure how it chooses

prisma imp
#

tried it on an inject and even there with a MediaEngineNative it doesn't work

#

sad

#

if anybody here has messed with MediaEngineNative before and would know where to start with manipulating the mixer please ping me

hushed loom
#

why not use Obejct.Keys

quick zephyr
#

good thing they dont

quick zephyr
hushed loom
quick zephyr
#

thats how they all do it

#

2318 modules with keys

#

well actually only 8 do it like that

#

all 2318 with a keys export though are non null

#

all with a .resolve and .id do do it that way

bleak falcon
#

Any idea how to fix this? tried using a native.ts with a simple fetch in it but doesn't work either

#

Should i use a proxy ?

#

From

async function uploadWithProgress(uiId: string, file: File, partNum: number, totalParts: number): Promise<string> {
    const serverRes = await fetch("https://api.gofile.io/servers", { method: "GET" });
    const serverData = await serverRes.json();
    const server = serverData.data.servers[0].name;
    // const server = "store-eu-par-7"

    return new Promise((resolve, reject) => {
        const session = activeSessions.get(uiId);
        if (session?.cancelled) return reject(new Error("Cancelled"));

        const xhr = new XMLHttpRequest();
        if (session) session.xhr = xhr;

        const form = new FormData();
        form.append("file", file);

        let lastPercent = -1;

        xhr.upload.addEventListener("progress", (e) => {
            if (session?.cancelled) return xhr.abort();
            if (e.lengthComputable) {
                const percent = Math.round((e.loaded / e.total) * 100);
                const overallPercent = totalParts > 1 
                    ? Math.round(((partNum - 1) / totalParts) * 100 + (percent / totalParts))
                    : percent;

                if (overallPercent !== lastPercent) {
                    ProgressUI.update(uiId, overallPercent);
                    lastPercent = overallPercent;
                }
            }
        });

        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4) {
                if (session?.cancelled) return reject(new Error("Cancelled"));
                if (xhr.status === 200) resolve(JSON.parse(xhr.responseText).data.downloadPage);
                else reject(new Error(`Gofile Status ${xhr.status}`));
            }
        };

        xhr.onerror = () => reject(new Error("Network Error"));
        xhr.onabort = () => reject(new Error("Cancelled"));

        xhr.open("POST", `https://${server}.gofile.io/contents/uploadfile`);
        xhr.send(form);
    });
}
#

-# 3rd line fails too

tacit locust
#

how do i store data permanently?

#

without being directly editable by the user in settings

normal wagon
tacit locust
#

thanks!

#

where do i find that so i don't have to go digging around lol

#

found it :3

dull magnet
#

if its big data, DataStore

tacit locust
#

how come there's a difference?

obsidian shell
tacit locust
#

ah, amazing

dull magnet
#

and has tight storage limit in both cloud sync and browsers

tacit locust
#

ah, what's the limit?

dull magnet
#

no consistent limit

#

<5mb

tacit locust
#

5mb??

#

epic

#

thats way more than enough

broken storm
#

“I ran doom in vencord’s cloud storage API”

tacit locust
#

so i can have settings that don't show up in the settings bit of the plugin

valid portal
quick zephyr
#

technically mutable by the user through console but probably wont be

tacit locust
#

okay yeah that makes more sense.

#

thank you

broken storm
inner monolith
tacit locust
#

how come typing only shows up in TextInput if i set the value to a setting?

tacit locust
#

wait hang on

#

i figured it out lol

#

is there any way to do a text input in a modal that doesn't update per-letter typed and instead all at once, like with a "submit" button?

tacit locust
#

because i want to run a function on the completed text and running it every time a new character is input or deleted is a waste of resources and would cause lag

dull magnet
#

what does the function do

tacit locust
#

PBKDF2

#

which is a fairly resource-intensive function

dull magnet
#

why tf are u implementing crypto in discord 😭

tacit locust
#

because i want to

tacit locust
#

what do i do instead?

dull magnet
#
const [input, setInput] = useState("");

const onSubmit = () => {
    doSomething(input);
}

return (
    <div>
        <TextInput value={input} onChange={setInput} />
        <Button onClick={onSubmit}>Submit</Button>
    </div>
);
tacit locust
#

ah, awesome

dull magnet
#

you can also use a normal html form with proper submit button and onSubmit handler
or a ref

tacit locust
#

that's exactly what i'm looking for

dull magnet
#

but state gives u more control

tacit locust
#

i've never used react so i wouldn't have figured that out

#

thanks

dull magnet
#

there are plenty of react beginner courses online

#

might be advisable to do one to familiarise urself with it better first

tacit locust
#

will do

dull magnet
#

well if you just want to make a simple plugin u should be fine probably

#

but something like Vencord isn't the best environment to learn React haha

broken storm
#

Ah! Web dev jumpscare /j

obsidian shell
#

back when i didn’t know about predicates i would display: show ? "block" : "none"

verbal granite
#

Hey yall, what's considered to be a substantial contribution? I did a minor bug fix to the Translate plugin but idk if that's enough to add myself as a dev. Would be nice to get sum insight ^^

tacit locust
#

this is a bit of a dumb question but

#

how do i reset all the settings for my plugin?

#

idk where the file is lmao

verbal granite
tacit locust
#

no but like a full reset

vast karma
tacit locust
#

#TOTALSETTINGSDEATH

vast karma
#

Should be a storage tab in devtools

tacit locust
#

cheers

humble tulip
#

Changing the plugin name is also a quick way to get fresh settings just for testing

dull magnet
quaint cipher
#

fetch from native would work and you can also force add the domain to the csp rules from native
*but idk if the latter is a good approach

#

there's also vencord api to request adding to csp but I don't like the prompt

plush estuary
#

hey everyone, needed some help with radio buttons not showing that its selected when i select an option until i hover over another option or just re-open the submenu
the purpose of the plugin is to stay a certain status until you join a VC
i also tried to convert it into a react component but was hit with this error: Error: Menu API only allows Items and groups of Items as children.

the code: https://pastes.dev/Yg7KUHuDJy

also tried asking gemini (yeah i know no ai slop and stuff but i figured if i could solve it myself, yay) and it gave a component solution which failed and then was just adding random ids to the radiobuttongroup so that was no help either

EDIT:
thought this might be needed, when i select an option, it does exactly what it needs to but the UI just doesn't show it as selected until i refresh the menu

quick zephyr
#

Feature addition pretty much. Then it's up to maintainers if the feature was big enough. So no a bugfix isn't really enough. Unless the bug was somehow fundimental enough you had to rewrite a bunch of the plugin. But you said minor bug so probably not.

verbal granite
tacit locust
#

is there anyway to get around settings.store returning a proxy? it's a huge pain as i can't figure out how to unwrap it which i need to do

humble tulip
#

settings.plain

dull magnet
#

bro using webstorm

dull magnet
#

sounds like youre doing something strange

tacit locust
# dull magnet why

Because I'm storing an uint8array in an object in settings and I need the array

dull magnet
#

dont put a u8a in settings

#

use datastore for that

tacit locust
#

I'm storing it in settings so it can be synced with vencloud

dull magnet
tacit locust
#

ohh i didn't know that

#

okay so i convert it to a normal array then back to a uint8?

dull magnet
#

what is this u8a for

#

what data is in it

tacit locust
#

an exported CryptoKey

dull magnet
#

why r u cloud syncing ur encryption key

#

settings are stored in plain text in our database

tacit locust
#

an encrypted* cryptokey

dull magnet
#

encryption keys should be stored locally and per device

#

and settings arent for binary data

#

binary data belongs into datastore

dull magnet
#

you either have a key for your key
or you use a password in which case you dont need a key

tacit locust
#

because i'm going to decrypt it with a local master key

#

and there's different keys for different channels

dull magnet
#

you cant decrypt it without the local key so syncing is pointless

tacit locust
dull magnet
#

You probably want to use a password and derive a key from that via KDF

#

like argon2

humble tulip
tacit locust
#

i am further encrypting that with the master key

dull magnet
#

I dont understand why you need to sync any keys if you use KDF

#

the entire point of KDF is that there is no need to sync keys, you just need password and consistent parameters like iterations + salt

#

so there is nothing to sync other than parameters

#

the user then enters the password and it can derive the key

#

no need to sync any keys

tacit locust
#

so to save the trouble of having to input every channel's key individually on each new device we sync it

dull magnet
#

and the keys are pgp keys for e2ee?

tacit locust
#

no they're AES keys

dull magnet
#

what for

#

It really sounds like you're trying to implement something in a very bad way

And cloud is absolutely not for syncing binary data like encryption keys

tacit locust
dull magnet
#

and what are you encrypting

tacit locust
#

messages

verbal granite
dull magnet
tacit locust
tacit locust
tacit locust
#

that should fix it

verbal granite
#

I think we could get around all the problems by just storing the different keys for the different channels as a Map<string, string>() where the key string is the channel id, and the value string is the base 64 encoded channel key. We could then make a keyStore, turning which wraps this map. the value strings from this map should also not be inside a proxy, since strings are immutable

dull magnet
tacit locust
#

not technically binary data if it's a string :p

verbal granite
tacit locust
#

we could set up a dummy account as a key exchange

verbal granite
#

Tho tbf, for now, its not that bad since keys are only 32 bytes per encrypted channel

#

which gets multiplied by like two if u use base 64

tacit locust
#

or host the key exchange on your website

dull magnet
#

you should simply not try to add encryption to discord

use matrix, signal, xmpp

and just dont sync keys, have per device keys and add additional devices similar to how proper e2ee services like Matrix do it

verbal granite
tacit locust
#

we're not going to push it to the main repo or anything

humble tulip
#

I think there's a MenuControl or something along those lines that lets you put a react component in a MenuItem

quick zephyr
#

what even is a radioitem

#

in relation to a context menu anyways

#

only radio items I know about are these type

humble tulip
#

Probably that

quick zephyr
#

how does that work in a context menu though

#

that doesnt make any sense

humble tulip
#

Right click settings and go to appearance, I'm not on pc atm but I'm pretty sure the light/dark selection is a radio item

quick zephyr
#

insane

#

isnt the fix for this just to use a stateful variable

#
const [currentStatus, setCurrentStatus] = useState(whitelist[id]);

or smthn

proud parrotBOT
quick zephyr
#

bro used React.useState

#

instead of importing from webpack

quick zephyr
#

idk if ive done it for context menus though

humble tulip
silk sorrel
humble tulip
#

suffoPeepoShrug it works

plush estuary
#

yall are goated @quick zephyr @humble tulip worked for me, initally got the same menu api accepts only blah blah error so i converted it into a function and got it done, a snippet for future travellers who run into this:
https://pastes.dev/x7yiUy0Ic0

tacit locust
#

Is there such thing as an offline mode so I can test my plugins and code when I don't have WiFi?

humble tulip
#

Network tab in dev tools can emulate different connection states

tacit locust
#

Doesn't really work when it's stuck on checking for updates

#

Can't open Dev tools I think

#

Oh, no you misunderstood

#

When I actually don't have WiFi lol

humble tulip
#

Gotcha, I thought you meant you wanted to test for when you don't have wifi

#

but in that case, I don't think so, no

#

You can maybe launch discord.exe directly rather than update.exe

#

Assuming windows anyway

tacit locust
#

Oh that's a good idea

#

No way to load a clean server/DM

#

Maybe I should make an offline plugin....

#

That would be pretty cool but I'm nowhere near good enough

humble tulip
#

Yeah I think you'd have to. #🎨-css-snippets message This css snippet reveals the app behind the disconnection screen but I think without anything cached you'd just be looking at infinitely loading chats at best

tacit locust
#

I could make every chat click re-route to a dummy dm

hardy adder
#

is there a way to load images from my file system in a userplugin lol

#

i know im SUPPOSED to upload them to some image hoster but i'd rather not

vast karma
#

Not without natives

humble tulip
#

That or localhost server which is no less work unless you already have it

hardy adder
#

what a hassle lol

hardy adder
#

i have determined it is not possible while contained in a plugin

#

actually i don't know why the vencord:// one works but mine throws a fit about CSP

#

while there's no calls to register a privileged protocol

#

tempted to just allow the vencord one to load any file aga

#

oh there's a bunch of random csp stuff, though idk where it allows vencord:// to do whatever

unkempt kindle
tacit locust
#

I haven't the faintest idea

tacit locust
#

if i have multiple plugins running addMessagePreSendListener for example, how do i ensure that my one runs at the very last?

#

is there a way?

humble tulip
#

I think it registers on plugin start, so you can use StartAt but that's about it

humble tulip
#

And that

dull magnet
#

or use startat yeah

tacit locust
#

ah thanks

hasty moss
#

Hello, i'm having a hard time figuring out how to debug the selectors etc for this popup as it just disapear if i try to use ctrl+shift+c

tropic ice
#

use f8break

#

vp f8break

shrewd tundraBOT
humble tulip
#

You can also click the :hov button in the styles panel and tick this box

hasty moss
humble tulip
#

Doesn't catch everything but it works for that menu for me

hasty moss
#

didn't think of this

#

thanks

humble tulip
#

Plus f8break breaks react dev tools anyway

tropic ice
humble tulip
#

You can't inspect with react dev tools when paused in a breakpoint

tropic ice
#

the 3000 means 3000 ms so 3s

#

oh

humble tulip
#

I know they're not trying to use that right now but still a down side

hasty moss
tropic ice
hasty moss
#

what's the clean way to simulate clicking on the top right search bar, selecting a filter and filtering someone. Rn i'm using fake events etc but i feel like this is the wrong way to approach this. i'm fairly new to react

tropic ice
#

oh wait this is plugin dev

#

i thought this was theme dev

hasty moss
quick zephyr
#

sometimes something random will cause a rerender and you'll have to do it again but oh well

humble tulip
hardy adder
#

what the heck is the custom OptionType and how do i use it axo_bowl

#

oh i get it, it's not actually shown in the settings, it's just for automatic serialization

#

use component if you want a custom button or whatever

hardy adder
#

does stop() get called when you reload/close discord?

#

i would assume it's supposed to but im having issues, doesn't seem to get called

#

oh, i forgot an await husk

#

async/await was a mistake

tall dagger
#

ive been making like, an alt cdn for big files

#

but i didn't figure out the method for file upload

#

so i don't really know what to intercept lol

#

but i got it working basically

storm swan
#

Does anyone know how to inject/add an option into this container to add an new section?

#

I can't find the internal component name or the Webpack module I should target for the injection.

tall dagger
#

i meant on drag and drop

#

like intercepting the actual file upload stuff

#

yk when you normally upload it would still say 10 mbs max

#

but you have my cdn as a little button

#

to click and send any file from it

#

i want to like override discord's behavior to instead use mine if the file is too large

#

which requires interception and stuff and i am very bake-d right now to re-read vencord's src not gonna lie

silk sorrel
#

Sounds like you'd want to patch UploadHandler.promptToUpload (and its sister function, wreq(518960).V, which is in the same module but isn't particularly useful on its own to have a vencord alias)
It gets triggered when you drop a file onto the discord app, and it handles some common file upload errors

tall dagger
#

oh and sorry for

#

the uh

#

3-4 hour

#

late response

#

i tried that already

#

and i patched before discord loaded

#

so i made it wait

#

until it fully loaded

#

but it then completely skipped trying to patch lol

#

and i hated whatever it was doing so i just went off without drag and drop for now

#

it works fine

vital nebula
#

the screenshotter plugin currently actually doesn't screenshot (because I tried and don't know how), but instead opens a model with settings on how to treat the messages (censoring name, pfp, etc) selectable per-user for you to screenshot

tall dagger
#

also

#

sounds like a neat concept but

#

eh idk it just is so easily replaceable by

#

so many metrics

obsidian shell
#

doable with a bot

vital nebula
vital nebula
dull magnet
# vital nebula

this seems kind of niche and like it'd encourage creating spliced screenshots to slander people

vital nebula
#

🤷

#

that's gonna happen regardless

dull magnet
#

I don't think it can be accepted sorry

vital nebula
#

to be able to distinguish it (though not really visually) from actual screenshots

vital nebula
dull magnet
#

the ones I just said

vital nebula
#

as for the niche thing, ~75% of people who I've shown this (like... 30?) would use it

#

as for the other thing, yeah, idk, that'll happen anyways, I don't think it's my/our/your issue

#

note that it does dom editing on the model opened, to replace the pfp image, names, (basically anything), because I tried to find a way that doesn't use dom editing but i couldn't find a way to make that work. if there's a better way, please let me know, but I believe this to be the only way

dull magnet
vital nebula
#

that's electron, not react?

#

oh, I'm blind, sorry

#

I'll check it out

dull magnet
#

you can pass the rectangle to screenshot which you can easily get for your message container with Dom apis

#

to screenshot the perfect area

#

you'll need a native.ts exporting a async function takePageScreenshot(event, areaRect): Uint8Array

#

look at other plugins to see how to use that

vital nebula
#

alr ty

#

(tho iirc no other plugins take screenshots?)

vital nebula
vital nebula
#

after thinking about it for a while and looking things up, there's no better option other than to edit the dom and to use hardcoded classes

#

whats so bad about hardcoding classes anyways

#

@dull magnet wdym husk

tall dagger
#

but ye sounds ok

vital nebula
#

🤷

silk sorrel
#

ngl that's like the only thing I'd want from a screenshot plugin
cuz having the ugly ass gray background visible is so meh, especially when discord has like 15 different themes now

#

svg exports would be even better but that would be a pain in the ass to implement

vital nebula
#

I can make it transparent

#

just dk how to export that to a back blank background

vital nebula
normal wagon
#

genuine question would this ever be accepted

vapid oar
tacit locust
#

Id love hot swappable profiles

vital nebula
quick zephyr
vital nebula
#

so?

quick zephyr
vital nebula
#

why would they do that

quick zephyr
#

why not

honest plume
#

would this plugin be accepted?

  1. when someone sends a soundboard, it sends the soundboard mp3 link in chat like this:
    meow
  2. the recipient clients then check if the message contains a soundboard-sounds link like this and plays the sound.

the soundboard link would only play when youre in the same channel call.

ig the main concern is that its gonna spam the chat, so maybe this idea is bad

iron epoch
amber mantle
#

something like fake nitro where it just sends the link on click maybe though

honest plume
#

It sends a link, and the client listens to on message event, just like the deleted messages plugin and plays the soundboard MP3 automatically if the message contains the soundboard link

amber mantle
#

the latter half is probably too shitposty for most official plugins nowadays

#

even moyai plugin isnt around anymore (hasnt been for years actually i just keep forgetting)

tropic ice
amber mantle
#

oh thats not that long ago

#

rip my farty he got hit by a veezooka

vapid oar
#

who has a vencord plugin graveyard

hushed loom
#

also

obsidian shell
#

@hushed loom satan

vast karma
#

I have an idea how its tombstone could look

quaint cipher
#

can vencor patch into fast connect

#

doesnt seem to let me

#

i guess its not a webpack module so thats why

hushed loom
#

patches won't do it

#

you'd have to do it manually

quaint cipher
#

thought something wasn't working becasuse gateway sesison was web rather than desktop so i tried setting it to desktop but the issue was different thingie

blazing igloo
#

Hi! I've been trying to find a way to retrieve registered user application commands, but I've been quite failing to find the relevant functions

dull magnet
#

by bots?

blazing igloo
#

I tried some basic reverse engineering, but because no UI element directly fetch that information (ie. the button to open the command drawer just dispatch an event), I've been having quite a hard time

blazing igloo
dull magnet
#

user installed apps?

blazing igloo
#

yeah

dull magnet
#

Enable ConsoleShortcuts

#

then look at the Stores object in console

#

these seem most promising

Stores.ApplicationStore
Stores.ApplicationCommandStore
Stores.ApplicationCommandIndexStore
blazing igloo
#

for some reason the Stores object is empty and only ApplicationStoreexists globally, I'm not sure why it's different on my install

#

I've previously tried a findByProps("ApplicationCommandStore") but the test find fails

blazing igloo
#

Okay I've managed to take a look at both stores. It seems like the ApplicationCommandStore doesn't hold much information, while ApplicationCommandIndexStore doesn't let me execute the command, although at this point a simple REST call should do the trick?

dull magnet
#

yes

limpid tusk
#

i made a plugin for myself rn that disables the in game soundboard overlay. It's literally 2 lines. I'm assuming that would be too simple to be merged?
I made it because I use CTRL + ` as my mute keybind in Discord, which is the same UNCHANGABLE keybind used for the soundboard overlay which constantly makes me play the loudest sounds when trying to mute

normal wagon
#

what's considered niche here and generally accepted just curious

#

because i've seen quite a few PRs come in here and the acceptance rate is low

#

i'm just wondering what are the best places for me to contribute and what can i actually submit which will be accepted

#

and is there any limitations to the number of patches i can use?

obsidian shell
#

ask before PRing

obsidian shell
normal wagon
normal wagon
vast karma
#

All low hanging fruit plugins have already been made

#

Coming up with a new, genuinely useful idea isn't easy

obsidian shell
#

else you're gonna waste your time

broken storm
#

Hello 👋 I made a small QOL plugin that I talked about some time ago
I'm not sure it's been done? But correct me if I'm wrong
I thought I explained it decently in the Readme
Also if yall could give feedback on it that'd be great, I'm hoping to PR this soon if it's not a stupid idea or too niche lol
https://github.com/Calebh101/VC-MessageCorrector
-# also ping me when responding plez

GitHub

Contribute to Calebh101/VC-MessageCorrector development by creating an account on GitHub.

proud parrotBOT
rose fiber
proud parrotBOT
rose fiber
proud parrotBOT
rose fiber
proud parrotBOT
rose fiber
#

also what is even the point of the plugin

broken storm
broken storm
rose fiber
broken storm
#

When I was trying to fix some weird issues, like random crashing
I was testing if MessageCorrector was causing it

#

I can remove them if they’re not preferred

broken storm
# rose fiber also what is even the point of the plugin

Kinda hard to explain, but basically, when Discord receives a message into its stores, it just kinda accepts it ig. So it doesn’t matter if you just sent the message, or someone else. But that creates some inconsistency, cuz if you send a message right after someone else, on your client it’ll show that your message is first, even though it’s not on the server. I’ve found myself restarting the client a lot because of this, to check where my messages were “broken up” if that makes sense. MessageCorrector reorders the messages based on the timestamp property, which represents when the server received the message; not the client.
Does that make sense? It’s a bit hard to explain and I’m not the best at explaining lol

#

TLDR is discord client sucks, this fixes a small issue with it

tropic ice
broken storm
#

Yeah exactly

normal wagon
#

not the worse plugin idea i can see the use-case in this

broken storm
#

I personally find it rly useful, idk abt yall tho

obsidian shell
#

just address the messages above

normal wagon
#

everything niche in vencord plugin submissions lowk

broken storm
#

Alr I removed some debugging stuff,
Replaced \w+ with \i
I didn't remove the command cuz I find it helpful tho
I changed the devs field to not use constants

#

Anything else yall see that I can improve?

obsidian shell
broken storm
#

Finna change that fr 👍

quick zephyr
broken storm
obsidian shell
#

oh my god just define yourself as a plain object

barren thistle
# obsidian shell these days the only plugin submissions we get are ai garbage

tbf it isn't exactly like a ton of new plugins are being added to the list of supported plugins. I mean, Vencord has BD beat in terms of stability and performance, but chances are, if you can think of it, there already is a plugin for it on BD.

Just by nature of the way vencord's plugin onboarding works, it invites people to use AI to build plugins that add the niche thing people want.

#

Doesn't make it easier but it does explain it.

barren thistle
hardy adder
#

nah there would be someone that notices and complains lol

#

think it's fine in a plugin, maybe default enabled would be a discussion? but i would probably lean towards no

broken storm
#

The snippet does say to add yourself to the devs constant iirc

broken storm
normal wagon
#

i think i agree with the other guy saying it shouldn't be a plugin but rather built in by default

#

that'd make more sense

#

for its functionality and stuff

broken storm
#

I'm thinking of PRing it yeah, and including that if it's deemed a good idea it can be made built-in
Cuz you can define a plugin as builtin/required really easily so yeah

#

Making it built-in makes sense

obsidian shell
#

as of now plugins shouldn’t be enabled by default, none of them are just because they’d be useful for a majority of people

#

imo

dull magnet
#

it would be a separate settings page with a bunch of categorised small tweaks

all very simple plugin that basically just change one small feature without settings would be changed to a switch there

Things that are objectively useful would be enabled by default, everything else disabled by default

#

for example BetterRoleContext makes an objective improvement to the role context menu without downsides so it could be enabled by default

broken storm
# dull magnet this is planned as "tweaks"

So... sorry if I'm dum for asking, but since you kinda made vencord lol, what would you suggest I do with my plugin before PRing it? Make it built-in, enabled by default or both?

#

The 2 settings I have for it aren't really necessary to show to the user if I need to hide them btw

obsidian shell
barren thistle
broken storm
rose fiber
rose fiber
#

why the fuck is there an @ silent role

frigid grove
dull magnet
hardy adder
#

has too many comments

tropic ice
#

yeah they said it's ai

obsidian shell
#

@hushed loom

storm swan
#

can someone archive everything from this year's Discord April Fools?

#

like the images and the css of it, i wanna do an port of every Discord April Fools to this day, and i wanna make them work again

normal wagon
#

it's alot more than just css and images lol

hushed loom
storm swan
untold urchin
#

I submitted a PR to the FakeNitro plugin a few months ago:
https://github.com/Vendicated/Vencord/pull/3993

Wanted to ask what the process with PRs was and if I had to do anything or if "unsolicited" PRs are always ignored (instead of closed?) without any comment?
I have it running locally and it works fine but just noticed the PR still had no response etc.
Thanks a lot!

GitHub

This PR adds an option preferCurrentServerEmoji (default false) for the FakeNitro plugin. When enabled, it prioritizes emotes from the current server, showing them higher in the suggestion list tha...

obsidian shell
#

just leave it opened and wait

#

if your pr is bad it gets instantly closed

untold urchin
#

I see thanks for the response!
Good to know how you all do stuff around here.
See you in a few years ig 😂

quick zephyr
#

if your pr is really bad such as ai slop it gets instantly closed. if it's your average brand of bad then you gotta wait like normal, maybe get feedback one day, address the feedback, then wait another few months to years

untold urchin
#

Yea understandable.
I couldn't care less if my contributions get accepted, did it mainly for myself as I was missing that feature, so shrug. But now I know for next time to not bother, thank you!

obsidian shell
celest belfry
#

i dont know if this is intended, but when using the platformIndicators plugin vesktop users get detected as web users probably because of how vesktop is built

broken storm
#

Yeah

#

Vesktop is an electron wrapper around the discord website iirc

lost gulch
#

It is indeed intended

woeful summit
#

i found this method in mediaEngineStore, and im wondering if there is any way to make this always return false. im trying to mute that notification that shows up when ur mic is picked up while muting

#

i saw that you can mute it with css, but i also read that the tag changes from time to time so im trying to make it more permanent

silk sorrel
#

Lmao I forgot I had this nitro profile picture

woeful summit
#

ayyyy i think i got it

            find: "getSpeakingWhileMuted(){return ",
            replacement: {
                match: /(getSpeakingWhileMuted\(\){)(return) (\i)/,
                replace: "$1return false"
            }
        }```
#

can someone fact check me. since enabling the plugin i haven't been able to trigger the tooltip

frigid grove
#

Has there been any mentions about messagelogger not being able to log components v2?

dreamy nest
#

Can i convert Message <-> api defined json??

cedar olive
#

not without implementing from scratch

#

why do you need tho

tropic ice
#

you can get this from a message. not sure what you mean by api defined json

{
  "type": 0,
  "tts": false,
  "timestamp": "2026-04-13T15:47:52.791000+00:00",
  "pinned": false,
  "mentions": [],
  "mention_roles": [],
  "mention_everyone": false,
  "id": "1493276548047044911",
  "flags": 0,
  "embeds": [],
  "edited_timestamp": null,
  "content": "Can i convert Message <-> api defined json??",
  "components": [],
  "channel_id": "1032770730703716362",
  "author": {
    "username": "dittonut",
    "public_flags": 256,
    "primary_guild": null,
    "id": "917369499597033502",
    "global_name": "디또넛",
    "display_name_styles": null,
    "discriminator": "0",
    "collectibles": null,
    "clan": null,
    "avatar_decoration_data": null,
    "avatar": "edea47e5f68cf4616e873ab08e1313b8"
  },
  "attachments": []
}
obsidian shell
#

is there a good way to hide a setting if anohter one is checked

blazing igloo
#

I'd like to make my chat bar button appearance to change depending on the content of the chat input box, is there an easy way to get a reactive version of the chatbox content?

obsidian shell
#

@hushed loom help

#

if i have settings open how do i close them

hushed loom
#

isnt it just a modal now

obsidian shell
#

yes

#

how do i close it

hushed loom
#

see what this does ig