Start using chats to correctly attribute messages to windows

Without this, "self_bcc" would create messages that were attributed to
the self-chat.

We still have duplicate messages with self-bcc enabled.
This commit is contained in:
2021-01-11 00:39:47 +00:00
parent 4484f51c5d
commit 36b6b37e78

View File

@@ -188,7 +188,10 @@ delta_event_handler(void *context)
case DC_EVENT_MSGS_CHANGED: {
// This event may be issued for a single message, in which case the
// message ID is in data2 and we should treat it as an incoming msg
// FIXME: this leads to duplicate messages when it's an outgoing
// message we just sent
uint32_t msg_id = dc_event_get_data2_int(event);
pr = delta_build_process_request(conn);
if (msg_id) {
// FIXME: they won't all be incoming. Some will be changed
@@ -432,15 +435,39 @@ delta_recv_im(DeltaConnectionData *conn, uint32_t msg_id)
int viewtype = dc_msg_get_viewtype(msg);
time_t timestamp = dc_msg_get_timestamp(msg);
char *text = dc_msg_get_text(msg);
uint32_t contact_id = dc_msg_get_from_id(msg);
uint32_t chat_id = dc_msg_get_chat_id(msg);
dc_chat_t *chat = dc_get_chat(mailbox, chat_id);
dc_array_t *contacts = dc_get_chat_contacts(mailbox, chat_id);
int num_contacts = dc_array_get_cnt(contacts);
dc_contact_t *contact = dc_get_contact(mailbox, contact_id);
if (contact == NULL) {
purple_debug_info(PLUGIN_ID, "Receiving IM: unknown contact: %d\n", contact_id);
if (chat == NULL) {
purple_debug_info(PLUGIN_ID, "Receiving IM: unknown chat: %d\n", chat_id);
goto out;
}
char *who = dc_contact_get_addr(contact);
if (dc_chat_get_type(chat) == DC_CHAT_TYPE_GROUP) {
purple_debug_info(PLUGIN_ID, "Receiving IM: group chat with ID %d! Not yet supported\n", chat_id);
goto out;
}
if (num_contacts != 1) {
purple_debug_info(PLUGIN_ID, "Receiving IM: 1-1 chat %d with %d contacts instead of 1!\n", chat_id, num_contacts);
goto out;
}
// FIXME: using dc_array_get_contact_id fails here, complaining that it's not an array of locations
dc_contact_t *contact = dc_get_contact(mailbox, dc_array_get_id(contacts, 0));
char *who = NULL;
// In the current architecture, delta_send_im and delta_recv_im must agree
// on the value for 'who'. Using the email address is an easy cheat for this
// but gets shaky in the long term.
if (contact != NULL) {
who = dc_contact_get_addr(contact);
} else {
who = dc_chat_get_name(chat);
}
int flags = PURPLE_MESSAGE_RECV;
// FIXME: as a massive hack, convert IMEX setup messages into a text message
@@ -500,7 +527,10 @@ delta_recv_im(DeltaConnectionData *conn, uint32_t msg_id)
dc_markseen_msgs(mailbox, &msg_id, 1);
g_free(who);
dc_contact_unref(contact);
out:
g_free(text);
dc_msg_unref(msg);
dc_chat_unref(chat);
dc_array_unref(contacts);
}