#development

1 messages · Page 34 of 1

wheat mesa
#

no

dry imp
#

nah you love assembly

wheat mesa
#

asm = assembly

#

:C

lyric mountain
#

lmao

wheat mesa
#

computer club kids saw me writing assembly, immediately all focused on my computer

#

little did they know all I was doing was fucking around with registers and had no idea what I was doing

#

bet I looked like a wizard though

spark flint
#

could use regex

wheat mesa
#

if it's in the form of a mention in a message, it should just be in message.mentions

#

most of the time you shouldn't have to worry about needing to work with the raw text like that

spark flint
#

i think they're scraping an embed

wheat mesa
#

and if you are you might be overthinking it

spark flint
#

in that case

#
const mention = `@covert gale`
const id = mention.match(/[^0-9]/)```
radiant kraken
spark flint
#

/g returns an array tho

radiant kraken
#

.replace

spark flint
#

oh wait

#

good point

wheat mesa
#

hi c user null

radiant kraken
#

hi fellow rust user Waffle

#

idk if you use c

wheat mesa
#

I tried

#

Not really for me

#

you didn't await the fetch

radiant kraken
#

maybe because it's a promise

#

What IDE do you use

wheat mesa
#

can't use replace on Promise<User>

#

nor will you be able to use replace on User

radiant kraken
#

don't you have IntelliSense?

wheat mesa
#

me when people don't like type safety

radiant kraken
#

ahh yes dynamically typed languages

spark flint
#

How can I use a buffer as an image on an embed?

#

Discord.js v13 (not 14 yet)

wheat mesa
#

IntelliSense is a magic IDE thing that detects types and hints things to you (it does other stuff too but not relevant to this rn)

radiant kraken
#

IntelliSense is a must have for every dev

wheat mesa
#

Almost every IDE has some sort of a version of it, whether it be their own branded one or just straight up IntelliSense

#

It will save you a load of time

#

is it not on vsc by default?

boreal iron
#

i feel forced to change my editor

minor olive
wheat mesa
#

I wouldn't know about js for that thing, I use ts anyways

radiant kraken
wheat mesa
#

ts is my intellisense

#

😉

radiant kraken
#

based

minor olive
#

what language?

wheat mesa
#

fetch user, open/fetch dm channel, send message, make sure to catch it

radiant kraken
#

i forgot how to do it though

#

attachments://something afaik

earnest phoenix
# wheat mesa is it not on vsc by default?

VSC has IntelliSense built-in for various programming languages without the need for an extension, the languages with built-in IntellSense support are JavaScript, TypeScript, JSON, HTML, CSS, and SCSS

radiant kraken
#

SCSS?

#

I doubt

earnest phoenix
#

It's literally in their documentation

radiant kraken
#

i used SCSS and i need to install an extension to get IntelliSense

wheat mesa
#

I figured that it would have intellisense for at least js/ts, considering it's literally built on electron

earnest phoenix
radiant kraken
#

cool

radiant kraken
earnest phoenix
#

That's correct, you just have to add the buffer as an attachment and give it a name, and provide attachment://NAME OF THE ATTACHMENT to the image field

#

@spark flint ^

spark flint
#
let file = new MessageAttachment(await line_chart.toBuffer(), 'moderationGraph.png');
let embed = new MessageEmbed()
  .setImage('attachment://moderationGraph.png');
await msg.edit({ content:null, embeds:[embed], files: [file] })```
#

this worked for me

earnest phoenix
#

Yep, that's correct

spark flint
wheat mesa
#

depends on what you want to do

#

const means you cannot reassign to it

spark flint
#

idk i always do let embed = new MessageEmbed()

wheat mesa
#

let lets you reassign the variable entirely, const only allows mutation of the variable's state

#

probably some more intricate details I didn't mention there but I'm sure volt will correct me if it's wrong

earnest phoenix
#

It's better to use const to declare variables if you aren't going to mutate it later, and let if you plan to reassign it, since this can allow for further optimization

And remember that const still allows mutation of the value itself in the variable, not reassignment of the variable

#

Waffle is correct there as well

spark flint
#

has anyone here used the chart.js-image package? trying to add data labels wahhh

earnest phoenix
wheat mesa
#

Now var is an entirely different level of fuckery

earnest phoenix
#

Honestly we would've removed both the var keyword and the non-strict equality operators (==|!=), but those are just set in stone now, would cause too much breakage if done so

radiant kraken
#

it infuriates me when i see someone using let but doesn't reassign it later

earnest phoenix
#

Same

radiant kraken
#

unless you're using Rust

earnest phoenix
#

let mut moment

wheat mesa
#

me when someone does let mut and doesn’t mutate the variable

radiant kraken
#

That would be a compiler warning

wheat mesa
#

Or fn something(&mut self)

#

Doesn’t mean people care

radiant kraken
#

At least it isn't go

#

Where it's a compile error

wheat mesa
#

I like immutability by default

#

That’s something I think a lot of languages would benefit from

#

Also it would save the optimizers some work since anything that isn’t declared as mutable is const

radiant kraken
#

true

round cove
wheat mesa
#

@earnest phoenix do you know if the js date api overhaul is coming anytime soon? Might have to make something with dates soon and I don’t wanna use the existing one because it sucks balls

lyric mountain
#

Overhaul?

wheat mesa
#

There’s a date api proposal that made it to stage 3 last I checked that completely overhauls the current date api to not suck

sudden geyser
#

sounds like it won't be implemented for a while

earnest phoenix
wheat mesa
#

Yes

#

That one

#

Forgor the name for a moment

earnest phoenix
#

That's coming soon, we're already working on the implementation and these are several tests, just looking for edge cases to fix and to optimize some things

sudden geyser
#

So you want the mod to have to add details

earnest phoenix
#

How to get my top.gg account token?

sudden geyser
#

I imagine you either use slash commands or maybe modals if those work

earnest phoenix
sudden geyser
#

isn't it on your profile

somber ridge
runic depot
somber ridge
#

look into something known as OAuth2

runic depot
#

No not integrate…
Like a simple username password login

#

There should be a token right?

somber ridge
#

top.gg uses OAuth to authenticate users, not username/password

runic depot
#

Yea that’s true

somber ridge
#

that’s where Oauth solves that issue

runic depot
#

I see

#

Thanks!

somber ridge
lament rock
#

scrape html and abuse the fact that cookies are header based

#

It's so easy to complete login flows via scripting

tidal nymph
#

