#discord-bots
1 messages ยท Page 866 of 1
๐
still responds faster than wick antinuke
its wick
it depends on allot of things ok
Bc u claim to be a programmer ur not if u donโt know reasons for separate user prefix
compare to summrs or any other decent bot
bro antinukes are useless lol
BRO NICK ADMITTED THAT MY BOT HAS A BETTER ANTINUKE THAN HIS LMFAO
Hello. What's going on here?
LOL summrs slow? please test your bot against an actual 50+ bans per second nuke
ok guys
Nothing ๐
guys please chill out
k lmao
summrs gets like 100 bans
who the hell is nick? tell that to lxi
i already tested
i don't see whats wrong with one guild prefix
Inb4 chat gets silenced
if the nuker bans 50+ sec my bot will save it at 49 bans
do you guys know how an api works๐ฟ
im just gonna stop typing before i get punished somehow ๐ฟ
slow 
most of the nukers are getting 1-13
Maybe some people donโt have that key for the server prefix so they use a custom user prefix like damn how yโall so brain dead?
!silence
โ silenced current channel for 10 minute(s).
I don't need any context to know that this is totally inappropriate.
When I unmute
If people continue making personal attacks, I will hand out mutes.
!unsilence
โ unsilenced current channel.
thank you
LX can you check out this message?
this one too
Also while yall are here, is the slow mode going to be 6 seconds forever now?
Because it's super annoying
we generally keep higher slow modes in channels where people have a history of misbehaving.
now's not the time to ask for it to be lowered ๐
i was just saying you cant compare other bots with yours
Okimii just drop it
ah never knew thx
Yeah please drop the subject and move on. Thanks.
๐
.topic
Suggest more topics here!
Cogs
Also using the commands extension
And not using json as a database
And subclassing the help command
cogs, subclasses, buttons
Oh yeah buttons are nice
How do you make bots become speakers in stage channels?
Not sure if that's possible
Wait
Yeah I don't think its possible
!d disnake.StageChannel
class disnake.StageChannel```
Represents a Discord guild stage channel.
New in version 1.7.
x == y Checks if two channels are equal.
x != y Checks if two channels are not equal.
hash(x) Returns the channelโs hash.
str(x) Returns the channelโs name.
You're free to look in the docs to see if I missed something
Well, I am new programming and I am trying to create a music bot. I found an example from a repository but it is not working for me. The bot is online bot is not joining the channel or anything, however, the ping/pong command works.
Music bots... whereabouts are you getting said music from?
This is the repository, don't worry abt the token, its an old one
lavasnek / lavalink
Are you searching for it on youtube by URL by chance?
What do you mean?
Well, what lavalink does (for what I understood) is that it search for the song on the youtube query
Well yeah, that if/else is always going to return soemthing, so nothing below that gets executed
Yes please and see if it prints
the return statement returns the method which the if statement will always return the method because if the condition isnt correct it will just return the method with else
Okimii please use commas
no๐
๐ฟ
Well unfortunately getting and streaming music from youtube is against their terms of service, so we won't be able to help with that ๐ฆ
no?
its only gonna print if the excepting gets eaten
I see ๐ฆ
I see, can you paste what's inside your self_prefixes.json?
so on ready doesnt get triggered?
im not sure if it would work
because on each prefix you check the authors id with the one stored right?
because if you do it will always be False as your comparing a string to an integer
What do you mean?

like instead of writing the title if i change my server name is there a way to make it so i dont gotta change the code
javascript loose equality comparison ๐
@sick birch so what else?
The guild name.
edit the embed ig
print out the contents of self_prefixes
wouldnt work
I know, I'm providing an example
youre comparing the objs id and not the values
where
within the try:
line?
oh yeah
!e
print("1" == 1)
@slate swan :white_check_mark: Your eval job has completed with return code 0.
False
try:
with open(...) as f:
self_prefixes = ...
print(self_prefixes)
except ...:
...
lol
true in javascript ๐
When should I be using is instead of ==?
why python is better
I know when comparing against None
use is to check if 2 objects are pointing to the same thing i suppose you could say
pointing?
is compares the object ids while == compares the values
object ids?
yes
same memory address
lol
oh
!e
x = 5
y = x
print(x is y)
@sick birch :white_check_mark: Your eval job has completed with return code 0.
True
they have the same memory address
exactly
sure, run it
btw you like speed in your bot right?
yikes, it's not printing it?
well if you want your bot to access the data faster and sqlite will be faster at it im not saying you need to change but if you really do love performance well you know what to do lol
BUT
no
sqlite uses a file
Wait sqlite is actually faster?
if you would like a server go for postgresql
Do you have an error handler somewhere?
why wouldnt it?
I'm gonna time this shit myself
๐ผ
express.js + sqlite go brr
error handlers for loading prefix? no bruh
๐ช ๐
๐ฟ
Can you test it for me, I have to do homework?
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
try:
with open(prefix_path, "r")as f:
prefixes = json.load(f)
except FileNotFoundError:
prefixes = {}
try:
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
print(self_prefixes)
except FileNotFoundError:
print("file error")
self_prefixes = {}
if str(guild) not in prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(guild) in prefixes:
return commands.when_mentioned_or(*prefixes.get(str(guild)))(bot, message)
if str(author) not in self_prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(author) in self_prefixes:
return commands.when_mentioned_or(*self_prefixes.get(str(author)))(bot, message)
angel = slash_util.Bot(
command_prefix=get_prefix,
intents=discord.Intents.all(),
case_insensitive = True,
help_command=None
)
this is everything here
ha no
im not setting up a db to time that lol
try:
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
print(self_prefixes)
except FileNotFoundError:
print("file error")
self_prefixes = {}
except:
print("something went wrong")
try this
I think i might know what's happening
bare excepts๐
๐
just put all the exceptions it can yeet to you๐ฟ
so you can follow pep8
@sick birch do i do that?
Yes
๐ฟ

imma test what robin said
!e
try:
raise ValueError
except:
print("well I know theres an error but I have no idea what it is")
@final iron :white_check_mark: Your eval job has completed with return code 0.
well I know theres an error but I have no idea what it is
!e
try:
raise ValueError
except Exception as e:
print("well now I know what error is it")
raise e
@final iron :x: Your eval job has completed with return code 1.
001 | well now I know what error is it
002 | Traceback (most recent call last):
003 | File "<string>", line 5, in <module>
004 | File "<string>", line 2, in <module>
005 | ValueError
@sick birch
See the difference?
lol
i had this before
!e
a = None
print(a.strip(" "))
@slate swan :x: Your eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "<string>", line 2, in <module>
003 | AttributeError: 'NoneType' object has no attribute 'strip'
Indentation
Indentation is leading whitespace (spaces and tabs) at the beginning of a line of code. In the case of Python, they are used to determine the grouping of statements.
Spaces should be preferred over tabs. To be clear, this is in reference to the character itself, not the keys on a keyboard. Your editor/IDE should be configured to insert spaces when the TAB key is pressed. The amount of spaces should be a multiple of 4, except optionally in the case of continuation lines.
Example
def foo():
bar = 'baz' # indented one level
if bar == 'baz':
print('ham') # indented two levels
return bar # indented one level
The first line is not indented. The next two lines are indented to be inside of the function definition. They will only run when the function is called. The fourth line is indented to be inside the if statement, and will only run if the if statement evaluates to True. The fifth and last line is like the 2nd and 3rd and will always run when the function is called. It effectively closes the if statement above as no more lines can be inside the if statement below that line.
Indentation is used after:
1. Compound statements (eg. if, while, for, try, with, def, class, and their counterparts)
2. Continuation lines
More Info
1. Indentation style guide
2. Tabs or Spaces?
3. Official docs on indentation
doesn't do anything now LOL
bro slowdown is a pain here
ye the print is misplaced
Well certain users that cause trouble are the reason there is a 6 second slowmode
Everyone hates it
so what's wrong with this bruh
tbh what youre doing is a pain
fr
in sql is so easy as this
f"SELECT prefix FROM userprefix WHERE id = {ctx.author.id};"
bro u understand that
like move bro i can help you๐
nah its just sql statements lol
which doesn't makes sense cuz guild loads... + im using the same way bruh
i cant really help you but if you change it will make your life easier trust me lol
AND its faster lol
i mean if u really want to help me with that sure
raw sql queries ๐ฌ
i mean im down to help you sure
sqlite3?
its not taking user input๐
f strings
if you want sure but use aiosqlite
you're gonna get sql-injection'd
its a async bridge
i mean ur way will be fine
nope
alr let's do it
its not taking user input so sql injection isnt posible
true true its an ID
do you know sql?
๐
i mean kinda but na
SQL is kind of like it's own language i would suggest you actually learn the syntax first
No but I agree with the fact that even if you're not taking user input you shouldn't be using f strings
do you know how to set, delete, update, take data?
no
no no yes use them
knowing how to do CRUD operations with it is probably the most important
just use placeholders
All my homies love CRUD operations
who doesn't
All my homies hate writing LEFT JOIN statements
well just learn the basics like what i mentions and you will be fine https://sqlbolt.com/
SQLBolt provides a set of interactive lessons and exercises to help you learn SQL
i hate joins with a passion
i mean if u finna tell me to learn it i will keep going with json for now tbh
like im currently having this pain in my ass doing this
let me try to do smth before
if it were sql it would just be๐
that's JSON for you
what if i load self prefix before guild?
Granted, learning SQL is a whole thing.
na na i gotta test
wait why do you hate joins? isn't that the beauty of SQL?
Has anyone here had experience with json-based databases?
bro
I mean, not text files.
mongo just decided not to work
A bit with mongo, but I was using an ORM so it wasn't all that bad
because my mind explodes when i do๐ญ
Mongo's queries are so bad when working with complex data
The queries at least with python's drivers get so bad
sql is so simple thats why i went for it its like python simple but powerful
the first part of this works, but the other doesnt py await cluster.Botswag.Accounts.update_one({"_id": str(ctx.author.id)}, {"$inc": {"Balance": -amount}}) await cluster.botswag.Accounts.update_one({"_id": str(user.id)}, {"$inc": {"Balance": amount}})
I generally find writing raw queries to be distasteful
still it can be a one liner๐
i just inverted those
That is true. Considering its age, SQL is a great language ๐ค
But that's still not alright
smh age shaming
so how can i load both prefixes?
and its dbs tho
I should clarify, I was using a Typescript ORM so I have no idea about the python ones ๐
@sick birch look
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
try:
with open(prefix_path, "r")as f:
prefixes = json.load(f)
except FileNotFoundError:
prefixes = {}
try:
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
except FileNotFoundError:
print("file error")
self_prefixes = {}
if str(author) not in self_prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(author) in self_prefixes:
return commands.when_mentioned_or(*self_prefixes.get(str(author)))(bot, message)
if str(guild) not in prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(guild) in prefixes:
return commands.when_mentioned_or(*prefixes.get(str(guild)))(bot, message)
this will load just the self prefix
its crazy as companies use pg which any user can use lol and not have a mental breakdown
@sick birch u here?
Postgres was a headache when contributing to other people's projects, when they didn't have a docker image or a schema.sql
well im not sure tbh but like any user can learn it so its not like something only companies can use yk
pain
if you are using mongo i would suggest to move or if you want to keep using that atleast use pymongo
@visual yarrow do u know json ?
I am not using mongo
Yep ๐
still print it to find out where the issue is
do u know how to load 2 prefixes?
Wdym?
bro i literally told u .. i just put "self prefix" before "guild prefix"
I'm getting this feeling that your self_prefixes.json is in an invalid format
make a list
and now guild prefix is not working
ha no
only self prefix
json.loads() is very finnicky about how you need to format your json files
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
try:
with open(prefix_path, "r")as f:
prefixes = json.load(f)
except FileNotFoundError:
prefixes = {}
try:
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
except FileNotFoundError:
print("file error")
self_prefixes = {}
if str(author) not in self_prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(author) in self_prefixes:
return commands.when_mentioned_or(*self_prefixes.get(str(author)))(bot, message)
if str(guild) not in prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(guild) in prefixes:
return commands.when_mentioned_or(*prefixes.get(str(guild)))(bot, message)
angel = slash_util.Bot(
command_prefix=get_prefix,
intents=discord.Intents.all(),
case_insensitive = True,
help_command=None
)
You said it was like
{"id": "c"}
right?
yes
Try
{
"id": "c"
}
*self_prefixes.get(str(author)) any specific reason why you unpack self_prefixes?
I remember having some issues with that
this is how i load guild id...
makes no sense
ok so my explaining may be dumb af but like i said.. i tried reinverting those ... i put self prefix before guild prefix and now self prefix is working and guild not
๐
?
probably stopping at line 40
when_mentioned_or takes a list of arguments, probably why they're unpacking
But if it was a string, say "foo" it would then pass "f", "o", "o"
yep
the prefix can't be 2 characters long so ๐คทโโ๏ธ
So... a user can have multiple prefixes?
o dpm
i don't do that*
bro 6 seconds cooldown is a pain 
๐ค so each author has an entry, one user one prefix?
yep
i don't know why i keep saying author
basically is the author
um yeah it should be good since it's only 1 character
i dont think the issue is with unpacking
exactly
if i load guild prefix before self guild is going to work and self not
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
try:
with open(prefix_path, "r")as f:
prefixes = json.load(f)
except FileNotFoundError:
prefixes = {}
try:
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
except FileNotFoundError:
self_prefixes = {}
if str(guild) not in prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(guild) in prefixes:
return commands.when_mentioned_or(*prefixes.get(str(guild)))(bot, message)
if str(author) not in self_prefixes:
return commands.when_mentioned_or(".")(bot, message)
elif str(author) in self_prefixes:
return commands.when_mentioned_or(*self_prefixes.get(str(author)))(bot, message)
angel = slash_util.Bot(
command_prefix=get_prefix,
intents=discord.Intents.all(),
case_insensitive = True,
help_command=None
)
Now guild prefix will work
and just to claer it up, self prefixes is the user prefix?
isn't there a way to make them both read?
okay this is what you could do
get the user prefix first, if they have no user prefix, then use the guild prefix
you want to do it the other way around?
i want both of them to work yk
hmm
if nothing is found then . will be the one for both
does get_prefix allow you to return multiple prefixes?
i seen bots doing this so pretty sure there's a way
i think so ... cuz i can't load 2 prefixes
oh yeah
command_prefix=(get_prefix, arg2), pretty sure this won't work
Okay in that case do this: make an empty list, get guild prefix, add guild prefix to list, get user prefix, add it to list if it exists, and add . as well
that way all 3 will work
async def get_prefix(...):
prefixes = []
with open(...) as guild_prefixes:
guild_prefix = # find guild prefix
prefixes.append(guild_prefix)
with open(...) as user_prefixes:
user_prefix = # find user prefix
prefixes.append(user_prefix)
prefixes.append(".")
return prefixes
You could use collections.defaultdict, set the default to . then use .update with your JSON of guild's and users
Significantly reduces the size of this code down
works just as well, i'm just demostrating a concept
You can also use setdefault if you don't want to import collections
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = []
with open(prefix_path, "r")as f:
guild_prefix = prefixes[str(guild)]
prefixes.append(guild_prefix)
with open(self_prefix_path, "r")as f:
self_prefix = prefixes[str(author)]
prefixes.append(self_prefix)
prefixes.append(".")
return prefixes
angel = slash_util.Bot(
command_prefix=get_prefix,
intents=discord.Intents.all(),
case_insensitive = True,
help_command=None
)
@sick birch
use .get() instead
where
and check if it's None
with open(self_prefix_path, "r")as f:
self_prefix = prefixes.get(str(author.id))
if self_prefix:
prefixes.append(self_prefix)
``` like so
Your making file pointers but you aren't actually using them, unless otherwise populating prefixes somewhere else it's always empty
else??
else nothing
wait you actually have to load it first
json load?
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
self_prefix = self_prefixes.get(str(author.id))
if self_prefix:
prefixes.append(self_prefix)
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = []
with open(prefix_path, "r")as f:
guild_prefixes = json.load(f)
guild_prefix = self_prefixes.get(str(guild.id))
if guild_prefix:
prefixes.append(guild_prefix)
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
self_prefix = self_prefixes.get(str(author.id))
if self_prefix:
prefixes.append(self_prefix)
prefixes.append(".")
return prefixes
wait
without .id ... 1 sec
m alright
meant here
If you have any commands that aren't guild required your gonna get an attribute error @ message.guild.id when using commands in DMs
Not a problem if you have all guild only commands though
just add the @commands.guild_only check
how can i load when mentioned too?
or it might be @commands.guild_only() i don't remember
use the when_mentioned_or
where
I haven't actually used that before so i can't help with that unfortunately
but where do i use it
return when_mentioned_or(*prefixes)
or something like that
can someone help me #help-chestnut
Yeah I'm not familiar with how to do that, but all I know is you'd need to unpack prefixes
You'd just do when_mentioned_or(*prefixes)(Bot, Message)
Except here this is just super in-efficient as you unpack for when_mentioned_or, then the inner function of it turns it back into a list
the optimal and the way I would suggest is just appending "<@bot_id>" to the list
Or <@!bot_id>
bot.user.mention?
Yes this also works, does the same thing as what I said
@dry kelp in that case try this:
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = [".", bot.user.mention]
# other stuff here
return prefixes
not much
then is fine like this tbh
same as this
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = []
prefixes.append(".")
prefixes.append(bot.user.mention)
# other stuff here
return prefixes
The difference is the speed it takes
You unpack, then the function turns it back into a list
oh
super in-efficient when you don't need to do that
I'm gonna go on a limb here and say it doesn't matter since they're using JSON
if you're doing when_mentioned_or you can get rid of thet bot.user.mention part
return just prefixes
yes, just return prefixes
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = [".", bot.user.mention]
with open(prefix_path, "r")as f:
guild_prefixes = json.load(f)
guild_prefix = guild_prefixes.get(str(guild))
if guild_prefix:
prefixes.append(guild_prefix)
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
self_prefix = self_prefixes.get(str(author))
if self_prefix:
prefixes.append(self_prefix)
return prefixes
there you are
Just wanted to ask, you claim you have the fastest anti-nuke bot but you use json and inefficient methods?
I would assume fastest as in network speed
what's wrong with it?
Well, firstly creating and reading those file pointers are blocking IO so, it would block the event loop, Secondly if for an example prefixes was a list of 50 elements, you'd be unpacking. then reconstructing the list which is O(n) just to add a single element
the command doesn't work when i ping the bot
Are you returning just prefixes?
mhm
by the way couldnt you already make your bot verified why isnt it verified yet?
async def get_prefix(bot, message):
author = message.author.id
guild = message.guild.id
prefixes = [".", bot.user.mention]
with open(prefix_path, "r")as f:
guild_prefixes = json.load(f)
guild_prefix = guild_prefixes.get(str(guild))
if guild_prefix:
prefixes.append(guild_prefix)
with open(self_prefix_path, "r")as f:
self_prefixes = json.load(f)
self_prefix = self_prefixes.get(str(author))
if self_prefix:
prefixes.append(self_prefix)
return commands.when_mentioned_or(*prefixes)(bot, message)
i changed it a lot of times.. revamping n shit yk
this is just in 36 serverrs
servers
so you made it left servers for test reasons or?
does it really remove your verified badge?
i never had the verify badge
didnt you said the bot was in 76 servers
wasnt that the same bot spooky?
they replied after 6 months
it probably was in 76 i just made it leave some servers
less than 100 members
๐ฟ
So much for 5 day verification

