Module
go
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
}goroku.Base を埋め込むと、Name と Commands 以外の すべてのメソッドが手に入ります。
メソッド
Name() string
モジュールの識別名。.help、.unloadmod、設定画面で使われ、ストレージの オーナーキーにもなります。読み込み済みモジュール間で一意である必要があります。
Strings() map[string]string
翻訳可能な文言。特別なキー接頭辞は 翻訳 を参照。Base は nil を返し、それも有効です。
Init(client, db) error
登録時に一度、どのハンドラも動きうる前に呼ばれます。Base は既に Client、DB、 Translator を埋めています。
エラーを返すと登録は中断され、モジュールは読み込まれません。
ClientReady() error
Telegram クライアントが接続した時点で呼ばれます。API を必要とする処理向けです。 Init は接続が存在する前に走ることがあります。
OnUnload() error
モジュールが取り外されるときに呼ばれます。ゴルーチンとハンドルを解放してください。
ここでの panic は回復されログに残り、取り外しはそのまま続きます。
OnDlmod() error
.dlmod での導入直後に呼ばれます。
Commands() map[string]CommandHandler
コマンド語からハンドラへの対応。キーは利用者がプレフィックスの後に入力するもので、 大文字小文字は区別しません。ウォッチャーだけのモジュールなら nil でも有効です。
Watchers() []WatcherHandler
すべてのメッセージで呼ばれるハンドラ。Base は nil を返します。
ハンドラの型
go
type CommandHandler func(msg *Message) error
type WatcherHandler func(msg *Message) errorライフサイクルの順序
生成 → Base の紐付け → Init → [登録完了] → ClientReady
↓
コマンド / ウォッチャー
↓
OnUnload最小のモジュール
go
package modules
import "goroku/goroku"
type Ping struct{ goroku.Base }
func (m *Ping) Name() string { return "Ping" }
func (m *Ping) Commands() map[string]goroku.CommandHandler {
return map[string]goroku.CommandHandler{
"ping": func(msg *goroku.Message) error { return msg.Answer("🏓 pong") },
}
}Base を使わない実装
Base は任意です。8つのメソッドをすべて自分で実装したモジュールもまったく同じ ように動きますし、Base が存在する前に書かれたモジュールも変更なしで読み込まれ 続けます。