does anyone know why my bot's activity getting cleared (disappeared) after being up for hrs?

#

I only set the activity once but for some reason it keeps going away

rustic nova
#

nah shouldn't normally do that, either your library resets it or something else

tidal nymph
#

im using d.js, issue only happens lately, still on v13 tho

sacred aurora
#

is there a way to download a big file and upload it at the same time to reduce memory usage in axios?

graceful cobalt
#

hey guys, how do i make a top.gg vote reminder?

rose warren
#

When people vote for your bot on Top.gg, use the Top.gg webhook (see #topgg-api) to send the voter's info to your bot's server. There you can listen for the webhook data and store their ID along with a timestamp in your database. Then regularly check your database for votes that happened over 12h ago and send reminder DMs to those users. You'd probably also want to store another column in your database to signal whether you've sent the reminder DM already so as not to spam reminders after 12h, or delete the row after sending the DM.

viscid jetty
#

: )

surreal sage
#

How to make JavaScript "string choices"?

Like with Discord.js intents but you fill them in as strings instead of flags.

#

Or channel types

#

Like this.

surreal sage
#

Nah

#

Soft coding

rustic nova
#

glad python has array.choices amirite

lyric mountain
#

then don't worry abt that, it'll be extra work for little return

surreal sage
#

Ight.

lyric mountain
#

that's called "magic constant" btw

wheat mesa
#

It’s a union type constant

#

interaction.channel.type is probably "DM" | "GUILD_TEXT" | "ETC"

#

(In that case)

quartz kindle
thorn spruce
#

Hey, someone know how i can type this with Typescript?

this.jsonLangs = require(`../langs/${this.playerLang}`);

// Using exemple:
this.jsonLangs.language.lang_conf

(Its a big file so type manually will take too much time)

civic scroll
#

or

#

just use typescript

#

eg.
js

/**
* @param {"BLUE" | "RED" | "GREEN"} impostor 
*/
function amogus(impostor) {}

ts

// typing via types
type sus = "BLUE" | "RED" | "GREEN";
function amogus(impostor: sus) {}
// inline parameter typing
function amogus(impostor: "BLUE" | "RED" | "GREEN") {}
civic scroll
#

you will have to import the types manually from said json files and make an union type for them

surreal sage
#

I don't need help anymore..

civic scroll
surreal sage
civic scroll
#

that was not

surreal sage
#

Ight.

civic scroll
#

acknowledgement != end

#

but anywho

#

@thorn spruce but from what i saw they are language data right?

thorn spruce
#

yep

civic scroll
#

then the key struct matches across all languages

#

for this case i suggest typing the language struct

thorn spruce
#

yep

#

what do you mean by language struct

civic scroll
#

or you can not care about the type at all

civic scroll
thorn spruce
civic scroll
#

for my case i just use fallback keys

#

if the data is there it will replace said keys with translation string; otherwise just display the key

#
export type LanguagePack = {
    [K in 'en' | 'jp' | 'cn' | 'kr']: Record<string, any>;
}

export function i18n(key: string, lang = 'en', langPack: LanguagePack | Partial<LanguagePack>): string {
    const keys = key.split('.');
    if (!AvailableLanguages.includes(lang))
        lang = 'en';
    let data: Record<string, any> | undefined = langPack[lang as keyof typeof langPack];
    if (!data) return key;
    let level = 1;
    for (const subkey of keys)
    {
        if (typeof data![subkey] === 'string' && level === keys.length)
            return data![subkey];
        if (!(subkey in data!))
            break;
        data = data![subkey];
        level++;
    }
    return `{@${keys.copyWithin(0, 0, level).join('.')}}`;
}

export const useLocale = (lang: string, pack: LanguagePack | Partial<LanguagePack>) => (key: string) => i18n(key, lang, pack);

here's what i use

#

typing is a little bit ugly though, due to property key typing in highest parent object

thorn spruce
#

I prefer with types personally

civic scroll
#

for large translations, typing is recommended

#

but

#

if you add unique keys to each language

#

typing breaks

thorn spruce
#

My files literally looks like

key :
key : value
key : value

#

nop for me its the same key for each language

#

more easy

civic scroll
#

for me it includes some custom ones

#

for yknow, easter eggs

thorn spruce
#

waaah yes

thorn spruce
civic scroll
#

for lazy-loading

thorn spruce
#

one file for each language here

civic scroll
thorn spruce
#

cassi damn KR / CN / JP

civic scroll
#

yes

thorn spruce
#

some good languages in facts

civic scroll
#

i included because official website has those languages

thorn spruce
#

lmao

#

in facts i just remember

#

if my files are the same i can just import one of them

#

