Ответы пользователя по тегу Python
  • Как получить информацию сервера с помощью библиотеки 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))


    И работает он без тех самых непонятных ошибок.
    Ответ написан
    Комментировать
  • Как преобразовать эту строку в 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
    Пользователь, просто пользователь...
    Ожидание взаимодействия должно висеть в цикле.
    Ответ написан
  • Как сделать 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 и откажется выполнять наши хотелки.
    Ответ написан
    Комментировать
  • Ошибка 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()
    Ответ написан
    Комментировать
  • Как отредактировать сообщение бота?

    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 комментарий
  • Как редактировать изображение в 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 комментарий
  • Как заставить бота написать на определённом канале?

    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)
    Ответ написан
    Комментировать
  • Фоновый процесс на python?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    Попробуйте собрать его через pyinstaller с параметром --noconsole
    Выглядеть это должно примерно вот так:
    pyinstaller --noconsole file.py
    Ответ написан
    Комментировать
  • Как сделать бота повторяху, но в канал на выбор?

    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)

    Стоит помнить, что если сначала кикнуть пользователя, а потом попытаться отправить ему сообщение, то ничего не выйдет.
    Ответ написан
  • Python. Как исправить ошибку EOFError: EOF when reading a line?

    retUrn3d
    @retUrn3d
    Пользователь, просто пользователь...
    В вашем случае, вы вероятно используете Python 2, потому что на Python 3 данный код выполняется корректно.
    first = int(input('First number: '))
    second = int(input('Second number: '))
    result = first + second
    print(result)

    Так же проблема может заключаться в том, что некоторые терминалы неправильно обрабатывают ввод
    (Хотя я сам с таким не сталкивался, но читал что и такое бывает в нашем мире)
    Ответ написан