#🧩-plugin-development
1 messages · Page 7 of 1
yes, but that requires reliabilty on the var names
// on ur plugin
Mention({ channelId, userId }, MentionComponent) {
return <span>...</span>
}
overall signature
nah no need
cus u can just regex capture
maybe even better would be patching whatever that X component is
ya in X theres the @ part
i'd like to think its their transpiller
is that the serialize
not useful
true
yes but
- has perfect support and is shorter
i preferred blissful ignorance
im pretty sure the only reason the bundle would have .concat is discord explicitly using it
unless im missing something
vapo was right btw
for?
this is the part that renders the @a
so we need to inject text? ugh
the function it calls is what renders all mentions
and it takes a color prop
so patching that would be really straight forward
/(.)\.jsx(?=\b.+?"@"\.concat)/
would this work
since .+? is non-greedy it should restart the capture at the (.)\.jsx right before it right
it should
no
grr whgat
.+? does not mean match as little as possibly
it means find the smallest match starting from the first possible start
oh yea true
this is why I often use something like .{0,200}?
obviously change the 200 to smth more appropriate
nice
i'm confused.. that worked as intended?
yes
i was showing that the ? which makes it non greedy might still match more than you want
yea i was confuysed about non lazy matching
oh
non greedy* brainfart haha
i wanted to make sure it wouldnt replace the first React.createElement it saw just because the mention logic somewhere came after
lazy matching
ok back to my sucky problem
in any case you can just match the children:"@".concat
and add color to that same object
and it will work
return (0,
r.jsx)(_.Z, q(z({
className: t,
onContextMenu: p
}, e), {
children: "@".concat(y),
color: getColorSomehow(e)
}))
@deft hull
match: /user:(.),channelId:(.).{0,300}?"@".concat\(.+?\)/,
replace: "$&,color:Vencord.Plugins.plugins.RCE.getUserColor($1, $2)/
yeah works
real
huh
remote code execution plugin
lmfao
is the name correct
capitalisation
j
is that the same function
no
its a getUserColor(userId: string, channelId: string): string
to return something like '#ffffff'
u can probably use UserStore and ChannelStore for that i think
or just channelstore
some store idk
i need both i think
where are those in the vencord path
but i meant same function as in same find: part
you need MemberStore, no?
both
found channelstore, but Ican't find memberstore. I did find userstore but not the same lol
const MemberStore = findByPropsLazy("getMember")
i should keep that in start right
what is ChannelMemberStore
top level
it has like
uh where is findbypropslazy defined
no methods
use intellisence
uh why isn't settings ignored
lol idk
huh
had to restart eslint
@deft hull
oh yeah i don't have color
nope no color
testing something
huh
i got the correct color in the object, but it made it black?
inspect element the color
what does getUserColor look like
should work
huh
wait
or later 😛

