diff options
Diffstat (limited to 'protocols/jabber/conference.c')
| -rw-r--r-- | protocols/jabber/conference.c | 27 | 
1 files changed, 16 insertions, 11 deletions
| diff --git a/protocols/jabber/conference.c b/protocols/jabber/conference.c index bf0d5e2f..9c32bb01 100644 --- a/protocols/jabber/conference.c +++ b/protocols/jabber/conference.c @@ -25,6 +25,7 @@  #include "sha1.h"  static xt_status jabber_chat_join_failed(struct im_connection *ic, struct xt_node *node, struct xt_node *orig); +static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);  struct groupchat *jabber_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password)  { @@ -126,6 +127,12 @@ static xt_status jabber_chat_join_failed(struct im_connection *ic, struct xt_nod  	return XT_HANDLED;  } +static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig) +{ +	/* This is a self message sent by this bitlbee - just drop it */ +	return XT_ABORT; +} +  struct groupchat *jabber_chat_by_jid(struct im_connection *ic, const char *name)  {  	char *normalized = jabber_normalize(name); @@ -170,13 +177,9 @@ int jabber_chat_msg(struct groupchat *c, char *message, int flags)  	node = xt_new_node("body", message, NULL);  	node = jabber_make_packet("message", "groupchat", jc->name, node); -	if (!jabber_write_packet(ic, node)) { -		xt_free_node(node); -		return 0; -	} -	xt_free_node(node); +	jabber_cache_add(ic, node, jabber_chat_self_message); -	return 1; +	return !jabber_write_packet(ic, node);  }  int jabber_chat_topic(struct groupchat *c, char *topic) @@ -402,6 +405,7 @@ void jabber_chat_pkt_message(struct im_connection *ic, struct jabber_buddy *bud,  	char *nick = NULL;  	char *final_from = NULL;  	char *bare_jid = NULL; +	guint32 flags = 0;  	from = (bud) ? bud->full_jid : xt_find_attr(node, "from"); @@ -465,20 +469,21 @@ void jabber_chat_pkt_message(struct im_connection *ic, struct jabber_buddy *bud,  	} else if (chat != NULL && bud == NULL && nick == NULL) {  		imcb_chat_log(chat, "From conference server: %s", body->text);  		return; -	} else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me) { -		/* exclude self-messages since they would get filtered out -		 * but not the ones in the backlog */ +	} else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me && +		   (jabber_cache_handle_packet(ic, node) == XT_ABORT)) { +		/* Self message marked by this bitlbee, don't show it */  		return;  	} -	if (bud && jc && bud != jc->me) { +	if (bud) {  		bare_jid = jabber_get_bare_jid(bud->ext_jid ? bud->ext_jid : bud->full_jid);  		final_from = bare_jid; +		flags = (bud == jc->me) ? OPT_SELFMESSAGE : 0;  	} else {  		final_from = nick;  	} -	imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node)); +	imcb_chat_msg(chat, final_from, body->text, flags, jabber_get_timestamp(node));  	g_free(bare_jid);  } | 
