]> jfr.im git - irc/atheme/atheme.git/commitdiff
chanserv: move libathemecore component of bouncing mode changes on secure channels...
authorWilliam Pitcock <redacted>
Mon, 9 Feb 2015 16:29:04 +0000 (10:29 -0600)
committerWilliam Pitcock <redacted>
Mon, 9 Feb 2015 16:31:21 +0000 (10:31 -0600)
include/abirev.h
include/channels.h
include/hooktypes.in
libathemecore/cmode.c
modules/chanserv/main.c

index 3f5508998e1eb312e43831e601aab5540d192b7e..b59ac87309b50ad942acbe7cfb7f7dd277268e53 100644 (file)
@@ -16,7 +16,7 @@
  * digits and set the rest to 0 (e.g. 330000). Otherwise, increment
  * the lower digits.
  */
-#define CURRENT_ABI_REVISION 720000
+#define CURRENT_ABI_REVISION 720001
 
 #endif
 
index e13e4fa6e6d3d29df72c03f22bee76570f9f02fd..dd5a116ad977b47317654d26712374d579bf9298 100644 (file)
@@ -135,6 +135,12 @@ typedef struct {
        channel_t *c;
 } hook_channel_mode_t;
 
+typedef struct {
+       chanuser_t *cu;
+       const char mchar;
+       unsigned int mvalue;
+} hook_channel_mode_change_t;
+
 /* cmode.c */
 E char *flags_to_string(unsigned int flags);
 E int mode_to_flag(char c);
index 84ba28fcf7c7f3685ca023e421b354611de2dd1d..22608d8327828810723a3e085266762b880d7b39 100644 (file)
@@ -37,6 +37,7 @@ channel_tschange   channel_t *
 channel_join       hook_channel_joinpart_t *
 channel_part       hook_channel_joinpart_t *
 channel_mode       hook_channel_mode_t *
+channel_mode_change   hook_channel_mode_change_t *
 channel_topic      channel_t *
 channel_can_change_topic  hook_channel_topic_check_t *
 channel_message    hook_cmessage_data_t *
index 35d86829f91a5cb52a548ff90221e5878d097850..95c8ea16a8a2c32f96c7577bc67e08020412f843 100644 (file)
@@ -321,20 +321,15 @@ void channel_mode(user_t *source, channel_t *chan, int parc, char *parv[])
                                                modestack_mode_param(source->nick, chan, MTYPE_ADD, *pos, CLIENT_NAME(cu->user));
 
                                        /* see if they did something we have to undo */
-                                       if (source == NULL && cu->user->server != me.me && chansvs.me != NULL && (mc = mychan_find(chan->name)) && mc->flags & MC_SECURE)
+                                       if (source == NULL && cu->user->server != me.me)
                                        {
-                                               if (status_mode_list[i].mode == 'o' && !(chanacs_user_flags(mc, cu->user) & (CA_OP | CA_AUTOOP)))
-                                               {
-                                                       /* they were opped and aren't on the list, deop them */
-                                                       modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, 'o', CLIENT_NAME(cu->user));
-                                                       cu->modes &= ~status_mode_list[i].value;
-                                               }
-                                               else if (ircd->uses_halfops && status_mode_list[i].mode == ircd->halfops_mchar[1] && !(chanacs_user_flags(mc, cu->user) & (CA_HALFOP | CA_AUTOHALFOP)))
-                                               {
-                                                       /* same for halfops -- jilles */
-                                                       modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, ircd->halfops_mchar[1], CLIENT_NAME(cu->user));
-                                                       cu->modes &= ~status_mode_list[i].value;
-                                               }
+                                               hook_channel_mode_change_t hookmsg_chg;
+
+                                               hookmsg_chg.cu = cu;
+                                               hookmsg_chg.mchar = status_mode_list[i].mode;
+                                               hookmsg_chg.mvalue = status_mode_list[i].value;
+
+                                               hook_call_channel_mode_change(&hookmsg_chg);
                                        }
                                }
                                else
