1
0
mirror of https://github.com/Tha14/toxic.git synced 2024-11-26 14:53:26 +01:00

Refactor group peerlist to match API refactor

Peerlists are now similar to the friendlist, which makes managing them much easier, and
improves efficiency
This commit is contained in:
Jfreegman 2015-09-01 02:29:25 -04:00
parent ed1429afa1
commit 8526d4d77e
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
9 changed files with 316 additions and 218 deletions

View File

@ -60,15 +60,15 @@ void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[
}
const char *nick = argv[1];
int peernum = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernum == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
TOX_ERR_GROUP_TOGGLE_IGNORE err;
if (!tox_group_toggle_ignore(m, self->num, peernum, true, &err)) {
if (!tox_group_toggle_ignore(m, self->num, peer_id, true, &err)) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to ignore %s (error %d).", nick, err);
return;
}
@ -81,9 +81,9 @@ void cmd_ignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[
static void cmd_kickban_helper(ToxWindow *self, Tox *m, const char *nick, bool set_ban)
{
int peernumber = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernumber == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
@ -91,7 +91,7 @@ static void cmd_kickban_helper(ToxWindow *self, Tox *m, const char *nick, bool s
const char *type_str = set_ban ? "ban" : "kick";
TOX_ERR_GROUP_MOD_REMOVE_PEER err;
tox_group_mod_remove_peer(m, self->num, (uint32_t) peernumber, set_ban, &err);
tox_group_mod_remove_peer(m, self->num, peer_id, set_ban, &err);
switch (err) {
case TOX_ERR_GROUP_MOD_REMOVE_PEER_OK: {
@ -227,15 +227,15 @@ void cmd_mod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MAX
}
const char *nick = argv[1];
int peernumber = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernumber == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
TOX_ERR_GROUP_MOD_SET_ROLE err;
tox_group_mod_set_role(m, self->num, peernumber, TOX_GROUP_ROLE_MODERATOR, &err);
tox_group_mod_set_role(m, self->num, peer_id, TOX_GROUP_ROLE_MODERATOR, &err);
switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: {
@ -264,20 +264,20 @@ void cmd_unmod(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[M
}
const char *nick = argv[1];
int peernumber = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernumber == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
if (tox_group_peer_get_role(m, self->num, peernumber, NULL) != TOX_GROUP_ROLE_MODERATOR) {
if (tox_group_peer_get_role(m, self->num, peer_id, NULL) != TOX_GROUP_ROLE_MODERATOR) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s is not a moderator", nick);
return;
}
TOX_ERR_GROUP_MOD_SET_ROLE err;
tox_group_mod_set_role(m, self->num, peernumber, TOX_GROUP_ROLE_USER, &err);
tox_group_mod_set_role(m, self->num, peer_id, TOX_GROUP_ROLE_USER, &err);
switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: {
@ -428,15 +428,15 @@ void cmd_silence(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)
}
const char *nick = argv[1];
int peernumber = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernumber == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
TOX_ERR_GROUP_MOD_SET_ROLE err;
tox_group_mod_set_role(m, self->num, peernumber, TOX_GROUP_ROLE_OBSERVER, &err);
tox_group_mod_set_role(m, self->num, peer_id, TOX_GROUP_ROLE_OBSERVER, &err);
switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: {
@ -461,20 +461,20 @@ void cmd_unsilence(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
}
const char *nick = argv[1];
int peernumber = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernumber == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
if (tox_group_peer_get_role(m, self->num, peernumber, NULL) != TOX_GROUP_ROLE_OBSERVER) {
if (tox_group_peer_get_role(m, self->num, peer_id, NULL) != TOX_GROUP_ROLE_OBSERVER) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s is not silenced.", nick);
return;
}
TOX_ERR_GROUP_MOD_SET_ROLE err;
tox_group_mod_set_role(m, self->num, peernumber, TOX_GROUP_ROLE_USER, &err);
tox_group_mod_set_role(m, self->num, peer_id, TOX_GROUP_ROLE_USER, &err);
switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: {
@ -583,15 +583,15 @@ void cmd_unignore(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv
}
const char *nick = argv[1];
int peernum = group_get_nick_peernumber(self->num, nick);
uint32_t peer_id;
if (peernum == -1) {
if (group_get_nick_peer_id(self->num, nick, &peer_id) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return;
}
TOX_ERR_GROUP_TOGGLE_IGNORE err;
if (!tox_group_toggle_ignore(m, self->num, peernum, false, &err)) {
if (!tox_group_toggle_ignore(m, self->num, peer_id, false, &err)) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to unignore %s (error %d).", nick, err);
return;
}

View File

@ -122,42 +122,13 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
#endif /* AUDIO */
};
static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnum);
ToxWindow new_group_chat(Tox *m, uint32_t groupnum, const char *groupname, int length);
static void groupchat_onGroupPeerlistUpdate(ToxWindow *self, Tox *m, uint32_t groupnum);
static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnum);
static void group_update_name_list(uint32_t groupnum);
static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id);
static int realloc_peer_list(uint32_t groupnum, uint32_t n);
int init_groupchat_win(Tox *m, uint32_t groupnum, const char *groupname, size_t length)
{
if (groupnum > MAX_GROUPCHAT_NUM)
return -1;
ToxWindow self = new_group_chat(m, groupnum, groupname, length);
/* In case we're loading a saved group */
if (length == 0)
groupchat_set_group_name(&self, m, groupnum);
int i;
for (i = 0; i <= max_groupchat_index; ++i) {
if (!groupchats[i].active) {
groupchats[i].chatwin = add_window(m, self);
groupchats[i].active = true;
groupchats[i].groupnumber = groupnum;
if (i == max_groupchat_index)
++max_groupchat_index;
set_active_window(groupchats[i].chatwin);
groupchat_onGroupPeerlistUpdate(&self, m, groupnum);
store_data(m, DATA_FILE);
return 0;
}
}
return -1;
}
static void kill_groupchat_window(ToxWindow *self)
{
@ -179,8 +150,7 @@ void close_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum)
{
GroupChat *chat = &groupchats[groupnum];
if (chat->peer_list)
free(chat->peer_list);
realloc_peer_list(groupnum, 0);
if (chat->name_list)
free(chat->name_list);
@ -207,6 +177,50 @@ static void exit_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum, const cha
close_groupchat(self, m, groupnum);
}
int init_groupchat_win(Tox *m, uint32_t groupnum, const char *groupname, size_t length)
{
if (groupnum > MAX_GROUPCHAT_NUM)
return -1;
ToxWindow self = new_group_chat(m, groupnum, groupname, length);
/* In case we're loading a saved group */
if (length == 0)
groupchat_set_group_name(&self, m, groupnum);
int i;
for (i = 0; i <= max_groupchat_index; ++i) {
if (!groupchats[i].active) {
groupchats[i].chatwin = add_window(m, self);
groupchats[i].active = true;
groupchats[i].groupnumber = groupnum;
groupchats[i].num_peers = 0;
groupchats[i].time_connected = 0;
if (i == max_groupchat_index)
++max_groupchat_index;
set_active_window(groupchats[i].chatwin);
store_data(m, DATA_FILE);
TOX_ERR_GROUP_SELF_QUERY err;
uint32_t peer_id = tox_group_self_get_peer_id(m, groupnum, &err);
if (err != TOX_ERR_GROUP_SELF_QUERY_OK) {
close_groupchat(&self, m, groupnum);
return -1;
}
groupchat_onGroupPeerJoin(&self, m, groupnum, peer_id);
return 0;
}
}
return -1;
}
/* Note: the arguments to these functions are validated in the caller functions */
void set_nick_all_groups(Tox *m, const char *nick, size_t length)
{
@ -231,7 +245,7 @@ void set_nick_all_groups(Tox *m, const char *nick, size_t length)
break;
}
default: {
if (groupchats[i].is_connected)
if (groupchats[i].time_connected > 0)
line_info_add(self, NULL, NULL, 0, SYS_MSG, 0, RED, "-!- Failed to set nick (error %d).", err);
break;
@ -251,12 +265,44 @@ void set_status_all_groups(Tox *m, uint8_t status)
}
}
int group_get_nick_peernumber(uint32_t groupnum, const char *nick)
/* Gets the peer_id associated with nick.
* Returns -1 on failure or if nick is not assigned to anyone in the group.
*/
int group_get_nick_peer_id(uint32_t groupnum, const char *nick, uint32_t *peer_id)
{
GroupChat *chat = &groupchats[groupnum];
if (!chat)
return -1;
uint32_t i;
for (i = 0; i < groupchats[groupnum].num_peers; ++i) {
if (strcmp(nick, groupchats[groupnum].peer_list[i].name) == 0)
for (i = 0; i < chat->max_idx; ++i) {
if (chat->peer_list[i].active) {
if (strcmp(nick, groupchats[groupnum].peer_list[i].name) == 0) {
*peer_id = groupchats[groupnum].peer_list[i].peer_id;
return 0;
}
}
}
return -1;
}
/* Returns the peerlist index of peer_id for groupnum's group chat.
* Returns -1 on failure.
*/
static int get_peer_index(uint32_t groupnum, uint32_t peer_id)
{
GroupChat *chat = &groupchats[groupnum];
if (!chat)
return -1;
uint32_t i;
for (i = 0; i < chat->max_idx; ++i) {
if (chat->peer_list[i].active && chat->peer_list[i].peer_id == peer_id)
return i;
}
@ -267,6 +313,9 @@ static void group_update_name_list(uint32_t groupnum)
{
GroupChat *chat = &groupchats[groupnum];
if (!chat)
return;
if (chat->name_list)
free(chat->name_list);
@ -275,10 +324,14 @@ static void group_update_name_list(uint32_t groupnum)
if (chat->name_list == NULL)
exit_toxic_err("failed in group_update_name_list", FATALERR_MEMORY);
uint32_t i;
uint32_t i, count = 0;
for (i = 0; i < chat->num_peers; ++i)
memcpy(&chat->name_list[i * TOX_MAX_NAME_LENGTH], chat->peer_list[i].name, chat->peer_list[i].name_length + 1);
for (i = 0; i < chat->max_idx; ++i) {
if (chat->peer_list[i].active) {
memcpy(&chat->name_list[count * TOX_MAX_NAME_LENGTH], chat->peer_list[i].name, chat->peer_list[i].name_length + 1);
++count;
}
}
}
/* destroys and re-creates groupchat window */
@ -317,13 +370,13 @@ void redraw_groupchat_win(ToxWindow *self)
}
static void group_onAction(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum, const char *action,
static void group_onAction(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id, const char *action,
size_t len)
{
ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, nick, peernum, groupnum);
get_group_nick_truncate(m, nick, peer_id, groupnum);
char selfnick[TOX_MAX_NAME_LENGTH];
tox_self_get_name(m, (uint8_t *) selfnick);
@ -349,21 +402,21 @@ static void group_onAction(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t
write_to_log(action, nick, ctx->log, true);
}
static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
TOX_MESSAGE_TYPE type, const char *msg, size_t len)
{
if (self->num != groupnum)
return;
if (type == TOX_MESSAGE_TYPE_ACTION) {
group_onAction(self, m, groupnum, peernum, msg, len);
group_onAction(self, m, groupnum, peer_id, msg, len);
return;
}
ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, nick, peernum, groupnum);
get_group_nick_truncate(m, nick, peer_id, groupnum);
char selfnick[TOX_MAX_NAME_LENGTH];
tox_self_get_name(m, (uint8_t *) selfnick);
@ -394,7 +447,7 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum,
write_to_log(msg, nick, ctx->log, false);
}
static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
const char *msg, size_t len)
{
if (self->num != groupnum)
@ -403,7 +456,7 @@ static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t gr
ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, nick, peernum, groupnum);
get_group_nick_truncate(m, nick, peer_id, groupnum);
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
@ -419,7 +472,7 @@ static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t gr
box_silent_notify(self, NT_NOFOCUS, &self->active_box, self->name, "%s %s", nick, msg);
}
static void groupchat_onGroupTopicChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupTopicChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
const char *topic, size_t length)
{
ChatContext *ctx = self->chatwin;
@ -431,7 +484,7 @@ static void groupchat_onGroupTopicChange(ToxWindow *self, Tox *m, uint32_t group
get_time_str(timefrmt, sizeof(timefrmt));
char nick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, nick, peernum, groupnum);
get_group_nick_truncate(m, nick, peer_id, groupnum);
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, MAGENTA, "-!- %s set the topic to: %s", nick, topic);
char tmp_event[MAX_STR_SIZE];
@ -501,90 +554,99 @@ static void groupchat_onGroupPassword(ToxWindow *self, Tox *m, uint32_t groupnum
}
}
/* TODO: This function could probably be cleaned up and optimized */
static void groupchat_onGroupPeerlistUpdate(ToxWindow *self, Tox *m, uint32_t groupnum)
/* Reallocates groupnum's peer list to size n.
*
* Returns 0 on success.
* Returns -1 on failure.
*/
static int realloc_peer_list(uint32_t groupnum, uint32_t n)
{
if (self->num != groupnum)
return;
TOX_ERR_GROUP_STATE_QUERIES err;
uint32_t num_peers = tox_group_get_number_peers(m, groupnum, &err);
if (num_peers == 0 || err != TOX_ERR_GROUP_STATE_QUERIES_OK)
return;
GroupChat *chat = &groupchats[groupnum];
chat->num_peers = num_peers;
if (chat->peer_list)
if (!chat)
return -1;
if (n == 0) {
free(chat->peer_list);
chat->peer_list = malloc(sizeof(struct GroupPeer) * num_peers);
if (chat->peer_list == NULL)
exit_toxic_err("failed in groupchat_onGroupPeerlistUpdate", FATALERR_MEMORY);
uint32_t i;
for (i = 0; i < num_peers; ++i) {
memset(&chat->peer_list[i], 0, sizeof(struct GroupPeer));
TOX_ERR_GROUP_PEER_QUERY err;
size_t name_length = tox_group_peer_get_name_size(m, groupnum, i, &err);
if (err != TOX_ERR_GROUP_PEER_QUERY_OK)
name_length = 0;
else
name_length = MIN(name_length, TOX_MAX_NAME_LENGTH - 1);
if (!tox_group_peer_get_name(m, groupnum, i, (uint8_t *) chat->peer_list[i].name, NULL)) {
name_length = strlen(UNKNOWN_NAME);
memcpy(chat->peer_list[i].name, UNKNOWN_NAME, name_length);
chat->peer_list = NULL;
return 0;
}
chat->peer_list[i].name[name_length] = '\0';
chat->peer_list[i].name_length = name_length;
chat->peer_list[i].status = tox_group_peer_get_status(m, groupnum, i, NULL);
chat->peer_list[i].role = tox_group_peer_get_role(m, groupnum, i, NULL);
}
struct GroupPeer *tmp_list = realloc(chat->peer_list, n * sizeof(struct GroupPeer));
group_update_name_list(groupnum);
if (!tmp_list)
return -1;
chat->peer_list = tmp_list;
return 0;
}
static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum)
static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id)
{
if (groupnum != self->num)
return;
if (peernum > groupchats[groupnum].num_peers)
GroupChat *chat = &groupchats[groupnum];
if (!chat)
return;
char name[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, name, peernum, groupnum);
if (realloc_peer_list(groupnum, chat->max_idx + 1) == -1)
return;
memset(&chat->peer_list[chat->max_idx], 0, sizeof(struct GroupPeer));
uint32_t i;
for (i = 0; i <= chat->max_idx; ++i) {
if (chat->peer_list[i].active)
continue;
++chat->num_peers;
chat->peer_list[i].active = true;
chat->peer_list[i].peer_id = peer_id;
get_group_nick_truncate(m, chat->peer_list[i].name, peer_id, groupnum);
chat->peer_list[i].name_length = strlen(chat->peer_list[i].name);
chat->peer_list[i].status = tox_group_peer_get_status(m, groupnum, peer_id, NULL);
chat->peer_list[i].role = tox_group_peer_get_role(m, groupnum, peer_id, NULL);
if (i == chat->max_idx)
++chat->max_idx;
if (timed_out(chat->time_connected, 7)) { /* ignore join messages when we first connect to the group */
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
line_info_add(self, timefrmt, name, NULL, CONNECTION, 0, GREEN, "has joined the room.");
line_info_add(self, timefrmt, chat->peer_list[i].name, NULL, CONNECTION, 0, GREEN, "has joined the room.");
char log_str[TOXIC_MAX_NAME_LENGTH + 32];
snprintf(log_str, sizeof(log_str), "%s has joined the room", name);
snprintf(log_str, sizeof(log_str), "%s has joined the room", chat->peer_list[i].name);
write_to_log(log_str, name, self->chatwin->log, true);
write_to_log(log_str, chat->peer_list[i].name, self->chatwin->log, true);
sound_notify(self, silent, NT_WNDALERT_2, NULL);
}
group_update_name_list(groupnum);
return;
}
}
static void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
const char *partmessage, size_t len)
{
if (groupnum != self->num)
return;
if (peernum > groupchats[groupnum].num_peers)
GroupChat *chat = &groupchats[groupnum];
if (!chat)
return;
char name[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, name, peernum, groupnum);
get_group_nick_truncate(m, name, peer_id, groupnum);
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
@ -596,6 +658,28 @@ static void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, uint32_t groupnum
write_to_log(log_str, name, self->chatwin->log, true);
sound_notify(self, silent, NT_WNDALERT_2, NULL);
int peer_index = get_peer_index(groupnum, peer_id);
if (peer_index < 0)
return;
memset(&chat->peer_list[peer_index], 0, sizeof(struct GroupPeer));
uint32_t i;
for (i = chat->max_idx; i > 0; --i) {
if (chat->peer_list[i - 1].active)
break;
}
if (realloc_peer_list(groupnum, i) == -1)
return;
--chat->num_peers;
chat->max_idx = i;
group_update_name_list(groupnum);
}
static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnum)
@ -633,7 +717,7 @@ static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum
for (i = 0; i < max_groupchat_index; ++i) {
if (groupchats[i].active && groupchats[i].groupnumber == groupnum) {
groupchats[i].is_connected = true;
groupchats[i].time_connected = get_unix_time();
break;
}
}
@ -687,8 +771,8 @@ static void groupchat_onGroupRejected(ToxWindow *self, Tox *m, uint32_t groupnum
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 0, RED, "-!- %s", msg);
}
static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t src_peernum,
uint32_t tgt_peernum, TOX_GROUP_MOD_EVENT type)
static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t src_peer_id,
uint32_t tgt_peer_id, TOX_GROUP_MOD_EVENT type)
{
if (groupnum != self->num)
return;
@ -698,10 +782,15 @@ static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupn
char src_name[TOX_MAX_NAME_LENGTH];
char tgt_name[TOX_MAX_NAME_LENGTH];
if (get_group_nick_truncate(m, src_name, src_peernum, groupnum) == -1)
if (get_group_nick_truncate(m, src_name, src_peer_id, groupnum) == -1)
return;
if (get_group_nick_truncate(m, tgt_name, tgt_peernum, groupnum) == -1)
if (get_group_nick_truncate(m, tgt_name, tgt_peer_id, groupnum) == -1)
return;
int tgt_index = get_peer_index(groupnum, tgt_peer_id);
if (tgt_index < 0)
return;
char timefrmt[TIME_STR_SIZE];
@ -715,15 +804,15 @@ static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupn
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, RED, "-!- %s has been banned by %s", tgt_name, src_name);
break;
case TOX_GROUP_MOD_EVENT_OBSERVER:
chat->peer_list[tgt_peernum].role = TOX_GROUP_ROLE_OBSERVER;
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_OBSERVER;
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to observer", src_name, tgt_name);
break;
case TOX_GROUP_MOD_EVENT_USER:
chat->peer_list[tgt_peernum].role = TOX_GROUP_ROLE_USER;
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_USER;
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to user", src_name, tgt_name);
break;
case TOX_GROUP_MOD_EVENT_MODERATOR:
chat->peer_list[tgt_peernum].role = TOX_GROUP_ROLE_MODERATOR;
chat->peer_list[tgt_index].role = TOX_GROUP_ROLE_MODERATOR;
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to moderator", src_name, tgt_name);
break;
default:
@ -731,7 +820,7 @@ static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupn
}
}
static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
const char *newnick, size_t len)
{
if (groupnum != self->num)
@ -739,29 +828,40 @@ static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupn
GroupChat *chat = &groupchats[groupnum];
int peer_index = get_peer_index(groupnum, peer_id);
if (peer_index < 0)
return;
char oldnick[TOX_MAX_NAME_LENGTH];
get_group_nick_truncate(m, oldnick, peernum, groupnum);
get_group_nick_truncate(m, oldnick, peer_id, groupnum);
len = MAX(len, TOX_MAX_NAME_LENGTH - 1);
memcpy(groupchats[groupnum].peer_list[peernum].name, newnick, len);
chat->peer_list[peernum].name[len] = '\0';
chat->peer_list[peernum].name_length = len;
memcpy(groupchats[groupnum].peer_list[peer_index].name, newnick, len);
chat->peer_list[peer_index].name[len] = '\0';
chat->peer_list[peer_index].name_length = len;
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
line_info_add(self, timefrmt, oldnick, chat->peer_list[peernum].name, NAME_CHANGE, 0, MAGENTA, " is now known as ");
line_info_add(self, timefrmt, oldnick, chat->peer_list[peer_index].name, NAME_CHANGE, 0, MAGENTA,
" is now known as ");
group_update_name_list(groupnum);
}
static void groupchat_onGroupStatusChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peernum,
static void groupchat_onGroupStatusChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id,
TOX_USER_STATUS status)
{
if (groupnum != self->num)
return;
int peer_index = get_peer_index(groupnum, peer_id);
if (peer_index < 0)
return;
GroupChat *chat = &groupchats[groupnum];
chat->peer_list[peernum].status = status;
chat->peer_list[peer_index].status = status;
}
static void send_group_message(ToxWindow *self, Tox *m, uint32_t groupnum, const char *msg, TOX_MESSAGE_TYPE type)
@ -810,45 +910,51 @@ static void send_group_message(ToxWindow *self, Tox *m, uint32_t groupnum, const
}
}
static void send_group_prvt_message(ToxWindow *self, Tox *m, uint32_t groupnum, const char *data)
static void send_group_prvt_message(ToxWindow *self, Tox *m, uint32_t groupnum, const char *data, size_t data_len)
{
ChatContext *ctx = self->chatwin;
GroupChat *chat = &groupchats[groupnum];
if (data == NULL) {
wprintw(ctx->history, "Message is empty.\n");
if (data == NULL || data_len == 0) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, RED, "Message is empty.");
return;
}
size_t i;
int peernum = -1, nick_len = 0;
char *nick = NULL;
uint32_t i;
uint32_t peer_id, name_length = 0;
const char *nick = NULL;
/* need to match the longest nick in case of nicks that are smaller sub-strings */
for (i = 0; i < chat->num_peers; ++i) {
for (i = 0; i < chat->max_idx; ++i) {
if (!chat->peer_list[i].active)
continue;
if (data_len <= chat->peer_list[i].name_length)
continue;
if (memcmp(chat->peer_list[i].name, data, chat->peer_list[i].name_length) == 0) {
if (chat->peer_list[i].name_length > nick_len) {
nick_len = chat->peer_list[i].name_length;
if (chat->peer_list[i].name_length > name_length ) {
name_length = chat->peer_list[i].name_length;
nick = chat->peer_list[i].name;
peernum = i;
peer_id = chat->peer_list[i].peer_id;
}
}
}
if (peernum == -1) {
if (nick == NULL) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name.");
return;
}
int msg_len = strlen(data) - chat->peer_list[i].name_length - 1;
int msg_len = ((int) data_len) - ((int) name_length) - 1;
if (msg_len <= 0)
return;
const char *msg = data + chat->peer_list[i].name_length + 1;
const char *msg = data + name_length + 1;
TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE err;
if (!tox_group_send_private_message(m, groupnum, peernum, (uint8_t *) msg, msg_len, &err)) {
if (!tox_group_send_private_message(m, groupnum, peer_id, (uint8_t *) msg, msg_len, &err)) {
if (err == TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_PERMISSIONS) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, RED, " * You are silenced.");
} else {
@ -858,11 +964,8 @@ static void send_group_prvt_message(ToxWindow *self, Tox *m, uint32_t groupnum,
return;
}
/* turn "peername" into ">peername<" to signify private message */
char pm_nick[TOX_MAX_NAME_LENGTH + 2];
strcpy(pm_nick, ">");
strcpy(pm_nick + 1, nick);
strcpy(pm_nick + 1 + chat->peer_list[i].name_length, "<");
char pm_nick[TOX_MAX_NAME_LENGTH + 3];
snprintf(pm_nick, sizeof(pm_nick), ">%s<", nick);
char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt));
@ -926,10 +1029,10 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
} else if (key == user_settings->key_peer_list_down) { /* Scroll peerlist up and down one position */
int L = y2 - CHATBOX_HEIGHT - SDBAR_OFST;
if (groupchats[self->num].side_pos < groupchats[self->num].num_peers - L)
if (chat->side_pos < (int) chat->num_peers - L)
++chat->side_pos;
} else if (key == user_settings->key_peer_list_up) {
if (groupchats[self->num].side_pos > 0)
if (chat->side_pos > 0)
--chat->side_pos;
} else if (key == '\n') {
rm_trailing_spaces_buf(ctx);
@ -954,7 +1057,7 @@ static void groupchat_onKey(ToxWindow *self, Tox *m, wint_t key, bool ltr)
} else if (strncmp(line, "/me ", strlen("/me ")) == 0) {
send_group_message(self, m, self->num, line + 4, TOX_MESSAGE_TYPE_ACTION);
} else if (strncmp(line, "/whisper ", strlen("/whisper ")) == 0) {
send_group_prvt_message(self, m, self->num, line + 9);
send_group_prvt_message(self, m, self->num, line + 9, ctx->len - 9);
} else {
execute(ctx->history, self, m, line, GROUPCHAT_COMMAND_MODE);
}
@ -1005,38 +1108,41 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m)
mvwhline(ctx->sidebar, 1, 1, ACS_HLINE, SIDEBAR_WIDTH - 1);
int maxlines = y2 - SDBAR_OFST - CHATBOX_HEIGHT;
uint32_t i;
uint32_t i, offset = 0;
for (i = 0; i < chat->num_peers && i < maxlines; ++i) {
wmove(ctx->sidebar, i + 2, 1);
int peer = i + chat->side_pos;
for (i = 0; i < chat->max_idx && i < maxlines; ++i) {
if (!chat->peer_list[i].active)
continue;
int maxlen_offset = chat->peer_list[i].role == TOX_GROUP_ROLE_USER ? 2 : 3;
wmove(ctx->sidebar, offset + 2, 1);
int p = i + chat->side_pos;
int maxlen_offset = chat->peer_list[p].role == TOX_GROUP_ROLE_USER ? 2 : 3;
/* truncate nick to fit in side panel without modifying list */
char tmpnck[TOX_MAX_NAME_LENGTH];
int maxlen = SIDEBAR_WIDTH - maxlen_offset;
memcpy(tmpnck, chat->peer_list[peer].name, maxlen);
memcpy(tmpnck, chat->peer_list[p].name, maxlen);
tmpnck[maxlen] = '\0';
int namecolour = WHITE;
if (chat->peer_list[i].status == TOX_USER_STATUS_AWAY)
if (chat->peer_list[p].status == TOX_USER_STATUS_AWAY)
namecolour = YELLOW;
else if (chat->peer_list[i].status == TOX_USER_STATUS_BUSY)
else if (chat->peer_list[p].status == TOX_USER_STATUS_BUSY)
namecolour = RED;
/* Signify roles (e.g. founder, moderator) */
const char *rolesig = "";
int rolecolour = WHITE;
if (chat->peer_list[i].role == TOX_GROUP_ROLE_FOUNDER) {
if (chat->peer_list[p].role == TOX_GROUP_ROLE_FOUNDER) {
rolesig = "&";
rolecolour = BLUE;
} else if (chat->peer_list[i].role == TOX_GROUP_ROLE_MODERATOR) {
} else if (chat->peer_list[p].role == TOX_GROUP_ROLE_MODERATOR) {
rolesig = "+";
rolecolour = GREEN;
} else if (chat->peer_list[i].role == TOX_GROUP_ROLE_OBSERVER) {
} else if (chat->peer_list[p].role == TOX_GROUP_ROLE_OBSERVER) {
rolesig = "-";
rolecolour = MAGENTA;
}
@ -1048,6 +1154,8 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m)
wattron(ctx->sidebar, COLOR_PAIR(namecolour));
wprintw(ctx->sidebar, "%s\n", tmpnck);
wattroff(ctx->sidebar, COLOR_PAIR(namecolour));
++offset;
}
pthread_mutex_unlock(&Winthread.lock);
@ -1110,7 +1218,6 @@ ToxWindow new_group_chat(Tox *m, uint32_t groupnum, const char *groupname, int l
ret.onDraw = &groupchat_onDraw;
ret.onInit = &groupchat_onInit;
ret.onGroupMessage = &groupchat_onGroupMessage;
ret.onGroupPeerlistUpdate = &groupchat_onGroupPeerlistUpdate;
ret.onGroupPrivateMessage = &groupchat_onGroupPrivateMessage;
ret.onGroupPeerJoin = &groupchat_onGroupPeerJoin;
ret.onGroupPeerExit = &groupchat_onGroupPeerExit;

View File

@ -32,8 +32,10 @@
#define GROUP_EVENT_WAIT 3
struct GroupPeer {
bool active;
char name[TOX_MAX_NAME_LENGTH];
size_t name_length;
uint32_t peer_id;
TOX_USER_STATUS status;
TOX_GROUP_ROLE role;
};
@ -41,11 +43,12 @@ struct GroupPeer {
typedef struct {
struct GroupPeer *peer_list;
char *name_list; /* List of peer names, needed for tab completion */
uint32_t num_peers;
uint32_t num_peers; /* Number of peers in the chat/name_list array */
uint32_t max_idx; /* Maximum peer list index - 1 */
uint32_t groupnumber;
int chatwin;
bool active;
bool is_connected;
uint64_t time_connected; /* The time we successfully connected to the group */
int side_pos; /* current position of the sidebar - used for scrolling up and down */
} GroupChat;
@ -53,7 +56,7 @@ void close_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum);
int init_groupchat_win(Tox *m, uint32_t groupnum, const char *groupname, size_t length);
void set_nick_all_groups(Tox *m, const char *nick, size_t length);
void set_status_all_groups(Tox *m, uint8_t status);
int group_get_nick_peernumber(uint32_t groupnum, const char *nick);
int group_get_nick_peer_id(uint32_t groupnum, const char *nick, uint32_t *peer_id);
/* destroys and re-creates groupchat window */
void redraw_groupchat_win(ToxWindow *self);

View File

@ -293,16 +293,16 @@ size_t get_nick_truncate(Tox *m, char *buf, uint32_t friendnum)
}
/* same as get_nick_truncate but for groupchats */
int get_group_nick_truncate(Tox *m, char *buf, int peernum, int groupnum)
int get_group_nick_truncate(Tox *m, char *buf, uint32_t peer_id, int groupnum)
{
TOX_ERR_GROUP_PEER_QUERY err;
size_t len = tox_group_peer_get_name_size(m, groupnum, peernum, &err);
size_t len = tox_group_peer_get_name_size(m, groupnum, peer_id, &err);
if (err != TOX_ERR_GROUP_PEER_QUERY_OK) {
strcpy(buf, UNKNOWN_NAME);
len = strlen(UNKNOWN_NAME);
} else {
tox_group_peer_get_name(m, groupnum, peernum, (uint8_t *) buf, &err);
tox_group_peer_get_name(m, groupnum, peer_id, (uint8_t *) buf, &err);
if (err != TOX_ERR_GROUP_PEER_QUERY_OK) {
strcpy(buf, UNKNOWN_NAME);

View File

@ -111,7 +111,7 @@ void str_to_lower(char *str);
size_t get_nick_truncate(Tox *m, char *buf, uint32_t friendnum);
/* same as get_nick_truncate but for groupchats */
int get_group_nick_truncate(Tox *m, char *buf, int peernum, int groupnum);
int get_group_nick_truncate(Tox *m, char *buf, uint32_t peer_id, int groupnum);
/* copies data to msg buffer.
returns length of msg.

View File

@ -603,7 +603,6 @@ static void init_tox_callbacks(Tox *m)
tox_callback_group_invite(m, on_group_invite, NULL);
tox_callback_group_message(m, on_group_message, NULL);
tox_callback_group_private_message(m, on_group_private_message, NULL);
tox_callback_group_peerlist_update(m, on_group_namelistchange, NULL);
tox_callback_group_peer_join(m, on_group_peer_join, NULL);
tox_callback_group_peer_exit(m, on_group_peer_exit, NULL);
tox_callback_group_peer_name(m, on_group_nick_change, NULL);
@ -1147,6 +1146,7 @@ void DnD_callback(const char* asdv, DropType dt)
int main(int argc, char *argv[])
{
update_unix_time();
parse_args(argc, argv);
/* Use the -b flag to enable stderr */

View File

@ -119,7 +119,6 @@ void on_group_invite(Tox *m, uint32_t friendnumber, const uint8_t *invite_data,
void on_group_message(Tox *m, uint32_t groupnumber, uint32_t peernumber, TOX_MESSAGE_TYPE type,
const uint8_t *message, size_t length, void *userdata);
void on_group_private_message(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *message, size_t length, void *userdata);
void on_group_namelistchange(Tox *m, uint32_t groupnumber, void *userdata);
void on_group_peer_join(Tox *m, uint32_t groupnumber, uint32_t peernumber, void *userdata);
void on_group_peer_exit(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *partmsg, size_t length, void *userdata);
void on_group_topic_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *topic, size_t length, void *userdata);

View File

@ -161,7 +161,7 @@ void on_group_invite(Tox *m, uint32_t friendnumber, const uint8_t *invite_data,
}
}
void on_group_message(Tox *m, uint32_t groupnumber, uint32_t peernumber, TOX_MESSAGE_TYPE type,
void on_group_message(Tox *m, uint32_t groupnumber, uint32_t peer_id, TOX_MESSAGE_TYPE type,
const uint8_t *message, size_t length, void *userdata)
{
char msg[MAX_STR_SIZE + 1];
@ -171,11 +171,11 @@ void on_group_message(Tox *m, uint32_t groupnumber, uint32_t peernumber, TOX_MES
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupMessage != NULL)
windows[i].onGroupMessage(&windows[i], m, groupnumber, peernumber, type, msg, length);
windows[i].onGroupMessage(&windows[i], m, groupnumber, peer_id, type, msg, length);
}
}
void on_group_private_message(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *message,
void on_group_private_message(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *message,
size_t length, void *userdata)
{
char msg[MAX_STR_SIZE + 1];
@ -185,41 +185,31 @@ void on_group_private_message(Tox *m, uint32_t groupnumber, uint32_t peernumber,
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPrivateMessage != NULL)
windows[i].onGroupPrivateMessage(&windows[i], m, groupnumber, peernumber, msg, length);
windows[i].onGroupPrivateMessage(&windows[i], m, groupnumber, peer_id, msg, length);
}
}
void on_group_namelistchange(Tox *m, uint32_t groupnumber, void *userdata)
{
size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPeerlistUpdate != NULL)
windows[i].onGroupPeerlistUpdate(&windows[i], m, groupnumber);
}
}
void on_group_status_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, TOX_USER_STATUS status, void *userdata)
void on_group_status_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, TOX_USER_STATUS status, void *userdata)
{
size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupStatusChange != NULL)
windows[i].onGroupStatusChange(&windows[i], m, groupnumber, peernumber, status);
windows[i].onGroupStatusChange(&windows[i], m, groupnumber, peer_id, status);
}
}
void on_group_peer_join(Tox *m, uint32_t groupnumber, uint32_t peernumber, void *userdata)
void on_group_peer_join(Tox *m, uint32_t groupnumber, uint32_t peer_id, void *userdata)
{
size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPeerJoin != NULL)
windows[i].onGroupPeerJoin(&windows[i], m, groupnumber, peernumber);
windows[i].onGroupPeerJoin(&windows[i], m, groupnumber, peer_id);
}
}
void on_group_peer_exit(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *partmsg, size_t length,
void on_group_peer_exit(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *partmsg, size_t length,
void *userdata)
{
char msg[MAX_STR_SIZE + 1];
@ -235,11 +225,11 @@ void on_group_peer_exit(Tox *m, uint32_t groupnumber, uint32_t peernumber, const
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPeerExit != NULL)
windows[i].onGroupPeerExit(&windows[i], m, groupnumber, peernumber, msg, length);
windows[i].onGroupPeerExit(&windows[i], m, groupnumber, peer_id, msg, length);
}
}
void on_group_topic_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *topic, size_t length,
void on_group_topic_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *topic, size_t length,
void *userdata)
{
char data[MAX_STR_SIZE + 1];
@ -249,7 +239,7 @@ void on_group_topic_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, co
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupTopicChange != NULL)
windows[i].onGroupTopicChange(&windows[i], m, groupnumber, peernumber, data, length);
windows[i].onGroupTopicChange(&windows[i], m, groupnumber, peer_id, data, length);
}
}
@ -283,7 +273,7 @@ void on_group_password(Tox *m, uint32_t groupnumber, const uint8_t *password, si
}
}
void on_group_nick_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, const uint8_t *newname, size_t length,
void on_group_nick_change(Tox *m, uint32_t groupnumber, uint32_t peer_id, const uint8_t *newname, size_t length,
void *userdata)
{
char name[TOXIC_MAX_NAME_LENGTH + 1];
@ -294,7 +284,7 @@ void on_group_nick_change(Tox *m, uint32_t groupnumber, uint32_t peernumber, con
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupNickChange != NULL)
windows[i].onGroupNickChange(&windows[i], m, groupnumber, peernumber, name, length);
windows[i].onGroupNickChange(&windows[i], m, groupnumber, peer_id, name, length);
}
}
@ -318,14 +308,14 @@ void on_group_rejected(Tox *m, uint32_t groupnumber, TOX_GROUP_JOIN_FAIL type, v
}
}
void on_group_moderation(Tox *m, uint32_t groupnumber, uint32_t source_peernum, uint32_t target_peernum,
void on_group_moderation(Tox *m, uint32_t groupnumber, uint32_t source_peer_id, uint32_t target_peer_id,
TOX_GROUP_MOD_EVENT type, void *userdata)
{
size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupModeration != NULL)
windows[i].onGroupModeration(&windows[i], m, groupnumber, source_peernum, target_peernum, type);
windows[i].onGroupModeration(&windows[i], m, groupnumber, source_peer_id, target_peer_id, type);
}
}

View File

@ -131,7 +131,6 @@ struct ToxWindow {
void(*onGroupInvite)(ToxWindow *, Tox *, uint32_t, const char *, size_t);
void(*onGroupMessage)(ToxWindow *, Tox *, uint32_t, uint32_t, TOX_MESSAGE_TYPE, const char *, size_t);
void(*onGroupPrivateMessage)(ToxWindow *, Tox *, uint32_t, uint32_t, const char *, size_t);
void(*onGroupPeerlistUpdate)(ToxWindow *, Tox *, uint32_t);
void(*onGroupPeerJoin)(ToxWindow *, Tox *, uint32_t, uint32_t);
void(*onGroupPeerExit)(ToxWindow *, Tox *, uint32_t, uint32_t, const char *, size_t);
void(*onGroupNickChange)(ToxWindow *, Tox *, uint32_t, uint32_t, const char *, size_t);