/** * @Author: KLIPFEL Arthur * @Date: 2018-08-24 12:17:17 */ package plugin_manager import ( tb "gopkg.in/tucnak/telebot.v2" "log" "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(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) } } }