message split implemented
This commit is contained in:
parent
bdbbf1178d
commit
b97c2c46c9
@ -309,6 +309,7 @@ void
|
|||||||
twc_chat_send_message(struct t_twc_chat *chat, const char *message,
|
twc_chat_send_message(struct t_twc_chat *chat, const char *message,
|
||||||
enum TWC_MESSAGE_TYPE message_type)
|
enum TWC_MESSAGE_TYPE message_type)
|
||||||
{
|
{
|
||||||
|
int64_t rc = 0;
|
||||||
if (chat->friend_number >= 0)
|
if (chat->friend_number >= 0)
|
||||||
{
|
{
|
||||||
twc_message_queue_add_friend_message(chat->profile,
|
twc_message_queue_add_friend_message(chat->profile,
|
||||||
@ -323,11 +324,30 @@ twc_chat_send_message(struct t_twc_chat *chat, const char *message,
|
|||||||
else if (chat->group_number >= 0)
|
else if (chat->group_number >= 0)
|
||||||
{
|
{
|
||||||
if (message_type == TWC_MESSAGE_TYPE_MESSAGE)
|
if (message_type == TWC_MESSAGE_TYPE_MESSAGE)
|
||||||
tox_group_message_send(chat->profile->tox, chat->group_number,
|
{
|
||||||
(uint8_t *)message, strlen(message));
|
int len = strlen(message);
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
int fit_len = twc_fit_utf8(message, TWC_MAX_GROUP_MESSAGE_LENGTH);
|
||||||
|
rc = tox_group_message_send(chat->profile->tox, chat->group_number,
|
||||||
|
(uint8_t *)message, fit_len);
|
||||||
|
if (rc < 0)
|
||||||
|
break;
|
||||||
|
message += fit_len;
|
||||||
|
len -= fit_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
else if (message_type == TWC_MESSAGE_TYPE_ACTION)
|
else if (message_type == TWC_MESSAGE_TYPE_ACTION)
|
||||||
tox_group_action_send(chat->profile->tox, chat->group_number,
|
rc = tox_group_action_send(chat->profile->tox, chat->group_number,
|
||||||
(uint8_t *)message, strlen(message));
|
(uint8_t *)message, strlen(message));
|
||||||
|
if (rc < 0)
|
||||||
|
{
|
||||||
|
weechat_printf(chat->buffer,
|
||||||
|
"%s%sFailed to send message%s",
|
||||||
|
weechat_prefix("error"),
|
||||||
|
weechat_color("chat_highlight"),
|
||||||
|
weechat_color("reset"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,21 +58,30 @@ twc_message_queue_add_friend_message(struct t_twc_profile *profile,
|
|||||||
const char *message,
|
const char *message,
|
||||||
enum TWC_MESSAGE_TYPE message_type)
|
enum TWC_MESSAGE_TYPE message_type)
|
||||||
{
|
{
|
||||||
struct t_twc_queued_message *queued_message
|
int len = strlen(message);
|
||||||
= malloc(sizeof(struct t_twc_queued_message));
|
while (len > 0)
|
||||||
|
{
|
||||||
|
int fit_len = twc_fit_utf8(message, TWC_MAX_FRIEND_MESSAGE_LENGTH);
|
||||||
|
|
||||||
time_t rawtime = time(NULL);
|
struct t_twc_queued_message *queued_message
|
||||||
queued_message->time = malloc(sizeof(struct tm));
|
= malloc(sizeof(struct t_twc_queued_message));
|
||||||
memcpy(queued_message->time, gmtime(&rawtime), sizeof(struct tm));
|
|
||||||
|
|
||||||
queued_message->message = strdup(message);
|
time_t rawtime = time(NULL);
|
||||||
queued_message->message_type = message_type;
|
queued_message->time = malloc(sizeof(struct tm));
|
||||||
|
memcpy(queued_message->time, gmtime(&rawtime), sizeof(struct tm));
|
||||||
|
|
||||||
// create a queue if needed and add message
|
queued_message->message = strndup(message, fit_len);
|
||||||
struct t_twc_list *message_queue
|
queued_message->message_type = message_type;
|
||||||
= twc_message_queue_get_or_create(profile, friend_number);
|
|
||||||
twc_list_item_new_data_add(message_queue, queued_message);
|
|
||||||
|
|
||||||
|
message += fit_len;
|
||||||
|
len -= fit_len;
|
||||||
|
|
||||||
|
// create a queue if needed and add message
|
||||||
|
struct t_twc_list *message_queue
|
||||||
|
= twc_message_queue_get_or_create(profile, friend_number);
|
||||||
|
twc_list_item_new_data_add(message_queue, queued_message);
|
||||||
|
}
|
||||||
|
|
||||||
// flush if friend is online
|
// flush if friend is online
|
||||||
if (profile->tox
|
if (profile->tox
|
||||||
&& (tox_friend_get_connection_status(profile->tox, friend_number, NULL) != TOX_CONNECTION_NONE))
|
&& (tox_friend_get_connection_status(profile->tox, friend_number, NULL) != TOX_CONNECTION_NONE))
|
||||||
@ -88,6 +97,8 @@ twc_message_queue_flush_friend(struct t_twc_profile *profile,
|
|||||||
{
|
{
|
||||||
struct t_twc_list *message_queue
|
struct t_twc_list *message_queue
|
||||||
= twc_message_queue_get_or_create(profile, friend_number);
|
= twc_message_queue_get_or_create(profile, friend_number);
|
||||||
|
struct t_twc_chat *friend_chat
|
||||||
|
= twc_chat_search_friend(profile, friend_number, true);
|
||||||
|
|
||||||
size_t index;
|
size_t index;
|
||||||
struct t_twc_list_item *item;
|
struct t_twc_list_item *item;
|
||||||
@ -106,14 +117,47 @@ twc_message_queue_flush_friend(struct t_twc_profile *profile,
|
|||||||
strlen(queued_message->message),
|
strlen(queued_message->message),
|
||||||
&err);
|
&err);
|
||||||
|
|
||||||
if (err != TOX_ERR_FRIEND_SEND_MESSAGE_OK)
|
if (err == TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_CONNECTED)
|
||||||
{
|
{
|
||||||
// break if message send failed
|
// break if message send failed
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// message was sent, free it
|
char *err_str;
|
||||||
|
// check if error occured
|
||||||
|
switch (err)
|
||||||
|
{
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_TOO_LONG:
|
||||||
|
err_str = "message too long";
|
||||||
|
break;
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_NULL:
|
||||||
|
err_str = "NULL fields for tox_friend_send_message";
|
||||||
|
break;
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_FRIEND_NOT_FOUND:
|
||||||
|
err_str = "friend not found";
|
||||||
|
break;
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_SENDQ:
|
||||||
|
err_str = "queue allocation error";
|
||||||
|
break;
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_EMPTY:
|
||||||
|
err_str = "tried to send empty message";
|
||||||
|
break;
|
||||||
|
case TOX_ERR_FRIEND_SEND_MESSAGE_OK:
|
||||||
|
err_str = "no error";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
err_str = "unknown error";
|
||||||
|
}
|
||||||
|
if (err != TOX_ERR_FRIEND_SEND_MESSAGE_OK)
|
||||||
|
{
|
||||||
|
weechat_printf(friend_chat->buffer,
|
||||||
|
"%s%sFailed to send message: %s%s",
|
||||||
|
weechat_prefix("error"),
|
||||||
|
weechat_color("highlight"),
|
||||||
|
err_str,
|
||||||
|
weechat_color("reset"));
|
||||||
|
}
|
||||||
twc_message_queue_free_message(queued_message);
|
twc_message_queue_free_message(queued_message);
|
||||||
item->queued_message = NULL;
|
item->queued_message = NULL;
|
||||||
}
|
}
|
||||||
|
@ -198,3 +198,12 @@ twc_hash_tox_id(const uint8_t *tox_id)
|
|||||||
|
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fit correct unicode string into max chars. Return number of bytes
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
twc_fit_utf8(const char *str, int max)
|
||||||
|
{
|
||||||
|
return weechat_utf8_real_pos(str, weechat_utf8_strnlen(str, max));
|
||||||
|
}
|
||||||
|
@ -54,5 +54,8 @@ twc_uint32_reverse_bytes(uint32_t num);
|
|||||||
unsigned long long
|
unsigned long long
|
||||||
twc_hash_tox_id(const uint8_t *tox_id);
|
twc_hash_tox_id(const uint8_t *tox_id);
|
||||||
|
|
||||||
|
int
|
||||||
|
twc_fit_utf8(const char *str, int max);
|
||||||
|
|
||||||
#endif // TOX_WEECHAT_UTILS_H
|
#endif // TOX_WEECHAT_UTILS_H
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user