diff --git a/extensions/Makefile.in b/extensions/Makefile.in index ca7b80884..13c58db68 100644 --- a/extensions/Makefile.in +++ b/extensions/Makefile.in @@ -27,6 +27,7 @@ INCLUDES = -I. -I../include -I../libratbox/include $(SSL_INCLUDES) CPPFLAGS = ${INCLUDES} @CPPFLAGS@ SRCS = \ + chm_adminonly.c \ chm_operonly.c \ chm_operonly_compat.c \ chm_quietunreg_compat.c \ diff --git a/extensions/chm_adminonly.c b/extensions/chm_adminonly.c new file mode 100644 index 000000000..f018de207 --- /dev/null +++ b/extensions/chm_adminonly.c @@ -0,0 +1,52 @@ +#include "stdinc.h" +#include "modules.h" +#include "hook.h" +#include "client.h" +#include "ircd.h" +#include "send.h" +#include "s_conf.h" +#include "s_user.h" +#include "s_serv.h" +#include "numeric.h" +#include "chmode.h" + +static void h_can_join(hook_data_channel *); + +mapi_hfn_list_av1 adminonly_hfnlist[] = { + { "can_join", (hookfn) h_can_join }, + { NULL, NULL } +}; + +static int +_modinit(void) +{ + chmode_table['A'].mode_type = find_cflag_slot(); + chmode_table['A'].set_func = chm_staff; + + construct_noparam_modes(); + + return 0; +} + +static void +_moddeinit(void) +{ + chmode_table['A'].mode_type = 0; + + construct_noparam_modes(); +} + +DECLARE_MODULE_AV1(chm_adminonly, _modinit, _moddeinit, NULL, NULL, adminonly_hfnlist, "$Revision$"); + +static void +h_can_join(hook_data_channel *data) +{ + struct Client *source_p = data->client; + struct Channel *chptr = data->chptr; + + if((chptr->mode.mode & chmode_flags['A']) && !IsOperAdmin(source_p)) { + sendto_one_numeric(source_p, 519, "%s :Cannot join channel (+A) - you are not an IRC server administrator", chptr->chname); + data->approved = ERR_CUSTOM; + } +} +