1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-11-03 19:37:16 -05:00

Use events for chat sessions

This commit is contained in:
James Booth 2014-12-29 01:17:59 +00:00
parent 4be06c0ae2
commit 10a3a3a675
9 changed files with 152 additions and 152 deletions

View File

@ -38,9 +38,9 @@
#include <glib.h>
#include "chat_session.h"
#include "config/preferences.h"
#include "log.h"
#include "xmpp/xmpp.h"
#define PAUSED_TIMOUT 10.0
#define INACTIVE_TIMOUT 30.0
@ -65,6 +65,19 @@ typedef struct chat_session_t {
static GHashTable *sessions;
static void _chat_session_new(const char * const recipient, gboolean recipient_supports);
static gboolean _chat_session_exists(const char * const recipient);
static void _chat_session_set_composing(const char * const recipient);
static void _chat_session_set_sent(const char * const recipient);
static gboolean _chat_session_get_sent(const char * const recipient);
static void _chat_session_end(const char * const recipient);
static gboolean _chat_session_is_inactive(const char * const recipient);
static void _chat_session_set_active(const char * const recipient);
static gboolean _chat_session_is_paused(const char * const recipient);
static gboolean _chat_session_is_gone(const char * const recipient);
static void _chat_session_set_gone(const char * const recipient);
static gboolean _chat_session_get_recipient_supports(const char * const recipient);
static void _chat_session_set_recipient_supports(const char * const recipient, gboolean recipient_supports);
static void _chat_session_free(ChatSession *session);
void
@ -81,8 +94,8 @@ chat_sessions_clear(void)
g_hash_table_remove_all(sessions);
}
void
chat_session_new(const char * const recipient, gboolean recipient_supports)
static void
_chat_session_new(const char * const recipient, gboolean recipient_supports)
{
ChatSession *new_session = malloc(sizeof(struct chat_session_t));
new_session->recipient = strdup(recipient);
@ -93,8 +106,8 @@ chat_session_new(const char * const recipient, gboolean recipient_supports)
g_hash_table_insert(sessions, strdup(recipient), new_session);
}
gboolean
chat_session_exists(const char * const recipient)
static gboolean
_chat_session_exists(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -105,8 +118,8 @@ chat_session_exists(const char * const recipient)
}
}
void
chat_session_set_composing(const char * const recipient)
static void
_chat_session_set_composing(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -119,40 +132,8 @@ chat_session_set_composing(const char * const recipient)
}
}
void
chat_session_no_activity(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
if (session != NULL) {
if (session->active_timer != NULL) {
gdouble elapsed = g_timer_elapsed(session->active_timer, NULL);
if ((prefs_get_gone() != 0) && (elapsed > (prefs_get_gone() * 60.0))) {
if (session->state != CHAT_STATE_GONE) {
session->sent = FALSE;
}
session->state = CHAT_STATE_GONE;
} else if (elapsed > INACTIVE_TIMOUT) {
if (session->state != CHAT_STATE_INACTIVE) {
session->sent = FALSE;
}
session->state = CHAT_STATE_INACTIVE;
} else if (elapsed > PAUSED_TIMOUT) {
if (session->state == CHAT_STATE_COMPOSING) {
session->sent = FALSE;
session->state = CHAT_STATE_PAUSED;
}
}
}
}
}
void
chat_session_set_sent(const char * const recipient)
static void
_chat_session_set_sent(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -161,8 +142,8 @@ chat_session_set_sent(const char * const recipient)
}
}
gboolean
chat_session_get_sent(const char * const recipient)
static gboolean
_chat_session_get_sent(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -173,14 +154,14 @@ chat_session_get_sent(const char * const recipient)
}
}
void
chat_session_end(const char * const recipient)
static void
_chat_session_end(const char * const recipient)
{
g_hash_table_remove(sessions, recipient);
}
gboolean
chat_session_is_inactive(const char * const recipient)
static gboolean
_chat_session_is_inactive(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -191,8 +172,8 @@ chat_session_is_inactive(const char * const recipient)
}
}
void
chat_session_set_active(const char * const recipient)
static void
_chat_session_set_active(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -203,8 +184,8 @@ chat_session_set_active(const char * const recipient)
}
}
gboolean
chat_session_is_paused(const char * const recipient)
static gboolean
_chat_session_is_paused(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -215,8 +196,8 @@ chat_session_is_paused(const char * const recipient)
}
}
gboolean
chat_session_is_gone(const char * const recipient)
static gboolean
_chat_session_is_gone(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -227,8 +208,8 @@ chat_session_is_gone(const char * const recipient)
}
}
void
chat_session_set_gone(const char * const recipient)
static void
_chat_session_set_gone(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -237,8 +218,8 @@ chat_session_set_gone(const char * const recipient)
}
}
gboolean
chat_session_get_recipient_supports(const char * const recipient)
static gboolean
_chat_session_get_recipient_supports(const char * const recipient)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -249,9 +230,8 @@ chat_session_get_recipient_supports(const char * const recipient)
}
}
void
chat_session_set_recipient_supports(const char * const recipient,
gboolean recipient_supports)
static void
_chat_session_set_recipient_supports(const char * const recipient, gboolean recipient_supports)
{
ChatSession *session = g_hash_table_lookup(sessions, recipient);
@ -265,11 +245,11 @@ chat_session_on_message_send(const char * const barejid)
{
gboolean send_state = FALSE;
if (prefs_get_boolean(PREF_STATES)) {
if (!chat_session_exists(barejid)) {
chat_session_new(barejid, TRUE);
if (!_chat_session_exists(barejid)) {
_chat_session_new(barejid, TRUE);
}
if (chat_session_get_recipient_supports(barejid)) {
chat_session_set_active(barejid);
if (_chat_session_get_recipient_supports(barejid)) {
_chat_session_set_active(barejid);
send_state = TRUE;
}
}
@ -280,10 +260,10 @@ chat_session_on_message_send(const char * const barejid)
void
chat_session_on_incoming_message(const char * const barejid, gboolean recipient_supports)
{
if (!chat_session_exists(barejid)) {
chat_session_new(barejid, recipient_supports);
if (!_chat_session_exists(barejid)) {
_chat_session_new(barejid, recipient_supports);
} else {
chat_session_set_recipient_supports(barejid, recipient_supports);
_chat_session_set_recipient_supports(barejid, recipient_supports);
}
}
@ -291,8 +271,86 @@ void
chat_session_on_window_open(const char * const barejid)
{
if (prefs_get_boolean(PREF_STATES)) {
if (!chat_session_exists(barejid)) {
chat_session_new(barejid, TRUE);
if (!_chat_session_exists(barejid)) {
_chat_session_new(barejid, TRUE);
}
}
}
void
chat_session_on_window_close(const char * const barejid)
{
if (prefs_get_boolean(PREF_STATES)) {
// send <gone/> chat state before closing
if (_chat_session_get_recipient_supports(barejid)) {
_chat_session_set_gone(barejid);
message_send_gone(barejid);
_chat_session_set_sent(barejid);
_chat_session_end(barejid);
}
}
}
void
chat_session_on_cancel(const char * const jid)
{
if (prefs_get_boolean(PREF_STATES) && _chat_session_exists(jid)) {
_chat_session_set_recipient_supports(jid, FALSE);
}
}
void
chat_session_on_activity(const char * const barejid)
{
if (_chat_session_get_recipient_supports(barejid)) {
_chat_session_set_composing(barejid);
if (!_chat_session_get_sent(barejid) || _chat_session_is_paused(barejid)) {
message_send_composing(barejid);
_chat_session_set_sent(barejid);
}
}
}
void
chat_session_on_inactivity(const char * const barejid)
{
if (_chat_session_get_recipient_supports(barejid)) {
ChatSession *session = g_hash_table_lookup(sessions, barejid);
if (session != NULL) {
if (session->active_timer != NULL) {
gdouble elapsed = g_timer_elapsed(session->active_timer, NULL);
if ((prefs_get_gone() != 0) && (elapsed > (prefs_get_gone() * 60.0))) {
if (session->state != CHAT_STATE_GONE) {
session->sent = FALSE;
}
session->state = CHAT_STATE_GONE;
} else if (elapsed > INACTIVE_TIMOUT) {
if (session->state != CHAT_STATE_INACTIVE) {
session->sent = FALSE;
}
session->state = CHAT_STATE_INACTIVE;
} else if (elapsed > PAUSED_TIMOUT) {
if (session->state == CHAT_STATE_COMPOSING) {
session->sent = FALSE;
session->state = CHAT_STATE_PAUSED;
}
}
}
}
if (_chat_session_is_gone(barejid) && !_chat_session_get_sent(barejid)) {
message_send_gone(barejid);
_chat_session_set_sent(barejid);
} else if (_chat_session_is_inactive(barejid) && !_chat_session_get_sent(barejid)) {
message_send_inactive(barejid);
_chat_session_set_sent(barejid);
} else if (prefs_get_boolean(PREF_OUTTYPE) && _chat_session_is_paused(barejid) && !_chat_session_get_sent(barejid)) {
message_send_paused(barejid);
_chat_session_set_sent(barejid);
}
}
}

View File

@ -39,25 +39,12 @@
void chat_sessions_init(void);
void chat_sessions_clear(void);
void chat_session_new(const char * const recipient,
gboolean recipient_supports);
gboolean chat_session_exists(const char * const recipient);
void chat_session_end(const char * const recipient);
gboolean chat_session_get_recipient_supports(const char * const recipient);
void chat_session_set_recipient_supports(const char * const recipient,
gboolean recipient_supports);
void chat_session_set_composing(const char * const recipient);
void chat_session_no_activity(const char * const recipient);
gboolean chat_session_is_inactive(const char * const recipient);
void chat_session_set_active(const char * const recipient);
gboolean chat_session_is_paused(const char * const recipient);
gboolean chat_session_is_gone(const char * const recipient);
void chat_session_set_gone(const char * const recipient);
void chat_session_set_sent(const char * const recipient);
gboolean chat_session_get_sent(const char * const recipient);
gboolean chat_session_on_message_send(const char * const barejid);
void chat_session_on_window_open(const char * const barejid);
void chat_session_on_window_close(const char * const barejid);
void chat_session_on_incoming_message(const char * const barejid, gboolean recipient_supports);
void chat_session_on_cancel(const char * const jid);
void chat_session_on_activity(const char * const barejid);
void chat_session_on_inactivity(const char * const recipient);
#endif

View File

@ -137,31 +137,12 @@ prof_handle_idle(void)
{
jabber_conn_status_t status = jabber_get_connection_status();
if (status == JABBER_CONNECTED) {
// TODO get chat only recipients
GSList *recipients = ui_get_recipients();
GSList *recipients = ui_get_chat_recipients();
GSList *curr = recipients;
while (curr != NULL) {
char *recipient = curr->data;
if (chat_session_get_recipient_supports(recipient)) {
chat_session_no_activity(recipient);
if (chat_session_is_gone(recipient) &&
!chat_session_get_sent(recipient)) {
message_send_gone(recipient);
chat_session_set_sent(recipient);
} else if (chat_session_is_inactive(recipient) &&
!chat_session_get_sent(recipient)) {
message_send_inactive(recipient);
chat_session_set_sent(recipient);
} else if (prefs_get_boolean(PREF_OUTTYPE) &&
chat_session_is_paused(recipient) &&
!chat_session_get_sent(recipient)) {
message_send_paused(recipient);
chat_session_set_sent(recipient);
}
}
char *barejid = curr->data;
chat_session_on_inactivity(barejid);
curr = g_slist_next(curr);
}
@ -179,14 +160,7 @@ prof_handle_activity(void)
if ((status == JABBER_CONNECTED) && (win_type == WIN_CHAT)) {
ProfChatWin *chatwin = wins_get_current_chat();
if (chat_session_get_recipient_supports(chatwin->barejid)) {
chat_session_set_composing(chatwin->barejid);
if (!chat_session_get_sent(chatwin->barejid) ||
chat_session_is_paused(chatwin->barejid)) {
message_send_composing(chatwin->barejid);
chat_session_set_sent(chatwin->barejid);
}
}
chat_session_on_activity(chatwin->barejid);
}
}

View File

@ -77,23 +77,21 @@ handle_presence_error(const char *from, const char * const type,
// handle message stanza errors
void
handle_message_error(const char * const from, const char * const type,
handle_message_error(const char * const jid, const char * const type,
const char * const err_msg)
{
// handle errors from no recipient
if (from == NULL) {
if (jid == NULL) {
ui_handle_error(err_msg);
// handle recipient not found ('from' contains a value and type is 'cancel')
} else if (type != NULL && (strcmp(type, "cancel") == 0)) {
ui_handle_recipient_not_found(from, err_msg);
if (prefs_get_boolean(PREF_STATES) && chat_session_exists(from)) {
chat_session_set_recipient_supports(from, FALSE);
}
ui_handle_recipient_not_found(jid, err_msg);
chat_session_on_cancel(jid);
// handle any other error from recipient
} else {
ui_handle_recipient_error(from, err_msg);
ui_handle_recipient_error(jid, err_msg);
}
}

View File

@ -315,7 +315,7 @@ ui_contact_typing(const char * const barejid)
}
GSList *
ui_get_recipients(void)
ui_get_chat_recipients(void)
{
GSList *recipients = wins_get_chat_recipients();
return recipients;
@ -705,15 +705,7 @@ ui_close_connected_win(int index)
otr_end_session(chatwin->barejid);
}
#endif
if (prefs_get_boolean(PREF_STATES)) {
// send <gone/> chat state before closing
if (chat_session_get_recipient_supports(chatwin->barejid)) {
chat_session_set_gone(chatwin->barejid);
message_send_gone(chatwin->barejid);
chat_session_set_sent(chatwin->barejid);
chat_session_end(chatwin->barejid);
}
}
chat_session_on_window_close(chatwin->barejid);
}
}
}
@ -1169,17 +1161,8 @@ ui_prune_wins(void)
ProfWin *window = curr->data;
if (window->type == WIN_CHAT) {
if (conn_status == JABBER_CONNECTED) {
if (prefs_get_boolean(PREF_STATES)) {
ProfChatWin *chatwin = (ProfChatWin*)window;
// send <gone/> chat state before closing
if (chat_session_get_recipient_supports(chatwin->barejid)) {
chat_session_set_gone(chatwin->barejid);
message_send_gone(chatwin->barejid);
chat_session_set_sent(chatwin->barejid);
chat_session_end(chatwin->barejid);
}
}
ProfChatWin *chatwin = (ProfChatWin*)window;
chat_session_on_window_close(chatwin->barejid);
}
}

View File

@ -60,7 +60,7 @@ void ui_update(void);
void ui_close(void);
void ui_redraw(void);
void ui_resize(void);
GSList* ui_get_recipients(void);
GSList* ui_get_chat_recipients(void);
void ui_handle_special_keys(const wint_t * const ch, const int result);
gboolean ui_switch_win(const int i);
void ui_next_win(void);

View File

@ -201,7 +201,7 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
void * const userdata)
{
char *id = xmpp_stanza_get_id(stanza);
char *from = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
char *jid = xmpp_stanza_get_attribute(stanza, STANZA_ATTR_FROM);
xmpp_stanza_t *error_stanza = xmpp_stanza_get_child_by_name(stanza, STANZA_NAME_ERROR);
char *type = NULL;
if (error_stanza != NULL) {
@ -216,9 +216,9 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
g_string_append(log_msg, " id=");
g_string_append(log_msg, id);
}
if (from != NULL) {
if (jid != NULL) {
g_string_append(log_msg, " from=");
g_string_append(log_msg, from);
g_string_append(log_msg, jid);
}
if (type != NULL) {
g_string_append(log_msg, " type=");
@ -231,7 +231,7 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
g_string_free(log_msg, TRUE);
handle_message_error(from, type, err_msg);
handle_message_error(jid, type, err_msg);
free(err_msg);

View File

@ -134,13 +134,13 @@ void handle_message_error_when_recipient_cancel_disables_chat_session(void **sta
prefs_set_boolean(PREF_STATES, TRUE);
chat_sessions_init();
chat_session_new(from, TRUE);
chat_session_on_incoming_message(from, TRUE);
expect_any(ui_handle_recipient_not_found, recipient);
expect_any(ui_handle_recipient_not_found, err_msg);
handle_message_error(from, type, err_msg);
gboolean chat_session_supported = chat_session_get_recipient_supports(from);
gboolean chat_session_supported = chat_session_on_message_send(from);
assert_false(chat_session_supported);
chat_sessions_clear();

View File

@ -47,7 +47,7 @@ void ui_update(void) {}
void ui_close(void) {}
void ui_redraw(void) {}
void ui_resize(void) {}
GSList* ui_get_recipients(void)
GSList* ui_get_chat_recipients(void)
{
return NULL;
}