• Как делать каждый пиксель всё тускнее?

    @twistfire92
    Python backend developer
    ну как-то так. шаг понижения яркости рассчитал и все
    color = 0.9
    step = 0.9/len(snake[1])
    for pix in snake[1]:
      pygame.draw.rect(screen, [i*color for i in snake[0]["color"]],  [pix[0], pix[1], 10, 10])
      color -= step
    Ответ написан
    1 комментарий
  • Как не повторять рандомный вывод со списка?

    @MrColdCoffee
    web
    import copy
    import random
    
    words = ["вперед", "назад", "вверх", "вниз"]
    first = ''
    for i in range(15):
        a = random.choice(words)
        if a == first:
            dopseq = words.copy()
            dopseq.remove(first)
            a = random.choice( dopseq )
        first = a
        print(a)
    Ответ написан
    6 комментариев
  • Как из строки создать список с определёнными критериями...?

    @alexbprofit
    Junior SE
    messageBefore = "[||~~6991~~||][||~~23838~~||][||~~-18993~~||][||~~4729~~||][**7**][||~~4713~~||][||~~367~~||]"
    
    x = messageBefore.lstrip('[')
    y = x.rstrip(']')
    
    result = y.split('][')
    Ответ написан
    3 комментария
  • Discord.py как сделать шаблонный движок?

    @mrxor
    Simple is better than complex
    Используйте готовый. Например Jinja.
    Ответ написан
    Комментировать
  • Discord.py как в боте реализовать новую систему ответов дискорда?

    Функция ответов сравнительно новая, и стабильных версий библиотеки с ней пока нет.

    Есть два варианта на текущий момент:
    1. Использовать последнюю версию библиотеки с GitHub.
    В данном случае Вы сможете использовать новые методы. На данный момент собранной документации к ним нет, поэтому придётся читать исходники библиотеки, или пользоваться встроенной в python документацией.
    Само изменение с добавлением ответов: d1cb30cccf39648e21c0f7c73cb087fc730b8e25
    # примеры использования, на данный момент, может измениться в будущем:
    await ctx.send("my reply to your message", reference=discord.MessageReference(message_id=861988287927326702, channel_id=554470291913241936))
    await ctx.send("my reply to your message", reference=discord.MessageReference.from_message(ctx.message))
    await ctx.send("my reply to your message", reference=ctx.message.to_reference())
    await ctx.reply("my reply to your message", mention_author=False)


    2. Делать запрос к API discord'а вручную:
    await bot.http.request(
        discord.http.Route(
            "POST", "/channels/{channel_id}/messages", channel_id=ctx.channel.id
        ),
        json={
            "content": "test",
            "message_reference": {
                "guild_id": "453391932705247478",
                "channel_id": "554470291913241936",
                "message_id": "861988287927326702",
            },
        },
    )
    Ответ написан
    Комментировать
  • Что такое шард в дискорд боте?

    https://discord.com/developers/docs/topics/gateway...
    As bots grow and are added to an increasing number of guilds, some developers may find it necessary to break or split portions of their bots operations into separate logical processes. As such, Discord gateways implement a method of user-controlled guild sharding which allows for splitting events across a number of gateway connections. Guild sharding is entirely user controlled, and requires no state-sharing between separate connections to operate


    В то время как боты растут, и растёт количество серверов, некоторые разработчики могут посчитать нужным разбавлять или разделять операции ботов на несколько логических процессов. Поэтому, Discord gateway (то, к чему бот подключается через websockets для прослушивания событий, и контроля статуса) представляют метод разделения серверов пользователем, который допускает разделение событий на несколько подключений к gateway. Разделение серверов полностью контроллируется пользователем, и не требует общего доступа меж разных подключений для управления.
    Ответ написан
    Комментировать
  • Что такое шард в дискорд боте?

    Alexandre888
    @Alexandre888 Куратор тега Боты
    Javascript-разработчик
    Шардирование (горизонтальное партиционирование) — это принцип проектирования базы данных, при котором логически независимые строки таблицы базы данных хранятся раздельно, заранее сгруппированные в секции, которые, в свою очередь, размещаются на разных, физически и логически независимых серверах базы данных, при этом один физический узел кластера может содержать несколько серверов баз данных.

    https://ru.bmstu.wiki/%D0%A8%D0%B0%D1%80%D0%B4%D0%...
    Ответ написан
    1 комментарий
  • Discord.py как сделать глобальный чат?

    Через discord.utils.get вы получаете канал того сервера, в котором было написано сообщение.

    Он принадлежит тому серверу, в котором написано сообщение. Объект канала с таким же названием на других серверах будет другим.

    Следовательно: вам нужно искать канал на том сервере, на который сообщение отправляется
    GLOBAL_CHAT = 'глобальный-чат'  # PEP8: Названия констант пишутся капсом
    
    @client.event
    async def on_message(message):
        channel = discord.utils.get(message.guild.text_channels, name=GLOBAL_CHAT)
        if message.author.id == client.user.id:
            return  # return предотвратит выполнение следующего кода
        if message.channel.id != channel.id:
            return
        await message.delete()  # удаляем сообщение один раз
        for guild in client.guilds:
            if channel := discord.utils.get(guild.text_channels, name=GLOBAL_CHAT):
                # py3.8: walrus operator ("моржовый" оператор)
                # равносильно следующему:
                # channel = discord.utils.get(guild.text_channels, name=GLOBAL_CHAT)
                # if channel: ...
                try:
                    await channel.send('**{0.author}:** {0.content}'.format(message))
                except discord.Forbidden:
                    print(f"Невозможно отправить сообщение на сервер {guild.name}: Недостаточно прав")
                except discord.HTTPException as e:
                    print(f"Невозможно отправить сообщение на сервер {guild.name}: {e}")
    Ответ написан
    1 комментарий
  • Discord.py Как вывести переменную в одной команде с другой?

    Taruu
    @Taruu
    Шкодер на Python, и немного на C/С++ lua...
    В данном случае нужно использовать Class
    class MyClass:
        @client.command()
        async def _init_(sefl,ctx):
            self.moder = None
            embed = discord.Embed(
                title='Это мой заголовок',
                description='Это мой основной текст',
                color=0x83c837)
            self.moder = await ctx.send(embed=embed)
    
        @client.command()
        async def test(sefl,ctx):
            await ctx.send(
                self.moder
            )

    Очень советую посмотреть что такое асинхронное программирование и почему там явно не место global переменным :/
    Ответ написан
    Комментировать
  • Как очищать сообщения указанного пользователя?

    TextChannel.purge()
    @commands.command()
    async def clear(ctx, user: discord.Member):
        await ctx.channel.purge(limit=None, check=lambda m: m.author==user)
    Ответ написан
    1 комментарий
  • Discord.py как в статусе бота выводить кол-во серверов на которых он находится?

    Gear_up
    @Gear_up
    Эвент метод on_ready() работает только при запуске самого бота
    Стоит просто заменить on_ready() на on_server_join(server).
    Аргумент server обязателен.
    Более подробно здесь
    Ответ написан
    1 комментарий
  • Discord.py Почему бот не воспроизводит длинную музыку с youtubе?

    @Soneiko
    Дело не в том что он их не воспроизводит, а скачивает долго. Советую для музыкального бота использовать Lavalink.jar
    Ответ написан
    Комментировать
  • Discord.py Как сделать вывод участников на сервере?

    otomir23
    @otomir23
    Frontend Developer
    @client.event
    async def on_message( message ):
        if message.content.startswith('member'):
            await message.channel.send('\n'.join(['\n'.join([member for member in guild.members]) for guild in client.guilds]))
    Ответ написан
    Комментировать
  • Чем заменить функцию .map() в моем случае?

    @askhat
    На вопрос ответил автор вопроса, я в свою очередь попытаюсь объяснить что произошло.

    Рендер в реакте всегда идёт по наименее трудозатратному пути, а именно вычисляет дельту (разницу) между новым стейтом и предыдущим, если таковой имеется. Например:

    class TodoList extends React.Component {
      state = {
        todos: [
          'Commit',
          'Push'
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li>{ todo }</li>
          }
        </ul>
      }
    }


    Если стейт компонента изменится, скажем при добавление элемента в начало списка todos, так что он станет таким:

    const todos = [
      'Init',
      'Commit',
      'Push'
    ]


    Реакт вычислит два древа VirtualDOM:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // <- разница начинается здесь и до конца древа
      <li>Commit</li>
      <li>Push</li>
    </ul>


    Здесь выполняется работа которой можно было бы избежать. К примеру если бы элемент был добавлен в конец списка:

    const todos = [
      'Commit',
      'Push',
      'Merge'
    ]


    То реакт получил бы на сравнение другие два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li>
      <li>Push</li>
    </ul>
    // Добавлен элемент
    <ul>
      <li>Commit</li>
      <li>Push</li>
      <li>Merge</li> <- разница начинается здесь, от начала и до сих по ничего не менялось
    </ul>


    Дельта этих двух списков меньше, а значит и работы нужно сделать меньше.

    Совершенно очевидно что <li>Commit</li> и <li>Push</li> не менялись, однако реакт недостаточно умён чтобы это понять. Чтобы помочь ему следует воспользоваться специальным пропом key={}. Он может быть значением любого типа, единственно требование — значение должно стабильно идентифицировать соответствующие данные.

    Если бы компонент выглядел так:

    class TodoList extends React.Component {
      state = {
        todos: [
          { id: 0, text: 'Commit' },
          { id: 1, text: 'Push' }
        ]
      }
      render() {
        return <ul>
          {this.state.todos.map(item => {
            return <li key={todo.id}>{ todo.text }</li>
          }
        </ul>
      }
    }


    То добавление элемента в начало массива, породило бы следующий стейт:

    const todos = [
      { id: 2, text: 'Init' },
      { id: 0, text: 'Commit' },
      { id: 1, text: 'Push' }
    ]


    И, снова, два древа элементов:

    // Начальный стейт
    <ul>
      <li>Commit</li> // id 0
      <li>Push</li> // id 1
    </ul>
    // Добавлен элемент
    <ul>
      <li>Init</li> // id 2 новый элемент отобразится в начале
      <li>Commit</li> // id 0
      <li>Push</li> // id 1 
    </ul>


    Благодаря подсказке, реакт не учтёт в дельте элементы чьи идентификаторы не изменились, и, как следствие, не будет делать лишних действий.

    Таким образом использовать индекс в массиве в качестве ключа — не лучшая идея, особенно если массив будет меняться. По той же причине не следует использовать Math.random() в качестве ключа, так вы почти гарантировано будете всегда получать нестабильные идентификаторы.

    Подробнее об этом можно почитать здесь — Reconciliation.
    Ответ написан
    5 комментариев
  • Discord.py Сохранение mp3 файла на хостинге?

    @s4q
    Ниже код. Перед запуском нужно установить на хостинг FFMpeg (не pip), youtube-dl (pip), PyNaCl (pip) и написать команду "pip install discord.py[voice]".
    Это полный код для проигрывания музыки, включая join и leave.

    import os
    from discord.utils import get
    import youtube_dl
    
    # Ржака и другие Voice Chat
    
    # Join
    @client.command()
    async def join(ctx):
        global voice
        channel = ctx.message.author.voice.channel
        voice = get(client.voice_clients, guild = ctx.guild)
    
        if voice and voice.is_connected():
            await voice.move_to(channel)
        else:
            voice = await channel.connect()
            await ctx.send(f'Бот присоединился к каналу: {channel}')
    
    # Leave
    @client.command()
    async def leave(ctx):
        channel = ctx.message.author.voice.channel
        voice = get(client.voice_clients, guild=ctx.guild)
    
        if voice and voice.is_connected():
            await voice.disconnect()
        else:
            voice = await channel.connect()
            await ctx.send(f'Бот отключился от канала: {channel}')
    
    # Музло
    @client.command()
    async def play(ctx, url : str):
        song_there = os.path.isfile('song.mp3')
    
        try:
            if song_there:
                os.remove('song.mp3')
                print('[log] Старый файл удален')
        except PermissionError:
            print('[log] Не удалось удалить файл')
    
        await ctx.send('Пожалуйста, ожидайте. Файл обрабатывается.')
    
        voice = get(client.voice_clients, guild = ctx.guild)
    
        ydl_opts = {
            'format' : 'bestaudio/best',
            'postprocessors' : [{
                'key' : 'FFmpegExtractAudio',
                'preferredcodec' : 'mp3',
                'preferredquality' : '192'
            }],
        }
    
        with youtube_dl.YoutubeDL(ydl_opts) as ydl:
            print('[log] Загружаю музыку...')
            ydl.download([url])
    
        for file in os.listdir('./'):
            if file.endswith('.mp3'):
                name = file
                print(f'[log] Переименовываю файл: {file}')
                os.rename(file, 'song.mp3')
    
        voice.play(discord.FFmpegPCMAudio('song.mp3'), after = lambda e: print(f'[log] {name}, музыка закончила свое проигрывание'))
        voice.source = discord.PCMVolumeTransformer(voice.source)
        voice.source.volume = 0.07
    
        song_name = name.rsplit('-', 2)
        await ctx.send(f'Сейчас проигрывает музыка: {song_name[0]}')
    Ответ написан
    Комментировать