]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/chanserv.c
adding bantimeout to help
[irc/evilnet/x3.git] / src / chanserv.c
index a44f19fe90c2794463ae3d7c3f0bcbf24cbabaa7..a84813540b4324ebbfb7fb4389b282eeae7eccff 100644 (file)
@@ -303,10 +303,10 @@ static const struct message_entry msgtab[] = {
 
     { "CSMSG_AUTOMODE_NONE", "Noone will be automatically oped, half-oped, or voiced." },
     { "CSMSG_AUTOMODE_NORMAL", "Give voice to peons, half-op to halfops, and op to ops." },
-    { "CSMSG_AUTOMODE_VOICE", "Give voice to strangers." },
-    { "CSMSG_AUTOMODE_HOP", "Give halfops to strangers." },
-    { "CSMSG_AUTOMODE_OP", "Give ops to strangers (not advised)" },
-    { "CSMSG_AUTOMODE_MUTE", "Give half-op to halfops, and op to ops (no voice to peons)." },
+    { "CSMSG_AUTOMODE_VOICE", "#1 plus give voice to everyone." },
+    { "CSMSG_AUTOMODE_HOP", "#1 plus give halfops to everyone." },
+    { "CSMSG_AUTOMODE_OP", "#1 plus give ops to everyone (not advised)" },
+    { "CSMSG_AUTOMODE_MUTE", "Give half-op to halfops, and op to ops only." },
 
     { "CSMSG_PROTECT_ALL", "Non-users and users will be protected from those of equal or lower access." },
     { "CSMSG_PROTECT_EQUAL", "Users will be protected from those of equal or lower access." },
@@ -633,14 +633,14 @@ static const struct {
     unsigned int old_flag;
     unsigned short flag_value;
 } levelOptions[] = {
-    { "CSMSG_SET_ENFOPS", "enfops", 300, 1, 0, 0 },
-    { "CSMSG_SET_ENFHALFOPS", "enfhalfops", 300, 1, 0, 0 },
-    { "CSMSG_SET_ENFMODES", "enfmodes", 200, 3, 0, 0 },
-    { "CSMSG_SET_ENFTOPIC", "enftopic", 200, 4, 0, 0 },
-    { "CSMSG_SET_PUBCMD", "pubcmd", 0, 5, 0, 0 },
-    { "CSMSG_SET_SETTERS", "setters", 400, 7, 0, 0 },
-    { "CSMSG_SET_USERINFO", "userinfo", 1, ~0, CHANNEL_INFO_LINES, 1 },
-    { "CSMSG_SET_INVITEME", "inviteme", 1, ~0, CHANNEL_PEON_INVITE, 200 },
+    { "CSMSG_SET_ENFOPS",     "enfops",     300,  1, 0, 0 },
+    { "CSMSG_SET_ENFHALFOPS", "enfhalfops", 300,  1, 0, 0 },
+    { "CSMSG_SET_ENFMODES",   "enfmodes",   200,  3, 0, 0 },
+    { "CSMSG_SET_ENFTOPIC",   "enftopic",   200,  4, 0, 0 },
+    { "CSMSG_SET_PUBCMD",     "pubcmd",       0,  5, 0, 0 },
+    { "CSMSG_SET_SETTERS",    "setters",    400,  7, 0, 0 },
+    { "CSMSG_SET_USERINFO",   "userinfo",     1, ~0, CHANNEL_INFO_LINES, 1 },
+    { "CSMSG_SET_INVITEME",   "inviteme",     1, ~0, CHANNEL_PEON_INVITE, 200 },
     { "CSMSG_SET_TOPICSNARF", "topicsnarf", 501, ~0, CHANNEL_TOPIC_SNARF, 1 }
 };
 
@@ -2388,8 +2388,20 @@ merge_bans(struct chanData *source, struct chanData *target)
 static void
 merge_data(struct chanData *source, struct chanData *target)
 {
+    /* Use more recent visited and owner-transfer time; use older
+     * registered time.  Bitwise or may_opchan.  Use higher max.
+     * Do not touch last_refresh, ban count or user counts.
+     */
     if(source->visited > target->visited)
        target->visited = source->visited;
+    if(source->registered < target->registered)
+        target->registered = source->registered;
+    if(source->ownerTransfer > target->ownerTransfer)
+        target->ownerTransfer = source->ownerTransfer;
+    if(source->may_opchan)
+        target->may_opchan = 1;
+    if(source->max > target->max)
+        target->max = source->max;
 }
 
 static void
@@ -3002,7 +3014,7 @@ static CHANSERV_FUNC(cmd_devoice)
 }
 
 static int
-bad_channel_ban(struct chanNode *channel, struct userNode *user, const char *ban, int *victimCount, struct modeNode **victims)
+bad_channel_ban(struct chanNode *channel, struct userNode *user, const char *ban, unsigned int *victimCount, struct modeNode **victims)
 {
     unsigned int ii;
 
@@ -3104,18 +3116,18 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c
                reply("CSMSG_MASK_PROTECTED", argv[1]);
            return 0;
        }
-        /* We dont actually want a victem count if were banning a mask manually, IMO -Rubin*/
-        if(cmd)
-            victimCount = 0;  /* Dont deop etc ppl who match this */
-
-#ifdef entropy_lameness
-        if((victimCount > 4) && ((victimCount * 3) > channel->members.used) && !IsOper(user))
+/* If i want to ban *.nl and theres 5 of them, what is it to the bot?!? 
+//      if((victimCount > 4) && ((victimCount * 3) > channel->members.used) && !IsOper(user)) 
+                                                                           And, ^^^^^^^^^ BAH! 
+   We use x2 style over-mask detection instead because it doesnt stop channel owners from doing 
+   reasonable bans, but does stop *@*, *@*a* *@*b* etc type masks.  Yes, you can defeat it with 
+   some creativity, but its not x3's job to be the ban censor anyway.  */
+        if(is_overmask(argv[1]))
         {
            if(cmd)
                 reply("CSMSG_LAME_MASK", argv[1]);
             return 0;
         }
-#endif
 
         if((action == ACTION_KICK) && (victimCount == 0))
         {
@@ -4419,9 +4431,10 @@ static CHANSERV_FUNC(cmd_info)
     reply("CSMSG_CHANNEL_USERS", cData->userCount);
     reply("CSMSG_CHANNEL_LAMERS", cData->banCount);
     reply("CSMSG_CHANNEL_VISITED", intervalString(buffer, now - cData->visited, user->handle_info));
-    reply("CSMSG_CHANNEL_REGISTERED", intervalString(buffer, now - cData->registered, user->handle_info));
 
     privileged = IsStaff(user);
+    if(privileged)
+        reply("CSMSG_CHANNEL_REGISTERED", intervalString(buffer, now - cData->registered, user->handle_info));
     if(((uData && uData->access >= UL_COOWNER) || privileged) && cData->registrar)
         reply("CSMSG_CHANNEL_REGISTRAR", cData->registrar);
 
@@ -4588,7 +4601,8 @@ static CHANSERV_FUNC(cmd_resync)
     struct chanData *cData = channel->channel_info;
     unsigned int ii, used;
 
-    changes = mod_chanmode_alloc(channel->members.used * 2);
+    /* 6 = worst case -ovh+ovh on everyone */
+    changes = mod_chanmode_alloc(channel->members.used * 6);
     for(ii = used = 0; ii < channel->members.used; ++ii)
     {
         struct modeNode *mn = channel->members.list[ii];
@@ -4597,53 +4611,128 @@ static CHANSERV_FUNC(cmd_resync)
         if(IsService(mn->user))
             continue;
 
+
         uData = GetChannelAccess(cData, mn->user->handle_info);
-        if(uData && uData->access >= UL_OP )
+        
+        /* If the channel is in no-mode mode, de-mode EVERYONE */
+        if(cData->chOpts[chAutomode] == 'n')
         {
-            if(!(mn->modes & MODE_CHANOP))
-            {
-                changes->args[used].mode = MODE_CHANOP;
-                changes->args[used++].u.member = mn;
-            }
-        }
-        else if(uData && uData->access >= UL_HALFOP)
-        {
-            if(mn->modes & MODE_CHANOP)
-            {
-                changes->args[used].mode = MODE_REMOVE |  MODE_CHANOP;
-                changes->args[used++].u.member = mn;
-            }
-            if(!(mn->modes & MODE_HALFOP))
-            {
-                changes->args[used].mode = MODE_HALFOP;
-                changes->args[used++].u.member = mn;
-            }
+                if(mn->modes)
+                {
+                    changes->args[used].mode = MODE_REMOVE | mn->modes;
+                    changes->args[used++].u.member = mn;
+                }
         }
-        else if(uData && uData->access >= UL_PEON )
+        else /* Give various userlevels their modes.. */
         {
-            if(mn->modes & MODE_CHANOP)
+            if(uData && uData->access >= UL_OP )
             {
-                changes->args[used].mode = MODE_REMOVE | MODE_CHANOP;
-                changes->args[used++].u.member = mn;
+                if(!(mn->modes & MODE_CHANOP))
+                {
+                    changes->args[used].mode = MODE_CHANOP;
+                    changes->args[used++].u.member = mn;
+                }
             }
-            if(mn->modes & MODE_HALFOP)
+            else if(uData && uData->access >= UL_HALFOP)
             {
-                changes->args[used].mode = MODE_REMOVE | MODE_HALFOP;
-                changes->args[used++].u.member = mn;
+                if(mn->modes & MODE_CHANOP)
+                {
+                    changes->args[used].mode = MODE_REMOVE |  MODE_CHANOP;
+                    changes->args[used++].u.member = mn;
+                }
+                if(!(mn->modes & MODE_HALFOP))
+                {
+                    changes->args[used].mode = MODE_HALFOP;
+                    changes->args[used++].u.member = mn;
+                }
             }
-            /* Don't voice peons if were in mode m */
-            if(!(mn->modes & MODE_VOICE) && cData->chOpts[chAutomode] != 'm')
+            else if(uData && uData->access >= UL_PEON )
             {
-                changes->args[used].mode = MODE_VOICE;
-                changes->args[used++].u.member = mn;
+                if(mn->modes & MODE_CHANOP)
+                {
+                    changes->args[used].mode = MODE_REMOVE | MODE_CHANOP;
+                    changes->args[used++].u.member = mn;
+                }
+                if(mn->modes & MODE_HALFOP)
+                {
+                    changes->args[used].mode = MODE_REMOVE | MODE_HALFOP;
+                    changes->args[used++].u.member = mn;
+                }
+                /* Don't voice peons if were in mode m */
+                if( cData->chOpts[chAutomode] == 'm')
+                {
+                    if(mn->modes & MODE_VOICE)
+                    {
+                        changes->args[used].mode = MODE_REMOVE | MODE_VOICE;
+                        changes->args[used++].u.member = mn;
+                    }
+                }
+                /* otherwise, make user they do have voice */
+                else if(!(mn->modes & MODE_VOICE))
+                {
+                    changes->args[used].mode = MODE_VOICE;
+                    changes->args[used++].u.member = mn;
+                }
             }
-        }
-        else
-        {
-            if(mn->modes)
+            else /* They arnt on the userlist.. */
             {
-                changes->args[used].mode = MODE_REMOVE | mn->modes;
-                changes->args[used++].u.member = mn;
+                /* If we voice everyone, but they dont.. */
+                if(cData->chOpts[chAutomode] == 'v')
+                {
+                    /* Remove anything except v */
+                    if(mn->modes & ~MODE_VOICE)
+                    {
+                        changes->args[used].mode = MODE_REMOVE | (mn->modes & ~MODE_VOICE);
+                        changes->args[used++].u.member = mn;
+                    }
+                    /* Add v */
+                    if(!(mn->modes & MODE_VOICE))
+                    {
+                        changes->args[used].mode = MODE_VOICE;
+                        changes->args[used++].u.member = mn;
+                    }
+                }
+                /* If we hop everyone, but they dont.. */
+                else if(cData->chOpts[chAutomode] == 'h')
+                {
+                    /* Remove anything except h */
+                    if(mn->modes & ~MODE_HALFOP)
+                    {
+                        changes->args[used].mode = MODE_REMOVE | (mn->modes & ~MODE_HALFOP);
+                        changes->args[used++].u.member = mn;
+                    }
+                    /* Add h */
+                    if(!(mn->modes & MODE_HALFOP))
+                    {
+                        changes->args[used].mode = MODE_HALFOP;
+                        changes->args[used++].u.member = mn;
+                    }
+                }
+                /* If we op everyone, but they dont.. */
+                else if(cData->chOpts[chAutomode] == 'o')
+                {
+                    /* Remove anything except h */
+                    if(mn->modes & ~MODE_CHANOP)
+                    {
+                        changes->args[used].mode = MODE_REMOVE | (mn->modes & ~MODE_CHANOP);
+                        changes->args[used++].u.member = mn;
+                    }
+                    /* Add h */
+                    if(!(mn->modes & MODE_CHANOP))
+                    {
+                        changes->args[used].mode = MODE_CHANOP;
+                        changes->args[used++].u.member = mn;
+                    }
+                }
+                /* they have no excuse for having modes, de-everything them */
+                else
+                {
+                    if(mn->modes)
+                    {
+                        changes->args[used].mode = MODE_REMOVE | mn->modes;
+                        changes->args[used++].u.member = mn;
+                    }
+                }
             }
         }
     }