Skip to content

モジュールの構造

すべてのモジュールは goroku.Module を満たします。goroku.Base を埋め込むと NameCommands 以外のすべてに既定実装が入るので、書く必要があるのはその 2つだけです。

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
}

必須

Name

.help.unloadmod、設定画面で使われるモジュールの識別名です。Go の型名でも あり、データを保存するキーでもあります。

go
func (m *Weather) Name() string { return "Weather" }

Commands

コマンド語とハンドラを対応づけます。利用者はプレフィックスの後にその語を入力する ので、"weather".weather になります。

go
func (m *Weather) Commands() map[string]goroku.CommandHandler {
	return map[string]goroku.CommandHandler{
		"weather":  m.WeatherCmd,
		"forecast": m.ForecastCmd,
	}
}

CommandHandlerfunc(msg *goroku.Message) error です。エラーを返すと利用者 に表示されます。ディスパッチャは panic も回復するので、ハンドラのクラッシュで ボットが落ちることはありません。

任意(Base に既定値あり)

Strings

利用者向けの文言であり、m.T の参照元です。2つのキー接頭辞が特別です。

キー意味
name.help での表示名
_cls_docモジュールの説明
_cmd_doc_<コマンド>そのコマンドの説明

それ以外は自由で、m.T で取り出します。

go
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.Clientm.DBm.Translator を埋めているので、Init は自分の準備だけに 使ってください。

go
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 は接続前に走ることがあります。

go
func (m *Weather) ClientReady() error {
	me := m.Client.Me()
	_ = me
	return nil
}

OnUnload

モジュールが取り外されるときに呼ばれます。ゴルーチン、タイマー、ファイルハンドル はここで解放します。

go
func (m *Weather) OnUnload() error {
	close(m.stop)
	return nil
}

WARNING

OnUnload 内の panic は回復されログに残りますが、モジュールの取り外しは続行され ます。正しさに関わる後始末を OnUnload に頼らないでください。

OnDlmod

.dlmod での導入直後に呼ばれます。一度きりの挨拶や初期設定に便利です。

Watchers

コマンドだけでなく、すべてのメッセージを見るハンドラです。 ウォッチャー を参照。

インターフェースの外側

いくつかの機能は別インターフェースで任意に有効化できます。メソッドを宣言すれば Goroku が拾います。

インターフェースメソッド目的
ModuleWithMetaCommandMetas()エイリアスと制限
ModuleWithConfigSchemaConfigSchema()型付き設定
ModuleWithConfigReadyConfigReady(map[string]any)設定変更への反応
ModuleWithTranslationAliasesTranslationAliases()翻訳ファイル名の別名

全一覧は オプションのインターフェース に あります。

Released under the GNU AGPL v3 License.