ALFRED/plugin_manager/manager.go

163 lines
2.8 KiB
Go

/**
* @Author: KLIPFEL Arthur
* @Date: 2018-08-24 12:17:17
*/
package plugin_manager
import (
tb "gopkg.in/tucnak/telebot.v2"
"log"
"path/filepath"
"strings"
"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 *tb.Bot
func Init(_pluginDir string, bot *tb.Bot) {
pluginDir = _pluginDir
pluginsRunning = false
plugins = make(map[string]PluginCtrl)
context = bot
for _, fileName := range GetSoFiles(pluginDir) {
var p PluginCtrl
p.plugin = LoadSoFile(filepath.Join(pluginDir, fileName))
if p.plugin != nil {
p.running = false
p.enable = true
plugins[fileName[:len(fileName)-3]] = p
}
}
}
func GetPluginList() []string {
var lst []string
for name, _ := range plugins {
lst = append(lst, name)
}
return lst
}
func IsPluginRunning(name string) bool {
if p, ok := plugins[name]; ok {
return p.running
}
return false
}
func ExistPlugin(name string) bool {
if _, ok := plugins[name]; ok {
return true
}
return false
}
func GetPlugin(name string) Plugin {
if p, ok := plugins[name]; ok {
return p
}
return nil
}
func IsPluginEnable(name string) bool {
if p, ok := plugins[name]; ok {
return p.enable
}
return false
}
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.running {
if strings.HasPrefix(msg.Text, "/") {
split := strings.Split(msg.Text, " ")
split[0] = split[0][1:]
if Contains(split[0], ExecGetCommands(val.plugin)) {
ExecHandleCommand(val.plugin, context, msg, split[0], split[1:])
}
} else {
ExecHandleMessage(val.plugin, context, msg)
}
}
}
}
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 = ExecLoad(p.plugin)
plugins[name] = p
}
//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
ExecUnload(p.plugin)
}
//p.mux.Unlock()
}
}
func Exit() {
for _, p := range plugins {
if p.running {
ExecUnload(p.plugin)
}
}
}