#development
1 messages · Page 188 of 1
@wheat mesa sir, you've used opengl right?
omg the goat @craggy pine
can you show me where?
Let me find it
@humble gyro
I was also informed someone on pycord did a deep dive and turns out it is indeed malware
oh this person has perms for another repo
ok
cc @earnest phoenix
since its your github account
want to explain the malware 
what’s up
what malware?
i’m only contributing on the c++ one
A simple API wrapper for top.gg written in Python. Contribute to top-gg/python-sdk development by creating an account on GitHub.
bro what
if you have push rights (i dont yet 😭) could you revert it?
see https://medium.com/@demonia/lets-dig-deep-into-pypihosted-malware-part-1-94ada4737442 for more info, explains how it makes a bunch of fake commits and hides it in one
i think your github account was compromised then
i’m so confused but how am i able to revert it back when i didn’t even do that
i think yes
if its your github acc then you are able to

can u tell me how can i revert it back (lol i havent use git in awhile)
git revert (hash)
i reported internally when it came up
guess it wasnt sorted
Indeed wasn’t. Sadly. I’m sure more users are affected by this now
buffer i think you ran an info stealing malware
apologies, i think my github account was indeed compromised. Can someone remove my access to every repository
holy
there is a lovely concise list of people with access to those public repos 
is there a chance that the possible malware is still on my computer rn
lmfao its hosted on galaxygate
atleast no new version was added
likely
info stealers scrape your creds
problem is, since its from code and not like a file you've downloaded idk what to suggest 😭
enjoy rotating every single password you own

