Add DreamDict integrations: translate, hangman clues, and Portuguese WOTD

- Replace LibreTranslate-based !translate with DreamDict cross-language
  lookup (en/fr/pt-PT) with auto-detect and 5-per-lang cap
- Add multilingual hangman mode (!hangman <lang> [--clue <lang>]) using
  DreamDict RandomWord/Translate with retry logic and race-safe placeholder
- Rewrite WOTD to pick pt-PT words with Portuguese definitions and
  en/fr translations, add !wotd force for moderators
- Move DreamDict client init earlier in main.go for broader availability
- Wire dictClient into LookupPlugin, HangmanPlugin, and WOTDPlugin

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
prosolis
2026-03-28 21:03:07 -07:00
parent 0d3485c7c2
commit 1c4098ad1c
4 changed files with 414 additions and 146 deletions

22
main.go
View File

@@ -12,6 +12,7 @@ import (
"gogobee/internal/bot"
"gogobee/internal/db"
"gogobee/internal/dreamclient"
"gogobee/internal/plugin"
"gogobee/internal/util"
@@ -95,9 +96,22 @@ func main() {
registry.Register(plugin.NewToolsPlugin(client))
registry.Register(plugin.NewUserPlugin(client))
// Dictionary service
var dictClient *dreamclient.Client
if dictURL := os.Getenv("DREAMDICT_URL"); dictURL != "" {
dictClient = dreamclient.New(dictURL)
if h, err := dictClient.Health(); err != nil {
slog.Warn("dreamdict not reachable — dictionary features degraded", "url", dictURL, "err", err)
} else {
slog.Info("dreamdict connected", "url", dictURL, "words_en", h.WordCounts["en"])
}
} else {
slog.Warn("DREAMDICT_URL not set — dictionary features disabled")
}
// Entertainment / Lookup
registry.Register(plugin.NewRetroPlugin(client))
registry.Register(plugin.NewLookupPlugin(client, ratePlugin))
registry.Register(plugin.NewLookupPlugin(client, ratePlugin, dictClient))
registry.Register(plugin.NewCountdownPlugin(client))
registry.Register(plugin.NewStocksPlugin(client))
forexPlugin := plugin.NewForexPlugin(client)
@@ -113,13 +127,13 @@ func main() {
euroPlugin := plugin.NewEuroPlugin(client)
registry.Register(euroPlugin)
registry.Register(plugin.NewFlipPlugin(client))
registry.Register(plugin.NewHangmanPlugin(client, euroPlugin))
registry.Register(plugin.NewHangmanPlugin(client, euroPlugin, dictClient))
registry.Register(plugin.NewBlackjackPlugin(client, euroPlugin))
registry.Register(plugin.NewUnoPlugin(client, euroPlugin))
registry.Register(plugin.NewHoldemPlugin(client, euroPlugin))
adventurePlugin := plugin.NewAdventurePlugin(client, euroPlugin)
registry.Register(adventurePlugin)
wordlePlugin := plugin.NewWordlePlugin(client, euroPlugin)
wordlePlugin := plugin.NewWordlePlugin(client, euroPlugin, dictClient)
registry.Register(wordlePlugin)
// Community
@@ -144,7 +158,7 @@ func main() {
registry.Register(plugin.NewLLMPassivePlugin(client, xpPlugin))
// Scheduled
wotdPlugin := plugin.NewWOTDPlugin(client)
wotdPlugin := plugin.NewWOTDPlugin(client, dictClient)
registry.Register(wotdPlugin)
holidaysPlugin := plugin.NewHolidaysPlugin(client)
registry.Register(holidaysPlugin)