From 71158b12c9689a1b8b5e35fa93da94902bf85d83 Mon Sep 17 00:00:00 2001 From: ayn2op Date: Sun, 8 Jan 2023 21:48:15 +0530 Subject: [PATCH] Basic plugin system --- main.go | 11 ++++++++++ plugin.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 plugin.go diff --git a/main.go b/main.go index e8d85b3..6096f7c 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "context" "flag" + "fmt" "log" "github.com/rivo/tview" @@ -11,6 +12,7 @@ import ( var ( token string + plugins []*Plugin cfg *Config discordState *State @@ -30,6 +32,15 @@ func main() { flag.Parse() var err error + err = loadPlugins() + if err != nil { + log.Fatal(err) + } + + for _, p := range plugins { + fmt.Println(p.Name()) + } + cfg, err = newConfig() if err != nil { log.Fatal(err) diff --git a/plugin.go b/plugin.go new file mode 100644 index 0000000..67b33f4 --- /dev/null +++ b/plugin.go @@ -0,0 +1,61 @@ +package main + +import ( + "log" + "os" + "path/filepath" + "plugin" +) + +type Plugin struct { + *plugin.Plugin +} + +func newPlugin(path string) (*Plugin, error) { + p, err := plugin.Open(path) + if err != nil { + return nil, err + } + + return &Plugin{Plugin: p}, nil +} + +func (p *Plugin) Name() string { + s, _ := p.Lookup("Name") + return *(s).(*string) +} + +func loadPlugins() error { + path, err := os.UserConfigDir() + if err != nil { + log.Fatal(err) + } + + path = filepath.Join(path, name, "plugins") + err = os.MkdirAll(path, os.ModePerm) + if err != nil { + return err + } + + entries, err := os.ReadDir(path) + if err != nil { + return err + } + + for _, entry := range entries { + if entry.IsDir() { + continue + } + + if filepath.Ext(entry.Name()) == ".so" { + p, err := newPlugin(filepath.Join(path, entry.Name())) + if err != nil { + return err + } + + plugins = append(plugins, p) + } + } + + return nil +}