funny that color existed there still
yeah, but imma keep a pr as a placeholder maybe
@deft hull
slate mentions are so hard funn
if anyone wants to try to help with my react issues
and this is when i refresh in #🤖-bot-commands
problem being: it doesnt call the effect when the theme id updates, so it doesnt generate tokens on theme updates
if u look at the first useInteractionEffect(deps) and the second one, the themeId goes from null to the theme loaded from settings
but the effect doesnt go off?
some leads: this is useEffect source code, and memoizedState is just { current: null } on the second call
ok coming back to this
**ReactFiberHooks.old.js: **Lines 1680-1690
function updateEffectImpl(fiberFlags, hookFlags, create, deps): void {
const hook = updateWorkInProgressHook();
const nextDeps = deps === undefined ? null : deps;
let destroy = undefined;
if (currentHook !== null) {
const prevEffect = currentHook.memoizedState;
destroy = prevEffect.destroy;
if (nextDeps !== null) {
const prevDeps = prevEffect.deps;
if (areHookInputsEqual(nextDeps, prevDeps)) {
ok im gonnat try and remove useEffect in that way and use callback refs
@dull magnet check this out
i feel like a god after that fix
these hooks i wrote are cool i feel like they could be moved up to something like @hooks

I wrote something similar to that for settings listeners
(and noone ever used them
)
who writes the best TS code
I love cursed ts
**settings.ts: **Lines 155-159
// Resolves a possibly nested prop in the form of "some.nested.prop" to type of T.some.nested.prop
type ResolvePropDeep<T, P> = P extends "" ? T :
P extends `${infer Pre}.${infer Suf}` ?
Pre extends keyof T ? ResolvePropDeep<T[Pre], Suf> : never : P extends keyof T ? T[P] : never;
love
how did u made that screenshot tbh. looks cool 
i think its codesnap
Codesnap
but i stole it from twitter
that's really awesome btw but don't u load strings from a json or network or similar at runtime
so not that useful in the end 
unless you include English strings in the code by default
oh yea i was just sending it because its cool
forgot this chat isnt general development
devhub instincts
what color r ur thigh highs
Explod
Ok
if i had nitro i would send a sticker
hop on fakeNitro
lol
How would I get addReaction? findByProps doesn't find it and it and i get this error when i try using it through findByCode
cause you can't use the method on the prototype
you need the instance lol
find(m => m.prototype?.addReaction)
aight thanks
does this work
no
does vencord trim the newlines when looking/matching code?
yes
**patchWebpack.ts: **Lines 53-65
// Discords Webpack chunks for some ungodly reason contain random
// newlines. Cyn recommended this workaround and it seems to work fine,
// however this could potentially break code, so if anything goes weird,
// this is probably why.
// Additionally, `[actual newline]` is one less char than "\n", so if Discord
// ever targets newer browsers, the minifier could potentially use this trick and
// cause issues.
let code: string = mod.toString().replaceAll("\n", "");
// a very small minority of modules use function() instead of arrow functions,
// but, unnamed toplevel functions aren't valid. However 0, function() makes it a statement
if (code.startsWith("function(")) {
code = "0," + code;
}
ooh we should implement that into pylon
anyway, when discord uses a custom function to trim the length of an array
?
idk
0
opened pr lol
btw for i18n
can't u hijack discords string
but there's also intl which maybe can do this?
I could, but I have no doubt that certain languages will mess it up
intl is underrated
Wait that's discord? i thought that was just a devtools moment lmao
discord has some weird plugin for their build tool that keeps lines short
it inserts random newlines everywhere
Well yeah it certainly doesn't fit ur screen
I think it's 1k characters or smth
idk why they do it lmao
Discord moment 
discord actually uses Intl in some places
Discord is inconsistent guhhh
discord when they polyfill ancient apis with bloated probably way worse performing apis then use recent apis like Intl
Check and find out
Web devs try to not target browsers last touched 5 zillion years ago challenge (impossible)
NONONONO
Love
You love
lol
oh
their intl polyfill is pretty small
45kb or so
so they just polyfill a small part ig
treeshake moment
probably only what they need
no duh
uh so does that mean intl.listformat is there
if youre asking whether you can use it
yes, people should hop off ancient browsers or cope

my ass will never support old browsers
But I want to use internet explorer with vencord 🥺
wait i switched to German and whoreacted broke

ik,
Check 
no

hm
like
const parts = fmt.formatToParts(users.map(u => u.id));
const components = parts.map(({ type, value }) => {
if (type === "element") return <ColorUser id={value} />
return <span>{value}</span>
});
Oxford will explod
should work well 
weird
weird
fyi @dull magnet i18n problems
also my other i18n problem continues with this
did it just disable role color everywhere
now what
yes true
but also who care i18n
lmao
Doesn't discord do this for you
only as a string, not a custom react element
but help on the error
context?

Yea but cant u use the string to extrapolate i18n
there will be some strings that just won't follow the same rules
not really
how would you do that
what if somebody is named and, what if everyone typing has the same name, etc
I don't understand
what
wonderful
you're suggesting to parse discords string, no?
No not the rendered string
The strings it uses to render
Before it interpolates the users
I tried looking for that one earlier but I couldn't find it lol
I searched for "und" and found nothing

what
how did i not find that
weird
in any case that doesn't do anything for us because Intl does the same
not the is typing...

oh true
Plurality
yeah use discords strings then
is there a way to parse a string that returns a react object
in any case i18n isn't really a priority, only if it's easy to do
Ok phone is at 1% on road
you should go charge it
not sure why it's like that
instead of like {a}, {b} and {c} are typing
I assume the !! help clarify that it's an actual placeholder rather than plaintext
and the ** automatically makes the text bold
how do I get these messages
why isn't it a module in common already
cause noone ever needed it
u will add
in this pr?!?!
sure
Cope 
You're right, it is the most useless bug
has anyone ever used that menu
i forgot it was a thing
yes, when vizality dashboard broke every week
I never knew that existed huh
People actually used vizality??
lol
Wtf is that
@dull magnet will make tauri installer troller
trol
terrible
tauri is so bad
pretty uiand eat three terabyte ram
ye
😭
b but rust is 🚀 🚀 blazing fast 🚀 and memory efficient 🚀


why flatpak
flatpak horror
can somebody explain
HOW
on vscode works like a charm but on discordapp it doesnt
probably needs to explicitly states which things it wants to spawn
flatpak override com.packagename.App --talk-name=org.freedesktop.Flatpak
apparently you should do this
.w. what that does
apparently it worked
pog
now i just need to see how will i detect if the app is running as a flatpak
check environment variables maybe
looks like a horrible solution but this might gonna work if i use PS1
flatpack deez nuts
used a different method that uses the env var SANDBOX_TMPDIR to identify if it is sandboxed
btw my system doesnt have flatpak-spawn
its not part of flatpak?
so i just checked flatpak env
and it contains all of my host env variables?????
wtf flatpak
lol
anyway theres so many vars u could check
i would just use
const isFlatpak = process.env.FLATPAK_ID?.includes("discordapp");
oh lol
lemme just fix it
for now check https://github.com/Vendicated/Vencord/pull/274
@dull magnet check now
pog
doesn't really work very well
it only works if someone else is typing
the function doesn't get called when you're typoing and no one else is
is it supposed to?
you'd have to patch whatever discord function filters you out from the typing indicator
I don't even remember what I typed though
huhh
oh got it
I need to make copy raw, lemme just rq do that
that can definitely be merged before role color everywhere
is tooltip a common webpack thing
yes it is
huh
oh got it
u could remove the need for a constructor
and just do state = { copied: false }
since u arent doing anything with props
yeah i realized
I also realized that using functional copmonents are a lot easier than i remember
which i'm now using
oopsies
wrong message thing
uh how do i put a button ehre
yeah class components kinda suck tbh
been using functional ones for ages now, never looked back
i'm looking at hideattachments for it rn
what about this btw https://github.com/Vendicated/Vencord/pull/52
oh yeah
I forgot about that pr
it does some hacky stuff and doesn't use modals properly which needs fixing
what should I do with my copy raw pr
uhhh
your prs way to make the menu is way cleaner so I prefer that
would be cool to port the modal to your pr
just steal modal from jubys plugin xd
have u tried if there's context menu yet
i actually might just make the api later
on the icons
not yet
that'd be awesome
@dull magnet hello i just made v2 manifest stuff and i was thinking about adding a github action artifact so that i can directly download a .xpi from github actions instead of having to do that myself for now
why not just add a release?
btw there's an open Firefox support pr too but it's been kinda stale
i added it to the release
I saw
btw kinda too late now but there was already a manifest v2
before this commit
I honestly wasn't aware Firefox didn't support v3 when I did that
because their Roadmap proclaims they support v3 since early 2022
??
they keep pushing it back every few months
"ItS NoT ReAdY YeT"
i think its in firefox developer version, but it isnt in stable and i dont wanna update twice a day
to be fair it really isnt ready yet
it wasnt ready when chrome pushed it out either, but they did it anyway
fuckin
YEET TO PROD
the way
@dull magnet 
what if
I was to redo the installer
to make it look better(er)
redo how
if you redesign and it looks good then sure
but don't make it an electron app

oh right i still wanted to do loading of user plugins form localstorage
cause noone wants 100mb installer
how big is bd's 💀
100mb
any electron app is ~100mb
its 65mb
that's compressed lol
do not ask why i have the bd installer
now try making a single binary electron app on Linux
just don't use electron 
oh yeah ven do i also need to add docs to my pr or is it fine like this
besides electron
I don't think you can use js for this without a huge filesize
I don't know go 💀
the way the gui framework works is pretty similar to flutter if you've ever worked with that
or using react create element manually
you mean the Firefox one?
yes
uhh
since there's now multiple builds maybe make like those browser buttons extensions usually have
okay so
Also do you have any idea about updating / publishing to store?
it generates a random name
can just rename it
^
would be cool to have
cant imagine it being too hard, but ive never done it personally
and cool to automate
i can look into that tho
it fits quite nice into my pr, ig
i think to start i could clean up the release files, like half of the stuff in there isnt really needed (like do we need browser.js as a raw file in there?)
oki so nvm im just renaming that .xpi and looking into publishing to firefox addons (or just adding a badge)
chrome would be cool too but that costs like 5 bucks 
I think all of the files in the releases are necessary
yeah i dont think im competent enough to know what im doing with that so ill just not
maps are nice to have, the legal txts we could probably just put at the bottom/top of the bundles though
also i think if we auto publish to firefox we would need to increment version numbers
we could remove the patcher and preload maps cause they're pretty obsolete
ig we could use github run numbers for that, but still
does it support full semver?
in the userscript we just append the current Unix timestamp which will obviously always increment
semver shenanigans
1.0.0+r.<runnumber>
other option would be git revision count
or that yeah
ill check if that is allowed on firefox addons and try uploading vencord then
i think semver wants you to use . to concat multiple build infos
i had to implement it for an update checker
ig r516-2af65b would also be a valid singular build meta
this seems fine 
it considers that a pre release
is there like a "check if this semver is newer than this semver"
1.0.0+r516-2af65b
1.0.0+r517-ff6a7b
see if the second one is considered newer
wait
you can't even use semver
The Chrome Web Store requires numbers between 0 and 65535
do you reckon we will ever get to 65535 commits
I don't think so
bruh
if we somehow did we would need to rethink versioning at that point
if you tried vencord<@&1015072428843601962>endicated.dev, smart @granite wharf already claimed that I think

oh shit
why is it there 5 times lmaoo
i will delete system32
i had my id randomly generated
ig i would need to like either claim my own id, or let you (or someone else) handle this
this isnt really something i can do a workflow for, so i think ill just make it into the release and add a badge, and somebody who owns that id can eventually make it a published plugin
i love how discord decides to be really annoying and ping roles in the middle of sentences
you'd think it'd check for spaces or something
but looks like it already worked right
what exactly does one need to run to make a release
nah it already should publish to the release i just want to rename it
and if i want to push it to the mozilla addons store i would need to reserve a name in the codebase
which i dont want to do because someone else already did it
(and if i dont have access to that name i cant really test sooo)
yeah makes sense xd

why does this single change cause the userscript not to load
- // @grant none
+ // @grant GM.xmlHttpRequest
cause as soon as you grant a permission it doesn't run in page context anymore
which means you now have to use unsafeWindow
with ({ window: unsafeWindow }) {
// code here
}```
try this 
absolutely no reason to use with here I just think it's funny
friendliness* 
do manifest v3 extensions work for edge and chrome or am i just making stuff up
should
i will skin you alive
it's all chromium
it does work 
why are u even granting that permission
do u wanna fix csp issue
cause the issue isn't in xml http req it's in dynamic imports and script tags
i think that would be it with my pr
yop
could u run lint on the browser folder
nah but it doesnt fetch shit like dontator stuff etc
i forgot to include it in the included folders
Also gonna shower now so gonna take a look later
thank u
check package.json lint script
and use the lint fix command but on browser
yeah but did u have to edit source code for that
nop

// @grant GM_xmlhttpRequest
// @require https://greasyfork.org/scripts/421384-gm-fetch/code/GM_fetch.js?version=898562
// ==/UserScript==
unsafeWindow.fetch = GM_fetch
// this is a compiled and minified version of Vencord. For the source code, visit the GitHub repo
with ({ window: unsafeWindow }) {
Oh wait Firefox doesn't have them

THAT'S SO TERRIBLE
does that bypass cors
nah but you could use fetch to fetch the css and js and set it with a style / script tag

maybe there's another greasemonkey api that bypasses that 
whats the issue then
Tampermonkey will explod
but without script it wont work anyway right
yes
well ill pr the csp thing anyway 
as it fixes all the plugins that fetch some api
although ill make it less retarded i promise
wtf Firefox has native user script support https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/userScripts
what even provides GM_fetch
did you use that one from npm that clearly states its untested and unsafe

fetch pollyfill with resp.text/resp.json/resp.blob/resp.arrayBuffer support using GM_xmlhttpRequest
garry's mod fetch
function GM_fetch(url, opt){
function blobTo(to, blob) {
if (to == "arrayBuffer" && blob.arrayBuffer) return blob.arrayBuffer()
return new Promise((resolve, reject) => {
var fileReader = new FileReader()
fileReader.onload = function (event) { if (to == "base64") resolve(event.target.result); else resolve(event.target.result) }
if (to == "arrayBuffer") fileReader.readAsArrayBuffer(blob)
else if (to == "base64") fileReader.readAsDataURL(blob) // "data:*/*;base64,......"
else if (to == "text") fileReader.readAsText(blob, "utf-8")
else reject("unknown to")
})
}
return new Promise((resolve, reject)=>{
// https://www.tampermonkey.net/documentation.php?ext=dhdg#GM_xmlhttpRequest
opt = opt || {}
opt.url = url
opt.data = opt.body
opt.responseType = "blob"
opt.onload = (resp)=>{
var blob = resp.response
resp.blob = ()=>Promise.resolve(blob)
resp.arrayBuffer = ()=>blobTo("arrayBuffer", blob)
resp.text = ()=>blobTo("text", blob)
resp.json = async ()=>JSON.parse(await blobTo("text", blob))
resolve(resp)
}
opt.ontimeout = ()=>reject("fetch timeout")
opt.onerror = ()=>reject("fetch error")
opt.onabort = ()=>reject("fetch abort")
GM_xmlhttpRequest(opt)
})
}
ye
looks okay but I don't like that it bypasses cors
would be cool if you could somehow make it fail on cors error
Whats blob
binary large object
🤨
i dont get it
isnt it literally the point that it bypasses cors
csp
so u can fetch from github etc
What langusge is this
not cors
Javascript
O
csp = own site restricts what resources can be used
cors = other sites restrict what sites can fetch them
oh yea
without cors random sites could just embed possibly sensitive sites
Good
yeah true i forgor
cors is really annoying but it's there for a good reason
like make an iframe of https://example.com/logout to log you out
yeah ik
obviously pretty harmless in this case but you see the possibilities 
well i could just run sth like this before every request
funnyFetch("https://pornhub.com/sex", {method:"HEAD"}).then(it=>console.log(parse(it.responseHeaders)['content-security-policy']))
not HEAD
OPTIONS
that's exactly how cors works actually
if you add that and only overwrite fetch for vencord and not for the entire page I'm fine with it
by accident 
i didnt know private extentions had global ids
im surprised they dont make u confirm ownership of domain
why
the library I currently use is very similar to flutter

my brain cannot understand go lol
go explod
you will explod
Flutter uses dart what
yes
Flutter is a framework for Dart yes
While writing and debugging an application, Flutter runs in the Dart virtual machine, which features a just-in-time execution engine. This allows for fast compilation times as well as "hot reload", with which modifications to source files can be injected into a running application. Flutter extends this further with support for stateful hot reload, where in most cases changes to source code are reflected immediately in the running app without requiring a restart or any loss of state.[18]
this is actualy really col
yeah state is just
String? deviceIdentifier = 'Press the button to get the device identifier';
// Add to state
setState(() {
deviceIdentifier = tempDeviceId;
});
// On init
@override
void initState() {
super.initState();
}```
Good
used this before
can confirm
it is very col
can someone test if latest desktop stable supports regex lookbehind
{
match: /(?<="Spotify"===\w+\.provider\.name?\(0,.\.jsx\)\()\w+(?=,)/,
replace: "Vencord.Plugins.plugins.SpotiMbed.SpotifyEmbed",
}```
would b nice
it does
lookbehind has been in js for ages
forever
oh wait thats lookahead my b
but yeah lookbehind also has really good support
what do the rows mean
diff amounts of support?
is that caniuse lemme check
wdym rows
yes it's caniuse
Oh you mean why it has multiple green rows
Ya
patch diff?
if you use the dev build of vencord it shows you a diff similar to git diff of the code
to show what your code changed
useful so you can understand why it errored
cause the resulting code isn't valid syntax
Only errored when i pasted that rege
again use dev build and it'll show you diff
dev build gud
dev build has a lot of extra things
like tracking how long certain actions like webpack search and loading plugins takes, code diffs in patcher errors, patchhelper, non minified code for easier debugging, warnings for not applied patches, strict errors for failed webpack searches

type AwaiterRes<T> = [T, any, boolean]
type Token = { content: string }
type TokenizerRes = Token[][] | null
const doSmthWithTokens = (tokens: TokenizerRes) => {
console.log(tokens)
}
doSmthWithTokens([null, null, false] as AwaiterRes<TokenizerRes>)
literally why does ts allow this
im so confused
not sure if this is why
if u copy paste this in the typescript playground
it slides, and playground has all the strict options enabled by default im p sure
the thing that confirms my confuse it is the boolean element
boolean has NO overlap with Token[]
i hope
reduced weirdness to a oneliner
const a: { prop: number }[] = [null, null] as [null, any]
and it seems to only arise when one of the tuple elements is any
oh
that makes a lot of sense
Once one of the types is any, the union of all the types is automatically any
so the entire array is just any[]
but its a tuple why is it casting to array when typechecking
cause the type you're assigning to isn't a tuple
so it's flattening it to a regular array
oh that is interesting
change the type you're assigning to to [number, number, number]
should error then
(im not 100% sure this is true its just my educated guess)
yes
it does
[number, number] also errors in the oneliner
so the explanation makes sense
typescript moment
will the font reversion snippet work for long enough? i see it uses actual discord's assets, and they might and probably will remove them eventually
also neither the snippet to revert font or the snippet to fix kerning work for me

im p sure they're still hosting old 2017 builds
so i can imagine they dont care that much
i imagine their static assets are really cheap relative to their db costs

@dull magnet in the current release it says that the source zip cant be updated, but im pretty sure you can update the source zip by just updating the tag (devbuild):
git fetch origin
git reset --hard origin/main
git tag devbuild -f # Force overwrite the tag locally
git push -f origin devbuild # Force push the remote tag to the same commit as the local tag
on second thought im not sure why i pinged you
true
WHY ARE YOU USING SOURCE ZIP
INSANE
@potent fox you use source zip
NO
ONLY INSANE PEOPLE USE SOURCE ZIP
I HAVENT SEEN SINGLE PERSON THAT USE IT
im not, i just noticed that while doing firefox xpi
explosion
@silver cave @silver cave you use github web to upload files
NO
i don't think I have in years
no fucking way you just tried redirecting me to support
i did because ur solution is in the channel
I don't know what's wrong (Ignore the weird function return)
u cant just calle the component with props
it has to be initialized by jsx (react runtime)
I'm doing it like to that to be able to access it through Vencord.Plugins blabla
one fix would be: make ur index.ts into a index.tsx and return <ToggleGameBla props={...props}/>
i do a similar thing in shikiCodeblocks/index.ts
but i use createHighlighter which is an export in my components/Highlighter.tsx
is it easy to turn a bd plugin into a vencord plugin?
did some UI
Nice
i love bananas
i want bananas
ty
@dull magnet how can I grab the contents of a text file after it is uploaded via a command?
look at petpet / corrupt mp4s
I get this, which idk what to do with
why did you censor lastModified 🤨
guh!?
to bait people like you
sure
it's a File
you can turn it into an url, text, byte array, etc
yeah, figuring it out
rn got it as a blob, gonna use FileReader to make it something
ill look at this then ig
file.arrayBuffer() -> byte array
file.text() -> string
const bytes = new Uint8Array(await file.arrayBuffer());
Is there a way I can get rid of the minimum discord window size on vencord?
you can set it in discord's settings.json
if you're on windows it's in %appdata%/discord/settings.json
where it is on linux depends on a bunch of things 
on linux it's at ~/.config/discord/settings.json and if it isn't you know why
you underestimate discord users 
perhaps
is it WINDOW_BOUNDS?
yeah
add keys MIN_WIDTH and MIN_HEIGHT to it
and you can set whatever min px you want
ty
np
is it possible to upload to clipboard?
try fucking around with this https://commandtechno.com/i/7yu8mt5sqii0.png
or if you want web support i think its possible through navigator.clipboard.write
Actually fucking awesome find
Didnt know DiscordNative was a thing
Right right right
No, I deleted it because I was testing clipboard and didnt realize I was in development
if ur talking about in vencord
theres a clipboard module in @webpack/common i think
wow there is
**useCopyCooldown.ts: **Line 25
Clipboard.copy(text);
just make sure u use it inside a user triggered event
Is a command a user triggered event?
the pressing enter part is
the command execution prob still happens in the keyboard event
so ur prob good
It workie
cool idea make settings gui for discords settings stuff
there is literally a thing on the webpack common to use the clipboard
which is the correct way instead of using DiscordNative
yeah ik



