Icône Ekaii sur les messages hors chat du webhook EkaiiSRV (join / leave / mort / advancement) — le webhook n'a pas d'avatar #3

Open
opened 2026-09-01 11:04:09 +00:00 by wait4mi · 0 comments

Symptôme

Sur le Discord Ekaii, les messages postés par le pont MC → Discord n'ont pas tous la même identité :

  • les messages de chat des joueurs s'affichent correctement avec le pseudo du joueur et sa tête (fix v1.4.2, #1) ;
  • les autres messages (connexion, déconnexion, mort, advancement) s'affichent au nom de EkaiiSRV avec l'icône Discord par défaut (le logo gris de base), ce qui fait cheap à côté du bot « Ekaii » qui a une vraie image.

Objectif

  • Les messages hors chat (join / leave / mort / advancement) doivent porter l'icône Ekaii (la même image de profil que le bot « Ekaii »).
  • Les messages de chat doivent garder la tête du joueur : rien ne change pour eux.
  • Le nom du webhook reste EkaiiSRV (pas de renommage).

Cause (diagnostic du 2026-09-01)

Tout part du même webhook Discord EkaiiSRV (id 1507383615917396010, salon 1186576981156954122), mais le plugin construit deux types de payloads dans velocity-plugin/src/main/java/fr/ekaii/mirror/velocity/DiscordPublisher.java :

Type de message Méthode Payload envoyé Identité affichée par Discord
Chat joueur publishChat() username = [Serveur] Pseudo + avatar_url = tête mc-heads override par message → pseudo + tête du joueur
Join / leave / mort / advancement wrapEmbed() {"embeds": [...]} sans username ni avatar_url identité du webhook lui-même

Or le webhook n'a jamais reçu d'image. Vérifié via GET sur l'URL du webhook (depuis minis) :

{"id": "1507383615917396010", "name": "EkaiiSRV", "avatar": null, "channel_id": "1186576981156954122", ...}

"avatar": null → Discord affiche son icône par défaut pour tout message qui ne surcharge pas l'avatar. La tête du joueur est bien présente dans ces embeds, mais dans author.icon_url (la petite icône à côté du texte « X joined the game »), pas comme avatar du message.

Solution retenue : donner une image au webhook (zéro code)

Un webhook Discord a sa propre identité persistante (nom + avatar), modifiable avec le seul token du webhook — pas besoin du token du bot, pas de rebuild, pas de bump manifest, pas de restart Velocity.

Une fois l'avatar posé :

  • tous les messages qui ne surchargent pas avatar_url (join / leave / mort / advancement) prennent automatiquement l'icône Ekaii ;
  • les messages de chat continuent d'afficher la tête du joueur, car l'override par message prime toujours sur l'identité du webhook (comportement documenté de l'API Discord) ;
  • l'image est copiée dans le webhook : si l'avatar du bot Ekaii change un jour, le webhook garde la sienne (pas de dépendance sur une URL CDN).

Marche à suivre (sur minis, en tant que exo)

L'URL du webhook est déjà dans la config déployée du plugin : /opt/mc-stack/velocity/plugins/ekaii-mirror-velocity/config.yml, clé discord.webhook-url. Ne pas la coller dans cette issue ni dans un commit.

# 1. Récupérer l'URL du webhook depuis la config déployée (rien n'est affiché)
CFG=/opt/mc-stack/velocity/plugins/ekaii-mirror-velocity/config.yml
WH=$(grep -E '^\s*webhook-url:' "$CFG" | head -1 | sed -E 's/.*webhook-url:\s*"?([^"]*)"?.*/\1/')

# 2. Télécharger l'avatar actuel du bot « Ekaii » (image publique, HTTP 200 vérifié)
curl -sS -o /tmp/ekaii-avatar.png \
  'https://cdn.discordapp.com/avatars/1194298459910570114/ac5f81bd53b696f08910a32445ac68f8.png?size=256'
file /tmp/ekaii-avatar.png   # doit répondre "PNG image data"

