lua module now loading/unloading scripts

This commit is contained in:
Aaron Blakely 2024-02-27 02:37:29 -06:00
parent 80bea46895
commit 5626a7844b
5 changed files with 123 additions and 8 deletions

View File

@ -58,6 +58,8 @@ MY_API void chanprivmsg_handler(struct irc_conn *bot, char *user, char *host, ch
{ {
lua_fire_handlers(PRIVMSG_CHAN, user, host, chan, text); lua_fire_handlers(PRIVMSG_CHAN, user, host, chan, text);
lua_eval(bot, user, host, chan, text); lua_eval(bot, user, host, chan, text);
lua_load_script(bot, user, host, chan, text);
lua_unload_script(bot, user, host, chan, text);
} }
MY_API void selfprivmsg_handler(struct irc_conn *bot, char *user, char *host, const char *text) MY_API void selfprivmsg_handler(struct irc_conn *bot, char *user, char *host, const char *text)

View File

@ -8,6 +8,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <libgen.h>
#include "lua.h" #include "lua.h"
@ -31,7 +32,6 @@ MY_API void lua_eval(struct irc_conn *bot, char *user, char *host, char *chan, c
} }
} }
MY_API void lua_load_script(struct irc_conn *bot, char *user, char *host, char *chan, const char *text) MY_API void lua_load_script(struct irc_conn *bot, char *user, char *host, char *chan, const char *text)
{ {
char *name; char *name;
@ -41,13 +41,48 @@ MY_API void lua_load_script(struct irc_conn *bot, char *user, char *host, char *
if (strstr(text, "!load") != NULL) if (strstr(text, "!load") != NULL)
{ {
text = skip((char *)text, ' '); text = skip((char *)text, ' ');
sprintf(buf, "../scripts/%s", text); sprintf(buf, "./scripts/%s", text);
strlcpy(lua.scripts[lua.script_count].fname, buf, 150); strlcpy(lua.scripts[lua.script_count].fname, buf, 150);
if (luaL_loadfile(lua.L, buf)) if (luaL_loadfile(lua.L, buf) != LUA_OK)
{ {
irc_privmsg(bot, chan, "Error: %s", lua_tostring(lua.L, -1)); irc_privmsg(bot, chan, "Error loading lua script: %s", lua_tostring(lua.L, -1));
return;
}
name = basename(buf);
// execute the script
if (lua_pcall(lua.L, 0, 0, 0) != LUA_OK)
{
irc_privmsg(bot, chan, "Error executing lua script: %s", lua_tostring(lua.L, -1));
return;
}
// get a ref to unload function if it exists and store it with luaL_ref
lua_getglobal(lua.L, "unload");
if (lua_isfunction(lua.L, -1))
{
lua.scripts[lua.script_count].unload = luaL_ref(lua.L, LUA_REGISTRYINDEX);
printf("dbg: unload ref: %d\n", lua.scripts[lua.script_count].unload);
}
else
{
lua.scripts[lua.script_count].unload = -1;
irc_privmsg(bot, chan, "No unload() function in %s", name);
}
// call the load function if it exists
lua_getglobal(lua.L, "load");
if (lua_isfunction(lua.L, -1))
{
if (lua_pcall(lua.L, 0, 0, 0) != LUA_OK)
{
irc_privmsg(bot, chan, "Error calling load() in %s: %s", buf, lua_tostring(lua.L, -1));
return; return;
} }
@ -56,6 +91,56 @@ MY_API void lua_load_script(struct irc_conn *bot, char *user, char *host, char *
irc_privmsg(bot, chan, buf); irc_privmsg(bot, chan, buf);
} }
else
{
irc_privmsg(bot, chan, "Error: No load() function in %s", buf);
}
}
free(buf);
}
MY_API void lua_unload_script(struct irc_conn *bot, char *user, char *host, char *chan, const char *text)
{
char *name;
char *script;
char *buf = (char *)malloc(sizeof(char *) * 500);
if (strstr(text, "!unload") != NULL)
{
text = skip((char *)text, ' ');
sprintf(buf, "./scripts/%s", text);
irc_privmsg(bot, chan, "Unloading %s", buf);
for (int i = 0; i < lua.script_count; i++)
{
if (strcmp(lua.scripts[i].fname, buf) == 0)
{
// call from the ref in .unload
lua_rawgeti(lua.L, LUA_REGISTRYINDEX, lua.scripts[i].unload);
if (lua_pcall(lua.L, 0, 0, 0) != LUA_OK)
{
irc_privmsg(bot, chan, "Error calling unload() in %s: %s", buf, lua_tostring(lua.L, -1));
return;
}
luaL_unref(lua.L, LUA_REGISTRYINDEX, lua.scripts[i].unload);
lua.scripts[i].unload = -1;
sprintf(buf, "Unloaded %s", text);
irc_privmsg(bot, chan, buf);
lua.script_count--;
free(buf);
return;
}
}
irc_privmsg(bot, chan, "Error: %s not loaded", text);
}
free(buf); free(buf);
} }

View File

@ -14,6 +14,7 @@ struct lua_script
char description[256]; char description[256];
char fname[256]; char fname[256];
int unload;
}; };
struct lua_event struct lua_event
@ -70,5 +71,7 @@ MY_API void quit_handler(struct irc_conn *bot, char *user, char *host, const cha
// lua.c // lua.c
void lua_setvar(char *name, char *value); void lua_setvar(char *name, char *value);
MY_API void lua_eval(struct irc_conn *bot, char *user, char *host, char *chan, const char *text); MY_API void lua_eval(struct irc_conn *bot, char *user, char *host, char *chan, const char *text);
MY_API void lua_load_script(struct irc_conn *bot, char *user, char *host, char *chan, const char *text);
MY_API void lua_unload_script(struct irc_conn *bot, char *user, char *host, char *chan, const char *text);
#endif #endif

View File

@ -6,10 +6,12 @@ DESCRIPTION = "A simple hello world script for xbot"
local handlers = {} local handlers = {}
function hi(nick, host, chan, text) function hi(nick, host, chan, text)
irc_privmsg(chan, "Hello, " .. nick .. "!") privmsg(chan, "Hello, " .. nick .. "!")
end end
function load() function load()
-- register_script(NAME, VERSION, AUTHOR, DESCRIPTION)
table.insert(handlers, {PRIVMSG_CHAN, add_handler(PRIVMSG_CHAN, hi)}) table.insert(handlers, {PRIVMSG_CHAN, add_handler(PRIVMSG_CHAN, hi)})
end end

23
scripts/test.lua Executable file
View File

@ -0,0 +1,23 @@
NAME = "hello"
VERSION = "v0.5"
AUTHOR = "Aaron Blakely"
DESCRIPTION = "A simple hello world script for xbot"
local handlers = {}
function hi(nick, host, chan, text)
privmsg(chan, "Hello, " .. nick .. " from test.lua!")
end
function load()
-- register_script(NAME, VERSION, AUTHOR, DESCRIPTION)
table.insert(handlers, {PRIVMSG_CHAN, add_handler(PRIVMSG_CHAN, hi)})
end
function unload()
privmsg("#lobby", "Unloading test.lua")
for i, v in ipairs(handlers) do
del_handler(v[1], v[2])
end
end