echo-message should work for privmsg/notice to another user
Build the same message but send it to the local client first, so that the echo-message capability works. But don't do it when sending a message to yourself.
This commit is contained in:
parent
2d8d5b058b
commit
e2d5ffd5dd
3 changed files with 47 additions and 11 deletions
|
@ -78,6 +78,8 @@ extern void sendto_monitor(struct monitor *monptr, const char *, ...) AFP(2, 3);
|
||||||
|
|
||||||
extern void sendto_anywhere(struct Client *, struct Client *, const char *,
|
extern void sendto_anywhere(struct Client *, struct Client *, const char *,
|
||||||
const char *, ...) AFP(4, 5);
|
const char *, ...) AFP(4, 5);
|
||||||
|
extern void sendto_anywhere_echo(struct Client *, struct Client *, const char *,
|
||||||
|
const char *, ...) AFP(4, 5);
|
||||||
extern void sendto_local_clients_with_capability(int cap, const char *pattern, ...) AFP(2, 3);
|
extern void sendto_local_clients_with_capability(int cap, const char *pattern, ...) AFP(2, 3);
|
||||||
|
|
||||||
extern void sendto_realops_snomask(int, int, const char *, ...) AFP(3, 4);
|
extern void sendto_realops_snomask(int, int, const char *, ...) AFP(3, 4);
|
||||||
|
|
53
ircd/send.c
53
ircd/send.c
|
@ -30,6 +30,7 @@
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
#include "ircd.h"
|
#include "ircd.h"
|
||||||
#include "numeric.h"
|
#include "numeric.h"
|
||||||
|
#include "s_assert.h"
|
||||||
#include "s_serv.h"
|
#include "s_serv.h"
|
||||||
#include "s_conf.h"
|
#include "s_conf.h"
|
||||||
#include "s_newconf.h"
|
#include "s_newconf.h"
|
||||||
|
@ -1176,15 +1177,16 @@ sendto_monitor(struct monitor *monptr, const char *pattern, ...)
|
||||||
rb_linebuf_donebuf(&linebuf);
|
rb_linebuf_donebuf(&linebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* sendto_anywhere()
|
/* _sendto_anywhere()
|
||||||
*
|
*
|
||||||
* inputs - target, source, va_args
|
* inputs - real_target, target, source, va_args
|
||||||
* outputs -
|
* outputs -
|
||||||
* side effects - client is sent message with correct prefix.
|
* side effects - client is sent message/own message with correct prefix.
|
||||||
*/
|
*/
|
||||||
void
|
static void
|
||||||
sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
_sendto_anywhere(struct Client *dest_p, struct Client *target_p,
|
||||||
const char *command, const char *pattern, ...)
|
struct Client *source_p, const char *command,
|
||||||
|
const char *pattern, ...)
|
||||||
{
|
{
|
||||||
va_list args;
|
va_list args;
|
||||||
buf_head_t linebuf;
|
buf_head_t linebuf;
|
||||||
|
@ -1193,7 +1195,7 @@ sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
|
|
||||||
va_start(args, pattern);
|
va_start(args, pattern);
|
||||||
|
|
||||||
if(MyClient(target_p))
|
if(MyClient(dest_p))
|
||||||
{
|
{
|
||||||
if(IsServer(source_p))
|
if(IsServer(source_p))
|
||||||
rb_linebuf_putmsg(&linebuf, pattern, &args, ":%s %s %s ",
|
rb_linebuf_putmsg(&linebuf, pattern, &args, ":%s %s %s ",
|
||||||
|
@ -1206,7 +1208,7 @@ sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
build_msgbuf_from(&msgbuf, source_p, command);
|
build_msgbuf_from(&msgbuf, source_p, command);
|
||||||
msgbuf.target = target_p->name;
|
msgbuf.target = target_p->name;
|
||||||
|
|
||||||
linebuf_put_msgvbuf(&msgbuf, &linebuf, target_p->localClient->caps, pattern, &args);
|
linebuf_put_msgvbuf(&msgbuf, &linebuf, dest_p->localClient->caps, pattern, &args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1215,14 +1217,43 @@ sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
get_id(target_p, target_p));
|
get_id(target_p, target_p));
|
||||||
va_end(args);
|
va_end(args);
|
||||||
|
|
||||||
if(MyClient(target_p))
|
if(MyClient(dest_p))
|
||||||
_send_linebuf(target_p, &linebuf);
|
_send_linebuf(dest_p, &linebuf);
|
||||||
else
|
else
|
||||||
send_linebuf_remote(target_p, source_p, &linebuf);
|
send_linebuf_remote(dest_p, source_p, &linebuf);
|
||||||
|
|
||||||
rb_linebuf_donebuf(&linebuf);
|
rb_linebuf_donebuf(&linebuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* sendto_anywhere()
|
||||||
|
*
|
||||||
|
* inputs - target, source, va_args
|
||||||
|
* outputs -
|
||||||
|
* side effects - client is sent message with correct prefix.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sendto_anywhere(struct Client *target_p, struct Client *source_p,
|
||||||
|
const char *command, const char *pattern, ...)
|
||||||
|
{
|
||||||
|
_sendto_anywhere(target_p, target_p, source_p, command, pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sendto_anywhere_echo()
|
||||||
|
*
|
||||||
|
* inputs - target, source, va_args
|
||||||
|
* outputs -
|
||||||
|
* side effects - client is sent own message with correct prefix.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
sendto_anywhere_echo(struct Client *target_p, struct Client *source_p,
|
||||||
|
const char *command, const char *pattern, ...)
|
||||||
|
{
|
||||||
|
s_assert(MyClient(source_p));
|
||||||
|
s_assert(!IsServer(source_p));
|
||||||
|
|
||||||
|
_sendto_anywhere(source_p, target_p, source_p, command, pattern);
|
||||||
|
}
|
||||||
|
|
||||||
/* sendto_realops_snomask()
|
/* sendto_realops_snomask()
|
||||||
*
|
*
|
||||||
* inputs - snomask needed, level (opers/admin), va_args
|
* inputs - snomask needed, level (opers/admin), va_args
|
||||||
|
|
|
@ -776,6 +776,9 @@ msg_client(enum message_type msgtype,
|
||||||
if (do_floodcount &&
|
if (do_floodcount &&
|
||||||
flood_attack_client(msgtype, source_p, target_p))
|
flood_attack_client(msgtype, source_p, target_p))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (IsCapable(source_p, CLICAP_ECHO_MESSAGE) && target_p != source_p)
|
||||||
|
sendto_anywhere_echo(target_p, source_p, cmdname[msgtype], ":%s", text);
|
||||||
}
|
}
|
||||||
else if(source_p->from == target_p->from)
|
else if(source_p->from == target_p->from)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue