Skip to content

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 が存在する前に書かれたモジュールも変更なしで読み込まれ 続けます。

Released under the GNU AGPL v3 License.