ALFRED/plugin_manager/manager.go

118 lines
1.9 KiB
Go
Raw Normal View History

/**
* @Author: KLIPFEL Arthur
* @Date: 2018-08-24 12:17:17
*/
package plugin_manager
import (
tb "gopkg.in/tucnak/telebot.v2"
"log"
"sync"
)
type PluginCtrl struct {
plugin Plugin
mux sync.Mutex
running bool
enable bool
}
var pluginDir string
var pluginsRunning bool
var plugins map[string]PluginCtrl
var context Context
func Init(_pluginDir string, bot *tb.Bot) {
pluginDir = _pluginDir
pluginsRunning = false
plugins = make(map[string]PluginCtrl)
context.bot = bot
for _, fileName := range GetSoFiles(pluginDir) {
var p PluginCtrl
p.plugin = LoadSoFile(pluginDir + "/" + fileName)
if p.plugin != nil {
p.running = false
p.enable = true
plugins[fileName[:len(fileName)-3]] = p
}
}
}
func EnablePlugin(name string, enable bool) {
if p, ok := plugins[name]; ok {
if enable != p.enable {
p.enable = enable
plugins[name] = p
if pluginsRunning {
if enable {
if !p.running {
startPlugin(name)
}
} else {
if p.running {
stopPlugin(name)
}
}
}
}
} else {
log.Fatal("error: plugin " + name + " not founded")
}
}
func StopPlugins() {
for k, _ := range plugins {
stopPlugin(k)
}
pluginsRunning = false
}
func HandleMessage(msg *tb.Message) {
for _, val := range plugins {
if val.enable {
val.plugin.HandleMessage(context.bot, msg.Text)
}
}
}
func StartPlugins() {
for k, val := range plugins {
if val.enable {
startPlugin(k)
}
}
pluginsRunning = true
}
func startPlugin(name string) {
if p, ok := plugins[name]; ok {
//p.mux.Lock()
if !p.running && p.enable {
p.running = true
plugins[name] = p
p.plugin.Load()
}
//p.mux.Unlock()
}
}
func stopPlugin(name string) {
if p, ok := plugins[name]; ok {
//p.mux.Lock()
if p.running {
p.running = false
plugins[name] = p
p.plugin.Unload()
}
//p.mux.Unlock()
}
}
func Exit() {
for _, p := range plugins {
if p.running {
p.plugin.Unload()
}
}
}