# Changelog — discordplace-sync

Chaque section est reprise telle quelle dans l'annonce du serveur support DiscordPlace.
Each section is posted as-is in the DiscordPlace support server announcement.

## 1.9.1

🛟 **Le SDK ne fait plus jamais tomber votre bot · The SDK never crashes your bot anymore** — sans écouteur `error`, un échec de synchronisation (DiscordPlace injoignable, clé refusée) faisait planter le processus. Désormais : une seule ligne d'avertissement dans la console, ou votre écouteur `error`, une fois par cycle.
*Without an `error` listener, a failed sync (DiscordPlace unreachable, key rejected) crashed the process. Now: one console warning line, or your `error` listener, once per cycle.*

🧩 **Sharding réparé · Sharding fixed** — le `SyncClient` d'un `ShardingManager` attend que tous les shards soient prêts (avant ou après `spawn()`), et ne publie jamais un nombre de serveurs partiel. `syncBotInfo()` depuis un shard agrège tous les shards.
*A `ShardingManager` `SyncClient` now waits for every shard to be ready (created before or after `spawn()`) and never posts a partial server count. `syncBotInfo()` from a shard aggregates all shards.*

🔐 **Votre clé API ne fuit plus dans les logs · Your API key no longer leaks into logs** — les erreurs sont des `DiscordPlaceError` (`status`, `code`, `endpoint`), jamais l'erreur brute d'axios qui contenait l'en-tête `Authorization`.
*Errors are `DiscordPlaceError` (`status`, `code`, `endpoint`), never the raw axios error that carried the `Authorization` header.*

🙈 **Commandes privées jamais publiées · Private commands are never published** — une commande réservée au développeur du bot ne compte plus sur votre fiche : celles enregistrées sur un seul serveur et celles marquées `ownerOnly` / `devOnly` sont écartées d'office, les autres se nomment avec `privateCommands: ['eval']` ou `commandFilter`.
*Owner-only commands no longer count on your bot page: commands registered on a single guild and handlers flagged `ownerOnly` / `devOnly` are left out on their own; name the others with `privateCommands: ['eval']` or `commandFilter`.*

🗳️ Écouteurs `vote` asynchrones attendus (un échec → DiscordPlace réessaie), votes rejoués ignorés, `sync.hasVoted(userId)` · *async `vote` listeners are awaited (a failure → DiscordPlace retries), replayed votes ignored, `sync.hasVoted(userId)`.*

⚙️ `clientReady` (discord.js 14.22+), `debug: true` qui journalise vraiment, `timeout` / `retries` / `botVersion`, menus contextuels reconnus, salons / uptime / mémoire / version envoyés · *`clientReady` support, working `debug: true`, `timeout` / `retries` / `botVersion`, context menus detected, channels / uptime / memory / version sent.*

👉 `npm install discordplace-sync@latest`

## 1.9.0

🗳️ **Webhook de vote · Vote webhook** — récompensez vos votants au moment où ils votent : option `webhook` du `SyncClient`, événements `vote` / `voteTest`, ou `createWebhookHandler` pour votre propre serveur HTTP. Adresse et secret : page de votre bot → onglet **SDK**.
*Reward voters the moment they vote: `webhook` option, `vote` / `voteTest` events, or `createWebhookHandler` for your own HTTP server. Set it up on your bot page → **SDK** tab.*

📊 **Usage compté · Usage tracking** — commandes, interactions sans réponse, serveurs ajoutés et retirés, utilisateurs actifs : affichés sur votre fiche et dans les tris « Les plus utilisés ». Des nombres uniquement, aucun identifiant. `trackUsage: false` pour couper.
*Commands, unanswered interactions, guilds joined and left, active users — shown on your bot page and in the “Most used” sort. Numbers only, no IDs. `trackUsage: false` to opt out.*

✅ `sdk.hasVoted(userId)` — a-t-il voté dans les 12 h ? · *did they vote in the last 12 h?*

🔔 Le SDK vous prévient désormais des nouvelles versions dans la console · *The SDK now tells you about new versions in the console* (`updateNotice: false` pour couper · *to disable*).
