Skip to content

EventContext

EventContext - единый контекст, передаваемый во все обработчики событий: команды, HTTP, cron и event bus триггеры.

Общие поля

ПолеТипОписание
PluginIDstringID текущего плагина
TriggerTypestring"messenger", "http", "cron", "event"
TriggerNamestringИмя конкретного триггера/команды
Timestampint64Unix timestamp события

Данные по типу триггера

В зависимости от типа триггера одно из этих полей не nil:

ПолеТипНе nil когда
Messenger*MessengerDataКоманды мессенджера
HTTP*HTTPEventDataHTTP-триггеры
Cron*CronEventDataCron-триггеры
Event*EventBusDataEvent bus-триггеры

MessengerData

ПолеТипОписание
UserIDint64ID пользователя
ChannelTypestringТип канала ("telegram", "discord", ...)
ChatIDstringID чата
CommandNamestringИмя вызванной команды
Paramsmap[string]stringСобранные параметры
LocalestringЛокаль пользователя
Files[]FileRefПрикреплённые файлы (пусто, если сообщение без файлов)

HTTPEventData

ПолеТипОписание
MethodstringHTTP-метод (GET, POST, ...)
PathstringПуть запроса
Querymap[string]stringQuery-параметры
Headersmap[string]stringЗаголовки запроса
BodystringТело запроса
RemoteAddrstringIP-адрес клиента
Auth*HTTPAuthInfoPrincipal, прошедший host-auth

HTTPAuthInfo

ПолеТипОписание
Kindstring"user" или "service"
UserIDint64ID пользователя для запросов с cookie-сессией или user bearer token
ServiceKeyIDint64ID service-key для server-to-server запросов

CronEventData

ПолеТипОписание
ScheduleNamestringИмя расписания (= Name триггера)
FireTimeint64Unix timestamp срабатывания

EventBusData

ПолеТипОписание
TopicstringТопик события
Payload[]byteJSON payload события
SourcestringID плагина-отправителя

Методы

Ответы в чат

ctx.Reply(msg Message)

Устанавливает ответ для текущего чата. Поддерживает rich content и встроенную локализацию. Работает только при TriggerType == "messenger".

go
// Простой текст
ctx.Reply(wasmplugin.NewMessage("Готово!"))

// Локализованное сообщение
ctx.Reply(wasmplugin.NewLocalizedMessage(catalog.L("task_done")))

// Rich content: текст + файл
ctx.Reply(wasmplugin.NewMessage("Вот расписание").File(ref, "schedule.pdf"))

Файлы

МетодОписание
ctx.HasFiles()Есть ли прикреплённые файлы
ctx.Files()Список []FileRef
ctx.FileMeta(fileID)Метаданные файла
ctx.FileReadAll(fileID)Прочитать файл целиком
ctx.FileRead(fileID, offset, maxBytes)Чтение чанками
ctx.FileStore(name, mime, type, data)Сохранить файл

Подробнее: Файлы

ctx.FileRead(...) и ctx.FileReadAll(...) остаются рекомендуемым API SDK. В новых сборках они внутри используют file_read_into; raw host ABI file_read оставлен только для совместимости со старыми плагинами.

Уведомления

МетодОписание
ctx.NotifyUser(userID, text, priority)Уведомление пользователю с учётом предпочтений
ctx.NotifyChat(channelType, chatID, text, priority)Уведомление в конкретный чат
ctx.NotifyStudents().Stream(id).Message(msg).Send()Уведомление студентам по университетской иерархии (builder)

Подробнее: Уведомления

HTTP-ответы

ctx.SetHTTPResponse(statusCode int, headers map[string]string, body string)

Устанавливает произвольный HTTP-ответ с кастомными заголовками. Работает только в HTTP-триггерах.

go
ctx.SetHTTPResponse(200, map[string]string{
    "Content-Type": "text/plain",
}, "OK")

ctx.JSON(statusCode int, v interface{})

Сериализует значение в JSON и устанавливает его как HTTP-ответ. Заголовок Content-Type: application/json добавляется автоматически.

go
ctx.JSON(200, map[string]string{"status": "ok"})

Логирование

МетодОписание
ctx.Log(msg)Info-лог
ctx.LogError(msg)Error-лог
go
ctx.Log("обработка завершена")
ctx.LogError("не удалось подключиться к API")

Доступ к данным

ctx.Config(key string, fallback string) string

Получает значение конфигурации плагина. Если ключ не установлен, возвращается fallback.

go
apiURL := ctx.Config("api_url", "https://api.example.com")

ctx.Param(key string) string

Получает параметр команды. Shortcut для ctx.Messenger.Params[key].

go
name := ctx.Param("name")

ctx.Locale() string

Возвращает локаль пользователя (например "ru", "en"). По умолчанию "en".

go
locale := ctx.Locale()

Определение типа события

go
Handler: func(ctx *wasmplugin.EventContext) error {
    switch ctx.TriggerType {
    case wasmplugin.TriggerMessenger:
        // ctx.Messenger != nil
        ctx.Reply(wasmplugin.NewMessage("Привет, " + ctx.Param("name")))

    case wasmplugin.TriggerHTTP:
        // ctx.HTTP != nil
        ctx.JSON(200, map[string]string{"method": ctx.HTTP.Method})

    case wasmplugin.TriggerCron:
        // ctx.Cron != nil
        ctx.Log("cron сработал: " + ctx.Cron.ScheduleName)

    case wasmplugin.TriggerEvent:
        // ctx.Event != nil
        ctx.Log("событие из " + ctx.Event.Source + ": " + ctx.Event.Topic)
    }
    return nil
}