xC: clean up logging

Don't treat rendition as flags, separate the two.

Also treat join and part arrows as rendition.
This commit is contained in:
Přemysl Eric Janouch 2022-09-02 12:31:42 +02:00
parent 74470f1aa4
commit 36f8c7639f
Signed by: p
GPG Key ID: A0420B94F92B9493
1 changed files with 74 additions and 57 deletions

131
xC.c
View File

@ -1521,19 +1521,27 @@ formatter_free (struct formatter *self)
enum buffer_line_flags enum buffer_line_flags
{ {
BUFFER_LINE_STATUS = 1 << 0, ///< Status message BUFFER_LINE_SKIP_FILE = 1 << 0, ///< Don't log this to file
BUFFER_LINE_ERROR = 1 << 1, ///< Error message BUFFER_LINE_UNIMPORTANT = 1 << 1, ///< Joins, parts, similar spam
BUFFER_LINE_HIGHLIGHT = 1 << 2, ///< The user was highlighted by this BUFFER_LINE_HIGHLIGHT = 1 << 2, ///< The user was highlighted by this
BUFFER_LINE_SKIP_FILE = 1 << 3, ///< Don't log this to file };
BUFFER_LINE_INDENT = 1 << 4, ///< Just indent the line
BUFFER_LINE_UNIMPORTANT = 1 << 5 ///< Joins, parts, similar spam enum buffer_line_rendition
{
BUFFER_LINE_BARE, ///< Unadorned
BUFFER_LINE_INDENT, ///< Just indent the line
BUFFER_LINE_STATUS, ///< Status message
BUFFER_LINE_ERROR, ///< Error message
BUFFER_LINE_JOIN, ///< Join arrow
BUFFER_LINE_PART, ///< Part arrow
}; };
struct buffer_line struct buffer_line
{ {
LIST_HEADER (struct buffer_line) LIST_HEADER (struct buffer_line)
int flags; ///< Flags unsigned flags; ///< Functional flags
enum buffer_line_rendition r; ///< What the line should look like
time_t when; ///< Time of the event time_t when; ///< Time of the event
struct formatter_item items[]; ///< Line data struct formatter_item items[]; ///< Line data
}; };
@ -3966,10 +3974,15 @@ static void
buffer_line_flush (struct buffer_line *line, struct formatter *f, FILE *output, buffer_line_flush (struct buffer_line *line, struct formatter *f, FILE *output,
int flush_opts) int flush_opts)
{ {
int flags = line->flags; switch (line->r)
if (flags & BUFFER_LINE_INDENT) formatter_add (f, " "); {
if (flags & BUFFER_LINE_STATUS) formatter_add (f, " - "); case BUFFER_LINE_BARE: break;
if (flags & BUFFER_LINE_ERROR) formatter_add (f, "#a=!=#r ", ATTR_ERROR); case BUFFER_LINE_INDENT: formatter_add (f, " "); break;
case BUFFER_LINE_STATUS: formatter_add (f, " - "); break;
case BUFFER_LINE_ERROR: formatter_add (f, "#a=!=#r ", ATTR_ERROR); break;
case BUFFER_LINE_JOIN: formatter_add (f, "#a-->#r ", ATTR_JOIN); break;
case BUFFER_LINE_PART: formatter_add (f, "#a<--#r ", ATTR_PART); break;
}
for (struct formatter_item *iter = line->items; iter->type; iter++) for (struct formatter_item *iter = line->items; iter->type; iter++)
formatter_add_item (f, *iter); formatter_add_item (f, *iter);
@ -4057,14 +4070,15 @@ buffer_line_write_to_log (struct app_context *ctx,
} }
static void static void
log_formatter (struct app_context *ctx, log_formatter (struct app_context *ctx, struct buffer *buffer,
struct buffer *buffer, int flags, struct formatter *f) unsigned flags, enum buffer_line_rendition r, struct formatter *f)
{ {
if (!buffer) if (!buffer)
buffer = ctx->global_buffer; buffer = ctx->global_buffer;
struct buffer_line *line = buffer_line_new (f); struct buffer_line *line = buffer_line_new (f);
line->flags = flags; line->flags = flags;
line->r = r;
// TODO: allow providing custom time (IRCv3.2 server-time) // TODO: allow providing custom time (IRCv3.2 server-time)
line->when = time (NULL); line->when = time (NULL);
@ -4117,45 +4131,45 @@ log_formatter (struct app_context *ctx,
static void static void
log_full (struct app_context *ctx, struct server *s, struct buffer *buffer, log_full (struct app_context *ctx, struct server *s, struct buffer *buffer,
int flags, const char *format, ...) unsigned flags, enum buffer_line_rendition r, const char *format, ...)
{ {
va_list ap; va_list ap;
va_start (ap, format); va_start (ap, format);
struct formatter f = formatter_make (ctx, s); struct formatter f = formatter_make (ctx, s);
formatter_addv (&f, format, &ap); formatter_addv (&f, format, &ap);
log_formatter (ctx, buffer, flags, &f); log_formatter (ctx, buffer, flags, r, &f);
va_end (ap); va_end (ap);
} }
#define log_global(ctx, flags, ...) \ #define log_global(ctx, flags, r, ...) \
log_full ((ctx), NULL, (ctx)->global_buffer, flags, __VA_ARGS__) log_full ((ctx), NULL, (ctx)->global_buffer, (flags), (r), __VA_ARGS__)
#define log_server(s, buffer, flags, ...) \ #define log_server(s, buffer, flags, r, ...) \
log_full ((s)->ctx, s, (buffer), flags, __VA_ARGS__) log_full ((s)->ctx, (s), (buffer), (flags), (r), __VA_ARGS__)
#define log_global_status(ctx, ...) \ #define log_global_status(ctx, ...) \
log_global ((ctx), BUFFER_LINE_STATUS, __VA_ARGS__) log_global ((ctx), 0, BUFFER_LINE_STATUS, __VA_ARGS__)
#define log_global_error(ctx, ...) \ #define log_global_error(ctx, ...) \
log_global ((ctx), BUFFER_LINE_ERROR, __VA_ARGS__) log_global ((ctx), 0, BUFFER_LINE_ERROR, __VA_ARGS__)
#define log_global_indent(ctx, ...) \ #define log_global_indent(ctx, ...) \
log_global ((ctx), BUFFER_LINE_INDENT, __VA_ARGS__) log_global ((ctx), 0, BUFFER_LINE_INDENT, __VA_ARGS__)
#define log_server_status(s, buffer, ...) \ #define log_server_status(s, buffer, ...) \
log_server ((s), (buffer), BUFFER_LINE_STATUS, __VA_ARGS__) log_server ((s), (buffer), 0, BUFFER_LINE_STATUS, __VA_ARGS__)
#define log_server_error(s, buffer, ...) \ #define log_server_error(s, buffer, ...) \
log_server ((s), (buffer), BUFFER_LINE_ERROR, __VA_ARGS__) log_server ((s), (buffer), 0, BUFFER_LINE_ERROR, __VA_ARGS__)
#define log_global_debug(ctx, ...) \ #define log_global_debug(ctx, ...) \
BLOCK_START \ BLOCK_START \
if (g_debug_mode) \ if (g_debug_mode) \
log_global ((ctx), 0, "(*) " __VA_ARGS__); \ log_global ((ctx), 0, 0, "(*) " __VA_ARGS__); \
BLOCK_END BLOCK_END
#define log_server_debug(s, ...) \ #define log_server_debug(s, ...) \
BLOCK_START \ BLOCK_START \
if (g_debug_mode) \ if (g_debug_mode) \
log_server ((s), (s)->buffer, 0, "(*) " __VA_ARGS__); \ log_server ((s), (s)->buffer, 0, 0, "(*) " __VA_ARGS__); \
BLOCK_END BLOCK_END
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -4163,25 +4177,26 @@ log_full (struct app_context *ctx, struct server *s, struct buffer *buffer,
// Lines that are used in more than one place // Lines that are used in more than one place
#define log_nick_self(s, buffer, new_) \ #define log_nick_self(s, buffer, new_) \
log_server ((s), (buffer), BUFFER_LINE_STATUS | BUFFER_LINE_UNIMPORTANT, \ log_server ((s), (buffer), BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_STATUS, \
"You are now known as #n", (new_)) "You are now known as #n", (new_))
#define log_nick(s, buffer, old, new_) \ #define log_nick(s, buffer, old, new_) \
log_server ((s), (buffer), BUFFER_LINE_STATUS | BUFFER_LINE_UNIMPORTANT, \ log_server ((s), (buffer), BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_STATUS, \
"#n is now known as #n", (old), (new_)) "#n is now known as #n", (old), (new_))
#define log_chghost_self(s, buffer, new_) \ #define log_chghost_self(s, buffer, new_) \
log_server ((s), (buffer), BUFFER_LINE_STATUS | BUFFER_LINE_UNIMPORTANT, \ log_server ((s), (buffer), BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_STATUS, \
"You are now #N", (new_)) "You are now #N", (new_))
#define log_chghost(s, buffer, old, new_) \ #define log_chghost(s, buffer, old, new_) \
log_server ((s), (buffer), BUFFER_LINE_STATUS | BUFFER_LINE_UNIMPORTANT, \ log_server ((s), (buffer), BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_STATUS, \
"#N is now #N", (old), (new_)) "#N is now #N", (old), (new_))
#define log_outcoming_notice(s, buffer, who, text) \ #define log_outcoming_notice(s, buffer, who, text) \
log_server_status ((s), (buffer), "#s(#n): #m", "Notice", (who), (text)) log_server_status ((s), (buffer), "#s(#n): #m", "Notice", (who), (text))
#define log_outcoming_privmsg(s, buffer, prefixes, who, text) \ #define log_outcoming_privmsg(s, buffer, prefixes, who, text) \
log_server ((s), (buffer), 0, "<#s#n> #m", (prefixes), (who), (text)) log_server ((s), (buffer), 0, 0, "<#s#n> #m", (prefixes), (who), (text))
#define log_outcoming_action(s, buffer, who, text) \ #define log_outcoming_action(s, buffer, who, text) \
log_server ((s), (buffer), 0, " #a*#r #n #m", ATTR_ACTION, (who), (text)) log_server ((s), (buffer), 0, 0, " #a*#r #n #m", \
ATTR_ACTION, (who), (text))
#define log_outcoming_orphan_notice(s, target, text) \ #define log_outcoming_orphan_notice(s, target, text) \
log_server_status ((s), (s)->buffer, "Notice -> #n: #m", (target), (text)) log_server_status ((s), (s)->buffer, "Notice -> #n: #m", (target), (text))
@ -4450,7 +4465,7 @@ buffer_merge (struct app_context *ctx,
{ {
// XXX: anything better to do? This situation is arguably rare and I'm // XXX: anything better to do? This situation is arguably rare and I'm
// not entirely sure what action to take. // not entirely sure what action to take.
log_full (ctx, NULL, buffer, BUFFER_LINE_STATUS, log_full (ctx, NULL, buffer, 0, BUFFER_LINE_STATUS,
"Buffer #s was merged into this buffer", merged->name); "Buffer #s was merged into this buffer", merged->name);
// Find all lines from "merged" newer than the newest line in "buffer" // Find all lines from "merged" newer than the newest line in "buffer"
@ -4481,7 +4496,7 @@ buffer_merge (struct app_context *ctx,
buffer->lines_tail = tail; buffer->lines_tail = tail;
buffer->lines_count += n; buffer->lines_count += n;
log_full (ctx, NULL, buffer, BUFFER_LINE_STATUS | BUFFER_LINE_SKIP_FILE, log_full (ctx, NULL, buffer, BUFFER_LINE_SKIP_FILE, BUFFER_LINE_STATUS,
"End of merged content"); "End of merged content");
} }
@ -5148,7 +5163,7 @@ irc_disconnect (struct server *s)
struct str_map_iter iter = str_map_iter_make (&s->irc_buffer_map); struct str_map_iter iter = str_map_iter_make (&s->irc_buffer_map);
struct buffer *buffer; struct buffer *buffer;
while ((buffer = str_map_iter_next (&iter))) while ((buffer = str_map_iter_next (&iter)))
log_server (s, buffer, BUFFER_LINE_STATUS | BUFFER_LINE_UNIMPORTANT, log_server (s, buffer, BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_STATUS,
"Disconnected from server"); "Disconnected from server");
irc_cancel_timers (s); irc_cancel_timers (s);
@ -6977,8 +6992,8 @@ irc_handle_join (struct server *s, const struct irc_message *msg)
// Finally log the message // Finally log the message
if (buffer) if (buffer)
{ {
log_server (s, buffer, BUFFER_LINE_UNIMPORTANT, "#a-->#r #N #a#s#r #S", log_server (s, buffer, BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_JOIN,
ATTR_JOIN, msg->prefix, ATTR_JOIN, "has joined", channel_name); "#N #a#s#r #S", msg->prefix, ATTR_JOIN, "has joined", channel_name);
} }
} }
@ -7015,11 +7030,11 @@ irc_handle_kick (struct server *s, const struct irc_message *msg)
if (buffer) if (buffer)
{ {
struct formatter f = formatter_make (s->ctx, s); struct formatter f = formatter_make (s->ctx, s);
formatter_add (&f, "#a<--#r #N #a#s#r #n", formatter_add (&f, "#N #a#s#r #n",
ATTR_PART, msg->prefix, ATTR_PART, "has kicked", target); msg->prefix, ATTR_PART, "has kicked", target);
if (message) if (message)
formatter_add (&f, " (#m)", message); formatter_add (&f, " (#m)", message);
log_formatter (s->ctx, buffer, 0, &f); log_formatter (s->ctx, buffer, 0, BUFFER_LINE_PART, &f);
} }
} }
@ -7066,7 +7081,7 @@ irc_handle_mode (struct server *s, const struct irc_message *msg)
if (buffer) if (buffer)
{ {
log_server (s, buffer, BUFFER_LINE_STATUS | flags, log_server (s, buffer, flags, BUFFER_LINE_STATUS,
"Mode #S [#S] by #n", context, modes, msg->prefix); "Mode #S [#S] by #n", context, modes, msg->prefix);
} }
} }
@ -7222,7 +7237,7 @@ irc_handle_notice_text (struct server *s,
char *nick = irc_cut_nickname (msg->prefix); char *nick = irc_cut_nickname (msg->prefix);
// IRCv3.2 echo-message could otherwise cause us to highlight ourselves // IRCv3.2 echo-message could otherwise cause us to highlight ourselves
if (!irc_is_this_us (s, msg->prefix) && irc_is_highlight (s, text->str)) if (!irc_is_this_us (s, msg->prefix) && irc_is_highlight (s, text->str))
log_server (s, buffer, BUFFER_LINE_STATUS | BUFFER_LINE_HIGHLIGHT, log_server (s, buffer, BUFFER_LINE_HIGHLIGHT, BUFFER_LINE_STATUS,
"#a#s(#S)#r: #m", ATTR_HIGHLIGHT, "Notice", nick, text->str); "#a#s(#S)#r: #m", ATTR_HIGHLIGHT, "Notice", nick, text->str);
else else
log_outcoming_notice (s, buffer, msg->prefix, text->str); log_outcoming_notice (s, buffer, msg->prefix, text->str);
@ -7279,11 +7294,12 @@ irc_handle_part (struct server *s, const struct irc_message *msg)
if (buffer) if (buffer)
{ {
struct formatter f = formatter_make (s->ctx, s); struct formatter f = formatter_make (s->ctx, s);
formatter_add (&f, "#a<--#r #N #a#s#r #S", formatter_add (&f, "#N #a#s#r #S",
ATTR_PART, msg->prefix, ATTR_PART, "has left", channel_name); msg->prefix, ATTR_PART, "has left", channel_name);
if (message) if (message)
formatter_add (&f, " (#m)", message); formatter_add (&f, " (#m)", message);
log_formatter (s->ctx, buffer, BUFFER_LINE_UNIMPORTANT, &f); log_formatter (s->ctx, buffer,
BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_PART, &f);
} }
} }
@ -7345,7 +7361,7 @@ irc_handle_ctcp_request (struct server *s,
if (irc_is_channel (s, irc_skip_statusmsg (s, target))) if (irc_is_channel (s, irc_skip_statusmsg (s, target)))
formatter_add (&f, " (to #S)", target); formatter_add (&f, " (to #S)", target);
formatter_add (&f, ": #S", chunk->tag.str); formatter_add (&f, ": #S", chunk->tag.str);
log_formatter (s->ctx, s->buffer, BUFFER_LINE_STATUS, &f); log_formatter (s->ctx, s->buffer, 0, BUFFER_LINE_STATUS, &f);
char *nickname = irc_cut_nickname (msg->prefix); char *nickname = irc_cut_nickname (msg->prefix);
@ -7413,10 +7429,10 @@ irc_handle_privmsg_text (struct server *s,
log_outcoming_privmsg (s, buffer, prefixes, nickname, text->str); log_outcoming_privmsg (s, buffer, prefixes, nickname, text->str);
} }
else if (is_action) else if (is_action)
log_server (s, buffer, BUFFER_LINE_HIGHLIGHT, log_server (s, buffer, BUFFER_LINE_HIGHLIGHT, 0,
" #a*#r #n #m", ATTR_HIGHLIGHT, msg->prefix, text->str); " #a*#r #n #m", ATTR_HIGHLIGHT, msg->prefix, text->str);
else else
log_server (s, buffer, BUFFER_LINE_HIGHLIGHT, log_server (s, buffer, BUFFER_LINE_HIGHLIGHT, 0,
"#a<#S#S>#r #m", ATTR_HIGHLIGHT, prefixes, nickname, text->str); "#a<#S#S>#r #m", ATTR_HIGHLIGHT, prefixes, nickname, text->str);
free (nickname); free (nickname);
@ -7446,11 +7462,11 @@ log_quit (struct server *s,
struct buffer *buffer, const char *prefix, const char *reason) struct buffer *buffer, const char *prefix, const char *reason)
{ {
struct formatter f = formatter_make (s->ctx, s); struct formatter f = formatter_make (s->ctx, s);
formatter_add (&f, "#a<--#r #N #a#s#r", formatter_add (&f, "#N #a#s#r", prefix, ATTR_PART, "has quit");
ATTR_PART, prefix, ATTR_PART, "has quit");
if (reason) if (reason)
formatter_add (&f, " (#m)", reason); formatter_add (&f, " (#m)", reason);
log_formatter (s->ctx, buffer, BUFFER_LINE_UNIMPORTANT, &f); log_formatter (s->ctx, buffer,
BUFFER_LINE_UNIMPORTANT, BUFFER_LINE_PART, &f);
} }
static void static void
@ -7526,7 +7542,7 @@ irc_handle_topic (struct server *s, const struct irc_message *msg)
if (buffer) if (buffer)
{ {
log_server (s, buffer, BUFFER_LINE_STATUS, "#n #s \"#m\"", log_server (s, buffer, 0, BUFFER_LINE_STATUS, "#n #s \"#m\"",
msg->prefix, "has changed the topic to", topic); msg->prefix, "has changed the topic to", topic);
} }
} }
@ -7538,7 +7554,7 @@ irc_handle_wallops (struct server *s, const struct irc_message *msg)
return; return;
const char *message = msg->params.vector[0]; const char *message = msg->params.vector[0];
log_server (s, s->buffer, 0, "<#n> #m", msg->prefix, message); log_server (s, s->buffer, 0, 0, "<#n> #m", msg->prefix, message);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -8224,7 +8240,7 @@ irc_process_numeric (struct server *s,
strv_append_vector (&copy, msg->params.vector + !!msg->params.len); strv_append_vector (&copy, msg->params.vector + !!msg->params.len);
struct buffer *buffer = s->buffer; struct buffer *buffer = s->buffer;
int flags = BUFFER_LINE_STATUS; int flags = 0;
switch (numeric) switch (numeric)
{ {
case IRC_RPL_WELCOME: case IRC_RPL_WELCOME:
@ -8310,7 +8326,8 @@ irc_process_numeric (struct server *s,
if (buffer) if (buffer)
{ {
// Join the parameter vector back and send it to the server buffer // Join the parameter vector back and send it to the server buffer
log_server (s, buffer, flags, "#&m", strv_join (&copy, " ")); log_server (s, buffer, flags, BUFFER_LINE_STATUS,
"#&m", strv_join (&copy, " "));
} }
strv_free (&copy); strv_free (&copy);
@ -9220,7 +9237,7 @@ lua_buffer_log (lua_State *L)
struct buffer *buffer = wrapper->object; struct buffer *buffer = wrapper->object;
const char *message = lua_plugin_check_utf8 (L, 2); const char *message = lua_plugin_check_utf8 (L, 2);
log_full (wrapper->plugin->ctx, buffer->server, buffer, log_full (wrapper->plugin->ctx, buffer->server, buffer,
BUFFER_LINE_STATUS, "#s", message); 0, BUFFER_LINE_STATUS, "#s", message);
return 0; return 0;
} }
@ -12627,7 +12644,7 @@ send_message_to_buffer (struct app_context *ctx, struct buffer *buffer,
buffer->user->nickname, message, buffer); buffer->user->nickname, message, buffer);
break; break;
default: default:
log_full (ctx, NULL, buffer, BUFFER_LINE_ERROR, log_full (ctx, NULL, buffer, 0, BUFFER_LINE_ERROR,
"This buffer is not a channel"); "This buffer is not a channel");
} }
} }
@ -14491,7 +14508,7 @@ on_flush_timer (struct app_context *ctx)
// Might be a transient error such as running out of disk space, // Might be a transient error such as running out of disk space,
// keep notifying of the problem until it disappears // keep notifying of the problem until it disappears
clearerr (buffer->log_file); clearerr (buffer->log_file);
log_global (ctx, BUFFER_LINE_ERROR | BUFFER_LINE_SKIP_FILE, log_global (ctx, BUFFER_LINE_SKIP_FILE, BUFFER_LINE_ERROR,
"Log write failure detected for #s", buffer->name); "Log write failure detected for #s", buffer->name);
} }