#discord-bots
1 messages · Page 618 of 1
file content is string but get_user accepts int thats it
the user is not in bot's cache
oh yea , you need to convert the id in int form as myxi said
It's there
.read() returns str type only iirc
if i make the bot send a message, how can i make it react to it?
wait do you mean:
message=await message.channel.send('<@'+i+'>')?
yeah, you assigned the instance of discord.Message to the variable message because channel.send returns it
thank you
Hi myxi
hello
@slate swan tell. the problem
Looking for one more Python Bot Developer to be a part of our team that is working on a public discord multipurpose bot!
I believe you aren't allowed to advertise your development team...
Yeah so it didnt work
i turned every variable into a attribute and used self.variable but it doesnt work
can i define a client event inside a client event?
waits for an event
Does it have a client alternative?
bot is a subclass of client
the docs of it are very well explained you can check them if you get stuck
!d discord.Client.wait_for
wait_for(event, *, check=None, timeout=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Waits for a WebSocket event to be dispatched.
This could be used to wait for a user to reply to a message, or to react to a message, or to edit a message in a self-contained way.
The `timeout` parameter is passed onto [`asyncio.wait_for()`](https://docs.python.org/3/library/asyncio-task.html#asyncio.wait_for "(in Python v3.9)"). By default, it does not timeout. Note that this does propagate the [`asyncio.TimeoutError`](https://docs.python.org/3/library/asyncio-exceptions.html#asyncio.TimeoutError "(in Python v3.9)") for you in case of timeout and is provided for ease of use.
In case the event returns multiple arguments, a [`tuple`](https://docs.python.org/3/library/stdtypes.html#tuple "(in Python v3.9)") containing those arguments is returned instead. Please check the [documentation](https://discordpy.readthedocs.io/en/master/api.html#discord-api-events) for a list of events and their parameters.
This function returns the **first event that meets the requirements**...
how to get roles of my discord bot ?
bot.user.roles not working
should i fetch the user?
!invite
property me: discord.member.Member```
Similar to [`Client.user`](https://discordpy.readthedocs.io/en/master/api.html#discord.Client.user "discord.Client.user") except an instance of [`Member`](https://discordpy.readthedocs.io/en/master/api.html#discord.Member "discord.Member"). This is essentially used to get the member version of yourself.
you can do guild.me.roles
did u define user = discord.Member
i did bot.user.roles
cuz i want to check roles of my bot
i thought that will work
it is giving exception
client user don't have attribute roles
ohk
did it work?
trying
ok
it is showing bot object has no attribute roles
i think i should fetch the bot
mrinalsparks , did you try what i told you just a minute ago?
it is showing problem in guild.me
you need to define guild
go to oauth
it is showing underline on it
like ctx.guild or message.guild
ctx.guild ?
ye
ohk
see i need to see the code
um?
that's just my strange idea
just sending 50 msgs so that i can unmtue in vc
you can chat normally in #python-discussion or anywhere you want to
dude
pls dont spam here
ok listen wha is the line you wrote after all the imports
why do you think role would have a split function?
dude it looks like you wrote Role not roles
i knew it
xd
i should do it to role.name.split
no , its discord.Role object which .roles returned
yes if you want to split the role's name
oh i didnt new that
yes
my idea is strange i just want to save the money for database
my bot have so many minigames
so you're trying to break a role's name ?
like if you have a role named 'Buggy BOt' , you want to split it into a list of strings?
and users complain that do u have any command to disallow members from playing games in some channels
cant find invite url
yes like role name is 'channels general commands' so i want to split into - ['channels','general','commands']
my plan successful xD
ty
so much
make a command prefix(disallow 'member')
then give him role disallow using give.roles ig
then use check roles and if function like if roles disallow
ctx.send("you arent allowed to play")
else:(the game code)
i am disallowing channels
here
Here
means you want it to only be used in specific channel
like bot have a role 'play minigames games' so bot will only allow to play in channel with name minigames and games
https://stackoverflow.com/questions/49351509/discord-py-how-to-make-a-role-specific-command @twilit dragon
Commands.has_role()
@snow kiln the voice verification barrier is there for a reason. we will pardon your infraction but we expect you to stop spamming and send constructive messages
!uvban 755669942224814140
I don’t think python has it tho
:ok_hand: pardoned infraction voice ban for @snow kiln.
I mean the bot
But it is in the discord py docs
!d discord.ext.commands.has_role
@discord.ext.commands.has_role(item)```
A [`check()`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.check "discord.ext.commands.check") that is added that checks if the member invoking the command has the role specified via the name or ID specified.
If a string is specified, you must give the exact name of the role, including caps and spelling.
If an integer is specified, you must give the exact snowflake ID of the role.
If the message is invoked in a private message context then the check will return `False`.
This check raises one of two special exceptions, [`MissingRole`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.MissingRole "discord.ext.commands.MissingRole") if the user is missing a role, or [`NoPrivateMessage`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.NoPrivateMessage "discord.ext.commands.NoPrivateMessage") if it is used in a private message. Both inherit from [`CheckFailure`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.CheckFailure "discord.ext.commands.CheckFailure").
Changed in version 1.1: Raise [`MissingRole`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.MissingRole "discord.ext.commands.MissingRole") or [`NoPrivateMessage`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.NoPrivateMessage "discord.ext.commands.NoPrivateMessage") instead of generic [`CheckFailure`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.CheckFailure "discord.ext.commands.CheckFailure")
Thank you myxi
dude i think its hard to do it its not impossible you need to get client roles and if client has role you want then check guilds if guild = minigames then start its too complicated
are you using replit
@twilit dragon
Here’s your answer
Oh wait
I don’t think you’re asking
Nvm
ik i am telling to @steep estuary
My bad 😞
its ok
bro i did that
why not store the information in your database?
that is done
i use heroku
and heroku provide free db with less rows
also data is not safe
i loss data in heroku every month
Is there a way I can detect the channel permissions for everyone who are added there specifically? Not by the role. Just like Devo in the picture
I want to check if there are any and if yes, delete them all. Or edit their perms
Yea
Please elaborate I don’t quite understand
So it's a Ticketsystem. And for ppl to get support they create a channel and they get added like this to the channel perms section to get some help from staff.
When the ticket gets closed I want to remove him from there. So that only staff can see that channel and not the person that created the ticket
!d discord.TextChannel.set_permissions
await set_permissions(target, *, overwrite=see - below, reason=None, **permissions)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Sets the channel specific permission overwrites for a target in the channel.
The `target` parameter should either be a [`Member`](https://discordpy.readthedocs.io/en/master/api.html#discord.Member "discord.Member") or a [`Role`](https://discordpy.readthedocs.io/en/master/api.html#discord.Role "discord.Role") that belongs to guild.
The `overwrite` parameter, if given, must either be `None` or [`PermissionOverwrite`](https://discordpy.readthedocs.io/en/master/api.html#discord.PermissionOverwrite "discord.PermissionOverwrite"). For convenience, you can pass in keyword arguments denoting [`Permissions`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions "discord.Permissions") attributes. If this is done, then you cannot mix the keyword arguments with the `overwrite` parameter.
If the `overwrite` parameter is `None`, then the permission overwrites are deleted.
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...
Damn
Can I remove all members that were added? Instead of only one?
would've added a role to them at that point but you can literate over the stored list of members you added
I don't want to use roles here tbh
then go with the poor method
never saw a ticket system with multiple user allocation idk how your system works
Well there's a command to add other ppl in case of discussions. It just adds the user by using the command &add @User
And there can be multiple users in the channel permissions. That's why I want to delete them all when the ticket is closed
the thing is, the system you want (setting channel perm for every user) will take more api calls than using roles, like you added them but when removing them, you just gotta remove the role but with your system, you have to send multiple api calls to remove all the set perms of users
then go with the poor method
And for other ticket system bots it works good.
when they do add user, set the perm for them in the channel, and remove them when needed
the docs of that method are well made click the blue title
so i have a poll command, that looks like this whenever someone makes a poll (this is just my example of it). But the problem is, it’s not sending this message The results are in and option {most_voted.emoji} was the the most popular with {most_voted.count-1:,} votes! when the specified time is up when it’s supposed to and idk what to do, can someone help? https://mystb.in/TiesMadagascarMaximum.python
Yes I did thank you
is this where you ask for help ?
this code
@commands.has_any_role(864458060911083562, 864808826171949066,
899271391872966656, 898544682978656310,)
async def mute(ctx, member: discord.Member, time: int, zeit, *, reason=None):
author = ctx.message.author
role = discord.utils.get(ctx.guild.roles, name="Muted")
channel = client.get_channel(898544683406491701)
embed = discord.Embed(title="mute:", color=0xf40000)
if role in ctx.guild.roles:
if 'm' or 'minutes' or 'minute' in ctx.message.content:
await member.add_roles(role)
await ctx.message.delete()
embed2.add_field(name="Mute", value=f"admin has muted {member.mention} for {time} {zeit}\n**Reason**: {reason}", inline=False)
await asyncio.sleep(time * 60)
await member.remove_roles(role)
elif 'h' or 'hours' or 'hour' in ctx.message.content:
await member.add_roles(role)
embed.add_field(name="Mute", value=f"{author} muted {member.mention} for {time} {zeit}\n**Reason**: {reason}", inline=False)
await asyncio.sleep(time * 3600)
await member.remove_roles(role)
else:
embed = discord.Embed(
title='Dude',
description=
"Are you mentally challenged or why haven't you created a Muted role?",
color=0xfffffd)
await ctx.send(embed=embed)
await channel.send(embed=embed2)``` i got this mute that i tried to embed but it seems to not be working idk how to fix it any help ?
looks like the main problem is with the or statement
what do you mean ?
i get this error embed = discord.Embed(title="mute:", color=0xf40000)
^
IndentationError: unindent does not match any outer indentation level
or checks if the first object is truthy or not if not, it will set the second object as the value of the expression
if 'm' or 'minutes' or 'minute' in ctx.message.content:
if 'm' in ctx.message.content or 'minute' in ctx.message.content:
!e
print(None or "hello")```
@sullen shoal :white_check_mark: Your eval job has completed with return code 0.
hello
Can I store all the members in 1 global variable and then delete the perms all by using the global variable?
!e
print("hello" or "world")```
@sullen shoal :white_check_mark: Your eval job has completed with return code 0.
hello
and I find this system dumb
!e
print(("e", "h", "l") in "hello"))```
if m is in the message, that statement will trigger
@sullen shoal :x: Your eval job has completed with return code 1.
001 | File "<string>", line 1
002 | print(("e", "h", "l") in "hello"))
003 | ^
004 | SyntaxError: unmatched ')'
the command's name is mute
huh
imagine m not being in mute
yes i need a embed mute command too , can anyone fix it
i gotta go afk for now
@client.command()
async def mute(ctx):
if 'm' in ctx.message.content:
await ctx.send("Hi")
do you think it will send hi or not

i would say no , tbh im kind of new to python so i barely know what i am doing
bruh
discord.py is really not a beginner library
so let's say the message you sent is !mute
yuh
since the m is in mute, the if statement will always be true
so what's the point of the statement
and there's no point of checking if minute is in the string
so what do i do with the m ?
if minute is in the string, m's gonna be in it too
you could remove it and it would make much more sense
but this would need higher handling on a higher level
!resources I recommend these at first
The Resources page on our website contains a list of hand-selected learning resources that we regularly recommend to both beginners and experts.
whenever i load a cog and run a command which only exists in a cog (and not the main file itself), and if a false error of the command not existing even though it did the command is there, how do i get rid of it:
i mean this discord.ext.commands: bro that command doesnt exist because im running an exclusive command in a cog
basically im gonna sum this up:
fix the discord.ext.commands: command not found issue appearing in the terminal even tho the command works 💀
the command is in a cog.
ye the command is in a cog.
so it confuses the main file and says the command doesn't exist
main file = main bot.py file (not the cog)
don't you have two instances of the main file running?
..
the only thing I can think of
...?
wha...
how did you write that cog
and yes, but no i have the cog running and the main bot.py itself
💀
we yes no
it's the yes but no
I kinda wanna see what you did there
no so basically
no yes
i have this def setup(): function which set ups the bot
I can't help you without it
and this class Spanish which literally holds all the commands
What is the best way to store references messages in the database? (MongoDB) I need to simply fetch messages
the only thing you're gonna run is the main file
then load the cog
yes, the main file loads the cog
wait no im stupid asf
hm
if used os module to make the bot start the cog first
then how tf do i unload the cog
you do not use os for it
close the bot
then what do you use?
extension
!d discord.ext.commands.Bot.load_extension
load_extension(name, *, package=None)```
Loads an extension.
An extension is a python module that contains commands, cogs, or listeners.
An extension must have a global function, `setup` defined as the entry point on what to do when the extension is loaded. This entry point must have a single argument, the `bot`.
no
no
this is in the main file
add that in your main file, and load the cog
I recommend reading some docs to understand cogs
see i have a load command which loads the command,
and an unload command
unload is like
shoot.
!d discord.ext.commands.Bot.unload_extension
unload_extension(name, *, package=None)```
Unloads an extension.
When the extension is unloaded, all commands, listeners, and cogs are removed from the bot and the module is un-imported.
The extension can provide an optional global function, `teardown`, to do miscellaneous clean-up if necessary. This function takes a single parameter, the `bot`, similar to `setup` from [`load_extension()`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.Bot.load_extension "discord.ext.commands.Bot.load_extension").
do you even load the cogs when the bot connects?
no
looks like with a command
when the bot is started, it doesn't load the cog instantly
so you manually load the cogs
yes.
ok...
only do that because im confused how tf do you unload the cog then
@shadow wraith
!d discord.Client.unload_extension
No documentation found for the requested symbol.
it doesnt give any errors or anything
Read this @shadow wraith
client user
mb
it just doesnt print out the board when the player marks it
client's bad
ik
the cogs don't load instantly
i just tried to get a quick shortcut to it so i don't have to type all of that
still dunno how to make it do that
Hello everyone. I am a beginner, so please dont blame me 🙂 I want to code a "lastsales" command. My problem is, when i do (ctx,a:str, b:str, c:str): like below, the user has to input 3 arguments but they should also input only 1 or how many they want. How can i solve my problem?
@client.command()
async def lastsales(ctx,a:str, b:str, c:str):
embed_lastsales = discord.Embed(title="Last sales on ebay.de", color=color, description='['f"Click here too see last sales of {a} {b} {c}]("f"https://www.ebay.de/sch/i.html?_from=R40&_nkw={a}+{b}+{c}&_sacat=0&LH_Sold=1&LH_Complete=1&rt=nc&_fsrp=1)")
embed_lastsales.set_footer(text=footer, icon_url=footer_url)
embed_lastsales.set_thumbnail(url="https://ir.ebaystatic.com/cr/v/c1/ebay-logo-1-1200x630-margin.png")
await ctx.send(embed=embed_lastsales)
@sullen shoal
you just have to loop over your cogs folder and load them
new into coding
using .replace() im replacing multiple objects that are outputs from a list of outputs, such as print("1 2").replace("1", "a").replace("2", "b"), is there any way where i can replace 2 things in 1 argument? something like .replace(["ActivityType.custom", "", ":rich_presence:", ""])
log the values of attributes and check them
how tf do i loop a cog
using os.listdir
loop over the cog's folder
!d os.listdir
os.listdir(path='.')```
Return a list containing the names of the entries in the directory given by *path*. The list is in arbitrary order, and does not include the special entries `'.'` and `'..'` even if they are present in the directory. If a file is removed from or added to the directory during the call of this function, whether a name for that file be included is unspecified.
*path* may be a [path-like object](https://docs.python.org/3/glossary.html#term-path-like-object). If *path* is of type `bytes` (directly or indirectly through the [`PathLike`](https://docs.python.org/3/library/os.html#os.PathLike "os.PathLike") interface), the filenames returned will also be of type `bytes`; in all other circumstances, they will be of type `str`.
This function can also support [specifying a file descriptor](https://docs.python.org/3/library/os.html#path-fd); the file descriptor must refer to a directory.
Raises an [auditing event](https://docs.python.org/3/library/sys.html#auditing) `os.listdir` with argument `path`.
so you do have to use the os module to do stuff
no
or use pkgutils
not really, but it's easier if you use it instead
No documentation found for the requested symbol.
What does that mean?
im a stupid coder so i will
!d pkgutil.iter_modules
pkgutil.iter_modules(path=None, prefix='')```
Yields [`ModuleInfo`](https://docs.python.org/3/library/pkgutil.html#pkgutil.ModuleInfo "pkgutil.ModuleInfo") for all submodules on *path*, or, if *path* is `None`, all top-level modules on `sys.path`.
*path* should be either `None` or a list of paths to look for modules in.
*prefix* is a string to output on the front of every module name on output.
Note
Only works for a [finder](https://docs.python.org/3/glossary.html#term-finder) which defines an `iter_modules()` method. This interface is non-standard, so the module also provides implementations for [`importlib.machinery.FileFinder`](https://docs.python.org/3/library/importlib.html#importlib.machinery.FileFinder "importlib.machinery.FileFinder") and [`zipimport.zipimporter`](https://docs.python.org/3/library/zipimport.html#zipimport.zipimporter "zipimport.zipimporter").
Changed in version 3.3: Updated to be based directly on [`importlib`](https://docs.python.org/3/library/importlib.html#module-importlib "importlib: The implementation of the import machinery.") rather than relying on the package internal [**PEP 302**](https://www.python.org/dev/peps/pep-0302) import emulation.
some people like to make a list with the path to their cogs and loop over that and load them
print the attributes
drakeyea
tbh i would have subclassed Bot and changed the entire way cogs work and let it first check if the cog has an attribute called disabled and if its set to True, it wouldn't load it
I just check if a file in my cogs folder ends with .py, if it does then I load the said extensions
that's what it does but in 2 lines and looks clean
not bad
bot.py lines 26 to 28
for cog in pkgutil.iter_modules(["cogs"]):
bot.load_extension(f"cogs.{cog.name}")
print("Loaded cog: {}".format(cog.name.title()))```
yeah I saw your repo, you were using that
i load mine like this, i like it more personally
i got the issue fixed
:/
i also did the same too, you watched that cool tutorial?
UH
that's how i've loaded my cogs since last year when i was "new" to python but yeah 😂 😂
so all the cool kiddos started with dpy
id look cringe if i said the name lmfao
lucas
true
😎
freecodecamp
YES
we all watched him at some point 😔
n o
no
I did
good thing i didn't
my friend told me he coded his bot in python and i am experiecned with python so i asked wtf bro send a damn tutorial then he sent lucas
he was a virtual but great temporary frien.d
kekw
he knew
he just knew
i never format my code
i like to think that most of my bot's code is good from both parts
and that is a very not-temporary fact
i like to think that my bot's code is good from the outside
😂
the inside is literally just 462 lines of code
not happy with the way you load cogs tho
mine has almost 18k
not formatted, no checks
i don't see the problem with it
Can I overwrite all the permissions in one channel?
Example:
- Role "Moderator" has access to the channel
- Role "Everyone" has NO access to the channel
- Member "xyz" has access to the channel
Overwrite = overwrite everything so that only Role "Moderator" has access to the channel
bro one of a company's bills was sorted into a file and was like 5k lines long but wtf you literally just did i higher
wait how do you change perms in the bot
that's kinda interesting
!d discord.TextChannel.edit
await edit(*, reason=None, **options)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Edits the channel.
You must have the [`manage_channels`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.manage_channels "discord.Permissions.manage_channels") permission to use this.
Changed in version 1.3: The `overwrites` keyword-only parameter was added.
Changed in version 1.4: The `type` keyword-only parameter was added.
Changed in version 2.0: Edits are no longer in-place, the newly edited channel is returned instead.
ty
listdir gives you list iirc, pkgutil will iterate through the dir, giving some bit of more ram
bro what was that called
!d discord.Member.add_roles
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.
it's still fine ¯_(ツ)_/¯
you need a Role object
that's already in the param's tho
Doesn't matter as it requires a role object
¯\_(ツ)_/¯
bruh
h'
It converts what you give when executing the command, pretty sure it also converts role names with spaces
Just need to add the *
i think last time i added the * it confused the bot
i dont remember now
oh wait i remember now
there was a member: discord.Member which confused the bot
Show the code?
I have a discord.py bot and I realized it has a custom help command which isn't that good so I want to change it
client.remove_command("help")
It removes the help command
then can I ad my own?
and you can create ur own help command
Ye
thx
Yw
I have a discord.py bot and all of the code is in one file so can I put them into other files and it'd run the same?
cogs
Yes, you can check out how to make cogs and spread them over multiple files
Cogs are a very important part of discord.py which allow you to organise your commands into groups - not to be confused with actual command groups, which will be explained later in the tutorial.
i have no clue how to find the documentation
how do i make a listener outside of cogs
ok thx
I want my bot to DM someone with some text when they use a command
how do I do it
Hey! is it posible to make the bot say in what position the channel in wich the user typed is witha number?
!d discord.Member.send
await send(content=None, *, tts=None, embed=None, embeds=None, file=None, files=None, stickers=None, delete_after=None, nonce=None, allowed_mentions=None, reference=None, mention_author=None, view=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Sends a message to the destination with the content given.
The content must be a type that can convert to a string through `str(content)`. If the content is set to `None` (the default), then the `embed` parameter must be provided.
To upload a single file, the `file` parameter should be used with a single [`File`](https://discordpy.readthedocs.io/en/master/api.html#discord.File "discord.File") object. To upload multiple files, the `files` parameter should be used with a [`list`](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.9)") of [`File`](https://discordpy.readthedocs.io/en/master/api.html#discord.File "discord.File") objects. **Specifying both parameters will lead to an exception**.
To upload a single embed, the `embed` parameter should be used with a single [`Embed`](https://discordpy.readthedocs.io/en/master/api.html#discord.Embed "discord.Embed") object. To upload multiple embeds, the `embeds` parameter should be used with a [`list`](https://docs.python.org/3/library/stdtypes.html#list "(in Python v3.9)") of [`Embed`](https://discordpy.readthedocs.io/en/master/api.html#discord.Embed "discord.Embed") objects. **Specifying both parameters will lead to an exception**.
messages are duplicated... What can I do about it?
Find the source of the issue and fix it
Do you have two bot instances running?
after I put this, it started to cause problems
with open('scam.txt', 'r') as f:
global scam
words = f.read()
scam = words.split()
@bot.event
async def on_message(message):
msg = message.content
for word in scam:
if word in msg:
await message.delete()
delete = await message.channel.send(f"**DIVULGAÇÃO** | Divulgação de gift's scam não está em nossa lista de `coisas-permitidas`, {message.author.mention}!")
await asyncio.sleep(20)
await delete.delete()
await bot.process_commands(message)
t put this "on_message" and two others to give an error when the user sends an invite, nitro scam and bad words
How come you're iterating through your scam.txt list
wouldn't it be easier to iterate through the person's message? That's bound to be shorter, no?
if any(word in scam for word in message):
on scam.txt just've ".gift dicorid disccrd discord"
but this is most short
div | div scams don't allowed on this server
that's what you typed or the bot?
Hey! is it posible to make the bot say in what position the channel in wich the user typed is witha number?
are there any known alternatives for bot.load_extension?
I can't seem to load my extensions for shit and it's really getting into my nerves
How have you tried?
the os method
for filename in os.listdir()...
I'm honestly done with it and I just want a viable alternative for it
@lofty mulchyou tried it like this?
Yeah, pretty much
look at this
Interesting
Is there any documentation about it?
That github link is where it comes from?
that's just an example of how Myxi uses it
I have a aiosqlite db that I want to create a table in a cog's init. Since it has to be done async, what's the proper way to call that coroutine inside the (sync) init?
what i typed but, i need help to solve the error that spam message two times
How can I check the Channel topic with an "if" statement?
Something like this:
if ctx.channel.topic("admin-only"):
ctx.send("This is an admin-only channel.")
else:
pass```
yes I know just wanted to demonstrate
i need help sorta
how can i make a ton of global error handlers for every error that i can possibly get? im tired of my screen getting clusterfucked with directory's being printed to module files ill never need to access, i just want the straight up error
im making a discord bot that if the users types in a secret message they get mod on my server i can do the rest of the code but it needs to send a verification code to the person who wrote the message
my issue is that idk how to get it to dm the person who wrote the message the code is bellow i do not know how to get the id of a user and use it so send a private dm to them with the verification code
im tired of my screen getting clusterfucked with directory's being printed to module files ill never need to access, i just want the straight up error
wdym
like, execution error or what
use jishaku i heard it has hidden errors
because you can either make the bot report the traceback or just ignore it
so instead of something like Ignoring exception in command ban: Traceback (most recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\bot.py", line 994, in invoke await ctx.command.invoke(ctx) File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 886, in invoke await self.prepare(ctx) File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 820, in prepare await self._parse_arguments(ctx) File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 735, in _parse_arguments kwargs[name] = await self.transform(ctx, param) File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\discord\ext\commands\core.py", line 560, in transform raise MissingRequiredArgument(param) discord.ext.commands.errors.MissingRequiredArgument: member is a required argument that is missing. i just want to get this Ignoring exception in command ban: Traceback (most recent call last): discord.ext.commands.errors.MissingRequiredArgument: member is a required argument that is missing.
secretmessage is not even an existing event
typehint user to either discord.User or discord.Member, might not work with User
{error}
and that aswell
just {error}?
in the error handler
i dont need to define it?
oh, in the handler
well how can i make a global handler for all errors 
just catch the last error 🤨
and that can work for every error for every command?
ty
either make a function in a Bot subclass, or create a listener for this event
scratch that, on_error doesn't get sent to listeners it would seem
are the "cogs" supposed to refer to the folder path?
Do you mean like this? If yes, this doesn't work. Error: TypeError: argument of type 'NoneType' is not iterable
topic = "admin-only"
if topic in ctx.channel.topic:
The channel’s topic. None if it doesn’t exist.
otherwise that should work
So it should go on with else, right?
elif ctx.channel.topic is None:
return
that should cancel if the topic is none
kk
idk if that's what you meant but
yes, each python package inside it should contain a setup function that accepts one parameter which would be the bot instance. you have to add the cog to the bot instance in the function
I was confused for a bit, since it didn't appear like a path
Like, it didn't start from the root folder
its relative path
i gotta sleep now
you may check my file structure and source code if you use the nicer way i suggested
thanks
I'll do
good, gn
Can bots add emojis to server?
!d discord.Guild.create_custom_emoji
await create_custom_emoji(*, name, image, roles=..., reason=None)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Creates a custom [`Emoji`](https://discordpy.readthedocs.io/en/master/api.html#discord.Emoji "discord.Emoji") for the guild.
There is currently a limit of 50 static and animated emojis respectively per guild, unless the guild has the `MORE_EMOJI` feature which extends the limit to 200.
You must have the [`manage_emojis`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.manage_emojis "discord.Permissions.manage_emojis") permission to do this.
So I can yeet the image from gallery?
?
how can i add role to some1?
!d discord.Member.add_roles
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.
what is this "atomic"?
read the docs and you'll understand
If the cache is still loading will it still add a role as its atomic?
Tbh
I don't have a clue 😂😂
I ain't that smart :kek:
It says no matter the state of the cache it will still do the action
Probably fetch the role or sum idk
😔 :kek:
The description of what "atomic" does is too high level for me :kek:
:kek: 😔
:kek:
Yoo whatsup bro
Great to see you
Hihi
How are you doing today
Good wbu
Glad to hear that, I'm doing awesome 
What do I do if it says invalid form body? It’s for a definition command I have https://mystb.in/CasioConsultEducation.python
synonyms is an empty string
How though?
void ghost ping i was incorrect
someone know why bot don't any reaction?
@client.event
async def on_message(message):
guild = client.get_guild(855101953024983061)
rola = message.guild.get_role(858383553090945074)
if message.channel.id == 858317811151405087:
if message.content == "Something":
if rola in message.author.roles:
await message.author.remove_roles(rola)
await message.channel.send(f"Pomyślnie usunięto role {rola} dla {message.author.mention}")
else:
await message.author.add_roles(rola)
await message.channel.send(f"Pomyślnie dodano role {rola}.")
await client.process_commands(message)
It is possible to do bio for discord bots?
Yes
The bot description in the developer portal will be shown as "About me"
Simply click on your bot in the developer portal and you will see the "Description" section
Which says
Your description will appear in the About Me section of your bot's profile.
Ah that's what he meant xD
Thanks.
Ignores the bot the on message or the commands?
how can I run a command and it fetches all active invites?
how do I manage the bot to send a message in every text channel?
When there is multiple people in the channel that I am moving them from, all of them get disconnected but 1. Does anyone have an idea as to why they are getting disconnected?
async def bringAll(ctx,channel1: discord.VoiceChannel):
channel = None
for k,v in vcMembers.items():
if ctx.message.author.id not in v:
pass
else:
if channel == None:
channel = k
break
for channels,members in vcMembers.items():
if channel != None:
if channels == channel1.id:
for users in vcMembers[channel1.id]:
user = ctx.message.guild.get_member(users)
channel = bot.get_channel(channel)
await user.move_to(channel)
Iirc
for channel in text_channels:
#do something
anyone know what i should do?
text_channels is not defined, and if I add ctx.guild.text_channels, neither. And I use await ctx.channel.send and its just spam the respective channel
its not from utils import mongo.py or something?
it's because your utils folder is also inside of a different folder.
incorrect.
ok, can help with that?
alright
!d discord.Guild.invites
await invites()```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Returns a list of all active instant invites from the guild.
You must have the [`manage_guild`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.manage_guild "discord.Permissions.manage_guild") permission to get this information.
Ooop wrong person
hm
Cc ^^
?
Meant to reply to your message not his. #discord-bots message
o ok
iterate through every text channel using a for loop
for channel in ctx.guild.text_channels:
await channel.send("Message")```
def read_json(filename):
cwd = get_path()
with open(cwd + "/data/" + filename + ".json", "r") as file:
data = json.load(file)
return data```
``` File "D:\acrella\bot.py", line 76, in <module>
secret_file = utilities.json_loader.read_json('secrets')
File "D:\acrella\utilities\json_loader.py", in read_json
data = json.load(file)```
¯_(ツ)_/¯
What's the error?
uh that is the error
right, found it
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Your JSON file is empty
You can't json.load an empty file
@hot cobalt is this right or
Well you'll need some form of JSON in there for it to load, so yes you'll need something like {} or [] in your file
I thank you sir!
I was using ctx..
good morning
{
stuff
}
yeah i noticed
its weird though
cuz the json file isnt empty
its my mongodb connection but its saying its invalid
Traceback (most recent call last):
File "D:\acrella\bot.py", line 76, in <module>
secret_file = utilities.json_loader.read_json('secrets')
File "D:\acrella\utilities\json_loader.py", line 27, in read_json
data = json.load(file)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)```
the json file im trying to load:
```json
{mongodb+srv://terror(private info)}```
You haven invalid json
Yeah that's not valid json
Are you trying to connect to a mongodb?
mongodb
secret_file = utilities.json_loader.read_json('secrets')
bot.connection_url = secret_file["mongo"]
bot.mongo = motor.motor_asyncio.AsyncIOMotorClient(str(bot.connection_url))
bot.db = bot.mongo["data"]
bot.config = Document(bot.db, "secrets")
print("Initialized Database\n-----")
for document in await bot.config.get_all():
print(document)```
Oh are you using the JSON for configuration?
Because you have to add the guild
Irrc its:
for guild in bot_guilds:
#do something
I've soled it, but thanks
Alr it was kinda obvious 
👍
mhm
bruh i putted my uri database link to .env
☹️
@client.command()
async def mute(ctx, member: discord.Member, time=None, *, reason=None):
format = datetime.now(tz=pytz.timezone('America/Tijuana'))
formatted = format.strftime("%I:%M %p")
b = DT.datetime.now().timestamp()
modlogs = client.get_channel(872909569196707870)
db = await aiosqlite.connect('database.db')
cursor = await db.execute('SELECT * FROM mutes')
rows = await cursor.fetchall()
muted = discord.utils.get(ctx.guild.roles, name="Muted")
farmer = discord.utils.get(ctx.guild.roles, name="Farmers")
apprentice = discord.utils.get(ctx.guild.roles, id=907127783849861120)
if ctx.message.author.guild_permissions.administrator:
if member is None:
e = await ctx.reply('You must mention someone to mute!')
await asyncio.sleep(5)
await e.delete()
await ctx.message.delete()
return
if time is None:
a = await ctx.reply('Please state a time for a timed mute or a reason for a permanent mute!')
await asyncio.sleep(5)
await a.delete()
await ctx.message.delete()
return
if reason is None:
if time[-1] in ['s', 'm', 'h', 'd']:``` This is quite messy, but is there a way that I can somehow determine if the `s`, `m`, `h`, and `d` are touching another letter, if so it does something?
```py
if time[-1] in ['s', 'm', 'h', 'd']:``` after this line of course.
bot.guilds *
Why can I use asyncio.sleep() without having to import asyncio on my cog?
Knew that looked weird
A period is used when adding a attr with a object and a unserscore is added when 2 attr are used in a method?
I have this close command code, and i wanna ask how can i add a time on it? like close 5m something like that and if time is not added it will close immediately
@bot.command()
async def close(ctx):
with open('data.json') as f:
data = json.load(f)
if ctx.channel.id in data["ticket-channel-ids"]:
channel_id = ctx.channel.id
channel_name = ctx.channel.name
def check(message):
return message.author == ctx.author and message.channel == ctx.channel and message.content.lower() == "close"
try:
em = discord.Embed(title=embedTitle,
description="Are you sure you want to close this ticket? Reply with `close` if you are sure.",
color=0x00a8ff)
await ctx.send(embed=em)
transcript = await chat_exporter.export(ctx.channel)
transcript_file = discord.File(io.BytesIO(transcript.encode()), filename=f"transcript-{ctx.channel.name}.html")
channel = ctx.guild.get_channel(858027059153600512)
await bot.wait_for('message', check=check, timeout=60)
await channel.send(file=transcript_file)
await ctx.channel.delete()
indexID = data["ticket-channel-ids"].index(channel_id)
del data["ticket-channel-ids"][indexID]
index = data["ticket-channel"].index(channel_name)
del data["ticket-channel"][index]
with open('data.json', 'w') as f:
json.dump(data, f)
except asyncio.TimeoutError:
em = discord.Embed(title=embedTitle,
description="You have run out of time to close this ticket. Please run the command "
"again.",
color=0x00a8ff)
await ctx.send(embed=em)
bot.get_guild. this is one attr, get_guild ,the underscore is used because, bot.getguild wouldnt look right. its not pythonic, does not use the pep8 convention.
the attribute in my example is get_guild which is one attr, getguild would still be one attr, the underscore is separation of words
this is called snake casing
a . is used to access methods and properties
aka, dot operator
@patent lark makes sense thanks🤔
PEP 8 is the official style guide for Python. It includes comprehensive guidelines for code formatting, variable naming, and making your code easy to read. Professional Python developers are usually required to follow the guidelines, and will often use code-linters like flake8 to verify that the code they're writing complies with the style guide.
More information:
• PEP 8 document
• Our PEP 8 song! :notes:
@patent lark sounds stupid but what are those stuff like pep8 and others syntax updates?
.
elaborate?
Like whats pep 8 and others exactly 
pep8 is a convention that basically is the way you should write python code, it shows the most pythonic way to write python.
from the doc:
PEP 8 is the official style guide for Python. It includes comprehensive guidelines for code formatting, variable naming, and making your code easy to read. Professional Python developers are usually required to follow the guidelines, and will often use code-linters like flake8 to verify that the code they're writing complies with the style guide.
oo ok
Or more depends
oof
Basically happens to avoid api abuse
So like a syntax guide?
mhm
Like a way you should write your code
correct
Never seen it
Replit being replit 🤦♂️
lol
Always tripping 🤷♂️
Is user a function/class or something
🤔
its trying to create an instance of a class called User if one doesnt exist for that user
writing code that doesnt follow the pep8 convention isnt necessarily super wrong or a huge mistake. but by following the pep8 convention, you will write cleaner code, more understandable and cleaner code. things such as, when your variable names should be lower or upper case, snake casing, pascal casing. how many new-lines should be in between your functions, when you should use double or single quotes. importing things only at the top, or where a triple quoted doc string should go
camel casing 😳
it keeps saying false no matter how many times it reads a message from me
What peps should i look into 🤔
And thats lowkey cool
Whats that

snake_case
Whats that
Look at the differences in how I wrote those.
self explanatory
Different naming conventions.
!pep8
PEP 8 is the official style guide for Python. It includes comprehensive guidelines for code formatting, variable naming, and making your code easy to read. Professional Python developers are usually required to follow the guidelines, and will often use code-linters like flake8 to verify that the code they're writing complies with the style guide.
More information:
• PEP 8 document
• Our PEP 8 song! :notes:
Makes sense
firstWordSecondWordThirdWord = camelCase
FirstWordSecondWordThirdWord = PascalCase
first_word_second_word_third_word = snake_case
^
Yeah i got it
Idk what lang uses pascal but I know python uses snake casing and javascript uses camel casing
Alr ill check it out🤔
Pascal maybe ?????
Y'all Kno how to take Instagram accounts
Ah. I have no idea what pascal is lmao.
Bro what?
A programming language
LMAO
not the topic for this channel, nor will helping you with that follow the server rules.
Ah ok
!rule 5
5. Do not provide or request help on projects that may break laws, breach terms of services, or are malicious or inappropriate.
Were not falling for "download my .exe"
I just got here
Doesnt the server state to read rules before you chat?
channel descriptions and server rules are there no matter how long you've been in a server.
an if condition?
how do i remove the [' and '] from the similar words? https://mystb.in/TakesRegClosest.python
You can use an if statement and only wait if the condition is True
and not wait otherwise
str.join
!e ```py
i = ['one', 'two', 'three', 'four']
print(i)
print(', '.join(i))
@lament mesa :white_check_mark: Your eval job has completed with return code 0.
001 | ['one', 'two', 'three', 'four']
002 | one, two, three, four
If you want to type a new line for each element you just do ("\n" .join(list))
^ @slate swan
Wym new line
I just wanna get rid of those brackets and quotations
consider view.stop()
!e
i = ['one', 'two', 'three', 'four']
print("\n".join(i))
Like the docs say. wait finishes for the view to finish or timeout.
@slate swan :white_check_mark: Your eval job has completed with return code 0.
001 | one
002 | two
003 | three
004 | four
class buttonstuff():
def stuff:
stuff
@discord.ui.button()
stuff
@discord.ui.button()
if counter == 10:
view.wait == stop it
for x in x:
if condition: # This will only wait if the condition is True
await view.wait()
``` this wont wait if the condition is `False`
@slate swan Basically for each element adds a new line or you can just add a character or whatever for each element in the list
Oh
Yeah
yo help me
Who?
Where would I put it though?
i see no error
help
Dont know much dbs but cool wallpaper
uwu tks
Extension 'cogs.General' raised an error: SyntaxError: invalid syntax (getcorona.py, line 22)
@commands.command(name = "hello", aliases= ["Hello", "hi", "Hewo uwu"])
async def hello_command(self, ctx):
msg = f"hello <@!{str(ctx.message.author.id)}>, Type `.help` to see more information"
await ctx.channel.send(msg)
for in in range ?
You have good eyes unlike me ngl
Replace the first in with an underscore
also you can just... combine that
Extension 'cogs.General' raised an error: NameError: name 'command' is not defined
define command then
you don't need to do await ctx.channel.send(msg), you can just do await ctx.send(f"hello <@!{str(ctx.message.author.id)}>, Type .help to see more information")
=.=
you probably made a typo or something
how ?
Probably meant commands
commands?
What line
it didnt show lines
C:\Users\Administrator\Desktop\bot>py main.py
registering cog: cogs.Card2
registering cog: cogs.Data
registering cog: cogs.Dev
registering cog: cogs.General
Extension 'cogs.General' raised an error: NameError: name 'command' is not defined
registering cog: cogs.Guild
registering cog: cogs.Shop
Gura Bot#0215 has logged in!
Print the full traceback
h o w?
Too mention the author i think you can just do {ctx.author.mention}
From what I can see I’m guessing you have a for loop in your main file that loads each cog in a try/except, can we see that code to tell you how to print the full traceback
full code?
Actually hold on.
main.py where you load the cogs
import discord
from discord.ext import commands, tasks
from dotenv import load_dotenv
import os
import logging
# from app import keep_alive
import asyncio
import random
from corona.getcorona import getcorona
from corona.embed import *
from classes.Bot import Bot
logging.basicConfig(
filename="logs.log",
filemode="a",
format="[%(asctime)s::%(name)s::%(module)s]:\n\t(args: %(args)s)\n%(levelname)s - %(message)s",
level="DEBUG"
)
load_dotenv()
# keep_alive(with_join=False)
token = os.getenv("TOKEN")
prefix = commands.when_mentioned_or(".")
bot = Bot(
command_prefix=".",
owner_ids={ 720991106048720916 }
)
@bot.event
async def on_ready():
print(f"{bot.user} has logged in!")
await bot.change_presence(activity = discord.Activity(type = discord.ActivityType.listening, name = ".help"))
def run():
cogs = [f"cogs.{filename[:-3]}" for filename in os.listdir("./cogs/") if filename.endswith(".py")]
for cog in cogs:
try:
print(f'registering cog: {cog}')
bot.load_extension(cog)
except Exception as err:
print(err)
bot.run(token)
if __name__ == "__main__":
run()
There’s two ways you can do this you can do this. Remove the try and except or use the traceback library.
how ;-;
remove the try and except
this?
import traceback
try:
bot.load_extension(…)
except Exception:
print(traceback.format_exc())
oh btw, i have an error about SELL COMMAND yesterday, i posted it here, and i and the others guys fall in the freacink story and no one help me :)
What are triple quotes for?
Looks like you meant to inherit from commands.Cog not command.Cog
What does it say?
you need to add bot.remove_command('help') at the top
@shy schooner vietnam?
what matters?
ong la nguoi viet nam a?
dont speak vietnamese here
ok
This or, When you create your bot, your bot = Bot(), include help_command=None
:))
i need to put the bot.remove_command('help') at the top of the file?
bot has to be defined first
and then remove_command()
😂
bruh
bruh
hello 🇻🇳
dude i dont understand too clearly in english

can we talk in vietnamese :))
ofc no
so now do either, ```py
bot = Bot(…, help_command = None)
#or
bot = Bot(…)
bot.remove_command('help')
:vv
them vao dau ._.
@unique raven bruh
🙂
he just gave the solution
hello everybody
ye
add the help_command arg into Bot()
done
à mà tôi còn lỗi ở sell command với sell button cơ, tôi dms ông dc không, vì ở đây ông minh miner có vẻ không thích tiếng việt cho lắm
yes
everyone speaks eng here
bruh what
so can we dms?
im hate being DMs for helping others
please don't speak another language language
😂 ok
!rule 4
4. Use English to the best of your ability. Be polite if someone speaks English imperfectly.
Guys ^
I don't understand what you guys are chatting about
Is it possible to check if a users DMs is on?
Keep the convo in english pls
ok english
some of my friends are using vnmese 
yes
Dont have nothing against it but its rules guys please follow them
yo okimii i still not done the sell command that i told u yesterday
Huh?

i putted the error here and no one help ._.
try to solve the problem yourself
i tried
Savage
i posted when i cant ://
where's it
Read docs or sm idk
i dont know much about button, my friend made that and now i need to fix it for her
still need the link ?
What fork is it?
Is it disnake?
yes pls
idk much about disnake :/
i'm 🇦🇺
Same as discord.py lmao
Bro.
you are so suspicious 😂
Im not vietnamese or american😭
why?
you need to respond to that interaction within 3 seconds
how to fix this, i can't install pygooglenews
and i have try all version
i just cant sell it
Well idk bro i dont understand😭
sell what 🙂
so where are you from?
😂
sell the card
🦧
i can use the .sell command but not the sell button
English isnt even my native language i just know it fluidly 
what type was the error
I have a French father and an Australian mother 😂
cool
ermm you are using sublime text, so try printing res
bonjour
Thats cool ngl

print(res)
in vscode you have a nice debugger
bonjour
@graceful sigil take notes
ok
Привет
😂

я русский
pls don't say 🇷🇺
Im russian

what's inside res
Im from mars
🙂


how to find the res in my whole folder
Could I get some help with this?
so you want to check if a user is either online, idle, or dnd
help so much 😂
Bro what?
ye
No I want to know if the bot can message them via dms
No he wants to check if his dms are on or not
I tried searching online, but I had no luck.
try DMs-ing that user who closes their DMs
you message them and if it returns an error their dms are off.
and see
ah ok
Just mute them all if you don't wanna see them
I was thinking of that but i thought their was something else
ok
try-except 😎
got u
Turn this on tho
leave server yes turn that on
i did already


subclass discord.ui.Select > make a select option > make another class > add the select class to the class > send the view class > https://github.com/Rapptz/discord.py/blob/master/examples/views/dropdown.py
Thank you Kayle for reposting the message that’s literally right above yours
I gave explanation on how to do it
\😏
You didn’t need to tho 😭. Literally anyone here could read that code and know what to do. There’s comments and everything
my bad then
@sage otter 👀
Reload cogs
If you follow the link that he sent you’ll find an example.
Is it fixed?
how to disable the default help command?
help_command = None you mean?
no
What exactly?
wait
this default help command. how to disable it so i can setup a custom help command?
nevermind
by the way, if you're going to make a custom help command, make sure to do it the proper way by subclassing commands.HelpCommand rather than making a normal command for it
Why exactly?
🤔
That's actually a fair question
People say its a waste of time making a command for help
People have always told me to do it that way, and it makes sense since i mean the whole point of it is to aid in making custom help commands
Well yeah if you make like an embed with documentation for each and every command manually
🤔
Idk i always make a command for help
the approach i usually take is to add a triple quote docstring to each function, and let d.py handle the rest
And of course some basic styling with embeds and whatnot
I do that but i make it look better with extra info and stuff
Then the only thing I have to do is add docstrings to each new function I add, which you should do anyway
idk how to use commands.HelpCommand
It's quite daunting at first
There was a really nice walkthrough link in the d.py server, sadly I can't find it atm
It was a full gist page that really helped me out a lot
Oh hey, here it is! https://gist.github.com/InterStella0/b78488fb28cadf279dfd3164b9f0cf96
I suggest take some time and read through it fully, and make sure you understand it as well. It'll help you a ton


