working on lua module
This commit is contained in:
parent
aa5cfa756f
commit
97713e6c29
@ -38,8 +38,10 @@ void init_mods();
|
|||||||
void load_module(struct irc_conn *bot, char *where, char *stype, char *file);
|
void load_module(struct irc_conn *bot, char *where, char *stype, char *file);
|
||||||
void unload_module(struct irc_conn *bot, char *where, char *file);
|
void unload_module(struct irc_conn *bot, char *where, char *file);
|
||||||
void list_modules(struct irc_conn *bot, char *where);
|
void list_modules(struct irc_conn *bot, char *where);
|
||||||
|
void set_bot(struct irc_conn *b);
|
||||||
MY_API void register_module(char *name, char *author, char *version, char *description);
|
MY_API void register_module(char *name, char *author, char *version, char *description);
|
||||||
MY_API void unregister_module(char *name);
|
MY_API void unregister_module(char *name);
|
||||||
MY_API struct mods *get_mods();
|
MY_API struct mods *get_mods();
|
||||||
|
MY_API struct irc_conn *get_bot();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
7
mods/lua/Makefile
Executable file
7
mods/lua/Makefile
Executable file
@ -0,0 +1,7 @@
|
|||||||
|
CC=gcc
|
||||||
|
CFLAGS=-fPIC -I../../lib -llua
|
||||||
|
OBJ=../lua.so
|
||||||
|
|
||||||
|
main:
|
||||||
|
$(CC) -shared -o $(OBJ) $(CFLAGS) ./lua.c
|
||||||
|
@echo "All Done!"
|
99
mods/lua/lua.c
Executable file
99
mods/lua/lua.c
Executable file
@ -0,0 +1,99 @@
|
|||||||
|
#define MY_DLL_EXPORTS 1
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
#include "irc.h"
|
||||||
|
#include "events.h"
|
||||||
|
#include "module.h"
|
||||||
|
#include "timers.h"
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "lua.h"
|
||||||
|
|
||||||
|
struct lua_interp lua;
|
||||||
|
struct irc_conn *instance;
|
||||||
|
|
||||||
|
MY_API void lua_eval(struct irc_conn *bot, char *user, char *host, char *chan, const char *text)
|
||||||
|
{
|
||||||
|
printf("lua eval called with %s\n", text);
|
||||||
|
if (strstr(text, "!lua") != NULL)
|
||||||
|
{
|
||||||
|
// skip the command
|
||||||
|
text = skip(text, ' ');
|
||||||
|
printf("lua: %s\n", text);
|
||||||
|
|
||||||
|
if (luaL_dostring(lua.L, text))
|
||||||
|
{
|
||||||
|
irc_privmsg(bot, chan, "Error: %s", lua_tostring(lua.L, -1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void lua_load_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, "!load") != NULL)
|
||||||
|
{
|
||||||
|
text = skip((char *)text, ' ');
|
||||||
|
sprintf(buf, "../scripts/%s", text);
|
||||||
|
|
||||||
|
strlcpy(lua.scripts[lua.count].fname, buf, 150);
|
||||||
|
|
||||||
|
if (luaL_loadfile(lua.L, buf))
|
||||||
|
{
|
||||||
|
irc_privmsg(bot, chan, "Error: %s", lua_tostring(lua.L, -1));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sprintf(buf, "Loaded %s", name);
|
||||||
|
irc_privmsg(bot, chan, buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void raw_wrapper(lua_State *L)
|
||||||
|
{
|
||||||
|
char *text = (char *)lua_tostring(L, 1);
|
||||||
|
|
||||||
|
irc_raw(instance, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void privmsg_wrapper(lua_State *L)
|
||||||
|
{
|
||||||
|
char *where = (char *)lua_tostring(L, 1);
|
||||||
|
char *text = (char *)lua_tostring(L, 2);
|
||||||
|
|
||||||
|
irc_privmsg(instance, where, text);
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void mod_init()
|
||||||
|
{
|
||||||
|
instance = get_bot();
|
||||||
|
|
||||||
|
lua.scripts = calloc(512, sizeof(struct lua_script));
|
||||||
|
lua.count = 0;
|
||||||
|
|
||||||
|
lua.L = luaL_newstate();
|
||||||
|
luaL_openlibs(lua.L);
|
||||||
|
|
||||||
|
lua_register(lua.L, "privmsg", privmsg_wrapper);
|
||||||
|
lua_register(lua.L, "raw", raw_wrapper);
|
||||||
|
|
||||||
|
register_module("lua", "Aaron Blakely", "v0.1", "Lua module");
|
||||||
|
add_handler(PRIVMSG_CHAN, lua_eval);
|
||||||
|
printf("Lua module loaded\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void mod_unload()
|
||||||
|
{
|
||||||
|
lua_close(lua.L);
|
||||||
|
|
||||||
|
unregister_module("lua");
|
||||||
|
del_handler(PRIVMSG_CHAN, lua_eval);
|
||||||
|
printf("Lua module unloaded\n");
|
||||||
|
}
|
28
mods/lua/lua.h
Executable file
28
mods/lua/lua.h
Executable file
@ -0,0 +1,28 @@
|
|||||||
|
#ifndef LUA_H
|
||||||
|
#define LUA_H
|
||||||
|
|
||||||
|
#include <lua5.3/lua.h>
|
||||||
|
#include <lua5.3/lauxlib.h>
|
||||||
|
#include <lua5.3/lualib.h>
|
||||||
|
#include "irc.h"
|
||||||
|
|
||||||
|
struct lua_script
|
||||||
|
{
|
||||||
|
char name[25];
|
||||||
|
char author[50];
|
||||||
|
char version[10];
|
||||||
|
char description[256];
|
||||||
|
|
||||||
|
char fname[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct lua_interp
|
||||||
|
{
|
||||||
|
lua_State *L;
|
||||||
|
int count;
|
||||||
|
struct lua_script *scripts;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern struct lua_interp lua;
|
||||||
|
|
||||||
|
#endif
|
17
scripts/hello.lua
Executable file
17
scripts/hello.lua
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
NAME = "hello"
|
||||||
|
VERSION = "v0.5"
|
||||||
|
AUTHOR = "Aaron Blakely"
|
||||||
|
DESCRIPTION = "A simple hello world script for xbot"
|
||||||
|
|
||||||
|
|
||||||
|
function hi(nick, host, chan, text)
|
||||||
|
irc_privmsg(chan, "Hello, " .. nick .. "!")
|
||||||
|
end
|
||||||
|
|
||||||
|
function load()
|
||||||
|
add_lua_handler("PRIVMSG_CHAN", hi)
|
||||||
|
end
|
||||||
|
|
||||||
|
function unload()
|
||||||
|
remove_lua_handler("PRIVMSG_CHAN", hi)
|
||||||
|
end
|
@ -42,6 +42,7 @@ int main()
|
|||||||
|
|
||||||
last_ping.tv_sec = time(NULL);
|
last_ping.tv_sec = time(NULL);
|
||||||
|
|
||||||
|
set_bot(&bot);
|
||||||
init_events();
|
init_events();
|
||||||
init_timers();
|
init_timers();
|
||||||
init_mods();
|
init_mods();
|
||||||
|
11
src/module.c
11
src/module.c
@ -13,6 +13,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct mods *mods;
|
struct mods *mods;
|
||||||
|
struct irc_conn *instance;
|
||||||
|
|
||||||
void init_mods()
|
void init_mods()
|
||||||
{
|
{
|
||||||
@ -304,3 +305,13 @@ MY_API struct mods *get_mods()
|
|||||||
{
|
{
|
||||||
return mods;
|
return mods;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MY_API struct irc_conn *get_bot()
|
||||||
|
{
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
MY_API void set_bot(struct irc_conn *b)
|
||||||
|
{
|
||||||
|
instance = b;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user