Files
Cites_Plugins/docs/diagrams/messages-class-diagram.puml
T
Antone Barbaud 84735221f1 refactor: split util/ vs features/ + modular opt-in setupX() config
Package restructure to prepare future modularization. Three layers now:

1. fr.luc.crcore.util.* (always active)
   - common, command framework, database, message, broadcast, gui,
     placeholder

2. fr.luc.crcore.features.* (opt-in)
   - team (entities, services, repos, events, exceptions, config + GUI,
     command/Team*SubCommand)
   - player (profile, ranking, services, repos, events, exceptions)

3. fr.luc.crcore.builtin.*
   - CoreCommand + CoreReloadSubCommand (top-level routing — not a
     feature, not an util)

FQN moves (game plugins importing these need their imports updated):
- fr.luc.crcore.common.*          → fr.luc.crcore.util.common.*
- fr.luc.crcore.command.*         → fr.luc.crcore.util.command.*
- fr.luc.crcore.command.builtin.team.*
                                  → fr.luc.crcore.features.team.command.*
- fr.luc.crcore.command.builtin.CoreCommand / CoreReloadSubCommand
                                  → fr.luc.crcore.builtin.*
- fr.luc.crcore.database.*        → fr.luc.crcore.util.database.*
- fr.luc.crcore.message.*         → fr.luc.crcore.util.message.*
- fr.luc.crcore.broadcast.*       → fr.luc.crcore.util.broadcast.*
- fr.luc.crcore.gui.*             → fr.luc.crcore.util.gui.*
- fr.luc.crcore.placeholder.*     → fr.luc.crcore.util.placeholder.*
- fr.luc.crcore.team.*            → fr.luc.crcore.features.team.*
- fr.luc.crcore.player.*          → fr.luc.crcore.features.player.*

CRCoreConfig — features opt-in via fluent setup:
- setupTeams()        enables team feature
- setupPlayers()      enables player feature
- setupPlaceholders() enables PAPI integration
- setupAll()          shortcut
By default no feature is active. Game plugin must opt-in.

CRCore.enable() now conditional:
- Util services always built (messages, broadcasts, gui listener).
- Team services + repos + config built only if setupTeams().
- Player services + repos built only if setupPlayers().
- Placeholder hook registered only if setupPlaceholders() (and PAPI
  installed at runtime).
- Getters of disabled features throw IllegalStateException with a clear
  message pointing to the missing setupX() call.
- CoreCommand only registers TeamGroupSubCommand if teamService and
  teamConfig are non-null. CoreReloadSubCommand handles teamConfig=null
  (just skips that reload). /core reload always available.

Docs:
- setup.md tree fully rewritten to reflect util/+features/+builtin
  layout (~70 lines of arborescence).
- setup.md code snippet shows the three opt-in patterns (setupAll /
  granular / with options).
- decisions.md logs both decisions (restructure + modular setup).
- All .puml diagrams auto-updated to new FQNs.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-10 12:00:00 +02:00

64 lines
1.9 KiB
Plaintext

@startuml messages-class-diagram
title CR-Core — Messages service (class diagram)
skinparam classAttributeIconSize 0
hide empty members
package "fr.luc.crcore.util.message" {
interface MessagesService {
+ get(key, placeholderPairs...): String
+ raw(key): String
+ has(key): boolean
+ set(key, template): void
+ reload(): void
+ loadAdditional(resourceName): void
+ setApplyColorCodes(enabled): void
+ isApplyColorCodes(): boolean
+ getUserFile(): File
}
class YamlMessagesService {
- plugin: JavaPlugin
- defaults: Map<String, String> ' in-memory (jar resource)
- messages: Map<String, String> ' effective (defaults + user file)
- userFileName: String ' <plugin>-messages.yml
- userFile: File
- applyColorCodes: boolean
--
+ YamlMessagesService(plugin: JavaPlugin)
--
- loadDefaultsFromResource(): void ' charge crcore-messages.yml (jar)
- ensureUserFile(): void ' copie template si absent
- rebuildEffectiveMessages(): void ' defaults + user file
- {static} flatten(section, prefix, out): void
}
YamlMessagesService ..|> MessagesService
}
package "fr.luc.crcore" {
class CRCore {
+ messages(): MessagesService
# buildMessagesService(): MessagesService ' override point
}
CRCore "1" *-- "1" MessagesService : owns
}
note bottom of YamlMessagesService
Modèle "un seul fichier par plugin" :
Sources en mémoire (la 2e écrase la 1ère sur clés communes) :
1. crcore-messages.yml ← jar (toujours présent, fallback)
2. <plugin>-messages.yml ← dataFolder (édité par l'admin)
Création du fichier user au 1er boot :
Priorité 1 : ressource du plugin de jeu sous le même nom
Priorité 2 : copie des defaults CR-Core
Placeholders : {name} via varargs key/value
Codes couleur : &a → §a (toggle)
end note
@enduml