diff options
-rw-r--r-- | testing/nTox.c | 98 | ||||
-rw-r--r-- | toxcore/Messenger.c | 6 | ||||
-rw-r--r-- | toxcore/Messenger.h | 4 | ||||
-rw-r--r-- | toxcore/group_chats.c | 20 | ||||
-rw-r--r-- | toxcore/group_chats.h | 10 | ||||
-rw-r--r-- | toxcore/tox.c | 2 | ||||
-rw-r--r-- | toxcore/tox.h | 9 |
7 files changed, 123 insertions, 26 deletions
diff --git a/testing/nTox.c b/testing/nTox.c index e7216d33..24054f5e 100644 --- a/testing/nTox.c +++ b/testing/nTox.c | |||
@@ -92,9 +92,10 @@ char *help_friend2 = | |||
92 | /* 216 characters */ | 92 | /* 216 characters */ |
93 | char *help_group = | 93 | char *help_group = |
94 | "[i] Available group commands:\n+ " | 94 | "[i] Available group commands:\n+ " |
95 | "/g (to create a new group)|" | 95 | "/g (to create a group)|" |
96 | "/i friend no. group no. (to invite a friend to a group)|" | 96 | "/i friend no. group no. (to invite a friend to a group)|" |
97 | "/z group no. message (to send a message to a group)|" | 97 | "/z group no. message (to send a message to a group)|" |
98 | "/p group no. (to list a group's peers)|" | ||
98 | "/cg group no. (to talk to that group per default)"; | 99 | "/cg group no. (to talk to that group per default)"; |
99 | 100 | ||
100 | int x, y; | 101 | int x, y; |
@@ -346,8 +347,9 @@ static void print_formatted_message(Tox *m, char *message, int friendnum, uint8_ | |||
346 | new_lines(msg); | 347 | new_lines(msg); |
347 | } | 348 | } |
348 | 349 | ||
349 | /* forward declaration */ | 350 | /* forward declarations */ |
350 | static int save_data(Tox *m); | 351 | static int save_data(Tox *m); |
352 | void print_groupchatpeers(Tox *m, int groupnumber); | ||
351 | 353 | ||
352 | void line_eval(Tox *m, char *line) | 354 | void line_eval(Tox *m, char *line) |
353 | { | 355 | { |
@@ -561,6 +563,25 @@ void line_eval(Tox *m, char *line) | |||
561 | } else | 563 | } else |
562 | new_lines("[i] invalid command"); | 564 | new_lines("[i] invalid command"); |
563 | } | 565 | } |
566 | } else if (inpt_command == 'p') { //list peers | ||
567 | char *posi = NULL; | ||
568 | int group_number = strtoul(line + prompt_offset, &posi, 0); | ||
569 | |||
570 | if (posi != NULL) { | ||
571 | char msg[64]; | ||
572 | int peer_cnt = tox_group_number_peers(m, group_number); | ||
573 | |||
574 | if (peer_cnt < 0) { | ||
575 | new_lines("[g] Invalid group number."); | ||
576 | } else if (peer_cnt == 0) { | ||
577 | sprintf(msg, "[g] #%i: No peers in group.", group_number); | ||
578 | new_lines(msg); | ||
579 | } else { | ||
580 | sprintf(msg, "[g] #%i: Group has %i peers. Names:", group_number, peer_cnt); | ||
581 | new_lines(msg); | ||
582 | print_groupchatpeers(m, group_number); | ||
583 | } | ||
584 | } | ||
564 | } else { | 585 | } else { |
565 | new_lines("[i] invalid command"); | 586 | new_lines("[i] invalid command"); |
566 | } | 587 | } |
@@ -974,24 +995,60 @@ void print_invite(Tox *m, int friendnumber, uint8_t *group_public_key, void *use | |||
974 | tox_join_groupchat(m, friendnumber, group_public_key)); | 995 | tox_join_groupchat(m, friendnumber, group_public_key)); |
975 | new_lines(msg); | 996 | new_lines(msg); |
976 | } | 997 | } |
998 | |||
977 | void print_groupchatpeers(Tox *m, int groupnumber) | 999 | void print_groupchatpeers(Tox *m, int groupnumber) |
978 | { | 1000 | { |
979 | char msg[256]; | ||
980 | int num = tox_group_number_peers(m, groupnumber); | 1001 | int num = tox_group_number_peers(m, groupnumber); |
981 | if (num == -1) | 1002 | |
1003 | if (num < 0) | ||
982 | return; | 1004 | return; |
983 | 1005 | ||
1006 | if (!num) { | ||
1007 | new_lines("[g]+ no peers left in group."); | ||
1008 | return; | ||
1009 | } | ||
1010 | |||
984 | uint8_t names[num][TOX_MAX_NAME_LENGTH]; | 1011 | uint8_t names[num][TOX_MAX_NAME_LENGTH]; |
985 | tox_group_copy_names(m, groupnumber, names, num); | 1012 | tox_group_copy_names(m, groupnumber, names, num); |
986 | uint32_t i; | 1013 | int i; |
987 | for (i = 0; i < num; ++i) | 1014 | char numstr[16]; |
988 | new_lines(names[i]); | 1015 | char header[] = "[g]+ "; |
1016 | size_t header_len = strlen(header); | ||
1017 | char msg[STRING_LENGTH]; | ||
1018 | strcpy(msg, header); | ||
1019 | size_t len_total = header_len; | ||
1020 | |||
1021 | for (i = 0; i < num; ++i) { | ||
1022 | size_t len_name = strlen((char *)names[i]); | ||
1023 | size_t len_num = sprintf(numstr, "%i: ", i); | ||
1024 | |||
1025 | if (len_num + len_name + len_total + 3 >= STRING_LENGTH) { | ||
1026 | new_lines_mark(msg, 1); | ||
1027 | |||
1028 | strcpy(msg, header); | ||
1029 | len_total = header_len; | ||
1030 | } | ||
1031 | |||
1032 | strcpy(msg + len_total, numstr); | ||
1033 | len_total += len_num; | ||
1034 | strcpy(msg + len_total, (char *)names[i]); | ||
1035 | len_total += len_name; | ||
1036 | |||
1037 | if (i < num - 1) { | ||
1038 | strcpy(msg + len_total, "|"); | ||
1039 | len_total++; | ||
1040 | } | ||
1041 | } | ||
1042 | |||
1043 | new_lines_mark(msg, 1); | ||
989 | } | 1044 | } |
1045 | |||
990 | void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata) | 1046 | void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata) |
991 | { | 1047 | { |
992 | char msg[256 + length]; | 1048 | char msg[256 + length]; |
993 | uint8_t name[TOX_MAX_NAME_LENGTH]; | 1049 | uint8_t name[TOX_MAX_NAME_LENGTH]; |
994 | int len = tox_group_peername(m, groupnumber, peernumber, name); | 1050 | int len = tox_group_peername(m, groupnumber, peernumber, name); |
1051 | |||
995 | //print_groupchatpeers(m, groupnumber); | 1052 | //print_groupchatpeers(m, groupnumber); |
996 | if (len <= 0) | 1053 | if (len <= 0) |
997 | name[0] = 0; | 1054 | name[0] = 0; |
@@ -1003,12 +1060,31 @@ void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *messag | |||
1003 | 1060 | ||
1004 | new_lines(msg); | 1061 | new_lines(msg); |
1005 | } | 1062 | } |
1006 | void print_groupnamelistchange(Tox *m, int groupnumber, void *userdata) | 1063 | void print_groupnamelistchange(Tox *m, int groupnumber, int peernumber, uint8_t change, void *userdata) |
1007 | { | 1064 | { |
1008 | char msg[256]; | 1065 | char msg[256]; |
1009 | sprintf(msg, "[g] %u: Name list changed:", groupnumber); | 1066 | |
1010 | new_lines(msg); | 1067 | if (change == TOX_CHAT_CHANGE_PEER_ADD) { |
1011 | print_groupchatpeers(m, groupnumber); | 1068 | sprintf(msg, "[g] #%i: New peer %i.", groupnumber, peernumber); |
1069 | new_lines(msg); | ||
1070 | } else if (change == TOX_CHAT_CHANGE_PEER_DEL) { | ||
1071 | sprintf(msg, "[g] #%i: Peer %i left. Name list is now:", groupnumber, peernumber); | ||
1072 | new_lines(msg); | ||
1073 | print_groupchatpeers(m, groupnumber); | ||
1074 | } else if (change == TOX_CHAT_CHANGE_PEER_NAME) { | ||
1075 | uint8_t peername[TOX_MAX_NAME_LENGTH]; | ||
1076 | int len = tox_group_peername(m, groupnumber, peernumber, peername); | ||
1077 | |||
1078 | if (len <= 0) | ||
1079 | peername[0] = 0; | ||
1080 | |||
1081 | sprintf(msg, "[g] #%i: Peer %i's name changed: %s", groupnumber, peernumber, peername); | ||
1082 | new_lines(msg); | ||
1083 | } else { | ||
1084 | sprintf(msg, "[g] #%i: Name list changed (peer %i, change %i?):", groupnumber, peernumber, change); | ||
1085 | new_lines(msg); | ||
1086 | print_groupchatpeers(m, groupnumber); | ||
1087 | } | ||
1012 | } | 1088 | } |
1013 | void file_request_accept(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, | 1089 | void file_request_accept(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, |
1014 | uint16_t filename_length, void *userdata) | 1090 | uint16_t filename_length, void *userdata) |
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index cc52c069..1a7fc230 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -785,7 +785,7 @@ void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, | |||
785 | * It gets called every time the name list changes(new peer/name, deleted peer) | 785 | * It gets called every time the name list changes(new peer/name, deleted peer) |
786 | * Function(Tox *tox, int groupnumber, void *userdata) | 786 | * Function(Tox *tox, int groupnumber, void *userdata) |
787 | */ | 787 | */ |
788 | void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata) | 788 | void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t, void *), void *userdata) |
789 | { | 789 | { |
790 | m->group_namelistchange = function; | 790 | m->group_namelistchange = function; |
791 | m->group_namelistchange_userdata = userdata; | 791 | m->group_namelistchange_userdata = userdata; |
@@ -812,7 +812,7 @@ static void group_message_function(Group_Chat *chat, int peer_number, uint8_t *m | |||
812 | (*m->group_message)(m, i, peer_number, message, length, m->group_message_userdata); | 812 | (*m->group_message)(m, i, peer_number, message, length, m->group_message_userdata); |
813 | } | 813 | } |
814 | 814 | ||
815 | static void group_namelistchange_function(Group_Chat *chat, void *userdata) | 815 | static void group_namelistchange_function(Group_Chat *chat, int peer, uint8_t change, void *userdata) |
816 | { | 816 | { |
817 | Messenger *m = userdata; | 817 | Messenger *m = userdata; |
818 | int i = get_chat_num(m, chat); | 818 | int i = get_chat_num(m, chat); |
@@ -820,7 +820,7 @@ static void group_namelistchange_function(Group_Chat *chat, void *userdata) | |||
820 | return; | 820 | return; |
821 | 821 | ||
822 | if (m->group_namelistchange) | 822 | if (m->group_namelistchange) |
823 | (*m->group_namelistchange)(m, i, m->group_namelistchange_userdata); | 823 | (*m->group_namelistchange)(m, i, peer, change, m->group_namelistchange_userdata); |
824 | } | 824 | } |
825 | 825 | ||
826 | 826 | ||
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index bf8a0572..6fc23db4 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h | |||
@@ -198,7 +198,7 @@ typedef struct Messenger { | |||
198 | void *group_invite_userdata; | 198 | void *group_invite_userdata; |
199 | void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); | 199 | void (*group_message)(struct Messenger *m, int, int, uint8_t *, uint16_t, void *); |
200 | void *group_message_userdata; | 200 | void *group_message_userdata; |
201 | void (*group_namelistchange)(struct Messenger *m, int, void *); | 201 | void (*group_namelistchange)(struct Messenger *m, int, int, uint8_t, void *); |
202 | void *group_namelistchange_userdata; | 202 | void *group_namelistchange_userdata; |
203 | 203 | ||
204 | void (*file_sendrequest)(struct Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, void *); | 204 | void (*file_sendrequest)(struct Messenger *m, int, uint8_t, uint64_t, uint8_t *, uint16_t, void *); |
@@ -462,7 +462,7 @@ void m_callback_group_message(Messenger *m, void (*function)(Messenger *m, int, | |||
462 | * It gets called every time the name list changes(new peer/name, deleted peer) | 462 | * It gets called every time the name list changes(new peer/name, deleted peer) |
463 | * Function(Tox *tox, int groupnumber, void *userdata) | 463 | * Function(Tox *tox, int groupnumber, void *userdata) |
464 | */ | 464 | */ |
465 | void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata); | 465 | void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, int, uint8_t, void *), void *userdata); |
466 | 466 | ||
467 | /* Creates a new groupchat and puts it in the chats array. | 467 | /* Creates a new groupchat and puts it in the chats array. |
468 | * | 468 | * |
diff --git a/toxcore/group_chats.c b/toxcore/group_chats.c index b551a1fd..ec9229c4 100644 --- a/toxcore/group_chats.c +++ b/toxcore/group_chats.c | |||
@@ -219,7 +219,7 @@ static int addpeer(Group_Chat *chat, uint8_t *client_id) | |||
219 | ++chat->numpeers; | 219 | ++chat->numpeers; |
220 | 220 | ||
221 | if (chat->peer_namelistchange != NULL) | 221 | if (chat->peer_namelistchange != NULL) |
222 | (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); | 222 | (*chat->peer_namelistchange)(chat, chat->numpeers - 1, CHAT_CHANGE_PEER_ADD, chat->group_namelistchange_userdata); |
223 | 223 | ||
224 | return (chat->numpeers - 1); | 224 | return (chat->numpeers - 1); |
225 | } | 225 | } |
@@ -254,8 +254,12 @@ static int delpeer(Group_Chat *chat, int peernum) | |||
254 | 254 | ||
255 | chat->group = temp; | 255 | chat->group = temp; |
256 | 256 | ||
257 | if (chat->peer_namelistchange != NULL) | 257 | if (chat->peer_namelistchange != NULL) { |
258 | (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); | 258 | (*chat->peer_namelistchange)(chat, chat->numpeers, CHAT_CHANGE_PEER_DEL, chat->group_namelistchange_userdata); |
259 | |||
260 | if (chat->numpeers != (uint32_t)peernum) | ||
261 | (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_NAME, chat->group_namelistchange_userdata); | ||
262 | } | ||
259 | 263 | ||
260 | return 0; | 264 | return 0; |
261 | } | 265 | } |
@@ -286,12 +290,18 @@ static void setnick(Group_Chat *chat, int peernum, uint8_t *contents, uint16_t c | |||
286 | if (contents_len > MAX_NICK_BYTES || contents_len == 0) | 290 | if (contents_len > MAX_NICK_BYTES || contents_len == 0) |
287 | return; | 291 | return; |
288 | 292 | ||
293 | /* same name as already stored? */ | ||
294 | if ((chat->group[peernum].nick_len == contents_len) && | ||
295 | !memcmp(chat->group[peernum].nick, contents, contents_len)) | ||
296 | return; | ||
297 | |||
289 | memcpy(chat->group[peernum].nick, contents, contents_len); | 298 | memcpy(chat->group[peernum].nick, contents, contents_len); |
290 | /* Force null termination */ | 299 | /* Force null termination */ |
291 | chat->group[peernum].nick[contents_len - 1] = 0; | 300 | chat->group[peernum].nick[contents_len - 1] = 0; |
292 | chat->group[peernum].nick_len = contents_len; | 301 | chat->group[peernum].nick_len = contents_len; |
302 | |||
293 | if (chat->peer_namelistchange != NULL) | 303 | if (chat->peer_namelistchange != NULL) |
294 | (*chat->peer_namelistchange)(chat, chat->group_namelistchange_userdata); | 304 | (*chat->peer_namelistchange)(chat, peernum, CHAT_CHANGE_PEER_NAME, chat->group_namelistchange_userdata); |
295 | } | 305 | } |
296 | 306 | ||
297 | /* min time between pings sent to one peer in seconds */ | 307 | /* min time between pings sent to one peer in seconds */ |
@@ -626,7 +636,7 @@ void callback_groupmessage(Group_Chat *chat, void (*function)(Group_Chat *chat, | |||
626 | chat->group_message_userdata = userdata; | 636 | chat->group_message_userdata = userdata; |
627 | } | 637 | } |
628 | 638 | ||
629 | void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata) | 639 | void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, int peer, uint8_t change, void *), void *userdata) |
630 | { | 640 | { |
631 | chat->peer_namelistchange = function; | 641 | chat->peer_namelistchange = function; |
632 | chat->group_namelistchange_userdata = userdata; | 642 | chat->group_namelistchange_userdata = userdata; |
diff --git a/toxcore/group_chats.h b/toxcore/group_chats.h index 2235a6e3..65f573fb 100644 --- a/toxcore/group_chats.h +++ b/toxcore/group_chats.h | |||
@@ -65,7 +65,7 @@ typedef struct Group_Chat { | |||
65 | uint32_t message_number; | 65 | uint32_t message_number; |
66 | void (*group_message)(struct Group_Chat *m, int, uint8_t *, uint16_t, void *); | 66 | void (*group_message)(struct Group_Chat *m, int, uint8_t *, uint16_t, void *); |
67 | void *group_message_userdata; | 67 | void *group_message_userdata; |
68 | void (*peer_namelistchange)(struct Group_Chat *m, void *); | 68 | void (*peer_namelistchange)(struct Group_Chat *m, int peer, uint8_t change, void *); |
69 | void *group_namelistchange_userdata; | 69 | void *group_namelistchange_userdata; |
70 | 70 | ||
71 | uint64_t last_sent_ping; | 71 | uint64_t last_sent_ping; |
@@ -105,7 +105,13 @@ void callback_groupmessage(Group_Chat *chat, void (*function)(Group_Chat *chat, | |||
105 | * | 105 | * |
106 | * format of function is: function(Group_Chat *chat, userdata) | 106 | * format of function is: function(Group_Chat *chat, userdata) |
107 | */ | 107 | */ |
108 | void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata); | 108 | typedef enum { |
109 | CHAT_CHANGE_PEER_ADD, | ||
110 | CHAT_CHANGE_PEER_DEL, | ||
111 | CHAT_CHANGE_PEER_NAME, | ||
112 | } CHAT_CHANGE; | ||
113 | |||
114 | void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, int peer, uint8_t change, void *), void *userdata); | ||
109 | 115 | ||
110 | /* | 116 | /* |
111 | * Send a message to the group. | 117 | * Send a message to the group. |
diff --git a/toxcore/tox.c b/toxcore/tox.c index 4ba17e34..d5bc1c35 100644 --- a/toxcore/tox.c +++ b/toxcore/tox.c | |||
@@ -422,7 +422,7 @@ void tox_callback_group_message(Tox *tox, void (*function)(Messenger *tox, int, | |||
422 | * Function(Tox *tox, int groupnumber, void *userdata) | 422 | * Function(Tox *tox, int groupnumber, void *userdata) |
423 | */ | 423 | */ |
424 | 424 | ||
425 | void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata) | 425 | void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, int, uint8_t, void *), void *userdata) |
426 | { | 426 | { |
427 | Messenger *m = tox; | 427 | Messenger *m = tox; |
428 | m_callback_group_namelistchange(m, function, userdata); | 428 | m_callback_group_namelistchange(m, function, userdata); |
diff --git a/toxcore/tox.h b/toxcore/tox.h index fedc2c8a..08727d2a 100644 --- a/toxcore/tox.h +++ b/toxcore/tox.h | |||
@@ -366,10 +366,15 @@ void tox_callback_group_message(Tox *tox, void (*function)(Tox *tox, int, int, u | |||
366 | /* Set callback function for peer name list changes. | 366 | /* Set callback function for peer name list changes. |
367 | * | 367 | * |
368 | * It gets called every time the name list changes(new peer/name, deleted peer) | 368 | * It gets called every time the name list changes(new peer/name, deleted peer) |
369 | * Function(Tox *tox, int groupnumber, void *userdata) | 369 | * Function(Tox *tox, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata) |
370 | */ | 370 | */ |
371 | typedef enum { | ||
372 | TOX_CHAT_CHANGE_PEER_ADD, | ||
373 | TOX_CHAT_CHANGE_PEER_DEL, | ||
374 | TOX_CHAT_CHANGE_PEER_NAME, | ||
375 | } TOX_CHAT_CHANGE; | ||
371 | 376 | ||
372 | void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata); | 377 | void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, int, uint8_t, void *), void *userdata); |
373 | 378 | ||
374 | /* Creates a new groupchat and puts it in the chats array. | 379 | /* Creates a new groupchat and puts it in the chats array. |
375 | * | 380 | * |