mirror of
https://github.com/Tha14/toxic.git
synced 2024-11-22 20:33:02 +01:00
Show peer join/part messages in conferences
Also a couple trivial fixes
This commit is contained in:
parent
3f1b7cdd26
commit
4330bf5867
@ -65,6 +65,9 @@
|
|||||||
|
|
||||||
extern char *DATA_FILE;
|
extern char *DATA_FILE;
|
||||||
|
|
||||||
|
#define MAX_CONFERENCE_NUM (MAX_WINDOWS_NUM - 2)
|
||||||
|
#define CONFERENCE_EVENT_WAIT 30
|
||||||
|
|
||||||
static ConferenceChat conferences[MAX_CONFERENCE_NUM];
|
static ConferenceChat conferences[MAX_CONFERENCE_NUM];
|
||||||
static int max_conference_index = 0;
|
static int max_conference_index = 0;
|
||||||
|
|
||||||
@ -631,7 +634,10 @@ static bool find_peer_by_pubkey(const ConferencePeer *list, uint32_t num_peers,
|
|||||||
const ConferencePeer *peer = &list[i];
|
const ConferencePeer *peer = &list[i];
|
||||||
|
|
||||||
if (peer->active && memcmp(peer->pubkey, pubkey, TOX_PUBLIC_KEY_SIZE) == 0) {
|
if (peer->active && memcmp(peer->pubkey, pubkey, TOX_PUBLIC_KEY_SIZE) == 0) {
|
||||||
|
if (idx) {
|
||||||
*idx = i;
|
*idx = i;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -639,7 +645,8 @@ static bool find_peer_by_pubkey(const ConferencePeer *list, uint32_t num_peers,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void update_peer_list(Tox *m, uint32_t conferencenum, uint32_t num_peers, uint32_t old_num_peers)
|
static void update_peer_list(ToxWindow *self, Tox *m, uint32_t conferencenum, uint32_t num_peers,
|
||||||
|
uint32_t old_num_peers)
|
||||||
{
|
{
|
||||||
ConferenceChat *chat = &conferences[conferencenum];
|
ConferenceChat *chat = &conferences[conferencenum];
|
||||||
|
|
||||||
@ -647,6 +654,8 @@ static void update_peer_list(Tox *m, uint32_t conferencenum, uint32_t num_peers,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
ConferencePeer *old_peer_list = malloc(old_num_peers * sizeof(ConferencePeer));
|
ConferencePeer *old_peer_list = malloc(old_num_peers * sizeof(ConferencePeer));
|
||||||
|
|
||||||
if (!old_peer_list) {
|
if (!old_peer_list) {
|
||||||
@ -664,6 +673,8 @@ static void update_peer_list(Tox *m, uint32_t conferencenum, uint32_t num_peers,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char timefrmt[TIME_STR_SIZE];
|
||||||
|
|
||||||
for (uint32_t i = 0; i < num_peers; ++i) {
|
for (uint32_t i = 0; i < num_peers; ++i) {
|
||||||
ConferencePeer *peer = &chat->peer_list[i];
|
ConferencePeer *peer = &chat->peer_list[i];
|
||||||
|
|
||||||
@ -678,12 +689,14 @@ static void update_peer_list(Tox *m, uint32_t conferencenum, uint32_t num_peers,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool new_peer = true;
|
||||||
uint32_t j;
|
uint32_t j;
|
||||||
|
|
||||||
if (find_peer_by_pubkey(old_peer_list, old_num_peers, peer->pubkey, &j)) {
|
if (find_peer_by_pubkey(old_peer_list, old_num_peers, peer->pubkey, &j)) {
|
||||||
ConferencePeer *old_peer = &old_peer_list[j];
|
ConferencePeer *old_peer = &old_peer_list[j];
|
||||||
memcpy(peer, old_peer, sizeof(ConferencePeer));
|
memcpy(peer, old_peer, sizeof(ConferencePeer));
|
||||||
old_peer->active = false;
|
old_peer->active = false;
|
||||||
|
new_peer = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t length = tox_conference_peer_get_name_size(m, conferencenum, i, &err);
|
size_t length = tox_conference_peer_get_name_size(m, conferencenum, i, &err);
|
||||||
@ -704,22 +717,37 @@ static void update_peer_list(Tox *m, uint32_t conferencenum, uint32_t num_peers,
|
|||||||
peer->name_length = length;
|
peer->name_length = length;
|
||||||
peer->peernum = i;
|
peer->peernum = i;
|
||||||
|
|
||||||
|
if (new_peer && peer->name_length > 0 && timed_out(chat->start_time, CONFERENCE_EVENT_WAIT)) {
|
||||||
|
const char *msg = "has joined the group";
|
||||||
|
get_time_str(timefrmt, sizeof(timefrmt));
|
||||||
|
line_info_add(self, timefrmt, peer->name, NULL, CONNECTION, 0, GREEN, msg);
|
||||||
|
write_to_log(msg, peer->name, ctx->log, true);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef AUDIO
|
#ifdef AUDIO
|
||||||
set_peer_audio_position(m, conferencenum, i);
|
set_peer_audio_position(m, conferencenum, i);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conference_update_name_list(conferencenum);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < old_num_peers; ++i) {
|
for (uint32_t i = 0; i < old_num_peers; ++i) {
|
||||||
ConferencePeer *old_peer = &old_peer_list[i];
|
ConferencePeer *old_peer = &old_peer_list[i];
|
||||||
|
|
||||||
if (old_peer->active) {
|
if (old_peer->active) {
|
||||||
|
if (!find_peer_by_pubkey(chat->peer_list, chat->num_peers, old_peer->pubkey, NULL)) {
|
||||||
|
const char *msg = "has left the group";
|
||||||
|
get_time_str(timefrmt, sizeof(timefrmt));
|
||||||
|
|
||||||
|
line_info_add(self, timefrmt, old_peer->name, NULL, DISCONNECTION, 0, RED, msg);
|
||||||
|
write_to_log(msg, old_peer->name, ctx->log, true);
|
||||||
|
}
|
||||||
|
|
||||||
free_peer(old_peer);
|
free_peer(old_peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(old_peer_list);
|
free(old_peer_list);
|
||||||
|
|
||||||
conference_update_name_list(conferencenum);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conference_onConferenceNameListChange(ToxWindow *self, Tox *m, uint32_t conferencenum)
|
static void conference_onConferenceNameListChange(ToxWindow *self, Tox *m, uint32_t conferencenum)
|
||||||
@ -751,7 +779,7 @@ static void conference_onConferenceNameListChange(ToxWindow *self, Tox *m, uint3
|
|||||||
|
|
||||||
chat->num_peers = num_peers;
|
chat->num_peers = num_peers;
|
||||||
chat->max_idx = num_peers;
|
chat->max_idx = num_peers;
|
||||||
update_peer_list(m, conferencenum, num_peers, old_num);
|
update_peer_list(self, m, conferencenum, num_peers, old_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void conference_onConferencePeerNameChange(ToxWindow *self, Tox *m, uint32_t conferencenum, uint32_t peernum,
|
static void conference_onConferencePeerNameChange(ToxWindow *self, Tox *m, uint32_t conferencenum, uint32_t peernum,
|
||||||
@ -765,17 +793,24 @@ static void conference_onConferencePeerNameChange(ToxWindow *self, Tox *m, uint3
|
|||||||
|
|
||||||
const ConferencePeer *peer = peer_in_conference(conferencenum, peernum);
|
const ConferencePeer *peer = peer_in_conference(conferencenum, peernum);
|
||||||
|
|
||||||
if (peer != NULL && peer->name_length > 0) {
|
if (peer != NULL) {
|
||||||
ChatContext *ctx = self->chatwin;
|
ChatContext *ctx = self->chatwin;
|
||||||
|
|
||||||
char timefrmt[TIME_STR_SIZE];
|
char timefrmt[TIME_STR_SIZE];
|
||||||
get_time_str(timefrmt, sizeof(timefrmt));
|
get_time_str(timefrmt, sizeof(timefrmt));
|
||||||
|
|
||||||
char tmp_event[TOXIC_MAX_NAME_LENGTH * 2 + 32];
|
if (peer->name_length > 0) {
|
||||||
snprintf(tmp_event, sizeof(tmp_event), "is now known as %s", (const char *) name);
|
char log_event[TOXIC_MAX_NAME_LENGTH * 2 + 32];
|
||||||
|
|
||||||
write_to_log(tmp_event, peer->name, ctx->log, true);
|
|
||||||
line_info_add(self, timefrmt, peer->name, (const char *) name, NAME_CHANGE, 0, 0, " is now known as ");
|
line_info_add(self, timefrmt, peer->name, (const char *) name, NAME_CHANGE, 0, 0, " is now known as ");
|
||||||
|
|
||||||
|
snprintf(log_event, sizeof(log_event), "is now known as %s", (const char *) name);
|
||||||
|
write_to_log(log_event, peer->name, ctx->log, true);
|
||||||
|
|
||||||
|
} else { // this is kind of a hack; peers always join a group with no name set and then set it after
|
||||||
|
const char *msg = "has joined the group";
|
||||||
|
line_info_add(self, timefrmt, name, NULL, CONNECTION, 0, GREEN, msg);
|
||||||
|
write_to_log(msg, name, ctx->log, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
conference_onConferenceNameListChange(self, m, conferencenum);
|
conference_onConferenceNameListChange(self, m, conferencenum);
|
||||||
@ -1124,7 +1159,6 @@ static void conference_onDraw(ToxWindow *self, Tox *m)
|
|||||||
mvwaddch(ctx->sidebar, line, 0, ACS_LTEE);
|
mvwaddch(ctx->sidebar, line, 0, ACS_LTEE);
|
||||||
mvwhline(ctx->sidebar, line, 1, ACS_HLINE, SIDEBAR_WIDTH - 1);
|
mvwhline(ctx->sidebar, line, 1, ACS_HLINE, SIDEBAR_WIDTH - 1);
|
||||||
wattroff(ctx->sidebar, COLOR_PAIR(BLUE));
|
wattroff(ctx->sidebar, COLOR_PAIR(BLUE));
|
||||||
|
|
||||||
++line;
|
++line;
|
||||||
|
|
||||||
for (uint32_t i = 0;
|
for (uint32_t i = 0;
|
||||||
|
@ -26,10 +26,8 @@
|
|||||||
#include "toxic.h"
|
#include "toxic.h"
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
#define SIDEBAR_WIDTH 16
|
|
||||||
#define MAX_CONFERENCE_NUM (MAX_WINDOWS_NUM - 2)
|
|
||||||
#define CONFERENCE_EVENT_WAIT 3
|
|
||||||
#define CONFERENCE_MAX_TITLE_LENGTH TOX_MAX_NAME_LENGTH
|
#define CONFERENCE_MAX_TITLE_LENGTH TOX_MAX_NAME_LENGTH
|
||||||
|
#define SIDEBAR_WIDTH 16
|
||||||
|
|
||||||
typedef struct ConferencePeer {
|
typedef struct ConferencePeer {
|
||||||
bool active;
|
bool active;
|
||||||
|
@ -1100,9 +1100,9 @@ static void friendlist_onDraw(ToxWindow *self, Tox *m)
|
|||||||
int num_selected = Friends.num_selected;
|
int num_selected = Friends.num_selected;
|
||||||
pthread_mutex_unlock(&Winthread.lock);
|
pthread_mutex_unlock(&Winthread.lock);
|
||||||
|
|
||||||
|
if (is_active) {
|
||||||
bool f_selected = false;
|
bool f_selected = false;
|
||||||
|
|
||||||
if (is_active) {
|
|
||||||
if (i == num_selected) {
|
if (i == num_selected) {
|
||||||
wattron(self->window, A_BOLD);
|
wattron(self->window, A_BOLD);
|
||||||
wprintw(self->window, " > ");
|
wprintw(self->window, " > ");
|
||||||
|
@ -54,7 +54,7 @@ void line_info_reset_start(ToxWindow *self, struct history *hst)
|
|||||||
{
|
{
|
||||||
struct line_info *line = hst->line_end;
|
struct line_info *line = hst->line_end;
|
||||||
|
|
||||||
if (line->prev == NULL) {
|
if (line == NULL || line->prev == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user