summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--testing/nTox.c98
-rw-r--r--toxcore/Messenger.c6
-rw-r--r--toxcore/Messenger.h4
-rw-r--r--toxcore/group_chats.c20
-rw-r--r--toxcore/group_chats.h10
-rw-r--r--toxcore/tox.c2
-rw-r--r--toxcore/tox.h9
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 */
93char *help_group = 93char *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
100int x, y; 101int 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 */
350static int save_data(Tox *m); 351static int save_data(Tox *m);
352void print_groupchatpeers(Tox *m, int groupnumber);
351 353
352void line_eval(Tox *m, char *line) 354void 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
977void print_groupchatpeers(Tox *m, int groupnumber) 999void 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
990void print_groupmessage(Tox *m, int groupnumber, int peernumber, uint8_t *message, uint16_t length, void *userdata) 1046void 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}
1006void print_groupnamelistchange(Tox *m, int groupnumber, void *userdata) 1063void 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}
1013void file_request_accept(Tox *m, int friendnumber, uint8_t filenumber, uint64_t filesize, uint8_t *filename, 1089void 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 */
788void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata) 788void 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
815static void group_namelistchange_function(Group_Chat *chat, void *userdata) 815static 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 */
465void m_callback_group_namelistchange(Messenger *m, void (*function)(Messenger *m, int, void *), void *userdata); 465void 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
629void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata) 639void 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 */
108void callback_namelistchange(Group_Chat *chat, void (*function)(Group_Chat *chat, void *), void *userdata); 108typedef enum {
109 CHAT_CHANGE_PEER_ADD,
110 CHAT_CHANGE_PEER_DEL,
111 CHAT_CHANGE_PEER_NAME,
112} CHAT_CHANGE;
113
114void 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
425void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata) 425void 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 */
371typedef 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
372void tox_callback_group_namelistchange(Tox *tox, void (*function)(Tox *tox, int, void *), void *userdata); 377void 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 *