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
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;
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);
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);
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);
}
}
+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