2015-03-24 17:48:11 +00:00
|
|
|
#include "irc.h"
|
|
|
|
#include "util.h"
|
2015-03-26 23:20:59 +00:00
|
|
|
#include "events.h"
|
2015-03-27 15:44:40 +00:00
|
|
|
#include "module.h"
|
2015-03-24 17:48:11 +00:00
|
|
|
#include <stdio.h>
|
2015-03-26 23:20:59 +00:00
|
|
|
#include <stdlib.h>
|
2015-03-24 17:48:11 +00:00
|
|
|
#include <string.h>
|
2015-03-26 23:20:59 +00:00
|
|
|
#include <dlfcn.h>
|
|
|
|
|
|
|
|
#define HANDLERARRY_LEN 500
|
|
|
|
|
|
|
|
struct handler privmsg_self;
|
|
|
|
struct handler privmsg_chan;
|
|
|
|
struct handler chan_join;
|
2015-04-08 18:56:32 +00:00
|
|
|
struct handler irc_connected;
|
|
|
|
|
|
|
|
// TODO:
|
|
|
|
// redo this module, unified api
|
2015-03-26 23:20:59 +00:00
|
|
|
|
|
|
|
void init_events()
|
|
|
|
{
|
2015-04-08 18:56:32 +00:00
|
|
|
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;
|
|
|
|
irc_connected.count = 0;
|
2015-03-26 23:20:59 +00:00
|
|
|
|
2015-04-08 18:56:32 +00:00
|
|
|
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);
|
2015-03-26 23:20:59 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2015-04-08 18:56:32 +00:00
|
|
|
int add_handler(char *type, void *handler)
|
2015-03-26 23:20:59 +00:00
|
|
|
{
|
2015-04-08 18:56:32 +00:00
|
|
|
printf("Installing handler @ %p [type: %s]\n", handler, type);
|
2015-03-26 23:20:59 +00:00
|
|
|
int handler_count;
|
|
|
|
|
2015-04-08 18:56:32 +00:00
|
|
|
if (!strcmp(PRIVMSG_SELF, type))
|
2015-03-26 23:20:59 +00:00
|
|
|
{
|
|
|
|
privmsg_self.handlers[privmsg_self.count] = handler;
|
|
|
|
privmsg_self.count++;
|
2015-04-08 18:56:32 +00:00
|
|
|
|
|
|
|
return privmsg_self.count - 1;
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
2015-04-08 18:56:32 +00:00
|
|
|
else if (!strcmp(PRIVMSG_CHAN, type))
|
2015-03-26 23:20:59 +00:00
|
|
|
{
|
|
|
|
privmsg_chan.handlers[privmsg_chan.count] = handler;
|
|
|
|
privmsg_chan.count++;
|
2015-04-08 18:56:32 +00:00
|
|
|
|
|
|
|
return privmsg_chan.count - 1;
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
2015-04-08 18:56:32 +00:00
|
|
|
else if (!strcmp(JOIN, type))
|
2015-03-26 23:20:59 +00:00
|
|
|
{
|
|
|
|
chan_join.handlers[chan_join.count] = handler;
|
|
|
|
chan_join.count++;
|
2015-04-08 18:56:32 +00:00
|
|
|
|
|
|
|
return chan_join.count - 1;
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
2015-04-08 18:56:32 +00:00
|
|
|
else if (!strcmp(IRC_CONNECTED, type))
|
|
|
|
{
|
|
|
|
irc_connected.handlers[irc_connected.count] = handler;
|
|
|
|
irc_connected.count++;
|
|
|
|
|
|
|
|
return irc_connected.count - 1;
|
|
|
|
}
|
|
|
|
}
|
2015-03-26 23:20:59 +00:00
|
|
|
|
2015-04-08 18:56:32 +00:00
|
|
|
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);
|
|
|
|
}
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
2015-03-24 17:48:11 +00:00
|
|
|
|
|
|
|
void handle_chan_privmsg(struct irc_conn *bot, char *user, char *chan, char *text)
|
|
|
|
{
|
2015-03-26 23:20:59 +00:00
|
|
|
void (*handler)();
|
2015-03-24 17:48:11 +00:00
|
|
|
|
2015-03-26 23:20:59 +00:00
|
|
|
for (int i = 0; i < privmsg_chan.count; i++)
|
|
|
|
{
|
2015-04-08 18:56:32 +00:00
|
|
|
if ((handler = privmsg_chan.handlers[i]) != NULL)
|
|
|
|
(*handler)(bot, user, chan, text);
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
2015-03-24 17:48:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handle_self_privmsg(struct irc_conn *bot, char *user, char *text)
|
|
|
|
{
|
2015-03-26 23:20:59 +00:00
|
|
|
void (*handler)();
|
2015-04-07 06:56:50 +00:00
|
|
|
int i;
|
2015-03-27 15:44:40 +00:00
|
|
|
char *cmd, *arg, *modpath;
|
2015-03-24 17:48:11 +00:00
|
|
|
cmd = text;
|
|
|
|
arg = skip(cmd, ' ');
|
|
|
|
|
2015-03-27 15:44:40 +00:00
|
|
|
modpath = (char *)malloc(sizeof(char)*500);
|
|
|
|
|
2015-04-07 06:56:50 +00:00
|
|
|
for (i = 0; i < privmsg_self.count; i++)
|
2015-03-26 23:20:59 +00:00
|
|
|
{
|
|
|
|
handler = privmsg_self.handlers[i];
|
|
|
|
((void(*)())handler)(bot, user, text);
|
|
|
|
}
|
|
|
|
|
2015-03-24 17:48:11 +00:00
|
|
|
if (!strcmp("JOIN", cmd))
|
|
|
|
{
|
|
|
|
if (strcmp(bot->admin, user))
|
|
|
|
{
|
|
|
|
irc_raw(bot, "JOIN %s", arg);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
irc_notice(bot, user, "You are unauthorized to use this command.");
|
|
|
|
}
|
|
|
|
}
|
2015-03-26 23:20:59 +00:00
|
|
|
|
2015-04-07 06:56:50 +00:00
|
|
|
if (!strcmp("PRINT_HANDLERS", cmd))
|
|
|
|
{
|
|
|
|
if (strcmp(bot->admin, user))
|
|
|
|
{
|
|
|
|
for (i = 0; i < privmsg_chan.count; i++)
|
|
|
|
{
|
|
|
|
irc_notice(bot, user, "handler[%i:%i]: %p", i, privmsg_chan.type, privmsg_chan.handlers[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < privmsg_self.count; i++)
|
|
|
|
{
|
|
|
|
irc_notice(bot, user, "handler[%i:%i]: %p", i, privmsg_self.type, privmsg_self.handlers[i]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-26 23:20:59 +00:00
|
|
|
if (!strcmp("LOADMOD", cmd))
|
|
|
|
{
|
|
|
|
if (strcmp(bot->admin, user))
|
|
|
|
{
|
|
|
|
irc_notice(bot, user, "Loading module: mods/%s.so", arg);
|
2015-03-27 15:44:40 +00:00
|
|
|
sprintf(modpath, "./mods/%s.so", arg);
|
|
|
|
load_module(bot, user, PRIVMSG_SELF, modpath);
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
irc_notice(bot, user, "You are unauthorized to use this command.");
|
|
|
|
}
|
|
|
|
}
|
2015-03-27 15:44:40 +00:00
|
|
|
|
|
|
|
free(modpath);
|
2015-03-26 23:20:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void handle_join(struct irc_conn *bot, char *user, char *chan)
|
|
|
|
{
|
|
|
|
void (*handler)();
|
|
|
|
|
|
|
|
for (int i = 0; i < chan_join.count; i++)
|
|
|
|
{
|
|
|
|
handler = chan_join.handlers[i];
|
|
|
|
((void(*)())handler)(bot, user, chan);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void free_events()
|
|
|
|
{
|
|
|
|
free(privmsg_self.handlers);
|
|
|
|
free(privmsg_chan.handlers);
|
|
|
|
free(chan_join.handlers);
|
2015-03-24 17:48:11 +00:00
|
|
|
}
|