Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Пользовательский статус "Слушает" вместо "Играет в игру" #22

Closed
scpsltest opened this issue May 18, 2024 · 26 comments
Labels
enhancement New feature or request

Comments

@scpsltest
Copy link

можно ли заменить надпись "играет в игру" на что-то по типу "слушает" было бы прикольно это видеть т.к будет более лаконично
image

@eggdll
Copy link
Contributor

eggdll commented May 18, 2024

вроде невозможно

@AlexVin-Dev
Copy link

вроде невозможно

Можно

@scpsltest
Copy link
Author

будет хорошо если добавят эту функцию

@AlexVin-Dev
Copy link

AlexVin-Dev commented May 18, 2024

будет хорошо если добавят эту функцию

Будет время. Предоставлю небольшой код для костомного статуса, чтобы автору было легче.

@scpsltest
Copy link
Author

буду премного благодарен

@FozerG
Copy link
Owner

FozerG commented May 19, 2024

Это невозможно, только Spotify обладает такой возможностью благодаря собственной интеграции с Discord.

@scpsltest
Copy link
Author

это очень грустно, я думал можно ведь человек выше написал что даст основу кода для кастомного статуса

@FozerG
Copy link
Owner

FozerG commented May 19, 2024

Ну как я сказал, это невозможно. Так что не знаю что он даст :)

@FozerG FozerG closed this as not planned Won't fix, can't repro, duplicate, stale May 19, 2024
@FozerG
Copy link
Owner

FozerG commented May 19, 2024

Обновление информации: Раньше такой возможности не было (и библиотека которую я использую так не умеет), сейчас это возможно но в таком случае статус урезан (без показа времени)

Пример:

image

Прошу прощения за чрезмерную уверенность.

@FozerG
Copy link
Owner

FozerG commented May 19, 2024

Это будет требовать использование веб-сокетов и личного Discord токена. Я не думаю, что это того стоит 🥺

@AlexVin-Dev
Copy link

Да я помню, что обещал. Но прочитав, что скорее всего может не работать так как может не воспроизвести описание, какая играет музыка.

await bot.change_presence(activity=discord.CustomActivity(name='текст' ,emoji='смайлик'))

@FozerG
Copy link
Owner

FozerG commented Jun 12, 2024

Итак, я нашёл несколько свободных дней и решил попробовать воплотить эту идею.

Я использовал три разных метода:

Документация везде очень расплывчатая и огромная, поэтому всё приходилось делать на ощупь. Вот максимальный результат, которого я смог достичь:

Screenshot_471

image

К сожалению, мы теряем много функциональности по сравнению с текущим RPC, таких как кнопки, длительность трека, статус паузы и обложка.

Особенно много времени я потратил на попытки разобраться с обложкой, но безуспешно. Кто то пишет, что динамические URL не поддерживаются, другие — что поддерживаются, но при этом не работают. В итоге, всё остаётся расплывчатым и непонятным, и это относится ко всем трём методам.

Поэтому я, лично, прекращаю попытки реализации этой идеи. Это принесет больше проблем и неудобств, чем пользы. Кроме того, не забывайте, что всё это работает через личный токен Discord :)

Если кто-то сможет реализовать подгрузку динамических обложек через WebSocket или любые библиотеки, буду рад видеть ваш pull request или сообщения здесь.

@FozerG FozerG reopened this Jun 12, 2024
@FozerG FozerG added the enhancement New feature or request label Jun 12, 2024
@FozerG FozerG changed the title мождно ли сделать пользовательский статус вместо "играет в игру"? Пользовательский статус "Слушает" вместо "Играет в игру" Jun 12, 2024
@FreemoV
Copy link

FreemoV commented Jun 14, 2024

может сделать пока типа такова? https://imgur.com/a/Xs7dl9F . Но я думаю это будет смотриеся кринова и не вписываться

@FreemoV
Copy link

FreemoV commented Jun 14, 2024

Хз возможно тупа мосор с нейросети, но может поможет.
Для реализации функции отображения статуса "слушает" и динамических обложек в Discord Rich Presence, воспользуемся Python и библиотекой pypresence, а также рассмотрим использование веб-сокетов и личного токена Discord. Давайте разберём основные шаги:

Шаг 1: Установка необходимых библиотек

Установите pypresence:

pip install pypresence

Шаг 2: Получение клиентского ID и подготовка изображений

  1. Перейдите в Discord Developer Portal.
  2. Создайте новое приложение или используйте существующее.
  3. Получите client_id.
  4. В разделе "Rich Presence" добавьте изображения для обложек.

Шаг 3: Пример кода с динамическими обложками и статусом "слушает"

import pypresence
import time

