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)
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))
{
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)
{
&& !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;
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