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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; return;
} }
TOX_ERR_GROUP_TOGGLE_IGNORE err; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to ignore %s (error %d).", nick, err);
return; 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) 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; 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"; const char *type_str = set_ban ? "ban" : "kick";
TOX_ERR_GROUP_MOD_REMOVE_PEER err; 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) { switch (err) {
case TOX_ERR_GROUP_MOD_REMOVE_PEER_OK: { 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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; return;
} }
TOX_ERR_GROUP_MOD_SET_ROLE err; 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) { switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: { 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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s is not a moderator", nick);
return; return;
} }
TOX_ERR_GROUP_MOD_SET_ROLE err; 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) { switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: { 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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; return;
} }
TOX_ERR_GROUP_MOD_SET_ROLE err; 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) { switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: { 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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "%s is not silenced.", nick);
return; return;
} }
TOX_ERR_GROUP_MOD_SET_ROLE err; 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) { switch (err) {
case TOX_ERR_GROUP_MOD_SET_ROLE_OK: { 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]; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name '%s'.", nick);
return; return;
} }
TOX_ERR_GROUP_TOGGLE_IGNORE err; 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); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to unignore %s (error %d).", nick, err);
return; return;
} }

View File

@ -122,42 +122,13 @@ static const char group_cmd_list[AC_NUM_GROUP_COMMANDS][MAX_CMDNAME_SIZE] = {
#endif /* AUDIO */ #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); 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) 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]; GroupChat *chat = &groupchats[groupnum];
if (chat->peer_list) realloc_peer_list(groupnum, 0);
free(chat->peer_list);
if (chat->name_list) if (chat->name_list)
free(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); 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 */ /* 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) 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; break;
} }
default: { 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); line_info_add(self, NULL, NULL, 0, SYS_MSG, 0, RED, "-!- Failed to set nick (error %d).", err);
break; 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; uint32_t i;
for (i = 0; i < groupchats[groupnum].num_peers; ++i) { for (i = 0; i < chat->max_idx; ++i) {
if (strcmp(nick, groupchats[groupnum].peer_list[i].name) == 0) 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; return i;
} }
@ -267,6 +313,9 @@ static void group_update_name_list(uint32_t groupnum)
{ {
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
if (!chat)
return;
if (chat->name_list) if (chat->name_list)
free(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) if (chat->name_list == NULL)
exit_toxic_err("failed in group_update_name_list", FATALERR_MEMORY); 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) for (i = 0; i < chat->max_idx; ++i) {
memcpy(&chat->name_list[i * TOX_MAX_NAME_LENGTH], chat->peer_list[i].name, chat->peer_list[i].name_length + 1); 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 */ /* 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) size_t len)
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH]; 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]; char selfnick[TOX_MAX_NAME_LENGTH];
tox_self_get_name(m, (uint8_t *) selfnick); 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); 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) TOX_MESSAGE_TYPE type, const char *msg, size_t len)
{ {
if (self->num != groupnum) if (self->num != groupnum)
return; return;
if (type == TOX_MESSAGE_TYPE_ACTION) { if (type == TOX_MESSAGE_TYPE_ACTION) {
group_onAction(self, m, groupnum, peernum, msg, len); group_onAction(self, m, groupnum, peer_id, msg, len);
return; return;
} }
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH]; 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]; char selfnick[TOX_MAX_NAME_LENGTH];
tox_self_get_name(m, (uint8_t *) selfnick); 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); 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) const char *msg, size_t len)
{ {
if (self->num != groupnum) if (self->num != groupnum)
@ -403,7 +456,7 @@ static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t gr
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
char nick[TOX_MAX_NAME_LENGTH]; 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]; char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt)); 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); 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) const char *topic, size_t length)
{ {
ChatContext *ctx = self->chatwin; 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)); get_time_str(timefrmt, sizeof(timefrmt));
char nick[TOX_MAX_NAME_LENGTH]; 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); 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]; 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 */ /* Reallocates groupnum's peer list to size n.
static void groupchat_onGroupPeerlistUpdate(ToxWindow *self, Tox *m, uint32_t groupnum) *
* 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]; GroupChat *chat = &groupchats[groupnum];
chat->num_peers = num_peers;
if (chat->peer_list) if (!chat)
return -1;
if (n == 0) {
free(chat->peer_list); free(chat->peer_list);
chat->peer_list = NULL;
chat->peer_list = malloc(sizeof(struct GroupPeer) * num_peers); return 0;
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[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);
} }
group_update_name_list(groupnum); struct GroupPeer *tmp_list = realloc(chat->peer_list, n * sizeof(struct GroupPeer));
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) if (groupnum != self->num)
return; return;
if (peernum > groupchats[groupnum].num_peers) GroupChat *chat = &groupchats[groupnum];
if (!chat)
return; return;
char name[TOX_MAX_NAME_LENGTH]; if (realloc_peer_list(groupnum, chat->max_idx + 1) == -1)
get_group_nick_truncate(m, name, peernum, groupnum); return;
char timefrmt[TIME_STR_SIZE]; memset(&chat->peer_list[chat->max_idx], 0, sizeof(struct GroupPeer));
get_time_str(timefrmt, sizeof(timefrmt));
line_info_add(self, timefrmt, name, NULL, CONNECTION, 0, GREEN, "has joined the room."); uint32_t i;
char log_str[TOXIC_MAX_NAME_LENGTH + 32]; for (i = 0; i <= chat->max_idx; ++i) {
snprintf(log_str, sizeof(log_str), "%s has joined the room", name); if (chat->peer_list[i].active)
continue;
write_to_log(log_str, name, self->chatwin->log, true); ++chat->num_peers;
sound_notify(self, silent, NT_WNDALERT_2, NULL);
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, 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", chat->peer_list[i].name);
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) const char *partmessage, size_t len)
{ {
if (groupnum != self->num) if (groupnum != self->num)
return; return;
if (peernum > groupchats[groupnum].num_peers) GroupChat *chat = &groupchats[groupnum];
if (!chat)
return; return;
char name[TOX_MAX_NAME_LENGTH]; 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]; char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt)); 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); write_to_log(log_str, name, self->chatwin->log, true);
sound_notify(self, silent, NT_WNDALERT_2, NULL); 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) 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) { for (i = 0; i < max_groupchat_index; ++i) {
if (groupchats[i].active && groupchats[i].groupnumber == groupnum) { if (groupchats[i].active && groupchats[i].groupnumber == groupnum) {
groupchats[i].is_connected = true; groupchats[i].time_connected = get_unix_time();
break; 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); 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, static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t src_peer_id,
uint32_t tgt_peernum, TOX_GROUP_MOD_EVENT type) uint32_t tgt_peer_id, TOX_GROUP_MOD_EVENT type)
{ {
if (groupnum != self->num) if (groupnum != self->num)
return; return;
@ -698,10 +782,15 @@ static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupn
char src_name[TOX_MAX_NAME_LENGTH]; char src_name[TOX_MAX_NAME_LENGTH];
char tgt_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; 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; return;
char timefrmt[TIME_STR_SIZE]; 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); line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, RED, "-!- %s has been banned by %s", tgt_name, src_name);
break; break;
case TOX_GROUP_MOD_EVENT_OBSERVER: 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); line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to observer", src_name, tgt_name);
break; break;
case TOX_GROUP_MOD_EVENT_USER: 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); line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to user", src_name, tgt_name);
break; break;
case TOX_GROUP_MOD_EVENT_MODERATOR: 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); line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, BLUE, "-!- %s has set %s's role to moderator", src_name, tgt_name);
break; break;
default: 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) const char *newnick, size_t len)
{ {
if (groupnum != self->num) if (groupnum != self->num)
@ -739,29 +828,40 @@ static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupn
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
int peer_index = get_peer_index(groupnum, peer_id);
if (peer_index < 0)
return;
char oldnick[TOX_MAX_NAME_LENGTH]; 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); len = MAX(len, TOX_MAX_NAME_LENGTH - 1);
memcpy(groupchats[groupnum].peer_list[peernum].name, newnick, len); memcpy(groupchats[groupnum].peer_list[peer_index].name, newnick, len);
chat->peer_list[peernum].name[len] = '\0'; chat->peer_list[peer_index].name[len] = '\0';
chat->peer_list[peernum].name_length = len; chat->peer_list[peer_index].name_length = len;
char timefrmt[TIME_STR_SIZE]; char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt)); 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); 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) TOX_USER_STATUS status)
{ {
if (groupnum != self->num) if (groupnum != self->num)
return; return;
int peer_index = get_peer_index(groupnum, peer_id);
if (peer_index < 0)
return;
GroupChat *chat = &groupchats[groupnum]; 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) 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; ChatContext *ctx = self->chatwin;
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
if (data == NULL) { if (data == NULL || data_len == 0) {
wprintw(ctx->history, "Message is empty.\n"); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, RED, "Message is empty.");
return; return;
} }
size_t i; uint32_t i;
int peernum = -1, nick_len = 0; uint32_t peer_id, name_length = 0;
char *nick = NULL; const char *nick = NULL;
/* need to match the longest nick in case of nicks that are smaller sub-strings */ /* 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 (memcmp(chat->peer_list[i].name, data, chat->peer_list[i].name_length) == 0) {
if (chat->peer_list[i].name_length > nick_len) { if (chat->peer_list[i].name_length > name_length ) {
nick_len = chat->peer_list[i].name_length; name_length = chat->peer_list[i].name_length;
nick = chat->peer_list[i].name; 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."); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Invalid peer name.");
return; 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) if (msg_len <= 0)
return; 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; 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) { if (err == TOX_ERR_GROUP_SEND_PRIVATE_MESSAGE_PERMISSIONS) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, RED, " * You are silenced."); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, RED, " * You are silenced.");
} else { } else {
@ -858,11 +964,8 @@ static void send_group_prvt_message(ToxWindow *self, Tox *m, uint32_t groupnum,
return; return;
} }
/* turn "peername" into ">peername<" to signify private message */ char pm_nick[TOX_MAX_NAME_LENGTH + 3];
char pm_nick[TOX_MAX_NAME_LENGTH + 2]; snprintf(pm_nick, sizeof(pm_nick), ">%s<", nick);
strcpy(pm_nick, ">");
strcpy(pm_nick + 1, nick);
strcpy(pm_nick + 1 + chat->peer_list[i].name_length, "<");
char timefrmt[TIME_STR_SIZE]; char timefrmt[TIME_STR_SIZE];
get_time_str(timefrmt, sizeof(timefrmt)); 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 */ } else if (key == user_settings->key_peer_list_down) { /* Scroll peerlist up and down one position */
int L = y2 - CHATBOX_HEIGHT - SDBAR_OFST; 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; ++chat->side_pos;
} else if (key == user_settings->key_peer_list_up) { } else if (key == user_settings->key_peer_list_up) {
if (groupchats[self->num].side_pos > 0) if (chat->side_pos > 0)
--chat->side_pos; --chat->side_pos;
} else if (key == '\n') { } else if (key == '\n') {
rm_trailing_spaces_buf(ctx); 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) { } else if (strncmp(line, "/me ", strlen("/me ")) == 0) {
send_group_message(self, m, self->num, line + 4, TOX_MESSAGE_TYPE_ACTION); send_group_message(self, m, self->num, line + 4, TOX_MESSAGE_TYPE_ACTION);
} else if (strncmp(line, "/whisper ", strlen("/whisper ")) == 0) { } 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 { } else {
execute(ctx->history, self, m, line, GROUPCHAT_COMMAND_MODE); 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); mvwhline(ctx->sidebar, 1, 1, ACS_HLINE, SIDEBAR_WIDTH - 1);
int maxlines = y2 - SDBAR_OFST - CHATBOX_HEIGHT; 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) { for (i = 0; i < chat->max_idx && i < maxlines; ++i) {
wmove(ctx->sidebar, i + 2, 1); if (!chat->peer_list[i].active)
int peer = i + chat->side_pos; 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 */ /* truncate nick to fit in side panel without modifying list */
char tmpnck[TOX_MAX_NAME_LENGTH]; char tmpnck[TOX_MAX_NAME_LENGTH];
int maxlen = SIDEBAR_WIDTH - maxlen_offset; 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'; tmpnck[maxlen] = '\0';
int namecolour = WHITE; 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; 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; namecolour = RED;
/* Signify roles (e.g. founder, moderator) */ /* Signify roles (e.g. founder, moderator) */
const char *rolesig = ""; const char *rolesig = "";
int rolecolour = WHITE; int rolecolour = WHITE;
if (chat->peer_list[i].role == TOX_GROUP_ROLE_FOUNDER) { if (chat->peer_list[p].role == TOX_GROUP_ROLE_FOUNDER) {
rolesig = "&"; rolesig = "&";
rolecolour = BLUE; 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 = "+"; rolesig = "+";
rolecolour = GREEN; 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 = "-"; rolesig = "-";
rolecolour = MAGENTA; rolecolour = MAGENTA;
} }
@ -1048,6 +1154,8 @@ static void groupchat_onDraw(ToxWindow *self, Tox *m)
wattron(ctx->sidebar, COLOR_PAIR(namecolour)); wattron(ctx->sidebar, COLOR_PAIR(namecolour));
wprintw(ctx->sidebar, "%s\n", tmpnck); wprintw(ctx->sidebar, "%s\n", tmpnck);
wattroff(ctx->sidebar, COLOR_PAIR(namecolour)); wattroff(ctx->sidebar, COLOR_PAIR(namecolour));
++offset;
} }
pthread_mutex_unlock(&Winthread.lock); 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.onDraw = &groupchat_onDraw;
ret.onInit = &groupchat_onInit; ret.onInit = &groupchat_onInit;
ret.onGroupMessage = &groupchat_onGroupMessage; ret.onGroupMessage = &groupchat_onGroupMessage;
ret.onGroupPeerlistUpdate = &groupchat_onGroupPeerlistUpdate;
ret.onGroupPrivateMessage = &groupchat_onGroupPrivateMessage; ret.onGroupPrivateMessage = &groupchat_onGroupPrivateMessage;
ret.onGroupPeerJoin = &groupchat_onGroupPeerJoin; ret.onGroupPeerJoin = &groupchat_onGroupPeerJoin;
ret.onGroupPeerExit = &groupchat_onGroupPeerExit; ret.onGroupPeerExit = &groupchat_onGroupPeerExit;

