sharded-gotify/plugin/compat/v1.go

184 lines
4.4 KiB
Go

package compat
import (
"net/url"
"github.com/gin-gonic/gin"
papiv1 "github.com/gotify/plugin-api"
)
// PluginV1 is an abstraction of a plugin written in the v1 plugin API. Exported for testing purposes only.
type PluginV1 struct {
Info papiv1.Info
Constructor func(ctx papiv1.UserContext) papiv1.Plugin
}
// APIVersion returns the API version
func (c PluginV1) APIVersion() string {
return "v1"
}
// PluginInfo implements conpat/Plugin
func (c PluginV1) PluginInfo() Info {
return Info{
Version: c.Info.Version,
Author: c.Info.Author,
Name: c.Info.Name,
Website: c.Info.Website,
Description: c.Info.Description,
License: c.Info.License,
ModulePath: c.Info.ModulePath,
}
}
// NewPluginInstance implements compat/Plugin
func (c PluginV1) NewPluginInstance(ctx UserContext) PluginInstance {
instance := c.Constructor(papiv1.UserContext{
ID: ctx.ID,
Name: ctx.Name,
Admin: ctx.Admin,
})
compat := &PluginV1Instance{
instance: instance,
}
if displayer, ok := instance.(papiv1.Displayer); ok {
compat.displayer = displayer
}
if messenger, ok := instance.(papiv1.Messenger); ok {
compat.messenger = messenger
}
if configurer, ok := instance.(papiv1.Configurer); ok {
compat.configurer = configurer
}
if storager, ok := instance.(papiv1.Storager); ok {
compat.storager = storager
}
if webhooker, ok := instance.(papiv1.Webhooker); ok {
compat.webhooker = webhooker
}
return compat
}
// PluginV1Instance is an adapter for plugin using v1 API
type PluginV1Instance struct {
instance papiv1.Plugin
messenger papiv1.Messenger
configurer papiv1.Configurer
storager papiv1.Storager
webhooker papiv1.Webhooker
displayer papiv1.Displayer
}
// DefaultConfig see papiv1.Configurer
func (c *PluginV1Instance) DefaultConfig() interface{} {
if c.configurer != nil {
return c.configurer.DefaultConfig()
}
return struct{}{}
}
// ValidateAndSetConfig see papiv1.Configurer
func (c *PluginV1Instance) ValidateAndSetConfig(config interface{}) error {
if c.configurer != nil {
return c.configurer.ValidateAndSetConfig(config)
}
return nil
}
// GetDisplay see papiv1.Displayer
func (c *PluginV1Instance) GetDisplay(location *url.URL) string {
if c.displayer != nil {
return c.displayer.GetDisplay(location)
}
return ""
}
// SetMessageHandler see papiv1.Messenger
func (c *PluginV1Instance) SetMessageHandler(h MessageHandler) {
if c.messenger != nil {
c.messenger.SetMessageHandler(&PluginV1MessageHandler{WrapperHandler: h})
}
}
// RegisterWebhook see papiv1.Webhooker
func (c *PluginV1Instance) RegisterWebhook(basePath string, mux *gin.RouterGroup) {
if c.webhooker != nil {
c.webhooker.RegisterWebhook(basePath, mux)
}
}
// SetStorageHandler see papiv1.Storager
func (c *PluginV1Instance) SetStorageHandler(handler StorageHandler) {
if c.storager != nil {
c.storager.SetStorageHandler(&PluginV1StorageHandler{WrapperHandler: handler})
}
}
// Supports returns a slice of capabilities the plugin instance provides
func (c *PluginV1Instance) Supports() Capabilities {
modules := Capabilities{}
if c.configurer != nil {
modules = append(modules, Configurer)
}
if c.displayer != nil {
modules = append(modules, Displayer)
}
if c.messenger != nil {
modules = append(modules, Messenger)
}
if c.storager != nil {
modules = append(modules, Storager)
}
if c.webhooker != nil {
modules = append(modules, Webhooker)
}
return modules
}
// PluginV1MessageHandler is an adapter for messenger plugin handler using v1 API
type PluginV1MessageHandler struct {
WrapperHandler MessageHandler
}
// SendMessage implements papiv1.MessageHandler
func (c *PluginV1MessageHandler) SendMessage(msg papiv1.Message) error {
return c.WrapperHandler.SendMessage(Message{
Message: msg.Message,
Priority: msg.Priority,
Title: msg.Title,
Extras: msg.Extras,
})
}
// Enable implements wrapper.Plugin
func (c *PluginV1Instance) Enable() error {
return c.instance.Enable()
}
// Disable implements wrapper.Plugin
func (c *PluginV1Instance) Disable() error {
return c.instance.Disable()
}
// PluginV1StorageHandler is a wrapper for v1 storage handler
type PluginV1StorageHandler struct {
WrapperHandler StorageHandler
}
// Save implements wrapper.Storager
func (c *PluginV1StorageHandler) Save(b []byte) error {
return c.WrapperHandler.Save(b)
}
// Load implements wrapper.Storager
func (c *PluginV1StorageHandler) Load() ([]byte, error) {
return c.WrapperHandler.Load()
}