changed Makefile; build all commands as an own file
[NeonServV5.git] / IRCParser.c
index 04ec1446510e8b287817e45c74702557bd257d2b..8662f6d8399e3907f60ef1c9713cbc5a5e438d42 100644 (file)
@@ -8,6 +8,8 @@
 #include "WHOHandler.h"
 #include "lang.h"
 #include "DBHelper.h"
+#include "BanNode.h"
+#include "ModeNode.h"
 
 struct irc_cmd *irc_commands = NULL;
 
@@ -84,7 +86,7 @@ static void parse_raw(struct ClientSocket *client, char *from, char *cmd, char *
     if(!irc_cmd) {
         event_raw(client, from, cmd, argv, argc);
     } else if(!ret) {
-        fprintf(stderr,"PARSE ERROR: %s", cmd);
+        fprintf(stderr,"PARSE ERROR: %s\n", cmd);
     }
 }
 
@@ -114,6 +116,7 @@ static IRC_CMD(raw_join) {
         struct ChanUser *chanuser = addChanUser(chan, user); //it must be a bot
         get_userlist(chan, got_channel_userlist, chanuser);
         putsock(client, "MODE %s", chan->name);
+        putsock(client, "MODE %s +b", chan->name);
     } else if(!isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         struct ChanUser *chanuser = addChanUser(chan, user);
         event_join(chanuser);
@@ -122,7 +125,7 @@ static IRC_CMD(raw_join) {
 }
 
 static IRC_CMD(raw_part) {
-    if(from == NULL || argc < 2) return 0;
+    if(from == NULL || argc < 1) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) return 0;
     struct ChanNode *chan = getChanByName(argv[0]);
@@ -130,7 +133,7 @@ static IRC_CMD(raw_part) {
     if(isUserOnChan(user, chan) && (chan->flags & CHANFLAG_RECEIVED_USERLIST)) {
         struct ChanUser *chanuser = getChanUser(user, chan);
         delChanUser(chanuser, 0); //we need to free the chanuser manually!
-        event_part(chanuser, argv[1]);
+        event_part(chanuser, (argc > 1 ? argv[1] : NULL));
         free(chanuser);
         if(chan->chanbot == user) {
             //check if theres another bot in the channel - otherwise free it
@@ -145,11 +148,11 @@ static IRC_CMD(raw_part) {
 }
 
 static IRC_CMD(raw_quit) {
-    if(from == NULL || argc < 2) return 0;
+    if(from == NULL || argc < 1) return 0;
     struct UserNode *user = getUserByMask(from);
     if(user == NULL) return 0;
     delUser(user, 0); //a little bit crazy, but we want to delete the user on the channel's userlists - but not the users channel list
-    event_quit(user, argv[1]);
+    event_quit(user, argv[0]);
     if(user->flags & USERFLAG_ISBOT) {
         //check if there are other bots in the users channel - otherwise free them
         struct ChanUser *chanuser, *next;
@@ -311,14 +314,18 @@ static IRC_CMD(raw_324) { //MODE LIST
     if(from == NULL || argc < 3) return 0;
     struct ChanNode *chan = getChanByName(argv[1]);
     if(chan == NULL) return 0;
-    parseModes(chan, argv[2], argv+3, argc-3);
+    parseModes(chan->modes, argv[2], argv+3, argc-3);
     return 1;
 }
 
 static IRC_CMD(raw_invite) {
     if(from == NULL || argc < 2) return 0;
     struct UserNode *user = getUserByMask(from);
-    event_invite(user, argv[1]);
+    if(user == NULL) {
+        user = createTempUser(from);
+        user->flags |= USERFLAG_ISTMPUSER;
+    }
+    event_invite(client, user, argv[1]);
     return 1;
 }
 
@@ -335,17 +342,30 @@ static IRC_CMD(raw_mode) {
         if(!chan) return 0;
         if(chan->chanbot != client->user) return 1;
         event_mode(user, chan, argv[1], argv+2, argc-2);
-        parseModes(chan, argv[1], argv+2, argc-2);
+        parseModes(chan->modes, argv[1], argv+2, argc-2);
     } else {
         //UserMode
     }
     return 1;
 }
 
+static IRC_CMD(raw_367) {
+    //Watchcat #pktest pk911!*@* TestBot!~bot@pktest.user.WebGamesNet 1315863279
+    struct ChanNode *chan = getChanByName(argv[1]);
+    if(!chan) return 0;
+    struct BanNode *ban;
+    while((ban = getMatchingChannelBan(chan, argv[2]))) {
+        removeChannelBan(ban);
+    }
+    addChannelBan(chan, argv[2]);
+    return 1;
+}
+
 void init_parser() {
     //all the raws we receive...
     register_irc_function("001", raw_001);
     register_irc_function("324", raw_324);
+    register_irc_function("367", raw_367);
     register_irc_function("INVITE", raw_invite);
     register_irc_function("NOTICE", raw_notice);
     register_irc_function("TOPIC", raw_topic);