Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • protocols/jabber/conference.c

    r3d31618 rc34247d  
    2626
    2727static xt_status jabber_chat_join_failed(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
     28static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig);
    2829
    2930struct groupchat *jabber_chat_join(struct im_connection *ic, const char *room, const char *nick, const char *password)
     
    121122        }
    122123        if (bud) {
    123                 jabber_chat_free(jabber_chat_by_jid(ic, bud->bare_jid));
     124                struct groupchat *c = jabber_chat_by_jid(ic, bud->bare_jid);
     125                if (c) {
     126                        jabber_chat_free(c);
     127                }
    124128        }
    125129
    126130        return XT_HANDLED;
     131}
     132
     133static xt_status jabber_chat_self_message(struct im_connection *ic, struct xt_node *node, struct xt_node *orig)
     134{
     135        /* This is a self message sent by this bitlbee - just drop it */
     136        return XT_ABORT;
    127137}
    128138
     
    171181        node = jabber_make_packet("message", "groupchat", jc->name, node);
    172182
    173         if (!jabber_write_packet(ic, node)) {
    174                 xt_free_node(node);
    175                 return 0;
    176         }
    177         xt_free_node(node);
    178 
    179         return 1;
     183        jabber_cache_add(ic, node, jabber_chat_self_message);
     184
     185        return !jabber_write_packet(ic, node);
    180186}
    181187
     
    299305                                        }
    300306                                }
    301 
    302                                 /* Some program-specific restrictions. */
    303                                 imcb_clean_handle(ic, bud->ext_jid);
    304307                        }
    305308                        bud->flags |= JBFLAG_IS_ANONYMOUS;
     
    331334        } else if (type) { /* type can only be NULL or "unavailable" in this function */
    332335                if ((bud->flags & JBFLAG_IS_CHATROOM) && bud->ext_jid) {
     336                        char *reason = NULL;
     337                        char *status = NULL;
     338                        char *status_text = NULL;
     339                       
     340                        if ((c = xt_find_node_by_attr(node->children, "x", "xmlns", XMLNS_MUC_USER))) {
     341                                struct xt_node *c2 = c->children;
     342
     343                                while ((c2 = xt_find_node(c2, "status"))) {
     344                                        char *code = xt_find_attr(c2, "code");
     345                                        if (g_strcmp0(code, "301") == 0) {
     346                                                status = "Banned";
     347                                                break;
     348                                        } else if (g_strcmp0(code, "303") == 0) {
     349                                                /* This could be handled in a cleverer way,
     350                                                 * but let's just show a literal part/join for now */
     351                                                status = "Changing nicks";
     352                                                break;
     353                                        } else if (g_strcmp0(code, "307") == 0) {
     354                                                status = "Kicked";
     355                                                break;
     356                                        }
     357                                        c2 = c2->next;
     358                                }
     359
     360                                /* Sometimes the status message is in presence/x/item/reason */
     361                                if ((c2 = xt_find_path(c, "item/reason")) && c2->text && c2->text_len) {
     362                                        status_text = c2->text;
     363                                }
     364                        }
     365
     366                        /* Sometimes the status message is right inside <presence> */
     367                        if ((c = xt_find_node(node->children, "status")) && c->text && c->text_len) {
     368                                status_text = c->text;
     369                        }
     370
     371                        if (status_text && status) {
     372                                reason = g_strdup_printf("%s: %s", status, status_text);
     373                        } else {
     374                                reason = g_strdup(status_text ? : status);
     375                        }
     376
    333377                        s = strchr(bud->ext_jid, '/');
    334378                        if (s) {
    335379                                *s = 0;
    336380                        }
    337                         imcb_chat_remove_buddy(chat, bud->ext_jid, NULL);
     381                        imcb_chat_remove_buddy(chat, bud->ext_jid, reason);
    338382                        if (bud != jc->me && bud->flags & JBFLAG_IS_ANONYMOUS) {
    339                                 imcb_remove_buddy(ic, bud->ext_jid, NULL);
     383                                imcb_remove_buddy(ic, bud->ext_jid, reason);
    340384                        }
    341385                        if (s) {
    342386                                *s = '/';
    343387                        }
     388
     389                        g_free(reason);
    344390                }
    345391
     
    360406        char *final_from = NULL;
    361407        char *bare_jid = NULL;
     408        guint32 flags = 0;
    362409
    363410        from = (bud) ? bud->full_jid : xt_find_attr(node, "from");
     
    396443
    397444        if (subject && chat) {
    398                 char *subject_text = subject->text_len > 0 ? subject->text : NULL;
     445                char *subject_text = subject->text_len > 0 ? subject->text : "";
    399446                if (g_strcmp0(chat->topic, subject_text) != 0) {
    400447                        bare_jid = (bud) ? jabber_get_bare_jid(bud->ext_jid) : NULL;
     
    402449                                        jabber_get_timestamp(node));
    403450                        g_free(bare_jid);
     451                        bare_jid = NULL;
    404452                }
    405453        }
     
    422470                imcb_chat_log(chat, "From conference server: %s", body->text);
    423471                return;
    424         } else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me) {
    425                 /* exclude self-messages since they would get filtered out
    426                  * but not the ones in the backlog */
     472        } else if (jc && jc->flags & JCFLAG_MESSAGE_SENT && bud == jc->me &&
     473                   (jabber_cache_handle_packet(ic, node) == XT_ABORT)) {
     474                /* Self message marked by this bitlbee, don't show it */
    427475                return;
    428476        }
    429477
    430         if (bud && jc && bud != jc->me) {
     478        if (bud) {
    431479                bare_jid = jabber_get_bare_jid(bud->ext_jid ? bud->ext_jid : bud->full_jid);
    432480                final_from = bare_jid;
     481                flags = (bud == jc->me) ? OPT_SELFMESSAGE : 0;
    433482        } else {
    434483                final_from = nick;
    435484        }
    436485
    437         imcb_chat_msg(chat, final_from, body->text, 0, jabber_get_timestamp(node));
     486        imcb_chat_msg(chat, final_from, body->text, flags, jabber_get_timestamp(node));
    438487
    439488        g_free(bare_jid);
Note: See TracChangeset for help on using the changeset viewer.