--- /dev/null
+#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;
+ }
+}
+