]> jfr.im git - irc/rqf/shadowircd.git/commitdiff
Update omode so that it can set +ah.
authorB.Greenham <redacted>
Sun, 4 Apr 2010 19:32:34 +0000 (15:32 -0400)
committerB.Greenham <redacted>
Sun, 4 Apr 2010 19:32:34 +0000 (15:32 -0400)
extensions/m_omode.c

index f80e26276b1fc564ba7f5fda17c04ffa07446cb5..451b627222454f4d374b7d0c9801b56f6f9d8907 100644 (file)
@@ -124,7 +124,24 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char
        set_channel_mode(client_p, source_p->servptr, chptr, msptr, 
                         parc - 2, parv + 2);
 #else
-       if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name))
+       if (parc == 4 && !strcmp(parv[2], "+a") && !irccmp(parv[3], source_p->name))
+       {
+               /* Admining themselves */
+               if (!wasonchannel)
+               {
+                       sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,
+                                          form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname);
+                       return 0;
+               }
+               sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +a %s",
+                               me.name, parv[1], source_p->name);
+               sendto_server(NULL, chptr, CAP_TS6, NOCAPS,
+                               ":%s TMODE %ld %s +a %s",
+                               me.id, (long) chptr->channelts, parv[1],
+                               source_p->id);
+               msptr->flags |= CHFL_ADMIN;
+       }
+       else if (parc == 4 && !strcmp(parv[2], "+o") && !irccmp(parv[3], source_p->name))
        {
                /* Opping themselves */
                if (!wasonchannel)
@@ -141,11 +158,28 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char
                                source_p->id);
                msptr->flags |= CHFL_CHANOP;
        }
-       else
+       else if (parc == 4 && !strcmp(parv[2], "+h") && !irccmp(parv[3], source_p->name))
+       {
+               /* Halfopping themselves */
+               if (!wasonchannel)
+               {
+                       sendto_one_numeric(source_p, ERR_USERNOTINCHANNEL,
+                                          form_str(ERR_USERNOTINCHANNEL), parv[3], chptr->chname);
+                       return 0;
+               }
+               sendto_channel_local(ALL_MEMBERS, chptr, ":%s MODE %s +h %s",
+                               me.name, parv[1], source_p->name);
+               sendto_server(NULL, chptr, CAP_TS6, NOCAPS,
+                               ":%s TMODE %ld %s +h %s",
+                               me.id, (long) chptr->channelts, parv[1],
+                               source_p->id);
+               msptr->flags |= CHFL_HALFOP;
+       }
+       else if (ConfigChannel.use_admin)
        {
                /* Hack it so set_channel_mode() will accept */
                if (wasonchannel)
-                       msptr->flags |= CHFL_CHANOP;
+                       msptr->flags |= CHFL_ADMIN;
                else
                {
                        add_user_to_channel(chptr, source_p, CHFL_CHANOP);
@@ -156,6 +190,27 @@ mo_omode(struct Client *client_p, struct Client *source_p, int parc, const char
                /* We know they were not opped before and they can't have opped
                 * themselves as set_channel_mode() does not allow that
                 * -- jilles */
+               if (wasonchannel)
+                       msptr->flags &= ~CHFL_ADMIN;
+               else
+                       remove_user_from_channel(msptr);
+       }
+       else
+       {
+               /* CHFL_ADMIN is only useful if admin is enabled
+                * so hack it with op if it is not. */
+               if (wasonchannel)
+                       msptr->flags |= CHFL_CHANOP;
+               else
+               {
+                       add_user_to_channel(chptr, source_p, CHFL_CHANOP);
+                       msptr = find_channel_membership(chptr, source_p);
+               }
+               set_channel_mode(client_p, source_p, chptr, msptr, 
+                               parc - 2, parv + 2);
+               /* We know they were not opped before and they can't have opped
+                * themselves as set_channel_mode() does not allow that 
+                * -- jilles */
                if (wasonchannel)
                        msptr->flags &= ~CHFL_CHANOP;
                else