lemme get someone who knows more to help
ig we can just ff to the latest non-buffer commit then
good thing there's no release since 
i dont think it released publicly on pypi
pretty sure it is
so the affected user count will be absolutely minimal
we have a pip acc
the malicious package is down anyways
So the issue is
so the malware won't execute
great
I think pip comes with discord.py
So anyone using any other library had to download the one from GitHub
yeah
how can i revert the multiple commits
that was another commit someone wanted to make
or something
im happy its not affected any other libs
force push to the commit latest non-you commit
Discord.py requirement should be removed from pip version.
And just let the user install what library they want to use. Cause it does clash with forks of discord.py that uses the import discord part I guess
It is on the GitHub version just needs pushed to pip
ah
After the malware is removed
And whoever have access to the pip
if the lib converts topgg info into dpy objects, then this isn't possible
since there has to be a minimum AND maximum versions
since dpy changes some things ever so often that break compat
the requirements.txt was already fixed
also buffer, enable 2fa on ur acc
will do
enable everywhere possible tbh
its already enabled via login but let me do it again
pc is cleaned
but they need to remove my access on the repository
weird only the topgg python sdk was attacked
probably the weakest link
this is some 4d chess move, breach into maintainer's account so you can harvest bot tokens that use dpy + topgg
probably because the domain is a lookalike pypi installer
and they dont have a npm module for it or smth 
eventho those do exist be warned !!
Yeah what’s up
weird
i ran a safety check commandline
and it outputted this
Keep your Python dependencies secure, up-to-date and compliant.
not sure if this is helpful enough lol
but yeah i think its all resorted
i see
oh damn
ill be more alert when installing something now
I kinda now understand why it's so godamn bureaucratic to post packages to maven central
even if someone breaches my machine, and get my key, they still need the pass to said key
it's like 3fa
how did u even get breached?
discord url?
ion even know
im still finding it out
the last commit that removed the packages was signed with the same gpg key as the malware commits btw
gotta change it yeah, in case the invader got ur key
ill revoke and rotate my gpg key
is this TCP protocol with fast retransmits correct?
i don't fully get it yet. Like, suppose we fast retransmit a failed package after 3 duplicate acknowledgements, so we resend that data segment, the server receives it, but what do we do in the client side after receiving acknowledgement 1001?
Like do we just stop as that was all data, or do we need to resend all data from 1001 -> 2500?
Who exactly is in charge of the sdks?
I’d thought at least the cms had control over it 
Was just wondering what did you use to learn it
"Pain, suffering and a hint of insanity" - Waffle
And a bit of this ^
I’d highly recommend making sure you understand memory and how to manage it before doing opengl though
Because opengl is another layer of memory management, you have to manage RAM but also manage VRAM
Life update, it doesn't any you for any legal documents for getting 2nd bot verified 
Because they already have them, why would they require them a second time
I'm trying to count the amount of comparisons of merge sort and plotting on a graph. This is my merge sort implementation
fn merge_sort(arr: &mut Vec<i32>, comparisons: i32) -> i32 {
let length = arr.len();
if length <= 1 {
return comparisons;
}
let mid = length / 2;
let mut left: Vec<i32> = Vec::new();
let mut right: Vec<i32> = Vec::new();
for i in 0..mid {
left.push(arr[i]);
}
for i in mid..length {
right.push(arr[i]);
}
let mut comparisons = merge_sort(&mut left, comparisons);
comparisons = merge_sort(&mut right, comparisons);
merge(arr, &left, &right, &mut comparisons)
}
fn merge(arr: &mut Vec<i32>, left: &Vec<i32>, right: &Vec<i32>, comparisons: &mut i32) -> i32 {
let mut i = 0;
let mut j = 0;
let mut k = 0;
let left_length = left.len();
let right_length = right.len();
while i < left_length && j < right_length {
*comparisons += 1;
if left[i] < right[j] {
arr[k] = left[i];
i += 1;
} else {
arr[k] = right[j];
j += 1;
}
k += 1;
}
while i < left_length {
arr[k] = left[i];
i += 1;
k += 1;
}
while j < right_length {
arr[k] = right[j];
j += 1;
k += 1;
}
*comparisons
}
But when plotting it I get a linear graph, so there's something wrong with how I'm calculating the comparisons
Does anyone know of a bitvise(ssh/sftp client which supports a dark mode.
I'm tired of being blinded by bitvise
WinSCP is a good sftp client
I use it
You have 3 options with it iirc
Thanks ❤️
System, Dark and Light
I'll download it the second I get a chance.
np
Only annoying thing about it is the constant updates
but 
do what you have to do to remain secure
i basically manipulated an image from my host pc and add it as a MessageAttachment to the embed setImage field by using attachment://file.png.
After a few months it basically removed this file from the setImage, displaying a greyish image.
But other people seem to upload images and it permanently stays. Is this because a normal image does not get deleted while an embed image does? You can for example see the ephemeral-attachment instead of normal attachment.
embed images dont get auto-deleted
ephemeral embed images however...maybe
since the whole point about ephemerals is that they only exist for a while
Hey, I want to make a dashboard for my bot. Is it smart to program an API where the bot and the dashboard can access it? So that I have a large Redis cache and everything then goes together to the database at certain intervals.
it's not "smart", it's the only way you'd be able to make a dashboard lul
as for redis, you dont really need it unless you expect to have a VERY large flow of data
also depends on the size of said data
I would like to add a Redis cache so that I am prepared for the future.
Atm it is not alot of data
adding a cache layer without the need for one can be detrimental to the performance
also you need to handle syncronization between cache and database properly as to not lose nor show stale data
databases are well within confortable zone at 10k reqs/s
you'll inevitably have to rewrite the bot along its growth, dont be too preemptive
Yes thats true.
One side question: How can I get the „Bot Developer“ role?
Yes
wasn't a question lul
huh
if you have a bot there, then ask some mod for it
since luca might (will) break and not give the role automatically
Sorry I am f…ing dumb😂
talk to @harsh nova (if he remembers to do it)
how can i remove it?
remove what?
I am here
well, how can i turn it into a normal attachment
did u put the image in an ephemeral embed?
no
that's weird then
oh wait
is that a thread?
might want to check whether images sent in threads are temporary
do you remember your own name
duh it's jh
ahh it might
no nvm
it'sjust a regular channel
i will post the code here soon
maybe something goes wrong in there
i just realized that prisma is actually dating back all the way to fucking 1990
prisma is amazing
i've never used it but read a dutch article dating back from 1990 where they noted that it was ran for database queries on a shared nothing dfs with 100 nodes.
look up discord js guide
That’ll give you a “good” start (I don’t agree with everything they say to do)
though each node only had 16 mb of memory
prisma is older than JavaScript, Python, and Java 
nobody:
my phone's termius session that i forgot to close 3 days ago: ☹️
"its termius time"
I love the part of the ssh where he said "its termius time" and started termius-ing everywhere
can u send some to me?
lol so random
Dropshippers when they find out they provide nothing to humanity, actually raise prices, and promote child labor: 😱
Mmm my favorite
@drifting chasm no ads please
@solemn latch uwu
OwO
clipped turned into an emoji

what got a problem?
bored
quick question, i am working with a vue project and by default all the console logs go in the browser's console. Is there a way to move them to the machine's console or editor's console?
only if vue has a "Run" option instead of "Build"
else you're packing everything into production, there's no vue at that point, only html + css + js
it does, npm run dev
i see
so i have been testing on development for awhile but for some reason i cannot get it to log on the machine's console
unlike nextjs
you probably cant then
😭
that said, you could try webstorm
jetbrains usually go out of their way to add qol features
Are you aware of a way to organize the logs in the console at least?
i am using webstorm
use other levels aside from log
like can i use a custom logger?
console.error, console.trace, console.debug, etc
with colors and allat
doubt it
on my strapi backend i used winston
you could, however, output to a file
no not an option
I'll just see if i can organize the console logs
maybe create a middleware for th logs
and handling logging properly?
did u try running through "debug" instead of "run"?
also, are u running from ide buttons or terminal?
i configured th ide buttons my self
all of them run dev
webstorm doesn't have it by default?
i think it does
but i changed them
look how beautiful the backend ones are, i am proud of these
reason?
to run them on dev + run them both at the same time with a shortcut
they use npm by default but i have added yarn in the configs. so it does run on yarn as develop
wait did u create a js project or vue project?
I meant when creating the project in webstorm
I am not the one who created it, but i am pretty sure it was created with the create vue app thingy
is that what you want to know?
or am i getting it wrong
I mean this
webstorm add facets to the project when you create through there, perhaps your project isn't being detected as a vue project but as a regular js one
could be, but still not everyone runs the project on webstorm
so i should not base it on the editor
yk what i mean
i think i am better off just formating the browser logs and making them clean
since as you said in production it comes as just html js and css
unlike the backend
for now u can just use the different levels of logging js has
console.log is just the generic INFO level
so for example when there is an error thrown, i'll get rid of the non important info and only keep some of it
will do
thanks
now it's time for a little break
@wheat mesa can't say how much I hate people who do this
like, ffs don't deploy alpha/beta versions as releases
ok i need help, because i have been hititng my head against the wall abt this for days. my interactions keep doubling as per my console logs. for background info:
- there is only one instance being run
- i use an event handler -> separate files for events. other events do not double
- the interactionCreate event is only listened to once
- i defer reply for one command, but every command is affected
- this applies to every interaction, including buttons (where i noticed this issue)
interactionCreate.js:
const pool = require('../bot')
const config = require('../config.json')
module.exports = {
name: Events.InteractionCreate,
async execute(interaction) {
console.log(`interaction type: ${interaction.type}`);
if (interaction.isChatInputCommand()) {
await handleChatCommand(interaction);
} else if (interaction.isButton()) {
await handleButtonInteraction(interaction);
} else if (interaction.isAutocomplete()) {
await handleAutocomplete(interaction);
}
}
};
async function handleChatCommand(interaction) {
const command = interaction.client.commands.get(interaction.commandName);
if (!command) {
console.error(`No command matching ${interaction.commandName} was found.`);
return;
}
await command.execute(interaction, pool);
console.log(`${interaction.user.username} used a command | ${interaction.commandName}`);
}
async function handleButtonInteraction(interaction) {
if (interaction.customId === 'nextPage') {
//handle buttons. too long and not related to issue
}
}
async function handleAutocomplete(interaction) {
const command = interaction.client.commands.get(interaction.commandName);
await command.autocomplete(interaction).catch(err => {
console.log(err);
});
if (!interaction.deferred && !interaction.replied && interaction.isChatInputCommand()) {
interaction.reply({
content: `uh oh, an error occurred.`,
ephemeral: true
}).catch(console.error);
}
} //added to try to mitigate issue. did not make a difference
jk i fixed it
something in my main.js was duplicating shards
do i know what? no
will i ever know? no
I was going to blame
if (interaction.isChatInputCommand()) {
await handleChatCommand(interaction);
} else if (interaction.isButton()) {
await handleButtonInteraction(interaction);
} else if (interaction.isAutocomplete()) {
await handleAutocomplete(interaction);
}
for not being a switch case ;p
I was going to say that you can't convert this to a switch case before remembering that those are just basically instanceof checks 😭
Discordjs is so abstracted it makes better code harder here.
Even if the performance benefit here is basically 0
I'd do the same thing, if statements
tbh i moved them to functions bc i could not keep scrolling up and down checking those if/else
coz im like Did i put a bracket somewhere wrong???
Hey, so I was told to head here from the lovely people over on the SRA discord (SomeRandomAPI).
I am developing a bot, which in short will send an "OfTheDay" each day at 10pm. You can select 5 options from a list of selections, for example: "Dog Of The Day", "Question Of The Day" etc etc.
This can all be customised via a /setup command
(See photo below)
So far, I only have three commands:
/setup, /userinfo, /ping.
Whilst these commands do what is required of the bot, I want some more stuff to add and I just cannot think of anything.
Does anyone have any sort of ideas or challenges for me that I could add to the bot?
|| On a side note, this bot is made for a specific purpose.. I don't want it to be one of those really common multi-purpose moderation bots. ||
better than my handling of just slash commands ```ts
if (payload.isCommand()) {
if (payload.isChatInputCommand()) {
const slashCommand = client.commandManager.getSlashCommand(payload);
let shouldRun = true;
try {
if (payload.inGuild()) {
shouldRun =
(await slashCommand.userPermissionCheck(client, payload)) &&
(await slashCommand.botPermissionCheck(client, payload));
}
shouldRun = shouldRun && (await slashCommand.onBeforeRun(client, payload));
if (shouldRun) {
await slashCommand.run(client, payload);
} else {
await slashCommand.onCancelRun(client, payload);
}
} catch (e) {
if (e instanceof CommandRunError) {
await slashCommand.onRunError(e, payload);
} else {
await slashCommand.onUnexpectedError(e, payload);
}
}
}
}
back when I actually did discord dev

oh man 👀
though I was quite happy with this result
it led to very nicely structured commands
Like so ```ts
export class TestSubCommand extends BaseCommandOption {
constructor() {
super({
name: 'subcommand',
description: 'desc',
permissionsClient: [],
permissionsUser: [],
});
}
async run(client: PaperClient, interaction: ChatInputCommandInteraction) {
await editOrReply(interaction, 'yay');
}
}
heavily inspired by detritus
i'll stick with my silly code thanks LOOOL
Customizable time of day would be an interesting thing to work on.
had permission checking built in and optionally overridable functions for extra pre-run checks
ppl will ask me for dev advice and all i can say is.... augh.... im a silly dev pls dont rely on me
But all the async calls 👀
What's wrong with that :c
I will give it a go, this would actually help out with my testing. Usually I would have to set the time for the cronjob, restart the bot, then wait for it to come online and post the thing to see if it worked. Really delays me lol
Oh, wait. Is it even possible with a cronjob?
You would likely want to move away from cron there.
The way i would handle it would be a 10 second interval, checking the database for upcoming requests, then setting a timer to handle each one as it comes up(or just handling them in bulk, they might be off by 10 seconds, but not a big deal)
timer 😰
It should be using callbacks, or avoid async code.
async is great, but for base structures imo its better to not.
Puts every async call at the end of the event loop
eh I'm too lazy to care about the ins and outs of the event loop in terms of a discord bot
I don't usually use js/ts much anymore
I think understanding the event loop has made me over concerned with it tbh.
Plus if I was interested in high performance code, I'd be using a different language
In a bot these days I'd make everything callback based inside the command handler
yeah fair ^-^
Just made it because it was ease of use

ello
im updating my server count every 30 minutes ish, i used the token from the topgg site itself
but nothings happening 💀
why is intellisense in vscode broken for rust 😭
Are you using rust-analyzer
yes
Why is computer craft so complex
Took me like 4 hours to make a working wireless network with access points and signal strength detection
hiya
finally got access to the github, removed the commits on python sdk
anyone using those specific commits should get an error and re-install to the latest commit hash
any plans on fixing top-gg/docs?
aight
😭
top.gg servers are so old that if i want to update nodejs i need to manually build and install glibc
u dont wanna know
they will soon
lol
no no we do actually
you said this in the dev channel
big mistake

Not enough caffeine in the universe to help me fix these messes‽
Huh?
Weird question for development chat
Hi how are you NyNu
sorry lost my internet connection while typing this
so, how can I make a modal pop up with html & css
so if I clicked on a button it will pop up
You’ll need js for that as well, granted it’s a small amount that you can just inline it
"enhance the tech industry"
If it works for you then who cares but AI is definitely not going to enhance the tech industry (at least for programming quality) for a very long time
Battleless vibes
are we certain its not?
Wouldn’t be 100% surprised but this account is 3 years old
Hi
to be fair, I did ask chatgpt to help me with my unity game a few times, but its knowledge is quite outdated and it produced quite a few errors, but got me on the right track
I usually use it for small mundane tasks, like replacing a variable or some small math I can't think of right away
I realized after I sent it I didn't know what exactly I meant to say but it wasn't that
I swear I know about find and replace

if anyone has time today, can i get a little help with utilizing sqlite lol
what is your issue?
Funny
this is an excellent example as to why you shouldn't ask to ask
2 hours already and neither the question nor the solution are known
it's a bad habit of theirs
does anyone understand the difference between them?
no thats ez, i am trying to understand this theory
but i don't get it at all
like wat'ss the difference betweeen the 2 characteristic creations
without context it's pretty hard to understand what those powerpoint slides are saying
I want to connect my bot to a database and hear that sqlite is best for beginners, just not sure where to start
When I moved all my projects from a VPS to a dedi my RAM usage went from 25GB on the VPS to 15GB on the dedi. Like wtf? I didn't change any code.
Maybe better RAM? 
It stabilized at 10gb? 👀
was my vpe really that bad? 
or at 15
yeah! my bot has been up for a 3 days now and it's stabilised at 15GB total usage for the whole server (my mod bot, my main bot, my db, my microservices...). It used to all use 25 to 28GB out of the 32GB it had on my vps and now it's all using 15GB total
👀 thats so weird.
Do VPS's have some overhead that happens within the VPS itself?
this is on the dedi
This feels like a question for dylan ;p
i mean, you're sharing the hardware with others, so i guess there's some inefficiencies there?
did u compare the processes too?
but 10GB of efficiencies seems huge
no i don't have a record of the old ones
but what's insane is i went to town with cache allowances on the dedi since i have the space. I doubled the cache my db is allowed to store and i doubled the max node memory or whatever it is (this is not my field)
and yet it's still using 10GB less
i don't understand 
the first move is to understand what is SQL and how to use it
sqlite is easy for beginners because it has very low complexity regarding features, and is really fast
there are a lot of tutorials and courses around regarding how to use sqlite on every language
Also if you wanna know how fast a dedi is vs a vps @solemn latch
A bump in 2 versions of postgres + the new dedi hardware
if you're using js, you start with installing an sqlite library from npm
the best one around is better-sqlite3
the library will take care of managing sqlite itself, you just give it the sql commands
now, SQL is a separate language as a whole, different from JS. its the language that defines what sqlite should be doing
so its a good idea to learn a little about the SQL language itself
basically what you will be doing in JS, is loading better-sqlite3, then with the library, you send commands to sqlite, for example like this:
database.prepare("SQL command here").run()
with the SQL language, you can create and run all sorts of commands, like create a database, write data, read data, etc...
the good thing about SQL is that its an independent language, meaning it works the same way in JS, in python, in C# and in any other programming language
so its always a good thing to learn
I swear we need to make a website called timanswers
Just copy paste the questions and answers
lmao
lmao
When will I get a section of this dedigrandpa?
^-^
dedi literally means grandpa in slovenian
maybe the cpu cores?
on a vps they are shared and not dedicated to you, so it might be a cause for such high ram usage as the ram has to pickup slack I assume anyway
TimGPT
Yeah I know there'd be some overhead but like 10GB worth?
Seems a little crazy
Pulseheberg
never heard of em
They're a small French company
Honestly I've been super impressed with their services
did you check if its not the swap configuration?
But I've outgrown them
maybe the dedi is swapping more
the os image is the same?
So I used this API
from discord.ext import tasks
import topgg
# This example uses tasks provided by discord.ext to create a task that posts guild count to Top.gg every 30 minutes.
dbl_token = "Top.gg token" # set this to your bot's Top.gg token
bot.topggpy = topgg.DBLClient(bot, dbl_token)
@tasks.loop(minutes=30)
async def update_stats():
"""This function runs every 30 minutes to automatically update your server count."""
try:
await bot.topggpy.post_guild_count()
print(f"Posted server count ({bot.topggpy.guild_count})")
except Exception as e:
print(f"Failed to post server count\n{e.__class__.__name__}: {e}")
update_stats.start()
It said on my end that it posted the server count, I go to the top.gg page and it hasnt updated?
Whats the ID of the bot?
1177973930225569802
I've even tried this snippet of code
import topgg
# This example uses topggpy's autopost feature to post guild count to Top.gg every 30 minutes
# as well as the shard count if applicable.
dbl_token = "Top.gg token" # set this to your bot's Top.gg token
bot.topggpy = topgg.DBLClient(bot, dbl_token, autopost=True, post_shard_count=True)
@bot.event
async def on_autopost_success():
print(
f"Posted server count ({bot.topggpy.guild_count}), shard count ({bot.shard_count})"
)
And a direct request to their API
import aiohttp
import asyncio
async def updateStats():
url = f"https://top.gg/api/bots/1177973930225569802/stats"
headers = {
'Authorization': ""
}
payload = {
'server_count': 49956
}
async with aiohttp.ClientSession() as session:
async with session.post(url, data=payload, headers=headers) as resp:
if resp.status != 200:
print(f'Failed to update server count: {resp.status}')
else:
print('Server count updated successfully.')
asyncio.run(updateStats())
None worked
is 49k not right?
right now we need to go into edit, press save
didnt do anything
how long approx does it take? because we tried waiting ebfore and we waited weeks and nothing happened
I'm totally lost in this situation guys 
if ctrl f5 didnt work, then it's likely yet-another-topgg-cache-issue
probably the expiration aint working
So, in your logs every 30 minutes for weeks it logged
"Posted server count ({bot.topggpy.guild_count})"
in your console?
👀
have you edited in the past hour?
Direct API call
I used that
It didnt update
It wont update right away.
For now, don't edit and leave it auto posting every 30 minutes.
In 3-4 hours check https://dblstatistics.com/bot/1177973930225569802.
dblstatistics checks the backend, and should tell us if the backend is updating or not.
If you use the direct api code youll have to run it every 30 minutes with a timer, or just manually run it.
If I leave it like this, its good?
dbl_token = ""
bot.topggpy = topgg.DBLClient(bot, dbl_token, autopost=True, post_shard_count=True)
Or do I go back to this
You need the
@tasks.loop(minutes=30)
async def update_stats():
"""This function runs every 30 minutes to automatically update your server count."""
try:
await bot.topggpy.post_guild_count()
code too iirc
I dont know python, its over my head on how it works.
Alright
I think it's a newer version
really weird then
the only things i can think of that would explain a 10gb difference is either ram compression, swapping or the workload not being the same
let embed = EmbedBuilder.from(interaction.message.embeds[0]);
embed.setDescription(
`> Profit report posted by ${interaction.member}.`
);
embed.setTitle("🚀 | Profit Submission");
let k = await outputChannel.send({
embeds: [embed],
});```
why is my discord bot sending ephemeral embed images such that they eventually dissappear after a few months?
const attachment = new AttachmentBuilder(await canvas.encode("png"), {
name: "report.png",
});
const actionRow = new ActionRowBuilder().addComponents(
new ButtonBuilder()
.setLabel("Accept")
.setCustomId("complete")
.setStyle(ButtonStyle.Success)
.setEmoji("✅"),
new ButtonBuilder()
.setLabel("Decline")
.setCustomId("discard")
.setStyle(ButtonStyle.Danger)
.setEmoji("❌")
);
const botInfoEmbed = new EmbedBuilder()
.setColor("DarkButNotBlack")
.setFooter({ text: `🚀 Report Bot | Profit System` })
.setTitle("🚀 | Are you sure?")
.setDescription(
"# Image Metadata" +
"\n\n> ``Name:`` " +
`${name}` +
"\n> ``Quantity:`` " +
`${quantity}` +
"\n> ``profit:`` " +
`$${profit}\n\nPlease click on one of the buttons below to send this image to the ${outputChannel} channel or to discard it.`
)
.setImage("attachment://report.png")
.setTimestamp();
let z = await interaction.reply({
ephemeral: true,
fetchReply: true,
embeds: [botInfoEmbed],
components: [actionRow],
files: [attachment],
});```
months or minutes?
if youre asking why its sending ephemeral messages, it's because youre sending it as an ephemeral message
discord only stores files for ephemeral replies as long as the reply exists
(a bit longer than that but no guarantees)
i got it working but what's this type of bullshit?
embeds[0].image.url returns me this a link, that once you click on it downloads a random ass file
A:\Windows\Documents\GitHub\Amanda\packages\runtime-worker>yarn start
A:\Windows\Documents\GitHub\Amanda\node_modules\backtracker\dist\index.js:32
try { throw new Error(); } catch (e) { stack = e ? e.stack : ""; }
^
[getStack (A:\Windows\Documents\GitHub\Amanda\node_modules\backtracker\dist\index.js:32:58),getPrefix (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:227),post (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:609),getStack (A:\Windows\Documents\GitHub\Amanda\node_modules\backtracker\dist\index.js:38:13),getPrefix (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:227),post (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:609),getStack (A:\Windows\Documents\GitHub\Amanda\node_modules\backtracker\dist\index.js:38:13),getPrefix (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:227),post (A:\Windows\Documents\GitHub\Amanda\packages\logger\dist\index.js:1:609),getStack (A:\Windows\Documents\GitHub\Amanda\node_modules\backtracker\dist\index.js:38:13)]
Node.js v20.8.0
The fuck is this supposed to mean lmao???
even just new Error().stack does that so dont get me for syntax
Error is from line 55 (there are some changes I made while trying to rapid iterate fix, but nothing made any effect on the error)
oddly, works in the repl
Oh wait. It was console.logging which I overwrite so circular reference. I'm dumb
hullo... i am trying to post the server installs for my bot using the following code:
def update_installs(install_count: int):
response = requests.post(
url=f"{BASE_API}/bots/{BOT_ID}/stats/",
headers=_headers(),
data=json.dumps(
{
'server_count': install_count,
},
),
)
response.raise_for_status()
return response.json()
def _headers():
return {
'Authorization': BOT_TOKEN,
}
the POST call doesn't return an error, but also doesn't seem to have updated my servers count:
>>> from services import top_dot_gg
>>> response = top_dot_gg.update_installs(50)
>>> response
{'shards': []}
>>> top_dot_gg.get_installs()
{'shards': []}
(consistent with https://dblstatistics.com/bot/1186494834446454784)
could anyone point me towards what i'm doing wrong?
You're missing the content-type header
application/json
ty... i just added that and tried again with the same results:
def _headers():
if not settings.TOP_GG_BOT_TOKEN:
raise Exception("missing TOP_GG_BOT_TOKEN")
return {
'Authorization': settings.TOP_GG_BOT_TOKEN,
"Content-Type": "application/json",
}
>>> from services import top_dot_gg
>>> response = top_dot_gg.update_installs(50)
>>> response
{'shards': []}
>>> top_dot_gg.get_installs()
{'shards': []}
also your cat is indeed cute.
its been awhile since I've posted using the raw api, you might need to provide all three values.
shardId and shardCount, and serverCount.
Its been awhile, so I could be wrong
Nope, I was wrong
yah... same results with:
def update_installs(install_count: int):
response = requests.post(
url=f"{BASE_API}/bots/{BOT_ID}/stats/",
headers=_headers(),
data=json.dumps(
{
'server_count': install_count,
'shard_count': 1,
'shard_id': 0,
'shards': [install_count],
},
),
)
response.raise_for_status()
return response.json()
I'll play around with the API and see if I can figure out what we're missing ^-^
tyvm!
hmm
Theres no way its the trailing slash is it?
url=f"{BASE_API}/bots/{BOT_ID}/stats/",
to
url=f"{BASE_API}/bots/{BOT_ID}/stats",
huh. i think that was it. ty!
Python 3.11.7 (main, Jan 17 2024, 06:37:55) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from services import top_dot_gg
>>> top_dot_gg.get_installs()
{'shards': []}
>>> top_dot_gg.update_installs(50)
{}
>>> top_dot_gg.get_installs()
{'server_count': 50, 'shards': None, 'shard_count': None}
>>>
goofy api
hey woo
hows ya
hungry
Hows your nextjs skills?

I need a lib that takes
https://nextjs.org/docs/app/building-your-application/optimizing/fonts#google-fonts
And makes it so I can dynamically load any font in here.
Thanks
Just make it open source, ezpz
kek
$3
I'm bored and making a description builder.
And I want to let users use whatever font they want
But it sucks 😦
uh
I mean
you can just import everything from that lib
and just search it like an object
I think
so import Fonts from 'next/font/google' then Fonts["Inter"]({})
import * as Fonts from 'next/font/google' if it doesn't have a default
I don't see making a lib for something like this being super helpful tbh

no offense
Ah, I remember why this wont work.
I might work on my i18n project again
Fonts need to be defined as a const, its a restriction on the next/font/google thing
Better yet, I will make an entire discord js framework 
ask tim for help ^-^
oh god
tim would demolish me and essentially rewrite the entire project 😭
I just want something to do on the side so I don't get bored of just one thing
wat
do something outside of discord
nein
touched grass as instructed.
instructions unclear, got muddy hands.
C-.

ello
my server count does not get added on the top.gg website ;-;
this is the code i use, i based it on what the api said:
const body = [
{ server_count: client.guilds.cache.size },
];
await fetch(`https://top.gg/api/bots/939565109787902052/stats`, {
body,
headers: { Authorization: "token removed due to security reasons" },
method: 'POST',
}).catch((err) => console.error(`#${cache.index + 1} ${this.name}: ${err.stack}`));
im pretty sure its not an issue with your api, just im probably doing something wrong ;-;
I dont think the body should be an array
also, you have to stringify the body before sending it
oh
oh okay my bad i was reading docs wrongly
if its arrayed it acts like shards
and my bot is not sharded
thank you :D
yw
once i post it, would i need to refresh data? or would it load automaticly
It updates over time on its own, but you can encourage it to happen faster by editing and saving.
What Is The Best Hosting?
best in terms of what?
Just raw performance ignoring price?
Has anyone here integrated stripe into their platform? If so what did you use? I was reading the documentation on it and they quite frankly have a lot of different options. Payment links, Checkout, Connect, etc. I know I will likely need to use a combination of Checkout and Connect if I wanted to make my own payment flow with them, meaning I would be making my own customer accounts when it comes to it.
I use it through Chargebee. Super simple to set up and Chargebee manages all my subs for free.
oh?
You can even add other payment processors like PayPal, Amazon Pay etc. It's an excellent product.
hm
All I deal with is webhooks sent to my bot from Chargebee to update it on the status of people's subs.
Everything else is handled by Chargebee
The real struggle is keeping track of taxes on such platforms 😉
Stripe have a taxes add-on that calculates it for you
Oh good
Chargebee is free up to like €100k in lifetime revenue or something. But honestly I'm nowhere near that but I'd happily pay for it already.
I mean, stripe I can use, I just don't know what flow to go with.
My usage will be fulfing orders and shipping to the customer.
Oh wait it's actually $250k
they increased their free tier
Oh not subs?
no
Chargebee doesn't make sense for you then
yea which is why I was about to say chargebee won't work

I was just looking at their website
I haven't worked with the Stripe API so I'm not much help 
all good
the stripe discord kinda blows ngl


See idk
I think I understand what I need to do but please if anyone's ever used stripe's api reach out to me 😭
I’m at work atm but will help after
ok
What I do is check if a user has a stripe ID linked to them in the DB
if they don’t, generate one
Then generate a checkout session with their stripe ID and assign an order ID in metadata
Well here's the thing. I plan on making comissioner accounts with my platform, wouldn't I need to integrate stripe connect into my workflow as well?
Then use stripe webhooks, and watch for incoming payment events matching that stripe ID and match the custom meta data
Ah true
How would that play out with the whole payment stuff
Pretty sure stripe checkout works with that

IIRC you pass a stripe connect ID too and it will link to their stuff
I think I will first need to work on integrating stripe connect which is something I didn't plan on doing until later cause comissioner accounts wasn't something I was worried about yet
it seems like the most viable thing tho to get it out of the way
Then I can work on payment processing and figuring that out.
oh cool
I am using rust for this, so the package I am using is kinda wack.
Stripe makes everything easy asf when you figure it out
It's docs page is a mess
Honestly I wasn't too confused on how to use stripe, just what to use 
My workflow is like this
Customer creates an account on my platform -> I think I use stripe here? -> They browse the products -> They comission a design to go on those products (or choose to just take the design as an image file or smth) -> Checkout -> Pay -> Order ships or is emailed to them if they choose the second option
Now the thing is
I have no fucking clue on how to define products. I know stripe has a products page, but that seems very limiting
I wouldn’t use that
It’s quite slow and buggy and some adblocksrd stop it

Man making a service is a lot harder than I thought when it comes to planning this shit out

I might need to rework my auth flow to work with stripe connect

I will bother you about this later if you don't mind, but to clarify, have you ever used stripe connect?
json? :c
Hey. I know this may be simple js but whatever..
If I want to map every role that a user has (apart from @ everyone), would i do:
<member>.roles.cache.map(role => `<@&${role.id}>`).filter(role => role.id !== interaction.guild.id);
Or does the filter have to come first
filter first
because you want to filter out the everyone role
then map over the result
Okay cool, thank you!
Yeah, filtering here would be filtering over a list of strings that doesn't have an id property
So in practice your filter predicate would always return true
@green kestrel well im here
sure
trying to figure out how to make a table relation rn.
Essentially there are two tables. students and campuses. A campus can have multiple students, but a student can only belong to one campus. How would this be modeled in sql?
raw sql table relations are new to me, I usually had an orm like typeorm handle this for me 
I was thinking that the foreign key on the students table that references the campus e.g campuses_id had to be unique but if I do that, then that means that campus_id cannot appear anywhere in the table again
hm
hmm a ping was deleted
wasn't it this
a good and trusted hosting
hetzner?
Personally, at the moment I am using datalix (https://datalix.eu/) to host the bot and databases and contabo (https://contabo.com/en/) to host photos/videos because they had a promotion in which they did not charge the setup fee at all
Both work without major problems and contact with support is very pleasant and easy 
i use datalix and hetzner
and a few others
im liking https://inceptionhosting.com/vps.html
i use digital ocean for both my vps and cloud db
I didnt delete it

yeah it was
so yeah do you have your bot source on github
i could take a quick look and stab a guess at what discord didnt like
no promises 🙂
question
is it ok if i store images and files uploaded by a user on the file directory on my vps
Not for mass usage only used by admins
i only store the directory on the postgres so i can retrieve it easily later
storing would need to be stated in the privacy policy, usage of uploaded data im not sure. i also recommend having some sort of filter on user uploads
aka where the file is located
If it's included in your privacy policy, there shouldn't be a problem
oh that's not the issue. I am just wondering about my practices
Like what else could be there besides storing in the file system
as long as its stated in the privacy policy, it should be fine imo
oop practices as in speed etc etc
oh my bad HAHAHA
I am storing files uploaded by the owner of the site so a policy isn't important
it's a webite
i don't think it would be slow ? not sure though since im not the most knwoledgable on that
oh that's fine, yeah it aint that slow. I'd have to wait for production though and i really need some strict rules as someone could fuck my entire vps with a few uploads
i store my images/files on cloudflare and havent had any speed issues in retrieving tbh
never tried
we could be talking about 100mb + files
so
ty
I use r2 and love it
i don't get the 10gb/month
like i can store 10gb worth of data this month and another 10 next month lmfao?
or 10gb all time storage
so i can have up to 10gb stored on cloudflare
with aws you only have 10gb free for the first year
yes
i see
that’s what i’m doing
optimize all uploads to be 200kb
and just live off the free tier
Can't i got a bunch of large files
so i think i will continue with the vps storage
but i will def use it on some other project
@solemn latch consider contabo for vps'
galaxygate is better than contabo
contabo has those specs for cheap because they oversell
that tends to cause cpu steal
Galaxygate sucksass if you have an albanian ip
👀
Have you poked dragon about it?
dumbassery here
You could check for any shard that has the user cached, if not fetch the user.
its client that's undefined tho no?
ah yeah, true
It's been a long time since I've thought about sharding I don't remember much about it tbh ^-^
no worries ! any ideas on what would be best practice then to get the user? im trying to fetch the user that voted -> send a dm but obv only the currency update portion works 
If that's all you really want to do, use client.users.send(userID, standard message stuff)
You'll want to eval that into your first shard
ahhh gotcha !
I forget how, to eval to a specific shard, but you'll figure it out ^-^
the react native experience
being in a lot of servers
and all new messages get sent to you
doesn't matter if you haven't looked in that guild for a month
used like 230mb in a hour
celular
how a 55min of discord takes 63% of the battery
that doesn't make sense
it's not a shitty battery fyi
like 1-2yo phone
2022? release
double the screen time, half the battery, and on an even less stable version of discord
that does make sense
yeah i got a good phone
oh bruh
||they are tracking u, made it spoiler so they can't read it, Idk if I'm dumb like that||
you've gotta be trolling right
My first guess would be Russia 
its private repo but I can give u access to it

which government
you're not in dprk unless your surname is Kim and you're part of the ruling elite
nobody else has internet enabled phones iirc that can get outside services
i'm an exception
the world suler
Lmao

😭
i swear they said react native would save battery better than their native app
but thats what happens when you insist on using javascript and react everywhere on platforms not designed for it
you have more translation layers than good code
actually not surprised they dont care bc they can get rid of their java native developers and only keep their web dev react team that can also develop the app
theyre saving money and were paying in terms of battery usage and performance
@green kestrel
Hi, I'm using the api: https://top.gg/api/bots/1082860291152420954
to get information from my BOT and I needed the "server_count" parameter, could anyone help me find out why it is not being returned?
native webview x rust
if only javascript could be compiled natively 💔
That would defeat the purpose
You could theoretically transpile it into assembly
Though would likely need to be TypeScript based
and you'd lose the benefits of being runtime interpreted
err I guess asm could be interpreted
Not a lot no, but depends
I just had some questions regarding my table setups and was wondering if you could give me some insights
Sure
lord
how can i change the color of the main theme of my bot page?
whenever i try it only seems to change the bg color of the content in the long description
What css are you using?
<style>
body {
background-color: black !important;
font-family: Manrope;
color: #f3f3f3;
}
img {
max-width: 100%;
}
blockquote {
border-left: 4px solid #3498db;
padding-left: 10px;
margin-left: 0;
}
.image-container {
display: flex;
justify-content: space-between;
margin-bottom: 20px;
}
</style>
this to test
Looking at your bot page, you're including things that are unneeded.
The website itself already has html, head, body tags.
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>
^ I think by including these things you're creating your own "scope" within the description, which means your css cant affect the right things outside of the description.
yeah that worked thanks
Does anywhere here know about docker and iptables? I was looking at setting up mailcow again and they have a new warning on their page
Is this important to do or is it fine to still go with ufw ?
Is pairing ufw and docker known to cause common issues? Because I'm new to docker and I'm running into an issue that causes apk packages to not install at all unless I disable ufw
perhaps it's a dns issue or a skill issue but idk thought i'd ask
Well
Apparently docker has issues with the ufw or firewalld from what i've been reading, but I don't have any clue on how iptables work and its a more intimate aspect to controlling your firewall where ufw abstracts you away from all that mess.
I recommend using windows


Anyone who might have a clue why this merge sort implementation is doing way more comparisons than expected?
fn merge_sort<T: Ord + Copy>(arr: &mut [T], aux: &mut Vec<T>, low: usize, high: usize, comparisons: &mut usize) -> usize {
// Base case: if low is greater than or equal to high, the array is sorted
if low < high {
let mid = (low + high) / 2;
// Recursively sort the left and right halves
merge_sort(arr, aux, low, mid, comparisons);
merge_sort(arr, aux, mid + 1, high, comparisons);
merge(arr, aux, low, mid, high, comparisons);
}
*comparisons
}
fn merge<T: Ord + Copy>(arr: &mut [T], aux: &mut Vec<T>, low: usize, mid: usize, high: usize, comparisons: &mut usize) {
// Copy the array into the auxiliary array
for i in low..=high {
aux[i] = arr[i];
}
let mut i = low;
let mut j = mid + 1;
// Compare the elements of the two halves and merge them into the original array
// The smaller element is always copied into the original array first
for k in low..=high {
if i > mid {
arr[k] = aux[j];
j += 1;
} else if j > high {
arr[k] = aux[i];
i += 1;
} else if aux[j] < aux[i] {
arr[k] = aux[j];
j += 1;
*comparisons += 1;
} else {
arr[k] = aux[i];
i += 1;
*comparisons += 1;
}
}
}
It's supposed to do ~nlogn comparisons in worst case but measuring this I find that it does ~1.6nlogn comparisons
O(1.6nlogn) is nlogn
Big O notation does not take into account coefficients
It cares about the way things grow
Sorry I cant help
...then don't reply?
question for you
how would you handle authorization of endpoints?
using middleware
https://uuid.rocks/plain example UUID
every language has a package to generate a UUID
I know what a uuid is
I am wondering what you mean when you say you use uuids
that doesn't quite track with me
okay
match to a user

That could work yes.
I orignally had that idea
but I saw no way of managing this with https://rocket.rs
Rocket is a web framework for the Rust
programming language that makes it simple to write fast web applications
without sacrificing flexibility or type safety.
Isnt that just jwt with extra steps?
no
jwt has embeded data and is meant for short lived authorization
they can expire.
You want them to expire no?
Nope
The only thing that should expire is the login session.
I think ima just make a token for each user when they signup for the service and use that to authenticate routes.
I just don't know how to do this with rocket
😭
I wish I could just implement an auth system like discord and just call it a day
Can I run two node.js client instances? One for a slash command and one for a prefix?
ideally you should be combining them to one instance
Preferably not. That's just asking for trouble. It's also is more work to run two files (you need two terminals instead of 1 and two commands)
How would I combine them then?
Just listen to both event types
Those being interactionCreate and messageCreate
Yeah we use tilde notation
Then we do care about factor
Need opinions on how to get stuff ordered in sql or if I'm already doing the best thing.
Currently, I have tracks in a playlist and the structure is a little something like: { playlist_id: number; video_id: VARCHAR(50); next: VARCHAR(50) | null; }
The next is obviously linking to a video ID that's next in the track list if any and to get all the tracks in order, I need to go backwards starting from where next is null and then searching the entries where the next field is the current video_id until there is none left. Cannot be recursive. I have to be able to reorder the tracks at any time and updating all entries after an index wouldn’t be a good idea if I went with another number field to indicate index. Any ideas on improvements? (The searching is done in code rather than on the sql server's side)
Im not sure if I was misreading your question, or if I am not quite understanding what you are trying to achieve.
You said you need to figure out how to order stuff in your sql?
Well, the simplest solution is to follow spotify's example.
The way they have playlists is you add songs to them, and they immediately get pushed to the back. You can use a numerical index to track this as if its an array starting at 0 (or 1) if you prefer. Now the next would be an id to the song directly after it, if there is one. Simple enough to achieve this I trust you to be able to do this. You'd need a numerical index to be able to make sure that no matter what if you were to visually load this playlist, it'd remain in the same order. You can ofc allow them to reorder it if you want, which is when you figure out the logic yourself and set it's new "place" value
Again, not sure if I misunderstood what you are trying to achieve.
Please make for me a profile with ROYAL GHOST 111
👀 what does this mean?
At least he wrote "please" 
any ideas as to why a message the bot sends wouldn't be found in the cache? im trying to edit my bot's starboard message when an additional reaction is added but it returns unknown message
- it is the correct msg id
- verified that the bot has the correct channel permissions
- the bot sends the msg thats trying to be edited
- it isnt restarted in between
- logging the message shows that it isnt in the cache ?? idk why
const channelID = '964997630910427197';
const channel = client.channels.cache.get(channelID);
client.starboard.set(message.id, {
originalMessage: message,
count: count,
author: message.author.username,
authorURL: message.author.avatarURL()
});
// .... other code here
try {
const fetchedMessage = await channel.messages.fetch(msgID);
console.log(`Fetched message: ${fetchedMessage.content}`);
} catch (error) {
if (error.code === 10008) {
console.error(`Message with ID ${msgID} not found.`);
} else {
console.error(`Error fetching message with ID ${msgID}:`, error);
}
}
sorry if the code is a bit all over the place, ive tried dozens of things atp
fetch also grabs it if it isn't in the cache, so are u sure u got the correct message ID and channel?
yep, i already double checked
channel and msg id are correct and match to what's being logged, i double checked permissions and those are fine as well
what's msgID?
oop, shit, sorry i thought i included it
const msgID = starboardData.messageID
i checked what it logs and it does log a string
by right clicking the message on discord and copying the id too?
yeah

u have an error check there, but what's the actual error message if it's 10008?
is it really just "Message not found"?
ah
does the bot have read message history perm? that might give a different error though
yeah it does
i thought i was going crazy so i asked the owner of the server to give me perms to double check the channel perms and theyre fine
i used a msg content cmd too and it works so i know its reading msgs there
a full code might help
one sec
client.on(Events.MessageReactionAdd, async (reaction, user) => {
console.log(`reaction added`)
const reactionThreshold = 1;
if (reaction.emoji.id == '1041127014066835590') {
const message = reaction.message;
const count = reaction.count;
const channelID = '964997630910427197';
const channel = client.channels.cache.get(channelID);
let starboardData = client.starboard.get(message.id);
if (count >= reactionThreshold) {
if (starboardData) {
console.log(starboardData.originalMessage.id)
const footerText = `♡ ${starboardData.count}`;
const embed = new EmbedBuilder()
.setColor('#f0deda')
.setAuthor({
name: `${starboardData.author}`,
iconURL: starboardData.authorURL,
})
.setDescription(`· ·  new heart !! + ⁺ .\n\nʚ・"${starboardData.originalMessage.content}"・ɞ\n\n [jump to source](${starboardData.originalMessage.url}) `)
.setTimestamp()
.setFooter({ text: footerText });
const msgID = starboardData.messageID
console.log(`Attempting to fetch message in channel ${channelID}`);
console.log(`Channel permissions for bot: ${channel.permissionsFor(client.user)}`);
console.log(`Is message in cache? ${channel.messages.cache.has(msgID)}`);
await new Promise(resolve => setTimeout(resolve, 1000)); // even tried delaying to see if that would help give more time to get it cached
console.log('Cached messages:', channel.messages.cache.map(msg => msg.id));
try {
const fetchedMessage = await channel.messages.fetch(msgID);
console.log(`Fetched message: ${fetchedMessage.content}`);
} catch (error) {
if (error.code === 10008) {
console.error(`Message with ID ${msgID} not found.`);
} else {
console.error(`Error fetching message with ID ${msgID}:`, error);
}
}
} else {
console.log(message.id) //returns correct msg id
client.starboard.set(message.id, {
originalMessage: message,
messageID: message.id,
count: count,
author: message.author.username,
authorURL: message.author.avatarURL()
});
const footerText = `♡ ${reaction.count}`;
const embed = new EmbedBuilder()
.setColor('#f0deda')
.setAuthor({
name: `${reaction.message.author.username}`,
iconURL: reaction.message.author.avatarURL(),
})
.setDescription(`· ·  new heart !! + ⁺ .\n\nʚ・"${reaction.message.content}"・ɞ\n\n [jump to source](${reaction.message.url}) `)
.setTimestamp()
.setFooter({text: footerText});
channel.send({embeds: [embed]})
}
}
}
});```
why don't you try fetching the message instead of using cache?
for messages it too unreliable to use cache
they're doing that
where?
must be in a channel
im doing it ina channel for the starboard
in java at least we do client.retrieveMessageById(), being able to do it on a channel too
the issue might not be on the message itself, but on the channel being wrong
log the fetched channel name to be sure
logs the correct name
id: '964997630910427197',
name: '♤﹒﹒﹒﹒',
rawPosition: 24,
parentId: '964372181880553532',
why are u fetching the message though?
you're also storing the user message not the starboard message
unless the starred message was sent inside the starboard channel it won't work

wym by that
maybe u meant to send the message first and store the ID of this message instead
they are storing/getting the message that is reacted to no?
it won't work if they want to edit the starboard message since the message ID is the reacted message's ID which wouldn't be from the bot
u can't edit someone else's message
here
messageID should be different, it should be the bot's sent message ID
from here ^
but right now it's the same message ID as originalMessage
ah shit u right, i meant to do that