client_id = 'YOUR_CLIENT_ID'  # Замените на ваш клиентский ID
RPC = pypresence.Presence(client_id)
RPC.connect()

def update_presence(track, artist, album, large_image_key, small_image_key):
    RPC.update(
        details=f"Слушает: {track}",
        state=f"Исполнитель: {artist}",
        large_image=large_image_key,
        large_text=album,
        small_image=small_image_key,
        small_text="Yandex Music",
        start=time.time()
    )

# Обновите трек динамически
track_info = {
    "track": "Example Track",
    "artist": "Example Artist",
    "album": "Example Album",
    "large_image_key": "large_image_key",
    "small_image_key": "small_image_key"
}

while True:
    update_presence(**track_info)
    time.sleep(15)  # Обновление каждые 15 секунд

Шаг 4: Использование WebSocket и личного токена Discord

Для этого понадобится использовать библиотеку websockets и ваш личный токен Discord. Использование личного токена может нарушать правила Discord, будьте осторожны.

  1. Установите websockets:

    pip install websockets
  2. Пример использования:

import websockets
import asyncio
import json
import time

token = 'YOUR_DISCORD_TOKEN'

async def send_rpc():
    async with websockets.connect('wss://gateway.discord.gg/?v=6&encoding=json') as ws:
        hello = await ws.recv()
        heartbeat_interval = json.loads(hello)['d']['heartbeat_interval'] / 1000

        # Авторизация
        auth = {
            "op": 2,
            "d": {
                "token": token,
                "properties": {
                    "$os": "windows",
                    "$browser": "chrome",
                    "$device": "pc"
                }
            }
        }
        await ws.send(json.dumps(auth))

        while True:
            payload = {
                "op": 3,
                "d": {
                    "since": None,
                    "activities": [{
                        "name": "Yandex Music",
                        "type": 2,  # 2 - слушает
                        "details": "Слушает Example Track",
                        "state": "Исполнитель: Example Artist",
                        "assets": {
                            "large_image": "large_image_key",
                            "large_text": "Example Album",
                            "small_image": "small_image_key",
                            "small_text": "Yandex Music"
                        },
                        "timestamps": {
                            "start": int(time.time())
                        }
                    }],
                    "status": "online",
                    "afk": False
                }
            }
            await ws.send(json.dumps(payload))
            await asyncio.sleep(heartbeat_interval)

asyncio.get_event_loop().run_until_complete(send_rpc())

Заключение

Эти примеры показывают, как обновлять статус в Rich Presence и использовать динамические обложки. Настройте их под свои нужды и убедитесь, что используете только легальные методы работы с токенами Discord.
Для того чтобы отображалось, что человек слушает музыку, а не играет в игру в Discord, нужно использовать тип активности 2 (Listening). В приведенном выше примере с использованием WebSocket это учитывается:

payload = {
    "op": 3,
    "d": {
        "since": None,
        "activities": [{
            "name": "Yandex Music",
            "type": 2,  # 2 - слушает
            "details": "Слушает Example Track",
            "state": "Исполнитель: Example Artist",
            "assets": {
                "large_image": "large_image_key",
                "large_text": "Example Album",
                "small_image": "small_image_key",
                "small_text": "Yandex Music"
            },
            "timestamps": {
                "start": int(time.time())
            }
        }],
        "status": "online",
        "afk": False
    }
}

Использование type: 2 указывает, что пользователь слушает музыку, и должно корректно отображаться в статусе Discord как "слушает". Убедитесь, что ключи изображений загружены в Discord Developer Portal.

@FreemoV
Copy link

FreemoV commented Jun 14, 2024

Уточнение по динамическим обложкам

Discord Rich Presence имеет ограничения на использование динамических URL для изображений. Однако, вы можете обновлять изображения, заранее загруженные в Discord Developer Portal, используя их ключи.

