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

Fix groupchat creation bug

Users can no longer create new groupchat windows if they have been kicked from a group and haven't closed the window
This commit is contained in:
Jfreegman 2015-12-07 02:33:54 -05:00
parent 86b36d7a13
commit 6e7b0a5430
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
2 changed files with 48 additions and 17 deletions

View File

@ -369,10 +369,14 @@ void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
return; return;
} }
if (init_groupchat_win(m, groupnum, name, len) == -1) { int init = init_groupchat_win(m, groupnum, name, len);
if (init == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize."); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");
tox_group_leave(m, groupnum, NULL, 0, NULL); tox_group_leave(m, groupnum, NULL, 0, NULL);
return; } else if (init == -2) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You have been kicked from a group. Close the window and try again.");
tox_group_leave(m, groupnum, NULL, 0, NULL);
} }
} }
@ -434,10 +438,14 @@ void cmd_join(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
return; return;
} }
if (init_groupchat_win(m, groupnum, NULL, 0) == -1) { int init = init_groupchat_win(m, groupnum, NULL, 0);
if (init == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize."); line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");
tox_group_leave(m, groupnum, NULL, 0, NULL); tox_group_leave(m, groupnum, NULL, 0, NULL);
return; } else if (init == -2) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "You have been kicked from a group. Close the window and try again.");
tox_group_leave(m, groupnum, NULL, 0, NULL);
} }
} }

View File

@ -181,11 +181,34 @@ static void exit_groupchat(ToxWindow *self, Tox *m, uint32_t groupnum, const cha
close_groupchat(self, m, groupnum); close_groupchat(self, m, groupnum);
} }
/* Returns true if a group with groupnumber exists in the groupchats array */
static bool groupnumber_valid(uint32_t groupnumber)
{
size_t i;
for (i = 0; i < max_groupchat_index; ++i) {
if (groupchats[i].active && groupchats[i].groupnumber == groupnumber)
return true;
}
return false;
}
/* Creates a new toxic groupchat window associated with groupnumber.
*
* Returns 0 on success.
* Returns -1 on general failure.
* Returns -2 if the groupnumber is already in use. This usually means that the client has
* been kicked and needs to close the chat window before opening a new one.
*/
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)
{ {
if (groupnum > MAX_GROUPCHAT_NUM) if (groupnum > MAX_GROUPCHAT_NUM)
return -1; return -1;
if (groupnumber_valid(groupnum))
return -2;
ToxWindow self = new_group_chat(m, groupnum, groupname, length); ToxWindow self = new_group_chat(m, groupnum, groupname, length);
/* In case we're loading a saved group */ /* In case we're loading a saved group */
@ -464,7 +487,7 @@ static void group_onAction(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t
static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id, 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 || !groupnumber_valid(groupnum))
return; return;
groupchat_update_last_seen(groupnum, peer_id); groupchat_update_last_seen(groupnum, peer_id);
@ -511,7 +534,7 @@ static void groupchat_onGroupMessage(ToxWindow *self, Tox *m, uint32_t groupnum,
static void groupchat_onGroupPrivateMessage(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id, 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 || !groupnumber_valid(groupnum))
return; return;
groupchat_update_last_seen(groupnum, peer_id); groupchat_update_last_seen(groupnum, peer_id);
@ -540,7 +563,7 @@ static void groupchat_onGroupTopicChange(ToxWindow *self, Tox *m, uint32_t group
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
if (self->num != groupnum) if (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
groupchat_update_last_seen(groupnum, peer_id); groupchat_update_last_seen(groupnum, peer_id);
@ -561,7 +584,7 @@ static void groupchat_onGroupPeerLimit(ToxWindow *self, Tox *m, uint32_t groupnu
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
if (self->num != groupnumber) if (self->num != groupnumber || !groupnumber_valid(groupnumber))
return; return;
char timefrmt[TIME_STR_SIZE]; char timefrmt[TIME_STR_SIZE];
@ -578,7 +601,7 @@ static void groupchat_onGroupPrivacyState(ToxWindow *self, Tox *m, uint32_t grou
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
if (self->num != groupnumber) if (self->num != groupnumber || !groupnumber_valid(groupnumber))
return; return;
const char *state_str = state == TOX_GROUP_PRIVACY_STATE_PUBLIC ? "public" : "private"; const char *state_str = state == TOX_GROUP_PRIVACY_STATE_PUBLIC ? "public" : "private";
@ -598,7 +621,7 @@ static void groupchat_onGroupPassword(ToxWindow *self, Tox *m, uint32_t groupnum
{ {
ChatContext *ctx = self->chatwin; ChatContext *ctx = self->chatwin;
if (self->num != groupnumber) if (self->num != groupnumber || !groupnumber_valid(groupnumber))
return; return;
char timefrmt[TIME_STR_SIZE]; char timefrmt[TIME_STR_SIZE];
@ -649,7 +672,7 @@ static int realloc_peer_list(uint32_t groupnum, uint32_t n)
static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id) static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id)
{ {
if (groupnum != self->num) if (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
@ -704,7 +727,7 @@ static void groupchat_onGroupPeerJoin(ToxWindow *self, Tox *m, uint32_t groupnum
static void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id, 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 (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
@ -775,7 +798,7 @@ static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnum)
static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum) static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum)
{ {
if (groupnum != self->num) if (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
groupchat_set_group_name(self, m, groupnum); groupchat_set_group_name(self, m, groupnum);
@ -812,7 +835,7 @@ static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum
static void groupchat_onGroupRejected(ToxWindow *self, Tox *m, uint32_t groupnum, TOX_GROUP_JOIN_FAIL type) static void groupchat_onGroupRejected(ToxWindow *self, Tox *m, uint32_t groupnum, TOX_GROUP_JOIN_FAIL type)
{ {
if (groupnum != self->num) if (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
const char *msg = NULL; const char *msg = NULL;
@ -841,7 +864,7 @@ static void groupchat_onGroupRejected(ToxWindow *self, Tox *m, uint32_t groupnum
static void groupchat_onGroupModeration(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t src_peer_id, 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) uint32_t tgt_peer_id, TOX_GROUP_MOD_EVENT type)
{ {
if (groupnum != self->num) if (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
@ -895,7 +918,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 peer_id, 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 (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
GroupChat *chat = &groupchats[groupnum]; GroupChat *chat = &groupchats[groupnum];
@ -926,7 +949,7 @@ static void groupchat_onGroupNickChange(ToxWindow *self, Tox *m, uint32_t groupn
static void groupchat_onGroupStatusChange(ToxWindow *self, Tox *m, uint32_t groupnum, uint32_t peer_id, 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 (self->num != groupnum || !groupnumber_valid(groupnum))
return; return;
int peer_index = get_peer_index(groupnum, peer_id); int peer_index = get_peer_index(groupnum, peer_id);