Как изменить изображение, которое пользователь отправляет в Discord, используя Python? - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь создать команду discord, которая использует изображение, которое отправляет пользователь, и накладывает его на заранее заданное изображение.Я просто не знаю, как заставить это работать.

Моя команда называется «burninate», и я пытаюсь наложить огненное изображение поверх изображения, которое публикует пользователь, но я не знаю, как правильнозаставьте бота использовать изображение, предоставленное пользователем.Я попробовал message.attachments и получил ошибку имени, говоря, что «message» нигде не определено в моем коде, когда явно работают мои другие команды, использующие его.

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

@client.command(name='burninate',
            description="Post a static image to burn!",)
async def burninate():
    burnfile=r"C:\Users\Username\Pictures\fire.png"
    providedimage = Image.open (message.attachments)
    fire = Image.open (burnfile)
    burninate = Image.new("RGBA", providedimage.size)
    burninate = Image.alpha_composite(burninate, fire)
    burninate.save("burninate.png")
    await client.send_file(message.channel, "burninate.png")

Я использую asyncio.Я предоставлю блок кода, который я сделал, который работает.хотя он не использует входные данные от пользователя.

@client.command(pass_context=True)
async def morph(ctx):
    folderbase=r"C:\Users\username\Pictures\Cosmic\Babies+Markings\Loga\Base"
    foldermarks=r"C:\Users\username\Pictures\Cosmic\Babies+Markings\Loga\Markings"
    foldereyes=r"C:\Users\username\Pictures\Cosmic\Babies+Markings\Loga\Eyes"
    shading=r"C:\Users\username\Pictures\Cosmic\Babies+Markings\Loga\Shading\Lineart.png"
    a=random.choice(os.listdir(folderbase))
    a2=random.choice(os.listdir(foldereyes))
    a3=random.choice(os.listdir(foldermarks))
    #os.open(a, os.O_RDWR)
    file1 = folderbase+'\\'+a
    file2 = foldereyes+'\\'+a2
    file3 = foldermarks+'\\'+a3
    file4 = shading
    im1 = Image.open(file1)
    im2 = Image.open(file2)
    im3 = Image.open(file3)
    shade = Image.open(file4)
    final2 = Image.new("RGBA", im1.size)
    final2 = Image.alpha_composite(final2, im2)
    final2 = Image.alpha_composite(final2, im1)
    final2 = Image.alpha_composite(final2, im3)
    final2 = Image.alpha_composite(final2, shade)
    final2.save("morph.png")
    await client.send_file(ctx.message.channel, "morph.png")

Это всего лишь четыре слоя, создающие случайного инопланетного динозавра

1 Ответ

0 голосов
/ 22 мая 2018

Основное различие между командой, которая не работает, и командой, которая работает, заключается в том, что в рабочей команде вы указываете pass_context=true в декораторе команды.Это говорит о том, какую среду вы используете для передачи объекта контекста в командную функцию - это аргумент ctx для morph, и из кода я вижу, что он имеет атрибут .message.

Вы должны изменить функцию burninate так, чтобы она выглядела следующим образом:

@client.command(name='burninate',
        description="Post a static image to burn!",
        pass_context=True)
async def burninate(ctx):
    burnfile=r"C:\Users\Username\Pictures\fire.png"
    providedimage = Image.open (ctx.message.attachments)
    fire = Image.open (burnfile)
    burninate = Image.new("RGBA", providedimage.size)
    burninate = Image.alpha_composite(burninate, fire)
    burninate.save("burninate.png")
    await client.send_file(ctx.message.channel, "burninate.png")

Это изменит места, где вы используете message в теле функции, чтобы использовать ctx.message.Это должно избавить от ошибки «сообщение» не определено.

...