#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
вы можете удалить блоки кода, которые создают контекст, и вызвать его.