From 96d70356d55220b050a0368a78dc1b42e0688f0f Mon Sep 17 00:00:00 2001 From: pk910 Date: Fri, 12 Aug 2011 15:51:17 +0200 Subject: [PATCH] implemented bind system --- IRCEvents.c | 172 ++++++++++++++++++++++++++++++++++++---------------- IRCEvents.h | 64 +++++++++++++++++++ main.c | 16 ++++- 3 files changed, 198 insertions(+), 54 deletions(-) diff --git a/IRCEvents.c b/IRCEvents.c index 215a8f7..8ea279a 100644 --- a/IRCEvents.c +++ b/IRCEvents.c @@ -5,75 +5,143 @@ #include "ChanUser.h" #include "ClientSocket.h" -int event_join(struct ChanUser *chanuser) { - return 1; +struct binding { + void *func; + struct binding *next; } -int event_nick(struct UserNode *user, char *new_nick) { - return 1; +static void **binds; +#define BIND_TYPE_JOIN 0 +#define BIND_TYPE_NICK 1 +#define BIND_TYPE_PART 2 +#define BIND_TYPE_QUIT 3 +#define BIND_TYPE_KICK 4 +#define BIND_TYPE_TOPIC 5 +#define BIND_TYPE_MODE 6 +#define BIND_TYPE_CHANMSG 7 +#define BIND_TYPE_PRIVMSG 8 +#define BIND_TYPE_CHANNOTICE 9 +#define BIND_TYPE_PRIVNOTICE 10 +#define BIND_TYPE_CHANCTCP 11 +#define BIND_TYPE_PRIVCTCP 12 +#define BIND_TYPE_INVITE 13 +#define BIND_TYPE_RAW 14 + +#define TOTAL_BIND_TYPES 15 + +void init_bind() { + binds = calloc(TOTAL_BIND_TYPES, sizeof(*binds)); } -int event_part(struct ChanUser *chanuser, char *reason) { - return 1; +static int is_bound(unsigned char type, void *func) { + struct binding *cbind; + for(cbind = binds[type]; cbind; cbind = cbind->next) { + if(cbind->func == func) + return 1; + } + return 0; } -int event_quit(struct UserNode *user, char *reason) { - return 1; +#define FUNC_BIND(NAME,FUNCTYPE,TYPE) \ +int bind_NAME(FUNCTYPE *func) { \ + if(!is_bound(TYPE, func)) { \ + struct binding *bind = malloc(sizeof(*bind)); \ + if (!bind) { \ + perror("malloc() failed"); \ + return 0; \ + } \ + bind->func = func; \ + bind->next = binds[TYPE]; \ + binds[TYPE] = bind; \ + return 1; \ + } \ } -int event_kick(struct UserNode *user, struct ChanUser *target, char *reason) { - return 1; +#define FUNC_UNBIND(NAME,FUNCTYPE,TYPE) \ +void unbind_NAME(FUNCTYPE *func) { \ + struct binding *cbind, *last = NULL, *next; \ + for(cbind = binds[TYPE]; cbind; cbind = next) { \ + next = cbind->next; \ + if(cbind->func == func) { \ + if(last) \ + last->next = cbind->next; \ + else \ + binds[TYPE] = cbind->next \ + free(cbind); \ + } else \ + last = cbind; \ + } \ } -int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic) { - return 1; +#define FUNC_EVENT(NAME,FUNCTYPE,TYPE,PDECLARATION,PLIST) \ +int event_NAME(PDECLARATION) { \ + struct binding *cbind; \ + for(cbind = binds[TYPE]; cbind; cbind = next) { \ + FUNCTYPE *func = cbind->func; \ + func(PLIST); \ + } \ + return 1; \ } -int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **args, int argc) { - return 1; -} +//EVENTS -int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) { - struct ClientSocket *client = getBots(SOCKET_FLAG_READY, NULL); - if(!strcmp(message, "users")) { - struct ChanUser *chanuser; - putsock(client, "PRIVMSG %s :[BOT JOIN] Users on this Channel:", chan->name); - for(chanuser = getChannelUsers(chan, NULL); chanuser; chanuser = getChannelUsers(chan, chanuser)) { - putsock(client, "PRIVMSG %s : %s!%s@%s [%s] rights: %d", chan->name, chanuser->user->nick, chanuser->user->ident, chanuser->user->host, ((chanuser->user->flags & USERFLAG_ISAUTHED) ? chanuser->user->auth : "*"), chanuser->flags); - } - } - if(!strcmp(message, "modes")) { - char modeBuf[MAXLEN]; - getModeString(chan, modeBuf); - putsock(client, "PRIVMSG %s :Modes: %s", chan->name, modeBuf); - } - return 1; -} +FUNC_BIND(join, join_func_t, BIND_TYPE_JOIN) +FUNC_UNBIND(join, join_func_t, BIND_TYPE_JOIN) +FUNC_EVENT(join, join_func_t, BIND_TYPE_JOIN, struct ChanUser *chanuser, chanuser) -int event_privmsg(struct UserNode *user, struct UserNode *target, char *message) { - return 1; -} +FUNC_BIND(nick, nick_func_t, BIND_TYPE_NICK) +FUNC_UNBIND(nick, nick_func_t, BIND_TYPE_NICK) +FUNC_EVENT(nick, nick_func_t, BIND_TYPE_NICK, (struct UserNode *user, char *new_nick), (user, newnick)) -int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message) { - return 1; -} +FUNC_BIND(part, part_func_t, BIND_TYPE_PART) +FUNC_UNBIND(part, part_func_t, BIND_TYPE_PART) +FUNC_EVENT(part, part_func_t, BIND_TYPE_PART, (struct ChanUser *chanuser, char *reason), (chanuser, reason)) -int event_privnotice(struct UserNode *user, struct UserNode *target, char *message) { - return 1; -} +FUNC_BIND(quit, quit_func_t, BIND_TYPE_QUIT) +FUNC_UNBIND(quit, quit_func_t, BIND_TYPE_QUIT) +FUNC_EVENT(quit, quit_func_t, BIND_TYPE_QUIT, (struct UserNode *user, char *reason), (user, reason)) -int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) { - return 1; -} +FUNC_BIND(kick, kick_func_t, BIND_TYPE_KICK) +FUNC_UNBIND(kick, kick_func_t, BIND_TYPE_KICK) +FUNC_EVENT(kick, kick_func_t, BIND_TYPE_KICK, (struct UserNode *user, struct ChanUser *target, char *reason), (user, target, reason)) -int event_privctcp(struct UserNode *user, struct UserNode *target, char *command, char *text) { - return 1; -} +FUNC_BIND(topic, topic_func_t, BIND_TYPE_TOPIC) +FUNC_UNBIND(topic, topic_func_t, BIND_TYPE_TOPIC) +FUNC_EVENT(topic, topic_func_t, BIND_TYPE_TOPIC, (struct UserNode *user, struct ChanNode *chan, const char *new_topic), (user, chan, new_topic)) -int event_invite(struct UserNode *user, char *channel) { - return 1; -} +FUNC_BIND(mode, mode_func_t, BIND_TYPE_MODE) +FUNC_UNBIND(mode, mode_func_t, BIND_TYPE_MODE) +FUNC_EVENT(mode, mode_func_t, BIND_TYPE_MODE, (struct UserNode *user, struct ChanNode *chan, char *modes, char **args, int argc), (user, chan, modes, args, argc)) + +FUNC_BIND(chanmsg, chanmsg_func_t, BIND_TYPE_CHANMSG) +FUNC_UNBIND(chanmsg, chanmsg_func_t, BIND_TYPE_CHANMSG) +FUNC_EVENT(chanmsg, chanmsg_func_t, BIND_TYPE_CHANMSG, (struct UserNode *user, struct ChanNode *chan, char *message), (user, chan, message)) + +FUNC_BIND(privmsg, privmsg_func_t, BIND_TYPE_PRIVMSG) +FUNC_UNBIND(privmsg, privmsg_func_t, BIND_TYPE_PRIVMSG) +FUNC_EVENT(privmsg, privmsg_func_t, BIND_TYPE_PRIVMSG, (struct UserNode *user, struct UserNode *target, char *message), (user, target, message)) + +FUNC_BIND(channotice, channotice_func_t, BIND_TYPE_CHANNOTICE) +FUNC_UNBIND(channotice, channotice_func_t, BIND_TYPE_CHANNOTICE) +FUNC_EVENT(channotice, channotice_func_t, BIND_TYPE_CHANNOTICE, (struct UserNode *user, struct ChanNode *chan, char *message), (user, chan, message)) + +FUNC_BIND(privnotice, privnotice_func_t, BIND_TYPE_PRIVNOTICE) +FUNC_UNBIND(privnotice, privnotice_func_t, BIND_TYPE_PRIVNOTICE) +FUNC_EVENT(privnotice, privnotice_func_t, BIND_TYPE_PRIVNOTICE, (struct UserNode *user, struct UserNode *target, char *message), (user, target, message)) + +FUNC_BIND(chanctcp, chanctcp_func_t, BIND_TYPE_CHANCTCP) +FUNC_UNBIND(chanctcp, chanctcp_func_t, BIND_TYPE_CHANCTCP) +FUNC_EVENT(chanctcp, chanctcp_func_t, BIND_TYPE_CHANCTCP, (struct UserNode *user, struct ChanNode *chan, char *command, char *text), (user, chan, command, text)) + +FUNC_BIND(privctcp, privctcp_func_t, BIND_TYPE_PRIVCTCP) +FUNC_UNBIND(privctcp, privctcp_func_t, BIND_TYPE_PRIVCTCP) +FUNC_EVENT(privctcp, privctcp_func_t, BIND_TYPE_PRIVCTCP, (struct UserNode *user, struct UserNode *target, char *command, char *text), (user, target, command, text)) + +FUNC_BIND(invite, invite_func_t, BIND_TYPE_INVITE) +FUNC_UNBIND(invite, invite_func_t, BIND_TYPE_INVITE) +FUNC_EVENT(invite, invite_func_t, BIND_TYPE_INVITE, (struct UserNode *user, char *channel), (user, channel)) + +FUNC_BIND(raw, raw_func_t, BIND_TYPE_RAW) +FUNC_UNBIND(raw, raw_func_t, BIND_TYPE_RAW) +FUNC_EVENT(raw, raw_func_t, BIND_TYPE_RAW, (struct ClientSocket *client, char *from, char *cmd, char **argv, int argc), (client, from, cmd, argv, argc)) -int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) { - return 1; -} diff --git a/IRCEvents.h b/IRCEvents.h index 4ef312d..0bcddbd 100644 --- a/IRCEvents.h +++ b/IRCEvents.h @@ -6,21 +6,85 @@ struct UserNode; struct ChanNode; struct ChanUser; +struct ClientSocket; +void init_bind(); + +typedef void join_func_t(struct ChanUser *chanuser); +int bind_join(join_func_t *func); +int unbind_join(join_func_t *func); int event_join(struct ChanUser *chanuser); + +typedef void nick_func_t(struct UserNode *user, char *new_nick); +int bind_nick(nick_func_t *func); +int unbind_nick(nick_func_t *func); int event_nick(struct UserNode *user, char *new_nick); + +typedef void part_func_t(struct ChanUser *chanuser, char *reason); +int bind_part(part_func_t *func); +int unbind_part(part_func_t *func); int event_part(struct ChanUser *chanuser, char *reason); + +typedef void quit_func_t(struct UserNode *user, char *reason); +int bind_quit(quit_func_t *func); +int unbind_quit(quit_func_t *func); int event_quit(struct UserNode *user, char *reason); + +typedef void kick_func_t(struct UserNode *user, struct ChanUser *target, char *reason); +int bind_kick(kick_func_t *func); +int unbind_kick(kick_func_t *func); int event_kick(struct UserNode *user, struct ChanUser *target, char *reason); + +typedef void topic_func_t(struct UserNode *user, struct ChanNode *chan, const char *new_topic); +int bind_topic(topic_func_t *func); +int unbind_topic(topic_func_t *func); int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic); + +typedef void mode_func_t(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc); +int bind_mode(mode_func_t *func); +int unbind_mode(mode_func_t *func); int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc); + +typedef void chanmsg_func_t(struct UserNode *user, struct ChanNode *chan, char *message); +int bind_chanmsg(chanmsg_func_t *func); +int unbind_chanmsg(chanmsg_func_t *func); int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message); + +typedef void privmsg_func_t(struct UserNode *user, struct UserNode *target, char *message); +int bind_privmsg(privmsg_func_t *func); +int unbind_privmsg(privmsg_func_t *func); int event_privmsg(struct UserNode *user, struct UserNode *target, char *message); + +typedef void channotice_func_t(struct UserNode *user, struct ChanNode *chan, char *message); +int bind_channotice(channotice_func_t *func); +int unbind_channotice(channotice_func_t *func); int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message); + +typedef void privnotice_func_t(struct UserNode *user, struct UserNode *target, char *message); +int bind_privnotice(privnotice_func_t *func); +int unbind_privnotice(privnotice_func_t *func); int event_privnotice(struct UserNode *user, struct UserNode *target, char *message); + +typedef void chanctcp_func_t(struct UserNode *user, struct ChanNode *chan, char *command, char *text); +int bind_chanctcp(chanctcp_func_t *func); +int unbind_chanctcp(chanctcp_func_t *func); int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text); + +typedef void privctcp_func_t(struct UserNode *user, struct UserNode *target, char *command, char *text); +int bind_privctcp(privctcp_func_t *func); +int unbind_privctcp(privctcp_func_t *func); int event_privctcp(struct UserNode *user, struct UserNode *target, char *command, char *text); + +typedef void invite_func_t(struct UserNode *user, char *channel); +int bind_invite(invite_func_t *func); +int unbind_invite(invite_func_t *func); int event_invite(struct UserNode *user, char *channel); + +typedef void raw_func_t(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc); +int bind_raw(raw_func_t *func); +int unbind_raw(raw_func_t *func); int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc); + + #endif \ No newline at end of file diff --git a/main.c b/main.c index 2fab2b0..cbba30f 100644 --- a/main.c +++ b/main.c @@ -2,6 +2,7 @@ #include "main.h" #include "ClientSocket.h" #include "UserNode.h" +#include "IRCEvents.h" //all c files - so we don't need a big Makefile right now :D #include "ClientSocket.c" @@ -13,11 +14,21 @@ #include "WHOHandler.c" void just_test_it() { - struct UserNode *user = addUser("TestBot"); + struct UserNode *user; + struct ClientSocket *client; + + user = addUser("TestBot"); + strcpy(user->ident, "test"); + strcpy(user->realname, "testUser!"); + user->flags |= USERFLAG_ISBOT; + client = create_socket("127.0.0.1", 6667, "pktest:pktest123", user); //pktest Hostmask(s): *@127.0.0.1 + connect_socket(client); + + user = addUser("TestBot2"); strcpy(user->ident, "test"); strcpy(user->realname, "testUser!"); user->flags |= USERFLAG_ISBOT; - struct ClientSocket *client = create_socket("127.0.0.1", 6667, "pktest:pktest123", user); //pktest Hostmask(s): *@127.0.0.1 + client = create_socket("127.0.0.1", 6667, "pktest:pktest123", user); //pktest Hostmask(s): *@127.0.0.1 connect_socket(client); } @@ -26,6 +37,7 @@ int main(void) parser_init(); init_UserNode(); init_ChanNode(); + init_bind(); just_test_it(); time_t socket_wait; -- 2.20.1