X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/c092fcad1208537de0115ebac7fc7e3b043dc39e..4e49624c75f3a3d458591e611adcb35bf4654368:/src/chanserv.c diff --git a/src/chanserv.c b/src/chanserv.c index ef0b209..e934108 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -218,6 +218,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_NO_SELF_CLVL", "You cannot change your own access." }, { "CSMSG_NO_BUMP_ACCESS", "You cannot give users access greater than or equal to your own." }, { "CSMSG_MULTIPLE_OWNERS", "There is more than one owner in %s; please use $bCLVL$b, $bDELOWNER$b and/or $bADDOWNER$b instead." }, + { "CSMSG_NO_OWNER", "There is no owner for %s; please use $bCLVL$b and/or $bADDOWNER$b instead." }, { "CSMSG_TRANSFER_WAIT", "You must wait %s before you can give ownership of $b%s$b to someone else." }, { "CSMSG_NO_TRANSFER_SELF", "You cannot give ownership to your own account." }, { "CSMSG_OWNERSHIP_GIVEN", "Ownership of $b%s$b has been transferred to account $b%s$b." }, @@ -296,6 +297,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_USET_AUTOOP", "$bAutoOp $b %s" }, { "CSMSG_USET_AUTOVOICE", "$bAutoVoice $b %s" }, { "CSMSG_USET_AUTOINVITE", "$bAutoInvite $b %s" }, + { "CSMSG_USET_AUTOJOIN", "$bAutoJoin $b %s" }, { "CSMSG_USET_INFO", "$bInfo $b %s" }, { "CSMSG_USER_PROTECTED", "Sorry, $b%s$b is protected." }, @@ -316,6 +318,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_AUTOMODE_HOP", "#1 plus give halfops to everyone." }, { "CSMSG_AUTOMODE_OP", "#1 plus give ops to everyone (not advised)" }, { "CSMSG_AUTOMODE_MUTE", "Give half-op to halfops, and op to ops only." }, + { "CSMSG_AUTOMODE_ONLYVOICE", "Just voice everyone with access." }, { "CSMSG_PROTECT_ALL", "Non-users and users will be protected from those of equal or lower access." }, { "CSMSG_PROTECT_EQUAL", "Users will be protected from those of equal or lower access." }, @@ -513,6 +516,8 @@ static const struct message_entry msgtab[] = { /* Other things */ { "CSMSG_EVENT_SEARCH_RESULTS", "$bChannel Events for %s$b" }, { "CSMSG_LAST_INVALID", "Invalid argument. must be 1-200" }, + { "CSMSG_DEFCON_NO_NEW_CHANNELS", "You cannot register new channels at this time, please try again soon." }, + { "CSMSG_DEFCON_NO_MODE_CHANGE", "You cannot change the MODE at this time, please try again soon." }, { NULL, NULL } }; @@ -684,7 +689,8 @@ struct charOptionValues { { 'v', "CSMSG_AUTOMODE_VOICE" }, { 'h', "CSMSG_AUTOMODE_HOP" }, { 'o', "CSMSG_AUTOMODE_OP" }, - { 'm', "CSMSG_AUTOMODE_MUTE" } + { 'm', "CSMSG_AUTOMODE_MUTE" }, + { 'l', "CSMSG_AUTOMODE_ONLYVOICE" } }, protectValues[] = { { 'a', "CSMSG_PROTECT_ALL" }, { 'e', "CSMSG_PROTECT_EQUAL" }, @@ -1963,6 +1969,10 @@ static CHANSERV_FUNC(cmd_register) struct do_not_register *dnr; unsigned int n; + if (checkDefCon(DEFCON_NO_NEW_CHANNELS) && !IsOper(user)) { + reply("CSMSG_DEFCON_NO_NEW_CHANNELS"); + return 0; + } if(channel) { @@ -2099,10 +2109,10 @@ static CHANSERV_FUNC(cmd_register) if(handle != user->handle_info) reply("CSMSG_PROXY_SUCCESS", handle->handle, channel->name); else - reply("CSMSG_REG_SUCCESS", channel->name); sprintf(reason, "%s registered to %s by %s.", channel->name, handle->handle, user->handle_info->handle); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "CSMSG_REGISTERED_TO", channel->name, + handle->handle, user->handle_info->handle); return 1; } @@ -2208,7 +2218,6 @@ static CHANSERV_FUNC(cmd_move) struct chanNode *target; struct modeNode *mn; struct userData *uData; - char reason[MAXLEN]; struct do_not_register *dnr; int chanserv_join = 0, spamserv_join; @@ -2291,16 +2300,18 @@ static CHANSERV_FUNC(cmd_move) if (chanserv_join) ss_cs_join_channel(target, spamserv_join); - sprintf(reason, "%s moved to %s by %s.", channel->name, target->name, user->handle_info->handle); if(!IsSuspended(target->channel_info)) { char reason2[MAXLEN]; - sprintf(reason2, "Channel moved to %s by %s.", target->name, user->handle_info->handle); - DelChannelUser(chanserv, channel, reason2, 0); + sprintf(reason2, "Channel moved to %s by %s.", target->name, user->handle_info->handle); + DelChannelUser(chanserv, channel, reason2, 0); } + UnlockChannel(channel); LockChannel(target); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "CSMSG_CHANNEL_MOVED", + channel->name, target->name, user->handle_info->handle); + reply("CSMSG_MOVE_SUCCESS", target->name); return 1; } @@ -3747,6 +3758,8 @@ static CHANSERV_FUNC(cmd_myaccess) } if(IsUserAutoInvite(uData) && (uData->access >= cData->lvlOpts[lvlInviteMe])) string_buffer_append(&sbuf, 'i'); + if(IsUserAutoJoin(uData) && (uData->access >= cData->lvlOpts[lvlInviteMe])) + string_buffer_append(&sbuf, 'j'); if(uData->info) string_buffer_append_printf(&sbuf, ")] %s", uData->info); else @@ -4447,6 +4460,11 @@ static CHANSERV_FUNC(cmd_mode) if(argc < 2) { + if (checkDefCon(DEFCON_NO_MODE_CHANGE) && !IsOper(user)) { + reply("CSMSG_DEFCON_NO_MODE_CHANGE"); + return 0; + } + change = &channel->channel_info->modes; if(change->modes_set || change->modes_clear) { modcmd_chanmode_announce(change); @@ -4679,9 +4697,9 @@ static CHANSERV_FUNC(cmd_info) reply("CSMSG_CHANNEL_VISITED", intervalString(buffer, now - cData->visited, user->handle_info)); privileged = IsStaff(user); - if(privileged) + /* if(privileged) */ reply("CSMSG_CHANNEL_REGISTERED", intervalString(buffer, now - cData->registered, user->handle_info)); - if(((uData && uData->access >= UL_COOWNER) || privileged) && cData->registrar) + if(/*((uData && uData->access >= UL_COOWNER) || privileged) && */cData->registrar) reply("CSMSG_CHANNEL_REGISTRAR", cData->registrar); if(privileged && (dnr = chanserv_is_dnr(channel->name, NULL))) @@ -5390,8 +5408,9 @@ static CHANSERV_FUNC(cmd_csuspend) suspended->previous->revoked = now; if(suspended->previous->expires) timeq_del(suspended->previous->expires, chanserv_expire_suspension, suspended->previous, 0); - sprintf(reason, "%s suspension modified by %s.", channel->name, suspended->suspender); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + + global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "CSMSG_SUSPENSION_MODIFIED", + channel->name, suspended->suspender); } else { @@ -5410,8 +5429,8 @@ static CHANSERV_FUNC(cmd_csuspend) spamserv_cs_suspend(channel, expiry, 1, suspended->reason); DelChannelUser(chanserv, channel, suspended->reason, 0); reply("CSMSG_SUSPENDED", channel->name); - sprintf(reason, "%s suspended by %s.", channel->name, suspended->suspender); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "CSMSG_SUSPENDED_BY", + channel->name, suspended->suspender); } return 1; } @@ -5419,7 +5438,6 @@ static CHANSERV_FUNC(cmd_csuspend) static CHANSERV_FUNC(cmd_cunsuspend) { struct suspended *suspended; - char message[MAXLEN]; if(!IsSuspended(channel->channel_info)) { @@ -5433,8 +5451,8 @@ static CHANSERV_FUNC(cmd_cunsuspend) timeq_del(suspended->expires, chanserv_expire_suspension, suspended, 0); chanserv_expire_suspension(suspended); reply("CSMSG_UNSUSPENDED", channel->name); - sprintf(message, "%s unsuspended by %s.", channel->name, user->handle_info->handle); - global_message(MESSAGE_RECIPIENT_OPERS|MESSAGE_RECIPIENT_HELPERS, message); + global_message_args(MESSAGE_RECIPIENT_OPERS|MESSAGE_RECIPIENT_HELPERS, "CSMSG_UNSUSPENDED_BY", + channel->name, user->handle_info->handle); return 1; } @@ -5750,6 +5768,11 @@ static MODCMD_FUNC(chan_opt_modes) if(argc > 1) { + if (checkDefCon(DEFCON_NO_MODE_CHANGE) && !IsOper(user)) { + reply("CSMSG_DEFCON_NO_MODE_CHANGE"); + return 0; + } + if(!check_user_level(channel, user, lvlEnfModes, 1, 0)) { reply("CSMSG_NO_ACCESS"); @@ -6212,11 +6235,10 @@ static MODCMD_FUNC(user_opt_autoop) reply("CSMSG_NOT_USER", channel->name); return 0; } - if(uData->access < UL_OP /*channel->channel_info->lvlOpts[lvlGiveOps]*/) + if(uData->access < UL_HALFOP /*channel->channel_info->lvlOpts[lvlGiveOps]*/) return user_binary_option("CSMSG_USET_AUTOVOICE", USER_AUTO_OP, CSFUNC_ARGS); else return user_binary_option("CSMSG_USET_AUTOOP", USER_AUTO_OP, CSFUNC_ARGS); - /* TODO: add halfops error message? or is the op one generic enough? */ } static MODCMD_FUNC(user_opt_autoinvite) @@ -6224,6 +6246,11 @@ static MODCMD_FUNC(user_opt_autoinvite) return user_binary_option("CSMSG_USET_AUTOINVITE", USER_AUTO_INVITE, CSFUNC_ARGS); } +static MODCMD_FUNC(user_opt_autojoin) +{ + return user_binary_option("CSMSG_USET_AUTOJOIN", USER_AUTO_JOIN, CSFUNC_ARGS); +} + static MODCMD_FUNC(user_opt_info) { struct userData *uData; @@ -6282,7 +6309,7 @@ static CHANSERV_FUNC(cmd_uset) { char *options[] = { - "AutoOp", "AutoInvite", "Info" + "AutoOp", "AutoInvite", "AutoJoin", "Info" }; if(!uset_shows_list.size) @@ -6333,7 +6360,7 @@ static CHANSERV_FUNC(cmd_giveownership) struct giveownership *giveownership; unsigned int force, override; unsigned short co_access, new_owner_old_access; - char reason[MAXLEN], transfer_reason[MAXLEN]; + char transfer_reason[MAXLEN]; REQUIRE_PARAMS(2); curr_user = GetChannelAccess(cData, user->handle_info); @@ -6371,6 +6398,10 @@ static CHANSERV_FUNC(cmd_giveownership) reply("CSMSG_TRANSFER_WAIT", delay, channel->name); return 0; } + if (!curr_user) { + reply("CSMSG_NO_OWNER", channel->name); + return 0; + } if(!(new_owner_hi = modcmd_get_handle_info(user, argv[1]))) return 0; if(new_owner_hi == user->handle_info) @@ -6433,8 +6464,8 @@ static CHANSERV_FUNC(cmd_giveownership) channel->channel_info->giveownership = giveownership; reply("CSMSG_OWNERSHIP_GIVEN", channel->name, new_owner_hi->handle); - sprintf(reason, "%s ownership transferred to %s by %s.", channel->name, new_owner_hi->handle, user->handle_info->handle); - global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason); + global_message_args(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, "CSMSG_OWNERSHIP_TRANSFERRED", + channel->name, new_owner_hi->handle, user->handle_info->handle); return 1; } @@ -6917,6 +6948,19 @@ static CHANSERV_FUNC(cmd_calc) return 1; } +static CHANSERV_FUNC(cmd_reply) +{ + + REQUIRE_PARAMS(2); + unsplit_string(argv + 1, argc - 1, NULL); + + if(channel) + send_channel_message(channel, cmd->parent->bot, "$b%s$b: %s", user->nick, unsplit_string(argv + 1, argc - 1, NULL)); + else + send_message_type(4, user, cmd->parent->bot, "%s", unsplit_string(argv + 1, argc - 1, NULL)); + return 1; +} + static void chanserv_adjust_limit(void *data) { @@ -7098,7 +7142,11 @@ handle_join(struct modeNode *mNode) /* non users getting automodes are handled above. */ if(IsUserAutoOp(uData) && cData->chOpts[chAutomode] != 'n') { - if(uData->access >= UL_OP ) + /* just op everyone with access */ + if(uData->access >= UL_PEON && cData->chOpts[chAutomode] == 'l') + modes |= MODE_VOICE; + /* or do their access level */ + else if(uData->access >= UL_OP ) modes |= MODE_CHANOP; else if(uData->access >= UL_HALFOP ) modes |= MODE_HALFOP; @@ -7174,6 +7222,14 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) && !self->burst && !user->uplink->burst) irc_invite(chanserv, user, cn); + + if(!IsUserSuspended(channel) + && IsUserAutoJoin(channel) + && (channel->access >= channel->channel->lvlOpts[lvlInviteMe]) + && !self->burst + && !user->uplink->burst) + irc_svsjoin(chanserv, user, cn); + continue; } @@ -8558,6 +8614,7 @@ init_chanserv(const char *nick) DEFINE_COMMAND(d, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(huggle, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); DEFINE_COMMAND(calc, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); + DEFINE_COMMAND(reply, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL); /* Channel options */ DEFINE_CHANNEL_OPTION(defaulttopic); @@ -8592,6 +8649,7 @@ init_chanserv(const char *nick) /* User options */ DEFINE_USER_OPTION(autoinvite); + DEFINE_USER_OPTION(autojoin); DEFINE_USER_OPTION(info); DEFINE_USER_OPTION(autoop);