Handle secret chat deletions

This commit is contained in:
mjentsch 2015-01-07 16:54:35 +01:00
parent 97c3ff894a
commit e8f30f2284
3 changed files with 57 additions and 40 deletions

View file

@ -51,6 +51,7 @@
#include "request.h"
#include <tgl.h>
#include <tgl-binlog.h>
#include <tools.h>
#include "tgp-structs.h"
#include "tgp-2prpl.h"
@ -425,7 +426,6 @@ static void update_message_received (struct tgl_state *TLS, struct tgl_message *
}
static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, unsigned flags) {
// if (!(flags & TGL_UPDATE_CREATED)) { return; }
if (TLS->our_id == tgl_get_peer_id (user->id)) {
if (flags & TGL_UPDATE_NAME) {
p2tgl_connection_set_display_name (TLS, (tgl_peer_t *)user);
@ -459,42 +459,40 @@ static void write_secret_chat_cb (struct tgl_state *TLS, void *extra, int succes
}
static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret_chat *U, unsigned flags) {
if (U->state == sc_none) { return; }
debug ("secret-chat-state: %d", U->state);
PurpleBuddy *buddy = p2tgl_buddy_find (TLS, U->id);
if (!buddy) {
buddy = p2tgl_buddy_new (TLS, (tgl_peer_t *)U);
purple_blist_add_buddy (buddy, NULL, tggroup, NULL);
purple_blist_alias_buddy (buddy, U->print_name);
}
p2tgl_prpl_got_set_status_mobile (TLS, U->id);
if ((flags & TGL_UPDATE_WORKING) || (flags & TGL_UPDATE_DELETED)) {
if (flags & TGL_UPDATE_WORKING || flags & TGL_UPDATE_DELETED) {
write_secret_chat_file (TLS);
}
PurpleBuddy *buddy = p2tgl_buddy_find (TLS, U->id);
if ((flags & TGL_UPDATE_REQUESTED)) {
if (! (flags & TGL_UPDATE_DELETED)) {
if (!buddy) {
buddy = p2tgl_buddy_new (TLS, (tgl_peer_t *)U);
purple_blist_add_buddy (buddy, NULL, tggroup, NULL);
purple_blist_alias_buddy (buddy, U->print_name);
}
p2tgl_prpl_got_set_status_mobile (TLS, U->id);
}
if (flags & TGL_UPDATE_REQUESTED && buddy) {
// TODO: autoaccept setting, otherwise prompt for ok
tgl_do_accept_encr_chat_request (TLS, U, write_secret_chat_cb, 0);
}
if (flags & TGL_UPDATE_CREATED) {
if (flags & TGL_UPDATE_CREATED && buddy) {
purple_buddy_set_protocol_data (buddy, (gpointer)U);
p2tgl_buddy_update (TLS, (tgl_peer_t *)U, flags);
}
if (flags & (TGL_UPDATE_NAME | TGL_UPDATE_REAL_NAME | TGL_UPDATE_USERNAME) && buddy) {
}
if (flags & (TGL_UPDATE_PHOTO)) {
}
if (flags & TGL_UPDATE_DELETED && buddy) {
purple_blist_remove_buddy (buddy);
p2tgl_got_im (TLS, U->id, "Secret chat terminated.", PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_WHISPER, time(0));
p2tgl_prpl_got_set_status_offline (TLS, U->id);
}
}
static void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *chat, unsigned flags) {
//tgl_do_get_chat_info (TLS, chat->id, 0, on_chat_get_info, 0);
PurpleChat *ch = p2tgl_chat_find (TLS, chat->id);
if (flags & TGL_UPDATE_CREATED) {
@ -506,17 +504,14 @@ static void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *chat, u
if (flags & TGL_UPDATE_TITLE && ch) {
purple_blist_alias_chat (ch, chat->print_title);
}
if (flags & (TGL_UPDATE_MEMBERS | TGL_UPDATE_ADMIN)) {
if (flags & (TGL_UPDATE_MEMBERS | TGL_UPDATE_ADMIN) && ch) {
on_update_chat_participants (TLS, chat);
}
if (flags & TGL_UPDATE_DELETED) {
PurpleChat *ch = p2tgl_chat_find (TLS, chat->id);
if (ch) {
purple_blist_remove_chat (ch);
} else {
warning ("Cannot delete chat %d, not in buddy list.", chat->id);
}
if (flags & TGL_UPDATE_DELETED && ch) {
purple_blist_remove_chat (ch);
}
// TODO: check if user is a member of the current chat and don't display the chat in that case
}
static void update_user_typing (struct tgl_state *TLS, struct tgl_user *U, enum tgl_typing_status status) {
@ -816,9 +811,7 @@ static void tgprpl_close (PurpleConnection * gc) {
static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *message, PurpleMessageFlags flags) {
debug ("tgprpl_send_im()\n");
connection_data *conn = purple_connection_get_protocol_data(gc);
PurpleAccount *pa = conn->pa;
// this is part of a workaround to support clients without
// the request API (request.h), see telegram-base.c:request_code()
@ -828,12 +821,6 @@ static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *m
return 1;
}
PurpleBuddy *b = purple_find_buddy (pa, who);
if (!b) {
warning ("Buddy %s not found, cannot send IM\n", who);
return -1;
}
/*
Make sure that we only send messages to an existing peer by
searching it in the peer tree. This allows us to give immediate feedback
@ -841,6 +828,12 @@ static int tgprpl_send_im (PurpleConnection * gc, const char *who, const char *m
*/
tgl_peer_t *peer = find_peer_by_name (conn->TLS, who);
if (peer) {
if (tgl_get_peer_type(peer->id) == TGL_PEER_ENCR_CHAT && peer->encr_chat.state != sc_ok) {
// secret chat not ready for sending messages or deleted
return -1;
}
tgl_do_send_unescape_message (conn->TLS, message, peer->id);
return 1;
}
@ -920,12 +913,27 @@ static void tgprpl_add_buddy (PurpleConnection * gc, PurpleBuddy * buddy, Purple
static void tgprpl_remove_buddy (PurpleConnection * gc, PurpleBuddy * buddy, PurpleGroup * group) {
debug ("tgprpl_remove_buddy()\n");
if (!buddy) { return; }
connection_data *conn = purple_connection_get_protocol_data (gc);
struct tgl_user *user = purple_buddy_get_protocol_data (buddy);
if (!user) { warning ("cannot remove buddy '%s', no protocol data found\n", buddy->name); return; }
tgl_do_del_contact (conn->TLS, user->id, NULL, NULL);
tgl_peer_t *peer = find_peer_by_name (conn->TLS, buddy->name);
if (!peer) {
// telegram peer not existing, orphaned buddy
return;
}
switch (tgl_get_peer_type(peer->id)) {
case TGL_PEER_ENCR_CHAT:
/* TODO: implement the api call cancel secret chats. Currently the chat will only be marked as
deleted on our side so that it won't be added on startup
(when the secret chat file is loaded) */
bl_do_encr_chat_delete (conn->TLS, &peer->encr_chat);
break;
case TGL_PEER_USER:
tgl_do_del_contact (conn->TLS, peer->id, NULL, NULL);
break;
}
}
static void tgprpl_add_deny (PurpleConnection * gc, const char *name){

View file

@ -165,6 +165,14 @@ void p2tgl_prpl_got_set_status_mobile (struct tgl_state *TLS, tgl_peer_id_t user
g_free (name);
}
void p2tgl_prpl_got_set_status_offline (struct tgl_state *TLS, tgl_peer_id_t user) {
char *name = p2tgl_peer_strdup_id (user);
purple_prpl_got_user_status (tg_get_acc(TLS), name, "offline", NULL);
g_free (name);
}
void p2tgl_prpl_got_user_status (struct tgl_state *TLS, tgl_peer_id_t user, struct tgl_user_status *status) {
if (status->online == 1) {

View file

@ -54,6 +54,7 @@ PurpleBuddy *p2tgl_buddy_update (struct tgl_state *TLS, tgl_peer_t *user, unsign
void p2tgl_buddy_add_data (struct tgl_state *TLS, tgl_peer_id_t user, void *data);
void p2tgl_prpl_got_user_status (struct tgl_state *TLS, tgl_peer_id_t user, struct tgl_user_status *status);
void p2tgl_prpl_got_set_status_mobile (struct tgl_state *TLS, tgl_peer_id_t user);
void p2tgl_prpl_got_set_status_offline (struct tgl_state *TLS, tgl_peer_id_t user);
void p2tgl_connection_set_display_name(struct tgl_state *TLS, tgl_peer_t *user);
void p2tgl_conv_del_user (PurpleConversation *conv, tgl_peer_id_t user);