and do ```ts
typeof fr

civic scroll
#

typeof operator will only show you primitive types

thorn spruce
#

sad it was a good idea in my head

civic scroll
idle cave
#

@thorn spruce

{
  "Command" : {
      "subCommand" : {
          "fr" : "Salut %s !",
          "en" : "Hey %s !"
      }
  }
}

And I have a function translate in my command context and i just have to do translate("Command.subCommand", author.username)

#

And JSON are any type

#

import dialogues from "../../dialogues.json" assert { type: "json" };

#

On file all languages

#

Thanks copilot for translation ^^

median ginkgo
#

oh

idle cave
#

ofc i can do json deeper

{
  "Command" : {
      "subCommand" : {
          "subSubComand" : {
              "fr" : "Salut %s !",
              "en" : "Hey %s !"
           }
      }
  }
}
#

And if it can't find a translation i get some thing like {Command.SUUUBComand -> params}

radiant kraken
#

kthx

earnest phoenix
#

If I have a bot that doesn't need intents (like none at all), do I need to verify for more than 100 servers (obv im still verifying but can it join more than 100 without verifying)?

sudden geyser
#

still need to verify

earnest phoenix
sudden geyser
#

really? didn't know that

earnest phoenix
#

however i'm obviously still gonna verify lol

earnest phoenix
lyric mountain
#

there are 4 verifications

#

1 - to allow more than 100 servers
2 - to allow usage of GUILD_PRESENCES intent
3 - to allow usage of GUILD_MESSAGES intent
4 - to allow usage of GUILD_MEMBERS intent

#

you can do all 3 at once, but they're analyzed separately

earnest phoenix
#

#1 is for presence intents i think

#

ok edited

lyric mountain
#

forgot abt the 4th

#

but still, that doesn't mean u dont need to verify for 100 servers

earnest phoenix
#

rip yea

#

gotta verify ig

lyric mountain
#

ye, the verifications are mutually inclusive

sudden geyser
#

So I wasn't wrong—win!

lyric mountain
#

you must have the approval for all enabled intents, and disable those which u dont

earnest phoenix
#

still got easier verification process lol
dont need to submit reasons for those three intents

earnest phoenix
lyric mountain
#

I mean, it's a single verification

earnest phoenix
#

still gonna take me like 2 weeks

lyric mountain
#

ye

#

just as a note, the process to get the intents post-verifications is...awful, to say the least

fickle arch
#

how do I make my bot run a command with different alliases (for example createinvite/createinv) for now mine run only 1 (getinvite) and I can't seems to make the bot execute the command with different alliases

quartz kindle
#

show code

#

interaction.deleteReply()

fickle arch
#

ooo I misspelled aliases by using 2 l, woops

quartz kindle
#

no it shouldnt

#

ephemerals should delete themselves after a while, or the user deletes them, like you delete system messages

frigid moth
#

what permissions does a bot need to lock a channel?

#

I just read a log saying that it is unnecessary to ask for manage channel for a lock cmd

wheat mesa
#

Why not just make a channel with those roles only

frigid moth
severe hull
#

im getting this error in running my code

from discord.ext import tasks
import topgg

dbl_token = "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()
#

someone please help me

light ingot
#

what are you trying to do tho

#

i dont think .forEach would do anything interesting on a single element

#

oh

quartz kindle
#

that will only work if all members are in the cache

light ingot
#

client.users.cache?

frigid moth
#

so what permission does the bot need to lock a channel?

light ingot
#

manage roles probably

#

or wait

#

idk

frigid moth
#

Imma try both of them cause I dk too

light ingot
#

I'm new too :/

frigid moth
#

I mean someone in #logs declined a bot saying that : Your lock command requires the bot itself to have the manage_channels permission. It only needs the manage_roles permission, though. Please only request permission(s) the bot truly needs

#

so it's not manage channels for sure

quartz kindle
#

you would need to fetch all guild members

light ingot
#

yeah then ig manage roles is what it needs

quartz kindle
#

for that you need the members intent

light ingot
#

as the declined message also states that

frigid moth
quartz kindle
#

no that wont work

#

you would need to fetch all guild members and for that you need the members intent

#

guild.members.fetch()

#

hmm?

#

you want to hide the ip?

light ingot
#
message.guild.roles.cache.get('0').members.map(m=>m.user.id).forEach(member => {
let user = client.users.cache.get(member)
user.send("hello")
});
#

should work

quartz kindle
#

only if all members are cached

light ingot
#

you use backslashes

quartz kindle
#

also, half of that is redundant

#

and also will cause rate limit issues

light ingot
#

oh, didn't knew that

#

my bad

quartz kindle
#

dont

#

if you REAAAAAAALLLY need to

#
for(const member of message.guild.roles.cache.get(ROLE_ID).members) {
  await member.send(...)
}
#

but again, that only works if all members are cached

#

because roles dont actually have members

#

members have roles

#

so djs has to check all members to see which member has that role id

light ingot
#

like, fetch the members first then filter them by role

#

:/

quartz kindle
#

hence why all members have to be cached for it to work

light ingot
#

i see

quartz kindle
#

unfortunately discord doesnt give us a way to see that

#

role objects dont have any member information

severe hull
#

im getting this error , someone please help me out ;(

frigid moth
#

Well I tested , my bot even thought it says different in the review , my bot requires manage channels perm to lock a channel

civic scroll
round cove
#

yes

civic scroll
#

real

#

pan you beat me

round cove
#

?>

lyric mountain
civic scroll
round cove
civic scroll
#

don't worry

#

i will do the same

#

hhh

earnest phoenix
#

I will be taking on a developer role soon

civic scroll
#

ok

#

@round cove also i'm not sure about how to do terminal command emulation

light ingot
civic scroll
#

more like import { exportName as varName } from module

civic scroll
#

or import exportDefault from module

civic scroll
queen sable
#

import export in python ?

civic scroll
#

but you are making it like a storyline

light ingot
#

wait did i get confused in javascript and python

civic scroll
#

i'm sorry

light ingot
#

💀

#

same lmap

civic scroll
#

you can do from moduleName import exportedName

queen sable
#

that's why i asked 😂

civic scroll
#

from moduleName import *

#

from moduleName import exported1, exported2 as varName

queen sable
#

also import moduleName as name

civic scroll
#

was about to type that

#

you get the gists

queen sable
#

lol you are good

civic scroll
#

i'm not

queen sable
#

so you work with both js and py .. right like me ?

civic scroll
#

no

#

i work with typescript, web languages and rust

lyric mountain
civic scroll
#

also ocassionally c#

queen sable
#

Ohh so mainly js ?

civic scroll
civic scroll
queen sable
civic scroll
#

raw js is devil

queen sable
#

😂 esm and ts is much better

civic scroll
#

esm is not a language

light ingot
#

I'm still using CommonJS lmao

queen sable
civic scroll
#

even esm

#

it's still javascript

lyric mountain
#

I'm honestly surprised there's still people who use the old require() to import stuff

civic scroll
#

actually cjs is better import imo since it supports nested object destructuring

queen sable
#

that's true

#

since how long you are coding ?

civic scroll
#

8 months, take it or leave it

#

actually i rage quitted for 6 months

#

so 2

queen sable
#

Ohh , but ur still good with it

frigid moth
lyric mountain
#

I mean, if u got MANAGE_CHANNELS I expect it to also include managing its permissions

#

and MANAGE_ROLES to be able to modify only the actual roles, not the channels

#

but oh well

frigid moth
#

even though I tested the cmd and it only works with manage channels

lyric mountain
#

ye, common mistake, for some reason discord only requires manage_roles to edit the channel perms

#

manage_channels is for managing the channel structures

frigid moth
#

in fact I don't modify role perms for lock cmd , I modify channel perms

#

so that might be the cause

civic scroll
#

it's more convinient to lock channels based with their own perms overwrite than manually locking role by role

frigid moth
#

doesn't that require "manage channels' perm?

queen sable
#

it does

civic scroll
#

yes

#

told you

#

but if everyone is a role

#

then manage role perms alone would work

#

unless there are complex unique settings for each channel, then oh well

frigid moth
#

I am talking about everyone role

queen sable
#

if everyone role has mange channels perms it will work

frigid moth
queen sable
#

well as sayuri said it's better to with manage channels.. why manage roles is required to lock the channel ?

frigid moth
#

I have to go with manage channels cause that's the only perm it makes it possible to work. What I am saying tho is that:

queen sable
#

Yes

frigid moth
lyric mountain
#

failsafe

.catch()

#

no idea how mojang api works

#

still, .catch() for any promise-based actions

wheat mesa
#

Because axios rejects on 400 status codes

#

Just .catch like he’s saying

#

You can set your own custom validateStatus func for axios to not throw if you wish

lyric mountain
#

it's a good habit to .catch() any and all api calls, even those that are guaranteed to work

#

you never know when the server might be offline

#

whatever u want to do when it fails

#

ye

earnest phoenix
#

Hello

#

I came for help

lyric mountain
#

you forgot to also bring the question

ancient nova
#

does this ltierally just compile the code inside the bots files? what's the purpose of this? 😮

wheat mesa
#

It’s a recipe for disaster if he actually runs the code too

#

I’ll look at it when I get home

ancient nova
#

I thought so 🤣

#

ty

wheat mesa
#

He uses an api it seems

sudden geyser
#

So they're not running it on their own bot process

#

don't know why they decided to have every file end with .cpp though

#

or why the folder path includes an emoji

ancient nova
sudden geyser
#

I think it's just for translation

#

English, Russian, etc.

#

A bad idea to use eval for that, but it doesn't look related to the code evaluation.

ancient nova
#

ah I see, that's a little bit weird lol

#

does dyno do this command by looping over ALL of it's cached users? would it work on mine just as well?

#

my bot is in a couple big servers so it should be fine?

wheat mesa
#

If it’s cached it shouldn’t be a problem (depending on what operations you’re using) Do not fetch a ton of users though

ancient nova
#

it is safe though, right?

knotty quartz
#

I'm getting a message saying it successfully purged amount of messages, when error is reported to console and I don't know how to fix it, this is for (Errors with bot not having access).

wheat mesa
#

I don’t see why it wouldn’t be safe

wheat mesa
#

Caches are designed to be fast

ancient nova
#

that's good

#

client.users.cache.get?

wheat mesa
#

It’s your command, you’ve gotta be the one to figure out what to do with it

ancient nova
#

not sure what is the best way of getting all the users, there is multiple ways to

wheat mesa
ancient nova
#

and I want the fastest one

knotty quartz
# ancient nova and I want the fastest one
const { SlashCommandBuilder, PermissionsBitField } = require('discord.js');

module.exports = {
    data: new SlashCommandBuilder()
        .setName('purge')
        .setDescription('Purge up to 250 messages.')
        .addIntegerOption(option => option.setName('amount').setDescription('Number of messages to purge.')),
    async execute(interaction) {

        else if (interaction.member.permissions.has(PermissionsBitField.Flags.ManageMessages)) {
        const amount = interaction.options.getInteger('amount');
        if (amount < 1 || amount > 250) {
            return interaction.reply({ content: 'You need to input a number between 1 and 250.', ephemeral: true });
        }
        await interaction.channel.bulkDelete(amount, true).catch(error => {
            console.error(error)
        });
        return interaction.reply({ content: `Successfully purged \`${amount}\` messages.`, ephemeral: true });
        }
        else {
            await interaction.reply("You need: MANAGE_MESSAGES for this command!")
        }
    },
};```

Sorry it took a while-
wheat mesa
#

Filter out the messages that are 14 days or older, then try purging

ancient nova
wheat mesa
#

Also limit the number to 100

#

The bulkDelete endpoint only takes up to 100 IDs

#

Idk if djs splits the requests but either way it’s a bad idea

wheat mesa
ancient nova
#

you should also save the number of deleted message and compare it to the messages actually deleted, that way u can tell the user if the messages were over 14 days old

knotty quartz
ancient nova
knotty quartz
wheat mesa
#

That’s why it’s still saying that in the response

knotty quartz
#

should I make it 99 just incase?

ancient nova
knotty quartz
wheat mesa
#

Just don’t be fetching

quartz kindle
wheat mesa
#

Yeah

#

That way when it throws it goes straight to the catch block

knotty quartz
#

try {} catch {} ty

ancient nova
quartz kindle
knotty quartz
#

await interaction.channel.bulkDelete(amount, true).try.catch(error => {
            console.error(error);
            //Should end here if error
        });``` Better or did I type that wrong?
