diff --git a/telegram-purple.c b/telegram-purple.c
old mode 100644
new mode 100755
index 908eca8..1a5e1a4
--- a/telegram-purple.c
+++ b/telegram-purple.c
@@ -65,7 +65,7 @@ PurpleGroup *tggroup;
const char *config_dir = ".telegram-purple";
const char *pk_path = "/etc/telegram-purple/server.pub";
void tgprpl_login_on_connected();
-void on_user_get_info (struct tgl_state *TLS, void *show_info, int success, struct tgl_user *U);
+void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, struct tgl_user *U);
static connection_data *get_conn_from_buddy (PurpleBuddy *buddy) {
connection_data *c = purple_connection_get_protocol_data (
@@ -83,7 +83,7 @@ static char *format_status (struct tgl_user_status *status) {
}
static char *format_img_full (int imgstore) {
- return g_strdup_printf ("
", imgstore);
+ return g_strdup_printf ("
", imgstore);
}
static char *format_img_thumb (int imgstore, char *filename) __attribute__ ((unused));
@@ -442,7 +442,10 @@ static void update_user_handler (struct tgl_state *TLS, struct tgl_user *user, u
p2tgl_buddy_update (TLS, (tgl_peer_t *)user, flags);
}
if (flags & TGL_UPDATE_PHOTO) {
- tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, 0);
+ get_user_info_data* info_data = malloc (sizeof(get_user_info_data));
+ info_data->show_info = 0;
+ info_data->peer = 0;
+ tgl_do_get_user_info (TLS, user->id, 0, on_user_get_info, info_data);
}
if (flags & TGL_UPDATE_DELETED && buddy) {
purple_blist_remove_buddy (buddy);
@@ -564,33 +567,73 @@ static void on_userpic_loaded (struct tgl_state *TLS, void *extra, int success,
}
char *who = g_strdup_printf ("%d", tgl_get_peer_id (U->id));
- if (dld->type == 1) {
+ if (dld->get_user_info_data->show_info == 1) {
PurpleNotifyUserInfo *info = create_user_notify_info(U);
char *profile_image = profile_image = format_img_full(imgStoreId);
purple_notify_user_info_add_pair (info, "Profile image", profile_image);
- purple_notify_userinfo (conn->gc, who, info, NULL, NULL);
+
+ if (dld->get_user_info_data->peer && dld->get_user_info_data->peer->encr_chat.first_key_sha[0]) {
+ // display secret key
+ int sha1key_store_id = generate_ident_icon (conn->TLS, dld->get_user_info_data->peer->encr_chat.first_key_sha);
+ if (sha1key_store_id != -1) {
+ char *ident_icon = format_img_full (sha1key_store_id);
+ purple_notify_user_info_add_pair (info, "Secret key", ident_icon);
+ g_free(ident_icon);
+ }
+ char *id = g_strdup_printf ("%d", tgl_get_peer_id (dld->get_user_info_data->peer->id));
+ purple_notify_userinfo (conn->gc, id, info, NULL, NULL);
+ g_free (id);
+ } else {
+ purple_notify_userinfo (conn->gc, who, info, NULL, NULL);
+ }
g_free (profile_image);
}
+ if (dld->get_user_info_data->peer) {
+ char *id = g_strdup_printf ("%d", tgl_get_peer_id (dld->get_user_info_data->peer->id));
+ gchar *img_data = NULL;
+ size_t len;
+ GError *err = NULL;
+ g_file_get_contents (filename, &img_data, &len, &err);
+ purple_buddy_icons_set_for_user(conn->pa, id, img_data, len, NULL);
+ g_free (id);
+ }
purple_buddy_icons_set_for_user(conn->pa, who, data, len, NULL);
g_free(who);
+ g_free(dld->get_user_info_data);
}
-void on_user_get_info (struct tgl_state *TLS, void *show_info, int success, struct tgl_user *U)
+void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, struct tgl_user *U)
{
if (! success) {
warning ("on_user_get_info not successfull, aborting...\n");
return;
}
+ get_user_info_data *user_info_data = (get_user_info_data *)info_data;
if (U->photo.sizes_num == 0) {
- if (show_info) {
+ if (user_info_data->show_info) {
PurpleNotifyUserInfo *info = create_user_notify_info(U);
- p2tgl_notify_userinfo(TLS, U->id, info, NULL, NULL);
+ if (user_info_data->peer && user_info_data->peer->encr_chat.first_key_sha[0]) {
+ // display secret key
+ int sha1key_store_id = generate_ident_icon (TLS, user_info_data->peer->encr_chat.first_key_sha);
+ if (sha1key_store_id != -1) {
+ char *ident_icon = format_img_full (sha1key_store_id);
+ purple_notify_user_info_add_pair (info, "Secret key", ident_icon);
+ g_free(ident_icon);
+ }
+ char *id = g_strdup_printf ("%d", tgl_get_peer_id (user_info_data->peer->id));
+ connection_data *conn = TLS->ev_base;
+ purple_notify_userinfo (conn->gc, id, info, NULL, NULL);
+ g_free (id);
+ }else{
+ p2tgl_notify_userinfo(TLS, U->id, info, NULL, NULL);
+ }
}
+ g_free(user_info_data);
} else {
struct download_desc *dld = malloc (sizeof(struct download_desc));
dld->data = U;
- dld->type = show_info ? 1 : 2;
+ dld->get_user_info_data = info_data;
tgl_do_load_photo (TLS, &U->photo, on_userpic_loaded, dld);
}
}
@@ -828,27 +871,29 @@ static void tgprpl_get_info (PurpleConnection * gc, const char *who) {
tgl_peer_t *peer = find_peer_by_name (conn->TLS, who);
if (! peer) { return; }
+
+ get_user_info_data* info_data = malloc (sizeof(get_user_info_data));
+ info_data->show_info = 1;
+ info_data->peer = peer;
+
switch (tgl_get_peer_type (peer->id)) {
case TGL_PEER_USER:
case TGL_PEER_CHAT:
- tgl_do_get_user_info (conn->TLS, peer->id, 0, on_user_get_info, (void *)1l);
+ tgl_do_get_user_info (conn->TLS, peer->id, 0, on_user_get_info, info_data);
break;
case TGL_PEER_ENCR_CHAT: {
- if (peer->encr_chat.first_key_sha[0]) {
- // display secret key
- PurpleNotifyUserInfo *info = purple_notify_user_info_new();
- int sha1key_store_id = generate_ident_icon (conn->TLS, peer->encr_chat.first_key_sha);
- if (sha1key_store_id != -1) {
- char *ident_icon = format_img_full (sha1key_store_id);
- purple_notify_user_info_add_pair (info, "Secret Key", ident_icon);
- g_free(ident_icon);
- }
- char *id = g_strdup_printf ("%d", tgl_get_peer_id (peer->id));
- purple_notify_userinfo (conn->gc, id, info, NULL, NULL);
- g_free (id);
- }
+ tgl_peer_t *parent_peer;
+ if(peer->encr_chat.admin_id == conn->TLS->our_id){
+ parent_peer = tgl_peer_get (conn->TLS, TGL_MK_USER(peer->encr_chat.user_id));
+ } else {
+ parent_peer = tgl_peer_get (conn->TLS, TGL_MK_USER(peer->encr_chat.admin_id));
+ }
+ if(parent_peer){
+ tgl_do_get_user_info(conn->TLS, parent_peer->id, 0, on_user_get_info, info_data);
}
break;
+ }
+
}
}
diff --git a/tgp-structs.h b/tgp-structs.h
old mode 100644
new mode 100755
index fe0dc0b..3a0413a
--- a/tgp-structs.h
+++ b/tgp-structs.h
@@ -40,8 +40,13 @@ typedef struct {
int in_fallback_chat;
} connection_data;
+typedef struct {
+ int show_info;
+ tgl_peer_t *peer;
+}get_user_info_data;
+
struct download_desc {
- int type;
+ get_user_info_data *get_user_info_data;
void *data;
};