Проблема с al oop, который проверяет участников на сервере Discord. - PullRequest
1 голос
/ 29 мая 2020

Я новичок в Python, поэтому меня это очень сбивает с толку. Я пытаюсь проверить всех участников в списке, где для каждого участника проверяется, является ли это человек A / человек B или ни один из них, а затем выполняется определенная вещь в зависимости от того, является ли это человек или нет. По какой-то причине, когда первым проверяется тот же человек, на которого он проверяется, это говорит о том, что все последующие люди тоже являются этим человеком. Код используется для избавления от всех участников на сервере Discord, кроме нескольких (для сброса после мини-игры).

async def serverreset(ctx):
for member in ctx.message.guild.members:
    print(member)
    if member == "person1#1234" or "person2#2345":
        print(f"Unable to ban {member.display_name}")
    else:
        await member.ban(reason="Reset", delete_message_days=7)
        print(f"Banned {member.display_name}")

Результат запуска программы:

person1#1234
Unable to ban person1
person2#2345
Unable to ban person2
accountthatshouldbebanned#5678
Unable to ban accountthatshouldbebanned

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

То, что происходит, - это строковое представление (т.е. при печати или вставке в строку) объекта-члена - это имя пользователя + дискриминатор. Но когда вы используете объект-член в инструкции, он не преобразует его в строку.

Есть несколько способов go об этом:

if str(member) in ["person1#1234", "person2#2345"]:
    print(f"Unable to ban {member.display_name}")
else:
    # other code

И это будет проверка члена как строки. Альтернативой может быть использование идентификатора (который более «безопасен», поскольку идентификаторы никогда не меняются, но пользователи могут изменять свое имя и дискриминатор).

if member.id in [112233445566778899, 223344556677889900]:
    print(f"Unable to ban {member.display_name}")
else:
    # other code

Еще одна вещь, на которую следует обратить внимание, это то, что когда бот редактирует роли, пытается изменить имя пользователя или выгнать / заблокировать кого-то, и этот человек имеет более высокие привилегии, чем бот (то есть владелец сервера), тогда он выдаст ошибку Forbidden, так как она недостаточно высока в иерархия для выполнения действия.

И последнее, что есть в вашем выражении if, вы проверяете member == "person#1234" or "person2#2345", что на простом английском sh имеет смысл. Однако, когда интерпретатор оценивает операторы, он выполняет их отдельно:

  • if member == "person1#1234"
  • OR
  • if "person2#2345"

Из-за этой второй части он всегда будет оцениваться как True и будет только False, если объект None, но поскольку строка не None, это будет True .

Надеюсь, что это имело смысл.


Ссылки:

1 голос
/ 29 мая 2020

Выражение member == "person1#1234" or "person2#2345" фактически разрешается как ( member == "person1#1234") or ("person2#2345), которое всегда будет вычисляться как True.

Вам нужно использовать member == "person1#1234" or member == "person2#2345".

Вы также можете использовать member in ("person1#1234", "person2#2345")

...