From: pk910 Date: Sun, 17 Jul 2011 01:06:36 +0000 (+0200) Subject: added helpserv public channel X-Git-Url: http://git.pk910.de/?p=srvx.git;a=commitdiff_plain;h=14d177006f9a6b5fa71409991646dc3bd042a5d0 added helpserv public channel --- diff --git a/src/mod-helpserv.c b/src/mod-helpserv.c index 192fea5..384339d 100644 --- a/src/mod-helpserv.c +++ b/src/mod-helpserv.c @@ -53,6 +53,7 @@ const char *helpserv_module_deps[] = { NULL }; #define KEY_NICK "nick" #define KEY_DB_BADCHANS "badchans" #define KEY_HELP_CHANNEL "help_channel" +#define KEY_PUBLIC_CHANNEL "public_channel" #define KEY_PAGE_DEST "page_dest" #define KEY_CMDWORD "cmdword" #define KEY_PERSIST_LENGTH "persist_length" @@ -85,6 +86,7 @@ const char *helpserv_module_deps[] = { NULL }; #define KEY_PRIVMSG_ONLY "privmsg_only" #define KEY_REQ_ON_JOIN "req_on_join" #define KEY_AUTO_VOICE "auto_voice" +#define KEY_AUTO_JOIN "auto_join" #define KEY_AUTO_DEVOICE "auto_devoice" #define KEY_LAST_ACTIVE "last_active" @@ -170,7 +172,9 @@ static const struct message_entry msgtab[] = { { "HSMSG_SET_PRIVMSGONLY", "$bPrivmsgOnly $b %s" }, { "HSMSG_SET_REQONJOIN", "$bReqOnJoin $b %s" }, { "HSMSG_SET_AUTOVOICE", "$bAutoVoice $b %s" }, + { "HSMSG_SET_AUTOJOIN", "$bAutoJoin $b %s" }, { "HSMSG_SET_AUTODEVOICE", "$bAutoDevoice $b %s" }, + { "HSMSG_SET_PUBLICCHAN", "$bPublicChan $b %s" }, { "HSMSG_PAGE_NOTICE", "notice" }, { "HSMSG_PAGE_PRIVMSG", "privmsg" }, { "HSMSG_PAGE_ONOTICE", "onotice" }, @@ -500,6 +504,7 @@ struct helpserv_bot { struct userNode *helpserv; struct chanNode *helpchan; + struct chanNode *publicchan; struct chanNode *page_targets[PGSRC_COUNT]; enum page_type page_types[PGSRC_COUNT]; @@ -521,6 +526,7 @@ struct helpserv_bot { unsigned int privmsg_only : 1; unsigned int req_on_join : 1; unsigned int auto_voice : 1; + unsigned int auto_join : 1; unsigned int auto_devoice : 1; unsigned int helpchan_empty : 1; @@ -1060,8 +1066,11 @@ static void helpserv_usermsg(struct userNode *user, struct helpserv_bot *hs, con helpserv_msguser(user, "HSMSG_USERCMD_NO_REQUEST"); return; } - if ((hs->persist_lengths[PERSIST_T_REQUEST] == PERSIST_PART) && !GetUserMode(hs->helpchan, user)) { - helpserv_msguser(user, "HSMSG_REQ_YOU_NOT_IN_HELPCHAN_OPEN", hs->helpchan->name); + if ((hs->persist_lengths[PERSIST_T_REQUEST] == PERSIST_PART) && !GetUserMode(hs->helpchan, user) && (!hs->publicchan || (hs->publicchan && !GetUserMode(hs->publicchan, user)))) { + if(hs->publicchan) + helpserv_msguser(user, "HSMSG_REQ_YOU_NOT_IN_HELPCHAN_OPEN", hs->publicchan->name); + else + helpserv_msguser(user, "HSMSG_REQ_YOU_NOT_IN_HELPCHAN_OPEN", hs->helpchan->name); return; } @@ -1902,7 +1911,11 @@ static int helpserv_assign(int from_opserv, struct helpserv_bot *hs, struct user req->helper = GetHSUser(hs, user->handle_info); assert(req->helper); req->assigned = now; - + + if (req->user && hs->auto_join) { + irc_svsjoin(hs->helpserv,req->user,hs->helpchan); + } + if (old_helper) { helpserv_notice(user, "HSMSG_REQ_REASSIGNED", req->id, old_helper->handle->handle); req->helper->reassigned_to[0]++; @@ -1941,7 +1954,7 @@ static int helpserv_assign(int from_opserv, struct helpserv_bot *hs, struct user if ((change.args[0].u.member = GetUserMode(hs->helpchan, req->user))) mod_chanmode_announce(hs->helpserv, hs->helpchan, &change); } - + return 1; } @@ -2695,7 +2708,6 @@ static struct helpserv_bot *register_helpserv(const char *nick, const char *help dict_insert(helpserv_bots_bychan_dict, hs->helpchan->name, botlist); } helpserv_botlist_append(botlist, hs); - return hs; } @@ -2703,7 +2715,7 @@ static HELPSERV_FUNC(cmd_register) { char *nick, *helpchan, reason[MAXLEN]; struct handle_info *handle; - REQUIRE_PARMS(4); + REQUIRE_PARMS(3); nick = argv[1]; if (!is_valid_nick(nick)) { helpserv_notice(user, "HSMSG_ILLEGAL_NICK", nick); @@ -2764,7 +2776,7 @@ static void helpserv_free_bot(void *data) { } static void helpserv_unregister(struct helpserv_bot *bot, const char *quit_fmt, const char *global_fmt, const char *actor) { - char reason[MAXLEN], channame[CHANNELLEN], botname[NICKLEN]; + char reason[MAXLEN], channame[CHANNELLEN], *botname; struct helpserv_botlist *botlist; size_t len; @@ -2772,8 +2784,7 @@ static void helpserv_unregister(struct helpserv_bot *bot, const char *quit_fmt, helpserv_botlist_remove(botlist, bot); if (!botlist->used) dict_remove(helpserv_bots_bychan_dict, bot->helpchan->name); - len = strlen(bot->helpserv->nick) + 1; - safestrncpy(botname, bot->helpserv->nick, len); + botname=bot->helpserv->nick; len = strlen(bot->helpchan->name) + 1; safestrncpy(channame, bot->helpchan->name, len); snprintf(reason, sizeof(reason), quit_fmt, actor); @@ -3291,23 +3302,72 @@ static HELPSERV_OPTION(opt_auto_voice) { OPTION_BINARY(hs->auto_voice, "HSMSG_SET_AUTOVOICE"); } +static HELPSERV_OPTION(opt_auto_join) { + OPTION_BINARY(hs->auto_join, "HSMSG_SET_AUTOJOIN"); +} + static HELPSERV_OPTION(opt_auto_devoice) { OPTION_BINARY(hs->auto_devoice, "HSMSG_SET_AUTODEVOICE"); } +static HELPSERV_OPTION(opt_publicchan) { + char *publicchan; + int changed=0; + if (argc > 0) { + publicchan = argv[0]; + if(strcmp(publicchan, "*")) { + if (!IsChannelName(publicchan)) { + helpserv_notice(user, "HSMSG_ILLEGAL_CHANNEL", publicchan); + HELPSERV_SYNTAX(); + return 0; + } + if (opserv_bad_channel(publicchan)) { + helpserv_notice(user, "HSMSG_ILLEGAL_CHANNEL", publicchan); + return 0; + } + } + if (!hs->publicchan || (hs->publicchan && irccasecmp(hs->publicchan->name, publicchan))) { + if(hs->publicchan) { + //there is another public chan o.O + //part + DelChannelUser(hs->helpserv, hs->publicchan, "unregistered.", 0); + hs->publicchan = NULL; + } + changed = 1; + if(strcmp(publicchan, "*")) { + if (!(hs->publicchan = GetChannel(publicchan))) { + hs->publicchan = AddChannel(publicchan, now, NULL, NULL); + AddChannelUser(hs->helpserv, hs->publicchan)->modes |= MODE_CHANOP; + } else { + struct mod_chanmode change; + mod_chanmode_init(&change); + change.argc = 1; + change.args[0].mode = MODE_CHANOP; + change.args[0].u.member = AddChannelUser(hs->helpserv, hs->publicchan); + mod_chanmode_announce(hs->helpserv, hs->publicchan, &change); + } + } + } + } else { + changed = 0; + } + helpserv_notice(user, "HSMSG_SET_PUBLICCHAN", (hs->publicchan) ? hs->publicchan->name : user_find_message(user,"MSG_NONE")); \ + return changed; +} + static HELPSERV_FUNC(cmd_set) { helpserv_option_func_t *opt; if (argc < 2) { unsigned int i; helpserv_option_func_t *display[] = { - opt_pagetarget_command, opt_pagetarget_alert, opt_pagetarget_status, + opt_publicchan, opt_pagetarget_command, opt_pagetarget_alert, opt_pagetarget_status, opt_pagetype, opt_alert_page_type, opt_status_page_type, opt_greeting, opt_req_opened, opt_req_assigned, opt_req_closed, opt_idle_delay, opt_whine_delay, opt_whine_interval, opt_empty_interval, opt_stale_delay, opt_request_persistence, opt_helper_persistence, opt_notification, opt_id_wrap, - opt_req_maxlen, opt_privmsg_only, opt_req_on_join, opt_auto_voice, + opt_req_maxlen, opt_privmsg_only, opt_req_on_join, opt_auto_voice, opt_auto_join, opt_auto_devoice }; @@ -3594,6 +3654,7 @@ helpserv_bot_write(const char *key, void *data, void *extra) { /* Other settings and state */ saxdb_write_string(ctx, KEY_HELP_CHANNEL, hs->helpchan->name); + if(hs->publicchan) saxdb_write_string(ctx, KEY_PUBLIC_CHANNEL, hs->publicchan->name); slist = alloc_string_list(PGSRC_COUNT); for (pagesrc=0; pagesrcpage_targets[pagesrc]; @@ -3629,6 +3690,7 @@ helpserv_bot_write(const char *key, void *data, void *extra) { saxdb_write_int(ctx, KEY_PRIVMSG_ONLY, hs->privmsg_only); saxdb_write_int(ctx, KEY_REQ_ON_JOIN, hs->req_on_join); saxdb_write_int(ctx, KEY_AUTO_VOICE, hs->auto_voice); + saxdb_write_int(ctx, KEY_AUTO_JOIN, hs->auto_join); saxdb_write_int(ctx, KEY_AUTO_DEVOICE, hs->auto_devoice); saxdb_write_int(ctx, KEY_LAST_ACTIVE, hs->last_active); @@ -3649,7 +3711,7 @@ helpserv_saxdb_write(struct saxdb_context *ctx) { static int helpserv_bot_read(const char *key, void *data, UNUSED_ARG(void *extra)) { struct record_data *br = data, *raw_record; struct helpserv_bot *hs; - char *registrar, *helpchannel_name, *str; + char *registrar, *helpchannel_name, *publicchannel_name, *str; dict_t users, requests; enum page_source pagesrc; enum message_type msgtype; @@ -3670,6 +3732,25 @@ static int helpserv_bot_read(const char *key, void *data, UNUSED_ARG(void *extra hs = register_helpserv(key, helpchannel_name, registrar); + publicchannel_name = database_get_data(GET_RECORD_OBJECT(br), KEY_PUBLIC_CHANNEL, RECDB_QSTRING); + if (publicchannel_name) { + if(!IsChannelName(publicchannel_name)) { + log_module(HS_LOG, LOG_ERROR, "%s has an invalid channel name.", key); + return 0; + } else { + if (!(hs->publicchan = GetChannel(publicchannel_name))) { + hs->publicchan = AddChannel(publicchannel_name, now, NULL, NULL); + AddChannelUser(hs->helpserv, hs->publicchan)->modes |= MODE_CHANOP; + } else { + struct mod_chanmode change; + mod_chanmode_init(&change); + change.argc = 1; + change.args[0].mode = MODE_CHANOP; + change.args[0].u.member = AddChannelUser(hs->helpserv, hs->publicchan); + mod_chanmode_announce(hs->helpserv, hs->publicchan, &change); + } + } + } raw_record = dict_find(GET_RECORD_OBJECT(br), KEY_PAGE_DEST, NULL); switch (raw_record ? raw_record->type : RECDB_INVALID) { case RECDB_QSTRING: @@ -3736,6 +3817,8 @@ static int helpserv_bot_read(const char *key, void *data, UNUSED_ARG(void *extra hs->req_on_join = str ? enabled_string(str) : 0; str = database_get_data(GET_RECORD_OBJECT(br), KEY_AUTO_VOICE, RECDB_QSTRING); hs->auto_voice = str ? enabled_string(str) : 0; + str = database_get_data(GET_RECORD_OBJECT(br), KEY_AUTO_JOIN, RECDB_QSTRING); + hs->auto_join = str ? enabled_string(str) : 0; str = database_get_data(GET_RECORD_OBJECT(br), KEY_AUTO_DEVOICE, RECDB_QSTRING); hs->auto_devoice = str ? enabled_string(str) : 0; str = database_get_data(GET_RECORD_OBJECT(br), KEY_LAST_ACTIVE, RECDB_QSTRING); @@ -3837,6 +3920,8 @@ static void handle_part(struct modeNode *mn, UNUSED_ARG(const char *reason)) { struct helpserv_request *req = iter_data(it); if (mn->user != req->user) + continue; + if (GetUserMode(hs->helpchan, mn->user)) //publicchan continue; if (req->text->used) { helpserv_message(hs, mn->user, MSGTYPE_REQ_DROPPED); @@ -4027,6 +4112,7 @@ static void associate_requests_bybot(struct helpserv_bot *hs, struct userNode *u if (!nicknewest || (nicknewest->opened < req->opened)) nicknewest = req; + if (hs->auto_voice && req->helper) { struct mod_chanmode change; @@ -4041,7 +4127,7 @@ static void associate_requests_bybot(struct helpserv_bot *hs, struct userNode *u if ((force_greet && nicknewest) || (newest && (nicknewest == newest))) { /* Let the user know. Either the user is forced to be greeted, or the * above has changed which request will get their next message. */ - helpserv_msguser(user, "HSMSG_GREET_EXISTING_REQ", hs->helpchan->name, nicknewest->id); + //helpserv_msguser(user, "HSMSG_GREET_EXISTING_REQ", hs->helpchan->name, nicknewest->id); } } @@ -4658,7 +4744,9 @@ int helpserv_init() { helpserv_define_option("PRIVMSGONLY", opt_privmsg_only); helpserv_define_option("REQONJOIN", opt_req_on_join); helpserv_define_option("AUTOVOICE", opt_auto_voice); + helpserv_define_option("AUTOJOIN", opt_auto_join); helpserv_define_option("AUTODEVOICE", opt_auto_devoice); + helpserv_define_option("PUBLICCHAN", opt_publicchan); helpserv_usercmd_dict = dict_new(); dict_insert(helpserv_usercmd_dict, "WAIT", usercmd_wait);