# 3. Poser l'image sur le webhook (le nom reste EkaiiSRV)
curl -sS -X PATCH "$WH" \
  -H 'Content-Type: application/json' \
  -d "{\"name\":\"EkaiiSRV\",\"avatar\":\"data:image/png;base64,$(base64 -w0 /tmp/ekaii-avatar.png)\"}"

# 4. Vérifier : "avatar" ne doit plus être null
curl -sS "$WH" | sed -E 's/"token":"[^"]*"/"token":"***"/'

# 5. Nettoyage
rm -f /tmp/ekaii-avatar.png

Alternative sans terminal : Discord → Paramètres du serveur → Intégrations → Webhooks → EkaiiSRV → changer l'image (même résultat, avatar stocké dans le webhook).

Vérification en jeu

  1. Un joueur se connecte puis se déconnecte → sur Discord, les deux embeds portent l'icône Ekaii et le nom EkaiiSRV.
  2. Le même joueur écrit dans le chat → le message porte toujours [Survie] Pseudo et sa tête.
  3. Une mort ou un advancement → icône Ekaii.

Retour arrière

curl -sS -X PATCH "$WH" -H 'Content-Type: application/json' -d '{"avatar": null}'

Hors périmètre

  • Chat Discord → MC (DiscordInbound, #2) : ces messages partent du bot Ekaii, pas du webhook, ils ne sont pas concernés.
  • Webhook security-audit (autre salon, autre URL) : même mécanisme si on veut l'icône Ekaii là aussi — à traiter à part si besoin.
  • Option code (ajouter un override username / avatar_url configurable dans wrapEmbed()) : écartée pour l'instant — elle demanderait une v1.5.1 + CI + bump manifest + restart Velocity pour le même rendu, et une URL CDN qui casserait si l'avatar du bot change. À reconsidérer seulement si on veut que l'identité soit versionnée dans le repo.

🤖 Claude

## Symptôme Sur le Discord Ekaii, les messages postés par le pont MC → Discord n'ont pas tous la même identité : - les **messages de chat** des joueurs s'affichent correctement avec le pseudo du joueur et **sa tête** (fix v1.4.2, #1) ; - les **autres messages** (connexion, déconnexion, mort, advancement) s'affichent au nom de **EkaiiSRV** avec **l'icône Discord par défaut** (le logo gris de base), ce qui fait cheap à côté du bot « Ekaii » qui a une vraie image. ## Objectif - Les messages **hors chat** (join / leave / mort / advancement) doivent porter **l'icône Ekaii** (la même image de profil que le bot « Ekaii »). - Les **messages de chat** doivent **garder la tête du joueur** : rien ne change pour eux. - Le nom du webhook reste **`EkaiiSRV`** (pas de renommage). ## Cause (diagnostic du 2026-09-01) Tout part du même webhook Discord `EkaiiSRV` (id `1507383615917396010`, salon `1186576981156954122`), mais le plugin construit deux types de payloads dans `velocity-plugin/src/main/java/fr/ekaii/mirror/velocity/DiscordPublisher.java` : | Type de message | Méthode | Payload envoyé | Identité affichée par Discord | |---|---|---|---| | Chat joueur | `publishChat()` | `username` = `[Serveur] Pseudo` + `avatar_url` = tête mc-heads | override **par message** → pseudo + tête du joueur | | Join / leave / mort / advancement | `wrapEmbed()` | `{"embeds": [...]}` **sans** `username` ni `avatar_url` | identité **du webhook lui-même** | Or le webhook n'a jamais reçu d'image. Vérifié via `GET` sur l'URL du webhook (depuis minis) : ```json {"id": "1507383615917396010", "name": "EkaiiSRV", "avatar": null, "channel_id": "1186576981156954122", ...} ``` `"avatar": null` → Discord affiche son icône par défaut pour tout message qui ne surcharge pas l'avatar. La tête du joueur est bien présente dans ces embeds, mais dans `author.icon_url` (la petite icône à côté du texte « X joined the game »), pas comme avatar du message. ## Solution retenue : donner une image au webhook (zéro code) Un webhook Discord a sa propre identité persistante (nom + avatar), modifiable avec le seul token du webhook — pas besoin du token du bot, pas de rebuild, pas de bump manifest, pas de restart Velocity. Une fois l'avatar posé : - tous les messages qui **ne surchargent pas** `avatar_url` (join / leave / mort / advancement) prennent automatiquement l'icône Ekaii ; - les messages de chat **continuent d'afficher la tête du joueur**, car l'override par message prime toujours sur l'identité du webhook (comportement documenté de l'API Discord) ; - l'image est **copiée** dans le webhook : si l'avatar du bot Ekaii change un jour, le webhook garde la sienne (pas de dépendance sur une URL CDN). ### Marche à suivre (sur `minis`, en tant que `exo`) L'URL du webhook est déjà dans la config déployée du plugin : `/opt/mc-stack/velocity/plugins/ekaii-mirror-velocity/config.yml`, clé `discord.webhook-url`. Ne pas la coller dans cette issue ni dans un commit. ```bash # 1. Récupérer l'URL du webhook depuis la config déployée (rien n'est affiché) CFG=/opt/mc-stack/velocity/plugins/ekaii-mirror-velocity/config.yml WH=$(grep -E '^\s*webhook-url:' "$CFG" | head -1 | sed -E 's/.*webhook-url:\s*"?([^"]*)"?.*/\1/') # 2. Télécharger l'avatar actuel du bot « Ekaii » (image publique, HTTP 200 vérifié) curl -sS -o /tmp/ekaii-avatar.png \ 'https://cdn.discordapp.com/avatars/1194298459910570114/ac5f81bd53b696f08910a32445ac68f8.png?size=256' file /tmp/ekaii-avatar.png # doit répondre "PNG image data" # 3. Poser l'image sur le webhook (le nom reste EkaiiSRV) curl -sS -X PATCH "$WH" \ -H 'Content-Type: application/json' \ -d "{\"name\":\"EkaiiSRV\",\"avatar\":\"data:image/png;base64,$(base64 -w0 /tmp/ekaii-avatar.png)\"}" # 4. Vérifier : "avatar" ne doit plus être null curl -sS "$WH" | sed -E 's/"token":"[^"]*"/"token":"***"/' # 5. Nettoyage rm -f /tmp/ekaii-avatar.png ``` Alternative sans terminal : Discord → Paramètres du serveur → Intégrations → Webhooks → `EkaiiSRV` → changer l'image (même résultat, avatar stocké dans le webhook). ### Vérification en jeu 1. Un joueur se connecte puis se déconnecte → sur Discord, les deux embeds portent l'icône Ekaii et le nom `EkaiiSRV`. 2. Le même joueur écrit dans le chat → le message porte toujours `[Survie] Pseudo` et sa tête. 3. Une mort ou un advancement → icône Ekaii. ### Retour arrière ```bash curl -sS -X PATCH "$WH" -H 'Content-Type: application/json' -d '{"avatar": null}' ``` ## Hors périmètre - **Chat Discord → MC** (`DiscordInbound`, #2) : ces messages partent du bot Ekaii, pas du webhook, ils ne sont pas concernés. - **Webhook `security-audit`** (autre salon, autre URL) : même mécanisme si on veut l'icône Ekaii là aussi — à traiter à part si besoin. - **Option code** (ajouter un override `username` / `avatar_url` configurable dans `wrapEmbed()`) : écartée pour l'instant — elle demanderait une v1.5.1 + CI + bump manifest + restart Velocity pour le même rendu, et une URL CDN qui casserait si l'avatar du bot change. À reconsidérer seulement si on veut que l'identité soit versionnée dans le repo. 🤖 Claude
Sign in to join this conversation.
No labels
feature request
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin_ekaii/ekaii-mirror#3
No description provided.