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

Fix/update group logging implementation

This commit is contained in:
jfreegman 2020-11-19 01:31:47 -05:00
parent 18ef7ff693
commit 0a0756ec6a
No known key found for this signature in database
GPG Key ID: 3627F3144076AE63
5 changed files with 80 additions and 28 deletions

View File

@ -219,7 +219,7 @@ void cmd_group_accept(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*
return;
}
if (init_groupchat_win(m, groupnumber, NULL, 0) == -1) {
if (init_groupchat_win(m, groupnumber, NULL, 0, Group_Join_Type_Join) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");
tox_group_leave(m, groupnumber, NULL, 0, NULL);
return;

View File

@ -521,7 +521,7 @@ void cmd_groupchat(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*arg
return;
}
int init = init_groupchat_win(m, groupnumber, name, len);
int init = init_groupchat_win(m, groupnumber, name, len, Group_Join_Type_Create);
if (init == -1) {
line_info_add(self, false, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");
@ -598,7 +598,7 @@ void cmd_join(WINDOW *window, ToxWindow *self, Tox *m, int argc, char (*argv)[MA
return;
}
int init = init_groupchat_win(m, groupnumber, NULL, 0);
int init = init_groupchat_win(m, groupnumber, NULL, 0, Group_Join_Type_Join);
if (init == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Group chat window failed to initialize.");

View File

@ -265,8 +265,54 @@ void exit_groupchat(ToxWindow *self, Tox *m, uint32_t groupnumber, const char *p
}
tox_group_leave(m, groupnumber, (uint8_t *) partmessage, length, NULL);
if (self != NULL) {
close_groupchat(self, m, groupnumber);
}
}
/*
* Initializes groupchat log. This should only be called after we have the group name.
*/
static void init_groupchat_log(ToxWindow *self, Tox *m, uint32_t groupnumber)
{
GroupChat *chat = get_groupchat(groupnumber);
if (!chat) {
return;
}
ChatContext *ctx = self->chatwin;
char my_id[TOX_ADDRESS_SIZE];
tox_self_get_address(m, (uint8_t *) my_id);
char chat_id[TOX_GROUP_CHAT_ID_SIZE];
TOX_ERR_GROUP_STATE_QUERIES err;
if (!tox_group_get_chat_id(m, groupnumber, (uint8_t *)chat_id, &err)) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to fetch chat id. Logging disabled. (error: %d)", err);
return;
}
if (log_init(ctx->log, chat->group_name, my_id, chat_id, LOG_TYPE_CHAT) != 0) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize.");
return;
}
if (load_chat_history(self, ctx->log) != 0) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to load chat history.");
}
if (user_settings->autolog == AUTOLOG_ON) {
if (log_enable(ctx->log) != 0) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Failed to enable chat log.");
}
}
execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE); // print log state to screen
}
/* Creates a new toxic groupchat window associated with groupnumber.
*
@ -275,15 +321,10 @@ void exit_groupchat(ToxWindow *self, Tox *m, uint32_t groupnumber, const char *p
* 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 groupnumber, const char *groupname, size_t length)
int init_groupchat_win(Tox *m, uint32_t groupnumber, const char *groupname, size_t length, Group_Join_Type join_type)
{
ToxWindow *self = new_group_chat(m, groupnumber, groupname, length);
/* In case we're loading a saved group */
if (length == 0) {
groupchat_set_group_name(self, m, groupnumber);
}
for (int i = 0; i <= max_groupchat_index; ++i) {
if (!groupchats[i].active) {
groupchats[i].chatwin = add_window(m, self);
@ -307,6 +348,10 @@ int init_groupchat_win(Tox *m, uint32_t groupnumber, const char *groupname, size
return -1;
}
if (join_type == Group_Join_Type_Create || join_type == Group_Join_Type_Load) {
groupchat_set_group_name(self, m, groupnumber);
}
groupchat_onGroupPeerJoin(self, m, groupnumber, peer_id);
return 0;
@ -901,6 +946,12 @@ void groupchat_onGroupPeerExit(ToxWindow *self, Tox *m, uint32_t groupnumber, ui
static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnumber)
{
GroupChat *chat = get_groupchat(groupnumber);
if (!chat) {
return;
}
TOX_ERR_GROUP_STATE_QUERIES err;
size_t len = tox_group_get_name_size(m, groupnumber, &err);
@ -916,11 +967,12 @@ static void groupchat_set_group_name(ToxWindow *self, Tox *m, uint32_t groupnumb
return;
}
char groupname[TOX_GROUP_MAX_GROUP_NAME_LENGTH + 1];
len = copy_tox_str(groupname, sizeof(groupname), tmp_groupname, len);
len = copy_tox_str(chat->group_name, sizeof(chat->group_name), tmp_groupname, len);
chat->group_name_length = len;
if (len > 0) {
set_window_title(self, groupname, len);
set_window_title(self, chat->group_name, len);
init_groupchat_log(self, m, groupnumber);
}
}
@ -936,7 +988,6 @@ static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum
return;
}
groupchat_set_group_name(self, m, groupnumber);
chat->time_connected = get_unix_time();
char topic[TOX_GROUP_MAX_TOPIC_LENGTH + 1];
@ -962,6 +1013,10 @@ static void groupchat_onGroupSelfJoin(ToxWindow *self, Tox *m, uint32_t groupnum
line_info_add(self, timefrmt, NULL, NULL, SYS_MSG, 1, MAGENTA, "-!- Topic set to: %s", topic);
if (chat->group_name_length == 0) {
groupchat_set_group_name(self, m, groupnumber);
}
/* Update own role since it may have changed while we were offline */
TOX_ERR_GROUP_SELF_QUERY s_err;
TOX_GROUP_ROLE role = tox_group_self_get_role(m, groupnumber, &s_err);
@ -1583,17 +1638,6 @@ static void groupchat_onInit(ToxWindow *self, Tox *m)
line_info_init(ctx->hst);
if (user_settings->autolog == AUTOLOG_ON) {
char myid[TOX_ADDRESS_SIZE];
tox_self_get_address(m, (uint8_t *) myid);
if (log_enable(self->name, myid, NULL, ctx->log, LOG_CONFERENCE) == -1) {
line_info_add(self, NULL, NULL, NULL, SYS_MSG, 0, 0, "Warning: Log failed to initialize.");
}
}
execute(ctx->history, self, m, "/log", GLOBAL_COMMAND_MODE);
scrollok(ctx->history, 0);
wmove(self->window, y2 - CURS_Y_OFFSET, 0);
}

View File

@ -32,6 +32,12 @@
#define MAX_GROUPCHAT_NUM (MAX_WINDOWS_NUM - 2)
typedef enum Group_Join_Type {
Group_Join_Type_Create,
Group_Join_Type_Join,
Group_Join_Type_Load,
} Group_Join_Type;
typedef struct GroupPeer {
bool active;
char name[TOX_MAX_NAME_LENGTH];
@ -49,6 +55,8 @@ typedef struct {
uint32_t num_peers; /* Number of peers in the chat/name_list array */
uint32_t max_idx; /* Maximum peer list index - 1 */
char group_name[TOX_GROUP_MAX_GROUP_NAME_LENGTH + 1];
size_t group_name_length;
uint32_t groupnumber;
bool active;
uint64_t time_connected; /* The time we successfully connected to the group */
@ -58,7 +66,7 @@ typedef struct {
} GroupChat;
void exit_groupchat(ToxWindow *self, Tox *m, uint32_t groupnumber, const char *partmessage, size_t length);
int init_groupchat_win(Tox *m, uint32_t groupnumber, const char *groupname, size_t length);
int init_groupchat_win(Tox *m, uint32_t groupnumber, const char *groupname, size_t length, Group_Join_Type join_type);
void set_nick_all_groups(Tox *m, const char *new_nick, size_t length);
void set_status_all_groups(Tox *m, uint8_t status);
int group_get_nick_peer_id(uint32_t groupnumber, const char *nick, uint32_t *peer_id);

View File

@ -478,7 +478,7 @@ static void load_groups(Tox *m)
size_t numgroups = tox_group_get_number_groups(m);
for (size_t i = 0; i < numgroups; ++i) {
if (init_groupchat_win(m, i, NULL, 0) != 0) {
if (init_groupchat_win(m, i, NULL, 0, Group_Join_Type_Load) != 0) {
tox_group_leave(m, i, NULL, 0, NULL);
}
}