Ограничить Команды

1

Я получил этот код, который блокирует доступ к команде ?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))
Теги:
python-3.x
discord
discord.py

1 ответ

1
Лучший ответ

Определив два декоратора 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))
  • 0
    @Demotry Я предполагаю, что это не те идентификаторы, которые вы используете в своей программе. Вы должны увидеть какой-то вывод в терминале, на котором вы запускаете бота. Это должно по крайней мере сказать вам, какая из проверок не проходит.
  • 0
    @Demotry Я добавил несколько утверждений для дублирования в приведенном выше. Попробуйте запустить их, чтобы увидеть, где проверка не проходит. Дважды проверьте идентификаторы в вашем списке (убедитесь, что они являются строками, если вы используете версию 0.16, и целочисленными значениями, если вы используете версию 1.0). Вы видите какую-либо ошибку в терминале?
Показать ещё 20 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню