ircd_ntoa_r(iphost, &cli_ip(cptr));
if (!IsAccount(cptr))
sr = NULL;
- else if (HasHiddenHost(cptr))
+ else if (HasHiddenHost(cptr) || HasSetHost(cptr))
sr = cli_user(cptr)->realhost;
else
{
/*
* Servers can always speak on channels.
*/
- if (IsServer(cptr))
+ if (IsServer(cptr) || IsXtraOp(cptr))
return 1;
member = find_channel_member(cptr, chptr);
*mbuf++ = 'n';
if (chptr->mode.mode & MODE_REGONLY)
*mbuf++ = 'r';
+ if (chptr->mode.mode & MODE_NOCOLOUR)
+ *mbuf++ = 'c';
+ if (chptr->mode.mode & MODE_NOCTCP)
+ *mbuf++ = 'C';
+ if (chptr->mode.mode & MODE_NONOTICE)
+ *mbuf++ = 'N';
if (chptr->mode.mode & MODE_NOQUITPARTS)
*mbuf++ = 'u';
if (chptr->mode.mode & MODE_DELJOINS)
MODE_INVITEONLY, 'i',
MODE_NOPRIVMSGS, 'n',
MODE_REGONLY, 'r',
-/* MODE_NOCOLOUR, 'c',
+ MODE_NOCOLOUR, 'c',
MODE_NOCTCP, 'C',
- MODE_NONOTICE, 'N',*/
+ MODE_NONOTICE, 'N',
MODE_DELJOINS, 'D',
MODE_NOQUITPARTS, 'u'
};
/* MODE_APASS, 'A', */
/* MODE_UPASS, 'U', */
MODE_NOQUITPARTS, 'u',
+ MODE_NOCOLOUR, 'c',
+ MODE_NOCTCP, 'C',
+ MODE_NONOTICE, 'N',
0x0, 0x0
};
int i;
assert(0 != (mode & (MODE_ADD | MODE_DEL)));
mode &= (MODE_ADD | MODE_DEL | MODE_PRIVATE | MODE_SECRET | MODE_MODERATED |
- MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
- MODE_DELJOINS | MODE_WASDELJOINS | MODE_NOQUITPARTS);
+ MODE_TOPICLIMIT | MODE_INVITEONLY | MODE_NOPRIVMSGS | MODE_REGONLY |
+ MODE_DELJOINS | MODE_WASDELJOINS | MODE_NOQUITPARTS | MODE_NOCOLOUR |
+ MODE_NOCTCP | MODE_NONOTICE);
if (!(mode & ~(MODE_ADD | MODE_DEL))) /* don't add empty modes... */
return;
MODE_REGONLY, 'r',
MODE_DELJOINS, 'D',
MODE_NOQUITPARTS, 'u',
+ MODE_NOCOLOUR, 'c',
+ MODE_NOCTCP, 'C',
+ MODE_NONOTICE, 'N',
0x0, 0x0
};
unsigned int add;
if ((state->cli_change[i].flag & (MODE_DEL | MODE_CHANOP)) ==
(MODE_DEL | MODE_CHANOP)) {
/* prevent +k users from being deopped */
- if (IsChannelService(state->cli_change[i].client)) {
+ /*
+ * ASUKA_X:
+ * Allow +X'ed users to mess with +k'ed.
+ * --Bigfoot
+ */
+ if ((IsChannelService(state->cli_change[i].client) && IsService(cli_user(state->cli_change[i].client)->server)) || (IsChannelService(state->cli_change[i].client) && !IsXtraOp(state->sptr))) {
if (state->flags & MODE_PARSE_FORCE) /* it was forced */
sendto_opmask_butone(0, SNO_HACK4, "Deop of +k user on %H by %s",
state->chptr,
(IsServer(state->sptr) ? cli_name(state->sptr) :
cli_name((cli_user(state->sptr))->server)));
- else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET) {
- send_reply(state->sptr, ERR_ISCHANSERVICE,
- cli_name(state->cli_change[i].client),
- state->chptr->chname);
+ else if (MyUser(state->sptr) && state->flags & MODE_PARSE_SET && (state->sptr != state->cli_change[i].client)) {
+ if(IsService(cli_user(state->cli_change[i].client)->server) && IsChannelService(state->cli_change[i].client)){
+ send_reply(state->sptr, ERR_ISREALSERVICE,
+ cli_name(state->cli_change[i].client),
+ state->chptr->chname);
+ }else{
+ send_reply(state->sptr, ERR_ISCHANSERVICE,
+ cli_name(state->cli_change[i].client),
+ state->chptr->chname);
+ }
+
continue;
}
}
MODE_REGONLY, 'r',
MODE_DELJOINS, 'D',
MODE_NOQUITPARTS, 'u',
+ MODE_NOCOLOUR, 'c',
+ MODE_NOCTCP, 'C',
+ MODE_NONOTICE, 'N',
MODE_ADD, '+',
MODE_DEL, '-',
0x0, 0x0