added some more events and changed TempUser-Handling
authorpk910 <philipp@zoelle1.de>
Thu, 11 Aug 2011 23:57:53 +0000 (01:57 +0200)
committerpk910 <philipp@zoelle1.de>
Thu, 11 Aug 2011 23:57:53 +0000 (01:57 +0200)
IRCEvents.c
IRCEvents.h
IRCParser.c
UserNode.c
UserNode.h
main.c
main.h

index acf4ff5cb163c66d7cbec54f3df034c16fc81faa..010bb7a309df13aabd1eaff0d9faeb38911ca549 100644 (file)
@@ -1,10 +1,17 @@
 
 #include "IRCEvents.h"
+#include "UserNode.h"
+#include "ChanNode.h"
+#include "ChanUser.h"
 
 int event_join(struct ChanUser *chanuser) {
     return 1;
 }
 
+int event_nick(struct UserNode *user, char *new_nick) {
+    return 1;
+}
+
 int event_part(struct ChanUser *chanuser, char *reason) {
     return 1;
 }
@@ -21,6 +28,10 @@ int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_to
     return 1;
 }
 
+int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **args, int argc) {
+    return 1;
+}
+
 int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) {
     return 1;
 }
@@ -28,3 +39,27 @@ int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message) {
 int event_privmsg(struct UserNode *user, struct UserNode *target, char *message) {
     return 1;
 }
+
+int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message) {
+    return 1;
+}
+
+int event_privnotice(struct UserNode *user, struct UserNode *target, char *message) {
+    return 1;
+}
+
+int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) {
+    return 1;
+}
+
+int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text) {
+    return 1;
+}
+
+int event_invite(struct UserNode *user, struct ChanUser *target, char *channel) {
+    return 1;
+}
+
+int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc) {
+    return 1;
+}
index 1badf72da9ffd21b71db44308628a73b9d68f782..ce560ed95bea4de824736fdc6d7a9374501f4b48 100644 (file)
@@ -2,16 +2,25 @@
 #define _IRCEvents_h
 
 #include "main.h"
-#include "UserNode.h"
-#include "ChanNode.h"
-#include "ChanUser.h"
+
+struct UserNode;
+struct ChanNode;
+struct ChanUser;
 
 int event_join(struct ChanUser *chanuser);
+int event_nick(struct UserNode *user, char *new_nick);
 int event_part(struct ChanUser *chanuser, char *reason);
 int event_quit(struct UserNode *user, char *reason);
 int event_kick(struct UserNode *user, struct ChanUser *target, char *reason);
 int event_topic(struct UserNode *user, struct ChanNode *chan, const char *new_topic);
+int event_mode(struct UserNode *user, struct ChanNode *chan, char *modes, char **argv, int argc);
 int event_chanmsg(struct UserNode *user, struct ChanNode *chan, char *message);
 int event_privmsg(struct UserNode *user, struct UserNode *target, char *message);
+int event_channotice(struct UserNode *user, struct ChanNode *chan, char *message);
+int event_privnotice(struct UserNode *user, struct UserNode *target, char *message);
+int event_chanctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text);
+int event_privctcp(struct UserNode *user, struct ChanNode *chan, char *command, char *text);
+int event_invite(struct UserNode *user, struct ChanUser *target, char *channel);
+int event_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc);
 
 #endif
