aboutsummaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2015-04-26 23:30:54 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2015-04-26 23:32:57 +0200
commit5ad6d7cfbc19fe99a494ea5b37432099005d441e (patch)
treed5b661e175122b4919390123989775ead16c7c60 /degesch.c
parent21b8e8e539d3bfd368a77da99331f581b257d347 (diff)
downloadxK-5ad6d7cfbc19fe99a494ea5b37432099005d441e.tar.gz
xK-5ad6d7cfbc19fe99a494ea5b37432099005d441e.tar.xz
xK-5ad6d7cfbc19fe99a494ea5b37432099005d441e.zip
degesch: implement /me
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/degesch.c b/degesch.c
index 2ad7f3d..0dee7ac 100644
--- a/degesch.c
+++ b/degesch.c
@@ -3079,13 +3079,16 @@ struct send_autosplit_args
const char *target; ///< User or channel
const char *message; ///< A message to be autosplit
send_autosplit_logger_fn logger; ///< Logger for all resulting lines
+ const char *prefix; ///< E.g. "\x01ACTION"
+ const char *suffix; ///< E.g. "\x01"
};
static void
send_autosplit_message (struct app_context *ctx, struct send_autosplit_args a)
{
struct buffer *buffer = str_map_find (&ctx->irc_buffer_map, a.target);
- int fixed_part = strlen (a.command) + 1 + strlen (a.target) + 1 + 1;
+ int fixed_part = strlen (a.command) + 1 + strlen (a.target) + 1 + 1
+ + strlen (a.prefix) + strlen (a.suffix);
struct str_vector lines;
str_vector_init (&lines);
@@ -3100,7 +3103,8 @@ send_autosplit_message (struct app_context *ctx, struct send_autosplit_args a)
for (size_t i = 0; i < lines.len; i++)
{
- irc_send (ctx, "%s %s :%s", a.command, a.target, lines.vector[i]);
+ irc_send (ctx, "%s %s :%s%s%s", a.command, a.target,
+ a.prefix, lines.vector[i], a.suffix);
a.logger (ctx, &a, buffer, lines.vector[i]);
}
end:
@@ -3108,6 +3112,25 @@ end:
}
static void
+log_outcoming_action (struct app_context *ctx,
+ struct send_autosplit_args *a, struct buffer *buffer, const char *line)
+{
+ (void) a;
+
+ if (buffer)
+ buffer_send (ctx, buffer, BUFFER_LINE_ACTION, 0,
+ .who = irc_to_utf8 (ctx, ctx->irc_user->nickname),
+ .text = irc_to_utf8 (ctx, line));
+
+ // This can only be sent from a user or channel buffer
+}
+
+#define SEND_AUTOSPLIT_ACTION(ctx, target, message) \
+ send_autosplit_message ((ctx), (struct send_autosplit_args) \
+ { "PRIVMSG", (target), (message), log_outcoming_action, \
+ "\x01" "ACTION ", "\x01" })
+
+static void
log_outcoming_privmsg (struct app_context *ctx,
struct send_autosplit_args *a, struct buffer *buffer, const char *line)
{
@@ -3123,7 +3146,7 @@ log_outcoming_privmsg (struct app_context *ctx,
#define SEND_AUTOSPLIT_PRIVMSG(ctx, target, message) \
send_autosplit_message ((ctx), (struct send_autosplit_args) \
- { "PRIVMSG", (target), (message), log_outcoming_privmsg })
+ { "PRIVMSG", (target), (message), log_outcoming_privmsg, "", "" })
static void
log_outcoming_notice (struct app_context *ctx,
@@ -3141,7 +3164,7 @@ log_outcoming_notice (struct app_context *ctx,
#define SEND_AUTOSPLIT_NOTICE(ctx, target, message) \
send_autosplit_message ((ctx), (struct send_autosplit_args) \
- { "NOTICE", (target), (message), log_outcoming_notice })
+ { "NOTICE", (target), (message), log_outcoming_notice, "", "" })
// --- User input handling -----------------------------------------------------
@@ -3350,7 +3373,16 @@ handle_command_me (struct app_context *ctx, char *arguments)
if (!server_command_check (ctx, "send messages"))
return true;
- // TODO
+ if (ctx->current_buffer->type == BUFFER_CHANNEL)
+ SEND_AUTOSPLIT_ACTION (ctx,
+ ctx->current_buffer->channel->name, arguments);
+ else if (ctx->current_buffer->type == BUFFER_PM)
+ SEND_AUTOSPLIT_ACTION (ctx,
+ ctx->current_buffer->user->nickname, arguments);
+ else
+ buffer_send_error (ctx, ctx->server_buffer,
+ "Can't do this from a server buffer (%s)",
+ "send CTCP actions");
return true;
}