fr
i doubt that
im not in the server lol
do i invite u?
sure
also if u don't believe me i think that i still got the tickets in my yahoo mail inbox lol
@slate swan check the time
tbh who uses yahoo
why is it not verified because you reseted the token?
never planned to change
im not even sure if it removes the badge
na they are just slow.. + i deleted that bot before they're reply
i tough that they will never reply ๐
so i just said "imma make a new revamped bot"
:/
im glad i did
is way better
@hushed field tested it .. i mean the antinuke
u can test it too if u want lol
have you tested the bot?
ofc lol is my bot
How do you test the bot anyway
do you have logs that compare with other bots?
๐ณ
yep
antinuke logs
i will add normal logs too
you should show them to show why your bot is better so everybody knows your bot is fast ig lol
im just working on them
It's only fast when it's not under load, they're using json so once it starts getting even a little bit of load it'll break down
well how much time it took to change what had been done to the channel etc
Sharding just does not work with json at all
oh depends of the bot in this situation
because if a channel is being deleted
yeah ik when you actually get nuked by a 50+ user botnet it will breakdown fast
the bot will ban the target then restore everything
50 is pushing it
nah
i saw nukers that could ban 50+ a sec
if a nuker like this comes my bot reacts after 49
ive seen a botnet of 100+ the person was using proxies iirc
Pretty sure that's not possible because of ratelimits
@dry kelp How do you test your bots speed?
just saying what youre doing is wrong
so i tested it with @hushed field .. my anti vs his anti
and mine replied faster
breaking tos to stop nukers is like fighting fire with fire
that's because you live closer to the servers than he does
my bot replies faster than wick.. or summrs.. or any other bots lol
Yes but how do you test it
Like test how fast the anti nuke is
How would I go about getting an emoji id (if I have to for standard emojis)
i can probably add a event to see when the the event is being completed
so i could
- depends on internet speed
- depends on the connection of your bot to the api
- depends on what the bot runs on
etc
i see u don't have nitro.. if u need ids for animated emojis u can use my bot to bypass the id
im using digital ocean .. the 15$ droplet
yeah, reaction speeds doesn't really depend on the quality of code
no advertising
Nah I need ID's for โ๏ธ and โถ๏ธ
Okay yeah but you said that your bot has a 0.9 reaction speed, how do you test that?
i can tell it lol
947672346800566305 947672346800566305
Do you just wait for a server to get nuked?
wait
Ty
bro what
Except those are the same thing xD
ur wrong
my delete channel anti is faster than the create one for a reason
does depend on it a bit if you have O(n)methods that can be O(1)etc
Very miniscule yes
But network overheads and network transmissions times will usually overshadow that
your bot is so fast its gonna get ratelimited so easily on a real nuke lol
Different story with more time consuming algorithms
there's something dumb that all the antinuke bots don't do ... if a nuker spam 50 channels per sec the antinuke bots will delete just about 20!
My bot will async with the audit log for that person and then delete all the channels ... so the reaction of the ban is fast.. is just that it will take 1-2 seconds to delete the channels
depends of the ratelimit + how many channels
tries to ban a 50+botnet and boom gets ratelimited and the server goes bye bye
Yeah discord ratelimits are the biggest bottleneck
What the other bots are doing is probably intentional, they don't want to get rate limited
@sick birch i was able to make the anti vanity
If you frequently hit rate limits that can get discord's attention (don't quote me on it though)
tbh your bot can easily be bypassed
when allot of request happen in a guild discord ratelimits the guild thats why some people cant ban the nukers or change perms and thats why they use bots so your bot is so quick i doubt it wouldnt get ratelimited lol
your bot will delete 2.432902e+18 channels?
I haven't ever nuked a server and even I know a simple way to bypass your bot
the nuker won't make in time to spam that many channels
most antinukes are a bit slow as they dont want to get ratelimited lol
do it .. im down let's do it
i assure u that u can't
I'm not going to nuke a server as that's against tos
๐ฟ
How can i use commands group in main file? (not cog)
@commands.group(invoke_without_command=True, case_insensitive=True, aliases=["sp"])
@commands.check_any(commands.is_owner(), is_guild_owner())
async def setprefix(ctx, prefix):
I'm not saying I'll test it
I'm just presenting a major security hole
the 1st thing the bot will do is ban
so ur bot will get stopped instantly.. n then replace what happened
Would really appreciate some help
I'm pulling an API but its not working I belive its because of how I'm calling the data. Had another API before and it worked perfectly
@tasks.loop(seconds=20)
async def loop():
token = open('crypto.txt', 'r').read()
url = f"https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=near"
data = requests.get(url).json()['id']['current_price']```
These are the logs
2022-02-28T01:48:27.194351+00:00 app[worker.1]: File "/app/.heroku/python/lib/python3.9/site-packages/discord/ext/tasks/init.py", line 101, in _loop
2022-02-28T01:48:27.194352+00:00 app[worker.1]: await self.coro(*args, **kwargs)
2022-02-28T01:48:27.194360+00:00 app[worker.1]: File "/app/main.py", line 21, in loop
2022-02-28T01:48:27.194360+00:00 app[worker.1]: data = requests.get(url).json()['id']['current_price']
2022-02-28T01:48:27.194385+00:00 app[worker.1]: TypeError: list indices must be integers or slices, not str
So yeah I belive I'm calling the data incorrectly in line 21
data = requests.get(url).json()['id']['current_price']```
And if someone nukes in 2 waves?
a botnet would ratelimit your bot trust me on that
i tested with 3 nukers at once lol
1 user basic nuke
If someone nukes in 2 waves your bot would get crippled
non trusted users can't add bots
we are talking about real nukes
bro i tested everything
1st wave to get your bot rate limited, 2nd wave to destroy the server
im talking about real nukers too ๐
ever heard of a botnet and selfbots?
omfg im just getting turned on rn
people dont nuke with bots lol
Can we see how the json data is formatted?
replace everything within the ratelimit
Also requests is blocking
they do
bet
Json Data
[{"id":"near","symbol":"near","name":"Near","image":"https://assets.coingecko.com/coins/images/10365/large/near_icon.png?1601359077","current_price":8.52,"market_cap":5472313322,"market_cap_rank":27,"fully_diluted_valuation":8522099113,"total_volume":225783335,"high_24h":9.24,"low_24h":8.38,"price_change_24h":-0.692059827291,"price_change_percentage_24h":-7.50884,"market_cap_change_24h":-432887084.9098625,"market_cap_change_percentage_24h":-7.33061,"circulating_supply":642132090.936281,"total_supply":1000000000.0,"max_supply":1000000000.0,"ath":20.44,"ath_change_percentage":-58.44599,"ath_date":"2022-01-16T22:09:45.873Z","atl":0.526762,"atl_change_percentage":1512.27509,"atl_date":"2020-11-04T16:09:15.137Z","roi":null,"last_updated":"2022-02-27T22:33:21.362Z"}]
๐
^^
Wait, if I were to just do emoji.name could I just use :arrow_backward: for โ๏ธ ?
yes they do but thast just a low level nuke which is barely called a nuke lol
help pls
only if you've given a malicious user the ability to add bots
It's in a list so you would need to index it
a botnet of 50+ selfbots can make this happen lol
BRO HOW CAN I USE COMMANDS GROUPS IN MAIN FILE? ๐ญ
Refer to RFC 6585 for more info on rate limits
@dry kelp btw i suppose youre using the raw endpoints right
bro can someone ask my question
i just don't want to continue the conversation since i received a warning from the bot
You sure I have pulled info from another api and it worked.
@tasks.loop(seconds=20)
async def loop():
token = open('crypto.txt', 'r').read()
url = f"https://api-v2-mainnet.paras.id/collection-stats?collection_id={token}"
global totalminted
totalminted = requests.get(url).json()["data"]["results"]["total_cards"]
floorprice = requests.get(url).json()["data"]["results"]["floor_price"] ```
This one works and didnt index.
i got anger issues .. and this cooldown just triggers me
lol
Its pretty much the same and second api worked
Can I see the json data for the 2nd api?
There is the link the data is super long
THIS IS NOT WORKING PLS HELP 
The 2nd api doesn't return the data in a list
That's why you don't have to index it
huh?
Oh ok can you guide me on how to index the data if its a list?
Or some documentation I can read
!e
my_list = ["this", "is", "my", "list"]
print(my_list[0])
@final iron :white_check_mark: Your eval job has completed with return code 0.
this
This is indexing
@tasks.loop(seconds=20)
async def loop():
token = open('crypto.txt', 'r').read()
url = f"https://api.coingecko.com/api/v3/coins/markets?vs_currency=usd&ids=near"
data = requests.get(url).json()[2]```
So something like this?
You would want to get the first element
That is getting the 3rd
?
So current price is the 3rd element?
how do you set the status to watching instead of playing?
i have homework as well lol
activity=discord.Activity(type=discord.ActivityType.watching, name = <. . .>) is what I did
thanks
No worries you guys if you have some time later or some other day would appreciate it @slate swan and @final iron
floorprice = requests.get(url).json()[0]["data"]["results"]["floor_price"]
Try this
Also don't use requests, it's blocking. Use aiohttp instead
!blocking
Why do we need asynchronous programming?
Imagine that you're coding a Discord bot and every time somebody uses a command, you need to get some information from a database. But there's a catch: the database servers are acting up today and take a whole 10 seconds to respond. If you do not use asynchronous methods, your whole bot will stop running until it gets a response from the database. How do you fix this? Asynchronous programming.
What is asynchronous programming?
An asynchronous program utilises the async and await keywords. An asynchronous program pauses what it's doing and does something else whilst it waits for some third-party service to complete whatever it's supposed to do. Any code within an async context manager or function marked with the await keyword indicates to Python, that whilst this operation is being completed, it can do something else. For example:
import discord
# Bunch of bot code
async def ping(ctx):
await ctx.send("Pong!")
What does the term "blocking" mean?
A blocking operation is wherever you do something without awaiting it. This tells Python that this step must be completed before it can do anything else. Common examples of blocking operations, as simple as they may seem, include: outputting text, adding two numbers and appending an item onto a list. Most common Python libraries have an asynchronous version available to use in asynchronous contexts.
async libraries
The standard async library - asyncio
Asynchronous web requests - aiohttp
Talking to PostgreSQL asynchronously - asyncpg
MongoDB interactions asynchronously - motor
Check out this list for even more!
if its in a class, it needs self as its first parameter if it isnt a class or static method
it does, I think
<discord.embeds.Embed object at 0x7f0a41c55e50>
Im setting up an embed with multiple pages, except I just get this. I've seen this happen before but I forget how to fix it, this is the code:
p1 = embedstorm
p2 = embedstar
p3 = embedspring
p4 = embedwind
p5 = embeddragon
p6 = embeddawn
p7 = embedstorm1
p8 = embedstorm2
pages = [p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8]
await message.channel.send(p1)
async def on_reaction_add(emoji, user):
page = 0
left = "โ๏ธ"
right = "โถ๏ธ"
while True:
msg = await message.channel.send(embed=pages[(page)])
l = page != 0
r = page != len(pages) - 1
if l:
await msg.add_reaction(left)
if r:
await msg.add_reaction(right)
react = await client.wait_for('reaction_add', check=predicate(msg, l, r))
if react[0] == left:
page -= 1
elif react[0] == right:
page += 1
Thanks pep Im getting this error
2022-02-28T02:43:09.678939+00:00 app[worker.1]: File "/app/main.py", line 21, in loop
2022-02-28T02:43:09.678939+00:00 app[worker.1]: floorprice = requests.get(url).json()[0]["data"]["results"]["floor_price"]
2022-02-28T02:43:09.678963+00:00 app[worker.1]: KeyError: 'data'
Can you send how the json data is formatted again?
you dont send followups first?
!e
print({"key": "value"}["anotherkey"])
@slate swan :x: Your eval job has completed with return code 1.
001 | Traceback (most recent call last):
002 | File "<string>", line 1, in <module>
003 | KeyError: 'anotherkey'
happens when such a key isnt found

