Base
go
type Base struct {
Client *CustomTelegramClient
DB *Database
Translator *Translator
}これを埋め込めば、モジュールに必要なのは Name と Commands だけになります。
go
type Weather struct{ goroku.Base }フィールド
| フィールド | 用途 |
|---|---|
Client | Telegram API — ファイル送信、ピア解決、インラインマネージャ |
DB | 永続ストレージ。ストレージ を参照 |
Translator | T の土台。直接触ることはまれです |
3つとも、ローダーが Init の前に埋めます。したがって Init、ClientReady、 コマンド、ウォッチャーのいずれからも使えます。
メソッド
T(key, def string) string
key の訳、無ければ def を返します。以前は各モジュールにコピーされていた getTrans ヘルパーを置き換えます。
go
return msg.Answer(m.T("no_city", "❌ <b>どの都市ですか?</b>"))解決は goroku.modules.<名前>.<key> を、モジュール名そのまま・小文字・snake_case の順で試し、続いて TranslationAliases を試します。
nil の Base でも、未登録のモジュールでも安全で、その場合は def を返します。
Init(client, db) error
フィールドを配線して nil を返します。自由に上書きしてください。
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
}ローダーは Init より前にフィールドを埋めるので、通常運用では m.Base.Init の 呼び出しは冗長です。それでも残してください。テストで直接生成したときにも動くように なります。
ClientReady() / OnUnload() / OnDlmod() error
nil を返します。必要なものだけ上書きしてください。
Strings() map[string]string
nil を返します。文言を宣言するには上書きします。
Watchers() []WatcherHandler
nil を返します。すべてのメッセージを見るには上書きします。
NewBase
go
func NewBase(client *CustomTelegramClient, db *Database) Baseローダー経由で登録されず、手で生成するモジュール向けです。内部ヘルパーやテストで 使います。
go
mod := &Weather{Base: goroku.NewBase(client, db)}埋め込み側のモジュールがここでは分からないため、登録されるまで T は既定値を 返します。
名前の衝突
構造体に既に Client、DB、Translator という名前のフィールドがある場合、 Base を埋め込むと名前が曖昧になります。自分のフィールドを改名するか、 m.Base.Client のように埋め込み構造体を明示して参照してください。