wheat mesa
#

oh boy

#
try {
    somethingThatCanThrowHere()
} catch(e) {
    // do stuff with your error here
}
knotty quartz
#

Did it wrong-

quartz kindle
#

/facepalm

knotty quartz
#

I meant the first one lol, I realised.

boreal iron
ancient nova
#
    // Lets save our discrim and confirm that it is indeed a valid discriminator.
    const discrimToFetch = args[0];
    if (isNaN(discrimToFetch) || (discrimToFetch.length > 5 || discrimToFetch.length < 4 )) {
        return message.reply({
            content: "I was unable to fetch the users, because the discriminator you've chosen is not valid!"
        });
    };
    
    // Lets now fetch the users.
    const fetchingUsers = client.users.cache.filter(member => member.discriminator === discrimToFetch);
    if (!fetchingUsers) {
        return message.reply({
            content: "I was not able to fetch any users with the discriminator of your choice."
        });
    };
``` so how will this work?
knotty quartz
# quartz kindle /facepalm

Works! I forgot abit of it so it accidentally kept the error message when purging but it works now! Thank you!!

ancient nova
#

wait does filter exclude or include I forgot?

quartz kindle
ancient nova
#

so it will include anyone who has the discrim of the users choice, nice

#

message.member.roles.add?

#

what do you mean?? is is the Id of an user?

#

message.guild.users.fetch(id).roles.add(...)

#

np

#

u might wanna await it though, not sure how the promises work with this one

#
const member = await message.guild.members.cache.get(id);
member.roles.add(id);
#

great

boreal iron
ancient nova
#

oh I forgot that was a thing smh

boreal iron
#

_to name just one improvement _

ancient nova
#

just one :0

#

what's wrong with it 😭

#

should I paginate it or???

#

I think 10 names should be fine, I don't think you'd need that many anyway

wheat mesa
#

Cache is not a promise

#

fetching is a promise

ancient nova
#

anyway that's how it looks

#

good enough w me

wheat mesa
# ancient nova

Why not make a pagination function that just takes an array of anything and returns back a 2 dimensional array of the items/pages

#

And/or object

ancient nova
#

cause I'm too lazy to make something like that a function that I will possibly use only 2 times and then forget it exists

#

besides you won't need that many users for a discrim function anyway

#

u need just 1 actually

#

I'm being generous

wheat mesa
#

Have you considered not scraping your previous embed and instead just saving the users? Not sure why you’re bothering with that, I have never seen a proper use case for scraping your own embed

#

Not to mention there is no reason to have an await there

#

People gotta stop slapping await on everything for no reason and look at their IDE telling them that it does nothing mmulu

solemn latch
#

awaiting things for no reason is probably a bad thing

#

why not just use it on promises?

sharp geyser
#

await a non-promise just wraps it in a promise

lament rock
#

await has no effect positive or negative on non promise returning properties/methods

sharp geyser
#

and changes execution order

solemn latch
#

your ide tells you

lament rock
#

Press control a and then press backspace and start again

sharp geyser
boreal iron
stuck dawn
#

anyone knows why on class in typescript the keyword this is null?

sharp geyser
#

How are you using this in the class?

stuck dawn
#

to call a function in the same class

solemn latch
#

your ide will tell you that too

sharp geyser
solemn latch
sharp geyser
#

I don't see how this can be null

stuck dawn
sharp geyser
#

vscode problems

solemn latch
#

the three grey ... means "hey look at this"

sharp geyser
#

I don't see how this is null for you

stuck dawn
sharp geyser
#

That's weird

earnest phoenix
#

The extensions have nothing to do with it as it's built-in to VSCode, it should let you know if the typings are correct

#

If the return type of a function is not a Promise and you use the await keyword on it, it'll let you know about that

#

It's already enabled by default

lament rock
# stuck dawn like

are you setting the function to a callback where the function doesn't retain the this reference?
eg: eventemitter.on("thing", thing.characterSelectionUI);

#

if that's the case, you need to call .bind

solemn latch
#

tbh, I'd reset my vsc to default if I didnt have that on for some reason.

not just for the await thing, but everything.

lament rock
#

in the config, there's a strict type checking option everyone should have turned on

solemn latch
#

that too

stuck dawn
lament rock
#

correct, in the example case, you would do
eventemitter.on("thing", thing.characterSelectionUI.bind(thing))

stuck dawn
lament rock
#

nope

#

set to EventsManager instead of this in the bind

#

this would be referencing globalThis

stuck dawn
#

ohhh yeah that worked thank you :)

lament rock
#

it's less characters to just write arrow functions though

wheat mesa
#

But… variables are a thing you know

#

Why waste a few thousand cpu cycles on processing a regex for something you could just have super cache friendly available for it 🥺

lament rock
#

regex compile time isn't funny

#

at least set regexes in the global scope

earnest phoenix
#

Since you're using the await keyword on something that is not a promise, if it doesn't show up then the typings are unknown here so VSCode doesn't know what to suggest

#

If you hover over it, it should show up the typings, if it's any then it's unknown

lament rock
#

not to be confused with the type unknown

sharp geyser
#

tbh you don't even really need to await the .send() either no?

#

I don't see a real reason to await it unless you are going to use the result from the promise

solemn latch
#

theres a lot that probably doesnt need to be awaited even if they are promises.

earnest phoenix
#

What does it say when you hover over them?

sharp geyser
#

or if you want it to run and wait for it to be done until it runs everything else

lament rock
#

If you're writing pure JS, you need to use JSDoc on most things for VSCode to give good typings

#

new string[] initializers when

sharp geyser
#

no

lament rock
#

might as well make ts similar to C#

wheat mesa
earnest phoenix
#

It should at least say any if it doesn't know the typings, you're either hovering over the wrong thing, or you're using an extension or some kind that overrides the IntelliSense, which is bad

lament rock
#

co pilot does that

sharp geyser
#

But tbh I don't ever use try catch blocks anyway

#

they make my code look ugly

wheat mesa
#

Misty refuses to handle errors

lament rock
#

co pilot blocks a lot of intellisense

wheat mesa
#

So badass

sharp geyser
#

doesn't that do essentially the same thing?

wheat mesa
#

Lots of .catch makes me wanna puke

sharp geyser
#

🤷‍♀️

#

cry about it

wheat mesa
#

Callback hell

earnest phoenix
lament rock
#

You can't return in the parent scope unless you void 0 in the catch and check for truthiness

earnest phoenix
#

Copilot is pretty smart in most cases, but sometimes it has those edge cases

wheat mesa
#

@earnest phoenix can you get rid of null, undefined, and errors and instead just make js like rust 😉

lament rock
#

I stopped using co pilot

#

I'm smart enough for all of the projects I write

earnest phoenix
lament rock
#

void 0

#

just use rust

#

interpreted languages will always have to have runtime errors

#

otherwise, you just have blue screens to debug

earnest phoenix
#

Rust is just amazing, it's error messages feel like it utilizes an AI

sharp geyser
#

I thought you hated rust voltrex

lament rock
#

I tried to use rust, but its syntax and paradigms turned me off really fast

earnest phoenix
#

Python users when they realize it's 66x slower than JavaScript, and 70x slower than C/C++ and Rust

lament rock
#

otherwise, I'd use it in combo with Neon to write node native addons

wheat mesa
#

The error messages are truly beautiful. Pretty printing errors is something that even if it doesn’t provide a whole ton of information to the user, it looks so much cleaner and less confusing than a massive stacktrace with a line number

earnest phoenix
#

Rust users try to acknowledge the flaws of the language challenge just like the users of any other languages

wheat mesa
#

Thats true. The main problem is that when I see people criticizing rust it feels like they’re attacking the language for very niche reasons

#

Similar to the way people attack javascript’s weird type coercion behavior that you rarely ever have a problem with

#

Like 90% of the time in the C++ discord people say rust is garbage because it’s hard to implement a simple thing like a linked list without the use of unsafe

#

And then they ignore the other billion reasons to use rust because of that one thing

sharp geyser
#

can't implement a linked list with safe rust?

earnest phoenix
#

Yeah, but generally Rust users are just something else

sharp geyser
#

damn never using it again

wheat mesa
#

You can, people just see that the standard implementation for it uses unsafe

earnest phoenix
#

Waffle you're like one of the sanest Rust users I've ever seen

wheat mesa
#

C++ users try not to ignore ```rs
pub enum LinkedList {
None
Node(Box<LinkedList>)
}

