Code: Select all
bind MODE - "*+o*" mode:change
proc mode:change { nick uhost handle channel mode arg } {
if {$handle == "*"} then {
putquick "KICK #channel nick,nick2 :reason"
} else {
if {[matchattr $handle m|m $channel]} then {
putquick "KICK #channel nick,nick2 :reason"
}
}
yes it doesuser wrote:Doesn't putkick work like pushmode? (I never tried it on a network that supports several nicks per kick)KrzychuG wrote:Yeah, and then eggdrop will kick n1 in one line, n2 in second, n3 in third. Very optimized
Code: Select all
putserv "KICK $chan nick1,nick2,nick3,nick4........nickN :$reason"
Code: Select all
foreach user $kicklist {
putserv "KICK $chan $user: $reason"
}
Code: Select all
putserv "MODE $chan -oo+b-v+o+m nick1 nick2 *!*@host nick3 $nick4"
nopeawyeah wrote:You can even use something like:
That should also work.Code: Select all
putserv "KICK $chan nick1,nick2,nick3,nick4........nickN :$reason"
you are wrongawyeah wrote: If I am correct most ircd's allow 6 mode chanes simultaneously, however that can be changed, and servermodes allow 8-9 mode changes in a single line.
it queues as many nicks as you have specified in kick-method (or all, if you have set it to 0) before flushing the local queue:user wrote:Take a look at tcl_putkick in tclirc.c
Looks like it doesn't queue stuff to me (the thing they call a queue is just an internal buffer used for copping up the nick list into "kickable" pieces)
...but then again - I don't know C, so I might have missed something
Code: Select all
/* Check if we should send the kick command yet */
l = strlen(chan->name) + strlen(kicknick) + strlen(comment);
if (((kick_method != 0) && (k == kick_method)) || (l > 480)) {
dprintf(DP_SERVER, "KICK %s %s :%s\n", chan->name, kicknick, comment);
k = 0;
kicknick[0] = 0;
}
it turns out I was right here's the loop by nicks supplied in parv[2] of m_kick() from channel.c of irc2.11.0b21:demond wrote:my IRCnet channel lacks the resources for trying that, it has no users
but I'll take a look on their ircd's code and see if that's possible
Code: Select all
for (tmp2 = tmp; (user = strtoken(&p2, tmp2, ",")); tmp2 = NULL)
{
penalty++;
if (!(IsServer(cptr) && (who = find_uid(user, NULL))) &&
!(who = find_chasing(sptr, user, &chasing)))
continue; /* No such user left! */
if (IsMember(who, chptr))
{
/* Local clients. */
sendto_channel_butserv(chptr, sptr,
":%s KICK %s %s :%s", sptr->name,
name, who->name, comment);
/* nick buffer to kick out, build for 2.11 */
/* as we need space for ",nick", we should add
** 1 on the left side; instead we subtracted 1
** on the right side, before the loop. */
if (strlen(nbuf) + (HasUID(who) ? UIDLEN :
strlen(who->name)) >= clen)
{
sendto_match_servs_v(chptr, cptr,
SV_UID, ":%s KICK %s %s :%s",
sender, name, nbuf, comment);
nbuf[0] = '\0';
}
if (*nbuf)
{
strcat(nbuf, ",");
}
strcat(nbuf, HasUID(who) ? who->user->uid :
who->name);
/* nick buffer to kick out, build for 2.10 */
/* same thing with +/- 1 for comma as above */
if (strlen(obuf) + strlen(who->name) >= clen)
{
sendto_match_servs_notv(chptr, cptr,
SV_UID, ":%s KICK %s %s :%s",
sptr->name, name, obuf,
comment);
obuf[0] = '\0';
}
if (*obuf)
{
strcat(obuf, ",");
}
strcat(obuf, who->name);
/* kicking last one out may destroy chptr */
if (chptr->users == 1)
{
if (*nbuf)
{
sendto_match_servs_v(chptr,
cptr, SV_UID,
":%s KICK %s %s :%s",
sender, name,
nbuf, comment);
nbuf[0] = '\0';
}
if (*obuf)
{
sendto_match_servs_notv(chptr,
cptr, SV_UID,
":%s KICK %s %s :%s",
sptr->name, name,
obuf, comment);
obuf[0] = '\0';
}
}
remove_user_from_channel(who, chptr);
penalty += 2;
if (MyPerson(sptr) &&
/* penalties, obvious */
(penalty >= MAXPENALTY
/* Stop if user kicks himself out
** of channel --B. */
|| who == sptr))
{
break;
}
}
else
sendto_one(sptr,
replies[ERR_USERNOTINCHANNEL],
ME, BadTo(parv[0]), user, name);
} /* loop on parv[2] */