モジュールの構造
すべてのモジュールは goroku.Module を満たします。goroku.Base を埋め込むと Name と Commands 以外のすべてに既定実装が入るので、書く必要があるのはその 2つだけです。
type Module interface {
Name() string
Strings() map[string]string
Init(client *CustomTelegramClient, db *Database) error
ClientReady() error
OnUnload() error
OnDlmod() error
Commands() map[string]CommandHandler
Watchers() []WatcherHandler
}必須
Name
.help、.unloadmod、設定画面で使われるモジュールの識別名です。Go の型名でも あり、データを保存するキーでもあります。
func (m *Weather) Name() string { return "Weather" }Commands
コマンド語とハンドラを対応づけます。利用者はプレフィックスの後にその語を入力する ので、"weather" は .weather になります。
func (m *Weather) Commands() map[string]goroku.CommandHandler {
return map[string]goroku.CommandHandler{
"weather": m.WeatherCmd,
"forecast": m.ForecastCmd,
}
}CommandHandler は func(msg *goroku.Message) error です。エラーを返すと利用者 に表示されます。ディスパッチャは panic も回復するので、ハンドラのクラッシュで ボットが落ちることはありません。
任意(Base に既定値あり)
Strings
利用者向けの文言であり、m.T の参照元です。2つのキー接頭辞が特別です。
| キー | 意味 |
|---|---|
name | .help での表示名 |
_cls_doc | モジュールの説明 |
_cmd_doc_<コマンド> | そのコマンドの説明 |
それ以外は自由で、m.T で取り出します。
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cls_doc": "都市の現在の天気",
"_cmd_doc_weather": "[都市] — 天気を表示する",
"no_city": "❌ <b>どの都市ですか?</b>",
}
}Init
登録時に一度、どのコマンドも動きうる前に呼ばれます。その時点で Base は既に m.Client、m.DB、m.Translator を埋めているので、Init は自分の準備だけに 使ってください。
func (m *Weather) Init(client *goroku.CustomTelegramClient, db *goroku.Database) error {
if err := m.Base.Init(client, db); err != nil {
return err
}
m.cache = make(map[string]string)
return nil
}先に m.Base.Init を呼ぶ
ローダーが Init の前にフィールドを埋めるため、通常運用ではこの呼び出しは冗長 です。それでも入れておいてください。テストでローダーを介さず直接生成したときにも 動くようになります。
ClientReady
Telegram への接続が確立した時点で呼ばれます。起動時に API を必要とする処理はここ へ。Init は接続前に走ることがあります。
func (m *Weather) ClientReady() error {
me := m.Client.Me()
_ = me
return nil
}OnUnload
モジュールが取り外されるときに呼ばれます。ゴルーチン、タイマー、ファイルハンドル はここで解放します。
func (m *Weather) OnUnload() error {
close(m.stop)
return nil
}WARNING
OnUnload 内の panic は回復されログに残りますが、モジュールの取り外しは続行され ます。正しさに関わる後始末を OnUnload に頼らないでください。
OnDlmod
.dlmod での導入直後に呼ばれます。一度きりの挨拶や初期設定に便利です。
Watchers
コマンドだけでなく、すべてのメッセージを見るハンドラです。 ウォッチャー を参照。
インターフェースの外側
いくつかの機能は別インターフェースで任意に有効化できます。メソッドを宣言すれば Goroku が拾います。
| インターフェース | メソッド | 目的 |
|---|---|---|
ModuleWithMeta | CommandMetas() | エイリアスと制限 |
ModuleWithConfigSchema | ConfigSchema() | 型付き設定 |
ModuleWithConfigReady | ConfigReady(map[string]any) | 設定変更への反応 |
ModuleWithTranslationAliases | TranslationAliases() | 翻訳ファイル名の別名 |
全一覧は オプションのインターフェース に あります。