#

Challenge

#

Difficulty impossible

earnest phoenix
#

Then yeah that's why it has no idea on what to suggest, you need to assert that the interaction is an instance of a interaction that contains the message property, such as the ButtonInteraction

sharp geyser
#

Looks like a bunch of gibberish to me

wheat mesa
#

I feel like a lot of people go straight from c to rust and either really love it or really hate it, no in between

#

I think it’s great for certain things but for other things it can be painful sometimes

#

Also writing code that utilizes unsafe makes me feel cool

#

(If it’s a valid use of it)

sudden geyser
#

why not use the built-in linked list

wheat mesa
#

Precisely

#

Seems like a lot of people criticize rust for having a lot of unsafe sprinkled around the standard lib but then don’t acknowledge the fact that it’s already written for you so why does the implementation matter

sudden geyser
#

I think Rust's community is fine, though there seems to be a split in mentality between people writing it for low-level and high-level code.

earnest phoenix
#

Let me dumb it down for you, since the interaction argument you're using in your code, it can have multiple types, such as CommandInteraction, ButtonInteraction, SelectMenuInteraction, etc etc; but that part of the code I just highlighted, VSCode doesn't know what type of interaction you're currently using, so it doesn't know if it has the message property which is why it's type shows up as any in your case

You can do something like this:

