From e5a81f6ab3b9fa74ba1ac55524826469ed16b25a Mon Sep 17 00:00:00 2001 From: Marius Halden Date: Mon, 21 Mar 2016 13:46:32 +0100 Subject: Add irc_send_tagged_msg* to send tagged messages Add support for tagged messages by adding the functions irc_send_tagged_msg*, the old irc_send_msg* functions are now wrappers for these functions without any tags. --- irc.h | 6 ++++++ irc_send.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/irc.h b/irc.h index 2e0cc3d5..49e17c98 100644 --- a/irc.h +++ b/irc.h @@ -339,6 +339,12 @@ void irc_send_who(irc_t *irc, GSList *l, const char *channel); void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix); void irc_send_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg); void irc_send_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *format, ...) G_GNUC_PRINTF(4, 5); + +void irc_send_tagged_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix, const char *tags); +void irc_send_tagged_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *tags); +void irc_send_tagged_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, ...) G_GNUC_PRINTF(5, 6); +void irc_send_tagged_msg_vf(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, va_list params); + void irc_send_nick(irc_user_t *iu, const char *new_nick); void irc_send_channel_user_mode_diff(irc_channel_t *ic, irc_user_t *iu, irc_channel_user_flags_t old_flags, irc_channel_user_flags_t new_flags); diff --git a/irc_send.c b/irc_send.c index adf8211e..9932bc27 100644 --- a/irc_send.c +++ b/irc_send.c @@ -365,6 +365,11 @@ void irc_send_who(irc_t *irc, GSList *l, const char *channel) } void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix) +{ + irc_send_tagged_msg(iu, type, dst, msg, prefix, NULL); +} + +void irc_send_tagged_msg(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *prefix, const char *tags) { char last = 0; const char *s = msg, *line = msg; @@ -385,14 +390,14 @@ void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char strcpy(raw_msg, "\001ACTION "); strncat(raw_msg, line + 4, s - line - 4); strcat(raw_msg, "\001"); - irc_send_msg_raw(iu, type, dst, raw_msg); + irc_send_tagged_msg_raw(iu, type, dst, raw_msg, tags); } else { *raw_msg = '\0'; if (prefix && *prefix) { strcpy(raw_msg, prefix); } strncat(raw_msg, line, s - line); - irc_send_msg_raw(iu, type, dst, raw_msg); + irc_send_tagged_msg_raw(iu, type, dst, raw_msg, tags); } line = s + 1; } @@ -402,21 +407,56 @@ void irc_send_msg(irc_user_t *iu, const char *type, const char *dst, const char void irc_send_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg) { - irc_write(iu->irc, ":%s!%s@%s %s %s :%s", - iu->nick, iu->user, iu->host, type, dst, msg && *msg ? msg : " "); + irc_send_tagged_msg_raw(iu, type, dst, msg, NULL); +} + +void irc_send_tagged_msg_raw(irc_user_t *iu, const char *type, const char *dst, const char *msg, const char *tags) +{ + if (!tags || !*tags) { + irc_write(iu->irc, ":%s!%s@%s %s %s :%s", + iu->nick, iu->user, iu->host, + type, dst, msg && *msg ? msg : " "); + } else { + irc_write(iu->irc, "@%s :%s!%s@%s %s %s :%s", + tags, iu->nick, iu->user, iu->host, + type, dst, msg && *msg ? msg : " "); + } } void irc_send_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *format, ...) { - char text[IRC_MAX_LINE]; va_list params; va_start(params, format); - g_vsnprintf(text, IRC_MAX_LINE, format, params); + irc_send_tagged_msg_vf(iu, type, dst, NULL, format, params); + va_end(params); + +} + +void irc_send_tagged_msg_f(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, ...) +{ + va_list params; + + va_start(params, format); + irc_send_tagged_msg_vf(iu, type, dst, tags, format, params); va_end(params); +} - irc_write(iu->irc, ":%s!%s@%s %s %s :%s", - iu->nick, iu->user, iu->host, type, dst, text); +void irc_send_tagged_msg_vf(irc_user_t *iu, const char *type, const char *dst, const char *tags, const char *format, va_list params) +{ + char text[IRC_MAX_LINE]; + + g_vsnprintf(text, IRC_MAX_LINE, format, params); + + if (!tags || !*tags) { + irc_write(iu->irc, ":%s!%s@%s %s %s :%s", + iu->nick, iu->user, iu->host, + type, dst, text); + } else { + irc_write(iu->irc, "@%s :%s!%s@%s %s %s :%s", + tags, iu->nick, iu->user, iu->host, + type, dst, text); + } } void irc_send_nick(irc_user_t *iu, const char *new) -- cgit v1.2.3