Discord.py Команда Hug с изображением - PullRequest
0 голосов
/ 05 августа 2020

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

@client.command(pass_context=True)
async def hug(ctx):

    os.chdir(r"file to the folder holding the images")

    hugs = [discord.File('1.jpg'), discord.File('2.jpg'), discord.File('3.jpg'), discord.File('4.gif'), discord.File('5.gif'), discord.File('6'), discord.File('7.gif'), discord.File('8.gif'), discord.File('9.gif'), discord.File('10.gif'), discord.File('11.gif')]
    hugsrandom = random.choise(hugs)

    await ctx.send(file=hugsrandom)

Я также попытался просто отправить изображение внутри папки с файлом бота и вынул os.chdir, но все равно ничего не отправлено.

Ответы [ 3 ]

1 голос
/ 05 августа 2020

UPDATE2: У меня сработало следующее ... Я почти наверняка ожидал, что ваша проблема в том, что ваши файлы не создаются должным образом. Либо это, либо ваш бот сломан каким-то другим образом. Если вы используете отладчик (скажем, pycharms), вы можете установить точки останова и посмотреть, выполняется ли ваша команда и правильно ли создаются объекты Discord.File

    async def test(self, ctx):
        image = r"C:\Users\name\Desktop\visual-reverse-image-search-v2_intro.jpg"
        import discord
        await ctx.send(file=discord.File(image))

ОБНОВЛЕНИЕ: я не читал далеко достаточно, он должен принимать строковый путь. Вы пробовали отлаживать код, чтобы узнать, успешно ли открывается ваш файл?

Иногда стоит взглянуть на исходный код. Я пошел и посмотрел на discord.File.

class File:
    """A parameter object used for :meth:`abc.Messageable.send`
    for sending file objects.

    Attributes
    -----------
    fp: Union[:class:`str`, :class:`io.BufferedIOBase`]
        A file-like object opened in binary mode and read mode
        or a filename representing a file in the hard drive to
        open.

        .. note::

            If the file-like object passed is opened via ``open`` then the
            modes 'rb' should be used.

            To pass binary data, consider usage of ``io.BytesIO``.
    """
    def __init__(self, fp, filename=None, *, spoiler=False):
        self.fp = fp

        if isinstance(fp, io.IOBase):
            if not (fp.seekable() and fp.readable()):
                raise ValueError('File buffer {!r} must be seekable and readable'.format(fp))
            self.fp = fp
            self._original_pos = fp.tell()
            self._owner = False
        else:
            self.fp = open(fp, 'rb')
            self._original_pos = 0
            self._owner = True

Похоже, он ожидает открытия файла.

0 голосов
/ 05 августа 2020

Вы можете просканировать все пути к файлам в папке и добавить их в список, используя glob .

import glob

hugs = glob.glob("FULL_PATH_HERE/*") # this wil get all the file paths in the foldes.
# ['FULL_PATH_HERE/1.gif', 'FULL_PATH_HERE/2.jpg']
the_hug = random.choice(hugs)

ctx.send(file = discord.File(the_hug))
0 голосов
/ 05 августа 2020

Делать os.chdir() - плохая идея. Это может иметь непредвиденные последствия. Вместо этого выполните:

import os

BASE_DIR = os.path.abspath(__file__)
PICTURE_1_PATH = os.path.join(BASE_DIR, '../pictures/1.jpg')
PICTURE_1_FILE = discord.File(PICTURE_1_PATH)

BASE_DIR - это путь к папке, содержащей файл python. ../pictures/1.jpg - относительный путь к этой папке.

...