diff --git a/tgp-msg.c b/tgp-msg.c index 68b8aec..731bcb7 100644 --- a/tgp-msg.c +++ b/tgp-msg.c @@ -42,7 +42,7 @@ g_utf8_substring (const gchar *str, } #endif -static char *format_service_msg (struct tgl_state *TLS, struct tgl_message *M) { +static char *tgp_msg_service_display (struct tgl_state *TLS, struct tgl_message *M) { g_return_val_if_fail(M && M->flags & TGLMF_SERVICE, NULL); connection_data *conn = TLS->ev_base; @@ -441,6 +441,81 @@ static char *tgp_msg_sticker_display (struct tgl_state *TLS, tgl_peer_id_t from, return text; } +static char *tgp_msg_reply_display (struct tgl_state *TLS, tgl_peer_t *replyee, struct tgl_message *reply, const char *message) { + + g_return_val_if_fail(reply, NULL); + g_return_val_if_fail(message, NULL); + + // the text quoted by the reply + char *quote = NULL; + + if (reply->flags & TGLMF_SERVICE) { + quote = tgp_msg_service_display (TLS, reply); + g_return_val_if_fail(quote == NULL, NULL); + + } else { + switch (reply->media.type) { + case tgl_message_media_none: + quote = purple_markup_escape_text (reply->message, strlen (reply->message)); + tgp_replace (quote, '\n', ' '); + break; + + case tgl_message_media_photo: + quote = g_strdup(_("[photo]")); + break; + + case tgl_message_media_audio: + quote = g_strdup(_("[audio]")); + break; + + case tgl_message_media_video: + quote = g_strdup(_("[video]")); + break; + + case tgl_message_media_document: + case tgl_message_media_document_encr: + quote = g_strdup(_("[document]")); + break; + + case tgl_message_media_geo: + case tgl_message_media_venue: + quote = g_strdup(_("[position]")); // TODO: render + break; + + case tgl_message_media_contact: + quote = g_strdup(_("[contact]")); // TODO: render + break; + + case tgl_message_media_webpage: + quote = g_strdup(_("[webpage]")); + break; + + case tgl_message_media_unsupported: + quote = g_strdup(_("[unsupported media]")); + break; + + default: + g_warn_if_reached(); + return NULL; + break; + } + } + + // the combined reply + char *value = NULL; + + if (replyee) { + const char *name = replyee->print_name; + value = g_strdup_printf (_("> %s wrote:
> %s
%s"), name, quote, message); + } else { + value = g_strdup_printf (_("> Unknown user wrote:
> %s
%s"), quote, message); + } + + g_free (quote); + + return value; +} + static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) { struct tgl_message *M = C->msg; char *text = NULL; @@ -489,7 +564,7 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) { // format the message text if (M->flags & TGLMF_SERVICE) { - text = format_service_msg (TLS, M); + text = tgp_msg_service_display (TLS, M); flags |= PURPLE_MESSAGE_SYSTEM; } else if (M->media.type != tgl_message_media_none) { @@ -634,57 +709,54 @@ static void tgp_msg_display (struct tgl_state *TLS, struct tgp_msg_loading *C) { } flags |= PURPLE_MESSAGE_RECV; } - + if (tgl_get_peer_type (M->to_id) != TGL_PEER_ENCR_CHAT && tgl_get_peer_type (M->to_id) != TGL_PEER_CHANNEL && ! (M->flags & TGLMF_UNREAD)) { + // why? flags |= PURPLE_MESSAGE_DELAYED; } + // TODO: is that a problem? // some service messages (like removing/adding users from chats) might print the message // text through other means and leave the text empty if (! str_not_empty (text)) { return; } - // Handle forwarded messages - if (tgl_get_peer_id (M->fwd_from_id) != TGL_PEER_UNKNOWN) { - const char *name; + // forwarded messages + if (tgl_get_peer_type (M->fwd_from_id) != TGL_PEER_UNKNOWN) { + debug("forwarded message: fwd_from_id=%d", tgl_get_peer_id(M->fwd_from_id)); + + // may be NULL tgl_peer_t *FP = tgl_peer_get (TLS, M->fwd_from_id); char *tmp = text; - if (FP) { - name = FP->print_name; - text = g_strdup_printf (_("Forwarded message from: %s
%s"), name, text); - } else { - // FIXME: sometimes users aren't part of the response when receiving a forwarded message - text = g_strdup_printf (_("Forwarded message:
%s"), text); - } + text = tgp_msg_reply_display(TLS, FP, M, ""); g_free (tmp); + + g_return_if_fail(text != NULL); } - - /* - FIXME: message lookup doesn't work - // Handle replies - if (M->reply_id > 0) { - tgl_message_id_t id; - id.peer_type = TGL_PEER_USER; - id.id = M->reply_id; - - const char *msg = "Unkown Message"; - struct tgl_message *MM = tgl_message_get (TLS, &id); - if (MM) { - msg = MM->message; - } - const char *usr = "Unknown User"; - if (MM) { - tgl_peer_t *P = tgl_peer_get (TLS, MM->from_id); - usr = P->print_name; - } - g_free (text); - text = g_strdup_printf (_("%s: %s
%s"), msg, usr, M->message); + + // replys + if (M->reply_id) { + debug("message reply: reply_id=%d", M->reply_id); + + tgl_message_id_t msg_id = M->permanent_id; + msg_id.id = M->reply_id; + + struct tgl_message *reply = tgl_message_get (TLS, &msg_id); + g_return_if_fail(reply != NULL); + + tgl_peer_t *replyee = tgl_peer_get (TLS, reply->from_id); + g_return_if_fail(replyee != NULL); + + char *tmp = text; + text = tgp_msg_reply_display(TLS, replyee, reply, tmp); + g_free (tmp); + + g_return_if_fail(text != NULL); } - */ // display the message to the user switch (tgl_get_peer_type (M->to_id)) {