summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--degesch.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/degesch.c b/degesch.c
index abe8236..defdb29 100644
--- a/degesch.c
+++ b/degesch.c
@@ -918,6 +918,7 @@ struct buffer_line_args
char *object; ///< Object of action
char *text; ///< Text of message
char *reason; ///< Reason for PART, KICK, QUIT
+ char *prefixes; ///< Channel user prefixes
};
struct buffer_line
@@ -947,6 +948,7 @@ buffer_line_destroy (struct buffer_line *self)
free (self->args.object);
free (self->args.text);
free (self->args.reason);
+ free (self->args.prefixes);
free (self);
}
@@ -2385,9 +2387,11 @@ buffer_line_display (struct app_context *ctx,
{
case BUFFER_LINE_PRIVMSG:
if (line->flags & BUFFER_LINE_HIGHLIGHT)
- formatter_add (&f, "#a<#s>#r #m", ATTR_HIGHLIGHT, nick, a->text);
+ formatter_add (&f, "#a<#s#s>#r #m",
+ a->prefixes ? a->prefixes : "", ATTR_HIGHLIGHT, nick, a->text);
else
- formatter_add (&f, "<#c#s#r> #m", nick_color, nick, a->text);
+ formatter_add (&f, "<#s#c#s#r> #m",
+ a->prefixes ? a->prefixes : "", nick_color, nick, a->text);
break;
case BUFFER_LINE_ACTION:
if (line->flags & BUFFER_LINE_HIGHLIGHT)
@@ -4457,6 +4461,22 @@ irc_handle_privmsg_text (struct server *s,
const char *target = msg->params.vector[0];
struct buffer *buffer = irc_get_buffer_for_message (s, msg, target);
+ const char *prefixes = "";
+ if (irc_is_channel (s, target))
+ {
+ char *nickname = irc_cut_nickname (msg->prefix);
+
+ struct user *user;
+ struct channel *channel;
+ struct channel_user *channel_user;
+ if ((user = str_map_find (&s->irc_users, nickname))
+ && (channel = str_map_find (&s->irc_channels, target))
+ && (channel_user = irc_channel_get_user (channel, user)))
+ prefixes = channel_user->prefixes.str;
+
+ free (nickname);
+ }
+
if (buffer)
{
// TODO: some more obvious indication of highlights
@@ -4468,7 +4488,8 @@ irc_handle_privmsg_text (struct server *s,
: BUFFER_LINE_PRIVMSG;
buffer_send (s->ctx, buffer, type, flags,
.who = irc_to_utf8 (s->ctx, msg->prefix),
- .text = irc_to_utf8 (s->ctx, text->str));
+ .text = irc_to_utf8 (s->ctx, text->str),
+ .prefixes = xstrdup (prefixes));
}
}
@@ -5374,10 +5395,23 @@ static void
log_outcoming_privmsg (struct server *s,
struct send_autosplit_args *a, struct buffer *buffer, const char *line)
{
+ const char *prefixes = "";
+ if (irc_is_channel (s, a->target))
+ {
+ struct user *user;
+ struct channel *channel;
+ struct channel_user *channel_user;
+ if ((user = s->irc_user)
+ && (channel = str_map_find (&s->irc_channels, a->target))
+ && (channel_user = irc_channel_get_user (channel, user)))
+ prefixes = channel_user->prefixes.str;
+ }
+
if (buffer && soft_assert (s->irc_user))
buffer_send (s->ctx, buffer, BUFFER_LINE_PRIVMSG, 0,
.who = irc_to_utf8 (s->ctx, s->irc_user->nickname),
- .text = irc_to_utf8 (s->ctx, line));
+ .text = irc_to_utf8 (s->ctx, line),
+ .prefixes = xstrdup (prefixes));
else
// TODO: fix logging and encoding
buffer_send (s->ctx, s->buffer, BUFFER_LINE_STATUS, 0,