]> jfr.im git - irc/evilnet/x3.git/blobdiff - src/chanserv.c
fix for 1551717- automode'ing when authing in a channel
[irc/evilnet/x3.git] / src / chanserv.c
index 4120c8a70d6101b70a62df10cedd46c1f48442e9..eedb7bcffe56192be88124a6013c336ad7745bb2 100644 (file)
@@ -6235,11 +6235,10 @@ static MODCMD_FUNC(user_opt_autoop)
         reply("CSMSG_NOT_USER", channel->name);
         return 0;
     }
-    if(uData->access < UL_OP /*channel->channel_info->lvlOpts[lvlGiveOps]*/)
+    if(uData->access < UL_HALFOP /*channel->channel_info->lvlOpts[lvlGiveOps]*/)
         return user_binary_option("CSMSG_USET_AUTOVOICE", USER_AUTO_OP, CSFUNC_ARGS);
     else
         return user_binary_option("CSMSG_USET_AUTOOP", USER_AUTO_OP, CSFUNC_ARGS);
-    /* TODO: add halfops error message? or is the op one generic enough? */
 }
 
 static MODCMD_FUNC(user_opt_autoinvite)
@@ -7193,6 +7192,35 @@ handle_join(struct modeNode *mNode)
     return 0;
 }
 
+static void
+chanserv_autojoin_channel(void *data)
+{
+    struct userData *channel;
+    struct userNode *user = data;
+
+    for(channel = user->handle_info->channels; channel; channel = channel->u_next)
+    {
+        struct chanNode *cn;
+        struct modeNode *mn;
+
+        if(IsUserSuspended(channel)
+           || IsSuspended(channel->channel)
+           || !(cn = channel->channel->channel))
+            continue;
+
+        mn = GetUserMode(cn, user);
+        if(!mn)
+        {
+            if(!IsUserSuspended(channel)
+               && IsUserAutoJoin(channel)
+               && (channel->access >= channel->channel->lvlOpts[lvlInviteMe])
+               && !self->burst
+               && !user->uplink->burst)
+                irc_svsjoin(chanserv, user, cn);
+        }
+    }
+}
+
 static void
 handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle))
 {
@@ -7208,12 +7236,14 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle))
     for(channel = user->handle_info->channels; channel; channel = channel->u_next)
     {
         struct chanNode *cn;
+        struct chanData *cData;
         struct modeNode *mn;
         if(IsUserSuspended(channel)
            || IsSuspended(channel->channel)
            || !(cn = channel->channel->channel))
             continue;
 
+        cData = cn->channel_info;
         mn = GetUserMode(cn, user);
         if(!mn)
         {
@@ -7223,21 +7253,13 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle))
                && !self->burst
                && !user->uplink->burst)
                 irc_invite(chanserv, user, cn);
-
-            if(!IsUserSuspended(channel)
-               && IsUserAutoJoin(channel)
-               && (channel->access >= channel->channel->lvlOpts[lvlInviteMe])
-               && !self->burst
-               && !user->uplink->burst)
-                irc_svsjoin(chanserv, user, cn);
-
             continue;
         }
 
        if(channel->access >= UL_PRESENT)
            channel->channel->visited = now;
 
-        if(IsUserAutoOp(channel))
+        if(IsUserAutoOp(channel) && cData->chOpts[chAutomode] != 'n')
         {
             if(channel->access >= UL_OP )
                 change.args[0].mode = MODE_CHANOP;
@@ -7305,6 +7327,10 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle))
 
     if (user->handle_info->epithet)
       irc_swhois(chanserv, user, user->handle_info->epithet);
+
+   /* process autojoin channels 5 seconds later as this sometimes 
+      happens before autohide */
+   timeq_add(now + 5, chanserv_autojoin_channel, user);
 }
 
 static void