Forráskód Böngészése

Basic plugin system

ayn2op 3 éve
szülő
commit
71158b12c9
2 módosított fájl, 72 hozzáadás és 0 törlés
  1. 11 0
      main.go
  2. 61 0
      plugin.go

+ 11 - 0
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)

+ 61 - 0
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
+}