Нужно заставить Discord бота на python читать txt документ с айди пользователей и сравнивать их с айди автора сообщения
Я решил привести пример с командой clear. У меня есть текстовый документ, в котором хранятся айди пользователей, которые могут пользоваться всеми функциями бота. Документ выглядит вот так:
123123498992302 #айди первого пользователя
294188943112399 #айди второго пользователя
123341321451234 #айди третьего пользователя
Я использую коги, поэтому мой код выглядит так:
@commands.command(pass_context=True)
async def clear(self, ctx, limit):
if ctx.author.id == adminid:
await ctx.message.delete()
limit = int(limit)
deleted = await ctx.channel.purge(limit=limit)
cofirmdelete_embed = discord.Embed(title='Почистил чат', description=f'Удалил {len(deleted)} сообщений в #{ctx.channel}', color=0x4fff4d)
await ctx.channel.send(embed=cofirmdelete_embed, delete_after=10.0)
else:
await ctx.channel.send('</ERROR: Эта команда доступна только пользователям из админлиста>')
Я не очень умею работать с with open(), поэтому чтение файла и взятие айди для админлиста выглядят так:
with open("adminlist.txt","r", newline = "\n") as f:
adminid = f.readlines()
Весь вопрос в этой строчке if ctx.author.id == adminid: и в том, как мне сделать нормальное чтение txt файла и взятие оттуда айди админов бота, чтобы нормально сравнивать их с айди автора сообщения.
Ошибок в терминале не выдает, но пишет "</ERROR: Эта команда доступна только пользователям из админлиста>", так как я задал параметр else для случая, если айди автора не совпадает с одним из айди пользователей из админлиста. (Естественно, моё айди есть в админлисте, но он пишет, что нет, так как неправильно читает txt файл)
Ответы (1 шт):
f.readlines() считывает отдельные строки файла в список, а это значит, что переменная adminid имеет следующее значение:
['123123498992302', '294188943112399', '123341321451234']
Идентификаторы хранятся именно в виде str, а не int, т.к. из файла считывается именно текст.
Таким образом, когда вы выполняете это сравнение
if ctx.author.id == adminid
Вы фактически сравниваете список строк и число, то есть
['123123498992302', '294188943112399', '123341321451234'] == 1234567890...
Думаю, понятно, почему проверка на админа не проходит корректно.
Чтобы решить проблему, достаточно сделать 2 действия:
- Привести все элементы списка к числовому типу
int:
with open("adminlist.txt","r", newline = "\n") as f:
# [123123498992302, 294188943112399, 123341321451234]
adminid = list(map(int, f.readlines()))
- Проверять именно наличие
idв списке, а не равенство со списком
if ctx.author.id in adminid:
. . .
Ну, а вообще, чтобы не возиться со считыванием файла и приведением типов, можете научиться работать с модулем json.
Тогда сохранить данные можно будет так:
import json
data = [123123498992302, 294188943112399, 123341321451234]
with open('file.txt', 'w', encoding='utf-8') as file:
file.write(json.dumps(data, ensure_ascii=False, indent=4))
А считать так. Причем, считается сразу же список чисел.
import json
with open('file.txt', 'r', encoding='utf-8') as file:
data = json.load(file)
Разумеется, можно организовывать более сложное хранение данных, типа список списков или словарей.