From f8738b563757158c8fe6ffe77d4cdc5dad1e2a62 Mon Sep 17 00:00:00 2001 From: terminaldweller Date: Mon, 3 Jun 2024 15:09:41 -0400 Subject: first lua script, WIP, rss script incoming --- main.go | 2 ++ plugins.go | 38 ++++++++++++++++++++------------------ plugins/test.lua | 13 +++++++++++++ types.go | 2 +- 4 files changed, 36 insertions(+), 19 deletions(-) create mode 100644 plugins/test.lua diff --git a/main.go b/main.go index 16f249c..ad5096d 100644 --- a/main.go +++ b/main.go @@ -1046,6 +1046,8 @@ func runIRC(appConfig TomlConfig) { chatGPTHandler(irc, &appConfig, &GPTMemory) } + go LoadAllPlugins(&appConfig, irc) + if appConfig.DatabaseAddress != "" { context, cancel := context.WithTimeout(context.Background(), time.Duration(appConfig.RequestTimeout)*time.Second) defer cancel() diff --git a/plugins.go b/plugins.go index fadc717..fa02615 100644 --- a/plugins.go +++ b/plugins.go @@ -1,11 +1,10 @@ package main import ( - "fmt" "log" - "os" "reflect" + "github.com/lrstanley/girc" lua "github.com/yuin/gopher-lua" ) @@ -180,33 +179,36 @@ func RegisterCustomLuaTypes(luaState *lua.LState) { registerStructAsLuaMetaTable[LogModel](luaState, checkStruct, LogModel{}, "log_model") } -func returnAllPlugins(pluginPath string) ([]string, error) { - pluginList := make([]string, 0) +func sendMessageClosure(luaState *lua.LState, client *girc.Client) func(*lua.LState) int { + return func(luaState *lua.LState) int { + message := luaState.CheckString(1) + target := luaState.CheckString(2) - files, err := os.ReadDir(pluginPath) - if err != nil { - return pluginList, fmt.Errorf("Error reading plugins directory: %v", err) - } + client.Cmd.Message(target, message) - for _, file := range files { - pluginList = append(pluginList, file.Name()) + return 0 } - - return pluginList, nil } -func LoadAllPlugins(appConfig *TomlConfig) { +func RunScript(scriptPath string, client *girc.Client) { luaState := lua.NewState() defer luaState.Close() RegisterCustomLuaTypes(luaState) - allPlugins, err := returnAllPlugins(appConfig.PluginPath) - if err != nil { - luaState.Close() + luaState.SetGlobal("send_message", luaState.NewFunction(sendMessageClosure(luaState, client))) - log.Fatal(err) //nolint: gocritic + log.Print("Running script: ", scriptPath) + err := luaState.DoFile(scriptPath) + + if err != nil { + log.Print(err) } +} - log.Println(allPlugins) +func LoadAllPlugins(appConfig *TomlConfig, client *girc.Client) { + for _, scriptPath := range appConfig.Plugins { + log.Print("Loading plugin: ", scriptPath) + go RunScript(scriptPath, client) + } } diff --git a/plugins/test.lua b/plugins/test.lua new file mode 100644 index 0000000..23eab94 --- /dev/null +++ b/plugins/test.lua @@ -0,0 +1,13 @@ +local function sleep(n) + local t0 = os.clock() + while os.clock() - t0 <= n do end +end + +local function printer() + while true do + send_message("Hello, World!", "#warroom") + sleep(5) + end +end + +printer() diff --git a/types.go b/types.go index e068c70..ded95ec 100644 --- a/types.go +++ b/types.go @@ -47,7 +47,7 @@ type TomlConfig struct { WebIRCGateway string `toml:"webIRCGateway"` WebIRCHostname string `toml:"webIRCHostname"` WebIRCAddress string `toml:"webIRCAddress"` - PluginPath string `toml:"pluginPath"` + Plugins []string `toml:"plugins"` CustomCommands map[string]CustomCommand `toml:"customCommands"` Temp float64 `toml:"temp"` RequestTimeout int `toml:"requestTimeout"` -- cgit v1.2.3