[{"id":"near","symbol":"near","name":"Near","image":"https://assets.coingecko.com/coins/images/10365/large/near_icon.png?1601359077","current_price":8.52,"market_cap":5472313322,"market_cap_rank":27,"fully_diluted_valuation":8522099113,"total_volume":225783335,"high_24h":9.24,"low_24h":8.38,"price_change_24h":-0.692059827291,"price_change_percentage_24h":-7.50884,"market_cap_change_24h":-432887084.9098625,"market_cap_change_percentage_24h":-7.33061,"circulating_supply":642132090.936281,"total_supply":1000000000.0,"max_supply":1000000000.0,"ath":20.44,"ath_change_percentage":-58.44599,"ath_date":"2022-01-16T22:09:45.873Z","atl":0.526762,"atl_change_percentage":1512.27509,"atl_date":"2020-11-04T16:09:15.137Z","roi":null,"last_updated":"2022-02-27T22:33:21.362Z"}]
Should i change data to id?
tbh, why dont you sort the keys for readability
lol just index the first element of the list and then the keys you want
thats the response body of the api ash

for once, sort it into a json file and observe the keys, then change it back to the api
๐๏ธ ๐๏ธ
your eyes are creepy 
๐๏ธ๐ ๐๏ธ

kek
Sorry im trying to read documentation and try stuff out I'm new to this.
well its mostly indexing which is basic python lol
Yeah trying to figure it out.
imagine sorting them 
import json
response = api_response
with open("./data.json", "w") as f:
json.dump(response, f, sort_keys=True, indent=4)
๐ฟ
nice return
which return?
what are you returning python๐

