Discord.py сохранение сообщений неизвестного канала в txt-файл

#python #discord #discord.py

Вопрос:

 async def on_message(self, message):  if message.author == self.user:  return   if message.content.lower() == 'hi':  await message.channel.send('hello')   if message.content.lower() == '':  f = open("Path/To/Your/File.txt", "w") # 'r' for reading and 'w' for writing  f.write(""   f.name) # Write inside file  f.close()  

Если кто-то отправляет сообщение по каналу discord, и в сообщении нет слова «привет», я хочу, чтобы оно сохранило неизвестное сообщение в существующий текстовый файл. Без использования клиентских команд или кода.

Комментарии:

1. Является ли сообщение неизвестным, если оно содержит известный термин, но содержит больше содержимого? Например, должен ли «Привет, как дела?» получить ответ или войти в систему? И вы хотите отслеживать только определенный канал? … И что вы подразумеваете под «без использования кода»?

Ответ №1:

Я знаю, что вы просили не получать код, но мне придется это сделать. Эта часть:

 if message.content.lower() == '':  f = open("Path/To/Your/File.txt", "w")  f.write("" f.name)  f.close()  

Кажется, проверяет, отправляет ли пользователь пустое сообщение (должно быть невозможно, так как вам нужно отправить что-то в диссонансе), и открывает Path/To/Your/File.txt в режиме записи и записывает от его имени (File.txt). Кроме того, lower() делает текст строчным, а это не нужно, так как у вас не может быть ничего в верхнем регистре. Кроме того, Путь/К чему бы то ни было означает, что вам придется создать три папки: путь, к и ваш, а затем поместить File.txt в твоем. Вам следует поставить file.txt в вашей текущей папке и измените этот /Путь/на просто file.txt. Он не проверяет, нет ли у бота ответа.
Вы должны полностью удалить этот раздел.

Шаг 1:
Создайте файл с именем like log.txt.
Шаг второй:
Замените этот раздел кода на:

 #checks if the bot has a response knownmessages = ["hi"] #you can add more if message.content not in knownmessages:  f = open("log.txt", "a") #or what you called it. also a for append, it would overwrite otherwise.  f.write(message.content   "n") #n means new line  f.close()  

Вы, кажется, новичок, так что не волнуйтесь. Я помню, когда я был новичком.

Комментарии:

1. Нет, извини, я не это имел в виду. Я имел в виду, что когда кто-то отправляет сообщение, это «неизвестно». Например, «Какая сегодня погода» в текстовом канале, в котором находится бот, и у бота нет ответа на него. И я хочу, чтобы он получил это сообщение и скопировал вставил его в текстовый файл «журнал».

2. итак, если у бота нет ответа, чем поместить его в текстовый файл?

Ответ №2:

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

Итак, вот как вы могли бы структурировать свою on_message функцию:

Определите функцию как async def on_message(self, message)

После этого вы можете проверить, отправили ли вы сообщение:

 if message.author == self.user:  return  

Затем вы можете добавить конкретные ответы для определенных строк:

 if message.content.lower() == "hi":  await message.channel.send("hello")  return  

Вот тут-то и вступает в игру важная часть: Сначала вы создаете контекст с помощью self.get_context(message)

После этого вы должны проверить, можно ли использовать контекст для вызова команды. Если да, то контекст действителен, и вы можете вызвать команду. Если контекст неверен, вы можете записать содержимое в файл.

 if context.valid():  await self.invoke(context)  return  

Если ни одно из этих if предложений не срабатывает, это означает, что у бота нет ответа на сообщение. Так что вы можете записать это в файл.

 with open("path/to/file.txt", 'a') as f: # a for append  f.write(message.content   'n')  

Таким образом, ваш окончательный on_message метод будет:

 async def on_message(self, message):  # Check if the bot sent the message.  if message.author == self.user:  return   # Reply to some predetermined strings of text  if message.content.lower() == "hi":  await message.channel.send("hello")  return    # Create a context from the message  context = await self.create_context(message)   # If the context is valid, then invoke the command  if context.valid:  await self.invoke(context)  return   # Append to file if the bot does not have a respone to the message  with open("path/to/file.txt", 'a') as f:  f.write(message.content   'n')     

Комментарии:

1. Ошибка атрибута: объект ‘MyClient’ не имеет атрибута ‘get_context’

2. @Пикачу Не могли бы вы добавить полный код бота к вопросу?

3. @PikaChu если вы используете наследуемый класс, discord.Client вы можете удалить блоки кода, которые создают контекст, и вызвать его.