mirror of
https://github.com/profanity-im/profanity.git
synced 2025-01-03 14:57:42 -05:00
Add XEP-0280 support
This commit is contained in:
parent
5b26879e31
commit
e3feacddd6
@ -296,6 +296,11 @@ handle_incoming_private_message(char *fulljid, char *message)
|
||||
ui_incoming_private_msg(fulljid, message, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
handle_carbon(char *barejid, char *message){
|
||||
ui_outgoing_chat_msg("me", barejid, message);
|
||||
}
|
||||
|
||||
void
|
||||
handle_incoming_message(char *barejid, char *resource, char *message)
|
||||
{
|
||||
|
@ -101,6 +101,7 @@ void handle_group_remove(const char * const contact,
|
||||
void handle_roster_remove(const char * const barejid);
|
||||
void handle_roster_add(const char * const barejid, const char * const name);
|
||||
void handle_autoping_cancel(void);
|
||||
void handle_carbon(char *barejid, char *message);
|
||||
void handle_message_error(const char * const from, const char * const type,
|
||||
const char * const err_msg);
|
||||
void handle_presence_error(const char *from, const char * const type,
|
||||
|
@ -463,6 +463,7 @@ _connection_handler(xmpp_conn_t * const conn,
|
||||
message_add_handlers();
|
||||
presence_add_handlers();
|
||||
iq_add_handlers();
|
||||
iq_enable_carbons();
|
||||
|
||||
roster_request();
|
||||
bookmark_request();
|
||||
|
@ -152,6 +152,16 @@ iq_room_list_request(gchar *conferencejid)
|
||||
xmpp_stanza_release(iq);
|
||||
}
|
||||
|
||||
void
|
||||
iq_enable_carbons()
|
||||
{
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_enable_carbons(ctx);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
}
|
||||
|
||||
void
|
||||
iq_disco_info_request(gchar *jid)
|
||||
{
|
||||
|
@ -423,6 +423,44 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
return 1;
|
||||
}
|
||||
|
||||
// check if carbon message
|
||||
xmpp_stanza_t *received = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CARBONS);
|
||||
if(received != NULL){
|
||||
xmpp_stanza_t *forwarded = xmpp_stanza_get_child_by_ns(received, STANZA_NS_FORWARD);
|
||||
xmpp_stanza_t *message = xmpp_stanza_get_child_by_name(forwarded, STANZA_NAME_MESSAGE);
|
||||
|
||||
xmpp_ctx_t *ctx = connection_get_ctx();
|
||||
|
||||
gchar *to = xmpp_stanza_get_attribute(message, STANZA_ATTR_TO);
|
||||
gchar *from = xmpp_stanza_get_attribute(message, STANZA_ATTR_FROM);
|
||||
|
||||
Jid *jid_from = jid_create(from);
|
||||
Jid *jid_to = jid_create(to);
|
||||
Jid *my_jid = jid_create(jabber_get_fulljid());
|
||||
|
||||
// check for and deal with message
|
||||
xmpp_stanza_t *body = xmpp_stanza_get_child_by_name(message, STANZA_NAME_BODY);
|
||||
if (body != NULL) {
|
||||
char *message = xmpp_stanza_get_text(body);
|
||||
if (message != NULL) {
|
||||
// if we are the recipient, treat as standard incoming message
|
||||
if(g_strcmp0(my_jid->barejid, jid_to->barejid) == 0){
|
||||
handle_incoming_message(jid_from->barejid, jid_from->resourcepart, message);
|
||||
}
|
||||
// else treat as a sent message
|
||||
else{
|
||||
handle_carbon(jid_to->barejid, message);
|
||||
}
|
||||
xmpp_free(ctx, message);
|
||||
}
|
||||
}
|
||||
|
||||
jid_destroy(jid_from);
|
||||
jid_destroy(jid_to);
|
||||
jid_destroy(my_jid);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ignore handled namespaces
|
||||
xmpp_stanza_t *conf = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_CONFERENCE);
|
||||
xmpp_stanza_t *mucuser = xmpp_stanza_get_child_by_ns(stanza, STANZA_NS_MUC_USER);
|
||||
|
@ -198,6 +198,24 @@ stanza_create_bookmarks_pubsub_add(xmpp_ctx_t *ctx, const char * const jid,
|
||||
}
|
||||
#endif
|
||||
|
||||
xmpp_stanza_t *
|
||||
stanza_enable_carbons(xmpp_ctx_t *ctx){
|
||||
xmpp_stanza_t *iq = xmpp_stanza_new(ctx);
|
||||
char *id = create_unique_id(NULL);
|
||||
|
||||
xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
|
||||
xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
|
||||
xmpp_stanza_set_id(iq, id);
|
||||
|
||||
xmpp_stanza_t *carbon_enable = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(carbon_enable, STANZA_NAME_ENABLE);
|
||||
xmpp_stanza_set_ns(carbon_enable, STANZA_NS_CARBONS);
|
||||
|
||||
xmpp_stanza_add_child(iq, carbon_enable);
|
||||
|
||||
return iq;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *
|
||||
stanza_create_chat_state(xmpp_ctx_t *ctx, const char * const fulljid, const char * const state)
|
||||
{
|
||||
|
@ -77,6 +77,7 @@
|
||||
#define STANZA_NAME_VALUE "value"
|
||||
#define STANZA_NAME_DESTROY "destroy"
|
||||
#define STANZA_NAME_ACTOR "actor"
|
||||
#define STANZA_NAME_ENABLE "enable"
|
||||
|
||||
// error conditions
|
||||
#define STANZA_NAME_BAD_REQUEST "bad-request"
|
||||
@ -154,6 +155,8 @@
|
||||
#define STANZA_NS_CONFERENCE "jabber:x:conference"
|
||||
#define STANZA_NS_CAPTCHA "urn:xmpp:captcha"
|
||||
#define STANZA_NS_PUBSUB "http://jabber.org/protocol/pubsub"
|
||||
#define STANZA_NS_CARBONS "urn:xmpp:carbons:2"
|
||||
#define STANZA_NS_FORWARD "urn:xmpp:forward:0"
|
||||
|
||||
#define STANZA_DATAFORM_SOFTWARE "urn:xmpp:dataforms:softwareinfo"
|
||||
|
||||
@ -178,6 +181,8 @@ typedef enum {
|
||||
|
||||
xmpp_stanza_t* stanza_create_bookmarks_storage_request(xmpp_ctx_t *ctx);
|
||||
|
||||
xmpp_stanza_t * stanza_enable_carbons(xmpp_ctx_t *ctx);
|
||||
|
||||
xmpp_stanza_t* stanza_create_chat_state(xmpp_ctx_t *ctx,
|
||||
const char * const fulljid, const char * const state);
|
||||
|
||||
|
@ -172,6 +172,7 @@ void presence_update(resource_presence_t status, const char * const msg,
|
||||
gboolean presence_sub_request_exists(const char * const bare_jid);
|
||||
|
||||
// iq functions
|
||||
void iq_enable_carbons();
|
||||
void iq_send_software_version(const char * const fulljid);
|
||||
void iq_room_list_request(gchar *conferencejid);
|
||||
void iq_disco_info_request(gchar *jid);
|
||||
|
Loading…
Reference in New Issue
Block a user