Ответы пользователя по тегу Discord
  • Проблема сортировки с SQLite 3 на Discord.py Хочу узнать из за чего не работает?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Инициализируйте Embed вне цикла.
    А так же передавайте ctx как первый аргумент.
    async def _top10(ctx):
        embed = discord.Embed(title="Leaderboards", colour=discord.Colour(0x6790a7))
        for member in bot.get_all_members():
            cursor.execute(f"SELECT voice_s,voice_m,voice_h,voice_d message FROM users where id={member.id} ORDER BY txp + 0 DESC LIMIT 5")
            result = cursor.fetchall()
            for i, x in enumerate(result, 1):
                embed.add_field(name=f"#{i}", value=f"{member.name} ``{x[3]}д. {x[2]}ч. {x[1]}м. {x[0]}с.", inline=False)
        await ctx.send(embed=embed)
    Ответ написан
  • Как удалять сообщение с одного канала и отправлять в другой?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Попробуйте это.
    @bot.event
    async def on_message(message):
        if int(message.channel.id) == 1234567890:  # ID-канала в котором будут сообщения для отправки.
            content = message.content  # Получаем содержание сообщения.
            await message.delete()  # Удаляем отправленное сообщение.
            channel = bot.get_channel(1234567890)  # ID-канала куда будут отправлены сообщения.
            await channel.send(content)  # Отправка сообщения с содержанием в нужный нам канал.
    Ответ написан
  • Как упростить код в Embed?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Сделал для вас такое решение, однако это не панацея и ники по типу: "Nick Name" он не найдет.
    Но за то будет отлично работать для ников по типу: "Nickname".
    @bot.command(pass_context = True)
    @commands.has_permissions(administrator = True)
    async def checkuser_user(ctx, arg):
        await ctx.channel.send('Please, wait')
        # Пребираем все пользователей на сервере.
        for guild in bot.guilds:
            for member in guild.members:
                # Сравниваем введенный ник и ники тех кто есть на сервере, убирая идентификатор из ника "#9999" 
                if arg == str(member)[0:-5]:
                    PREFIX = '>'
                    emb = discord.Embed(title = 'User info')
    
                    emb.add_field(name = '{}Bans'.format(PREFIX),value = '0')
                    emb.add_field(name = '{}Kicks'.format(PREFIX),value = '0')
                    emb.add_field(name = '{}Warns'.format(PREFIX),value = '1/3')
                    emb.add_field(name = '{}Ban reason: '.format(PREFIX),value = 'None')
                    emb.add_field(name = '{}Role history'.format(PREFIX),value = 'Verify.')
                    await ctx.send(embed = emb)


    И второй вариант с использованием пакета: fuzzywuzzy
    Этот вариант позволяет более гибко искать нужных пользователей, в том числе, если будет допущена незначительная ошибка в написании ника.

    from fuzzywuzzy import fuzz
    
    @bot.command(pass_context = True)
    @commands.has_permissions(administrator = True)
    async def checkuser_user(ctx, arg):
        await ctx.channel.send('Please, wait')
        # Пребираем все пользователей на сервере.
        for guild in bot.guilds:
            for member in guild.members:
                # Сравниваем введенный ник и ники полученные из списка.
                if fuzz.partial_ratio(arg, str(member)[0:-5]) > 95:  # <- Процент при котором совпадение "успешно".
                    PREFIX = '>'
                    emb = discord.Embed(title = 'User info')
    
                    emb.add_field(name = '{}Bans'.format(PREFIX),value = '0')
                    emb.add_field(name = '{}Kicks'.format(PREFIX),value = '0')
                    emb.add_field(name = '{}Warns'.format(PREFIX),value = '1/3')
                    emb.add_field(name = '{}Ban reason: '.format(PREFIX),value = 'None')
                    emb.add_field(name = '{}Role history'.format(PREFIX),value = 'Verify.')
                    await ctx.send(embed = emb)
    Ответ написан
  • Как заставить бота написать на определённом канале?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Для этого достаточно получить сам канал, чтобы в него что-то отправить.
    Это легко сделать с помощью: bot.get_channel(id_here)
    Но у вас стоит задача, отправлять сообщение в канал, который называется: "report".
    Для этого мы должны перебрать все каналы на нашем сервере и найти с нужным нам названием.
    for channel in ctx.guild.channels:
            if channel.name == "report":
                #Объект канала, который мы будем использовать для отправки сообщения.
                channel = bot.get_channel(channel.id)

    И в итоге, ваш код должен выглядеть следующим образом.
    @bot.command(pass_context=True)
    async def report(ctx, *, arg):
        emb = discord.Embed(title="REPORT", description=f"От пользователя {ctx.author.mention}", colour=discord.Color.red())
        emb.add_field(name="Причина:", value=arg, inline=True)
        # Получаем все каналы в нашей гильдии.
        for channel in ctx.guild.channels:
            if channel.name == "report":
                # Объект канала, который мы будем использовать для отправки сообщения.
                channel = bot.get_channel(channel.id)
                # Отправляем сообщение в нужный нам канал.
                await channel.send(embed=emb)
    Ответ написан
  • Как сделать бота повторяху, но в канал на выбор?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Вы получаете первый аргумент из сообщения, а вам нужно получить все сообщение. Есть два варианта.
    (Как это работает у вас.)
    >Было< два гуся и булочка
    Чтобы ваш бот принял нужный текст и разом отослал его, необходимо обернуть все нужное в кавычки: '
    >'Было два гуся и булочка'<
    В таком случае, будет получено все сообщение в кавычках, а не только первое слово.

    Так же накидал на скорую руку реализацию пересылки сообщения в выбранный канал, где мы получаем все содержание сообщения.
    @bot.command()
    async def forward(ctx, name_channel=None):
        # Получаем id канала по его названию.
        for channel in ctx.guild.channels:
            if channel.name == name_channel:
                channel = bot.get_channel(channel.id)
                # Получаем все содержание сообщения и отсылаем его в нужный нам канал.
                content = ctx.message.content
                await channel.send(content)
    Ответ написан
  • Отправка информации о блокировке в личные сообщения. Как сделать?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Вот пример сообщения пользователю на основе вашей же команды.
    @Bot.command(pass_context=True)
    @commands.has_permissions(administrator=True)
    async def kick(ctx, member: discord.Member, *, reason):
        channel = Bot.get_channel(789968921432031272)
        #Отправляем сообщение пользователю, до кика с сервера
        emb = discord.Embed(title="Вы были кикнуты с нашего замечательного сервера.", description="Приходите еще и получите экстра порцию банов!", colour=discord.Color.blue())
        emb.add_field(name='Кикнул вас негодяй:', value=ctx.message.author)
        await member.send(embed = emb)
        #Теперь можно кикать.
        await member.kick( reason = reason)
        await ctx.channel.purge(limit=0)
        emb = discord.Embed(color=344462)
        emb.add_field(name='✅ Kick пользователя', value='Пользователь {} был кикнут!'.format(member.mention))
        await channel.send(embed = emb)

    Стоит помнить, что если сначала кикнуть пользователя, а потом попытаться отправить ему сообщение, то ничего не выйдет.
    Ответ написан