Ответы пользователя по тегу Боты
  • Как пересылать сообщения в Discord по выборке из списка слов?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Для решения проблемы с постоянной пересылкой одного и того же сообщения - запретите боту слушать самого себя.
    @bot.event
    async def on_message(message):
        if message.author != bot.user:  # Если автор сообщения НЕ бот.
            if {i.lower().translate(str.maketrans('', '', string.punctuation)) for i in message.content.split(' ')} \
                    .intersection(set(json.load(open('slyhi.json')))) != set():
                channel = bot.get_channel(894897187593551892)
                await channel.send(f'[Выхваченное Сообщение]:~/// {message.author.mention}: {message.content}')
    
        await bot.process_commands(message)


    Если имеется желание слушать какие-то конкретные канал, просто проверяйте совпадает ли канал в который было отправлено сообщение, с каналоми из списка.
    channels = [1231234234, 1231231234]
    if message.channel.id in channels:
        do_something()
    Ответ написан
    Комментировать
  • Как отредактировать сообщение бота?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Просто возьмите и отредактируйте сообщение бота, а не то что вам передается из контекста.
    @bot.command()
    async def ping(ctx):
        emb = discord.Embed(description=f"Подсчет пинга...")
        msg = await ctx.send(embed=emb)
        getBDping = os.system("ping айпи.сервера")
        emb = discord.Embed(
            description=f"""
            **Пинг Сообщений**
            ``{round(bot.latency * 1000)}мс``\n
            **Пинг Базы**
            ``{getBDping}мс``
            """)
        await msg.edit(embed=emb)
    Ответ написан
    1 комментарий
  • Как поместить параметр в кавычки Discord?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    async def create-item(ctx, item: str, price: int)
    Надеюсь то что нужно было.
    Ответ написан
    Комментировать
  • Как построить Embed из JSON данных?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Используйте метод from_dict()
    Подробнее можно почитать тут
    emb_json = json.load(embed_file)
    emb = discord.Embed.from_dict(emb_json)
            await ctx.send(embed=emb)
    Ответ написан
  • Как сделать добавление/изменение строки в emb при определённом условии (Discord)?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Подготовил для вас простенькое решение, которое поможет вам наглядно понять что и куда.
    @bot.command()
    async def habr(ctx, arg=None):
        await ctx.message.delete()  # Удаляем наше сообщение.
        emb = discord.Embed(title="Хабр", colour=discord.Color.orange())  # Инициализируем эмбед.
        emb.add_field(name='Первое поле', value=f'Реально же первое!')  # Добавляем поле.
        msg = await ctx.send(embed=emb)  # Отправляем сообщение и запоминаем что оно такое красивое есть.
        
        await asyncio.sleep(2)
        
        emb = msg.embeds[0]  # Выдергиваем с нашего отправленного сообщения эмбед и пересобираем его так, как нужно нам.
        for i, item in enumerate(emb.fields):  # Перебираем поля в эмбеде. i - индекс(позиция); item - содержание.
            if arg:  # Если есть аргумент, то добавляем его в наше новое поле.
                emb.add_field(name='Второе поле', value=f'{arg}')
            else:  # Если аргумента нету, то редактируем наше первое поле.
                if "Первое поле" in item.name:
                    emb.set_field_at(index=i, name=item.name, value='Без аргумента? Жаль.', inline=item.inline)
        
        await msg.edit(embed=emb)  # Отправляем отредактированное сообщение.

    И гифка с демонстрацией этого на деле.
    trim.gif
    Ответ написан
    Комментировать
  • Как упростить код в 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)
    Ответ написан
    1 комментарий
  • Как заставить бота написать на определённом канале?

    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)
    Ответ написан
    1 комментарий
  • Отправка информации о блокировке в личные сообщения. Как сделать?

    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)

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