Не уверен, как преобразовать строку в полезные данные discord

#python #discord #discord.py

#python #Discord #discord.py

Вопрос:

Я пытаюсь создать систему для моего бота discord для хранения данных о сообщении в текстовом файле. Для этого информация о сообщении превращается в строку. Проблема в том, что я получаю сообщение об ошибке, когда пытаюсь использовать эти данные. Например, когда я пытаюсь выполнить message.remove_reaction, я получаю это сообщение об ошибке:

 File "main.py", line 195, in on_raw_reaction_add
    await message.remove_reaction("✅", payload.member)
AttributeError: 'str' object has no attribute 'remove_reaction'
 

Я конвертирую текстовый файл в список и преобразую его обратно в переменную. Например, message = file_data[5] . Вот код, который извлекает данные из текстовых файлов.

 for x in fileNames:
    f = open(x, "r ")
    messageid = f.readline()
    #creates list if message id match is found
    if (int(messageid) == int(payload.message_id)):
      p = open(x, "r ")
      global file_name
      file_name = p
      for x in p:
        file = x.rstrip('n')
        file_data.append(file)
      break
  print(file_data)
  #assigning variables from list
  messageid = file_data[0]
  in_embed = file_data[2]
  game_actual = file_data[3]
  goal_actual = file_data[4]
  message = file_data[5]
  names = []
  #stores member information onto seperate list
  for x in range(6,len(file_data)):
    names.append(x)
 

Список перед превращением их в переменные:

 ['814375931497021490', '811857283771662340', "<Message id=814375932051456000 channel=<TextChannel id=811857283771662340 name='general' position=0 nsfw=False news=False category_id=811857283771662338> type=<MessageType.default: 0> author=<Member id=810761971979911188 name='CockGobbler' discriminator='2337' bot=True nick=None guild=<Guild id=811857283771662337 name='Bot Test 2' shard_id=None chunked=False member_count=2>> flags=<MessageFlags value=0>>", 'game2', '2', "<Message id=814375931497021490 channel=<TextChannel id=811857283771662340 name='general' position=0 nsfw=False news=False category_id=811857283771662338> type=<MessageType.default: 0> author=<Member id=810761971979911188 name='CockGobbler' discriminator='2337' bot=True nick=None guild=<Guild id=811857283771662337 name='Bot Test 2' shard_id=None chunked=False member_count=2>> flags=<MessageFlags value=0>>"]
 

Ответ №1:

Ваш код не показывает, как вы преобразуете строку Message в строку или что вы пытаетесь с ней сделать, но в целом я бы посоветовал вам не преобразовывать ее в строку.

Лучшим подходом было бы сохранить Message.content то, что уже является строкой реального содержимого сообщения, на случай, если вы хотите получить доступ к содержимому. Или вы могли бы сохранить Message.id и когда вам нужно, чтобы ваш Message объект использовал функцию, например:

 await message.remove_reaction
 

Что бы вы сделали, это просто извлечение Message объекта (или PartialMessage в данном случае):

 my_message = get_partial_message(message_ID)
await my_message.remove_reaction("✅", payload.member)
 

Ответ №2:

Вы сохраняете и считываете все как строки, когда они действительно должны быть прочитаны как определенные классы, как определено discord.py . У вас есть несколько вариантов решения вашей проблемы.

  1. Рассол

Определите выбираемый класс. Создайте класс с атрибутами, которые соответствуют тем данным, которые вы хотите получить из сообщения. Затем вы можете dump этот объект, то есть превратить его в файл, а затем load в него, то есть превратить его обратно в пригодный для использования код python.

  1. Вручную превратите ваши file_data в правильные объекты

Просмотрите документацию к сообщению и исходный код сообщения и проверьте, какого типа должна быть каждая часть сообщения, прежде чем пытаться их использовать.