added mode +a access check
[srvx.git] / src / proto-p10.c
index 16de1cbf9eb9cc2d38d083a3d394514205107c80..b4a0707d3718d801c2b0d9c62064f5f18a8fdee1 100644 (file)
@@ -1197,6 +1197,8 @@ create_helper(char *name, void *data)
         return;
     }
 
+    handle_new_channel_created(name, cd->user);
+
     AddChannelUser(cd->user, AddChannel(name, cd->when, NULL, NULL));
 }
 
@@ -1587,6 +1589,8 @@ static CMD_FUNC(cmd_kick)
 {
     if (argc < 3)
         return 0;
+    if (GetUserN(argv[2]) && IsOper(GetUserN(argv[2])))
+        operpart(GetChannel(argv[1]), GetUserN(argv[2]));
     ChannelUserKicked(GetUserH(origin), GetUserN(argv[2]), GetChannel(argv[1]));
     return 1;
 }
@@ -1772,6 +1776,30 @@ static CMD_FUNC(cmd_relay)
              sprintf(tmp,"%s LR\n",argv[3]);
              irc_relay(tmp);
             }
+        } else if(strcmp("JA", argv[2]) == 0) {
+            struct userData *uData;
+            struct chanNode *cn;
+            struct userNode *user;
+            char tmp[MAXLEN];
+            cn = GetChannel(argv[4]);
+            if (!cn) return 0;
+            if (!(user = GetUserN(argv[3]))) return 0;
+            if(!cn->channel_info) {
+                //channel not registered
+                sprintf(tmp,"%s JAA %s %s\n",argv[3],cn->name,argv[6]);
+            } else if((uData = GetChannelUser(cn->channel_info, user->handle_info))) {
+                if(uData->access >= atoi(argv[5])) {
+                    //we can join
+                    sprintf(tmp,"%s JAA %s %s\n",argv[3],cn->name,argv[6]);
+                } else {
+                    //access too low
+                    sprintf(tmp,"%s JAR %s %i %i\n",argv[3],cn->name,uData->access,uData->access);
+                }
+            } else {
+                //0 access
+                sprintf(tmp,"%s JAR %s %s %s\n",argv[3],cn->name,"0","0");
+            }
+            irc_relay(tmp);
         }
     }
     return 1;
@@ -2413,8 +2441,10 @@ void mod_usermode(struct userNode *user, const char *mode_change) {
         case 'o':
             do_user_mode(FLAGS_OPER);
             if (!add) {
+                operdel(user);
                 userList_remove(&curr_opers, user);
             } else if (!userList_contains(&curr_opers, user)) {
+                operadd(user);
                 userList_append(&curr_opers, user);
                 call_oper_funcs(user);
             }
@@ -2548,12 +2578,12 @@ mod_chanmode_parse(struct chanNode *channel, char **modes, unsigned int argc, un
         case 'z':
           if (!(flags & MCP_REGISTERED) && (!(flags & MCP_IGN_REGISTERED) || add)) {
             do_chan_mode(MODE_REGISTERED);
-+          } else if (flags & MCP_IGN_REGISTERED) {
-+           /* ignore the modechange but continue parsing */
-           } else {
+          } else if (flags & MCP_IGN_REGISTERED) {
+            /* ignore the modechange but continue parsing */
+          } else {
             mod_chanmode_free(change);
             return NULL;
-           }
+          }
           break;
 #undef do_chan_mode
         case 'l':
@@ -2932,7 +2962,7 @@ mod_chanmode_format(struct mod_chanmode *change, char *outbuff)
         DO_MODE_CHAR(REGISTERED, 'z');
         DO_MODE_CHAR(LIMIT, 'l'), args_used += sprintf(args + args_used, " %d", change->new_limit);
         DO_MODE_CHAR(KEY, 'k'), args_used += sprintf(args + args_used, " %s", change->new_key);
-        DO_MODE_CHAR(KEY, 'a'), args_used += sprintf(args + args_used, " %s", change->new_access);
+        DO_MODE_CHAR(KEY, 'a'), args_used += sprintf(args + args_used, " %d", change->new_access);
         DO_MODE_CHAR(KEY, 'F'), args_used += sprintf(args + args_used, " %s", change->new_altchan);
         DO_MODE_CHAR(UPASS, 'U'), args_used += sprintf(args + args_used, " %s", change->new_upass);
         DO_MODE_CHAR(APASS, 'A'), args_used += sprintf(args + args_used, " %s", change->new_apass);