mirror of
https://github.com/profanity-im/profanity.git
synced 2025-01-03 14:57:42 -05:00
Merge remote-tracking branch 'oliverlemoal/xep-0280' into xep-0280
This commit is contained in:
commit
945f29873e
@ -904,6 +904,15 @@ static struct cmd_t command_defs[] =
|
||||
"shared on|off : Share logs between all instances, default: on.",
|
||||
NULL } } },
|
||||
|
||||
{ "/carbons",
|
||||
cmd_carbons, parse_args, 1, 1, &cons_carbons_setting,
|
||||
{ "/carbons on|off", "Message carbons.",
|
||||
{ "/carbons on|off",
|
||||
"---------------",
|
||||
"Enable or disable message carbons.",
|
||||
"The message carbons feature ensures that both sides of all conversations are shared with all the user's clients that implement this protocol.",
|
||||
NULL } } },
|
||||
|
||||
{ "/reconnect",
|
||||
cmd_reconnect, parse_args, 1, 1, &cons_reconnect_setting,
|
||||
{ "/reconnect seconds", "Set reconnect interval.",
|
||||
|
@ -730,7 +730,7 @@ cmd_help(gchar **args, struct cmd_help_t help)
|
||||
|
||||
} else if (strcmp(args[0], "settings") == 0) {
|
||||
gchar *filter[] = { "/account", "/autoaway", "/autoping", "/autoconnect", "/beep",
|
||||
"/chlog", "/flash", "/gone", "/grlog", "/history", "/intype",
|
||||
"/carbons", "/chlog", "/flash", "/gone", "/grlog", "/history", "/intype",
|
||||
"/log", "/mouse", "/notify", "/outtype", "/prefs", "/priority",
|
||||
"/reconnect", "/roster", "/splash", "/states", "/statuses", "/theme",
|
||||
"/titlebar", "/vercheck", "/privileges", "/occupants", "/presence", "/wrap" };
|
||||
@ -3892,6 +3892,22 @@ cmd_history(gchar **args, struct cmd_help_t help)
|
||||
return result;
|
||||
}
|
||||
|
||||
gboolean
|
||||
cmd_carbons(gchar **args, struct cmd_help_t help)
|
||||
{
|
||||
gboolean result = _cmd_set_boolean_preference(args[0], help,
|
||||
"Carbons message", PREF_CARBONS);
|
||||
|
||||
// enable carbons
|
||||
if (strcmp(args[0], "on") == 0) {
|
||||
iq_enable_carbons();
|
||||
}
|
||||
else if (strcmp(args[0], "off") == 0){
|
||||
iq_disable_carbons();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
gboolean
|
||||
cmd_away(gchar **args, struct cmd_help_t help)
|
||||
{
|
||||
|
@ -85,6 +85,7 @@ gboolean cmd_grlog(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_group(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_help(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_history(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_carbons(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_info(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_intype(gchar **args, struct cmd_help_t help);
|
||||
gboolean cmd_invite(gchar **args, struct cmd_help_t help);
|
||||
|
@ -541,6 +541,7 @@ _get_group(preference_t pref)
|
||||
return PREF_GROUP_PRESENCE;
|
||||
case PREF_CONNECT_ACCOUNT:
|
||||
case PREF_DEFAULT_ACCOUNT:
|
||||
case PREF_CARBONS:
|
||||
return PREF_GROUP_CONNECTION;
|
||||
case PREF_OTR_LOG:
|
||||
case PREF_OTR_POLICY:
|
||||
@ -575,6 +576,8 @@ _get_key(preference_t pref)
|
||||
return "intype";
|
||||
case PREF_HISTORY:
|
||||
return "history";
|
||||
case PREF_CARBONS:
|
||||
return "carbons";
|
||||
case PREF_MOUSE:
|
||||
return "mouse";
|
||||
case PREF_OCCUPANTS:
|
||||
|
@ -59,6 +59,7 @@ typedef enum {
|
||||
PREF_FLASH,
|
||||
PREF_INTYPE,
|
||||
PREF_HISTORY,
|
||||
PREF_CARBONS,
|
||||
PREF_MOUSE,
|
||||
PREF_OCCUPANTS,
|
||||
PREF_OCCUPANTS_SIZE,
|
||||
|
@ -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,
|
||||
|
@ -1177,6 +1177,15 @@ cons_history_setting(void)
|
||||
cons_show("Chat history (/history) : OFF");
|
||||
}
|
||||
|
||||
void
|
||||
cons_carbons_setting(void)
|
||||
{
|
||||
if (prefs_get_boolean(PREF_CARBONS))
|
||||
cons_show("Message carbons (/carbons) : ON");
|
||||
else
|
||||
cons_show("Message carbons (/carbons) : OFF");
|
||||
}
|
||||
|
||||
void
|
||||
cons_show_chat_prefs(void)
|
||||
{
|
||||
|
@ -315,6 +315,7 @@ void cons_outtype_setting(void);
|
||||
void cons_intype_setting(void);
|
||||
void cons_gone_setting(void);
|
||||
void cons_history_setting(void);
|
||||
void cons_carbons_setting(void);
|
||||
void cons_log_setting(void);
|
||||
void cons_chlog_setting(void);
|
||||
void cons_grlog_setting(void);
|
||||
|
@ -466,6 +466,11 @@ _connection_handler(xmpp_conn_t * const conn,
|
||||
|
||||
roster_request();
|
||||
bookmark_request();
|
||||
|
||||
if (prefs_get_boolean(PREF_CARBONS)){
|
||||
iq_enable_carbons();
|
||||
}
|
||||
|
||||
jabber_conn.conn_status = JABBER_CONNECTED;
|
||||
|
||||
if (prefs_get_reconnect() != 0) {
|
||||
|
@ -152,6 +152,26 @@ 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_disable_carbons()
|
||||
{
|
||||
xmpp_conn_t * const conn = connection_get_conn();
|
||||
xmpp_ctx_t * const ctx = connection_get_ctx();
|
||||
xmpp_stanza_t *iq = stanza_disable_carbons(ctx);
|
||||
xmpp_send(conn, iq);
|
||||
xmpp_stanza_release(iq);
|
||||
}
|
||||
|
||||
void
|
||||
iq_disco_info_request(gchar *jid)
|
||||
{
|
||||
|
@ -423,6 +423,49 @@ _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);
|
||||
|
||||
// happens when receive a carbon of a self sent message
|
||||
if(to == NULL) {
|
||||
to = 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);
|
||||
@ -503,4 +546,4 @@ _chat_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
|
||||
jid_destroy(jid);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -198,6 +198,44 @@ 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);
|
||||
free(id);
|
||||
|
||||
xmpp_stanza_t *carbons_enable = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(carbons_enable, STANZA_NAME_ENABLE);
|
||||
xmpp_stanza_set_ns(carbons_enable, STANZA_NS_CARBONS);
|
||||
|
||||
xmpp_stanza_add_child(iq, carbons_enable);
|
||||
|
||||
return iq;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *
|
||||
stanza_disable_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);
|
||||
free(id);
|
||||
|
||||
xmpp_stanza_t *carbons_disable = xmpp_stanza_new(ctx);
|
||||
xmpp_stanza_set_name(carbons_disable, STANZA_NAME_DISABLE);
|
||||
xmpp_stanza_set_ns(carbons_disable, STANZA_NS_CARBONS);
|
||||
|
||||
xmpp_stanza_add_child(iq, carbons_disable);
|
||||
|
||||
return iq;
|
||||
}
|
||||
|
||||
xmpp_stanza_t *
|
||||
stanza_create_chat_state(xmpp_ctx_t *ctx, const char * const fulljid, const char * const state)
|
||||
{
|
||||
|
@ -77,6 +77,8 @@
|
||||
#define STANZA_NAME_VALUE "value"
|
||||
#define STANZA_NAME_DESTROY "destroy"
|
||||
#define STANZA_NAME_ACTOR "actor"
|
||||
#define STANZA_NAME_ENABLE "enable"
|
||||
#define STANZA_NAME_DISABLE "disable"
|
||||
|
||||
// error conditions
|
||||
#define STANZA_NAME_BAD_REQUEST "bad-request"
|
||||
@ -154,6 +156,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 +182,10 @@ 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_disable_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,8 @@ 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_disable_carbons();
|
||||
void iq_send_software_version(const char * const fulljid);
|
||||
void iq_room_list_request(gchar *conferencejid);
|
||||
void iq_disco_info_request(gchar *jid);
|
||||
|
@ -466,6 +466,7 @@ void cons_outtype_setting(void) {}
|
||||
void cons_intype_setting(void) {}
|
||||
void cons_gone_setting(void) {}
|
||||
void cons_history_setting(void) {}
|
||||
void cons_carbons_setting(void) {}
|
||||
void cons_log_setting(void) {}
|
||||
void cons_chlog_setting(void) {}
|
||||
void cons_grlog_setting(void) {}
|
||||
|
@ -119,6 +119,8 @@ gboolean presence_sub_request_exists(const char * const bare_jid)
|
||||
}
|
||||
|
||||
// iq functions
|
||||
void iq_disable_carbons() {};
|
||||
void iq_enable_carbons() {};
|
||||
void iq_send_software_version(const char * const fulljid) {}
|
||||
|
||||
void iq_room_list_request(gchar *conferencejid)
|
||||
|
Loading…
Reference in New Issue
Block a user