216 lines
7 KiB
C
216 lines
7 KiB
C
/*
|
|
This file is part of telegram-purple
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA
|
|
|
|
Copyright Matthias Jentsch 2016
|
|
*/
|
|
|
|
#include "tgp-info.h"
|
|
|
|
// load photo
|
|
|
|
static void tgp_info_update_photo_id (PurpleBlistNode *node, long long photo) {
|
|
char *llid = g_strdup_printf ("%lld", photo);
|
|
debug ("tgp_info_update_photo_id %s", llid);
|
|
purple_blist_node_set_string (node, TGP_INFO_PHOTO_ID, llid);
|
|
g_free (llid);
|
|
}
|
|
|
|
static void tgp_info_load_photo_done (struct tgl_state *TLS, void *extra, int success, const char *filename) {
|
|
tgl_peer_t *P = extra;
|
|
|
|
g_return_if_fail(success);
|
|
|
|
gchar *img = NULL;
|
|
size_t len;
|
|
GError *err = NULL;
|
|
g_file_get_contents (filename, &img, &len, &err);
|
|
if (err) {
|
|
failure ("getting file contents for %s failed: %s", filename, err->message);
|
|
return;
|
|
}
|
|
|
|
if (tgl_get_peer_type (P->id) == TGL_PEER_USER || tgl_get_peer_type (P->id) == TGL_PEER_ENCR_CHAT) {
|
|
PurpleBuddy *B = tgp_blist_buddy_find (TLS, P->id);
|
|
g_return_if_fail(B);
|
|
|
|
purple_buddy_icons_set_for_user (tls_get_pa (TLS), purple_buddy_get_name (B),
|
|
(guchar*) img, len, NULL);
|
|
tgp_info_update_photo_id (&B->node, P->user.photo_big.local_id);
|
|
} else {
|
|
PurpleChat *C = tgp_blist_chat_find (TLS, P->id);
|
|
g_return_if_fail(C);
|
|
|
|
purple_buddy_icons_node_set_custom_icon (&C->node, (guchar*) img, len);
|
|
tgp_info_update_photo_id (&C->node, P->user.photo_big.local_id);
|
|
}
|
|
}
|
|
|
|
// update photo
|
|
|
|
void tgp_info_update_photo (PurpleBlistNode *node, tgl_peer_t *P) {
|
|
tgl_peer_t *parent = NULL;
|
|
|
|
// FIXME: test if this works for encrypted chats
|
|
long long photo = P->user.photo_big.local_id;
|
|
|
|
const char *old = purple_blist_node_get_string (node, TGP_INFO_PHOTO_ID);
|
|
if (old) {
|
|
long long id = 0;
|
|
id = atoll (old);
|
|
if (id == photo) {
|
|
debug ("photo id for %s hasn't changed %lld", parent ? parent->print_name : P->print_name, id);
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (photo != 0) {
|
|
tgl_do_load_file_location (pbn_get_data (node)->TLS, &P->user.photo_big, tgp_info_load_photo_done, P);
|
|
} else {
|
|
// set empty photo
|
|
purple_buddy_icons_node_set_custom_icon_from_file (node, NULL);
|
|
tgp_info_update_photo_id (node, photo);
|
|
}
|
|
}
|
|
|
|
|
|
// show user info
|
|
|
|
static void tgp_info_load_channel_done (struct tgl_state *TLS, void *extra, int success, struct tgl_channel *C) {
|
|
g_return_if_fail(success);
|
|
|
|
PurpleNotifyUserInfo *info = purple_notify_user_info_new ();
|
|
|
|
if (str_not_empty (C->about)) {
|
|
purple_notify_user_info_add_pair (info, _("Description"), C->about);
|
|
}
|
|
|
|
if (str_not_empty (C->username)) {
|
|
char *link = g_strdup_printf ("https://telegram.me/%s", C->username);
|
|
purple_notify_user_info_add_pair (info, _("Link"), link);
|
|
g_free (link);
|
|
}
|
|
|
|
if (str_not_empty (C->print_title)) {
|
|
purple_notify_user_info_add_pair (info, _("Print Title"), C->print_title);
|
|
}
|
|
|
|
char *admins = g_strdup_printf ("%d", C->admins_count);
|
|
purple_notify_user_info_add_pair (info, _("Administrators"), admins);
|
|
g_free (admins);
|
|
|
|
char *participants = g_strdup_printf ("%d", C->participants_count);
|
|
purple_notify_user_info_add_pair (info, _("Participants"), participants);
|
|
g_free (participants);
|
|
|
|
char *kicked = g_strdup_printf ("%d", C->kicked_count);
|
|
purple_notify_user_info_add_pair (info, _("Kicked"), kicked);
|
|
g_free (kicked);
|
|
|
|
purple_notify_userinfo (tls_get_conn (TLS), tgp_blist_lookup_purple_name (TLS, C->id), info, NULL, NULL);
|
|
}
|
|
|
|
static void tgp_info_load_user_done (struct tgl_state *TLS, void *extra, int success, struct tgl_user *U) {
|
|
g_return_if_fail(success);
|
|
|
|
// user info
|
|
|
|
PurpleNotifyUserInfo *info = purple_notify_user_info_new ();
|
|
|
|
if (str_not_empty (U->first_name) && str_not_empty (U->last_name)) {
|
|
purple_notify_user_info_add_pair (info, _("First name"), U->first_name);
|
|
purple_notify_user_info_add_pair (info, _("Last name"), U->last_name);
|
|
} else {
|
|
purple_notify_user_info_add_pair (info, _("Name"), U->print_name);
|
|
}
|
|
|
|
if (str_not_empty (U->username)) {
|
|
char *username = g_strdup_printf ("@%s", U->username);
|
|
purple_notify_user_info_add_pair (info, _("Username"), username);
|
|
g_free (username);
|
|
}
|
|
|
|
char *status = tgp_format_user_status (&U->status);
|
|
purple_notify_user_info_add_pair (info, _("Last seen"), status);
|
|
g_free (status);
|
|
|
|
if (str_not_empty (U->phone)) {
|
|
char *phone = g_strdup_printf ("+%s", U->phone);
|
|
purple_notify_user_info_add_pair (info, _("Phone"), phone);
|
|
g_free (phone);
|
|
}
|
|
|
|
// secret chat info
|
|
|
|
tgl_peer_t *O = extra;
|
|
if (O && tgl_get_peer_type (O->id) == TGL_PEER_ENCR_CHAT) {
|
|
|
|
struct tgl_secret_chat *secret = &O->encr_chat;
|
|
|
|
if (secret->state == sc_waiting) {
|
|
purple_notify_user_info_add_pair (info, "", _("Waiting for the user to get online..."));
|
|
} else {
|
|
const char *ttl_key = _("Self destruction timer");
|
|
if (secret->ttl) {
|
|
char *ttl = g_strdup_printf ("%d", secret->ttl);
|
|
purple_notify_user_info_add_pair (info, ttl_key, ttl);
|
|
g_free (ttl);
|
|
} else {
|
|
purple_notify_user_info_add_pair (info, ttl_key, _("Timer is not enabled."));
|
|
}
|
|
|
|
if (secret->first_key_sha[0]) {
|
|
int sha1key = tgp_visualize_key (TLS, secret->first_key_sha);
|
|
if (sha1key != -1) {
|
|
char *ident_icon = tgp_format_img (sha1key);
|
|
purple_notify_user_info_add_pair (info, _("Secret key"), ident_icon);
|
|
g_free(ident_icon);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
const char *who = NULL;
|
|
if (tgl_get_peer_type (O->id) == TGL_PEER_ENCR_CHAT) {
|
|
who = tgp_blist_lookup_purple_name (TLS, O->id);
|
|
} else {
|
|
who = tgp_blist_lookup_purple_name (TLS, U->id);
|
|
}
|
|
|
|
purple_notify_userinfo (tls_get_conn (TLS), who, info, NULL, NULL);
|
|
}
|
|
|
|
void tgprpl_info_show (PurpleConnection *gc, const char *who) {
|
|
tgl_peer_t *P = tgp_blist_lookup_peer_get (gc_get_data (gc)->TLS, who);
|
|
if (P) {
|
|
switch (tgl_get_peer_type (P->id)) {
|
|
case TGL_PEER_ENCR_CHAT: {
|
|
tgl_peer_t *parent = tgp_encr_chat_get_partner (gc_get_tls (gc), &P->encr_chat);
|
|
if (parent) {
|
|
tgl_do_get_user_info (gc_get_tls (gc), parent->id, 0, tgp_info_load_user_done, P);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case TGL_PEER_CHANNEL:
|
|
tgl_do_get_channel_info (gc_get_tls (gc), P->id, FALSE, tgp_info_load_channel_done, P);
|
|
break;
|
|
|
|
case TGL_PEER_USER:
|
|
tgl_do_get_user_info (gc_get_tls (gc), P->id, 0, tgp_info_load_user_done, P);
|
|
break;
|
|
}
|
|
}
|
|
}
|