mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Kill group connection to friend once we are connected to group.
This commit is contained in:
parent
6687a05650
commit
b969f1b2d8
|
@ -571,6 +571,7 @@ static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnu
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g->close[i].number == (uint32_t)friendcon_id) {
|
if (g->close[i].number == (uint32_t)friendcon_id) {
|
||||||
|
g->close[i].closest = closest;
|
||||||
return i; /* Already in list. */
|
return i; /* Already in list. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -604,6 +605,7 @@ int add_groupchat(Group_Chats *g_c)
|
||||||
Group_c *g = &g_c->chats[groupnumber];
|
Group_c *g = &g_c->chats[groupnumber];
|
||||||
|
|
||||||
g->status = GROUPCHAT_STATUS_CONNECTED;
|
g->status = GROUPCHAT_STATUS_CONNECTED;
|
||||||
|
g->number_joined = -1;
|
||||||
new_symmetric_key(g->identifier);
|
new_symmetric_key(g->identifier);
|
||||||
g->peer_number = 0; /* Founder is peer 0. */
|
g->peer_number = 0; /* Founder is peer 0. */
|
||||||
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
|
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
|
||||||
|
@ -762,6 +764,7 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, const uint8_t *data,
|
||||||
|
|
||||||
uint16_t group_num = htons(groupnumber);
|
uint16_t group_num = htons(groupnumber);
|
||||||
g->status = GROUPCHAT_STATUS_VALID;
|
g->status = GROUPCHAT_STATUS_VALID;
|
||||||
|
g->number_joined = -1;
|
||||||
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
|
memcpy(g->real_pk, g_c->m->net_crypto->self_public_key, crypto_box_PUBLICKEYBYTES);
|
||||||
|
|
||||||
uint8_t response[INVITE_RESPONSE_PACKET_SIZE];
|
uint8_t response[INVITE_RESPONSE_PACKET_SIZE];
|
||||||
|
@ -779,6 +782,7 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, const uint8_t *data,
|
||||||
if (close_index != -1) {
|
if (close_index != -1) {
|
||||||
g->close[close_index].group_number = other_groupnum;
|
g->close[close_index].group_number = other_groupnum;
|
||||||
g->close[close_index].type = GROUPCHAT_CLOSE_ONLINE;
|
g->close[close_index].type = GROUPCHAT_CLOSE_ONLINE;
|
||||||
|
g->number_joined = friendcon_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
send_peer_query(g_c, friendcon_id, other_groupnum);
|
send_peer_query(g_c, friendcon_id, other_groupnum);
|
||||||
|
@ -1004,6 +1008,8 @@ static int send_packet_online(Friend_Connections *fr_c, int friendcon_id, uint16
|
||||||
sizeof(packet), 0) != -1;
|
sizeof(packet), 0) != -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int send_peer_kill(Group_Chats *g_c, int friendcon_id, uint16_t group_num);
|
||||||
|
|
||||||
static int handle_packet_online(Group_Chats *g_c, int friendcon_id, uint8_t *data, uint16_t length)
|
static int handle_packet_online(Group_Chats *g_c, int friendcon_id, uint8_t *data, uint16_t length)
|
||||||
{
|
{
|
||||||
if (length != ONLINE_PACKET_DATA_SIZE)
|
if (length != ONLINE_PACKET_DATA_SIZE)
|
||||||
|
@ -1026,12 +1032,36 @@ static int handle_packet_online(Group_Chats *g_c, int friendcon_id, uint8_t *dat
|
||||||
|
|
||||||
g->close[index].group_number = other_groupnum;
|
g->close[index].group_number = other_groupnum;
|
||||||
g->close[index].type = GROUPCHAT_CLOSE_ONLINE;
|
g->close[index].type = GROUPCHAT_CLOSE_ONLINE;
|
||||||
|
|
||||||
|
if (g->number_joined != -1) {
|
||||||
|
int index = friend_in_close(g, g->number_joined);
|
||||||
|
g->number_joined = -1;
|
||||||
|
|
||||||
|
if (!g->close[index].closest) {
|
||||||
|
g->close[index].type = GROUPCHAT_CLOSE_NONE;
|
||||||
|
send_peer_kill(g_c, g->close[index].number, g->close[index].group_number);
|
||||||
|
kill_friend_connection(g_c->fr_c, g->close[index].number);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define PEER_KILL_ID 1
|
||||||
#define PEER_QUERY_ID 4
|
#define PEER_QUERY_ID 4
|
||||||
#define PEER_RESPONSE_ID 8
|
#define PEER_RESPONSE_ID 8
|
||||||
|
|
||||||
|
/* return 1 on success.
|
||||||
|
* return 0 on failure
|
||||||
|
*/
|
||||||
|
static unsigned int send_peer_kill(Group_Chats *g_c, int friendcon_id, uint16_t group_num)
|
||||||
|
{
|
||||||
|
uint8_t packet[1];
|
||||||
|
packet[0] = PEER_KILL_ID;
|
||||||
|
return send_packet_group_peer(g_c->fr_c, friendcon_id, PACKET_ID_DIRECT_GROUPCHAT, group_num, packet, sizeof(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* return 1 on success.
|
/* return 1 on success.
|
||||||
* return 0 on failure
|
* return 0 on failure
|
||||||
*/
|
*/
|
||||||
|
@ -1131,6 +1161,16 @@ static void handle_direct_packet(Group_Chats *g_c, int groupnumber, const uint8_
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (data[0]) {
|
switch (data[0]) {
|
||||||
|
case PEER_KILL_ID: {
|
||||||
|
Group_c *g = get_group_c(g_c, groupnumber);
|
||||||
|
|
||||||
|
if (!g)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g->close[close_index].type = GROUPCHAT_CLOSE_NONE;
|
||||||
|
kill_friend_connection(g_c->fr_c, g->close[close_index].number);
|
||||||
|
}
|
||||||
|
|
||||||
case PEER_QUERY_ID: {
|
case PEER_QUERY_ID: {
|
||||||
Group_c *g = get_group_c(g_c, groupnumber);
|
Group_c *g = get_group_c(g_c, groupnumber);
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,8 @@ typedef struct {
|
||||||
uint16_t peer_number;
|
uint16_t peer_number;
|
||||||
|
|
||||||
uint64_t last_sent_ping;
|
uint64_t last_sent_ping;
|
||||||
|
|
||||||
|
int number_joined; /* friendcon_id of person that invited us to the chat. (-1 means none) */
|
||||||
} Group_c;
|
} Group_c;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user