If I did message.channel.send() how could I add a reaction to the sent message?
your token is wrong lol
!d discord.Message.add_reaction
await add_reaction(emoji)```
This function is a [*coroutine*](https://docs.python.org/3/library/asyncio-task.html#coroutine).
Add a reaction to the message.
The emoji may be a unicode emoji or a custom guild [`Emoji`](https://discordpy.readthedocs.io/en/master/api.html#discord.Emoji "discord.Emoji").
You must have the [`read_message_history`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.read_message_history "discord.Permissions.read_message_history") permission to use this. If nobody else has reacted to the message using this emoji, the [`add_reactions`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.add_reactions "discord.Permissions.add_reactions") permission is required.
Tried this. It just added it to the message I sent
msg = await message.channel.send("Sarthak uwu")
await msg.add_reaction(emoji)
just wait for a msg and with the message obj add the reaction
What is audit action for
Anti member update
have you ever used me as an example i hope not
no, sarthak more handsome than hunter 
no hes not๐

๐
...
anti member update? 
Yes
what's that 
Like if am giving someone role bot ban me and remove the from him
.....what
just dont give manage role perms lol
Audit log action? Cmd
sorry i dont quite understand what you're referring to?
Which cmd show audit log action
@unkempt canyon via this bot
!d discord.Guild.audit_logs
async for ... in audit_logs(*, limit=100, before=None, after=None, oldest_first=None, user=None, action=None)```
Returns an [`AsyncIterator`](https://discordpy.readthedocs.io/en/master/api.html#discord.AsyncIterator "discord.AsyncIterator") that enables receiving the guildโs audit logs.
You must have the [`view_audit_log`](https://discordpy.readthedocs.io/en/master/api.html#discord.Permissions.view_audit_log "discord.Permissions.view_audit_log") permission to use this.
Examples
Getting the first 100 entries:
```py
async for entry in guild.audit_logs(limit=100):
print(f'{entry.user} did {entry.action} to {entry.target}')
```...

Is there a way to Music bot in py?
Depends on where you get your music from
Playing youtube videos using discord bot is against their terms of service
Spotify?
You'd have to read their TOS
But many bots play music from youtube
Many were shutdown for that very reason
Nope
Hm but is there any possible way to?
Yes but in accordance with rule 5 i'm not allowed to talk or provide assistance with it
Bruh
MEE6 is still streaming music so they're about to bonked
Like 1 way say
5. Do not provide or request help on projects that may break laws, breach terms of services, or are malicious or inappropriate.
Bruh
yes
there is?
there is but it's against their TOS so we can't say what it is
"access, reproduce, download, distribute, transmit, broadcast, display, sell, license, alter, modify or otherwise use any part of the Service or any Content except: (a) as expressly authorized by the Service; or (b) with prior written permission from YouTube and, if applicable, the respective rights holders;"
yeah that, but didnt youtube_dl reinstate their lib?
I want to make my bot respond to pings how would i do that? Im useing discord .py
!d discord.ext.commands.when_mentioned
discord.ext.commands.when_mentioned(bot, msg)```
A callable that implements a command prefix equivalent to being mentioned.
These are meant to be passed into the [`Bot.command_prefix`](https://discordpy.readthedocs.io/en/master/ext/commands/api.html#discord.ext.commands.Bot.command_prefix "discord.ext.commands.Bot.command_prefix") attribute.
Thank you
yw
So i would do @bot.event
Discord.ext.commands.when_mentioned(message)?
no?
nah its like a prefix
Ohhhh
Okay
if you want lol
How would o give it multiple sayings?
pardon?
Like uh multiple options like option a and option b so its randomized between the 2
I want to have kt speak on ping so if someome pings it theres a list of things it could say
just make a help command lol or subclass the helpcommand
you want it to respond like a message showing commands or like, "hey", "hello", "okimii uwu"?
Uh no

When someoke pings it it van say like
Hello
Or why ping

use the random module
Kinda like slug bot does
!e
import random
print(random.choice([True, False]))
@slate swan :white_check_mark: Your eval job has completed with return code 0.
True
!e
import random
print(random.choice([True, False]))
@slate swan :white_check_mark: Your eval job has completed with return code 0.
False
@slate swan :white_check_mark: Your eval job has completed with return code 0.
True
๐ณ

Its also late where i libe so my brain is kinda sleepy
happens๐
sleep 
aaaaaaaaaa
?

just check who added the reaction otherwise clear the reaction if not admin
import disnake
from disnake.ext import commands, tasks
import random
botstatus = [
"with my files",
"on a Wii U",
"on a Nintendo DS",
"Mario Party DS",
"Rocket League",
"Apex Legends",
"Spiderman PS4",
"with my maker"]
class Status(commands.Cog):
"""Changes the status automatically every 30 minutes."""
def __init__(self, bot = commands.Bot):
self.bot = bot
self.change_status.start(bot)
@tasks.loop(minutes=10.0)
async def change_status(self, bot):
playing = random.choice(botstatus)
await self.bot.change_presence(activity=disnake.Game(name=playing))
def cog_unload(self):
self.change_status.stop()
def setup(bot):
bot.add_cog(Status(bot))
print(" | Loaded Extension: Status")
Unhandled exception in internal background task 'change_status'.
Traceback (most recent call last):
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/ext/tasks/__init__.py", line 157, in _loop
await self.coro(*args, **kwargs)
File "/storage/emulated/0/Coding/discord-bots-repo/Ultimatium/commands/status.py", line 25, in change_status
await bot.change_presence(activity=disnake.Game(name=playing))
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/client.py", line 1434, in change_presence
await self.ws.change_presence(activity=activity, status=status_str)
AttributeError: 'NoneType' object has no attribute 'change_presence'
I keep getting this error.
self.bot.change_presence
That doesn't fix it
huh
bot isn't supposed to equal commands.Bot
Unhandled exception in internal background task 'change_status'.
Traceback (most recent call last):
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/ext/tasks/__init__.py", line 157, in _loop
await self.coro(*args, **kwargs)
File "/storage/emulated/0/Coding/discord-bots-repo/Ultimatium/commands/status.py", line 25, in change_status
await self.bot.change_presence(activity=disnake.Game(name=playing))
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/client.py", line 1434, in change_presence
await self.ws.change_presence(activity=activity, status=status_str)
AttributeError: 'NoneType' object has no attribute 'change_presence'
It doesn't fix it.
commands.Bot is supposed to be the typehint
oh yeah, this @modest plover
bot: commands.Bot
you're setting the default value of bot 
๐ฟ
oh

changed it now, still doesn't work
Correct
i read the traceback lol
same
waut nvm
....
this isn't a fucking subclass ๐
im so tired rn i shouldn't be helping
you should probably just set the status in an on_ready listener. but, regardless, you don't need to pass bot to your function there. doesn't seem like its being used
dont do it in on_ready, s.m.h.
i do that
you shouldnt 
same
I left my last bot also under development, because its just too boring, there's like 10k bots for the same purpose
ye bot dev is so boring
now
well anyways @modest plover, seems like self.bot is None
where do you create your bot instance/subclass
lol
vc = ctx.me.voice_client
AttributeError: 'Member' object has no attribute 'voice_client'
where do you do bot = commands.Bot(...) or class Bot(commands.Bot)
y u here 
import disnake
from disnake.ext import commands
import os
from dotenv import load_dotenv
import platform
load_dotenv()
token = os.environ["token"]
split = ("----------------------")
indent = " | "
bot = commands.Bot()
def loading():
print(f"Bot stats:")
print(f"{indent}Name: {bot.user}")
print(f"{indent}ID: {bot.user.id}")
print(f"{indent}Latency: {round(bot.latency * 1000)}ms")
print(f"{indent}Disnake Version: {disnake.__version__}")
print(f"{indent}Python Version: {platform.python_version()}")
bot.load_extensions("commands")
@bot.event
async def on_ready():
loading()
bot.run(token)
I could ask you the same 
@slim ibex this is where I do it
main.py the file is
AttributeError: 'Member' object has no attribute 'voice_client'```
!d discord.ext.commands.Context.voice_client
property voice_client: Optional[VoiceProtocol]```
A shortcut to [`Guild.voice_client`](https://discordpy.readthedocs.io/en/master/api.html#discord.Guild.voice_client "discord.Guild.voice_client"), if applicable.
ctx.voice_client
ok thanks

you can use, ctx.guild.voice_client for an alternative, your wish
what would be the difference
no difference, same stuff, but I prefer guild.voice_client
ok thx
!d discord.Guild.voice_client
property voice_client: Optional[VoiceProtocol]```
Returns the [`VoiceProtocol`](https://discordpy.readthedocs.io/en/master/api.html#discord.VoiceProtocol "discord.VoiceProtocol") associated with this guild, if any.
same thing 
hm?
your bot doesnt have access to speak or connect
permission*
it has admin perms
show the traceback then
HTTP error 403 Forbidden
403 raises when you dont have permissions
discord doesnt like you then 
s.m.h.
says it all lol
im getting this when i click the link
!rule 5
5. Do not provide or request help on projects that may break laws, breach terms of services, or are malicious or inappropriate.
?
ytdl breaks youtube's TOS
how
!ytdl
Per Python Discord's Rule 5, we are unable to assist with questions related to youtube-dl, pytube, or other YouTube video downloaders, as their usage violates YouTube's Terms of Service.
For reference, this usage is covered by the following clauses in YouTube's TOS, as of 2021-03-17:
The following restrictions apply to your use of the Service. You are not allowed to:
1. access, reproduce, download, distribute, transmit, broadcast, display, sell, license, alter, modify or otherwise use any part of the Service or any Content except: (a) as specifically permitted by the Service; (b) with prior written permission from YouTube and, if applicable, the respective rights holders; or (c) as permitted by applicable law;
3. access the Service using any automated means (such as robots, botnets or scrapers) except: (a) in the case of public search engines, in accordance with YouTubeโs robots.txt file; (b) with YouTubeโs prior written permission; or (c) as permitted by applicable law;
9. use the Service to view or listen to Content other than for personal, non-commercial use (for example, you may not publicly screen videos or stream music from the Service)

Probably becuase the youtube video is heavily outdated like 90% of all of them related on discord bots

its back
No, it's not
๐
s.m.h. whats to laugh
Using youtube to stream music to your bots is against their terms of service. Period.
Not much really, other than scrap the idea of a music bot

Sure but you'd wanna check their terms of service too
spotify has high encryption, wont let you use their audio
you dont
Most audio streaming platforms don't want you to
how do the music bots work then
They don't
some do
the remaining ones are gonna be shot down soon
Won't for much longer depending on their source
Youtube and discord are cracking down on it heavily
Sorry we couldn't do more but rules are rules you know
yup
@green veldt 
You could try soundcloud I guess?
oh i didnt do that
my friend did im gonna remove that
i definitely know
Well, they're legal
yes if you dont spam
You're not going to prison for using a self bot, it's just against terms of service
Unhandled exception in internal background task 'change_status'.
Traceback (most recent call last):
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/ext/tasks/__init__.py", line 157, in _loop
await self.coro(*args, **kwargs)
File "/storage/emulated/0/Coding/discord-bots-repo/Ultimatium/commands/status.py", line 25, in change_status
await self.bot.change_presence(activity=disnake.Game(name=playing))
File "/data/data/com.termux/files/usr/lib/python3.10/site-packages/disnake/client.py", line 1434, in change_presence
await self.ws.change_presence(activity=activity, status=status_str)
AttributeError: 'NoneType' object has no attribute 'change_presence'
I'm still confused by this
I know....
Code please?
Looks like it's in a cog
how
import disnake
from disnake.ext import commands, tasks
import random
botstatus = [
"with my files",
"on a Wii U",
"on a Nintendo DS",
"Mario Party DS",
"Rocket League",
"Apex Legends",
"Spiderman PS4",
"with my maker"]
class Status(commands.Cog):
"""Changes the status automatically every 10 minutes."""
def __init__(self, bot: commands.Bot):
self.bot = bot
self.change_status.start(bot)
@tasks.loop(minutes=10.0)
async def change_status(self, bot):
playing = random.choice(botstatus)
await self.bot.change_presence(activity=disnake.Game(name=playing))
def cog_unload(self):
self.change_status.stop()
def setup(bot):
bot.add_cog(Status(bot))
print(" | Loaded Extension: Status")
It is
Idk I just know it's doable, I used Hydra to play my soundclown shitpost playlist to my friend
@commands.Cog.listener()
async def on_raw_reaction_remove(self, payload: discord.RawReactionActionEvent):
guild = self.bot.get_guild(payload.guild_id)
if guild is None:
return
member = guild.get_member(payload.user_id)
if member is None:
return
# if they remove the reaction remove the rol
print(member)
message = await guild.get_channel(payload.channel_id).fetch_message(payload.message_id)
if payload.guild_id == 915076185740939304:
#get reaction roles
reaction_roles_data = self.reaction_roles_data[payload.guild_id]
#get the role
for reaction_role in reaction_roles_data:
if reaction_role["emoji"] == payload.emoji.name:
role = discord.utils.get(member.role, id=reaction_role["roleID"])
await member.remove_roles(role)
break
is soundcloud aloud?
Ignoring exception in on_raw_reaction_remove
Traceback (most recent call last):
File "C:\Users\\Trello\venv\lib\site-packages\discord\client.py", line 382, in _run_event
await coro(*args, **kwargs)
File "C:\Users\\Trello\cogs\Reaction.py", line 110, in on_raw_reaction_remove
role = discord.utils.get(member.role, id=reaction_role["roleID"])
AttributeError: 'NoneType' object has no attribute 'role'
saying member is None
i dont know
hey i want to access errors in that error
anyone know how to do that?
SoundCloud is allowed
ok thanks
Streaming Tracks
Note if you are going to stream from our API you need to attribute properly. Make sure you've read our Terms and Attribution Guidelines to make sure you treat our creators content correctly. When using a custom player you must:
Credit the uploader as the creator of the track
Credit SoundCloud as the source by including one of the logos found here
Link to the SoundCloud URL containing the work
If the track is private link to the profile of the creator
If you don't want to use the SoundCloud widget, our API gives you the ability to access a track's stream URL and use your own player to play tracks from SoundCloud. In order to get a URL for streaming, you can request the appropriate resource and make note of the stream_url property. Send a GET request to that URL and you will get a set of links with available transcodings which you can choose from.
make a command handler
btw my bot just left my server itself๐ฑ๐ฑ
It says you can use your own player to play tracks from SoundCloud
ok but what did just happen
@sick birch here's the code
i have three but only the first one comes up other two never hit up
help pls
make a seperate event for each
@slate swan yeah, imagine if corporations could make their own laws.. oh wait
@commands.Cog.listener()
yeah i noticed
......you need to....
search up for a command handler

HOW DID MY BOT LEFT MY TEST SERVER ITSELF!!!
he doesn't love you anymore
๐ณ
okk
Unless your code is malfunctioning someone has your token and you should regen it immediately
check what there
