{ "CSMSG_PEEK_INFO", "$b%s$b Status:" },
{ "CSMSG_PEEK_TOPIC", "$bTopic: $b%s" },
{ "CSMSG_PEEK_MODES", "$bModes: $b%s" },
- { "CSMSG_PEEK_USERS", "$bTotal users: $b%d" },
+ { "CSMSG_PEEK_USERS", "$bTotal users: $b%d (%d ops, %d voices, %d regulars)" },
{ "CSMSG_PEEK_OPS", "$bOps:$b" },
{ "CSMSG_PEEK_NO_OPS", "$bOps: $bNone present" },
/* Make sure there are no high-ranking users still in the channel. */
for(user=channel->users; user; user=user->next)
- if(user->present && (user->access >= UL_PRESENT))
+ if(user->present && (user->access >= UL_PRESENT) && !HANDLE_FLAGGED(user->handle, BOT))
break;
if(user)
continue;
else if(!is_ircmask(argv[1]) && (*argv[1] == '*'))
{
struct handle_info *hi;
+ extern const char *titlehost_suffix;
char banmask[NICKLEN + USERLEN + HOSTLEN + 3];
const char *accountname = argv[1] + 1;
return 0;
}
- snprintf(banmask, sizeof(banmask), "*!*@%s.*", hi->handle);
+ snprintf(banmask, sizeof(banmask), "*!*@%s.*.%s", hi->handle, titlehost_suffix);
victims = alloca(sizeof(victims[0]) * channel->members.used);
if(bad_channel_ban(channel, user, banmask, &victimCount, victims))
ary[3] = "Suspended";
else if(HANDLE_FLAGGED(uData->handle, FROZEN))
ary[3] = "Vacation";
+ else if(HANDLE_FLAGGED(uData->handle, BOT))
+ ary[3] = "Bot";
else
ary[3] = "Normal";
}
char modes[MODELEN];
unsigned int n;
struct helpfile_table table;
+ int opcount = 0, voicecount = 0, srvcount = 0;
irc_make_chanmode(channel, modes);
reply("CSMSG_PEEK_INFO", channel->name);
reply("CSMSG_PEEK_TOPIC", channel->topic);
reply("CSMSG_PEEK_MODES", modes);
- reply("CSMSG_PEEK_USERS", channel->members.used);
table.length = 0;
table.width = 1;
for(n = 0; n < channel->members.used; n++)
{
mn = channel->members.list[n];
+ if(IsLocal(mn->user))
+ srvcount++;
+ else if(mn->modes & MODE_CHANOP)
+ opcount++;
+ else if(mn->modes & MODE_VOICE)
+ voicecount++;
+
if(!(mn->modes & MODE_CHANOP) || IsLocal(mn->user))
continue;
table.contents[table.length] = alloca(sizeof(**table.contents));
table.contents[table.length][0] = mn->user->nick;
table.length++;
}
+
+ reply("CSMSG_PEEK_USERS", channel->members.used, opcount, voicecount,
+ (channel->members.used - opcount - voicecount - srvcount));
+
if(table.length)
{
reply("CSMSG_PEEK_OPS");
else if(uData->access >= cData->lvlOpts[lvlGiveVoice])
modes |= MODE_VOICE;
}
- if(uData->access >= UL_PRESENT)
+ if(uData->access >= UL_PRESENT && !HANDLE_FLAGGED(uData->handle, BOT))
cData->visited = now;
if(cData->user_greeting)
greeting = cData->user_greeting;
continue;
}
- if(channel->access >= UL_PRESENT)
+ if(channel->access >= UL_PRESENT && !HANDLE_FLAGGED(channel->handle, BOT))
channel->channel->visited = now;
if(IsUserAutoOp(channel))
{
scan_user_presence(uData, mn->user);
uData->seen = now;
- if (uData->access >= UL_PRESENT)
+ if (uData->access >= UL_PRESENT && !HANDLE_FLAGGED(uData->handle, BOT))
cData->visited = now;
}
saxdb_start_record(ctx, KEY_USERS, 1);
for(; uData; uData = uData->next)
{
- if((uData->access >= UL_PRESENT) && uData->present)
+ if((uData->access >= UL_PRESENT) && uData->present && !HANDLE_FLAGGED(uData->handle, BOT))
high_present = 1;
saxdb_start_record(ctx, uData->handle->handle, 0);
saxdb_write_int(ctx, KEY_LEVEL, uData->access);