X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/cd25f2e983991b8769135c8e88a372272ec6d96c..10fb34f65cebd737faaed4ca8d3d4f92ce5c705f:/src/chanserv.c diff --git a/src/chanserv.c b/src/chanserv.c index 4120c8a..eedb7bc 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -6235,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) @@ -7193,6 +7192,35 @@ handle_join(struct modeNode *mNode) return 0; } +static void +chanserv_autojoin_channel(void *data) +{ + struct userData *channel; + struct userNode *user = data; + + for(channel = user->handle_info->channels; channel; channel = channel->u_next) + { + struct chanNode *cn; + struct modeNode *mn; + + if(IsUserSuspended(channel) + || IsSuspended(channel->channel) + || !(cn = channel->channel->channel)) + continue; + + mn = GetUserMode(cn, user); + if(!mn) + { + if(!IsUserSuspended(channel) + && IsUserAutoJoin(channel) + && (channel->access >= channel->channel->lvlOpts[lvlInviteMe]) + && !self->burst + && !user->uplink->burst) + irc_svsjoin(chanserv, user, cn); + } + } +} + static void handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) { @@ -7208,12 +7236,14 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) for(channel = user->handle_info->channels; channel; channel = channel->u_next) { struct chanNode *cn; + struct chanData *cData; struct modeNode *mn; if(IsUserSuspended(channel) || IsSuspended(channel->channel) || !(cn = channel->channel->channel)) continue; + cData = cn->channel_info; mn = GetUserMode(cn, user); if(!mn) { @@ -7223,21 +7253,13 @@ 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; } if(channel->access >= UL_PRESENT) channel->channel->visited = now; - if(IsUserAutoOp(channel)) + if(IsUserAutoOp(channel) && cData->chOpts[chAutomode] != 'n') { if(channel->access >= UL_OP ) change.args[0].mode = MODE_CHANOP; @@ -7305,6 +7327,10 @@ handle_auth(struct userNode *user, UNUSED_ARG(struct handle_info *old_handle)) if (user->handle_info->epithet) irc_swhois(chanserv, user, user->handle_info->epithet); + + /* process autojoin channels 5 seconds later as this sometimes + happens before autohide */ + timeq_add(now + 5, chanserv_autojoin_channel, user); } static void