X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/a6fa003552075b0cd7873939a555da6f2de6f332..cbfd323c3191336a3c07c24725019cdaf87f0dd6:/src/chanserv.c diff --git a/src/chanserv.c b/src/chanserv.c index 5555f7c..ced5b2c 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -59,6 +59,7 @@ #define KEY_NODELETE_LEVEL "nodelete_level" #define KEY_MAX_USERINFO_LENGTH "max_userinfo_length" #define KEY_GIVEOWNERSHIP_PERIOD "giveownership_timeout" +#define KEY_VALID_CHANNEL_REGEX "valid_channel_regex" /* ChanServ database */ #define KEY_VERSION_CONTROL "version_control" @@ -279,7 +280,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_BAD_SETLEVEL", "You cannot change any setting to above your level." }, { "CSMSG_BAD_SETTERS", "You cannot change Setters to above your level." }, { "CSMSG_INVALID_MODE_LOCK", "$b%s$b is an invalid mode lock." }, - { "CSMSG_INVALID_NUMERIC", "$b%d$b is not a valid choice. Choose one:" }, + { "CSMSG_INVALID_NUMERIC", "$b%s$b is not a valid choice. Choose one:" }, { "CSMSG_SET_DEFAULT_TOPIC", "$bDefaultTopic$b %s" }, { "CSMSG_SET_TOPICMASK", "$bTopicMask $b %s" }, { "CSMSG_SET_GREETING", "$bGreeting $b %s" }, @@ -619,6 +620,9 @@ static struct unsigned int max_chan_users; unsigned int max_chan_bans; /* lamers */ unsigned int max_userinfo_length; + unsigned int valid_channel_regex_set : 1; + + regex_t valid_channel_regex; struct string_list *set_shows; struct string_list *eightball; @@ -2272,6 +2276,19 @@ static CHANSERV_FUNC(cmd_register) } */ + if (chanserv_conf.valid_channel_regex_set) { + int err = regexec(&chanserv_conf.valid_channel_regex, argv[1], 0, 0, 0); + if (err) { + char buff[256]; + buff[regerror(err, &chanserv_conf.valid_channel_regex, buff, sizeof(buff))] = 0; + log_module(CS_LOG, LOG_INFO, "regexec error: %s (%d)", buff, err); + } + if(err == REG_NOMATCH) { + reply("CSMSG_ILLEGAL_CHANNEL", argv[1]); + return 0; + } + } + if(new_channel) channel = AddChannel(argv[1], now, NULL, NULL, NULL); @@ -2694,6 +2711,7 @@ static CHANSERV_FUNC(cmd_merge) struct userData *target_user; struct chanNode *target; char reason[MAXLEN]; + int nodelete = 0; REQUIRE_PARAMS(2); @@ -2705,6 +2723,11 @@ static CHANSERV_FUNC(cmd_merge) return 0; } + if (argc > 2) { + if (!irccasecmp("nodelete", argv[2])) + nodelete = 1; + } + if(!target->channel_info) { reply("CSMSG_NOT_REGISTERED", target->name); @@ -2740,7 +2763,8 @@ static CHANSERV_FUNC(cmd_merge) merge_channel(channel->channel_info, target->channel_info); spamserv_cs_move_merge(user, channel, target, 0); sprintf(reason, "merged into %s by %s.", target->name, user->handle_info->handle); - unregister_channel(channel->channel_info, reason); + if (!nodelete) + unregister_channel(channel->channel_info, reason); reply("CSMSG_MERGE_SUCCESS", target->name); return 1; } @@ -6199,6 +6223,16 @@ static MODCMD_FUNC(chan_opt_nodelete) static MODCMD_FUNC(chan_opt_dynlimit) { + struct mod_chanmode change; + + if (argc > 1) { + if (disabled_string(argv[1])) { + mod_chanmode_init(&change); + change.modes_clear |= MODE_LIMIT; + mod_chanmode_announce(chanserv, channel, &change); + } + } + CHANNEL_BINARY_OPTION("CSMSG_SET_DYNLIMIT", CHANNEL_DYNAMIC_LIMIT); } @@ -6398,7 +6432,7 @@ channel_multiple_option(enum charOption option, struct userNode *user, struct ch if(!isdigit(argv[1][0]) || (index < 0) || (index >= count)) { - reply("CSMSG_INVALID_NUMERIC", index); + reply("CSMSG_INVALID_NUMERIC", argv[1]); /* Show possible values. */ for(index = 0; index < count; index++) reply(charOptions[option].format_name, index, user_find_message(user, charOptions[option].values[index].format_name)); @@ -7088,7 +7122,7 @@ static CHANSERV_FUNC(cmd_spin) if(!channel) return 1; - int type, lamep = 1; + int type = 0, lamep = 1; char *tstr; tstr = conf_get_data("server/type", RECDB_QSTRING); @@ -7173,7 +7207,7 @@ static CHANSERV_FUNC(cmd_spin) while(complete != 1) { if (rndchans != 15) { chango = 120 + rand() % 600; - sputsock("%s SJ %s #%d %ld", self->numeric, user->numeric, chango, now); + sputsock("%s SJ %s #%d "FMT_TIME_T, self->numeric, user->numeric, chango, now); rndchans++; } else { if (roundz0r != 1) { @@ -7275,9 +7309,9 @@ static CHANSERV_FUNC(cmd_spin) //snprintf(ban, sizeof(ban), "*!*@%s", user->hostname); for (n=count=0; nchannels.used; n++) { struct mod_chanmode *change; - struct banData *bData; +/* struct banData *bData; */ unsigned int exists; - int duration = 300; +/* int duration = 300; */ char *ban; ban = generate_hostmask(user, GENMASK_STRICT_HOST|GENMASK_ANY_IDENT|GENMASK_USENICK); @@ -8467,6 +8501,16 @@ chanserv_conf_read(void) chanserv_conf.default_modes = *change; mod_chanmode_free(change); } + str = database_get_data(conf_node, KEY_VALID_CHANNEL_REGEX, RECDB_QSTRING); + if (chanserv_conf.valid_channel_regex_set) + regfree(&chanserv_conf.valid_channel_regex); + if (str) { + int err = regcomp(&chanserv_conf.valid_channel_regex, str, REG_EXTENDED|REG_ICASE|REG_NOSUB); + chanserv_conf.valid_channel_regex_set = !err; + if (err) log_module(CS_LOG, LOG_ERROR, "Bad valid_channel_regex (error %d)", err); + } else { + chanserv_conf.valid_channel_regex_set = 0; + } free_string_list(chanserv_conf.wheel); strlist = database_get_data(conf_node, "wheel", RECDB_STRING_LIST); if(strlist) @@ -9345,7 +9389,7 @@ init_chanserv(const char *nick) reg_svccmd_unbind_func(handle_svccmd_unbind); chanserv_module = module_register("ChanServ", CS_LOG, "chanserv.help", chanserv_expand_variable); - DEFINE_COMMAND(register, 1, MODCMD_REQUIRE_AUTHED, "flags", "+acceptchan,+helping", NULL); + DEFINE_COMMAND(register, 1, MODCMD_REQUIRE_AUTHED, "flags", "+acceptchan,+channel", NULL); DEFINE_COMMAND(noregister, 1, MODCMD_REQUIRE_AUTHED, "flags", "+helping", NULL); DEFINE_COMMAND(allowregister, 2, 0, "template", "noregister", NULL); DEFINE_COMMAND(move, 1, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN, "template", "register", NULL);