]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/chanserv.c
global message function that will deal with multi languages. Made use of it with...
[irc/evilnet/x3.git] / src / chanserv.c
index e462d81abf29630b704a4521d8ea4324529a3f58..6ff9d5fd2ec334c9381374175c7d591174ac4c8e 100644 (file)
@@ -513,6 +513,8 @@ static const struct message_entry msgtab[] = {
 /* Other things */
     { "CSMSG_EVENT_SEARCH_RESULTS", "$bChannel Events for %s$b" },
     { "CSMSG_LAST_INVALID", "Invalid argument.  must be 1-200" },
+    { "CSMSG_DEFCON_NO_NEW_CHANNELS", "You cannot register new channels at this time, please try again soon." },
+    { "CSMSG_DEFCON_NO_MODE_CHANGE", "You cannot change the MODE at this time, please try again soon." },
     { NULL, NULL }
 };
 
@@ -1676,7 +1678,7 @@ protect_user(const struct userNode *victim, const struct userNode *aggressor, st
 }
 
 static int
-validate_op(struct userNode *user, struct chanNode *channel, struct userNode *victim)
+validate_op(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, struct userNode *victim)
 {
     struct chanData *cData = channel->channel_info;
     struct userData *cs_victim;
@@ -1685,7 +1687,10 @@ validate_op(struct userNode *user, struct chanNode *channel, struct userNode *vi
         || (cs_victim->access < UL_OP /* cData->lvlOpts[lvlGiveOps]*/))
        && !check_user_level(channel, user, lvlEnfOps, 0, 0))
     {
-       send_message(user, chanserv, "CSMSG_OPBY_LOCKED");
+        if(cmd)
+           reply("CSMSG_OPBY_LOCKED");
+        else
+            send_message(user, chanserv, "CSMSG_OPBY_LOCKED");
        return 0;
     }
 
@@ -1693,7 +1698,7 @@ validate_op(struct userNode *user, struct chanNode *channel, struct userNode *vi
 }
 
 static int
-validate_halfop(struct userNode *user, struct chanNode *channel, struct userNode *victim)
+validate_halfop(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, struct userNode *victim)
 {
     struct chanData *cData = channel->channel_info;
     struct userData *cs_victim;
@@ -1702,7 +1707,7 @@ validate_halfop(struct userNode *user, struct chanNode *channel, struct userNode
         || (cs_victim->access < UL_HALFOP /* cData->lvlOpts[lvlGiveHalfOps] */))
        && !check_user_level(channel, user, lvlEnfHalfOps, 0, 0))
     {
-        send_message(user, chanserv, "CSMSG_HOPBY_LOCKED");
+        reply("CSMSG_HOPBY_LOCKED");
         return 0;
     }
 
