mirror of
https://github.com/profanity-im/profanity.git
synced 2024-12-04 14:46:46 -05:00
Moved functions to xmpp_presence
This commit is contained in:
parent
7255ef5e1c
commit
bfe1d76e5f
@ -1835,7 +1835,7 @@ _cmd_join(gchar **args, struct cmd_help_t help)
|
||||
Jid *room_jid = jid_create_from_bare_and_resource(room, nick);
|
||||
|
||||
if (!muc_room_is_active(room_jid)) {
|
||||
jabber_join(room_jid);
|
||||
presence_join_room(room_jid);
|
||||
}
|
||||
win_join_chat(room_jid);
|
||||
|
||||
@ -1858,7 +1858,7 @@ _cmd_nick(gchar **args, struct cmd_help_t help)
|
||||
|
||||
char *room = win_current_get_recipient();
|
||||
char *nick = args[0];
|
||||
jabber_change_room_nick(room, nick);
|
||||
presence_change_room_nick(room, nick);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
@ -1927,7 +1927,7 @@ _cmd_close(gchar **args, struct cmd_help_t help)
|
||||
if (conn_status == JABBER_CONNECTED) {
|
||||
if (win_current_is_groupchat()) {
|
||||
char *room_jid = win_current_get_recipient();
|
||||
jabber_leave_chat_room(room_jid);
|
||||
presence_leave_chat_room(room_jid);
|
||||
} else if (win_current_is_chat() || win_current_is_private()) {
|
||||
|
||||
if (prefs_get_states()) {
|
||||
@ -2180,7 +2180,7 @@ _cmd_set_priority(gchar **args, struct cmd_help_t help)
|
||||
char *status = jabber_get_status();
|
||||
prefs_set_priority((int)intval);
|
||||
// update presence with new priority
|
||||
jabber_update_presence(jabber_get_presence(), status, 0);
|
||||
presence_update(jabber_get_presence(), status, 0);
|
||||
cons_show("Priority set to %d.", intval);
|
||||
}
|
||||
|
||||
@ -2302,7 +2302,7 @@ _update_presence(const jabber_presence_t presence,
|
||||
if (conn_status != JABBER_CONNECTED) {
|
||||
cons_show("You are not currently connected.");
|
||||
} else {
|
||||
jabber_update_presence(presence, msg, 0);
|
||||
presence_update(presence, msg, 0);
|
||||
title_bar_set_status(presence);
|
||||
if (msg != NULL) {
|
||||
cons_show("Status set to %s, \"%s\"", show, msg);
|
||||
|
@ -469,7 +469,7 @@ _handle_idle_time()
|
||||
|
||||
// handle away mode
|
||||
if (strcmp(prefs_get_autoaway_mode(), "away") == 0) {
|
||||
jabber_update_presence(PRESENCE_AWAY, prefs_get_autoaway_message(), 0);
|
||||
presence_update(PRESENCE_AWAY, prefs_get_autoaway_message(), 0);
|
||||
if (prefs_get_autoaway_message() != NULL) {
|
||||
cons_show("Idle for %d minutes, status set to away, \"%s\".",
|
||||
prefs_get_autoaway_time(), prefs_get_autoaway_message());
|
||||
@ -484,7 +484,7 @@ _handle_idle_time()
|
||||
|
||||
// handle idle mode
|
||||
} else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) {
|
||||
jabber_update_presence(PRESENCE_ONLINE,
|
||||
presence_update(PRESENCE_ONLINE,
|
||||
prefs_get_autoaway_message(), idle_ms / 1000);
|
||||
}
|
||||
}
|
||||
@ -496,12 +496,12 @@ _handle_idle_time()
|
||||
// handle check
|
||||
if (prefs_get_autoaway_check()) {
|
||||
if (strcmp(prefs_get_autoaway_mode(), "away") == 0) {
|
||||
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
|
||||
presence_update(PRESENCE_ONLINE, NULL, 0);
|
||||
cons_show("No longer idle, status set to online.");
|
||||
title_bar_set_status(PRESENCE_ONLINE);
|
||||
win_current_page_off();
|
||||
} else if (strcmp(prefs_get_autoaway_mode(), "idle") == 0) {
|
||||
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
|
||||
presence_update(PRESENCE_ONLINE, NULL, 0);
|
||||
title_bar_set_status(PRESENCE_ONLINE);
|
||||
}
|
||||
}
|
||||
|
14
src/xmpp.h
14
src/xmpp.h
@ -146,17 +146,12 @@ jabber_conn_status_t jabber_connect_with_account(ProfAccount *account,
|
||||
const char * const passwd);
|
||||
void jabber_disconnect(void);
|
||||
void jabber_process_events(void);
|
||||
void jabber_join(Jid *jid);
|
||||
void jabber_change_room_nick(const char * const room, const char * const nick);
|
||||
void jabber_leave_chat_room(const char * const room_jid);
|
||||
void jabber_send(const char * const msg, const char * const recipient);
|
||||
void jabber_send_groupchat(const char * const msg, const char * const recipient);
|
||||
void jabber_send_inactive(const char * const recipient);
|
||||
void jabber_send_composing(const char * const recipient);
|
||||
void jabber_send_paused(const char * const recipient);
|
||||
void jabber_send_gone(const char * const recipient);
|
||||
void jabber_update_presence(jabber_presence_t status, const char * const msg,
|
||||
int idle);
|
||||
const char * jabber_get_jid(void);
|
||||
jabber_conn_status_t jabber_get_connection_status(void);
|
||||
int jabber_get_priority(void);
|
||||
@ -168,6 +163,10 @@ void jabber_set_autoping(int seconds);
|
||||
xmpp_conn_t *jabber_get_conn(void);
|
||||
xmpp_ctx_t *jabber_get_ctx(void);
|
||||
int error_handler(xmpp_stanza_t * const stanza);
|
||||
void jabber_conn_set_presence(jabber_presence_t presence);
|
||||
void jabber_conn_set_priority(int priority);
|
||||
void jabber_conn_set_status(const char * const message);
|
||||
char* jabber_get_account_name(void);
|
||||
|
||||
// iq functions
|
||||
void iq_add_handlers(xmpp_conn_t * const conn, xmpp_ctx_t * const ctx);
|
||||
@ -179,6 +178,11 @@ GList* presence_get_subscription_requests(void);
|
||||
void presence_free_sub_requests(void);
|
||||
int presence_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata);
|
||||
void presence_join_room(Jid *jid);
|
||||
void presence_change_room_nick(const char * const room, const char * const nick);
|
||||
void presence_leave_chat_room(const char * const room_jid);
|
||||
void presence_update(jabber_presence_t status, const char * const msg,
|
||||
int idle);
|
||||
|
||||
// caps functions
|
||||
void caps_init(void);
|
||||
|
170
src/xmpp_conn.c
170
src/xmpp_conn.c
@ -318,149 +318,6 @@ jabber_send_gone(const char * const recipient)
|
||||
chat_session_set_sent(recipient);
|
||||
}
|
||||
|
||||
void
|
||||
jabber_join(Jid *jid)
|
||||
{
|
||||
xmpp_stanza_t *presence = stanza_create_room_join_presence(jabber_conn.ctx,
|
||||
jid->fulljid);
|
||||
xmpp_send(jabber_conn.conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
muc_join_room(jid->barejid, jid->resourcepart);
|
||||
}
|
||||
|
||||
void
|
||||
jabber_change_room_nick(const char * const room, const char * const nick)
|
||||
{
|
||||
char *full_room_jid = create_fulljid(room, nick);
|
||||
xmpp_stanza_t *presence = stanza_create_room_newnick_presence(jabber_conn.ctx,
|
||||
full_room_jid);
|
||||
xmpp_send(jabber_conn.conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
free(full_room_jid);
|
||||
}
|
||||
|
||||
void
|
||||
jabber_leave_chat_room(const char * const room_jid)
|
||||
{
|
||||
char *nick = muc_get_room_nick(room_jid);
|
||||
|
||||
xmpp_stanza_t *presence = stanza_create_room_leave_presence(jabber_conn.ctx,
|
||||
room_jid, nick);
|
||||
xmpp_send(jabber_conn.conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
}
|
||||
|
||||
void
|
||||
jabber_update_presence(jabber_presence_t status, const char * const msg,
|
||||
int idle)
|
||||
{
|
||||
int pri;
|
||||
char *show, *last;
|
||||
|
||||
// don't send presence when disconnected
|
||||
if (jabber_conn.conn_status != JABBER_CONNECTED)
|
||||
return;
|
||||
|
||||
pri = prefs_get_priority();
|
||||
if (pri < JABBER_PRIORITY_MIN || pri > JABBER_PRIORITY_MAX)
|
||||
pri = 0;
|
||||
|
||||
jabber_conn.presence = status;
|
||||
jabber_conn.priority = pri;
|
||||
|
||||
switch(status)
|
||||
{
|
||||
case PRESENCE_AWAY:
|
||||
show = STANZA_TEXT_AWAY;
|
||||
last = STANZA_TEXT_AWAY;
|
||||
break;
|
||||
case PRESENCE_DND:
|
||||
show = STANZA_TEXT_DND;
|
||||
last = STANZA_TEXT_DND;
|
||||
break;
|
||||
case PRESENCE_CHAT:
|
||||
show = STANZA_TEXT_CHAT;
|
||||
last = STANZA_TEXT_CHAT;
|
||||
break;
|
||||
case PRESENCE_XA:
|
||||
show = STANZA_TEXT_XA;
|
||||
last = STANZA_TEXT_XA;
|
||||
break;
|
||||
default: // PRESENCE_ONLINE
|
||||
show = NULL;
|
||||
last = STANZA_TEXT_ONLINE;
|
||||
break;
|
||||
}
|
||||
|
||||
if (jabber_conn.status != NULL) {
|
||||
free(jabber_conn.status);
|
||||
jabber_conn.status = NULL;
|
||||
}
|
||||
if (msg != NULL)
|
||||
jabber_conn.status = strdup(msg);
|
||||
|
||||
xmpp_stanza_t *presence = stanza_create_presence(jabber_conn.ctx, show, msg);
|
||||
if (pri != 0) {
|
||||
xmpp_stanza_t *priority, *value;
|
||||
char pri_str[10];
|
||||
|
||||
snprintf(pri_str, sizeof(pri_str), "%d", pri);
|
||||
priority = xmpp_stanza_new(jabber_conn.ctx);
|
||||
value = xmpp_stanza_new(jabber_conn.ctx);
|
||||
xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY);
|
||||
xmpp_stanza_set_text(value, pri_str);
|
||||
xmpp_stanza_add_child(priority, value);
|
||||
xmpp_stanza_add_child(presence, priority);
|
||||
}
|
||||
|
||||
if (idle > 0) {
|
||||
xmpp_stanza_t *query = xmpp_stanza_new(jabber_conn.ctx);
|
||||
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
|
||||
xmpp_stanza_set_ns(query, STANZA_NS_LASTACTIVITY);
|
||||
char idle_str[10];
|
||||
snprintf(idle_str, sizeof(idle_str), "%d", idle);
|
||||
xmpp_stanza_set_attribute(query, STANZA_ATTR_SECONDS, idle_str);
|
||||
xmpp_stanza_add_child(presence, query);
|
||||
}
|
||||
|
||||
// add caps
|
||||
xmpp_stanza_t *caps = xmpp_stanza_new(jabber_conn.ctx);
|
||||
xmpp_stanza_set_name(caps, STANZA_NAME_C);
|
||||
xmpp_stanza_set_ns(caps, STANZA_NS_CAPS);
|
||||
xmpp_stanza_t *query = caps_create_query_response_stanza(jabber_conn.ctx);
|
||||
|
||||
char *sha1 = caps_create_sha1_str(query);
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_HASH, "sha-1");
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_NODE, "http://www.profanity.im");
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_VER, sha1);
|
||||
xmpp_stanza_add_child(presence, caps);
|
||||
|
||||
xmpp_send(jabber_conn.conn, presence);
|
||||
|
||||
// send presence for each room
|
||||
GList *rooms = muc_get_active_room_list();
|
||||
while (rooms != NULL) {
|
||||
char *room = rooms->data;
|
||||
char *nick = muc_get_room_nick(room);
|
||||
char *full_room_jid = create_fulljid(room, nick);
|
||||
|
||||
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
|
||||
xmpp_send(jabber_conn.conn, presence);
|
||||
|
||||
rooms = g_list_next(rooms);
|
||||
}
|
||||
g_list_free(rooms);
|
||||
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
FREE_SET_NULL(sha1);
|
||||
|
||||
// set last presence for account
|
||||
accounts_set_last_presence(saved_account.name, last);
|
||||
}
|
||||
|
||||
void
|
||||
jabber_set_autoping(int seconds)
|
||||
{
|
||||
@ -518,6 +375,33 @@ jabber_get_status(void)
|
||||
return jabber_conn.status;
|
||||
}
|
||||
|
||||
char *
|
||||
jabber_get_account_name(void)
|
||||
{
|
||||
return saved_account.name;
|
||||
}
|
||||
|
||||
void
|
||||
jabber_conn_set_presence(jabber_presence_t presence)
|
||||
{
|
||||
jabber_conn.presence = presence;
|
||||
}
|
||||
|
||||
void
|
||||
jabber_conn_set_status(const char * const message)
|
||||
{
|
||||
FREE_SET_NULL(jabber_conn.status);
|
||||
if (message != NULL) {
|
||||
jabber_conn.status = strdup(message);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
jabber_conn_set_priority(int priority)
|
||||
{
|
||||
jabber_conn.priority = priority;
|
||||
}
|
||||
|
||||
void
|
||||
jabber_free_resources(void)
|
||||
{
|
||||
|
@ -141,7 +141,7 @@ _iq_handle_roster_result(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
* presence rather than PRESENCE_ONLINE. It will be helpful
|
||||
* when I set dnd status and reconnect for some reason */
|
||||
// send initial presence
|
||||
jabber_update_presence(PRESENCE_ONLINE, NULL, 0);
|
||||
presence_update(PRESENCE_ONLINE, NULL, 0);
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
@ -25,8 +25,10 @@
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "common.h"
|
||||
#include "log.h"
|
||||
#include "muc.h"
|
||||
#include "preferences.h"
|
||||
#include "profanity.h"
|
||||
#include "xmpp.h"
|
||||
|
||||
@ -87,6 +89,151 @@ presence_free_sub_requests(void)
|
||||
g_hash_table_remove_all(sub_requests);
|
||||
}
|
||||
|
||||
void
|
||||
presence_join_room(Jid *jid)
|
||||
{
|
||||
xmpp_ctx_t *ctx = jabber_get_ctx();
|
||||
xmpp_conn_t *conn = jabber_get_conn();
|
||||
xmpp_stanza_t *presence = stanza_create_room_join_presence(ctx, jid->fulljid);
|
||||
xmpp_send(conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
muc_join_room(jid->barejid, jid->resourcepart);
|
||||
}
|
||||
|
||||
void
|
||||
presence_change_room_nick(const char * const room, const char * const nick)
|
||||
{
|
||||
xmpp_ctx_t *ctx = jabber_get_ctx();
|
||||
xmpp_conn_t *conn = jabber_get_conn();
|
||||
char *full_room_jid = create_fulljid(room, nick);
|
||||
xmpp_stanza_t *presence = stanza_create_room_newnick_presence(ctx, full_room_jid);
|
||||
xmpp_send(conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
free(full_room_jid);
|
||||
}
|
||||
|
||||
void
|
||||
presence_leave_chat_room(const char * const room_jid)
|
||||
{
|
||||
xmpp_ctx_t *ctx = jabber_get_ctx();
|
||||
xmpp_conn_t *conn = jabber_get_conn();
|
||||
char *nick = muc_get_room_nick(room_jid);
|
||||
|
||||
xmpp_stanza_t *presence = stanza_create_room_leave_presence(ctx, room_jid,
|
||||
nick);
|
||||
xmpp_send(conn, presence);
|
||||
xmpp_stanza_release(presence);
|
||||
}
|
||||
|
||||
void
|
||||
presence_update(jabber_presence_t status, const char * const msg,
|
||||
int idle)
|
||||
{
|
||||
xmpp_ctx_t *ctx = jabber_get_ctx();
|
||||
xmpp_conn_t *conn = jabber_get_conn();
|
||||
int pri;
|
||||
char *show, *last;
|
||||
|
||||
// don't send presence when disconnected
|
||||
if (jabber_get_connection_status() != JABBER_CONNECTED)
|
||||
return;
|
||||
|
||||
pri = prefs_get_priority();
|
||||
if (pri < JABBER_PRIORITY_MIN || pri > JABBER_PRIORITY_MAX)
|
||||
pri = 0;
|
||||
|
||||
jabber_conn_set_presence(status);
|
||||
jabber_conn_set_priority(pri);
|
||||
|
||||
switch(status)
|
||||
{
|
||||
case PRESENCE_AWAY:
|
||||
show = STANZA_TEXT_AWAY;
|
||||
last = STANZA_TEXT_AWAY;
|
||||
break;
|
||||
case PRESENCE_DND:
|
||||
show = STANZA_TEXT_DND;
|
||||
last = STANZA_TEXT_DND;
|
||||
break;
|
||||
case PRESENCE_CHAT:
|
||||
show = STANZA_TEXT_CHAT;
|
||||
last = STANZA_TEXT_CHAT;
|
||||
break;
|
||||
case PRESENCE_XA:
|
||||
show = STANZA_TEXT_XA;
|
||||
last = STANZA_TEXT_XA;
|
||||
break;
|
||||
default: // PRESENCE_ONLINE
|
||||
show = NULL;
|
||||
last = STANZA_TEXT_ONLINE;
|
||||
break;
|
||||
}
|
||||
|
||||
jabber_conn_set_status(msg);
|
||||
|
||||
xmpp_stanza_t *presence = stanza_create_presence(ctx, show, msg);
|
||||
if (pri != 0) {
|
||||
xmpp_stanza_t *priority, *value;
|
||||
char pri_str[10];
|
||||
|
||||
snprintf(pri_str, sizeof(pri_str), "%d", pri);
|
||||
priority = xmpp_stanza_new(ctx);
|
||||
value = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(priority, STANZA_NAME_PRIORITY);
|
||||
xmpp_stanza_set_text(value, pri_str);
|
||||
xmpp_stanza_add_child(priority, value);
|
||||
xmpp_stanza_add_child(presence, priority);
|
||||
}
|
||||
|
||||
if (idle > 0) {
|
||||
xmpp_stanza_t *query = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
|
||||
xmpp_stanza_set_ns(query, STANZA_NS_LASTACTIVITY);
|
||||
char idle_str[10];
|
||||
snprintf(idle_str, sizeof(idle_str), "%d", idle);
|
||||
xmpp_stanza_set_attribute(query, STANZA_ATTR_SECONDS, idle_str);
|
||||
xmpp_stanza_add_child(presence, query);
|
||||
}
|
||||
|
||||
// add caps
|
||||
xmpp_stanza_t *caps = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(caps, STANZA_NAME_C);
|
||||
xmpp_stanza_set_ns(caps, STANZA_NS_CAPS);
|
||||
xmpp_stanza_t *query = caps_create_query_response_stanza(ctx);
|
||||
|
||||
char *sha1 = caps_create_sha1_str(query);
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_HASH, "sha-1");
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_NODE, "http://www.profanity.im");
|
||||
xmpp_stanza_set_attribute(caps, STANZA_ATTR_VER, sha1);
|
||||
xmpp_stanza_add_child(presence, caps);
|
||||
|
||||
xmpp_send(conn, presence);
|
||||
|
||||
// send presence for each room
|
||||
GList *rooms = muc_get_active_room_list();
|
||||
while (rooms != NULL) {
|
||||
char *room = rooms->data;
|
||||
char *nick = muc_get_room_nick(room);
|
||||
char *full_room_jid = create_fulljid(room, nick);
|
||||
|
||||
xmpp_stanza_set_attribute(presence, STANZA_ATTR_TO, full_room_jid);
|
||||
xmpp_send(conn, presence);
|
||||
|
||||
rooms = g_list_next(rooms);
|
||||
}
|
||||
g_list_free(rooms);
|
||||
|
||||
xmpp_stanza_release(presence);
|
||||
|
||||
FREE_SET_NULL(sha1);
|
||||
|
||||
// set last presence for account
|
||||
accounts_set_last_presence(jabber_get_account_name(), last);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
presence_handler(xmpp_conn_t * const conn,
|
||||
xmpp_stanza_t * const stanza, void * const userdata)
|
||||
|
Loading…
Reference in New Issue
Block a user