Я получил этот код, который блокирует доступ к команде ?hello
для всех, кроме этого идентификатора пользователя в LIST_OF_ID
поэтому я изменил это, заменив ctx.message.author.id
на ctx.message.server.id
теперь он обходит и для сервера. поэтому я добавил оба кода, но теперь он не работает для пользователя и сервера, работает только для всех. как заставить его работать как для сервера, так и для пользователя.
LIST_OF_SERVER_IDS = ['3557657657647676', '36567565756766767']
LIST_OF_USER_IDS = ['3557657657647676', '36567565756766767']
def is_any_user(ids):
def predicate(ctx):
return ctx.message.author.id in ids
return commands.check(predicate)
def is_any_server(ids):
def predicate(ctx):
return ctx.message.server.id in ids
return commands.check(predicate)
@bot.command(pass_context=True)
@is_any_user(LIST_OF_USER_IDS)
@is_any_server(LIST_OF_SERVER_IDS)
async def hello(ctx):
await bot.say("Hello {}".format(ctx.message.author.mention))
Определив два декоратора is_any_user
, вы просто сохраните последнее определение и потеряете первый. Дайте серверу проверить более представительное имя (в конце концов, он не проверяет User
s, почему есть "пользователь" в имени). Затем мы можем сохранить два белых списка идентификаторов. Поскольку commands.check
может быть цепочкой, мы просто украшаем нашу команду обеими проверками.
LIST_OF_SERVER_IDS = [3557657657647676, 36567565756766767, 343657687786435432]
LIST_OF_USER_IDS = [1, 2, 3]
# Replace as needed. Keep in mind that 0.16 ids are strings and 1.0 ids are integers
def is_any_user(ids):
def predicate(ctx):
return ctx.message.author.id in ids
return commands.check(predicate)
def is_any_server(ids):
def predicate(ctx):
return ctx.message.server.id in ids
return commands.check(predicate)
@bot.command(pass_context=True)
@is_any_user(LIST_OF_USER_IDS)
@is_any_server(LIST_OF_SERVER_IDS)
async def hello(ctx):
await bot.say("Hello {}".format(ctx.message.author.mention))
Редактировать:
Используйте эту версию проверок, чтобы попробовать и отладить, что происходит
def is_any_user(ids):
def predicate(ctx):
if ctx.message.author.id in ids:
print("Good author")
return True
else:
print("Bad author")
return False
return commands.check(predicate)
def is_any_server(ids):
def predicate(ctx):
if ctx.message.server.id in ids:
print("Good server")
return True
else:
print("Bad server")
return False
return commands.check(predicate)
Edit2:
Вы можете написать чек, который проверяет, находится ли человек в пользовательском "белом" списке или получает доступ к команде с сервера в белом списке серверов.
def whitelists(users, servers):
def predicate(ctx):
return ctx.message.author.id in users or ctx.message.server.id in servers
return commands.check(predicate)
@bot.command(pass_context=True)
@whitelists(LIST_OF_USER_IDS, LIST_OF_SERVER_IDS)
async def hello(ctx):
await bot.say("Hello {}".format(ctx.message.author.mention))