@@ -1711,17 +1716,17 @@ validate_halfop(struct userNode *user, struct chanNode *channel, struct userNode
 
 
 static int
-validate_deop(struct userNode *user, struct chanNode *channel, struct userNode *victim)
+validate_deop(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, struct userNode *victim)
 {
     if(IsService(victim))
     {
-       send_message(user, chanserv, "MSG_SERVICE_IMMUNE", victim->nick);
+       reply("MSG_SERVICE_IMMUNE", victim->nick);
        return 0;
     }
 
     if(protect_user(victim, user, channel->channel_info))
     {
-       send_message(user, chanserv, "CSMSG_USER_PROTECTED", victim->nick);
+       reply("CSMSG_USER_PROTECTED", victim->nick);
        return 0;
     }
 
@@ -1729,17 +1734,17 @@ validate_deop(struct userNode *user, struct chanNode *channel, struct userNode *
 }
 
 static int
-validate_dehop(struct userNode *user, struct chanNode *channel, struct userNode *victim)
+validate_dehop(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, struct userNode *victim)
 {
     if(IsService(victim))
     {
-        send_message(user, chanserv, "MSG_SERVICE_IMMUNE", victim->nick);
+        reply("MSG_SERVICE_IMMUNE", victim->nick);
         return 0;
     }
 
     if(protect_user(victim, user, channel->channel_info))
     {
-        send_message(user, chanserv, "CSMSG_USER_PROTECTED", victim->nick);
+        reply("CSMSG_USER_PROTECTED", victim->nick);
         return 0;
     }
 
@@ -1960,6 +1965,10 @@ static CHANSERV_FUNC(cmd_register)
     struct do_not_register *dnr;
     unsigned int n;
 
+    if (checkDefCon(DEFCON_NO_NEW_CHANNELS) && !IsOper(user)) {
+        reply("CSMSG_DEFCON_NO_NEW_CHANNELS");
+        return 0;
+    }
 
     if(channel)
     {
@@ -2795,7 +2804,7 @@ static CHANSERV_FUNC(cmd_mdelhalfop)
 
 /* trim_lamers.. */
 static int
-cmd_trim_bans(struct userNode *user, struct chanNode *channel, unsigned long duration)
+cmd_trim_bans(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, unsigned long duration)
 {
     struct banData *bData, *next;
     char interval[INTERVALLEN];
@@ -2816,12 +2825,12 @@ cmd_trim_bans(struct userNode *user, struct chanNode *channel, unsigned long dur
     }
 
     intervalString(interval, duration, user->handle_info);
-    send_message(user, chanserv, "CSMSG_TRIMMED_LAMERS", count, channel->name, interval);
+    reply("CSMSG_TRIMMED_LAMERS", count, channel->name, interval);
     return 1;
 }
 
 static int
-cmd_trim_users(struct userNode *user, struct chanNode *channel, unsigned short min_access, unsigned short max_access, unsigned long duration, int vacation)
+cmd_trim_users(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, unsigned short min_access, unsigned short max_access, unsigned long duration, int vacation)
 {
     struct userData *actor, *uData, *next;
     char interval[INTERVALLEN];
@@ -2831,13 +2840,13 @@ cmd_trim_users(struct userNode *user, struct chanNode *channel, unsigned short m
     actor = GetChannelUser(channel->channel_info, user->handle_info);
     if(min_access > max_access)
     {
-        send_message(user, chanserv, "CSMSG_BAD_RANGE", min_access, max_access);
+        reply("CSMSG_BAD_RANGE", min_access, max_access);
         return 0;
     }
 
     if((actor->access <= max_access) && !IsHelping(user))
     {
-       send_message(user, chanserv, "CSMSG_NO_ACCESS");
+       reply("CSMSG_NO_ACCESS");
        return 0;
     }
 
@@ -2865,7 +2874,7 @@ cmd_trim_users(struct userNode *user, struct chanNode *channel, unsigned short m
         min_access = 1;
         max_access = (actor->access > UL_OWNER) ? UL_OWNER : (actor->access - 1);
     }
-    send_message(user, chanserv, "CSMSG_TRIMMED_USERS", count, min_access, max_access, channel->name, intervalString(interval, duration, user->handle_info));
+    reply("CSMSG_TRIMMED_USERS", count, min_access, max_access, channel->name, intervalString(interval, duration, user->handle_info));
     return 1;
 }
 
@@ -2887,22 +2896,22 @@ static CHANSERV_FUNC(cmd_trim)
 
     if(!irccasecmp(argv[1], "lamers"))
     {
-       cmd_trim_bans(user, channel, duration); /* trim_lamers.. */
+       cmd_trim_bans(cmd, user, channel, duration); /* trim_lamers.. */
        return 1;
     }
     else if(!irccasecmp(argv[1], "users"))
     {
-       cmd_trim_users(user, channel, 0, 0, duration, vacation);
+       cmd_trim_users(cmd, user, channel, 0, 0, duration, vacation);
        return 1;
     }
     else if(parse_level_range(&min_level, &max_level, argv[1]))
     {
-       cmd_trim_users(user, channel, min_level, max_level, duration, vacation);
+       cmd_trim_users(cmd, user, channel, min_level, max_level, duration, vacation);
        return 1;
     }
     else if((min_level = user_level_from_name(argv[1], UL_OWNER)))
     {
-       cmd_trim_users(user, channel, min_level, min_level, duration, vacation);
+       cmd_trim_users(cmd, user, channel, min_level, min_level, duration, vacation);
        return 1;
     }
     else
@@ -3022,7 +3031,7 @@ static CHANSERV_FUNC(cmd_downall)
     return cmd_all(CSFUNC_ARGS, cmd_down);
 }
 
-typedef int validate_func_t(struct userNode *user, struct chanNode *channel, struct userNode *victim);
+typedef int validate_func_t(struct svccmd *cmd, struct userNode *user, struct chanNode *channel, struct userNode *victim);
 typedef void process_func_t(unsigned int num, struct userNode **newops, struct chanNode *channel, struct userNode *who, int announce);
 
 static int
@@ -3042,7 +3051,7 @@ modify_users(struct userNode *user, struct chanNode *channel, unsigned int argc,
         change->args[valid].u.member = GetUserMode(channel, victim);
         if(!change->args[valid].u.member)
             continue;
-        if(validate && !validate(user, channel, victim))
+        if(validate && !validate(cmd, user, channel, victim))
            continue;
         valid++;
     }
@@ -4444,6 +4453,11 @@ static CHANSERV_FUNC(cmd_mode)
     
     if(argc < 2)
     {
+        if (checkDefCon(DEFCON_NO_MODE_CHANGE) && !IsOper(user)) {
+            reply("CSMSG_DEFCON_NO_MODE_CHANGE");
+            return 0;
+        }
+
         change = &channel->channel_info->modes;
        if(change->modes_set || change->modes_clear) {
             modcmd_chanmode_announce(change);
@@ -4676,9 +4690,9 @@ static CHANSERV_FUNC(cmd_info)
     reply("CSMSG_CHANNEL_VISITED", intervalString(buffer, now - cData->visited, user->handle_info));
 
     privileged = IsStaff(user);
-    if(privileged)
+    /* if(privileged) */
         reply("CSMSG_CHANNEL_REGISTERED", intervalString(buffer, now - cData->registered, user->handle_info));
-    if(((uData && uData->access >= UL_COOWNER) || privileged) && cData->registrar)
+    if(/*((uData && uData->access >= UL_COOWNER) || privileged) && */cData->registrar)
         reply("CSMSG_CHANNEL_REGISTRAR", cData->registrar);
 
     if(privileged && (dnr = chanserv_is_dnr(channel->name, NULL)))
@@ -5450,7 +5464,7 @@ typedef struct chanservSearch
 typedef void (*channel_search_func)(struct chanData *channel, void *data);
 
 static search_t
-chanserv_search_create(struct userNode *user, unsigned int argc, char *argv[])
+chanserv_search_create(struct svccmd *cmd, struct userNode *user, unsigned int argc, char *argv[])
 {
     search_t search;
     unsigned int i;
@@ -5464,7 +5478,7 @@ chanserv_search_create(struct userNode *user, unsigned int argc, char *argv[])
        /* Assume all criteria require arguments. */
        if(i == (argc - 1))
        {
-           send_message(user, chanserv, "MSG_MISSING_PARAMS", argv[i]);
+           reply("MSG_MISSING_PARAMS", argv[i]);
             goto fail;
        }
 
@@ -5485,7 +5499,7 @@ chanserv_search_create(struct userNode *user, unsigned int argc, char *argv[])
                search->flags |= CHANNEL_SUSPENDED;
            else
            {
-               send_message(user, chanserv, "CSMSG_INVALID_CFLAG", argv[i]);
+               reply("CSMSG_INVALID_CFLAG", argv[i]);
                goto fail;
            }
        }
@@ -5493,7 +5507,7 @@ chanserv_search_create(struct userNode *user, unsigned int argc, char *argv[])
            search->limit = strtoul(argv[++i], NULL, 10);
        else
        {
-           send_message(user, chanserv, "MSG_INVALID_CRITERIA", argv[i]);
+           reply("MSG_INVALID_CRITERIA", argv[i]);
            goto fail;
        }
     }
@@ -5570,7 +5584,7 @@ static CHANSERV_FUNC(cmd_search)
        return 0;
     }
 
-    search = chanserv_search_create(user, argc - 2, argv + 2);
+    search = chanserv_search_create(cmd, user, argc - 2, argv + 2);
     if(!search)
         return 0;
 
@@ -5747,6 +5761,11 @@ static MODCMD_FUNC(chan_opt_modes)
 
     if(argc > 1)
     {
+        if (checkDefCon(DEFCON_NO_MODE_CHANGE) && !IsOper(user)) {
+            reply("CSMSG_DEFCON_NO_MODE_CHANGE");
+            return 0;
+        }
+
         if(!check_user_level(channel, user, lvlEnfModes, 1, 0))
         {
             reply("CSMSG_NO_ACCESS");
@@ -7396,7 +7415,7 @@ handle_mode(struct chanNode *channel, struct userNode *user, const struct mod_ch
         else if(change->args[ii].mode & MODE_CHANOP)
         {
             const struct userNode *victim = change->args[ii].u.member->user;
-            if(IsService(victim) || validate_op(user, channel, (struct userNode*)victim))
+            if(IsService(victim) || validate_op(NULL, user, channel, (struct userNode*)victim))
                 continue;
             if(!bounce)
                 bounce = mod_chanmode_alloc(change->argc + 1 - ii);