Суть проблемы
В плеере отсутствует интеграция с Discord (Rich Presence), которая позволяла бы друзьям пользователя видеть, какой трек сейчас играет, автора, прогресс воспроизведения и ссылку на проект на GitHub. Интеграция должна быть максимально легковесной, чтобы не создавать нагрузку на CPU/сеть и не вызывать микрофризы UI при потере интернет-соединения.
Возможное решение (Теория и архитектура)
- Создание сервиса: Создать
DiscordRpcService.cs на базе чистого C# клиента для работы с Discord IPC (через Named Pipes на Windows). Использование нативных C++ DLL крайне нежелательно для сохранения портативности.
- Событийная интеграция: Подписать сервис на события
PlayerControlService:
CurrentTrackObservable — для обновления названия трека, автора и обложки.
PlaybackStateObservable — для изменения статуса (играет/пауза) и обновления таймлайна в Discord.
- Оптимизация сетевого спама (Throttling): Обновления статуса RPC должны проходить через оператор
Throttle (с задержкой не менее 2-3 секунд). При частой перемотке (seek) или быстром переключении треков RPC-клиент не должен спамить Discord API, чтобы избежать временного бана со стороны Discord.
- Защита потоков (Zero-Freeze): Все операции записи/чтения из именованного канала Discord IPC должны выполняться строго асинхронно через
Task.Run с использованием ConfigureAwait(false), защищая UI-поток от блокировок при зависании Discord.
Суть проблемы
В плеере отсутствует интеграция с Discord (Rich Presence), которая позволяла бы друзьям пользователя видеть, какой трек сейчас играет, автора, прогресс воспроизведения и ссылку на проект на GitHub. Интеграция должна быть максимально легковесной, чтобы не создавать нагрузку на CPU/сеть и не вызывать микрофризы UI при потере интернет-соединения.
Возможное решение (Теория и архитектура)
DiscordRpcService.csна базе чистого C# клиента для работы с Discord IPC (через Named Pipes на Windows). Использование нативных C++ DLL крайне нежелательно для сохранения портативности.PlayerControlService:CurrentTrackObservable— для обновления названия трека, автора и обложки.PlaybackStateObservable— для изменения статуса (играет/пауза) и обновления таймлайна в Discord.Throttle(с задержкой не менее 2-3 секунд). При частой перемотке (seek) или быстром переключении треков RPC-клиент не должен спамить Discord API, чтобы избежать временного бана со стороны Discord.Task.Runс использованиемConfigureAwait(false), защищая UI-поток от блокировок при зависании Discord.