implemented bind system
authorpk910 <philipp@zoelle1.de>
Fri, 12 Aug 2011 13:51:17 +0000 (15:51 +0200)
committerpk910 <philipp@zoelle1.de>
Fri, 12 Aug 2011 13:51:17 +0000 (15:51 +0200)
IRCEvents.c
IRCEvents.h
main.c

index 215a8f74d3037c1edf64e5a0d0406c7b2c6e2a07..8ea279a7983c483e6e9e375186dc4cbf2a3115cd 100644 (file)
 #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;
-}
index 4ef312d4f60b3630ad3d14e36ddc110296ed1cb3..0bcddbd5c505222576b08597ffba88cc9cc8f43a 100644 (file)
@@ -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 2fab2b070916bd59e2990f5665cdc75ef555a997..cbba30f8f1d4783625cf0566dbd77394bd711100 100644 (file)
--- 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"
 #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;