plugin.go 890 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package main
  2. import (
  3. "log"
  4. "os"
  5. "path/filepath"
  6. "plugin"
  7. )
  8. type Plugin struct {
  9. *plugin.Plugin
  10. }
  11. func newPlugin(path string) (*Plugin, error) {
  12. p, err := plugin.Open(path)
  13. if err != nil {
  14. return nil, err
  15. }
  16. return &Plugin{Plugin: p}, nil
  17. }
  18. func (p *Plugin) Name() string {
  19. s, _ := p.Lookup("Name")
  20. return *(s).(*string)
  21. }
  22. func loadPlugins() error {
  23. path, err := os.UserConfigDir()
  24. if err != nil {
  25. log.Fatal(err)
  26. }
  27. path = filepath.Join(path, name, "plugins")
  28. err = os.MkdirAll(path, os.ModePerm)
  29. if err != nil {
  30. return err
  31. }
  32. entries, err := os.ReadDir(path)
  33. if err != nil {
  34. return err
  35. }
  36. for _, entry := range entries {
  37. if entry.IsDir() {
  38. continue
  39. }
  40. if filepath.Ext(entry.Name()) == ".so" {
  41. p, err := newPlugin(filepath.Join(path, entry.Name()))
  42. if err != nil {
  43. return err
  44. }
  45. plugins = append(plugins, p)
  46. }
  47. }
  48. return nil
  49. }