Ответы пользователя по тегу Discord
  • Как сказать что-то от имени бота в 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 комментария
  • Как узнать пользовательский статус?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    В discord.py подразумевается, что у пользователя может быть 3 вида статусов (Мобильный, Веб и Десктопный)

    А так попробуйте так:
    if str(member.status) == 'online':
         d = "<:online2:842130462038425653> В сети"
    elif str(member.status) == 'idle':
         d = "<:away:842130479339667497> Не активен"
    elif str(member.status) == 'dnd':
         d = "<:dnd2:842130417406181436> Не беспокоить"
    elif str(member.status) == 'offline':
         d  = "<:offline2:842130438209536000> Не в сети"
    elif str(member.status) == "streaming":
        d = "<:streaming:846048619571314719> Стримит"
    Ответ написан
    Комментировать
  • Как удалить роль у пользователя по истечении времени?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Попробуйте так

    import asyncio
    
    async def ping(ctx):
        role = ctx.guild.get_role(863103946063478824) 
        await ctx.author.add_roles(role, reason=None)
        await asyncio.sleep(300)
        await ctx.author.remove_roles(role, reason=None)
    Ответ написан
  • Как получить ID список участников в Discord сервера зная лишь его ID?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    У вас тут несколько вариантов
    @bot.command(name = "get-users") # Вместо bot пишете то, как вы обозвали его (client, app, mybot и т.п.)
    async def get_users_(ctx, id):
        guild   = bot.get_guild(id)
        members = guild.members
    
        # Дальше делаете что вам нужно


    2 вариант
    @bot.command(name = "get-users") 
    async def get_users_(ctx, id):
        guild   = await bot.fetch_guild(id)
        members = guild.members
    
        # Дальше делаете что вам нужно


    3 вариант:
    @bot.command(name = "get-users") # Вместо bot пишете то, как вы обозвали его (client, app, mybot и т.п.)
    async def get_users_(ctx, id):
        for guild in bot.guilds:
            if guild.id == id:
                members = guild.members
                break
    
        # Дальше делаете что вам нужно


    Для получения ID всех можно сделать так:
    users_list = []
    
    for member in members:
        users_list.append(member.id)
    Ответ написан
  • Fetch_member в функции?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Можете использовать bot.get_guild(id)

    Если у вас коги, то это в классе делать и там уже self.bot.get_guild(id)
    Ответ написан
    Комментировать
  • Как отправить эмодзи через discord.py?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Надо использовать полное имя эмодзи.
    Его можно получить, набрав само эмодзи и поставив перед ним знак \.

    Само полное название будет формата: <:имя_эмодзи:id_эмодзи>
    Ответ написан
  • 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
    У 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 комментария
  • В чем проблема возврата Missing Access?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Попробуйте вместо guildid использовать channelid
    (Я мало на discord вместе с js практикуюсь, но возможно может помочь)

    u = await fetch("https://discordapp.com/api/v9/guilds/<channelid>/members/"+u.id,{headers: {Authorization:"Bot <token>"}}).then(r => r.json());
    Ответ написан
  • Как исправить missing permission?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Данная ошибка означает, что у бота нет необходимых прав для очистки канала.
    Просто необходимо выдать боту права и все будет работать
    Ответ написан
    Комментировать
  • Как сделать внутри команды подпункты?

    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 комментария
  • Как Найти канал по названию и отправить в него сообщение?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    @bot.command()
    async def send(ctx):
        for channel in ctx.author.guild.channels:
            if channel.name == ТУТ_НАЗВАНИЕ_КАНАЛА:
                await channel.send(ТУТ_СООБЩЕНИЕ)


    Если надо чтобы все серверы проверяло:
    @bot.command()
    async def send(ctx):
        for guild in bot.guilds:
            for channel in guild.channels:
                if channel.name == ТУТ_НАЗВАНИЕ_КАНАЛА:
                    await channel.send(ТУТ_СООБЩЕНИЕ)
    Ответ написан
    Комментировать
  • Не работает on_member_join. Как исправить?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    Если вы не знали - коги создаются отдельными файлами. И в предоставленном вами коде я не вижу client.run(), внутри которого указывается токен.

    Вот пример как можно изменить ваш код, при этом он должен работать (Если не работает - упомяните в комментарии, я проверю ошибки и исправлю)

    Основной файл:
    main.py
    import discord
    
    from discord.ext import commands
    
    
    client = commands.Bot(
        command_prefix = "Тут любой префикс",
        intents        = discord.Intents().all()
    )
    
    client.load_extension("Welcome")
    
    client.run("Тут должен быть токен")


    Файл кога (На заметку: Данный код рассчитан, что они будут в одной папке)
    Welcome.py
    import discord
    
    from discord.ext import commands
    
    
    class Welcome(commands.Cog):
        def __init__(self, client):
            self.client = client
    
        @commands.Cog.listener()
        async def on_member_join(self, member):
            welcome     = 'Чтобы попасть на сервер тебе нужно пройти верификацию. Ты готов?\n`по возможности ответь "да, хорошо"`'
            channel_age = self.client.get_channel(847966940844261448)
            embed       = discord.Embed(
                title       = f"{member.name} добро пожаловать на сервер!", 
                description = f"{member.guild.name} приветствует тебя!"
            ).set_thumbnail(url = member.avatar_url)
    
            await channel_age.send(embed = embed)
            await channel_age.send(welcome)
    
    def setup(client):
        client.add_cog(Welcome(client))
    Ответ написан
    Комментировать
  • Как строить 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 комментариев
  • Как в Discord.py сделать создание приваток на 2 серверах?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    В вашем коде указана такие строки как:
    for guild in Bot.guilds:
        maincategory = discord.utils.get(guild.categories, id=848659633664032829)


    Стоит учесть, что название категорий у каждого сервера разные.
    Вот, по идеи данный код должен работать (Если не работает, напишите в коментариях, проверю уже полностью что да как):
    @Bot.event
    async def on_voice_state_update(member, before, after):
        if after.channel != None:
            if after.channel.id == 843730990408007698:
                category = after.channel.category
                
                channel2 = await member.guild.create_voice_channel(
                    name     = f' || { member.display_name }', 
                    category = category
                )
                
                await channel2.set_permissions(member, connect = True)
                await member.move_to(channel2)
    
                def check(x, y, z): return len(channel2.members) == 0
                
                await Bot.wait_for('voice_state_update', check = check)
                await channel2.delete()
    Ответ написан
  • Как сделать что бы при вводе команды бот выдавал роль?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    1. При написании была допущена ошибка в слове discord (Лишняя s сзади)
    2. Для использования discord.utils - его надо импортировать отдельно
    3. (Это конечно ваше дело) Меня напрягают как у вас прописаны интесты, вы сначала их задаете на сообщения и сервера, потом устанавливаете дефолтные с пользователями (Проще тогда уже использовать discord.Intents.all())

    import discord
    import discord.utils
    
    from discord.ext import commands
    
    intents = discord.Intents(messages=True, guilds=True)
    intents = discord.Intents.default()
    intents.members = True
    
    client = commands.Bot(command_prefix='!', intents=intents)
    
    @client.event
    async def on_ready():
        await client.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name="#Общение"))
        print("Bot is ready!")
    
    @client.command()
    async def admin(ctx):
      member = ctx.author
      role   = discord.utils.get(member.guild.roles, id = 852691194433503232)
      
      await member.add_roles(role)
    Ответ написан
    Комментировать
  • Как указать переменную вне Асинхронного кода в этот самый код?

    Allan-BlackWell
    @Allan-BlackWell
    Ничтожество :D
    1. Необязательно использовать on_message 2 раза, вам только выдаст ошибку.
    2. Можно использовать переменную global для полного доступа к переменной из кода

    import discord
    
    client = discord.Client()
    Matrix = "▢"
    
    @client.event
    async def on_ready():
        print('We have logged in as {0.user}'.format(client))
    
    @client.event
    async def on_message(message):
        global Matrix
    
        if message.content.startswith("#on"):
            Matrixsend = Matrix.replace(Matrix[0], "▣")
            Matrix     = Matrixsend
        
            await message.channel.send(''+str(Matrix))
      
        if message.content.startswith("#off"):
            Matrixsend = Matrix.replace(Matrix[0], "▢")
            Matrix     = Matrixsend
        
            await message.channel.send(''+str(Matrix))
    
    client.run("Тут могла быть ваша реклама")
    Ответ написан
    Комментировать