Первый модуль
Модуль Goroku — это структура на Go. Она объявляет своё имя и команды, которые обрабатывает; всё остальное — клиент Telegram, хранилище, переводы, жизненный цикл загрузки и выгрузки — приходит из goroku.Base.
Сгенерируйте заготовку
Отправьте в «Избранное»:
.newmod WeatherGoroku пришлёт Weather.go: рабочий модуль с заготовкой обработчика и подсказками по доступным хелперам прямо в комментариях. Начинать с пустого файла не придётся.
TIP
.newmod доступна только владельцу, а имя должно быть корректным именем типа Go — с заглавной буквы (Weather, не weather).
Что вы получите
package modules
import "goroku/goroku"
type Weather struct {
goroku.Base
}
func (m *Weather) Name() string { return "Weather" }
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cls_doc": "What Weather does",
"_cmd_doc_weather": "What .weather does",
"no_args": "❌ <b>Send some text or reply to a message</b>",
}
}
func (m *Weather) Commands() map[string]goroku.CommandHandler {
return map[string]goroku.CommandHandler{
"weather": m.WeatherCmd,
}
}
func (m *Weather) WeatherCmd(msg *goroku.Message) error {
input := msg.ArgsOrReply()
if input == "" {
return msg.Answer(m.T("no_args", "❌ <b>Send some text or reply to a message</b>"))
}
return msg.Answer("<b>Weather got:</b> <code>" + input + "</code>")
}Обязательны только Name и Commands. Strings есть в заготовке потому, что он нужен почти всегда, но его можно удалить.
Установите
Отправьте файл в любой чат, ответьте на него и напишите:
.loadmodGoroku соберёт его как нативный Go-плагин и зарегистрирует команду. .weather hi уже отвечает.
Нативные плагины работают в вашем процессе
Модуль выполняется как обычный код на Go внутри юзербота, с вашей сессией Telegram. Ставьте только те модули, чей исходник вы прочитали. См. Установка модуля.
Измените
Поправьте обработчик и снова .loadmod. Модуль с тем же именем структуры заменит работающий.
func (m *Weather) WeatherCmd(msg *goroku.Message) error {
city := msg.Args()
if city == "" {
return msg.Answer(m.T("no_city", "❌ <b>Какой город?</b>"))
}
return msg.Answer("🌤 <b>" + city + "</b>: ясно, 22°C")
}Дальше
- Устройство модуля — зачем нужен каждый метод
- Команды — алиасы, ограничения, лимиты
- Хранилище — помнить данные между перезапусками