Полный пример кода с использованием WebSocket и pypresence

  1. Установите необходимые библиотеки:

    pip install pypresence websockets
  2. Пример использования pypresence для обновления статуса "слушает" с динамическими обложками:

    import pypresence
    import time
    
    client_id = 'YOUR_CLIENT_ID'  # Замените на ваш клиентский ID
    RPC = pypresence.Presence(client_id)
    RPC.connect()
    
    def update_presence(track, artist, album, large_image_key, small_image_key):
        RPC.update(
            details=f"Слушает: {track}",
            state=f"Исполнитель: {artist}",
            large_image=large_image_key,
            large_text=album,
            small_image=small_image_key,
            small_text="Yandex Music",
            start=time.time()
        )
    
    # Обновите трек динамически
    track_info = {
        "track": "Example Track",
        "artist": "Example Artist",
        "album": "Example Album",
        "large_image_key": "large_image_key",
        "small_image_key": "small_image_key"
    }
    
    while True:
        update_presence(**track_info)
        time.sleep(15)  # Обновление каждые 15 секунд
  3. Пример использования WebSocket для обновления статуса:

    import websockets
    import asyncio
    import json
    import time
    
    token = 'YOUR_DISCORD_TOKEN'
    
    async def send_rpc():
        async with websockets.connect('wss://gateway.discord.gg/?v=6&encoding=json') as ws:
            hello = await ws.recv()
            heartbeat_interval = json.loads(hello)['d']['heartbeat_interval'] / 1000
    
            # Авторизация
            auth = {
                "op": 2,
                "d": {
                    "token": token,
                    "properties": {
                        "$os": "windows",
                        "$browser": "chrome",
                        "$device": "pc"
                    }
                }
            }
            await ws.send(json.dumps(auth))
    
            while True:
                payload = {
                    "op": 3,
                    "d": {
                        "since": None,
                        "activities": [{
                            "name": "Yandex Music",
                            "type": 2,  # 2 - слушает
                            "details": "Слушает Example Track",
                            "state": "Исполнитель: Example Artist",
                            "assets": {
                                "large_image": "large_image_key",
                                "large_text": "Example Album",
                                "small_image": "small_image_key",
                                "small_text": "Yandex Music"
                            },
                            "timestamps": {
                                "start": int(time.time())
                            }
                        }],
                        "status": "online",
                        "afk": False
                    }
                }
                await ws.send(json.dumps(payload))
                await asyncio.sleep(heartbeat_interval)
    
    asyncio.get_event_loop().run_until_complete(send_rpc())

Заключение

Эти примеры помогут вам настроить статус "слушает" и использовать динамические обложки.

@FozerG
Copy link
Owner

FozerG commented Jun 15, 2024

К сожалению, chatgpt не понимает всех тонкостей API Discord. Впрочем, мало кто понимает.

@AlexVin-Dev
Copy link

К сожалению, chatgpt не понимает всех тонкостей API Discord. Впрочем, мало кто понимает.

Я с тобой соглашусь

Repository owner deleted a comment from userrnamee132 Jun 20, 2024
@Kefisto
Copy link

Kefisto commented Jul 4, 2024

изображение
По сути возможно сделать так, таймер возможен (наверное), но мой старый код к сожалению его более не отображает.

@FozerG
Copy link
Owner

FozerG commented Jul 4, 2024

изображение По сути возможно сделать так, таймер возможен (наверное), но мой старый код к сожалению его более не отображает.

А где можно посмотреть код? :)

@Kefisto
Copy link

Kefisto commented Jul 4, 2024

изображение По сути возможно сделать так, таймер возможен (наверное), но мой старый код к сожалению его более не отображает.

А где можно посмотреть код? :)

реализовано через токен, от этого нет смысла (хотя можно сделать авто ввод токена)

@FozerG
Copy link
Owner

FozerG commented Jul 4, 2024

изображение По сути возможно сделать так, таймер возможен (наверное), но мой старый код к сожалению его более не отображает.

А где можно посмотреть код? :)

реализовано через токен, от этого нет смысла (хотя можно сделать авто ввод токена)

Понятное дело :) Уже для яндекса реализована система, думаю для дискорда так же могу адаптировать. Так что показывай хи-хи

@AlexGreat007
Copy link

Прошу прощения, что в каких-то вещах не шарю: вы пробовали связаться с командой Я.Музыки и передать им код? Может быть они что-то сделают со своей стороны? Например, свяжутся с командой Дискорда для полнофункциональной фичи с отображением статуса как в Спотике?

@saberkovich
Copy link

Прошу прощения, что в каких-то вещах не шарю: вы пробовали связаться с командой Я.Музыки и передать им код? Может быть они что-то сделают со своей стороны? Например, свяжутся с командой Дискорда для полнофункциональной фичи с отображением статуса как в Спотике?

Подобное пожелание уже писали на форуме предложений - https://yandexmusic.userecho.com/communities/45/topics/2672-integratsiya-s-discord?page=20

4 года назад... До сих пор не реализовали

@saberkovich
Copy link

изображение По сути возможно сделать так, таймер возможен (наверное), но мой старый код к сожалению его более не отображает.

А где можно посмотреть код? :)

реализовано через токен, от этого нет смысла (хотя можно сделать авто ввод токена)

Брат скинь код) Очень надеемся на тебя @Kefisto

@FozerG
Copy link
Owner

FozerG commented Aug 3, 2024

В разработке :)

image

@FozerG
Copy link
Owner

FozerG commented Aug 5, 2024

Я реализовал этот функционал в версии 2.2.1.

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

8 participants