import { InteractionType } from 'discord.js';

...

if (interaction.type === InteractionType.MessageComponent) {
  // Do things that use the `message` property, because the `message` property only exists on interactions that are message components.
}
sudden geyser
#

Actix-web is a prime example of that, since the maintainer used unsafe soundly and for performance reasons but contributors didn't like it since there were safer ways to do so.

#

And you can see it in some of the standard library's APIs

wheat mesa
#

I mostly don’t care at all about the use of unsafe until it becomes excessive

#

A lot of the usage of unsafe is primarily in the lowest of levels

#

Such as in langdev where you need to use transmute to obtain a function pointer to machine code that was generated via JIT compilation

radiant kraken
#

idc what other people say about it

earnest phoenix
#

Usage of the unsafe keyword and blocks is absolutely fine if it's necessary, because not everything can be done in Rust's safe way

radiant kraken
#

like if i know that something is not None then i would use .unwrap_unchecked() over .unwrap()

#

because there is no point in checking

sharp geyser
#

yknow what i should do

sudden geyser
#

but why it is an option then

sharp geyser
#

get off my ass and actually code something for the first time in 3 months

sharp geyser
sudden geyser
#

though honestly I think the low-high level split is rust's greatest weakness

radiant kraken
#

#[forbid(unsafe_code)] is just stupid

earnest phoenix
#

Not if you know that you'll never be touching something unsafe (excluding the standard library functions that use unsafe code aggressively)

wheat mesa
#

Chances are in rust somewhere in your project there will be a use of unsafe, whether it’s by you or by a dependency

#

Which is perfectly fine

#

It doesn’t degrade the overall safety of the language, there are just some areas where it’s not a “one size fits all” type situation

earnest phoenix
#

"Unsafety" exists in almost every code regardless of how perfect it may seem, so indeed

#

Then again not everything can be done in Rust's safe way

#

Especially when you're working with something bare metal

wheat mesa
#

Yeah