\ No newline at end of file
index 3c996645f4efb5a01cb0bd25504dbf889c050f1d..6e663e694cf18bc00418fd4c3c38adfd95b5607c 100644 (file)
@@ -188,9 +188,6 @@ static IRC_CMD(raw_kick) {
         delChanUser(chanuser, 0); //we need to free the chanuser manually!
         event_kick(user, chanuser, argv[1]);
         free(chanuser);
-        if(user->flags & USERFLAG_ISTMPUSER) {
-            free(user);
-        }
         if(target->flags & USERFLAG_ISBOT) {
             //check if theres another bot in the channel - otherwise free it
             checkChannelVisibility(chan);
@@ -215,9 +212,6 @@ static IRC_CMD(raw_topic) {
     }
     event_topic(user, chan, argv[1]);
     strcpy(chan->topic, argv[1]);
-    if(user->flags & USERFLAG_ISTMPUSER) {
-        free(user);
-    }
     return 1;
 }
 
@@ -237,12 +231,36 @@ static IRC_CMD(raw_privmsg) {
         if(target)
             event_privmsg(user, target, argv[1]);
     }
-    if(user->flags & USERFLAG_ISTMPUSER) {
-        free(user);
+    return 1;
+}
+
+static IRC_CMD(raw_notice) {
+    if(from == NULL || argc < 2) return 0;
+    struct UserNode *user = getUserByMask(from);
+    if(user == NULL) {
+        user = createTempUser(from);
+        user->flags |= USERFLAG_ISTMPUSER;
+    }
+    if(argv[0][0] == '#') { //Channel notice
+        struct ChanNode *chan = getChanByName(argv[0]);
+        if(chan && chan->chanbot == client->user)
+            event_channotice(user, chan, argv[1]);
+    } else {
+        struct UserNode *target = getUserByNick(argv[0]);
+        if(target)
+            event_privnotice(user, target, argv[1]);
     }
     return 1;
 }
 
+static IRC_CMD(raw_nick) {
+    if(from == NULL || argc == 0) return 0;
+    struct UserNode *user = getUserByMask(from);
+    event_nick(user, argv[0]);
+    renameUser(user, argv[0]);
+    return 1;
+}
+
 static IRC_CMD(raw_ping) {
     if(argc == 0) return 0;
     putsock(client, "PONG :%s", argv[0]);
@@ -262,11 +280,13 @@ static IRC_CMD(raw_315) {
 void parser_init() {
     //all the raws we receive...
     register_irc_function("001", raw_001);
+    register_irc_function("NOTICE", raw_notice);
     register_irc_function("TOPIC", raw_topic);
     register_irc_function("KICK", raw_kick);
-    register_irc_function("JOIN", raw_join);
     register_irc_function("PART", raw_part);
     register_irc_function("QUIT", raw_quit);
+    register_irc_function("JOIN", raw_join);
+    register_irc_function("NICK", raw_nick);
     register_irc_function("354", raw_354);
     register_irc_function("315", raw_315);
     register_irc_function("PING", raw_ping);
index 1c223acbe15480d1c96947b801e0df3e87b2eb07..465fd2e04bf6d2c43a221cebe6ab25c9d58ffbed 100644 (file)
@@ -4,8 +4,7 @@
 static struct UserNode **userList;
 
 void init_UserNode() {
-    userList = calloc(VALID_NICK_CHARS_FIRST_LEN, sizeof(*userList));
-    
+    userList = calloc(VALID_NICK_CHARS_FIRST_LEN+1, sizeof(*userList));
 }
 
 int is_valid_nick(const char *nick) {
@@ -99,6 +98,7 @@ struct UserNode* addUser(const char *nick) {
         return NULL;
     }
     strcpy(user->nick, nick);
+    user->created = time(0);
     user->ident[0] = 0;
     user->host[0] = 0;
     user->realname[0] = 0;
@@ -152,6 +152,7 @@ struct UserNode* createTempUser(const char *mask) {
                 return NULL;
             }
             strcpy(user->nick, cmask);
+            user->created = time(0);
             user->ident[0] = 0;
             user->host[0] = 0;
             user->realname[0] = 0;
@@ -167,6 +168,7 @@ struct UserNode* createTempUser(const char *mask) {
                 return NULL;
             }
             strcpy(user->host, cmask);
+            user->created = time(0);
             user->ident[0] = 0;
             user->host[0] = 0;
             user->realname[0] = 0;
@@ -227,3 +229,20 @@ void delUser(struct UserNode* user, int freeUser) {
     else
         user->next = NULL;
 }
+
+void clearTempUsers() {
+    int userListIndex = TEMPUSER_LIST_INDEX;
+    struct UserNode *cuser, *last_user = NULL, *next;
+    time_t now = time(0);
+    for(cuser = userList[userListIndex]; cuser; cuser = next) {
+        next = cuser->next;
+        if(cuser->flags & USERFLAG_FREETMPUSER || now - cuser->created >= 300) {
+            if(last_user)
+                last_user->next = cuser->next;
+            else
+                userList[userListIndex] = cuser->next;
+            break;
+        } else
+            last_user = cuser;
+    }
+}
index 49bb94067a446cfc3629fb848f5e2a4fc1201a21..eaddf59547843c90ede42f41ca507cd2b9a4ef86 100644 (file)
@@ -2,11 +2,13 @@
 #define _UserNode_h
 #include "main.h"
 
-#define USERFLAG_ISBOT     0x01
-#define USERFLAG_ISAUTHED  0x02
-#define USERFLAG_ISIRCOP   0x04
-#define USERFLAG_ISTMPUSER 0x08
-#define USERFLAG_ISSERVER  0x10
+#define USERFLAG_ISBOT       0x0001
+#define USERFLAG_ISAUTHED    0x0002
+#define USERFLAG_ISIRCOP     0x0004
+#define USERFLAG_ISTMPUSER   0x0008
+#define USERFLAG_ISSERVER    0x0010
+#define USERFLAG_FREETMPUSER 0x0020
+
 struct ChanUser;
 
 struct UserNode {
@@ -15,7 +17,8 @@ struct UserNode {
     char host[HOSTLEN+1];
     char realname[REALLEN+1];
     char auth[AUTHLEN+1];
-    char flags;
+    unsigned int flags;
+    time_t created;
     struct ChanUser *channel;
     
     struct UserNode *next;
diff --git a/main.c b/main.c
index 04a9f7d9f418d61393ea84347f6631529769a7cd..ddd5b5fba621e3abe1141d2448f10e09475cbf69 100644 (file)
--- a/main.c
+++ b/main.c
@@ -27,7 +27,13 @@ int main(void)
     init_UserNode();
     init_ChanNode();
     just_test_it();
+    
+    time_t socket_wait;
     while(1) {
-        socket_loop(1);
+        socket_wait = time(0) + SOCKET_SELECT_TIME;
+        do {
+            socket_loop(SOCKET_SELECT_TIME);
+        } while(time(0) > socket_wait);
+        clearTempUsers();
     }
 }
diff --git a/main.h b/main.h
index 802c1cbaea1d256db5df2087ba4581e488fdcd2c..75fdca3d4f794e9c732ab307170e686a1ec95d54 100644 (file)
--- a/main.h
+++ b/main.h
@@ -41,6 +41,7 @@ int stricmp (const char *s1, const char *s2)
    return c1 - c2;
 }
 
+#define SOCKET_SELECT_TIME 2
 
 #define NICKLEN         30
 #define USERLEN         10
@@ -59,4 +60,6 @@ int stricmp (const char *s1, const char *s2)
 #define VALID_NICK_CHARS_FIRST "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~[\\]^_`"
 #define VALID_NICK_CHARS_FIRST_LEN 62
 
+#define TEMPUSER_LIST_INDEX VALID_NICK_CHARS_FIRST_LEN
+
 #endif
\ No newline at end of file