И так все сказанно
Местоположение
Россия

Достижения

Все достижения (1)

Наибольший вклад в теги

Все теги (4)

Лучшие ответы пользователя

Все ответы (26)
  • Как сделать задержку на команду в боте дискорд?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    У discord.py это уже предусмотрено, вы можете добавить декоратор:
    @commands.cooldown(1, (Время задержки), commands.BucketType.user)


    Для вывода необходимо использовать событие:
    async def on_command_error(ctx, error):
        if isinstance(error, commands.CommandOnCooldown):
            embed = discord.Embed( 
                title = 'Команда на задержке.', 
                description = f'Повторить через `{error.retry_after :.0f} секунд', 
                colour = discord.Color.red() 
            )
    
            return await ctx.send(embed = embed)
    Ответ написан
    3 комментария
  • Как строить Embed из полученного в команде JSON?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Вот как вы просили. Если есть вопросы по использованию - можете написать в коменатрии

    import json
    from discord import Embed
    
    def get_embed(json_):
        embed_json = json.loads(json_)
    
        embed = Embed().from_dict(embed_json)
        return embed
    
    @bot.command(name = 'embed')
    async def embed_send(ctx, channel: discord.TextChannel, *, args):
        embed = get_embed(args)
        
        if channel == "-":
            await ctx.send(embed = embed)
        else:
            await channel.send(embed = embed)
    Ответ написан
    6 комментариев
  • TypeError: Object of type Embed is not JSON serializable. Как исправить?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Как знаю - File не может принимать значение байтов, по-этому сначала можно попробовать конвертировать его в изображение с помощью PIL (Pillow)
    from PIL import Image

    Сам код:
    @commands.command()
    @commands.guild_only()
    async def tweet(self, ctx, *, message):
        api     = nekobot.NekoBot()
        message = str(api.tweet(ctx.author.display_name, message))[18:-59]
      
        async with aiohttp.ClientSession() as ClientSession:
            async with ClientSession.get(message) as reslink:
                res   = await reslink.read()
                data  = io.BytesIO(res)
                image = Image.open(data)
    
                file = io.BytesIO()
    
                image.save(file, format="PNG")
                file.seek(0)
    
                embed = discord.Embed(color = 0x33FF57).set_image(url = "attachment://tweet.png")
                
                await ctx.send(embed = embed, file = discord.File(image, filename="1.png"))


    Если не работает можете комментарий написать, уже у себя потестирую. Сейчас просто не особо времени нет
    Ответ написан
    3 комментария
  • Как сделать внутри команды подпункты?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Ну можно так:

    @commands.group(name = 'buy')
    async def _buy(self, ctx):
        pass
    
    @_buy.command(name = 'lvl')
    async def _buy_lvl(self, ctx, ...): 
        ...
    
    @_buy.command(name = 'items')
    async def _buy_items(self, ctx, ...): 
        ...


    P.S. Код для когов
    Ответ написан
    2 комментария
  • Как сказать что-то от имени бота в Discord?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Функция channel_conv ищет в первом слове канал, если не находит - отправляет None, которое создает при попытке отправки исключение, приводящее к отправке в текущий канал

    ctx, *, text - звездочка означает, что в text будут записываться все идущее после ctx

    split - разбивает строку в список
    isdigit - проверят, является ли строка числом
    replace - заменяет фрагмент в строке на другой данный (В данном случае канал заменяется на пустое место, чтобы в случае отправки в другой канал его не отправляло вместе с текстом)

    async def say(ctx, *, text):
        def channel_conv(text):
            value  = text.split(" ")
            string = value[0]
    
            if string.isdigit():
                return (
                    client.get_channel(int(string)),
                    text.replace(string, "")
                )
            elif string.startswith("<#"):
                return (
                    client.get_channel(int(string[2:20])),
                    text.replace(string, "")
                )
            else:
                return (
                    None,
                    text
                )
    
        try:
            channel = channel_conv(text)
            await channel[0].send(channel[1])
        except:
            await ctx.send(text)


    Так же можно использовать конвертер из оригинальной библиотеки:
    from discord.ext.commands import TextChannelConverter


    Код:
    async def say(ctx, *, text):
        v = text.split(" ")
    
        try:
            channel = await TextChannelConverter().convert(ctx = ctx, argument = v[0])
            await channel.send(text.replace(v[0], ""))
        except:
            await ctx.send(text)
    Ответ написан
    2 комментария