diff --git a/include/send.h b/include/send.h index 668eb8ca..f11c889c 100644 --- a/include/send.h +++ b/include/send.h @@ -65,6 +65,8 @@ extern void sendto_channel_local(int type, struct Channel *, const char *, ...) extern void sendto_channel_local_butone(struct Client *, int type, struct Channel *, const char *, ...) AFP(4, 5); extern void sendto_channel_local_with_capability(int type, int caps, int negcaps, struct Channel *, const char *, ...) AFP(5, 6); +extern void sendto_channel_local_with_capability_butone(struct Client *, int type, int caps, int negcaps, struct Channel *, + const char *, ...) AFP(6, 7); extern void sendto_common_channels_local(struct Client *, int cap, const char *, ...) AFP(3, 4); extern void sendto_common_channels_local_butone(struct Client *, int cap, const char *, ...) AFP(3, 4); diff --git a/src/s_user.c b/src/s_user.c index ccae53f4..e3c7a2f2 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -1451,8 +1451,13 @@ change_nick_user_host(struct Client *target_p, const char *nick, const char *use *mptr = '\0'; - sendto_channel_local_butone(target_p, ALL_MEMBERS, chptr, ":%s!%s@%s JOIN :%s", - nick, user, host, chptr->chname); + sendto_channel_local_with_capability_butone(target_p, ALL_MEMBERS, NOCAPS, CLICAP_EXTENDED_JOIN, chptr, + ":%s!%s@%s JOIN %s", nick, user, host, chptr->chname); + sendto_channel_local_with_capability_butone(target_p, ALL_MEMBERS, CLICAP_EXTENDED_JOIN, NOCAPS, chptr, + ":%s!%s@%s JOIN %s %s :%s", nick, user, host, chptr->chname, + EmptyString(target_p->user->suser) ? "*" : target_p->user->suser, + target_p->info); + if(*mode) sendto_channel_local_butone(target_p, ALL_MEMBERS, chptr, ":%s MODE %s +%s %s", diff --git a/src/send.c b/src/send.c index 17af7b47..cdb820ac 100644 --- a/src/send.c +++ b/src/send.c @@ -655,33 +655,32 @@ sendto_channel_local(int type, struct Channel *chptr, const char *pattern, ...) rb_linebuf_donebuf(&linebuf); } -/* sendto_channel_local_with_capability() +/* + * _sendto_channel_local_with_capability_butone() * - * inputs - flags to send to, caps, negate caps, channel to send to, va_args - * outputs - message to local channel members - * side effects - + * Shared implementation of sendto_channel_local_with_capability and sendto_channel_local_with_capability_butone */ -void -sendto_channel_local_with_capability(int type, int caps, int negcaps, struct Channel *chptr, const char *pattern, ...) +static void +_sendto_channel_local_with_capability_butone(struct Client *one, int type, int caps, int negcaps, struct Channel *chptr, + const char *pattern, va_list * args) { - va_list args; buf_head_t linebuf; struct membership *msptr; struct Client *target_p; rb_dlink_node *ptr; rb_dlink_node *next_ptr; - rb_linebuf_newbuf(&linebuf); + rb_linebuf_newbuf(&linebuf); + rb_linebuf_putmsg(&linebuf, pattern, args, NULL); - va_start(args, pattern); - rb_linebuf_putmsg(&linebuf, pattern, &args, NULL); - va_end(args); - RB_DLINK_FOREACH_SAFE(ptr, next_ptr, chptr->locmembers.head) { msptr = ptr->data; target_p = msptr->client_p; + if (target_p == one) + continue; + if(IsIOError(target_p) || !IsCapable(target_p, caps) || !NotCapable(target_p, negcaps)) @@ -696,6 +695,41 @@ sendto_channel_local_with_capability(int type, int caps, int negcaps, struct Cha rb_linebuf_donebuf(&linebuf); } +/* sendto_channel_local_with_capability() + * + * inputs - flags to send to, caps, negate caps, channel to send to, va_args + * outputs - message to local channel members + * side effects - + */ +void +sendto_channel_local_with_capability(int type, int caps, int negcaps, struct Channel *chptr, const char *pattern, ...) +{ + va_list args; + + va_start(args, pattern); + _sendto_channel_local_with_capability_butone(NULL, type, caps, negcaps, chptr, pattern, &args); + va_end(args); +} + + +/* sendto_channel_local_with_capability() + * + * inputs - flags to send to, caps, negate caps, channel to send to, va_args + * outputs - message to local channel members + * side effects - + */ +void +sendto_channel_local_with_capability_butone(struct Client *one, int type, int caps, int negcaps, struct Channel *chptr, + const char *pattern, ...) +{ + va_list args; + + va_start(args, pattern); + _sendto_channel_local_with_capability_butone(one, type, caps, negcaps, chptr, pattern, &args); + va_end(args); +} + + /* sendto_channel_local_butone() * * inputs - flags to send to, channel to send to, va_args