Ctrl K
ComunidadGuías…

plugins.go

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
//go:build cgo && (linux || darwin || freebsd)

package main

import (
	"errors"
	"fmt"
	"os"
	"path"
	"path/filepath"
	"plugin"
	"strings"

	log "github.com/sirupsen/logrus"

	"github.com/Luzifer/twitch-bot/v3/plugins"
)

func loadPlugins(pluginDir string) error {
	logger := log.WithField("plugin_dir", pluginDir)

	d, err := os.Stat(pluginDir)
	if err != nil {
		if os.IsNotExist(err) {
			logger.Debug("Plugin directory not found, skipping")
			return nil
		}
		return fmt.Errorf("getting plugin-dir info: %w", err)
	}

	if !d.IsDir() {
		return errors.New("plugin-dir is not a directory")
	}

	args := getRegistrationArguments()

	if err = filepath.Walk(pluginDir, func(currentPath string, _ os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		if !strings.HasSuffix(currentPath, ".so") {
			// Ignore that file, is not a plugin
			return nil
		}

		logger := log.WithField("plugin", path.Base(currentPath))

		p, err := plugin.Open(currentPath)
		if err != nil {
			logger.WithError(err).Error("Unable to open plugin")
			return nil
		}

		f, err := p.Lookup("Register")
		if err != nil {
			logger.WithError(err).Error("Unable to find register function")
			return nil
		}

		if err = f.(func(plugins.RegistrationArguments) error)(args); err != nil {
			return fmt.Errorf("registering plugin: %w", err)
		}

		return nil
	}); err != nil {
		return fmt.Errorf("loading plugins: %w", err)
	}

	return nil
}