# Discord Rich Presence

**Plugin made by Mathew Simon.**

Affiche le jeu dans le statut Discord quand on le lance. Aucune DLL ni SDK externe :
le plugin parle directement au named pipe local de Discord (`\\.\pipe\discord-ipc-N`).

Windows uniquement (`PlatformAllowList: Win64`).

## 1. Cote Discord

1. https://discord.com/developers/applications > **New Application**
2. Le **nom de l'application** = ce que Discord affichera comme nom du jeu ("joue a XXX").
3. Copier l'**Application ID** (= Client ID) sur la page *General Information*.
4. Optionnel, pour les images : *Rich Presence > Art Assets* > uploader une image et lui
   donner un nom. Ce nom est la valeur a mettre dans `LargeImageKey` / `SmallImageKey`.
   (Les uploads mettent quelques minutes a se propager.)

## 2. Cote Unreal

**Edit > Project Settings > Plugins > Discord Rich Presence**

| Reglage | Role |
|---|---|
| `Enabled` | Active/desactive tout le plugin |
| `Client Id` | L'Application ID copie a l'etape 1 |
| `Enable In Editor` | Presence active aussi en PIE (pratique pour tester) |
| `Default Activity` | Ce qui est affiche des le lancement |
| `Min Update Interval Seconds` | Throttle des envois (Discord limite a 5 / 20 s, ne pas descendre sous 4) |
| `Reconnect Interval Seconds` | Frequence des tentatives quand Discord n'est pas lance |

C'est tout : le sous-systeme demarre avec la GameInstance, se connecte, envoie
`Default Activity`, et se reconnecte tout seul si Discord est ferme puis relance.

## 3. Changer la presence en cours de jeu

En Blueprint, noeud **Get Discord Rich Presence**, puis :

- `Set Details And State` — les deux lignes de texte sous le nom du jeu
- `Set Activity` — remplace tout (textes + images + party)
- `Set Party` — le compteur "(2 sur 4)"
- `Reset Elapsed Time` — repart de zero sur le chrono de temps de jeu
- `Clear Activity` — retire le jeu du statut
- `Is Connected To Discord` — etat de la connexion

En C++ :

```cpp
#include "DiscordRichPresenceSubsystem.h"

if (UDiscordRichPresenceSubsystem* Discord = UDiscordRichPresenceSubsystem::Get(this))
{
    Discord->SetDetailsAndState(TEXT("Foret du Nord"), TEXT("Jour 12 - En vie"));
}
```

## Notes

- Discord ignore les textes de **moins de 2 caracteres**, ils sont donc omis a l'envoi.
- Le chrono de temps de jeu demarre a l'`Initialize` du sous-systeme.
- Les changements sont accumules et envoyes au plus une fois par `Min Update Interval
  Seconds` : appeler `SetDetailsAndState` a chaque frame ne spamme pas Discord.
- Si Discord n'est pas lance, il ne se passe rien (pas d'erreur, pas de blocage) et le
  plugin retente periodiquement.
