Python Discord Bot. Как сохранить текст сообщения в файл?

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

На всякий случай напишу все три версии так как не знаю для какой вам будет легче писать правки. Да и возможно они будут просто не исправимыми костылями Здесь я оставлю только третью, а первые две сможете посмотреть по ссылке ниже

@Bot.command()
async def nhw(ctx, Leson, Time):

    with open('C:\\Prog\\Kaktus\\Kaktus.txt','r') as f:
        baza=json.load(f)

    await ctx.send('ok,whate make?')
    await Bot.wait_for('message')

@Bot.command()
async def M(ctx):
    Make = ctx
    print(Make)

    x = 0
    while x in baza:
        x=x+1

    baza [x]= {}
    baza[x]['Lesson'] = Leson
    baza[x]['Home Woke'] = Make
    baza[x]['Deadline'] = Time


    with open('C:\\Prog\\Kaktus\\Kaktus.txt','w') as f:
        json.dump(baza,f)

https://drive.google.com/drive/folders/14G81hUTxzE52dNZ094anuK4s9KFkiksk?usp=sharing


Ответы (1 шт):

Автор решения: denisnumb

Почитайте как работает метод wait_for(). Он не привязывается к какой-то функции async def on_message(), а принимает в качестве второго аргумента обычную функцию, которую нужно вызывать при получении сообщения. Далее ваш код нужно просто переоформить, под этот метод и все заработает:

Я также поправил некоторые моменты, все комментарии в коде

@bot.command()
async def nhw(ctx):
    # если не удается считать базу (файл не найден или еще какая-то проблема)
    # то будет создаваться новая, пустая база
    try:
        with open('C:\\Prog\\Kaktus\\Kaktus.txt','r') as f:
            baza = json.load(f)
    except:
        baza = {}

    # функция, возвращающая сообщение, ожидаемое из wait_for
    def check(message):
        # если автор ожидаемого сообщения - автор команды nhw, то это сообщение можно принять
        # проверка нужна, чтобы другие пользователи не мешали выполнению команды своими сообщениями
        if message.author == ctx.author:
            return message

    await ctx.send('Lesson?') 
    lesson_message = await bot.wait_for('message', check=check)

    await ctx.send('What make?')
    what_make_message = await bot.wait_for('message', check=check)

    await ctx.send('Deadline?')
    deadline_message = await bot.wait_for('message', check=check)

    baza[lesson_message.content] = {
        'you mast': what_make_message.content,
        'Dedline': deadline_message.content
    }

    with open('C:\\Prog\\Kaktus\\Kaktus.txt','w') as f:
        # чтобы вместо '\u0435' и т.п. писались кириллические симолы
        # можно указать параметр ensure_ascii=False

        # для удобного чтения файла можно добавить параметр отступов
        # indent=4 (где 4 - количество пробелов)
        json.dump(baza, f, ensure_ascii=False, indent=4)
→ Ссылка