Итак, хотя все мы, конечно, знаем о том, что все скопируйте и вставьте чужой код, и волшебным образом он работает, он теряет некоторый контекст и понимание, когда выясняется, как этот код на самом деле работает и функционирует.
Я работаю с Discord.py Rewrite и фрагментом кода называется Reaction Light, чтобы создать бот, который позволяет самостоятельно назначать роли в моем Сервер Discord. Бот на 100% функционален и работает по назначению. Теперь я изменил некоторые вещи в их коде, поэтому мои методы находятся в разных местах и вызываются из разных областей.
Вот где я запутался:
У меня есть метод isadmin()
, который вызывается всякий раз, когда необходимо выполнить проверку, чтобы выяснить, является ли пользователь, вводящий команду, администратором. Роли администратора определены в файле .env, который я получаю с помощью модуля dotenv. Довольно простой материал. (Я перепишу эту часть позже и, надеюсь, помещу все идентификаторы роли администратора в файл и возьму их оттуда.) Однако я не понимаю, что именно делает третий аргумент этого метода. msg=False
Всякий раз, когда я писал для этого свои винтики, я вызываю этот метод как таковой, не передавая ему аргумент msg, как показано ниже:
# admin.py
# Simple ping pong command
@commands.command()
async def ping(self, ctx):
if helpers.isadmin(ctx):
print("Running Command from admin.py")
await ctx.send('Pong!')
Теперь в моем методе прослушивателя on_message()
он передает аргумент msg
, а затем выполняет некоторый код, не связанный с командой ping, но связанный с функциональностью самоназначающейся ролевой части бота.
# message.py
@commands.Cog.listener()
async def on_message(self, message):
if helpers.isadmin(message, msg=True):
# Execute some code here for the self-assigning roles
Насколько мне известно, этот рабочий процесс работает следующим образом, и в качестве примера я буду использовать команду ping, которая вызывается командой r.ping
.
- on_message () прослушивает все сообщения, отправляемые на сервер
- Команда Ping выдана в канале пользователем
- on_message () слышит сообщение и проверяет, является ли пользователь администратором, но также передает аргумент
msg
- Команда ping вызывается из
admin.py
, а затем проверяет (снова?), Является ли пользователь администратором, и, если он / она, выполняет команду.
Итак, я пытаюсь выяснить, когда или когда не использовать этот msg
аргумент, и если он уже проверяет, является ли пользователь администратором в слушателе, мне нужно снова проверить в собственно сама команда? Разве это не избыточно?
Вот метод isadmin()
в файле helpers.py.
# helpers.py
def isadmin(self, ctx, msg=False):
# Checks if command author has one of .env admin role IDs
try:
check = (
[role.id for role in ctx.author.roles]
if msg
else [role.id for role in ctx.message.author.roles]
)
if self.admin_a in check or self.admin_b in check or self.admin_c in check:
return True
return False
except AttributeError:
# Error raised from 'fake' users, such as webhooks
return False