#🧩-plugin-development
1 messages · Page 5 of 1
find: find a module by filter function that should return a trueish value for the found module
lazyWebpack: same as find but lazy
findByProps: finds a module by export names (export.foo)
findByCode: finds a single exported function by its code
findByDisplayName: dead, doesn't work
findBulk: takes an array of filters and finds all modules at once. This is considerably faster than regular find if you need to search many modules
findModuleId: Find the id of a module by its source code. You can ten import it via wreq(id) or extract it into its own file for easier reading with extract(id)
mapMangledModule: first find a module by source code (it can be anywhere in the module, doesn't have to be exported), then check each import against your mappings to rename them to a more usable thing
mapMangledModuleLazy: Same as mapMangldModule, but lazy
waitFor: Each time a module is added by discord, check it against your filter. Once found, calls your callback and removes your listener
find approaches search the module cache for matches, waitFor checks modules as they fly in. The big difference is that find won't find modules that haven't been loaded. Plugins and most other Vencord code are loaded wayyyy before anything from Discord has been loaded, so finds will not work on top level. You can only use find inside methods called later (plugin.start for example) or inside lazy blocks such as lazyWebpack, LazyComponent, etc...
lazy makes it so that searches aren't done immediately. Rather, they are done only once you interact with the found module in any way. For example:
const UserStore = lazyWebpack(filters.byProps("getUser")) // not yet executed
await sleep(2000) // still not executed
doOtherStuff()
UserStore.getUser() // now it searches
So basically, lazy is the recommended approach for working around the issue of being unable to search on the top level and also better for performance and startup speed because modules are only searched on demand.
waitFor is generally the most performant approach since it does no search and instead finds modules as they are loaded, but only use it for things that must be loaded, still use lazyWebpack for "optional" modules (aka only required for your plugin)
thoughts about a filter for checking the key name
or maybe if you just pass a string it does it
const RunningGamesStoreModule = mapMangledModuleLazy('.displayName="RunningGameStore"', {
RunningGamesStore: filters.byProps("getRunningGames", "getGamesSeen"),
/** Used to re-render the Registered Games tab to update how our button looks like */
IgnoreActivities_reRenderGames: 'IgnoreActivities_reRenderGames'
});
IgnoreActivities_reRenderGames would match this
export {
IgnoreActivities_reRenderGames: blablabla,
}
when I used this before it would work cuz lazyWebpack checks the filter on the mod.exports, and then on every prop
const RunningGameStoreModule = lazyWebpack(filters.byProps("IgnoreActivities_reRenderGames"));
that module only has a default export which is the RunningGameStore
isn't a simple findByProps sufficient
I'm exporting IgnoreActivities_reRenderGames
it's a function that's not exported by default
findByProps should be fine
eh I just wanted to use it with mapMangledModule
const RunningGameStoreModule = lazyWebpack(filters.byProps("IgnoreActivities_reRenderGames"));
RunningGameStoreModule.IgnoreActivities_reRenderGames()
RunningGameStoreModule.Z.getRunningGames
if you wanted to use mapMangled you could just make the filter for reRenderGames m => typeof m === "function"
that won't work if any other plugin exports a function too
- i think this should be documented - pinned
- should i add general purpose stuff to vencord itself instead of adding it to my plugin so it doesn't have to be repeated by each plugin? (i.e open channel functions)
dw about using Z
if you deem something useful enough to be used by multiple plugins, add it to utils/discord or wherever else applicable
what if you make mapMangledModule call each filter on mod which is the exports object
there is technically but I didn't link it anywhere
ven embezzling ac funds
yop
@dull magnet am I missing something, shouldn't Vencord.Webpack.findAll(Vencord.Webpack.filters.byProps("voiceStates")); find voice channels since they have a property of voiceStates?

I believe that's what I want yeah...
findByProps refers to import names
Oooohhh
That explains what I was getting earlier
ven loves colorstore
require("foo").bar
Yeah
this gets the bar export from the foo module
i made a work around for this
this too
findByProps("foo") -> exports.something.foo
thats how discords webpack works!
they just have require, but it uses ids instead of names
obviously you have no way of knowing the id, so you search the exports instead
childern
patched the react call to call my own function too so i can steal the args
This unique to discord or does other react? projects do this too?
this is webpack
webpack is used in a lot of js projects
Vencord.Webpack.wreq = require: require function
Vencord.Webpack.wreq.c = require.cache: require cache has a cache of each module that has been imported. This is how findByProps works, it just checks every cache entry
So is Webpack the bundling of required node modules into a package for the web then?
yes
webpack bundles all imports into web friendly code with its own webpack require implementation
That clarifies a fair bit in my head, ty.
mmmmm
so since I'm trying to hook into the vc channels, I'd want something more like... Vencord.Webpack.findAll(Vencord.Webpack.filters.byProps("pu"));
because that seems to be vc channels... I think
@dull magnet did you add delay to module importer
in the gh patches checker
no
why would I
you get 429s from requesting every module in a row
150ms delay seems to do the trick
there's one single 429 so it's whatever

how do u know that
I made script to download all of the modules
to view src in editor 
dpacker
you told me to ping megu instead 
this was like at the beginning of october
the update wont gone
already on latest commit, Vencord A788813
but it keeps want to update
yeah thats a bug
i will fix it at some point
the issue is that there are new commits but no new build
cause the change i did didn't change any source files
fixed!
inb4 updater broken now

Testing updater changes is always so hard
because i gotta do some weird stuff to make my client think im outdated
so to use vencord alongside armcord, just copy the inside of browser folder to armcord plugins right?
ye
like this
don't mind the -> at Vencord.js
that just links my Development folder build to armcord :P
> vencord@1.0.0 watch /home/dea/.local/share/Vencord
> node scripts/build/build.mjs --watch
[watch] build finished, watching for changes...
✘ [ERROR] Could not resolve "diff"
src/components/PatchHelper.tsx:28:25:
28 │ var differ = require("diff") as typeof import("diff");
╵ ~~~~~~
You can mark the path "diff" as external to exclude it from the bundle, which will remove this
error. You can also surround this "require" call with a try/catch block to handle this failure at
run-time instead of bundle-time.
1 error
[watch] build finished, watching for changes...
Build failed
Build failed with 1 error:
src/components/PatchHelper.tsx:28:25: ERROR: Could not resolve "diff"
[watch] build finished, watching for changes...
```is this normal when you run `pnpm watch`?

may i know how or when does PRs get accepted? since i seen some plugins that haven't been accepted and been there for some time which kinda demotivated me towards this lol
as a wise person once said
with whole respect to the respective person, this doesn't give me an answer I'd like a more sensible answer
if plugins are gonna be PRs then there must be some responsibility and consideration to the efforts poured into them since unlike other client mods which i could share the plugin link with my friends, keeping in mind that've and i'm still working on a big PR with multiple plugins and features but why would i waste my limited free time on a coin flip pr
if you've not gotten feedback on a PR then you can pong ven or another maintainer to get someone to look at it - you'll notice that all of the currently open PRs have feedback from maintainers that the PR creators haven't taken action on
not really all of them...
I only found one that doesn't have feedback commented on it (technically two but I know there was discussion about the second one in this server between ven and the author)
- they're waiting on the author to do stuff
- author hasn't told ven to review
you shouldn't bundle multiple plugins in 1 pr
it'll never get merged because too difficult to do everything simultaneously
you can't just expect to open a pr and leave it hanging expecting itll get merged keep bugging ven then it'll work 
and where did anything say on that
i don't see any guidelines or "rules"
common sense if you've done prs before
split up the functionality as much as possible
Should be common sense
that's how git is supposed to work
it is generally common courtesy to one feature per pr, yeah
how adding multiple features in a single pr a bad thing? i've contributed to multiple big projects in such a way and no one ever complained lol..
it's more of instead of reviewing 4\5 PRs
it will be one
have you seen unreal engine's PRs lol?
it's not its just easier if everything is split up
easier to review what has been changed in order to add something
mega prs are insane
for some cases it might be understandable, but those are just plugins bruh
well i do get that
one went on for like a month
but also that's another thing i dislike, because if the plugin works as i intend it to i shouldn't be told what to do

that's not what reviews are for at all
they're to make sure your code style is consistent with the rest of the project, as well as that what you wrote is robust and won't break when discord pushes an update
it's also incredibly useful to have multiple sets of eyes to go over code to make sure there's not any issues that didn't get caught
Unless you're newpipe

sorry if i'm being annoying, but here there was only a "suggestion" yet the plugin didn't get merged?
the pr author said in the comment above that an "embed would be even cooler!"
if the author doesn't want to implement an embed in that pr they can say that, but they made it seem like they want there to be a pr there, so ven said how to get an embed
14 days, still haven't been accepted, i still kinda don't like how this works tbf, but thanks for elaborating on the topic
yeah you're right
I don't have a direct answer for that one but I know that ven has seen the PR since there's been response to the PR author in this server
I don't know for sure if there's been other discussion about it in the server as well
Make PR that allows loading plugins from folder 
use the manual installation process
Guhh
That doesn't solve the issue of distributing it without needing the person to install bunch of other shit 
i don't wanna teach every single one of my friends how to build something they know nothing about
^
ven's been working on a way to have redistributable third party plugins
I don't know off the top of my head if there's anything on github for it yet but it's still wip
with more discussion here: #👾-core-development message
hope that's gonna be done soon
I can confirm thats how it works
I dmed him at least 50-60 times to merge my pr
there's additional context to that where ven made changes to your pr as well
no one's gonna bite your head off xD
you can just pr and it'll likely get some feedback then once addressed will be merged
I mean i didn't merge that cause u urself said it was really bad
and smth along the lines of it won't work if you switch channel or whatever it was

If you switch channels for long enough discord refreshes the channel and I didn't patch mass message grabbing because it would be difficult as fuck
1 sec at school
all you'd have to do is filter that unless I'm missing something
uh
so
i wanted something to make some sort of a "dynamic" patch
i wanna have different plugins push this here
in the commented line i tried to populate some array and use it from different plugins to add them in there
but that doesn't quite work since dependencies are fired before the plugin is able to push itself to the patched array, though that patch works fine even it does call the component function before the plugin itself is initialized but that's not a big of an issue imo
any idea?
@dull magnet pls help 😫
wha
make the patch call a method on ur plugin
replace: "foo bar ...Vencord.Plugins.plugins.ServerListAPI.buildItems(whateverParamsUNeed)"```
wut
im not sure if u didn’t get what i mean or the opposite
ill re-explain jic, so i have two plugins that should patch same location so i figured i wanna do an api plugin for that patch but i can’t really find a good way to push stuff to the patcher from another plugins before it does the patch
exactly the way I just said
make ur patch call a method on your plugin
then your plugin builds the items later with enough time for plugins to add their stuff
see how the other api plugins work
i checked but i don’t quite get how they do it 
aight ill check again when i can thx
like this
the patch just adds code that calls a method on the api
then that method can do whatever u want
ughhhhhhhhhhhhh
i still don't get when this will be initalized
the place im patched is called once discord starts up and if i even add something to it how will it detect the change
it has to be added before it's patched
im so confused 
wha
you just insert code that calls ur method
and its only called once that part of code i scalled
so something like this?
im so fucking confused dude tf
i mean even if i do what i sent, how can i make other plugins push to that init function before it's called
you have to return what you want from the function
this code works already
but lets say
i wanna make it
like
Init()
{
return Elements;
}
and then from another plugin
somehow do
look how the apis do it
Elements.push(...)
they have a method that's called by the patch that renders the elements and a method to add stuff for plugins
I think you're overthinking this xd
your method won't be called until way later
plugins have more than enough time to push things
then you're doing something wrong
my brain is commiting suicide
Your brain is committing a skill issue
i already figure it out

fr
c++ is easier thant his shit
on god
thought i don't quite get how do you find those attrs
like Looks.LINK or the other one
what
i tried logging button but it just logs a function 💀
Button is any
so i don't really know what can be edited on it or not
Are you talking about react
yes?
functions can have properties in js
everything is an object in js
i know
just add a type in the arguments or wherever it is
but i wanna get the properties of that function not the function
you have to use the brackets and dots
that just logs the function
you can either do func. and look at autocomplete or spread it into a new object { ...func }
why the fuck would a function have properties bro
why wouldn't it
how am i supposed to logically have that as a possiblity
theyre likely classes
class Button {
static Types = {}
}```
as to how youre supposed to think of it, its just about looking at Discords code
for how they use those components
funny classes transform
i love javascript
Such a beautiful language
People who think french is beautiful are absolutely insane
nah that still doesn't fully answer my question dude
JavaScript is miles ahead
how do i get all the FIELDS on that thing
ong
how do you know there's a "look" property

ok listen here's what i wanna do
.
there's the props of the button i create
this thing somewhere has the fill color
and i can't find any way to change that color
i can change the color on the svg icon
but there's no property for the color
which is confusing the fuck out of me
style={{ color: "#ffffff" }} 
(i hope that is now how you are supposed to do it)
fill should just be the css style innit
i wanna add an option to change it's color though
i did try something like this but no luck
Isn't it the other way around though
classes are just fancy functions with properties
anyway @dull magnet can you check #68 later
wha
not after es6
they're fundamentally different in es5 vs es6
well they didn't exist before es6 right
People just did fake classes by adding properties to functions
no
you can do classes even before es6
its just without the synthethic sugar
js is prototype based object oriented
function Foo() {}
// Instance member
Foo.prototype.bar = 42
// Static member
Foo.baz = 42
new Foo().bar // 42
Foo().bar // cannot read properties of undefined - reading "bar"
this is still a class, though not as pretty xd
Yes that's what I was talking about
Fake class, by using functions with properties
well it's not a fake class
the class {} syntax does the exact thing under the hood
they're essentially the same
nah its not a fake class
classes don't exist in js
you're just dealing with functions that are also objects and they inherit properties via prototypes
yes and that's my entire point
anyways it doesn't matter
classes are fake, you can literally return different class from constructor or change the prototype 
aaaaaa I have to patch this
uh what would the best way to do that be
I could just go the easy way and just wrap the entire context menu component and manipulate it from js
that would probably be simplest
it depends
I had a similar situation and the way I did it was that I captured the variable name then used a back reference
like match js var (.{1,3})=foo.bar
then you can refer to the variable name via a backrefefencd
epic irregular expression!!!!
so if the code is var se=foo.bar.....&&se, something like
(?<=var (.{1,3})=foo.bar.+?children:)\[[^\]]+&&\1,+?\]
why husk
regex
regex epdxlodode
ven the spotifycontrols are so good
thanks for doing the heavy lifting on it
because now i can have spotify playing in the bg, the electron app is killed, and i can control it through discord
one less electron app that needs to run/be handled by the gpu
so good
that song is a banger btw
"i'll stay sane to fake it, but i'm deadpilled" lol
moved this button here lol
looks pretty good
but the code is horror
they hardcode so much stuff into style i had to use !important for everything ffs
did this to save vertical space in the already long userpopouts
here it still looks fine
poggers
hello good evening, where is the plugins folder that is already installed?
%appdata%/Vencord

I don't think the plugins
oh
if you used the installer there is no dedicated plugins folder, all the plugins are bundled into one file
all vencord plugins are installed by default though, you just go into settings and enable the ones you want
So if I install it using cmd, will it come in a separate folder?
Nop
if you follow the manual installation instructions you will have a separate folder for plugins, yes, but you shouldn't do that unless you want to develop your own plugin
what are you trying to do that you need to access the plugins folder?
yes I want to develop, but I wanted to study the existing plugins to know how the system works
Clone the github repo 
follow the installation instructions here then: https://github.com/Vendicated/Vencord/blob/main/docs/1_INSTALLING.md
Existing plugins are there
Ok, thx!
about lazyWebpack, what are the existing filters? and where can i find out about them?
If I'm understanding correctly, these:
https://github.com/Vendicated/Vencord/blob/main/src/webpack/webpack.ts#L39-L55
**webpack.ts: **Lines 39-55
export const filters = {
byProps: (...props: string[]): FilterFn =>
props.length === 1
? m => m[props[0]] !== void 0
: m => props.every(p => m[p] !== void 0),
byDisplayName: (deezNuts: string): FilterFn => m => m.default?.displayName === deezNuts,
byCode: (...code: string[]): FilterFn => m => {
if (typeof m !== "function") return false;
const s = Function.prototype.toString.call(m);
for (const c of code) {
if (!s.includes(c)) return false;
}
return true;
},
};
I wanted to know what are the existing filters to use, like this one: ("deleteMessage", "startEditMessage")
the byProps filter looks for any webpack modules that have the provided properties
you'll find those values yourself within discord's source usually, or someone will have already found some of the modules that are useful for common things
Do you know any website or place where I can find these byProps? and your information?
well
you find these things by reading discords code
think of the action u wanna do and search the sources (ctrl shift f) for key words related to it until you find something promising
ok, thx!
is the byProps of adding reaction in the message "addReaction"?
try it!
@dull magnet does the find part of the patches use like filters.byCode or?
yes
does it also use byProps or no?
okay
- webpack.search does the same as patch find
- you can use PatchHelper to test patches
Where's PatchHelper? Vencord.PatchHelper?
Got it okay, and stupid question can I pnpm watch from WSL or does that have to be on Windows?
I assume not, but prefer to work on WSL if possible so figured I'd ask
it works in any command line
Ah I'd probably just have to path it manually then, might do that later...
it looks like adding reaction to message doesn't work anymore, sad
@dull magnet you will accept this NOW https://github.com/Vendicated/Vencord/pull/217
also this causes a crash it should be ?.isBlocked instead
https://github.com/Vendicated/Vencord/blob/main/src/plugins/noBlockedMessages.ts#L46
**noBlockedMessages.ts: **Line 46
replace: ";if(Vencord.Plugins.plugins.IgnoreBlockedUsers.isBlocked(n))return;"
update
how does one invite this bot
@vapid latch yo since i can't dm
i want that shti on my serve pls
wtf @opal fern

uhm
Disabling -> Enabling a plugin with commands doesn't work
Because disabling plugin with commands doesn't un-register it
ye
This is blocking the stopPlugin() function from running
and unregistering commands
Does this actually do anything
idfk
uhm
started should be set to true on any plugin that registered commands
I think it's something else causing it
oh
well it wasn't
🤔
then that's a bug
oh I see now
**index.ts: **Lines 99-115
export const startPlugin = traceFunction("startPlugin", function startPlugin(p: Plugin) {
if (p.start) {
logger.info("Starting plugin", p.name);
if (p.started) {
logger.warn(`${p.name} already started`);
return false;
}
try {
p.start();
p.started = true;
} catch (e) {
logger.error(`Failed to start ${p.name}\n`, e);
return false;
}
}
if (p.commands?.length) {
if the plugin has commands but no start method then it won't be marked as started
see how it's marked only under plugin.start
are any types allowed? thinking about PRing a userscript i made a few weeks ago but it uses a bunch of untyped react stuff
namely c.__reactFiber$.return.memoizedState.memoizedState[0] and scope.__reactFiber$.key
I mean no one's going to deny it solely because of any but you should avoid it wherever possible
What does this do
There is a difference between patching discord and user scripts too
is that not what the start() function for?
So you shouldnt use that compiled react stuff and a mutation observer
You should probably use patches to replace a react element with your own
Start is for initializing stuff, and registering events and stuff
i'll be honest I have no idea how to do that
idk the first thing about react
Most is meant to be done with patches
It's pretty simple
Read the contrib guide
horrifying lmao
it's so painful 
is that script supposed to let you allow to change permissions in bot authorisation modal?
yeah
you can probably do it way better with vencord then
without the cursed react fuckery
i'm sure you can
i don't know the first thing about react but I can give it a shot this evening
yes
there's like almost no difference though
if u need help with typescript just let me know

Steal others code 
to do what
are you referring to discord’s context menus?
look at the patch that disables the first section of menu for message logger
or you can also do the same thing done in reverse image search
though i think reverse image search is not the best imo this should be moved to an api
so all plugins can append to that context menu
i also think adding it to the message accessories would be cool
what's that
is there api?
yup

it's okay i started ts two days ago XD
just make the api a dependency in ur plugin
yea ik
and then call addAccessories
well i think this is wrongly named actually
because to the things under a message
yeah this api adds to stuff under messages
guess i am back to the patch then
it's missnamed
@dull magnet @vapid latch ^^
well
actually maybe not
yeah mb
the other thing is called message actions not message accessories
i'm making a message actions api then 
wut
of what exactly
oh
uhhh hmm
lemme see
messagelogger has pretty much all patches you need for this
you can temporarly disable message logger and use those patches
so you cant have both at same time
you can patch the same thing twice
but it breaks one?
no, one of the patches won't work
oh u wanna make a button in the actions?
oh alright yeah i mean that's gonna take ages becuase ven accepts pr every two years
what decode
decode what
oh
ye dw im making the api rn
i mean i can share the files with you when it's done so your plugin gets progress too ig

should i post the one without decode
i need contributor badge
or else i will explod
its ok i will add you to my constants
😂
you want donor badge too?
too poor to have that 🥺
give all badges then
staff?
what repo
vencord
I don't know if this qualifies to be merged but I wanted to revive a friend's plugin https://github.com/dzshn/vencord-lastfm
Little Vencord plugin for Last.fm rich presence. Contribute to dzshn/vencord-lastfm development by creating an account on GitHub.
that's pretty cool
feel free to pr
I'm a bit confused though
Little Vencord plugin for Last.fm rich presence. Contribute to dzshn/vencord-lastfm development by creating an account on GitHub.
**index.ts: **Line 99
const response = await fetch(`https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=${this.settings.username}&api_key=${this.settings.apiKey}&limit=1&format=json`);
After googling a bit it doesn't seem like they have a websocket api
shame, ig polling is the only way
does last.fm not give you the duration & position in the song?
i dont see that plugin using timestamps
lastfm is more about counting the songs you play instead of tracking how long you were listening
i'm pretty sure you can only get when they pause/play song and itll run till the song changes
some songs have duration
like sometimes they add it to their database
if it's a popular song
but not every song
and it could be wrong v often
it is because it is based on user data
it's based on user data as well as their own data on popular stuff
yeah
but again it is more for like
counting songs
use stats.fm if you want the duration
but that is spotify only for the time being
there are millions of websites that have the duration but that's irrelevant...
millions?
it doesn't, the original plugin just saved when the track changed
and yeah the api is pretty silly
I'll try polishing some stuff on it later today and make a pr
you fixed nice 
nah i didnt fix that
I shouldn't try to cancel GitHub sponsors tough Paypal but rather through GitHub, else it breaks.
Hello,
Thank you for bringing this issue to our attention. We've initiated an investigation based on the information that you provided and we'll take appropriate action based on our findings. Please note that for privacy reasons, we're not able to share the specifics of the action taken, if any.
We truly appreciate your efforts in helping us to keep Discord a safe and friendly environment.
Sincerely,
Discord Trust & Safety
🧐
@green vessel bro how did you get the thumbnails to show????
That is impressive as all fuck
Unless you are registering each thumbnail and deleting after use...
apparently if you give a url to the same function grabbing the asset id's it gets a media proxy link from discord
so it just works
what the actual fuck
That is horrifying
But allows for so much cool shit
I assume thats there for spotify?
its the same proxy embed images use
gonna 100% use that trick/maybe ask you for help with it 👉👈
feel free to
Did your friend discover it in their original plugin or what
they did but I had to go a little further to get it to work
since LOCAL_ACTIVITY_UPDATE already expects the asset id
Right
Thats actually stupid
but so fucking cool
Vencord ecosystem > Betterdiscord ecosystem
this plugin took me too long to make because I was trying to do it the same way it was originally
and then I stopped and tried again
I figured out what event to dispatch and now it works
wait
i knew that but
can't we abuse that to proxy arbitrary images??
can't see why not 
horror he increased goal count
oh god
github forced me with a gun to my head
nop you just did because money
it told me to make goal 3 million euro bu i said no github!! i dont need that much!!
you send a fax
I unironically couldnt find a way to create a post
horrifying
after messing and changing variables of url
I finally found it
YAY
yop
gaming browser
opera gx
😎
how
horror now I have another challenge
change this username
it wants you to put a real name
and I cant find where to change the username
oh my god posting a question in oracle forums is hardest shit ever
first you need to figure out how to create a post
then you need to change the autogenerated username which you cant
ok I managed to change my username after few minutes of trying now I need to select this but all of these are disabled
only 2 of them are enabled
I wonder if I can just edit html and select it
horror
now time to hack into oracle servers and give myself permission
@dull magnet PLEASE HELP ME
I AM GOING INSANE
holy shit
I discovered old oracle error page
HUSKK
nightmare
LOV
now fix reviewdb
it also steals and logs data
surfeasy
sells user data for analytics
yeah??
i have a screenshot
ye
@graceful garden italian?
your about me
the creature
what's your pfp
baba is you skull my beloved
wat
i meant to reply
KonkMachine
we humans love being self destructive
Not really about humans love being self destructive
There is probably a lot more than "haha humans suicide bomb"
stop using discord and come over to matrix
matrix is bloat use xmpp + jabber but ejabberd not prosody prosody is in lua lua is bad use rust
fawns being actually funny? (impossible) (cops called)
🇧🇷 ?
spain and portugal shake tips
😂
my school actually is gonna go to portugal this summer
🗿
but i dont wanan go
because i need the money to go to germany
@dull magnet im going to break into your home
^
@dull magnet when api
never
how do you style embed text
i don't think you can style the description
you can style field's value
why wouldn’t you be able to style the description? lol
see how other things use tooltips
ofc i did
Also wrap your components in error boundaries so u don't get crashes
show how you use it

and as I said wrap in erorr boundary to avoid crashes
like jsx return ( <ErrorBoundary noop> <Tooltip>.......</Tooltip> <ErrorBoundary> )
icon is just an svg
return <Icon... works perfectly fine
you didn't add noop lmao
but with tooltip it just doens't work

message= makes it render the default erorr code block like in settings pages
noop makes it render nothing
you can also specify a custom fallback component
i know
so check the console for what the error js
it crashes if i remove onMouseEnter shit
so i assume im not supposed to remove that
but even with it, it doesn't crash but there's no tooltip
not crashing but not showing
Also again check the error it'll tell u what u need to know
it must be cuz im not using on mouse enter
Icon might not support it so you might have to wrap in a wrapper
yes
okay so i need an opinion too in the meanwhile
so i added platform indicators on member list
and on dm list
adding them to the profile is extremely ugly and weird so i added them as the first badge
is this good enough
or
like right before the badges there’s ur platforms
it’s not an actual badge i just added it in the badges group so it looks in context
just do it like the other plugins do
do it after the discriminator
uhmmm
?
what happens if both desktop and web
but I would just do it like how the other plugins do it
aka one of them in the pfp bottom right where dnd is
and the rest after the username
I think badges works too
but kinda odd lmao
ig ill move it to after the discriminator and call it a day
but u finna accept typing indicator first 😩
np tyt we gotta finish that then move on platform icons 
Ven eating breakfast at 1pm wtf
You don't?
i just ate breakfast it's 3pm
tbh it lookos better this way
imo
the other way looks absolutely horrible and randomly aligned
it's just dm list - server list and optionally in badges
i'm thinking
but im not sure
this is the last thing
ig if people want it ill add it
ah, the font looks small it looks like rn
cause I use low font scale
and the stuff like the chatbox could've been ported to rn idk
btw @cedar olive r u gonna pr ur changes to who reacted
Common iOS L
average ios L
you're so funny i spotted you all the way from #🧊-off-topic-iceman-only
I still haven't fixed that other issue
this is the first time i even remember this thing exists 💀
and today I'm gonna be busy all day
check #🧊-off-topic-iceman-only
LMAO
automod?
HAHAHAHA
publicly shamed
lmfao
this actually brilliant
I don't mind if you fix that other issue and include the fix I sent on #👾-core-development
opinions plsssssssss,
platform icons in the chat yes or no
the plugin is done but ill add that if someone wants it

which
the one with +0
or the one where it doesn't render users
yes
it's very useful
aight aight bet
i'll add toggles to all of them tho cuz i think it will be a mess if they're everywhere imo
that's the same issue
or do you say the one that doesn't render users the black circle
please initiate your self-destruction in a reasonable timespan
yop
discord doesn't render timestamps on listening activities apparently
maybe you have this on?
uhh no idea then
I'm dumb, how do I get the promise to resolve before continuing, is it even possible 
await
bruh????
it's inside a synchronus function though
make it async 
use useAwaiter
const [newPlugins, error, newPluginsLoading] = useAwaiter(() => DataStore.get("existingPlugins").then(plugins => ...))```
who do i have to beg for pr to be merged 🚎
what issues
I'm being ignored tho 🚎
beg harder then
or better yet just ping multiple times in the same message
bonus points if its 3+ pings so it gets automodded and then you get ghost pings

anyways time to figure out how to patch that mess of a context menu code


time to log that component and see how cancer it is
and then ill fix the force experiment enable because dum
add official store
openvsx so bad lmao
it has like nothing
like what
math.
cope
also count is always too lower by 1, as the last bubble is not a user
it's just that those users aren't cached














