Files
gotify-server/plugin/example/echo/echo.go
2020-05-08 10:43:17 +02:00

121 lines
2.9 KiB
Go

package main
import (
"encoding/json"
"fmt"
"log"
"net/url"
"github.com/gin-gonic/gin"
"github.com/gotify/plugin-api"
)
// GetGotifyPluginInfo returns gotify plugin info.
func GetGotifyPluginInfo() plugin.Info {
return plugin.Info{
ModulePath: "github.com/gotify/server/v2/plugin/example/echo",
Name: "test plugin",
}
}
// EchoPlugin is the gotify plugin instance.
type EchoPlugin struct {
msgHandler plugin.MessageHandler
storageHandler plugin.StorageHandler
config *Config
basePath string
}
// SetStorageHandler implements plugin.Storager
func (c *EchoPlugin) SetStorageHandler(h plugin.StorageHandler) {
c.storageHandler = h
}
// SetMessageHandler implements plugin.Messenger.
func (c *EchoPlugin) SetMessageHandler(h plugin.MessageHandler) {
c.msgHandler = h
}
// Storage defines the plugin storage scheme
type Storage struct {
CalledTimes int `json:"called_times"`
}
// Config defines the plugin config scheme
type Config struct {
MagicString string `yaml:"magic_string"`
}
// DefaultConfig implements plugin.Configurer
func (c *EchoPlugin) DefaultConfig() interface{} {
return &Config{
MagicString: "hello world",
}
}
// ValidateAndSetConfig implements plugin.Configurer
func (c *EchoPlugin) ValidateAndSetConfig(config interface{}) error {
c.config = config.(*Config)
return nil
}
// Enable enables the plugin.
func (c *EchoPlugin) Enable() error {
log.Println("echo plugin enabled")
return nil
}
// Disable disables the plugin.
func (c *EchoPlugin) Disable() error {
log.Println("echo plugin disbled")
return nil
}
// RegisterWebhook implements plugin.Webhooker.
func (c *EchoPlugin) RegisterWebhook(baseURL string, g *gin.RouterGroup) {
c.basePath = baseURL
g.GET("/echo", func(ctx *gin.Context) {
storage, _ := c.storageHandler.Load()
conf := new(Storage)
json.Unmarshal(storage, conf)
conf.CalledTimes++
newStorage, _ := json.Marshal(conf)
c.storageHandler.Save(newStorage)
c.msgHandler.SendMessage(plugin.Message{
Title: "Hello received",
Message: fmt.Sprintf("echo server received a hello message %d times", conf.CalledTimes),
Priority: 2,
Extras: map[string]interface{}{
"plugin::name": "echo",
},
})
ctx.Writer.WriteString(fmt.Sprintf("Magic string is: %s\r\nEcho server running at %secho", c.config.MagicString, c.basePath))
})
}
// GetDisplay implements plugin.Displayer.
func (c *EchoPlugin) GetDisplay(location *url.URL) string {
loc := &url.URL{
Path: c.basePath,
}
if location != nil {
loc.Scheme = location.Scheme
loc.Host = location.Host
}
loc = loc.ResolveReference(&url.URL{
Path: "echo",
})
return "Echo plugin running at: " + loc.String()
}
// NewGotifyPluginInstance creates a plugin instance for a user context.
func NewGotifyPluginInstance(ctx plugin.UserContext) plugin.Plugin {
return &EchoPlugin{}
}
func main() {
panic("this should be built as go plugin")
}