mirror of
https://github.com/komari-monitor/komari.git
synced 2026-11-12 17:31:20 +00:00
117 lines
2.8 KiB
Go
117 lines
2.8 KiB
Go
package javascript
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/komari-monitor/komari/database/models"
|
|
"github.com/komari-monitor/komari/pkg/jsruntime"
|
|
"github.com/komari-monitor/komari/utils/messageSender/factory"
|
|
)
|
|
|
|
type JavaScriptSender struct {
|
|
Addition
|
|
runtime *jsruntime.Runtime
|
|
}
|
|
|
|
func (j *JavaScriptSender) GetName() string {
|
|
return "Javascript"
|
|
}
|
|
|
|
func (j *JavaScriptSender) GetConfiguration() factory.Configuration {
|
|
return &j.Addition
|
|
}
|
|
|
|
func (j *JavaScriptSender) Init() error {
|
|
runtime, err := jsruntime.New(j.Addition.Script, jsruntime.Options{})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !runtime.HasFunction("sendMessage") {
|
|
runtime.Close()
|
|
return errors.New("sendMessage function not defined or not callable in script")
|
|
}
|
|
if j.runtime != nil {
|
|
j.runtime.Close()
|
|
}
|
|
j.runtime = runtime
|
|
return nil
|
|
}
|
|
|
|
func (j *JavaScriptSender) Destroy() error {
|
|
if j.runtime != nil {
|
|
j.runtime.Close()
|
|
j.runtime = nil
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (j *JavaScriptSender) SendTextMessage(message, title string) error {
|
|
if err := j.ensureRuntime(); err != nil {
|
|
return err
|
|
}
|
|
return j.runtime.Call("sendMessage", message, title)
|
|
}
|
|
|
|
func (j *JavaScriptSender) SendEvent(event models.EventMessage) error {
|
|
if err := j.ensureRuntime(); err != nil {
|
|
return err
|
|
}
|
|
if !j.runtime.HasFunction("sendEvent") {
|
|
return j.fallbackToTextMessage(event)
|
|
}
|
|
|
|
eventJSON, err := json.Marshal(event)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal event: %v", err)
|
|
}
|
|
var eventMap map[string]interface{}
|
|
if err := json.Unmarshal(eventJSON, &eventMap); err != nil {
|
|
return fmt.Errorf("failed to unmarshal event: %v", err)
|
|
}
|
|
return j.runtime.Call("sendEvent", eventMap)
|
|
}
|
|
|
|
func (j *JavaScriptSender) ensureRuntime() error {
|
|
if j.runtime != nil {
|
|
return nil
|
|
}
|
|
return j.Init()
|
|
}
|
|
|
|
// fallbackToTextMessage formats structured events for scripts that only
|
|
// implement sendMessage.
|
|
func (j *JavaScriptSender) fallbackToTextMessage(event models.EventMessage) error {
|
|
message := fmt.Sprintf("%v%v%v\nEvent: %v\nMessage: %v\nTime: %s",
|
|
event.Emoji, event.Emoji, event.Emoji,
|
|
event.Event,
|
|
event.Message,
|
|
event.Time.UTC().Format("2006-01-02 15:04:05"))
|
|
if len(event.Clients) > 0 {
|
|
clientNames := make([]string, 0, len(event.Clients))
|
|
for _, client := range event.Clients {
|
|
name := client.Name
|
|
if name == "" {
|
|
name = client.UUID
|
|
}
|
|
clientNames = append(clientNames, name)
|
|
}
|
|
message = fmt.Sprintf("%v%v%v\nEvent: %v\nClients: %s\nMessage: %v\nTime: %s",
|
|
event.Emoji, event.Emoji, event.Emoji,
|
|
event.Event,
|
|
clientNames,
|
|
event.Message,
|
|
event.Time.UTC().Format("2006-01-02 15:04:05"))
|
|
}
|
|
return j.SendTextMessage(message, fmt.Sprint(event.Event))
|
|
}
|
|
|
|
func init() {
|
|
factory.RegisterMessageSender(func() factory.IMessageSender {
|
|
return &JavaScriptSender{}
|
|
})
|
|
}
|
|
|
|
var _ factory.IMessageSender = (*JavaScriptSender)(nil)
|