diff options
Diffstat (limited to 'toxcore/group_chats.c')
-rw-r--r-- | toxcore/group_chats.c | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index 0903ecb8..5376713c 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c | |||
@@ -53,12 +53,6 @@ typedef struct { | |||
53 | 53 | ||
54 | } sendnodes_data; | 54 | } sendnodes_data; |
55 | 55 | ||
56 | typedef struct { | ||
57 | uint8_t client_id[crypto_box_PUBLICKEYBYTES]; | ||
58 | uint8_t nickname[MAX_NICK_BYTES]; | ||
59 | } peernick_data; | ||
60 | |||
61 | |||
62 | /* | 56 | /* |
63 | * check if peer with client_id is in peer array. | 57 | * check if peer with client_id is in peer array. |
64 | * | 58 | * |
@@ -246,6 +240,7 @@ static int delpeer(Group_Chat *chat, uint8_t *client_id) | |||
246 | chat->group = NULL; | 240 | chat->group = NULL; |
247 | return 0; | 241 | return 0; |
248 | } | 242 | } |
243 | |||
249 | if (chat->numpeers != i) | 244 | if (chat->numpeers != i) |
250 | memcpy(&chat->group[i], &chat->group[chat->numpeers], sizeof(Group_Peer)); | 245 | memcpy(&chat->group[i], &chat->group[chat->numpeers], sizeof(Group_Peer)); |
251 | 246 | ||
@@ -283,24 +278,15 @@ int group_peername(Group_Chat *chat, int peernum, uint8_t *name) | |||
283 | return chat->group[peernum].nick_len; | 278 | return chat->group[peernum].nick_len; |
284 | } | 279 | } |
285 | 280 | ||
286 | static void setnick(Group_Chat *chat, uint8_t *contents, uint16_t contents_len) | 281 | static void setnick(Group_Chat *chat, int peernum, uint8_t *contents, uint16_t contents_len) |
287 | { | 282 | { |
288 | if (contents_len > CLIENT_ID_SIZE + MAX_NICK_BYTES) | 283 | if (contents_len > MAX_NICK_BYTES || contents_len == 0) |
289 | return; | 284 | return; |
290 | 285 | ||
291 | peernick_data *data = (peernick_data *)contents; | 286 | memcpy(chat->group[peernum].nick, contents, contents_len); |
292 | 287 | /* Force null termination */ | |
293 | size_t i; | 288 | chat->group[peernum].nick[contents_len - 1] = 0; |
294 | 289 | chat->group[peernum].nick_len = contents_len; | |
295 | for (i = 0; i < chat->numpeers; i++) | ||
296 | if (id_equal(chat->group[i].client_id, data->client_id)) { | ||
297 | uint16_t nick_len = contents_len - CLIENT_ID_SIZE; | ||
298 | |||
299 | memcpy(chat->group[i].nick, data->nickname, nick_len); | ||
300 | chat->group[i].nick_len = nick_len; | ||
301 | |||
302 | return; | ||
303 | } | ||
304 | } | 290 | } |
305 | 291 | ||
306 | /* min time between pings sent to one peer in seconds */ | 292 | /* min time between pings sent to one peer in seconds */ |
@@ -462,10 +448,10 @@ static int handle_data(Group_Chat *chat, uint8_t *data, uint32_t len) | |||
462 | break; | 448 | break; |
463 | 449 | ||
464 | case GROUP_CHAT_PEER_NICK: | 450 | case GROUP_CHAT_PEER_NICK: |
465 | if (contents_len < crypto_box_PUBLICKEYBYTES) | 451 | if (contents_len > MAX_NICK_BYTES || contents_len == 0) |
466 | return 1; | 452 | return 1; |
467 | 453 | ||
468 | setnick(chat, contents, contents_len); | 454 | setnick(chat, peernum, contents, contents_len); |
469 | break; | 455 | break; |
470 | 456 | ||
471 | case GROUP_CHAT_CHAT_MESSAGE: /* If message is chat message */ | 457 | case GROUP_CHAT_CHAT_MESSAGE: /* If message is chat message */ |
@@ -560,16 +546,28 @@ uint32_t group_sendmessage(Group_Chat *chat, uint8_t *message, uint32_t length) | |||
560 | return send_data(chat, message, length, GROUP_CHAT_CHAT_MESSAGE); //TODO: better return values? | 546 | return send_data(chat, message, length, GROUP_CHAT_CHAT_MESSAGE); //TODO: better return values? |
561 | } | 547 | } |
562 | 548 | ||
563 | uint32_t group_send_nick(Group_Chat *chat, uint8_t *client_id, uint8_t *nick, uint16_t nick_len) | 549 | /* |
550 | * Send id/nick combo to the group. | ||
551 | * | ||
552 | * returns the number of peers it has sent it to. | ||
553 | */ | ||
554 | static uint32_t group_send_nick(Group_Chat *chat, uint8_t *nick, uint16_t nick_len) | ||
564 | { | 555 | { |
565 | peernick_data peernick; | 556 | if (nick_len > MAX_NICK_BYTES) |
566 | id_copy(peernick.client_id, client_id); | 557 | return 0; |
567 | memcpy(peernick.nickname, nick, nick_len); | 558 | |
559 | return send_data(chat, nick, nick_len, GROUP_CHAT_PEER_NICK); | ||
560 | } | ||
568 | 561 | ||
569 | /* also set for self */ | 562 | int set_nick(Group_Chat *chat, uint8_t *nick, uint16_t nick_len) |
570 | setnick(chat, (uint8_t *)&peernick, sizeof(peernick.client_id) + nick_len); | 563 | { |
564 | if (nick_len > MAX_NICK_BYTES || nick_len == 0) | ||
565 | return -1; | ||
571 | 566 | ||
572 | return send_data(chat, (uint8_t *)&peernick, sizeof(peernick.client_id) + nick_len, GROUP_CHAT_PEER_NICK); | 567 | memcpy(chat->nick, nick, nick_len); |
568 | chat->nick_len = nick_len; | ||
569 | group_send_nick(chat, chat->nick, chat->nick_len); | ||
570 | return 0; | ||
573 | } | 571 | } |
574 | 572 | ||
575 | uint32_t group_newpeer(Group_Chat *chat, uint8_t *client_id) | 573 | uint32_t group_newpeer(Group_Chat *chat, uint8_t *client_id) |
@@ -639,6 +637,22 @@ static void del_dead_peers(Group_Chat *chat) | |||
639 | } | 637 | } |
640 | } | 638 | } |
641 | 639 | ||
640 | #define NICK_SEND_INTERVAL 180 | ||
641 | |||
642 | static void send_names(Group_Chat *chat) | ||
643 | { | ||
644 | /* send own nick from time to time, to let newly added peers be informed | ||
645 | * first time only: use a shorter timeframe, because we might not be in our own | ||
646 | * peer list yet */ | ||
647 | if (is_timeout(chat->last_sent_nick, 180)) | ||
648 | if (group_send_nick(chat, chat->nick, chat->nick_len) > 0) { | ||
649 | if (!chat->last_sent_nick) | ||
650 | chat->last_sent_nick = (unix_time() - NICK_SEND_INTERVAL) + 30; | ||
651 | else | ||
652 | chat->last_sent_nick = unix_time(); | ||
653 | } | ||
654 | } | ||
655 | |||
642 | void do_groupchat(Group_Chat *chat) | 656 | void do_groupchat(Group_Chat *chat) |
643 | { | 657 | { |
644 | unix_time_update(); | 658 | unix_time_update(); |
@@ -646,6 +660,7 @@ void do_groupchat(Group_Chat *chat) | |||
646 | ping_group(chat); | 660 | ping_group(chat); |
647 | /* TODO: Maybe run this less? */ | 661 | /* TODO: Maybe run this less? */ |
648 | del_dead_peers(chat); | 662 | del_dead_peers(chat); |
663 | send_names(chat); | ||
649 | } | 664 | } |
650 | 665 | ||
651 | void kill_groupchat(Group_Chat *chat) | 666 | void kill_groupchat(Group_Chat *chat) |