degesch: better message autosplit
This commit is contained in:
parent
53b46482f5
commit
2633eda69a
56
degesch.c
56
degesch.c
|
@ -2722,27 +2722,57 @@ send_message_to_target (struct app_context *ctx,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int one_message = 0;
|
// We don't always have the full info for message splitting
|
||||||
|
int space_in_one_message = 0;
|
||||||
if (ctx->irc_user_host)
|
if (ctx->irc_user_host)
|
||||||
// :<nick>!<user>@<host> PRIVMSG <target> :<message>
|
// :<nick>!<user>@<host> PRIVMSG <target> :<message>
|
||||||
one_message = 510 - 1 - (int) strlen (ctx->irc_user->nickname)
|
space_in_one_message = 510
|
||||||
|
- 1 - (int) strlen (ctx->irc_user->nickname)
|
||||||
- 1 - (int) strlen (ctx->irc_user_host)
|
- 1 - (int) strlen (ctx->irc_user_host)
|
||||||
- 1 - 7 - 1 - strlen (target) - 1 - 1;
|
- 1 - 7 - 1 - strlen (target) - 1 - 1;
|
||||||
|
|
||||||
// FIXME: UTF-8 sequences
|
// Attempt to split the message if it doesn't completely fit into
|
||||||
int left = strlen (message);
|
// a single IRC protocol message while trying not to break UTF-8.
|
||||||
while (left)
|
// Unicode can still end up being wrong, though.
|
||||||
|
// TODO: at least try to word-wrap if nothing else
|
||||||
|
for (int message_left = strlen (message); message_left; )
|
||||||
{
|
{
|
||||||
int part = MIN (one_message, left);
|
struct str m;
|
||||||
if (!one_message)
|
str_init (&m);
|
||||||
part = left;
|
|
||||||
|
|
||||||
irc_send (ctx, "PRIVMSG %s :%.*s", target, part, message);
|
int part_left = MIN (space_in_one_message, message_left);
|
||||||
|
if (!space_in_one_message)
|
||||||
|
part_left = message_left;
|
||||||
|
|
||||||
|
bool empty = true;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
const char *next = utf8_next (message, message_left);
|
||||||
|
hard_assert (next);
|
||||||
|
|
||||||
|
int char_len = message - next;
|
||||||
|
if (char_len > part_left)
|
||||||
|
break;
|
||||||
|
|
||||||
|
str_append_data (&m, message, char_len);
|
||||||
|
|
||||||
|
message += char_len;
|
||||||
|
message_left -= char_len;
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
if (empty)
|
||||||
|
{
|
||||||
|
// Well, that's just weird
|
||||||
|
buffer_send_error (ctx, buffer, "%s",
|
||||||
|
"Message splitting was unsuccessful as there was "
|
||||||
|
"too little room for UTF-8 characters");
|
||||||
|
message_left = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
irc_send (ctx, "PRIVMSG %s :%s", target, m.str);
|
||||||
buffer_send (ctx, buffer, BUFFER_LINE_PRIVMSG, 0,
|
buffer_send (ctx, buffer, BUFFER_LINE_PRIVMSG, 0,
|
||||||
ctx->irc_user->nickname, NULL, "%.*s", part, message);
|
ctx->irc_user->nickname, NULL, "%s", m.str);
|
||||||
|
str_free (&m);
|
||||||
left -= part;
|
|
||||||
message += part;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue