rewriting event system
This commit is contained in:
parent
74fdcb139d
commit
706b3f28eb
20
lib/events.h
20
lib/events.h
@ -13,27 +13,23 @@
|
|||||||
#define IRC_MOTD "372"
|
#define IRC_MOTD "372"
|
||||||
#define IRC_END_MOTD "376"
|
#define IRC_END_MOTD "376"
|
||||||
|
|
||||||
|
struct ev_handler
|
||||||
|
{
|
||||||
|
int id;
|
||||||
|
void *handler;
|
||||||
|
};
|
||||||
|
|
||||||
struct handler
|
struct handler
|
||||||
{
|
{
|
||||||
char *type;
|
char *type;
|
||||||
int count;
|
int count;
|
||||||
void **handlers;
|
struct ev_handler *evhands;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct event
|
|
||||||
{
|
|
||||||
char *type;
|
|
||||||
char *user;
|
|
||||||
char *chan;
|
|
||||||
char *text;
|
|
||||||
};
|
|
||||||
|
|
||||||
void init_events();
|
void init_events();
|
||||||
MY_API int add_handler(char *type, void *handler);
|
MY_API int add_handler(char *type, void *handler);
|
||||||
void del_handler(int num, char *type);
|
void del_handler(int num, char *type);
|
||||||
void handle_connected(struct irc_conn *bot, char *text);
|
void fire_handler(struct irc_conn *bot, char *type, ...);
|
||||||
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);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
#define MODULE_H
|
#define MODULE_H
|
||||||
|
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
|
#include "events.h"
|
||||||
|
|
||||||
struct module {
|
struct module {
|
||||||
char *name;
|
char *name;
|
||||||
//event_handler handlers[50];
|
char file[256];
|
||||||
|
struct ev_handler *handlers;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct module module;
|
|
||||||
|
|
||||||
MY_API void load_module(struct irc_conn *bot, char *where, char *stype, char *file);
|
MY_API void load_module(struct irc_conn *bot, char *where, char *stype, char *file);
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,9 +10,9 @@ struct irc_conn read_config(struct irc_conn bot, char *file)
|
|||||||
int count, n;
|
int count, n;
|
||||||
config_t cfg, *cf;
|
config_t cfg, *cf;
|
||||||
const config_setting_t *autoload;
|
const config_setting_t *autoload;
|
||||||
const char *base = (const char*)malloc(sizeof(char *) * 1024);
|
const char *base = (const char*)malloc(sizeof(char) * 1024);
|
||||||
const char *mod = NULL;
|
const char *mod = NULL;
|
||||||
char *modpath = (char *)malloc(sizeof(char *) * 500);
|
char *modpath = (char *)malloc(sizeof(char) * 500);
|
||||||
|
|
||||||
|
|
||||||
cf = &cfg;
|
cf = &cfg;
|
||||||
|
176
src/events.c
176
src/events.c
@ -5,8 +5,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
#define HANDLERARRY_LEN 500
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -16,98 +15,133 @@
|
|||||||
#define SPF sprintf
|
#define SPF sprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct handler privmsg_self;
|
struct handler *privmsg_self;
|
||||||
struct handler privmsg_chan;
|
struct handler *privmsg_chan;
|
||||||
struct handler chan_join;
|
struct handler *chan_join;
|
||||||
struct handler irc_connected;
|
struct handler *irc_connected;
|
||||||
|
|
||||||
|
int handlers_count = 0;
|
||||||
|
struct handler *handlers[512];
|
||||||
|
|
||||||
// TODO:
|
// TODO:
|
||||||
// redo this module, unified api
|
// redo this module, unified api
|
||||||
|
|
||||||
|
void init_event_type(char *type)
|
||||||
|
{
|
||||||
|
handlers[handlers_count] = calloc(1, sizeof(struct handler));
|
||||||
|
handlers[handlers_count]->type = type;
|
||||||
|
handlers[handlers_count]->evhands = calloc(128, sizeof(struct ev_handler));
|
||||||
|
|
||||||
|
handlers_count++;
|
||||||
|
}
|
||||||
|
|
||||||
void init_events()
|
void init_events()
|
||||||
{
|
{
|
||||||
privmsg_self.type = PRIVMSG_SELF;
|
init_event_type(PRIVMSG_SELF);
|
||||||
privmsg_chan.type = PRIVMSG_CHAN;
|
init_event_type(PRIVMSG_CHAN);
|
||||||
chan_join.type = JOIN;
|
init_event_type(JOIN);
|
||||||
irc_connected.type = IRC_CONNECTED;
|
init_event_type(IRC_CONNECTED);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MY_API int add_handler(char *type, void *handler)
|
MY_API int add_handler(char *type, void *handler)
|
||||||
{
|
{
|
||||||
int handler_count;
|
|
||||||
printf("Installing handler @ %p [type: %s]\n", handler, type);
|
printf("Installing handler @ %p [type: %s]\n", handler, type);
|
||||||
|
|
||||||
if (!strcmp(PRIVMSG_SELF, type))
|
for (int i = 0; i < handlers_count; i++)
|
||||||
{
|
{
|
||||||
privmsg_self.handlers[privmsg_self.count] = handler;
|
if (!strcmp(handlers[i]->type, type))
|
||||||
privmsg_self.count++;
|
|
||||||
|
|
||||||
return privmsg_self.count - 1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(PRIVMSG_CHAN, type))
|
|
||||||
{
|
{
|
||||||
privmsg_chan.handlers[privmsg_chan.count] = handler;
|
if (handlers[i]->count < 128)
|
||||||
privmsg_chan.count++;
|
|
||||||
|
|
||||||
return privmsg_chan.count - 1;
|
|
||||||
}
|
|
||||||
else if (!strcmp(JOIN, type))
|
|
||||||
{
|
{
|
||||||
chan_join.handlers[chan_join.count] = handler;
|
handlers[i]->evhands[handlers[i]->count].id = handlers[i]->count;
|
||||||
chan_join.count++;
|
handlers[i]->evhands[handlers[i]->count].handler = handler;
|
||||||
|
|
||||||
return chan_join.count - 1;
|
handlers[i]->count++;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
else if (!strcmp(IRC_CONNECTED, type))
|
else
|
||||||
{
|
{
|
||||||
irc_connected.handlers[irc_connected.count] = handler;
|
printf("Handler array is full, cannot add more handlers.\n");
|
||||||
irc_connected.count++;
|
|
||||||
|
|
||||||
return irc_connected.count - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void del_handler(int num, char *type)
|
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 fire_handler(struct irc_conn *bot, char *type, ...)
|
||||||
{
|
{
|
||||||
int i;
|
va_list args;
|
||||||
void (*handler)();
|
va_start(args, type);
|
||||||
|
|
||||||
for (i = 0; i < irc_connected.count; i++)
|
for (int i = 0; i < handlers_count; i++)
|
||||||
{
|
{
|
||||||
if ((handler = irc_connected.handlers[i]) != NULL)
|
if (!strcmp(handlers[i]->type, type))
|
||||||
(*handler)(bot, text);
|
{
|
||||||
|
for (int j = 0; j < handlers[i]->count; j++)
|
||||||
|
{
|
||||||
|
void (*handler)() = handlers[i]->evhands[j].handler;
|
||||||
|
|
||||||
|
if (!strcmp(type, PRIVMSG_SELF))
|
||||||
|
{
|
||||||
|
char *usr = va_arg(args, char*);
|
||||||
|
char *text = va_arg(args, char*);
|
||||||
|
|
||||||
|
handler(bot, usr, text);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!strcmp(type, PRIVMSG_CHAN))
|
||||||
|
{
|
||||||
|
char *usr = va_arg(args, char*);
|
||||||
|
char *chan = va_arg(args, char*);
|
||||||
|
char *text = va_arg(args, char*);
|
||||||
|
|
||||||
|
handler(bot, usr, chan, text);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!strcmp(type, JOIN))
|
||||||
|
{
|
||||||
|
char *chan = va_arg(args, char*);
|
||||||
|
char *usr = va_arg(args, char*);
|
||||||
|
|
||||||
|
handler(bot, chan, usr);
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!strcmp(type, IRC_CONNECTED))
|
||||||
|
{
|
||||||
|
char *text = va_arg(args, char*);
|
||||||
|
|
||||||
|
handler(bot, text);
|
||||||
|
va_end(args);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
va_end(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *text)
|
void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *text)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
void (*handler)();
|
void (*handler)();
|
||||||
|
|
||||||
for (i = 0; i < privmsg_chan.count; i++)
|
for (i = 0; i < privmsg_chan->count; i++)
|
||||||
{
|
{
|
||||||
if ((handler = privmsg_chan.handlers[i]) != NULL)
|
if ((handler = privmsg_chan->handlers[i]) != NULL)
|
||||||
(*handler)(bot, user, chan, text);
|
(*handler)(bot, user, chan, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -122,9 +156,9 @@ void handle_self_privmsg(struct irc_conn *bot, char *user, char *text)
|
|||||||
|
|
||||||
modpath = (char *)malloc(sizeof(char)*500);
|
modpath = (char *)malloc(sizeof(char)*500);
|
||||||
|
|
||||||
for (i = 0; i < privmsg_self.count; i++)
|
for (i = 0; i < privmsg_self->count; i++)
|
||||||
{
|
{
|
||||||
handler = privmsg_self.handlers[i];
|
handler = privmsg_self->handlers[i];
|
||||||
((void(*)())handler)(bot, user, text);
|
((void(*)())handler)(bot, user, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,19 +190,19 @@ void handle_self_privmsg(struct irc_conn *bot, char *user, char *text)
|
|||||||
{
|
{
|
||||||
if (!strcmp(bot->admin, user))
|
if (!strcmp(bot->admin, user))
|
||||||
{
|
{
|
||||||
for (i = 0; i < privmsg_chan.count; i++)
|
for (i = 0; i < privmsg_chan->count; i++)
|
||||||
{
|
{
|
||||||
irc_notice(bot, user, "handler[%i:%s]: %p", i, privmsg_chan.type, privmsg_chan.handlers[i]);
|
irc_notice(bot, user, "handler[%i:%s]: %p", i, privmsg_chan->type, privmsg_chan->handlers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < privmsg_self.count; i++)
|
for (i = 0; i < privmsg_self->count; i++)
|
||||||
{
|
{
|
||||||
irc_notice(bot, user, "handler[%i:%s]: %p", i, privmsg_self.type, privmsg_self.handlers[i]);
|
irc_notice(bot, user, "handler[%i:%s]: %p", i, privmsg_self->type, privmsg_self->handlers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < irc_connected.count; i++)
|
for (i = 0; i < irc_connected->count; i++)
|
||||||
{
|
{
|
||||||
irc_notice(bot, user, "handler[%i:%s]: %p", i , irc_connected.type, irc_connected.handlers[i]);
|
irc_notice(bot, user, "handler[%i:%s]: %p", i , irc_connected->type, irc_connected->handlers[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -189,22 +223,22 @@ void handle_self_privmsg(struct irc_conn *bot, char *user, char *text)
|
|||||||
free(modpath);
|
free(modpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void handle_join(struct irc_conn *bot, char *user, char *chan)
|
void handle_join(struct irc_conn *bot, char *user, char *chan)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
void (*handler)();
|
void (*handler)();
|
||||||
|
|
||||||
for (i = 0; i < chan_join.count; i++)
|
for (i = 0; i < chan_join->count; i++)
|
||||||
{
|
{
|
||||||
handler = chan_join.handlers[i];
|
handler = chan_join->handlers[i];
|
||||||
((void(*)())handler)(bot, user, chan);
|
((void(*)())handler)(bot, user, chan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
void free_events()
|
void free_events()
|
||||||
{
|
{
|
||||||
free(privmsg_self.handlers);
|
//free(handlers);
|
||||||
free(privmsg_chan.handlers);
|
|
||||||
free(chan_join.handlers);
|
|
||||||
free(irc_connected.handlers);
|
|
||||||
}
|
}
|
||||||
|
13
src/irc.c
13
src/irc.c
@ -189,16 +189,21 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
|
|||||||
{
|
{
|
||||||
if (!strcmp(par, bot->nick))
|
if (!strcmp(par, bot->nick))
|
||||||
{
|
{
|
||||||
handle_self_privmsg(bot, user, text);
|
//handle_self_privmsg(bot, user, text);
|
||||||
|
fire_handler(bot, PRIVMSG_CHAN, user, text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
handle_chan_privmsg(bot, user, par, text);
|
//handle_chan_privmsg(bot, user, par, text);
|
||||||
|
//
|
||||||
|
|
||||||
|
fire_handler(bot, PRIVMSG_CHAN, user, par, text);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (!strcmp("JOIN", raw))
|
else if (!strcmp("JOIN", raw))
|
||||||
{
|
{
|
||||||
handle_join(bot, user, par);
|
//handle_join(bot, user, par);
|
||||||
|
fire_handler(bot, JOIN, user, par);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (!strcmp("PING", raw))
|
else if (!strcmp("PING", raw))
|
||||||
@ -207,7 +212,7 @@ void irc_parse_raw(struct irc_conn *bot, char *raw)
|
|||||||
}
|
}
|
||||||
else if (!strcmp("001", raw))
|
else if (!strcmp("001", raw))
|
||||||
{
|
{
|
||||||
handle_connected(bot, text);
|
fire_handler(bot, IRC_CONNECTED, text);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user