#discord-bots
1 messages · Page 1039 of 1
but he doesn't use an opensource api with uncopyrighted with music... it's wavelink
whats wavelink?
api downloading from youtube
well you need their help
so you kinda have to listen
oh
basically
i did not ask for help my "dEniAl" plus the issue was solved 1 hour before he sent that message, plus the issue was with discord.py and not anything against ToS
We cannot verify how you will use wavelink, so we can't help you with your issue, even if wavelink itself is not the issue.
problem was solved
@regal pulsardm ? pls
oh yeah sorry
he has a "quarrel with me" like i say in my own words ||a broom up his arse ||
I'm still bullied for my discord username
Now, I will ask that everyone moves on, as this channel has been wildly derailed.
and I've been told like 6 times that I have a broom up my arse
and that someone shit in my brain
Please change the subject.
can you please tell this user to not play discord sheriff towards me this is the 3rd issue ive had with this use in the same case
Why are my discord slash commands not showing?
well it's still the birthday system
sync them
How?
do you use client or bot
bot
bot>>
Have you invited the bot to your guild with the applications.commands oauth2 scope?
yup
bot.tree uh wait give me 2 sec to get something
And is this a global or guild specific command?
!d discord.app_commands.CommandTree.sync
await sync(*, guild=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Syncs the application commands to Discord.
This must be called for the application commands to show up.
Global commands take up to 1-hour to propagate but guild commands propagate instantly.
Haha, it's usually the simple things
yea that
ml based phishing scam & toxicity detection
hm
Code?
raise ClientException('This client already has an associated command tree.')
discord.errors.ClientException: This client already has an associated command tree.
Why am I getting this error?
class client(discord.ext.commands.Bot):
def __init__(self):
super().__init__(
command_prefix='!',
intents = discord.Intents.default(),
application_id = 770696433573036054)
self.synced = False
self.initial_extensions = [
"cogs.test",
]
async def setup_hook(self) -> None:
self.session = aiohttp.ClientSession()
for ext in self.initial_extensions:
await self.load_extension(ext)
await client.tree.sync(guild=discord.Object(id=770698123915165747))
async def on_ready(self):
await self.wait_until_ready()
print(f"Logged in as {self.user}")
if not self.synced:
await tree.sync(guild = discord.Object(id=770698123915165747))
self.synced = True
aclient = client()
tree = app_commands.CommandTree(aclient)
aclient.run(os.getenv("TOKEN"))
you cant have 2 command trees afaik
https://mystb.in/CondosLogicDiagnostic.txt
async def interaction_check(self, interaction: discord.Interaction):
owner_check = await interaction.client.is_owner(interaction.user)
print(f"1. {owner_check}")
print(f"2. {self.ctx.author.id != interaction.user.id}")
print(f"3. {self.ctx.author.id != interaction.user.id or not owner_check}")
if self.ctx.author.id != interaction.user.id or not owner_check:
return await interaction.response.send_message(
content=f"You Can't Use that button, {self.ctx.author.mention} is the author of this message.",
ephemeral=True,
)
return True
so what's up with my check?
only works when owner + author
Meant to work with author clicking on button or bot owner clicking on it
how do I make it so when someone sends a specific word that it gets deleted?
cuz this doesnt work
discord.Client doesnt have a delete_messages method, use await message.delete()
!d discord.Message.delete
await delete(*, delay=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Deletes the message.
Your own messages could be deleted without any proper permissions. However to
delete other people’s messages, you need the [`manage_messages`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.manage_messages "discord.Permissions.manage_messages")
permission...
o
or not owner_check will always be executed if the user does not own the bot
therefore the if will succeed
Error says it all, multiple command trees
commands.Bot has its own default tree
I was under the impression that the commands extension was incompatible with application commands?
Or does it also use the command tree, but for regular commands?
Ah hybrids, was mentioned here a few times. I'll have to check that out
g = client.get_guild(507364684924452896)
@client.event
@commands.command()
async def banlist(ctx):
try:
bans = await g.bans()
banids = [banentry.user.id for banentry in bans]
f = open("banlist.txt", "w")
for id in banids:
if re.find('(?i)(\balt\b)', ban.reason):
f.write(str(id) + '\n')
except Exception as e:
print("Something happened, probably no perms." + str(e))
finally:
f.close()
``` Is there a good way to throttle how quickly it writes each ID in the list? I was thinking sleep but I mainly just don't want to send too many api reqs too fast
What in the
Too many API requests? You're only sending one
Why do you have a event decorator on your command?
lol
class test(commands.Cog):
def __init__(self, client: commands.Bot) -> None:
self.client = client
@app_commands.command(name="prueba", description="probando")
async def test(self, interaction: discord.Interaction) -> None:
interaction.response.send_message("Test")
async def setup(client: commands.Bot) -> None:
await client.add_cog(
test(client),
guilds = [discord.Object(id=770698123915165747)]
)
print("test.py fue iniciado exitosamente.")
unsupported type annotation <class 'discord.interactions.Interaction'>
error line:
async def test(self, interaction: discord.Interaction) -> None:
To be honest, idk whats happening
copied from something else when I cut all the riff raff out, must've missed it 
Weird, last time I ran it I got ratelimited by Discord
Where do you host your bot
At the time it was Replit, but now I've got a VPS
I wonder if that was a replit thing
Likely there were multiple bots using the same ip
Not sure how rate limit is applied in this case though
Ratelimits are applied per ip
iirc so he could of gotten ratelimited because of the other bots
Could of been the other users using replit to host their bot
Hmm, so there were other bots running on it?
Makes sense, at the time I really didn't know much about replit, was just using it because free = good


I use my bot solely for things like ban logging, and I would get hit with Error 429's about once every other day
I should study for the test that's in a couple minutes rather than helping here
When using replit?
Or hosting on your vps
Mhm, replit
Yeah
I assumed I bugged something, but in retrospect it was probably just replit
When i was first starting out
I too use replit
I once got randomly ratelimited for like 6 hours
why isnt this creating a slash command?
bussy
I think it's infinitely better to have a dedicated vps for like 5 eur since you get much more freedom
name='bussy'
I actually get hosted for free because a very nice friend owns a cloud service and lets me use it 
Lucky
I had to go deep in the internet to find a free good one
Took like 3 hours
What'd you end up using?
A vps
That's free 24/7 without me having to do anything


fucking keep_alive moment 💀
idk but bussy
which one 🤔
That would be advertising unless do you want me to send in dms
yes please
where are you creating the embed?
async def example(ctx):
em = discord.Embed(title="Title", description="Description")
await ctx.send(embed = em)
should look something like that
you can add lots of things tho, for ex
em.add_field(name="Name", value="This is just like another description for this section")
wait weren't you the one that wanted to make a spam bot
🧐
anyways
class test(commands.Cog):
def __init__(self, client: commands.Bot) -> None:
self.client = client
@app_commands.command(name="probando", description="prueba")
async def probando(self, interaction: discord.Interaction) -> None:
interaction.response.send_message("Prueba exitosa.")
async def setup(client: commands.Bot) -> None:
await client.add_cog(
test(client),
guilds = [discord.Object(id=770698123915165747)]
)
print("test.py fue iniciado exitosamente.")
This is my cog, but the command wont appear on my server.
This is my main file, is something wrong?
Did you add the cog?
What do you mean
You have to register it in your bot
Like, loading the extension?
Yep
yep
And what's about extension setup function?
guilds should be list of integers or strings, not discord.Objects
Maybe that's the problem
try guilds=[7706...]
no it can be discord.Object
hmm
Docs say list[Snowflake], so
idk if I do the same thing in the main file it works
i'll try tho
Extension 'cogs.test' raised an error: AttributeError: 'int' object has no attribute 'id'
nope
Which discordpy version?
.. versionadded:: 2.0
guilds: List[:class:`~discord.abc.Snowflake`]
If the cog is an application command group, then this would be the
guilds where the cog group would be added to. If not given then
it becomes a global command instead. Cannot be mixed with
``guild``.
Weird
Try without the guilds anyway, i'm not sure
sure
altought if you make it global it takes up to 24hrs to update, that's why im using guild
You can also add async cog_load hook to make sure your cog is loaded 🤔
where
As method in your cog
Why would it take 24hrs?
its 1hr
oh
to a few hrs
my bad, idk where I saw that
What are you talking about?
global app commands
If these are slash commands i guess 🤔 Shouldn't take any time for old fashioned ones
yeah
I'll try again later
how to get the amount of users are in a guild and set it in presence.
guild.member_count?
len(guild.members)
!d discord.Guild.member_count
property member_count```
Returns the member count if available.
Warning
Due to a Discord limitation, in order for this attribute to remain up-to-date and
accurate, it requires [`Intents.members`](https://discordpy.readthedocs.io/en/master/api.html#discord.Intents.members "discord.Intents.members") to be specified...
both works
Personally I think this looks better but they’re are the same yes
!d disnake.Guild.member_count
property member_count```
Returns the true member count regardless of it being loaded fully or not.
Warning
Due to a Discord limitation, in order for this attribute to remain up-to-date and accurate, it requires [`Intents.members`](https://docs.disnake.dev/en/latest/api.html#disnake.Intents.members "disnake.Intents.members") to be specified.
cool disnake also have
It’s fork so most stuff is same
Especially things like guilds which doesn’t really change
yes but some features are not
Yes but most old stuff is same
ye
probably asked wrong server, using hikari/lightbulb and i'm having a difficult time displaying it in the bot's status
Never used hikari
been trying to find documentation on it and i can't
@slate swan
he will help u
"Huh, no" 😅
no hikari docs on Python bot
yeah i don't know why it's not working
wo hikari docs are fancy
yeah the docs are confusing
time to improve moderation.py
if i had a penny for every time i did that i'd have 5 pennies
everything is cool but for testing u need a alt to test ;-;
but now fine
why was this feature not there when i actually used my alt
😔
rip
lol
for missions
sad
i also used to logout and login
and the pain was
anti robot!! one
Now that I think of it
maybe he's the one the joined with sparky profile pictures
It works

.I got my answe
Possible.
?
I’m telling to ppl yesterday I found a solution
okay nice 👍
um same timezone
i’ve had my bot in a test server (registered by id in the bot initialize thing) and in another server not referenced. why do the commands only show up and work in the test server? i’ve had the bot online for over 24 hours and they still haven’t populated into other servers.
because you are specifically mentioning the servers in which the commands should show up, remive the ids and you'll be good to go, also, there isnt a point on keeping your bot online in order to register slash commands, once the bot is run, the commands will be registered even if the bot goes offline
👀
moreover a but can never be online for 24 hors straight
hiiii sparky
I've a question 😔
yes?
like you did a gw command, right?
yes?
but..
i removed requirments sadly
how'd did store the datetime objects?
why?
wait ill give
huh? how'd you check them then? did you like get the epoch values?
oh is that to help have a single bot with two active instances of the bot, one for live deployment and one for testing?
but uh why cant i keep my bot online for 24 hours straight?
sd = datetime.now()
newDate = sd + timedelta(seconds=sec)
then i store newDate in string
then to get and datetime object from the string u can use
b = datetime.fromisoformat()
then u can compare it with datetime.now()
u can also do datetime.datetime.strptime()
..
because, the wrapper/api automatically reconnects you to the api after a period of time
The Internet is a scary place. Disconnections happen, especially with persistent connections. Due to Discord's architecture, this is a semi-regular event and should be expected and handled.
Yes, that is a copy paste from the docs: https://discord.com/developers/docs/topics/gateway
oh
wouldnt recommed it
So yes, don't rely on your bot always being online in the sense that it won't disconnect from the gateway
i wasnt
ohh i see
i meant it is successfully being hosted for over 24 hours at this point, on my rpi, and the commadns are still working without my doing anyhting to it
yeah its status would be shown online for 10-25 seconds after disconnectivity
Yes, but d.py handles reconnects for you so it doesn't look like it disconnected, even if it did
And it can re-connect within those seconds, so it doesn't look like it ever went offline
^
ah, well thats somewhat semantics in this case i guess, as im not doing anythign that qould require NO disconnects
just somethign that requires reliable uptime
well, disconnections will hapoen no matter
?
well, you did get your answer, is there any other issue too?
is there a convenient library for allowing string parameters to offer spelling errors if what you inputted is close to a viable option but is not actually an option?
!d difflib.get_close_matches
difflib.get_close_matches(word, possibilities, n=3, cutoff=0.6)```
Return a list of the best “good enough” matches. *word* is a sequence for which
close matches are desired (typically a string), and *possibilities* is a list of
sequences against which to match *word* (typically a list of strings).
Optional argument *n* (default `3`) is the maximum number of close matches to
return; *n* must be greater than `0`...
!pip python-levenshtein
other than that i cant think of anything i need to do to it at the moment, since im just waiting for people to make a gif renderer tool and send me gifs
or fuzzy-wuzzy, but levenshtein is a bit faster
A built in library, not really a spell check but rather a fuzzy search
fuzzy wuzzy does use levenshtein does it not?
it does
but it itself returns a warning before execution
so with the builtin, if one option is "gemini decomposition" and i type in "gemani decompostio" would it return "gemini decomposition" as a suggestion?
Weird name
Probably some dude's last name
well, then use what nullptr suggested
It’ll return a list of close matches
https://en.wikipedia.org/wiki/Levenshtein_distance Vladimir Levenshtein
So yes
cool
how weird
By soviet mathematician in 1965, how interesting!
👀
I do love myself some tidbits of programming history
#discord-bots message an old example of me using it
now i wanna make a fuzzy string matcher
how do i go about making a bot
check the pins
pins are cnfusing
#discord-bots message heres one, it's hidden deep in the pins
oh ok
any better idea to do this?
listmy = []
listmy2 = []
adsf = int(winlimit)
for xd in range(adsf+1):
ac = random.choice(dsd)
if ac not in listmy and ac != self.bot.user.id:
listmy.append(ac)
``` i dont want to repeat the same id in list
dsd is a list of ids
anyone?
or
how can i choose like x items from a list with random and there not same
you could use a set instead of a list
okay
Wouldn't that make a dict instead of a set
no
!e ```py
duck = {}
print(type(duck))
@supple thorn :white_check_mark: Your eval job has completed with return code 0.
<class 'dict'>
Hmm
duck
duc
um but im using random.choice?
wait what
Lmao
Told you
how tf did i forget to make a set
!e ```py
duck = set()
print(type(duck))
@supple thorn :white_check_mark: Your eval job has completed with return code 0.
<class 'set'>
@slate swan empty set
!e
myset = set()
myset.add("noob")
print(myset)
print(type(myset))
nice
well yeah use that
@slate swan :white_check_mark: Your eval job has completed with return code 0.
001 | {'noob'}
002 | <class 'set'>
💀
It is now my summer break
where
In my terminal
Hello skev
and?
i need that amout of ids
not less
and if random.choice is same
the for loop will continue
and miss 1 value
..
not sure u can understand or not
it wont
Hi people
Pls help me with this error:
Ignoring exception in on_command_error
Traceback (most recent call last):
File "C:\Users\Divi\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\client.py", line 531, in _run_event
await coro(*args, **kwargs)
File "d:\Shrey\Python\3P Pie\script.py", line 42, in on_command_error
await asitems.set_embed(embed, ctx, True)
File "d:\Shrey\Python\3P Pie\asitems.py", line 19, in set_embed
msg = await context.reply(embed=object)
File "C:\Users\Divi\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\ext\commands\context.py", line 398, in reply
return await self.message.reply(content, **kwargs)
File "C:\Users\Divi\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\message.py", line 1868, in reply
return await self.channel.send(content, reference=reference, **kwargs)
File "C:\Users\Divi\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\abc.py", line 1504, in send
data = await state.http.send_message(
File "C:\Users\Divi\AppData\Local\Programs\Python\Python310\lib\site-packages\disnake\http.py", line 420, in request
raise HTTPException(response, data)
disnake.errors.HTTPException: 400 Bad Request (error code: 50035): Invalid Form Body
In message_reference: Unknown message
I wanted to make a purge command ;-;
Pls
!e
import random
se2 = set()
list2 = [1,2,3,4,5,6,7,8,9,10]
for x in range(8):
se2.add(random.choice(list2))
print(se2)
@slate swan :white_check_mark: Your eval job has completed with return code 0.
{2, 3, 5, 6, 8, 9}
@slate swan
see
Send your code
or i do
!e
import random
se2 = set()
list2 = [1,2,3,4,5,6,7,8,9,10]
limit = 9
while len(se2) != limit:
se2.add(random.choice(list2))
print(se2)
@slate swan :white_check_mark: Your eval job has completed with return code 0.
{1, 2, 3, 4, 5, 6, 7, 8, 10}
#bot-commands
Sorry, its fixed. I was replying to the message when its already deleted.
did you solve it yet?
you can try updating the presence after some time the bot is started
using a task right?
it happens because the cache isn't populated with all the servers yet
i’m not sure where to implement the code part
yea that would work, i personally face that issue but it gets the correct guild count automatically after some time
i haven’t use lightbulb or hikari for long
i have the presence under the bot.run()
um anywhere you want to, just make sure you start the task after the bot is online
ah
yeah
thats the issue
i meant does the code go into the name part
yeah i’m not so well with hikari
anything under bot.run won't get executed
or lightbulb
no like
it’s within the bot.run
that’s how i have the presence
the activity kwarg?
oh, that wont work because of the cache thing i told earlier
yes
yeah so how would you write that properly then
i remember trying to do a task loop with the presence but i gave up since it was too confusing and annoying to deal with
from lightbulb.ext import tasks
tasks.load(bot)
@tasks.task(m= minutes)
async def my_task()
# update presence
you can start this task using my_task.start() in a StartedEvent
right, which one is it to show all users in the guild presented on the status of the bot
Guild.member_count
why don’t they have an easier way of explaining how to use half the things on there
you need to give some time reading the docs
still very confusing
@slate swan i'm using lightbulb too
yeah, ik
i say i just give up on it again, thanks for the help
Does anyone wanna make a simon says bot with me
@slate swan any better way? to do this
To do what
What are you trying to do?
i have a list and i want to append x number of items randomly with no repeat
x number of items to?
set
this works but any better way?
@slate swan AttributeError: type object 'Guild' has no attribute 'member_count'
@boreal ravine ??
@slate swan it's giving me this
<property object at 0x00000278337C2040>
<property object at 0x00000278337C2040>
<property object at 0x00000278337C2040>
<property object at 0x00000278337C2040>
Actually it's better to remove the item from the original list every time it gets selected
from random import choice
final_result = []
initial_values = list(range(10))
for i in range(5):
x = choice(initial_values)
initial_values.remove(x)
final_result.append(x)```
Cause with sets you do many unnecessary operations
Nice idea :D thanks 👍
did you just directly wirte Guild.member_count there?
guild needs to be an instance of hikari.Guild, not the class
@bot.listen(hikari.StartedEvent)
async def status_task(event):
while True:
await bot.update_presence(activity=hikari.Activity(type=hikari.ActivityType.WATCHING, name="over"))
await asyncio.sleep(10)
guild = bot.cache.get_guild(guild_id)
print(guild)
print(f"{guild.member_count}")
is this wrong
ah
nope it should be correct
but you dont use a while True loop in a task~
yeah it's just giving me this error
AttributeError: 'NoneType' object has no attribute 'member_count'
ah, remove the while true?
The guild ID u passed in does not exist.
shkw the guild_id variable and uour intents
*show, *your
i have it set to intents=hikari.Intents.ALL
guild_id = '973310535556825130'
needs to be an integer, not string
remove those 's
that's what i did
You made the guild_id a string.
print(f"{guild.member_count}")
AttributeError: 'NoneType' object has no attribute 'member_count'
I 2022-05-11 22:54:12,360 hikari.bot: started successfully in approx 10.46 seconds
None
yeah i didn't mean to put it in a string
as i said, use a task
the servers may not be cached in the started event yet
ah
it works now when i use the main server
await bot.update_presence(activity=hikari.Activity(type=hikari.ActivityType.WATCHING, name=f"over {guild.member.count}"))
AttributeError: 'NoneType' object has no attribute 'member'
gives me this
is the bot added in that server?
it's right it was working before i added it to the name area
make sure its an integer, and it's guild.member_count
it works when using the . too
for some reason
@slate swan breaks when i add it into "name"
so i decided to change the joke api, nothing prints at all
Code:
elif message.content.startswith("Joke Pyramid"):
def get_joke():
data = requests(f)
tt = json.loads(data.text)
return tt
f = r"https://official-joke-api.appspot.com/random_ten"
a = get_joke(f)
for i in (a):
print(i["type"])
print(i["setup"])
print(i["punchline"], "\n")
guild_id = int(952259827915178094)
@bot.listen(hikari.StartedEvent)
async def status_task(event):
guild = bot.cache.get_guild(guild_id)
await bot.update_presence(activity=hikari.Activity(type=hikari.ActivityType.WATCHING, name=f"there is {guild.member.count} in the server"))
await asyncio.sleep(10)
print(guild)
@slate swan
What's the problem?
I assume your guild might not be in cache yet?
await bot.update_presence(activity=hikari.Activity(type=hikari.ActivityType.WATCHING, name=f"there is {guild.member.count} in the server"))
AttributeError: 'NoneType' object has no attribute 'member'
no it's cached
But it's None
yes but it was just working
help
Well, if it's None then it's not in the cache
then why is it printing out the member count lol?
Maybe don't use it since you only run this function on startup
well i'm going to put it in a task
but it works it's just not working in the presence
perhaps because you updated presence and it might have updated the cache somehow? 😅
That would be my guess
now i get an error saying: data = requests(f) TypeError: 'module' object is not callable
how long does it take to cache
🤷
because the bots been in there for a minute
just use a task
cacheing takes place every time the bot restarts
okay so for the started event i just put the normal presence
and then use a task to update presence?
@slate swan i did it but it's still not working in the presence
when i add it to name
it works but it's giving me the same error
await bot.update_presence(activity=hikari.Activity(type=hikari.ActivityType.WATCHING, name=f"over {guild.member_count} users in the server"))
AttributeError: 'NoneType' object has no attribute 'member_count'
Not sure what I did wrong here, but this raises an exception: UnboundLocalError: local variable 'f' referenced before assignment
@client.command()
@commands.has_role('BotStuff')
async def banlist(ctx):
try:
bans = await guild.bans()
banids = [banentry.user.id for banentry in bans]
f = open("banlist.txt", "w")
for id in banids:
if re.find('(?i)(\balt\b)', ban.reason):
f.write(str(id) + '\n')
except Exception as e:
print("Something happened." + str(e))
finally:
f.close()
@bot.event
async def on_ready():
await bot.change_presence(status=discord.Status.idle, activity=discord.Game("k.help | lazy sound"))
print("Kiff connected")```
warn(message, DistributionWarning, stacklevel=0)
Ignoring exception in on_ready
Traceback (most recent call last):
File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\nextcord\client.py", line 417, in _run_event
await coro(*args, **kwargs)
File "C:\Users\User\Desktop\discord bot\bot.py", line 11, in on_ready
await bot.change_presence(status=discord.Status.idle, activity=discord.Game("k.help | lazy sound"))
File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\nextcord\client.py", line 1198, in change_presence
await self.ws.change_presence(activity=activity, status=status_str)
File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\site-packages\nextcord\gateway.py", line 614, in change_presence
raise InvalidArgument('activity must derive from BaseActivity.')
nextcord.errors.InvalidArgument: activity must derive from BaseActivity.
any idea on how to solve this?
hm, you have to install the master branch for dpy to use views
pip install -U git+https://github.com/Rapptz/discord.py (you need python 3.8 or later)
ok thanks that fixed it
Is there any website where I can get any type of API, that can be used unlimited time and is free to use?
Openapi or smth
only these r needed for slash commands right ?
Yup
ok
@app_commands.command(name="test", description="Testing")
async def testreason_slash(self, interaction: Interaction, reason: str="Unspecified"):
await interaction.response.send_message(reason, ephemeral=True)
is anything wrong in this ?
slash commands requires up to 1 hour to be registered globally
openapi and some-random-api is what you're looking for, though I recommend using apis directly
unless you specify the test_guilds
i have menu that doing role selection, everything working fine when you select role but when you remove role its doing "This interaction failed" and getting the next error:
Traceback (most recent call last):
File "E:\Softwares\PyCharm\PyCharm 2021.3.3\pythonProject\venv\lib\site-packages\nextcord\ui\view.py", line 371, in _scheduled_task
await item.callback(interaction)
File "E:\Softwares\PyCharm\PyCharm 2021.3.3\pythonProject\DiscordBot\main.py", line 289, in callback
await interaction.response.send_message("Your role list has been modified.", ephemeral=True)
File "E:\Softwares\PyCharm\PyCharm 2021.3.3\pythonProject\venv\lib\site-packages\nextcord\interactions.py", line 800, in send_message
await adapter.create_interaction_response(
File "E:\Softwares\PyCharm\PyCharm 2021.3.3\pythonProject\venv\lib\site-packages\nextcord\webhook\async_.py", line 189, in request
raise NotFound(response, data)
nextcord.errors.NotFound: 404 Not Found (error code: 10062): Unknown interaction
any idea why its happened?
you are taking too long to respond to the interaction
so what can i do to fix it?
show code
you need the callback?
its a little bit long ^_^
async def callback(self, interaction):
self.values.sort()
if "0x10" in self.values:
user = interaction.user
role = nextcord.utils.get(interaction.guild.roles, id=x)
await user.add_roles(role)
else:
user = interaction.user
role = nextcord.utils.get(interaction.guild.roles, id=x)
await user.remove_roles(role)
await interaction.response.send_message("Your role list has been modified.", ephemeral=True)
there is like 10 roles in total
@slate swan
Thanks for the info
you can defer the response then
and instead of using utils.get, use guild.get_role
idk how to defer in nextcord though
can you show me example of what you know, ill try to convert it in nextcord
why dont the interactions work here ?
import discord
from discord.ext import commands
from discord_components import DiscordComponents, Select, SelectOption, Button, ButtonStyle
from discord.utils import get
TOKEN = ""
bot = commands.Bot(command_prefix="dp ")
@bot.event
async def on_ready():
print("We have logged in as {0.user}".format(bot))
@bot.command()
async def send(ctx):
await ctx.send(components=[
Select(
placeholder = 'Currency ',
options = [
SelectOption(label="Dank Memer", value="value1"),
SelectOption(label="Bro", value="value2"),
SelectOption(label="Mimu", value="value3"),
SelectOption(label="UnbelievaBoat", value="value4"),
SelectOption(label="OwO", value="value5"),
])])
@bot.event
async def on_select_option(interaction):
if interaction.values[0] == "value1":
await interaction.author.send("Menu 1")
elif interaction.values[0] == "value3":
await interaction.author.send("Menu 3")
elif interaction.values[0] == "value4":
await interaction.author.send("Menu 4")
elif interaction.values[0] == "value5":
await interaction.author.send("Menu 5")
bot.run(TOKEN)
maybe try this:
await interaction.response.send_message("Menu 1")
why wont my bot run on a virtual enviroment
dont use that library, please upgrade to discord.py 2.0 and I already saw where the issue is
TOKEN isnt stored as an env variable
wait ill show you tje file
how i can defer the response here?
and i can see there are errors above
but hide your token, just in case
How do I get the list all the checks on a command?
^
async def on_member_join(self, member):
print(member)
await member.send("hello")
guild = self.client.get_guild(730651046459998218)
channel = discord.utils.get(member.guild.channels, id=885464532959526913)
if guild:
print("guild ok")
else:
print("guild not found")
if channel is not None:
Myembed = discord.Embed(title= f"Welcome",
description(f"Welcome {member.mention}, You are member {guild.member_count}. \n Please enjoy your stay here and dont forget to read the await [#904279966693355550](/guild/267624335836053506/channel/904279966693355550/)"))
Myembed.add_field(name="Account Created at:", value=f"<t:{int(member.created_at.timestamp())}:R>" , inline=True))
await channel.send(embed=Myembed)
else:
print("id channel wrong")``` How do you send an embed in cogs form?
i see, hm, are running the load_dotenv function ?
no
im using os.getenv()
import os
from dotenv import load_dotenv #pip install python-dotenv
load_dotenv()
os.getenv("KEY")
thats how you do away with env vars
await send(embed=...)
thats how you send embeds
pip install aint workinmg
try
python -m pip install python-dotenv
class HelpButtonMenuPages(menus.ButtonMenuPages):
FIRST_PAGE = ":pagefirst:"
PREVIOUS_PAGE = ":pageprev:"
NEXT_PAGE = ":pagenext:"
LAST_PAGE = ":pagelast:"
STOP = ":trashcan:"
def __init__(
self,
ctx: commands.Context,
help_command: "PaginatedHelpCommand",
options: List[nextcord.SelectOption],
**kwargs,
):
super().__init__(timeout=300, **kwargs)
self._ctx = ctx
self.add_item(HelpDropdown(help_command, options))
self.help_command = help_command
async def interaction_check(self, interaction: nextcord.Interaction) -> bool:
"""Ensure that the user of the button is the one who called the help command"""
return self._ctx.author == interaction.user
How to override stop button here
worked
if i simply add @\nextcord.ui.button, it adds another stop button
instead of overriding
refer to the same instance of the stop button
wdym?
where did you declared the button?
its already in this class
in nextcord ext menus?
so will this work
yes
its interaction.response.defer()
thanks
bruth there you just create the class, where do you call it?
for example:
await interaction.response.send_message("Your role list has been modified.", ephemeral=True)
#TO >
await interaction.response.defer("Your role list has been modified.", ephemeral=True)
?
await inter.response.defer()
# do your stuff
await inter.response.edit_message(....)
i'll try to find something to help me figure how to do it on nextcord.py,
any way massive thanks!
thats for nextcord, you can use it
await InteractionResponse.defer()
#kwargs
#ephemeral: bool | None = False
#with_message: bool | None = False
those are the kwargs that defer contains
oh so i'll try it now
Also what is ButtonMenuPages? 
ow. but thats only for slash commands, right?
Is there a way to like put 2 bot tokens in a client.run statement?
!d nextcord.InteractionResponse.defer
await defer(*, ephemeral=False, with_message=False)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Defers the interaction response.
This is typically used when the interaction is acknowledged and a secondary action will be done later.
Have you ever used nextcord ext menus???
💀
I use disnake, that's why i don't have those problems 
Like running 2 bots in your program?
well, you can
🤦
But?
its defined in the lib
it isnt ideal and nor is it recommended
It's not builtin nextcord
Will it make the commands slower though xd?
no, it will be more of a loss of resources and both of your apps will make requests from the same ip which potentially makes you vulnerable to getting rate-limited. Thus, you'll get banned from the discord api for making too many requests
again there is nothing related to ButtonMenuPages 
self realization is the best 🫂
xddd
just inherit other buttons and set the inherit_buttons=False, then create a stop button of your own
what does inherit_buttons do?
I never used it in my code
it wont add the buttons automatically, rather you'd have to explicitly add those, you can the rest of the buttons like
self.add_item(menus.MenuPaginationButton(emoji=self.LAST_PAGE))
#other buttons
and you can create a stop button of your own
in the same class
@nextcord.ui.button()
async def stop_btn(...):
...
In the code here buttons are created in the class, your buttons are not declared in the class, i think that you create them with the decorator
most of everything is taken from here
how ?
depends on the package that you are using, check the docs
usually you do it by adding a guild_ids = [id] in the slash command decorator
discord.py 2.0
the ewest slash commands api wrapper for python.
ewest
it's the ewest because it is not the uwuest?
I read that with a u
Same thing what i thought
@app_commands.command(...)
@app_commands.guilds(discord.Object(id=guild_id_here), ...)
async def foo(...):
...
as I said, pure hell
or you could just do
guild = discord.Object(id=...)
Bot.tree.copy_global_to(guild=guild)
tbh, what I think is, dpy devs were gonna implement slash commands like disnake and nextcord and our beloved py-cord ❤️ did
but to make them look somewhat unique, they made some other methods and named the methods something else but totally shat on it
beloved py-cord
i think that we can't be friends anymore
its not my fault, py-cord devs just made the library so uwu that I'm in love ||/s|| 😔
hey guys so, im making so that if someone is bored discord bot will send a joke
elif message.content.startswith("Joke Pyramid"):
def get_joke():
r = requests.get("https://v2.jokeapi.dev/joke/Any")
json_data = r.json()
if json_data["type"] == "single":
return json_data["joke"]
elif json_data["type"] == "twopart":
return "\n".join([json_data[x] for x in ["setup","delivery"]])
else:
return f"Sorry, I dont know how to tell a joke of type {json_data['type']}"
joke = get_joke()
await message.channel.send(joke)
elif any(word in msg for word in boring_words):
await message.channel.send(random.choice(before_joke))
Joke = get_joke()
await message.channel.send(Joke)
however the bot just sends the first message and gives an error for the second one: Joke = get_joke() UnboundLocalError: local variable 'get_joke' referenced before assignment
do i have to redefine it?
i think that py-cord devs instead of drinkin' coffee to wake up they drunk alcohol, otherwise there is not other ways to explain how that package is so bad
Real coding happens after drinking alcohol
- bad implementation
- unnecessary high-resource usage
- blocking
- bad practice
- repeating
- half the code is redundant
underage people be like: 👀
I agree
Ashley you are too young yet for alcohol 
dont insult py-cord 😔
we can't help you on makin' it but we can answer your question and resolve your issues
I dont drink, nor did I ever say that I consume alcohol
to add a role to an user first of all you will need the member id (if you have the guild object) or the member object (if you don't have the guild object) of the user
!d discord.Member.add_roles then you will need to use this method
await add_roles(*roles, reason=None, atomic=True)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Gives the member a number of [`Role`](https://discordpy.readthedocs.io/en/master/api.html#discord.Role "discord.Role")s.
You must have the [`manage_roles`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.manage_roles "discord.Permissions.manage_roles") permission to
use this, and the added [`Role`](https://discordpy.readthedocs.io/en/master/api.html#discord.Role "discord.Role")s must appear lower in the list
of roles than the highest role of the member.
Nope, I'm a freelancer in my free time so I develop bots for others 
really sad 
My contact details are on my page... And that remembers to me that i need to pay the hosting 
Tysm i will answer during launch (1 hour from my local time)
Yup
I will answer to you later, now I can't
Lmao that's the first time i've seen someone want to talk in email here
hamster
Blvck will
If you pay him
no
I will be playing games
@slate swan what happened?
Do u need help with something?
What type of bot do you need help with?
Well, it's easy. U can make one yourself too
And that's bad practice. We can help you learn the discord.py library and help u code the bot, if u r willing
@warns.command()
async def enable(self, ctx):
db = sqlite3.connect('warns.db')
cursor = db.cursor()
cursor.execute(f"SELECT guild_id FROM warn WHERE guild_id = {ctx.guild.id}")
result = cursor.fetchone()
if result is None:
cursor.execute(f"INSERT INTO warn(guild_id) VALUES(?)", ctx.guild.id)
await ctx.send(f"Enabled Warns for {ctx.guild}")
db.commit()
cursor.close()
db.close()```
Command raised an exception: ValueError: parameters are of unsupported type
why?
@commands.hybrid_command(name="hyb")
async def ping_command(self, ctx: commands.Context) -> None:
await ctx.send("Hello!")
do i need to add guild id in this command ?
Well, your wish
If u want the commands to appear immediately then yes
I got a ping?
Well, I can help u to some extent, rn
Sure
@commands.hybrid_command(name="hyb")
@app_commands.guilds(discord.Object(id=guild id here)
async def hyb_command(self, ctx: commands.Context) -> None:
await ctx.send("Hello!")
so its like this ?
and what do u want to do with that =.=
dont tell me its ur bot's password
even the hacker will give up after looking at the list
!resources
The Resources page on our website contains a list of hand-selected learning resources that we regularly recommend to both beginners and experts.
raise errors.ExtensionFailed(key, e) from e
discord.ext.commands.errors.ExtensionFailed: Extension 'cogs.slash_cmnd' raised an error: AttributeError: 'ellipsis' object has no attribute 'id'
@app_commands.command(name="test", description="Testing")
@app_commands.guilds(discord.Object(id=845317571301081158),...)
async def testreason_slash(self, interaction: Interaction, reason: str="Unspecified"):
await interaction.response.send_message(reason, ephemeral=True)
Python tutorial - Python full course for beginners - Go from Zero to Hero with Python (includes machine learning & web development projects).
🔥 Want to master Python? Get my Python mastery course: http://bit.ly/35BLHHP
👍 Subscribe for more Python tutorials like this: https://goo.gl/6PYaGF
👉 Watch the new edition: https://youtu.be/kqtD5dpn9C8
📕...
why do u have ellipsis there???
🤣
maybe im mosh who knows
Nah, he is a popular youtuber
lol
the first video i watched from him is about html
for roles in roles_list:
role = discord.utils.get(member.guild.roles, name=roles)``` Is this how to give out autorole to members?
alright
if u add in in a on_member_join event
!d discord.on_member_join
discord.on_member_join(member)``````py
discord.on_member_remove(member)```
Called when a [`Member`](https://discordpy.readthedocs.io/en/master/api.html#discord.Member "discord.Member") join or leaves a [`Guild`](https://discordpy.readthedocs.io/en/master/api.html#discord.Guild "discord.Guild").
This requires [`Intents.members`](https://discordpy.readthedocs.io/en/master/api.html#discord.Intents.members "discord.Intents.members") to be enabled.
good news there is russian subtitle
learn python first 🤦 one step at a time
dont be me
i did that and suffer a lot
dont follow me
@commands.Cog.listener()
async def on_member_join(self, member, ctx):
print(member)
await member.send("hello")
guild = self.client.get_guild(730651046459998218)
channel = discord.utils.get(member.guild.channels, id=885464532959526913)
if guild:
print("guild ok")
else:
print("guild not found")
if channel is not None:
Myembed = discord.Embed(title= f"Welcome",
description=(f"Welcome {member.mention}, You are member {guild.member_count}. \n Please enjoy your stay here and dont forget to read the await #rules"))
Myembed.add_field(name="Account Created at:", value=f"<t:{int(member.created_at.timestamp())}:R>" , inline=True)
await ctx.send(embed=Myembed)
else:
print("id channel wrong")```
um
discord.on_member_join(member)``````py
discord.on_member_remove(member)```
Called when a [`Member`](https://discordpy.readthedocs.io/en/master/api.html#discord.Member "discord.Member") join or leaves a [`Guild`](https://discordpy.readthedocs.io/en/master/api.html#discord.Guild "discord.Guild").
This requires [`Intents.members`](https://discordpy.readthedocs.io/en/master/api.html#discord.Intents.members "discord.Intents.members") to be enabled.
for sending the embed to the channel
?
no thats not for you
thats the code he asks for help to fix
thats for me
but he doesnt understand english
he legit google translate every sentence we are sending to understand them
u dont need to know english for using github tbh
but how is he suppose to understand those codes
if he learns python
dude r u saying that i am dumb
not u
he can use it
ohh ok
LOL
that germany guy*
oh well i mean he is from germany rarely german ppl dont realy understand english
in my opinion
I totally didn't make an AI Bot when I didn't even know what are classes 👀
LOL
idk oop properly
Same
tbh i still dont understand classes 100%
im too lazy to learn
Same
but i use classes to add buttons
me who is lazy at literally anything u can think of ||including lazy being lazy||
I totally dk u can define a class with the class keyword and u can subclass by the syntax class A(B) and u need the self as the first arg everywhere except in static method
lol
LOL
i totally knows everything (according to your logix)
i still dont understand this
i learnt python using yt first
everyone did that
I have been coding in Python since almost 2 years now but still learning new things
Meh, YT sucks for Python
I went for the trial and error way
then i repeated what i knew
basic stuff like for loops and stuff
and decided not to learn more
and start making bots
cool
gg
I wanna try combining a bot with selenium now
isnt selenium for like self botting on websites or something?
huh
sorta
well, ye
what will u do with that?
im still wondering why autocode exist
is it for people that thinks they are programmer
Great question make a bot and extract info on some websites ig
Still deciding
the code from autocode is working but its legit trash ||dont ask how i know||
something like this?
ye
english ;-;
Just scrape discord.com
Django and flask are good too
lol
gets termed
--a--
what is boring
~~Hi~~
a
someone can help?
With what
cursor.execute(f"SELECT reason FROM warn WHERE member = {member.id}")
mss = cursor.fetchall()
cursor.execute(f"SELECT by FROM warn WHERE member = {member.id}")
by = cursor.fetchall()
await ctx.send(f"{member} was Warned for {mss} by {by} {len(mss)} times")```
What's the problem
Godlike#4631 was Warned for [('s',), ('s',), ('wtf',), ('s',), ('s',), ('s',)] by [(951819397973041213,), (951819397973041213,), (951819397973041213,), (951819397973041213,), (951819397973041213,), (951819397973041213,)] 6 times
what on earth is this
i want them in list
sql
I have a high suspicion that this is a database problem
with new line
its a database
its inside a class method
looks like a biggggggg loop in a loop in a loop
its a list already i think
this is expected output or real output
without [( and with new line
real
just do
for ms in mss?
i use it like iterable?
lemmie try
👍
is it working?
no i think i am unable to do it
I mean, a list's work is to be an iterable
can you give iterable for it
LOL
huh
?
wdym give iterable
if its iterable then its iterable
u cant give it =.=
i was talking about query
how do you print/see all the guilds you bot is part of?
!d discord.Client.guilds
property guilds```
The guilds that the connected client is a member of.
@granite parcel can you show your select statement that selects the warn reason and the person who warned them
s
this is it
If you want them in tandem like matched with each other
You should be selecting both rows together in the same statement
SELECT reason, by FROM warn WHERE member = ?
how to show them differently
This will return a list of tuples with each reason corresponding with each by
? Wdym
i want that it should show the user warned for this.. by ...
Yeah you can do that with what I just said. You just gotta do some magic.
For example
[f"for {r} by {b}" for r, b in listhing]
And just join that new list into a string
Godlike#4631 was Warned for [('s', 951819397973041213), ('s', 951819397973041213), ('wtf', 951819397973041213), ('s', 951819397973041213), ('s', 951819397973041213), ('s', 951819397973041213)] | 6 times
i am getting this now
r b?
they are just stand ins
you dont have to define them
i see you are very new to python
yeah
sounds like a pro saying
no
damn i forgot the name of this
but even i know what it is
if i could remember the name
does anybody know how to create voice channel using discord.py
list comprehension
ayo thats it
!d create_voice_channel
No documentation found for the requested symbol.
!d discord.Guild.create_voice_channel
await create_voice_channel(name, *, reason=None, category=None, position=..., bitrate=..., user_limit=..., rtc_region=..., video_quality_mode=..., overwrites=...)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
This is similar to [`create_text_channel()`](https://discordpy.readthedocs.io/en/master/api.html#discord.Guild.create_text_channel "discord.Guild.create_text_channel") except makes a [`VoiceChannel`](https://discordpy.readthedocs.io/en/master/api.html#discord.VoiceChannel "discord.VoiceChannel") instead.
Changed in version 2.0: This function will now raise [`TypeError`](https://docs.python.org/3/library/exceptions.html#TypeError "(in Python v3.10)") instead of
`InvalidArgument`.
idk probably in the docs somewhere
oh'
You just missed a couple words
Hi okimii
you missed the package name and the class name
It’s called list comprehension
tyler slow
hiii
I had to go for a bit.
i responded first
im just joking around hahha
Same thing with me sometimes
im new here so idk how exactly the docs command works
🏂
Twitter has me fucked up
in nextcord's bot it would have come
Hi sarth
ello
Didn't think you're awake
im online for 21 hrs these days.
Why do i have a suspicion that's a couple avatar
I’m surprised people are actually still using forks.
Especially dead weight libraries like nextcord and pycord
only fork i would use is nextcord when v3 comes out which it wouldnt be a fork either way but epic still doesnt work on it😔
nextcord wont be a fork soon, they are rewriting it from the base
Literally seeing all of the people confused with discord.py 2.0 here made me stick to disnake
ot, and yeah they mostly are
U got English exam tomorrow study
hunter worrying about sarthak such a lovely friendship
I hate english
yeah, that being the reason.
Mostly because they ask me how i feel
says it in english
The english class
Most of the questions are about how i feel about a story or poem
And then make me write about a new poem or story
Which makes me pull words out of my ass
And hope for the best
I did better in math than in english
!ot
Off-topic channel: #ot2-never-nester’s-nightmare
Please read our off-topic etiquette before participating in conversations.

It’s not even confusing. It doesn’t take half a brain to understand the breaking changes Danny is making
I like disnake
Everyone does
dead weight how?
not andy
I knew he’d show up.
vco always shows up when nextcord is said😭
Hi vcoltfre
Well since it seems like you're unwilling to actually justify your point I guess it holds no weight lol
I always struggle for 2 seconds with typing your name

PoV: He has a self bot which calls him whenever someone say smth about nextcord 🕴️
I can't because epic never pushes their code 
push epic
I'll find a cliff

good
@vocal plover am I right?
no lol
It's just that I have literally 2 non-vc-text channels unmuted here and it's very easy to lurk both 
!pypi brain
pls check whether my abt me is like this
Hm well
I mean in reality all of them are dead or had their purpose erased with the revival of dpy. Seeing how most if not all forks just made to continue what Danny started. And now that he’s back to finish I find that there is no point anymore. Just an opinion. Don’t get too hung up on it.
async def nickname(ctx, member: discord.Member, nickname):
await member.edit(nick=nickname)
await ctx.send(f'Nickname for {member.mention} was changed to {nickname}')```
my bot isn't outputting anything when I run ?nickname in my server... it doesn't even give an error or anythng
u have an error handler?
I'd disagree, we have different thoughts on how the library and parts of it should be structured, and maintained. I respect that it's that way for you of course, but having a bunch of different ways of doing it mean that people can choose the one that works well for them
yeah
Additionally, Danny has already quit once, why should we trust he won't again?
add this to it:
else:
raise error
or if you have an on_message event without process_commands, change it to a listener
That too
Hi exe
Nah they are different
Hello
For example just compare implementation of slash commands in disnake and in dpy
disnakes and nexcords implementation are the best imo
Traceback (most recent call last):
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 85, in wrapped
ret = await coro(*args, **kwargs)
File "main.py", line 51, in nickname
await member.edit(nick=nickname)
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/member.py", line 681, in edit
await http.edit_member(guild_id, self.id, reason=reason, **payload)
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/http.py", line 248, in request
raise Forbidden(r, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50013): Missing Permissions
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/client.py", line 343, in _run_event
await coro(*args, **kwargs)
File "main.py", line 95, in on_command_error
raise error
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/ext/commands/bot.py", line 939, in invoke
await ctx.command.invoke(ctx)
File "/home/runner/Rolands-Final-Project/venv/lib/python3.8/site-packages/discord/ext/commands/core.py", line 863, in invoke
await injected(*ctx.args, **ctx.kwargs)```
This is the error message I got
if it comes to complexity
making app commands with forks is easier than discord.py
I've migrated to disnake when the dpy was discontinued and now I have no will to come back to dpy although I have tried it several times
your bot does not have permission to change that member's nickname
dpy kinda overcomplicated
Read right above "The above exception was the direct cause..."
Yeah
that doesn't make sense though
!d discord.on_member_remove
discord.on_member_join(member)``````py
discord.on_member_remove(member)```
Called when a [`Member`](https://discordpy.readthedocs.io/en/master/api.html#discord.Member "discord.Member") join or leaves a [`Guild`](https://discordpy.readthedocs.io/en/master/api.html#discord.Guild "discord.Guild").
This requires [`Intents.members`](https://discordpy.readthedocs.io/en/master/api.html#discord.Intents.members "discord.Intents.members") to be enabled.
It totally does
gave it every permission and it's still giving that error
"Missing Permissions" accurately describes the issue
Make sure your bot's role is above
👀
wait, since I'm the server owner can it not edit my nickname?
Lmao no ofc
In reality that’s not the reason for the mass migration to forks. Do you think the average user would care about how the library is structured on the inside. Very unlikely, they just care about usability. I will admit, some forks might have better implementations than dpy in some areas such as slash commands. However, the likely reason for migration is rather, less complex. It’s because of the fact the library was known as dead and people wanted to switch to something that would continue to keep up with discords changes to the api. I suspect that is also the reason why people took up the task of creating forks.
In all, I won’t lie. It’s all about opinions and what works better for you.
Yeah totally
fyi I didn't mean the internals I meant the user-facing API of the lib
I misunderstood then, I took up that because you said "should be structured and maintained"
Yep that was bad phrasing on my part sorry
hello
helo