Задать вопрос
  • Как получить информацию сервера с помощью библиотеки python-valve?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Нужно хоть раз в этой жизни открыть документацию. А не пытаться познавать пакет методом тыка.
    ServerQuerier ждет от вас что вы передадите ему аргумент address в виде кортежа('ip', port).

    from valve.source.a2s import *
    
    address = ('212.22.85.2', 27015)
    
    with ServerQuerier(address, timeout=5.0) as server:
        print(server.info()["server_name"])
    
    >> PostBellum HL2 RP | Русский Half-Life 2 Roleplay


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

    Хотя в мире существует классный прекрасный pip install python-a2s более свежий и более легковесный пакет для этих целей.

    import a2s
    
    address = ('37.18.21.235', 27022)
    print(a2s.info(address, timeout=4))


    И работает он без тех самых непонятных ошибок.
    Ответ написан
    Комментировать
  • Как сделать файл с открытым доступом в pydrive?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Стоит лишь просто открыть документацию

    file1 = drive.CreateFile()
    file1.Upload()
    
    # Insert the permission.
    permission = file1.InsertPermission({
                            'type': 'anyone',
                            'value': 'anyone',
                            'role': 'reader'})
    
    print(file1['alternateLink'])  # Display the sharable link.
    Ответ написан
    Комментировать
  • Как преобразовать эту строку в datetime?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Фактически, отличий между вашими строками нету. Главная проблема состоит у вас в том, что миллисекунды %f принимает значение от 1 до 6 символов, и это та причина, по которой вы получаете ошибку.
    Например, если я ручками отрежу лишние цифры, то выйдет такое выражение:
    datetime.strptime("2022-04-27T19:39:14.856697+03:00", "%Y-%m-%dT%H:%M:%S.%f%z")
    
    >> 2022-04-27 19:39:14.856970+03:00

    Так же и для вашей первой строки:
    datetime.strptime("2022-04-27T19:39:14.856697Z", "%Y-%m-%dT%H:%M:%S.%f%z")
    
    >> 2022-04-27 19:39:14.856697+00:00

    Попробуйте использовать dateutil.parser.
    Это избавит вас от лишней работы и тыканья кнопок на клавиатуре.
    import dateutil.parser as dparser
    print("{}".format(dparser.parse("2022-04-27T19:39:14.856697021Z", fuzzy=True)))
    
    >> 2022-04-27 19:39:14.856697+00:00
    Ответ написан
    4 комментария
  • Как я могу передать пользователя в класс?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    После нажатия кнопки, вам вернется взаимодействие. Одним из его атрибутов является автор, который инициировал взаимодействие.
    Со знанием этого, можно уже реализовать вашу задумку по выдаче роли.
    class Verify(disnake.ui.View):
        def __init__(self):
            super().__init__(timeout=180)
            self.db = database.DataBase()
        @disnake.ui.button(label="",style=disnake.ButtonStyle.gray, emoji="", disabled=False)
        async def my_button(self, button: disnake.ui.Button, interaction: disnake.Interaction):
            role = disnake.utils.get(bot.guilds[0].roles, id=1234567890)  # Получаем роль.
            await interaction.author.add_roles(role)  # Выдаем роль.
            await interaction.response.send_message("Done", ephemeral=True)

    Интересный факт, можно фактически не давать никакого ответа пользователю на нажатие кнопки.
    Достаточно намеренно вызвать ошибку при ответе на взаимодействие и следом тихо ее задушить.
    async def no_respond(inter: disnake.Interaction) -> None:
        try:
            await inter.response.send_message('', ephemeral=True)
        except Exception:
            pass
    Ответ написан
    Комментировать
  • Select Menu не работает после одного нажатия,как исправить это?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Ожидание взаимодействия должно висеть в цикле.
    Ответ написан
  • Как добавить тамбнейл в эмбеде с аватаркой человека который зашел на сервер discord.py?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    @client.event
    async def on_member_join(member):
        guild = client.get_guild(321321321)
        channel = guild.get_channel(123123123)
        embed = discord.Embed(title="Добро пожаловать!", description=f"На наш сервер залетел {member.mention}!",
                              color=0xCC974F)
        embed.set_thumbnail(url=member.avatar_url)
        await channel.send(embed=embed)
    Ответ написан
    2 комментария
  • Как сделать timemute?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Как я поглядел, discord.py(Думаю что используете именно его) не имеет такой штуки в виде таймаута юзверя.
    Так что вам необходимо укусить зубами основу основ. В основе основ можно увидеть желанную строчку communication_disabled_until

    Так что перейдем к делу, нам дано: Рука, палец на руке, мозг(опционально).
    bot.session = aiohttp.ClientSession()
    
    @bot.command()
    async def habr(ctx: commands.Context, member: discord.Member, time: int):
        # Авторизация бота.
        headers = {"Authorization": f"Bot {bot.http.token}"}
        url = f"https://discord.com/api/v9/guilds/{ctx.guild.id}/members/{member.id}"
        # Расчет времени "отправки на покушать.". Получаем время именно по utcnow. 
        # В противном случае, рискуем отправить человека кушать до конца времен. Ну почти.
        timeout = (datetime.datetime.utcnow() + datetime.timedelta(minutes=time)).isoformat()
        json = {'communication_disabled_until': timeout}
        # Отправка запроса.
        async with bot.session.patch(url, json=json, headers=headers) as session:
            if session.status == 200:
                await ctx.send(f'Пользователь {member.mention} пошел кушать на {time} минут.')
            await ctx.send(f'Воу-воу! Этого пользователя нельзя отправить кушать')


    Готово.
    Если попытаться откинуть погулять пользователя, который создал канал или имеет права администратора, дискорд нам вернет код 403 и откажется выполнять наши хотелки.
    Ответ написан
    Комментировать
  • Есть ли возможность сделать повторение последних двух сообщений, если они одинаковы?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Попробуйте это решение. Думаю, с чего-то же вам надо начать :)
    # Объявляем глобальную переменную, в которой будет лежать последнее сообщение.
    my_message = None
    
    @bot.event
    async def on_message(message):
        global my_message
        # Если автор сообщения не бот и содержания сообщения соответствует хранимому сообщению, отправляем его.
        if message.author != bot.user:
            if my_message == message.content:
                await message.channel.send(message.content)
            my_message = message.content
    
        await bot.process_commands(message)
    Ответ написан
    1 комментарий
  • Что за ошибка с mention?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Исходя из строчки где вы инициализируете вложение, у вас тот кто грустит в данный момент, пытается грустить сам с собой.
    А если бы вы были чуть внимательными, заметили бы что ctx, не имеет атрибута member
    Еще стоит подметить что аргумент ctx должен быть передан первым.

    Пробуйте и адаптируйте нижеприведенный код под себя.
    @bot.command()
    async def test(ctx, member: discord.Member):
        await ctx.send(f'{ctx.author.name} грустит вместе с {member.name}')


    unknown.png
    Ответ написан
  • Не работает код бота, что делать?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    ctx Должен быть передан первым аргументом.
    Ответ написан
    Комментировать
  • Ошибка discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'str' object has no attribute 'id'?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Достаточно добавить буквально одну строчку к вашему коду.
    role = discord.utils.get(member.guild.roles, id=907678577758203915)
    await member.add_roles(role)
    Ответ написан
    Комментировать
  • Как исправить ошибку с database SQlite в Python?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Попробуйте это решение.
    class DataBase:
    
        def __init__(self, db_file):
            self.conn = sqlite3.connect(db_file)
            self.cur = self.conn.cursor()
    
        # Аргумент arg принимает только кортежи(tuple), иначе ошибка.
        def add_check(self, arg: tuple):
            self.cur.execute("INSERT INTO check VALUES(?, ?);", arg)
            self.conn.commit()
    
    # Создаем экземпляр класса, с указанием на БД.
    db = DataBase('bot_base.db')
    
    # Передаем методу класса add_check кортеж состоящий из user_id и bill_id
    db.add_check((user_id, bill_id))

    Помещение указанных вами значений в базу данных, произойдет в том порядке, в котором вы их поместите в кортеж.

    Например в вашей базе данных имеется таблица в которой есть столбцы name и value, исходя из примера выше, мы передаем кортеж, где первым значением указан user_id, вторым bill_id.
    В результате получится такое. name = user_id, value = bill_id.

    Думаю разжевал предельно понятно и просто.
    Ответ написан
    Комментировать
  • Как пересылать сообщения в 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()
    Ответ написан
    Комментировать
  • Как сделать tempmute или мут на некоторое время?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Это плохой вариант использования, но без лишних затрат.
    Если бот будет перезагружен, во время того как у человека висит "мут". То он с ним навсегда и останется.
    @client.command(pass_context=True)
    @commands.has_any_role(860824791610032189, 876086379665301534)
    
    async def mute( ctx, member: discord.Member, time: int):
        emb = discord.Embed(title="Участник Был Замучен!", colour=discord.Color.blue())
        await ctx.channel.purge(limit=1)
    
        emb.set_author(name=member.name, icon_url=member.avatar_url )
        emb.set_footer(text="Его замутил {}".format(ctx.author.name ), icon_url=ctx.author.avatar_url )
        
        await ctx.send(embed=emb)
        muted_role = discord.utils.get(ctx.message.guild.roles, name="Muted")
        await member.add_roles(muted_role)
        
        # Спим X секунд, перед тем как снять роль.
        await asyncio.sleep(time) 
        # Снимаем роль замученного.
        await member.remove_roles(muted_role)
    Ответ написан
    Комментировать
  • Как редактировать изображение в Embed?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Суть в том, что discord не позволяет прикреплять файлы с компьютера напрямую.
    Однако, это ограничение можно обойти, сначала отправляя файл в какой-то канал, а после тыкая с него ссылку на файл.
    Сделал для вас топорную, но весьма наглядную демонстрацию.
    @bot.command()
    async def test(ctx):
        emb = discord.Embed(title="Image", colour=discord.Color.purple()) # Инициализируем Embed, который будет изменен.
        emb.set_image(url='https://i.imgur.com/mtKT52F.jpeg') # Прикрепляем к Embed'у изображение из интернетов.
        res = await ctx.send(embed=emb)
        new_emb = res.embeds[0] # Получаем наш Embed из первого сообщения.
        file = discord.File('ImageInPc.png', filename="ImageToDiscord.png")
        img_msg = await ctx.send(file=file) # Отправляем картинку в канал, чтобы после этого получить на нее ссылку.
        await asyncio.sleep(5) # Спим для наглядности.
        new_emb.set_image(url=img_msg.attachments[0].url) # img_msg.attachments[0].url - Искомая ссылка на файл.
        await res.edit(embed=new_emb) # Отправляем наш измененный Embed.
    Ответ написан
    Комментировать
  • Как поместить параметр в кавычки 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
    Ответ написан
    Комментировать
  • Как удалять сообщение с одного канала и отправлять в другой?

    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)
    Ответ написан
    1 комментарий