radiant kraken
#
unsafe {
  let ptr = std::ptr::null() as *const u8;
  let troll = *ptr;
}``` ![sdTroll](https://cdn.discordapp.com/emojis/887041360413212692.webp?size=128 "sdTroll")
quartz kindle
#

is that basically null pointer exception?

radiant kraken
#

no

sudden geyser
wheat mesa
#

Pretty sure that just Segfaults

radiant kraken
#

i doubt

#

it worked for me

wheat mesa
#

YOU KILLED FERRIS 😭😭😭😭😭😭

#

He’s dead

ancient nova
earnest phoenix
#

No crash here

hidden gorge
#

is AWS or Google Cloud better for a datebase?

wheat mesa
#

I’m sure on some systems it’ll just give you random memory garbage back

#

But it’s definitely UB so nothing is guaranteed

earnest phoenix
wheat mesa
#

That bot runs it through rust playground yeah

#

I’m on mobile

#

So I can’t test on my system

earnest phoenix
#

I mean you can definitely still use our compiler explorer :^)

#

But it can look a bit zoned out on mobile

wheat mesa
#

Yeah the mobile experience isn’t as great

#

Plus I just threw it into a discord bot since I didn’t feel like pulling up godbolt

radiant kraken
ancient nova
#

how should I set up donations for my bot?

radiant kraken
#

yes

wheat mesa
#

buy me a coffee or patreon or stuff like that

#

Don’t try to set up your own financial stuff like that though, let a professional company handle it

ancient nova
#

I was thinking paypal, and just use a paypal.me link for donations

ancient nova
wheat mesa
#

Buy me a coffee is PayPal I believe

ancient nova
#

or is it

#

oh is it*

earnest phoenix
# radiant kraken our?

We (the LLVM Developer Group) actually develop the compiler explorer and maintain it since we use it all the time, like excessively

#

The Godbolt usage is almost everywhere in the development of LLVM

wheat mesa
radiant kraken
#

Can LLVM optimize me

wheat mesa
#

I use it at school just out of curiosity to see how smart LLVM is

#

Try to see what it can see

earnest phoenix
ancient nova
#

I can't login into paypal since I changed my number and lost my old sim card

#

what do I do?

earnest phoenix
#

There's also fast but we don't talk about that, it's optimizations are too aggressive in ways that it avoids being complaint with the standards

quartz kindle
#

i would always use fast then

#

:^)

ancient nova
#

bruh wtf I can't contact paypal without logging into my account LIKE BITCH I NEED TO ASK ABOUT MY ACCOUNT

#

😭

wheat mesa
#

I’ve seen fast before

#

Some of the things it does are questionable yet really giga brain

radiant kraken
#

Like what

ancient nova
#

yooo can anyone acc told me cause I cannot change the number

wheat mesa
#

I can’t remember the specific example but there was something someone compiled in the rust server that I didn’t expect it to optimize

ancient nova
#

so...

wheat mesa
#

There’s your solution

boreal iron
#

That’s why I hate it and deny to use it anywhere

quartz kindle
#

i have a new favorite image viewer software

#

vimage

drifting cairn
boreal iron
#

What does new one do the OS inbuilt one can’t?

#

I mean just speaking about to show an imagine or not

earnest phoenix
ancient nova
#

I had to call them motherfuckers at 1am just to change my number

wheat mesa
#

Does anyone in this channel use linux as a daily driving OS for development

ancient nova
quartz kindle
boreal iron
earnest phoenix
#

Not just for development, but for everything

ancient nova
#

but I got my account back

#

now

#

I can finally

#

set up

#

donations

#

but the buy me a coffe website isn't paypal, otherwise it would have an option to send the money straight to ur paypal

wheat mesa
#

I’m considering booting linux on to my windows laptop, so that I can use it as a work/school laptop exclusively, since I don’t use it for gaming anymore. What’s the experience compared to windows like?

#

(For things like that)

ancient nova
#

I'M ACTUALLY DONE

#

I WAS JUST LOGGED IN A SWCOND AGO

drifting cairn
ancient nova
#

bro wtf it's not even a one time thing I can't log in anymore

drifting cairn
#

flexed on laugh

sudden geyser
#

all the reason to not use paypal

ancient nova
radiant kraken
#

Voltrex writing an essay atm

drifting cairn
#

i did

#

but

#

i couldnt sleep

#

so

ancient nova
drifting cairn
#

i woke back up gx_wokege

quartz kindle
#

thank god i never had issues with paypal

earnest phoenix
# wheat mesa I’m considering booting linux on to my windows laptop, so that I can use it as a...

The experience is way smoother than Windows, and way faster; especially for development as you mentioned as most of the things you need for development and building/compiling is easily given to you instead of using something like Visual Studio as the base builder for things on Windows

And most of the software you need is already available for Linux (well most of the popular Linux distributions at least), although not all software is available of course but there are ways to run it

If you need something that is Windows-only and necessarily need it, then I wouldn't recommend switching over, but I'm sure everything you need is available, and you can customize a ton of things for your liking to make things easier

Other than those, everything else is just better in every way

ancient nova
#

bruh paypal tweaking 😭😭😭

drifting cairn
radiant kraken
#

Linux is for nerds

#

Not gamers

quartz kindle
#

what if youre both

radiant kraken
#

Use Windows 👍

#

I mean Wine

quartz kindle
#

i only drink sweet wine

wheat mesa
earnest phoenix
# quartz kindle b-b-but gaming :(

Gaming on Linux these days is just solid, most of the games you need can already be played at almost the native level using compatibility layers such as Wine, Steam Proton, and various other launchers, such as the Heroic Launcher as the replacement for the Epic Games Store/launcher

ancient nova
#

nahhhh

#

third time I tried logging in

#

WHY

#

I can AND I did log in on website

ancient nova
#

but the mobile app just doesn't wanna log me the fucc in

#

scream scream :scream-1: :scream-1: :scream-1:

radiant kraken
#

Emoji fail

ancient nova
#

it redirects me to the website where it tells me that it freaking failed

earnest phoenix
# radiant kraken What about the BIOS thing

Manufacturers these days provide native builds of their BIOS update utilities for their PCs, however since my laptop's manufacturer (Lenovo) didn't see much use of Linux in the old days, it didn't provide one for the older ones, but now they do for the newer ones

wheat mesa
#

My laptop is Lenovo too :troll:

radiant kraken
#

Switch then 👍

earnest phoenix
#

However not all manufacturers are the same, a decent amount of manufacturers provide BIOS update utilities natively for Linux for a long time

ancient nova
#

acc gonna need me a paypal alternative

earnest phoenix
#

And BIOS updates are not necessary as long as your PC works fine, but is recommended

ancient nova
#

what's the best one

radiant kraken
ancient nova
wheat mesa
ancient nova
#

wine is bad anyway , it rarely even works

wheat mesa
#

But I’m sorry for your LoL situation 😔

ancient nova
#

I mean it's not bad but doesn't work for most games

earnest phoenix
# quartz kindle rip

The main reason Valorant doesn't run on Linux is because of it's anti-cheat, since it's not natively available for Linux

quartz kindle
#

i remember last time i tried installing drivers for my laptop nvidia gpu i bricked my linux and had to reinstall

#

xD

earnest phoenix
wheat mesa
#

Valorant’s anticheat is basically Chinese government level spyware ngl

radiant kraken
#

If i call the NtRaiseHardError function what would Wine do with it

quartz kindle
#

does that display a windows error box?

ancient nova
radiant kraken
quartz kindle
#

lmao

ancient nova
#

like I'm taking textures, sound all purple

wheat mesa
earnest phoenix
#

Steam allows running of non-Steam games as well

ancient nova
#

wait wait

#

is Paypal buisness one of paypals apps cause I just logged in using that?

#

I'm not gonna get my identity stolen?

wheat mesa
#

Bye bye PayPal money

quartz kindle
ancient nova
#

it had 10M downloads so....

quartz kindle
#

looks legit

ancient nova
#

good

wheat mesa
#

Idk man big tech companies suck at keeping logins it feels like

ancient nova
#

can i just use it bare?

wheat mesa
#

I was locked out of my steam account because I couldn’t remember my password, I reset my password, then tried to log in and told me the password I had literally just created was wrong

#

Waited a couple hours for servers to maybe update or something, still didn’t work

earnest phoenix
#

How do I run my bot 24 hours?

wheat mesa
#

Had to contact support and wait 2 days for a response with another reset link

ancient nova
#

lmaoo that app is so trash what the hell even is that 💀💀💀💀💀💀💀💀💀💀💀💀

#

I was logged in, I clicked an option to send money and it opened A FUCKING WEBVIEW and FOR THE LOVE OF GOD IT ASKED ME TO LOG IN AGAIN

#

FUCK THIS SHIT

drifting cairn
earnest phoenix
#

How do I run my bot 24 hours?

quartz kindle
radiant kraken
#

@earnest phoenix check mentions

earnest phoenix
#

Kernel panics are not necessary BSODs, although you can count them as one in some way

quartz kindle
#

dont close it

ancient nova
#

can anyone send me like 1 cent just to confirm that it's working?

earnest phoenix
ancient nova
#

but prolly, the same profile picture showed up

quartz kindle
earnest phoenix
#

Can you send me the links to the site that made the bot work?

ancient nova
#

I wanna make my own paypal client

tropic adder
ancient nova
#

is that possible?

#

😈

wheat mesa
#

Dealing with transactions is a complex and difficult task, especially regarding legality

#

There is a reason that people don’t like reinventing the wheel for that sort of stuff

#

When the government is involved, it will be annoying to make

quartz kindle
# earnest phoenix Can you send me the links to the site that made the bot work?

create a webserver inside your bot, for example ```js
const express = require('express');
const server = express();