index 6520bcc2eb3220accc9fbbdc2df1360c1e50ebfc..77fa900e81ccd553d4a4cd797d5c25cc2463a870 100644 (file)
@@ -27,6 +27,7 @@ static void cs_keeptopic_topicset(channel_t *c);
 static void cs_topiccheck(hook_channel_topic_check_t *data);
 static void cs_tschange(channel_t *c);
 static void cs_leave_empty(void *unused);
+static void cs_bounce_mode_change(hook_channel_mode_change_t *data);
 static void on_shutdown(void *unused);
 
 static mowgli_eventloop_timer_t *cs_leave_empty_timer = NULL;
@@ -278,6 +279,7 @@ void _modinit(module_t *m)
        hook_add_event("channel_topic");
        hook_add_event("channel_can_change_topic");
        hook_add_event("channel_tschange");
+       hook_add_event("channel_mode_change");
        hook_add_event("user_identify");
        hook_add_event("shutdown");
        hook_add_channel_join(cs_join);
@@ -288,6 +290,7 @@ void _modinit(module_t *m)
        hook_add_channel_topic(cs_keeptopic_topicset);
        hook_add_channel_can_change_topic(cs_topiccheck);
        hook_add_channel_tschange(cs_tschange);
+       hook_add_channel_mode_change(cs_bounce_mode_change);
        hook_add_shutdown(on_shutdown);
 
        cs_leave_empty_timer = mowgli_timer_add(base_eventloop, "cs_leave_empty", cs_leave_empty, NULL, 300);
@@ -332,6 +335,7 @@ void _moddeinit(module_unload_intent_t intent)
        hook_del_channel_topic(cs_keeptopic_topicset);
        hook_del_channel_can_change_topic(cs_topiccheck);
        hook_del_channel_tschange(cs_tschange);
+       hook_del_channel_mode_change(cs_bounce_mode_change);
        hook_del_shutdown(on_shutdown);
 
        mowgli_timer_destroy(base_eventloop, cs_leave_empty_timer);
@@ -905,6 +909,42 @@ static void cs_leave_empty(void *unused)
        }
 }
 
+static void cs_bounce_mode_change(hook_channel_mode_change_t *data)
+{
+       mychan_t *mc;
+       chanuser_t *cu;
+       channel_t *chan;
+
+       /* if we have SECURE mode enabled, then we want to bounce any changes */
+       cu = data->cu;
+       chan = cu->chan;
+       mc = chan->mychan;
+
+       if (mc == NULL || (mc != NULL && !(mc->flags & MC_SECURE)))
+               return;
+
+       if (ircd->uses_owner && data->mchar == ircd->owner_mchar[1] && !(chanacs_user_flags(mc, cu->user) & (CA_USEOWNER)))
+       {
+               modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, ircd->owner_mchar[1], CLIENT_NAME(cu->user));
+               cu->modes &= ~data->mvalue;
+       }
+       else if (ircd->uses_protect && data->mchar == ircd->protect_mchar[1] && !(chanacs_user_flags(mc, cu->user) & (CA_USEPROTECT)))
+       {
+               modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, ircd->protect_mchar[1], CLIENT_NAME(cu->user));
+               cu->modes &= ~data->mvalue;
+       }
+       else if (data->mchar == 'o' && !(chanacs_user_flags(mc, cu->user) & (CA_OP | CA_AUTOOP)))
+       {
+               modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, 'o', CLIENT_NAME(cu->user));
+               cu->modes &= ~data->mvalue;
+       }
+       else if (ircd->uses_halfops && data->mchar == ircd->halfops_mchar[1] && !(chanacs_user_flags(mc, cu->user) & (CA_HALFOP | CA_AUTOHALFOP)))
+       {
+               modestack_mode_param(chansvs.nick, chan, MTYPE_DEL, ircd->halfops_mchar[1], CLIENT_NAME(cu->user));
+               cu->modes &= ~data->mvalue;
+       }
+}
+
 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs
  * vim:ts=8
  * vim:sw=8