added autojoin module
This commit is contained in:
parent
0f4468a4c2
commit
a484282df3
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,3 @@
|
||||
xbot
|
||||
build
|
||||
|
||||
*.so
|
||||
|
1
Makefile
1
Makefile
@ -22,6 +22,7 @@ main:
|
||||
|
||||
mods:
|
||||
$(MAKE) -C mods/test
|
||||
$(MAKE) -C mods/autojoin
|
||||
|
||||
clean:
|
||||
@rm -rf build $(EXEC)
|
13
lib/events.h
13
lib/events.h
@ -3,19 +3,22 @@
|
||||
|
||||
#include "irc.h"
|
||||
|
||||
#define PRIVMSG_SELF 1
|
||||
#define PRIVMSG_CHAN 2
|
||||
#define JOIN 3
|
||||
#define PRIVMSG_SELF "CMSG"
|
||||
#define PRIVMSG_CHAN "PMSG"
|
||||
#define JOIN "JOIN"
|
||||
#define IRC_CONNECTED "001"
|
||||
|
||||
struct handler
|
||||
{
|
||||
int type;
|
||||
char *type;
|
||||
int count;
|
||||
void **handlers;
|
||||
};
|
||||
|
||||
void init_events();
|
||||
void add_handler(int type, void *handler);
|
||||
int add_handler(char *type, void *handler);
|
||||
void del_handler(int num, char *type);
|
||||
void handle_connected(struct irc_conn *bot, char *text);
|
||||
void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *text);
|
||||
void handle_self_privmsg(struct irc_conn *bot, char *user, char *text);
|
||||
void handle_join(struct irc_conn *bot, char *user, char *chan);
|
||||
|
@ -3,6 +3,6 @@
|
||||
|
||||
#include "irc.h"
|
||||
|
||||
void load_module(struct irc_conn *bot, char *where, int stype, char *file);
|
||||
void load_module(struct irc_conn *bot, char *where, char *stype, char *file);
|
||||
|
||||
#endif
|
7
mods/autojoin/Makefile
Normal file
7
mods/autojoin/Makefile
Normal file
@ -0,0 +1,7 @@
|
||||
CC=gcc
|
||||
CFLAGS=-g -std=gnu99 -lconfig -fPIC -I../../lib
|
||||
OBJ=../autojoin.so
|
||||
|
||||
main:
|
||||
$(CC) -shared -o $(OBJ) $(CFLAGS) ./autojoin.c
|
||||
@echo "All Done!"
|
48
mods/autojoin/autojoin.c
Normal file
48
mods/autojoin/autojoin.c
Normal file
@ -0,0 +1,48 @@
|
||||
#include "irc.h"
|
||||
#include "events.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <libconfig.h>
|
||||
|
||||
void aj(struct irc_conn *bot, char *text)
|
||||
{
|
||||
|
||||
// TODO:
|
||||
// Config Parser API
|
||||
|
||||
int count, n;
|
||||
config_t cfg, *cf;
|
||||
const config_setting_t *autojoin;
|
||||
const char *base;
|
||||
const char *chan = NULL;
|
||||
|
||||
cf = &cfg;
|
||||
config_init(cf);
|
||||
|
||||
if (!config_read_file(cf, "./xbot.cfg"))
|
||||
{
|
||||
printf("[xbot.cfg:%d] Configuration error: %s\n",
|
||||
config_error_line(cf),
|
||||
config_error_text(cf)
|
||||
);
|
||||
|
||||
config_destroy(cf);
|
||||
return;
|
||||
}
|
||||
|
||||
autojoin = config_lookup(cf, "mods.mod_autojoin");
|
||||
count = config_setting_length(autojoin);
|
||||
|
||||
for (n = 0; n < count; n++)
|
||||
{
|
||||
chan = config_setting_get_string_elem(autojoin, n);
|
||||
irc_raw(bot, "JOIN :%s", chan);
|
||||
}
|
||||
|
||||
config_destroy(cf);
|
||||
}
|
||||
|
||||
void mod_init()
|
||||
{
|
||||
add_handler(IRC_CONNECTED, aj);
|
||||
}
|
BIN
mods/test.so
BIN
mods/test.so
Binary file not shown.
@ -4,6 +4,8 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int HANDLER = 0;
|
||||
|
||||
void hello(struct irc_conn *bot, char *user, char *chan, char *text)
|
||||
{
|
||||
char *buf = (char *)malloc(sizeof(char *) * 500);
|
||||
@ -11,7 +13,8 @@ void hello(struct irc_conn *bot, char *user, char *chan, char *text)
|
||||
|
||||
if (!strcmp(text, buf))
|
||||
{
|
||||
irc_privmsg(bot, chan, "hi %s", user);
|
||||
irc_privmsg(bot, chan, "%i", HANDLER);
|
||||
del_handler(HANDLER, PRIVMSG_CHAN);
|
||||
}
|
||||
|
||||
free(buf);
|
||||
@ -19,5 +22,5 @@ void hello(struct irc_conn *bot, char *user, char *chan, char *text)
|
||||
|
||||
void mod_init()
|
||||
{
|
||||
add_handler(PRIVMSG_CHAN, hello);
|
||||
HANDLER = add_handler(PRIVMSG_CHAN, hello);
|
||||
}
|
@ -48,7 +48,7 @@ struct irc_conn read_config(struct irc_conn bot, char *file)
|
||||
{
|
||||
mod = config_setting_get_string_elem(autoload, n);
|
||||
sprintf(modpath, "./mods/%s.so", mod);
|
||||
load_module(&bot, "main", 3, modpath);
|
||||
load_module(&bot, "main", "runtime", modpath);
|
||||
}
|
||||
|
||||
config_destroy(cf);
|
||||
|
73
src/events.c
73
src/events.c
@ -12,43 +12,82 @@
|
||||
struct handler privmsg_self;
|
||||
struct handler privmsg_chan;
|
||||
struct handler chan_join;
|
||||
struct handler irc_connected;
|
||||
|
||||
// TODO:
|
||||
// redo this module, unified api
|
||||
|
||||
void init_events()
|
||||
{
|
||||
privmsg_self.type = PRIVMSG_SELF;
|
||||
privmsg_chan.type = PRIVMSG_CHAN;
|
||||
chan_join.type = JOIN;
|
||||
privmsg_self.type = PRIVMSG_SELF;
|
||||
privmsg_chan.type = PRIVMSG_CHAN;
|
||||
chan_join.type = JOIN;
|
||||
irc_connected.type = IRC_CONNECTED;
|
||||
|
||||
privmsg_self.count = 0;
|
||||
privmsg_chan.count = 0;
|
||||
chan_join.count = 0;
|
||||
privmsg_self.count = 0;
|
||||
privmsg_chan.count = 0;
|
||||
chan_join.count = 0;
|
||||
irc_connected.count = 0;
|
||||
|
||||
privmsg_self.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
privmsg_chan.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
chan_join.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
irc_connected.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
|
||||
privmsg_self.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
privmsg_chan.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
chan_join.handlers = malloc(sizeof(void *) * HANDLERARRY_LEN);
|
||||
}
|
||||
|
||||
void add_handler(int type, void *handler)
|
||||
int add_handler(char *type, void *handler)
|
||||
{
|
||||
printf("Installing handler @ %p [type: %i]\n", handler, type);
|
||||
printf("Installing handler @ %p [type: %s]\n", handler, type);
|
||||
int handler_count;
|
||||
|
||||
if (type == PRIVMSG_SELF)
|
||||
if (!strcmp(PRIVMSG_SELF, type))
|
||||
{
|
||||
privmsg_self.handlers[privmsg_self.count] = handler;
|
||||
privmsg_self.count++;
|
||||
|
||||
return privmsg_self.count - 1;
|
||||
}
|
||||
else if (type == PRIVMSG_CHAN)
|
||||
else if (!strcmp(PRIVMSG_CHAN, type))
|
||||
{
|
||||
privmsg_chan.handlers[privmsg_chan.count] = handler;
|
||||
privmsg_chan.count++;
|
||||
|
||||
return privmsg_chan.count - 1;
|
||||
}
|
||||
else if (type == JOIN)
|
||||
else if (!strcmp(JOIN, type))
|
||||
{
|
||||
chan_join.handlers[chan_join.count] = handler;
|
||||
chan_join.count++;
|
||||
}
|
||||
|
||||
return chan_join.count - 1;
|
||||
}
|
||||
else if (!strcmp(IRC_CONNECTED, type))
|
||||
{
|
||||
irc_connected.handlers[irc_connected.count] = handler;
|
||||
irc_connected.count++;
|
||||
|
||||
return irc_connected.count - 1;
|
||||
}
|
||||
}
|
||||
|
||||
void del_handler(int num, char *type)
|
||||
{
|
||||
if (type == PRIVMSG_SELF)
|
||||
privmsg_self.handlers[num] = NULL;
|
||||
else if (type == PRIVMSG_CHAN)
|
||||
privmsg_chan.handlers[num] = NULL;
|
||||
}
|
||||
|
||||
void handle_connected(struct irc_conn *bot, char *text)
|
||||
{
|
||||
void (*handler)();
|
||||
|
||||
for (int i = 0; i < irc_connected.count; i++)
|
||||
{
|
||||
if ((handler = irc_connected.handlers[i]) != NULL)
|
||||
(*handler)(bot, text);
|
||||
}
|
||||
}
|
||||
|
||||
void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *text)
|
||||
@ -57,8 +96,8 @@ void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *tex
|
||||
|
||||
for (int i = 0; i < privmsg_chan.count; i++)
|
||||
{
|
||||
handler = privmsg_chan.handlers[i];
|
||||
(*handler)(bot, user, chan, text);
|
||||
if ((handler = privmsg_chan.handlers[i]) != NULL)
|
||||
(*handler)(bot, user, chan, text);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,6 +152,10 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
|
||||
{
|
||||
irc_raw(bot, "PONG %s", text);
|
||||
}
|
||||
else if (!strcmp("001", raw))
|
||||
{
|
||||
handle_connected(bot, text);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!strcmp("NICK", raw) && !strcmp(user, bot->nick))
|
||||
|
@ -12,8 +12,6 @@
|
||||
#include "irc.h"
|
||||
#include "util.h"
|
||||
#include "events.h"
|
||||
#include "module.h"
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
@ -30,7 +28,6 @@ int main()
|
||||
irc_connect(&bot);
|
||||
irc_auth(&bot);
|
||||
|
||||
|
||||
for (;;)
|
||||
{
|
||||
FD_ZERO(&rd);
|
||||
|
13
src/module.c
13
src/module.c
@ -3,9 +3,10 @@
|
||||
#include "events.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <dlfcn.h>
|
||||
|
||||
void load_module(struct irc_conn *bot, char *where, int stype, char *file)
|
||||
void load_module(struct irc_conn *bot, char *where, char *stype, char *file)
|
||||
{
|
||||
void *handle;
|
||||
void (*mod_init)();
|
||||
@ -17,12 +18,12 @@ void load_module(struct irc_conn *bot, char *where, int stype, char *file)
|
||||
{
|
||||
sprintf(error, "Error: %s", dlerror());
|
||||
|
||||
if (stype == 3)
|
||||
if (strcmp("runtime", stype))
|
||||
{
|
||||
eprint("%s\n", error);
|
||||
return;
|
||||
}
|
||||
else if (stype == PRIVMSG_CHAN)
|
||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||
{
|
||||
irc_privmsg(bot, where, error);
|
||||
}
|
||||
@ -43,11 +44,11 @@ void load_module(struct irc_conn *bot, char *where, int stype, char *file)
|
||||
//sprintf(error, "Error: %s", error);
|
||||
eprint("Error: %s\n", error);
|
||||
|
||||
if (stype == 3)
|
||||
if (strcmp("runtime", stype))
|
||||
{
|
||||
return;
|
||||
}
|
||||
else if (stype == PRIVMSG_CHAN)
|
||||
else if (strcmp(PRIVMSG_CHAN, stype))
|
||||
{
|
||||
irc_privmsg(bot, where, error);
|
||||
}
|
||||
@ -61,7 +62,7 @@ void load_module(struct irc_conn *bot, char *where, int stype, char *file)
|
||||
|
||||
dlclose(handle);
|
||||
|
||||
if (stype != 3)
|
||||
if (strcmp("runtime", stype))
|
||||
{
|
||||
irc_privmsg(bot, where, "Module '%s' loaded.", file);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user