server.all(/, (req, res) => {
res.send(pong);
});

server.listen(process.env.PORT, () => {
console.log("ping server online");
});

then create an account on some pinger service, like uptimerobot, and create a new automatic ping task to ping your replit url every 5 minutes
earnest phoenix
wheat mesa
#

“Oops I accidentally committed 5 counts of felony tax evasion and 3 counts of wire fraud”

ancient nova
#

paypal is totally garbage

#

paypal is the worst banking app ever

tropic adder
ancient nova
#

I have never seen a worse website ever

drifting cairn
wheat mesa
#

Wait until you see any government website ever created

ancient nova
#

it logged me out because I REFRESHED THE WEBAITE!!!!!!

#

AND I CAN'T LOG BACK IN AGAIN

radiant kraken
#

Don't use paypal, send the money directly 👍

earnest phoenix
ancient nova
#

god help the next person who picks up the customer service cause I'll be screaming so hard I'll rupture their eardrums

drifting cairn
wheat mesa
#

I’ve heard that patreon is a better experience than dealing with any sort of PayPal dogshit

ancient nova
#

definitely, many people seem to use patreon so might as well try

wheat mesa
#

Use onlyfans for your bot’s premium subscription 😉

drifting cairn
#

other than a bunch of fees and taking most of your money, they're pretty good

drifting cairn
quartz kindle
wheat mesa
#

OnlyFans is not just for nsfw dealings, before that was popularized it’s basically just like another patreon

ancient nova
earnest phoenix
#

😭

#

LMAO

wheat mesa
#

"oh my god dereference that null pointer harder"

ancient nova
#

lol I can't... does creating account on pateon take long cause I pressed the create account button 2 minutes ago 😄

wheat mesa
#

sounds like you have bad internet

drifting cairn
#

i just sign up with google

#

ezpz

wheat mesa
#

or suspicious browser history that cloudflare doesn't like 🤨

ancient nova
#

2mb/s 😄

drifting cairn
#

faster than mine tfFaint

ancient nova
wheat mesa
#

slower than usual

ancient nova
#

bruh I can't create the account

tropic adder
ancient nova
#

I literally

#

want

#

to

#

die

drifting cairn
ancient nova
#

it says that it already exists... huh

#

I never made an account on patreon

drifting cairn
#

apparently you have gx_akko_shrug

ancient nova
#

do I acc have memory loss or something

drifting cairn
#

probably yeah

ancient nova
#

stop

#

IT SAYS MY EMAIL IS FUCKING INCORRED

#

WHAT RHWUFUCKCKC

drifting cairn
#

everythings just going wrong for you huh

ancient nova
#

like not even kidding bruh wtf is this shit

#

I just tried logging in and it said that I already have an account with this email

#

WHY

#

WHY

drifting cairn
ancient nova
#

I just want to setup donations bruh why

boreal iron
boreal iron
earnest phoenix
ancient nova
#

ok relax that's going too far

drifting cairn
earnest phoenix
#

Your code has gone too far! I couldn't sleep for a week because of it

boreal iron
ancient nova
#

the heck why does it use my actual name is my username

#

I don't want people knowing my name

drifting cairn
#

u cn change it

boreal iron
#

When abstract gets a new meaning

ancient nova
#

where?

drifting cairn
#

uh

#

settings thingy

ancient nova
#

oh I see it

#

why is every website messed up for me lmfao..

#

nah bro what the actual hell is this

#

every single website

drifting cairn
#

probably sumn to do with your browser extensions

ancient nova
#

my adblocker?

drifting cairn
#

could be

ancient nova
#

nah on my phone I got no adblock and it still gave me that

#

something wrong

#

definitely

#

but maybe on pc idk

drifting cairn
wheat mesa
#

I need someone to help me stop procrastinating

#

do I start with calc hw or do I do physics

ancient nova
#

ok goonna try turning it off

#

ok it was my adblock

#

anyways... how do I make it so people can acc donate?

drifting cairn
#

make a tier

ancient nova
#

how...?

#

all I got i the home page, and the settings page

#

nothing else on my screen

#

bro help me 😭

#

k I found it

boreal iron
#

Create a simple donate button with the inbuilt features

#

That’s it

#

Not that anyone every donates anyways

#

But as long as you can dream it… smirk

ancient nova
sharp geyser
#

yea nah

#

gl champ but it aint your bot they will donate too

ancient nova
#

bruh relax they might just will and u know it

lyric mountain
#

I hope you're not trying to use patreon api

ancient nova
#

what does this mean also?

ancient nova
#

I wanted to use it for perks in my bots, I assumed I'd be able to check who is my patron

lyric mountain
#

You'll not succeed

ancient nova
#

wot why

lyric mountain
#

Patreon api is among the worst ever created

ancient nova
#

even worse than mine? kek

quartz kindle
#

its worse than paypal's

ancient nova
lyric mountain
#

Don't underestimate patreon api

quartz kindle
#

and paypal's api is already one of the worst in the world

ancient nova
#

I haven't even used paypals api yet, but I can tell it would be just awful by the experiences I just had with the application and the website together

lyric mountain
#

They not only send a kilometer-long response, but the entire thing repeats a ton of sections so u don't really know what data you'll be using

#

Split by space, [0]

quartz kindle
#

and the one thing you want, to know if x user is pledged or not, is hidden behind layers and layers of useless info

lyric mountain
#

If u use space as delimiter

ancient nova
#

dam I will still maybe try but tomorrow as I don't have the strength to deal with this any longer kek

#

at least the page is set up which is good enough for me

#

"PayPal" joethinking

#

I kinda wanna do it as I've dealed with paypal before it went to shit so Ik how to get money out of it but idk

#

should I just do it directly to my bank?

lyric mountain
#

Remember both take quite a big tax off your income

ancient nova
#

paypal takes 1% which is basically nothing

#

or is there some hidden tax?

lyric mountain
#

Well...yes, as all transactions have

quartz kindle
#

depending on which country your paypal is from, there can be an additional receiving tax and conversion fees

lyric mountain
#

The "small" percentages end up adding a lot

ancient nova
#

aw man

sharp geyser
ancient nova
#

my only tier is called buy me a coffee which is 3$ 😭

sharp geyser
#

You don't like reading docs to begin with

#

so you will def hate paypal docs

#

they are so fucking bad

ancient nova
#

in the end I gave up and tried using patreon for donations