package plugin import ( "sync" "git.nakama.town/fmartingr/butterrobot/internal/model" ) var ( // plugins holds all registered plugins plugins = make(map[string]model.Plugin) // pluginsMu protects the plugins map pluginsMu sync.RWMutex ) // Register registers a plugin with the given ID func Register(plugin model.Plugin) { pluginsMu.Lock() defer pluginsMu.Unlock() plugins[plugin.GetID()] = plugin } // Get returns a plugin by ID func Get(id string) (model.Plugin, error) { pluginsMu.RLock() defer pluginsMu.RUnlock() plugin, exists := plugins[id] if !exists { return nil, model.ErrPluginNotFound } return plugin, nil } // GetAvailablePlugins returns all registered plugins func GetAvailablePlugins() map[string]model.Plugin { pluginsMu.RLock() defer pluginsMu.RUnlock() // Create a copy to avoid race conditions result := make(map[string]model.Plugin, len(plugins)) for id, plugin := range plugins { result[id] = plugin } return result } // BasePlugin provides a common base for plugins type BasePlugin struct { ID string Name string Help string ConfigRequired bool } // GetID returns the plugin ID func (p *BasePlugin) GetID() string { return p.ID } // GetName returns the plugin name func (p *BasePlugin) GetName() string { return p.Name } // GetHelp returns the plugin help text func (p *BasePlugin) GetHelp() string { return p.Help } // RequiresConfig indicates if the plugin requires configuration func (p *BasePlugin) RequiresConfig() bool { return p.ConfigRequired } // OnMessage is the default implementation that does nothing func (p *BasePlugin) OnMessage(msg *model.Message, config map[string]interface{}) []*model.Message { return nil }