View File

@ -32,8 +32,10 @@
#define GROUP_EVENT_WAIT 3 #define GROUP_EVENT_WAIT 3
struct GroupPeer { struct GroupPeer {
bool active;
char name[TOX_MAX_NAME_LENGTH]; char name[TOX_MAX_NAME_LENGTH];
size_t name_length; size_t name_length;
uint32_t peer_id;
TOX_USER_STATUS status; TOX_USER_STATUS status;
TOX_GROUP_ROLE role; TOX_GROUP_ROLE role;
}; };
@ -41,19 +43,20 @@ struct GroupPeer {
typedef struct { typedef struct {
struct GroupPeer *peer_list; struct GroupPeer *peer_list;
char *name_list; /* List of peer names, needed for tab completion */ 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; uint32_t groupnumber;
int chatwin; int chatwin;
bool active; 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 */ int side_pos; /* current position of the sidebar - used for scrolling up and down */
} GroupChat; } GroupChat;
void close_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum); 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); 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_nick_all_groups(Tox *m, const char *nick, size_t length);
void set_status_all_groups(Tox *m, uint8_t status); 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 */ /* destroys and re-creates groupchat window */
void redraw_groupchat_win(ToxWindow *self); 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 */ /* 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; 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) { if (err != TOX_ERR_GROUP_PEER_QUERY_OK) {
strcpy(buf, UNKNOWN_NAME); strcpy(buf, UNKNOWN_NAME);
len = strlen(UNKNOWN_NAME); len = strlen(UNKNOWN_NAME);
} else { } 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) { if (err != TOX_ERR_GROUP_PEER_QUERY_OK) {
strcpy(buf, UNKNOWN_NAME); 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); size_t get_nick_truncate(Tox *m, char *buf, uint32_t friendnum);
/* same as get_nick_truncate but for groupchats */ /* 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. /* copies data to msg buffer.
returns length of msg. 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_invite(m, on_group_invite, NULL);
tox_callback_group_message(m, on_group_message, NULL); tox_callback_group_message(m, on_group_message, NULL);
tox_callback_group_private_message(m, on_group_private_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_join(m, on_group_peer_join, NULL);
tox_callback_group_peer_exit(m, on_group_peer_exit, NULL); tox_callback_group_peer_exit(m, on_group_peer_exit, NULL);
tox_callback_group_peer_name(m, on_group_nick_change, 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[]) int main(int argc, char *argv[])
{ {
update_unix_time();
parse_args(argc, argv); parse_args(argc, argv);
/* Use the -b flag to enable stderr */ /* 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, 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); 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_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_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_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); 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) const uint8_t *message, size_t length, void *userdata)
{ {
char msg[MAX_STR_SIZE + 1]; 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) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupMessage != NULL) 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) size_t length, void *userdata)
{ {
char msg[MAX_STR_SIZE + 1]; 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) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPrivateMessage != NULL) 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) 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].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)
{ {
size_t i; size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupStatusChange != NULL) 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; size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPeerJoin != NULL) 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) void *userdata)
{ {
char msg[MAX_STR_SIZE + 1]; 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) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupPeerExit != NULL) 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) void *userdata)
{ {
char data[MAX_STR_SIZE + 1]; 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) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupTopicChange != NULL) 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) void *userdata)
{ {
char name[TOXIC_MAX_NAME_LENGTH + 1]; 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) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupNickChange != NULL) 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) TOX_GROUP_MOD_EVENT type, void *userdata)
{ {
size_t i; size_t i;
for (i = 0; i < MAX_WINDOWS_NUM; ++i) { for (i = 0; i < MAX_WINDOWS_NUM; ++i) {
if (windows[i].onGroupModeration != NULL) 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(*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(*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(*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(*onGroupPeerJoin)(ToxWindow *, Tox *, uint32_t, uint32_t);
void(*onGroupPeerExit)(ToxWindow *, Tox *, uint32_t, uint32_t, const char *, size_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); void(*onGroupNickChange)(ToxWindow *, Tox *, uint32_t, uint32_t, const char *, size_t);