Merge branch 'master' into IOMultiplexer
[NeonServV5.git] / src / IRCParser.c
index 60b48d9fe342649c5436b8550feeeb42c5c4783e..2d9fbbf5b815cea2dc3c164a56ef5c2aba04cbb6 100644 (file)
@@ -35,27 +35,10 @@ int statistics_privmsg = 0;
 int statistics_network_users = 0;
 int statistics_network_channels = 0;
 
-static void parse_line(struct ClientSocket *client, char *line);
 static void register_irc_function(char *command, irc_cmd_t *func);
 static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char **argv, int argc);
 
-int parse_lines(struct ClientSocket *client, char *lines, int len) {
-    int i, used = 0;
-    char *line = lines;
-    for(i = 0; i < len; i++) {
-        if(lines[i] == '\r') //just zero it out :D
-            lines[i] = 0;
-        if(lines[i] == '\n') {
-            lines[i] = 0;
-            parse_line(client, line);
-            line = lines+(i+1);
-            used = i+1;
-        }
-    }
-    return used;
-}
-
-static void parse_line(struct ClientSocket *client, char *line) {
+void parse_line(struct ClientSocket *client, char *line) {
     int argc = 0;
     char *argv[MAXNUMPARAMS];
     #ifdef HAVE_THREADS
@@ -188,7 +171,7 @@ static IRC_CMD(raw_join) {
         event_registered(user, from);
         user->flags &= ~USERFLAG_WAS_REGISTERING;
     } else if(!(chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
-        if(!isBot(user)) {
+        if(client->user != user) { //bots are allowed to add themselves
             DESYNCHRONIZE(cache_sync);
             return 1; //ignore join
         }
@@ -413,7 +396,7 @@ static IRC_CMD(raw_quit) {
     for(chanuser = getUserChannels(user, NULL); chanuser; chanuser = next_chanuser) {
         next_chanuser = getUserChannels(user, chanuser);
         chanuser->visCount--;
-        if(chanuser->visCount <= 0) {
+        if(chanuser->visCount <= 0 && !(user->flags & USERFLAG_WAS_REGISTERING)) {
             delChanUser(chanuser, 0); //not free, yet!
             event_part(chanuser, 1, argv[0]);
             if((chanuser->chan->flags & CHANFLAG_RECEIVED_USERLIST) && !(chanuser->chan->flags & CHANFLAG_REJOINING))