void p2tgl_prpl_got_user_status (struct tgl_state *TLS, tgl_peer_id_t user, struct tgl_user_status *status) { if (status->online == 1) { char *name = peer_strdup_id (user); purple_prpl_got_user_status (tg_get_acc(TLS), name, "available", NULL); g_free (name); } else { char *name = peer_strdup_id (user); char *when; switch (status->online) { case -1: when = g_strdup_printf("%d", status->when); break; case -2: when = g_strdup_printf("recently"); break; case -3: when = g_strdup_printf("last week"); break; case -4: when = g_strdup_printf("last month"); break; default: when = g_strdup ("unknown"); break; } purple_prpl_got_user_status (tg_get_acc(TLS), name, "mobile", "last online", when, NULL); g_free(name); g_free(when); } }
PurpleBuddy *tgp_blist_buddy_migrate (struct tgl_state *TLS, PurpleBuddy *buddy, struct tgl_user *user) { purple_blist_remove_buddy (buddy); buddy = purple_buddy_new (tg_get_acc (TLS), user->print_name, NULL); tgp_blist_buddy_set_id (buddy, user->id); purple_blist_add_buddy (buddy, NULL, tgp_blist_group_init ("Telegram"), NULL); return buddy; }
void tgp_msg_sys_out (struct tgl_state *TLS, const char *msg, tgl_peer_id_t to_id, int no_log) { int flags = PURPLE_MESSAGE_SYSTEM; if (no_log) { flags |= PURPLE_MESSAGE_NO_LOG; } time_t now; time (&now); switch (tgl_get_peer_type (to_id)) { case TGL_PEER_CHAT: p2tgl_got_chat_in (TLS, to_id, to_id, msg, flags, now); break; case TGL_PEER_USER: case TGL_PEER_ENCR_CHAT: { const char *name = tgp_blist_peer_get_purple_name (TLS, to_id); PurpleConversation *conv = p2tgl_find_conversation_with_account (TLS, to_id); g_return_if_fail (name); if (! conv) { conv = purple_conversation_new (PURPLE_CONV_TYPE_IM, tg_get_acc (TLS), name); } purple_conversation_write (conv, name, msg, flags, now); break; } } }
PurpleChat *p2tgl_blist_find_chat(struct tgl_state *TLS, tgl_peer_id_t chat) { char *name = peer_strdup_id(chat); PurpleChat *c = purple_blist_find_chat(tg_get_acc(TLS), name); g_free (name); return c; }
PurpleBuddy *p2tgl_buddy_find (struct tgl_state *TLS, tgl_peer_id_t user) { gchar *name = peer_strdup_id(user); PurpleBuddy *b = purple_find_buddy (tg_get_acc(TLS), name); g_free (name); return b; }
PurpleBuddy *p2tgl_buddy_new (struct tgl_state *TLS, tgl_peer_t *user) { char *alias = p2tgl_strdup_alias (user); char *name = peer_strdup_id (user->id); PurpleBuddy *b = purple_buddy_new(tg_get_acc(TLS), name, alias); g_free (alias); g_free (name); return b; }
PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat) { gchar *admin = g_strdup_printf("%d", chat->admin_id); gchar *title = g_strdup(chat->print_title); gchar *name = peer_strdup_id (chat->id); GHashTable *ht = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); g_hash_table_insert(ht, g_strdup("subject"), title); g_hash_table_insert(ht, g_strdup("id"), name); g_hash_table_insert(ht, g_strdup("owner"), admin); return purple_chat_new(tg_get_acc(TLS), chat->title, ht); }
tgl_peer_t *tgp_blist_peer_find (struct tgl_state *TLS, const char *purple_name) { // buddies will keep the name they had when they were first added to the user list. The print_name // of the peer may have changed since then, therefore the ID stored in the buddy is used to fetch // the user name. PurpleBuddy *buddy = purple_find_buddy (tg_get_acc (TLS), purple_name); if (! buddy) { // foreign users are not in the buddy list by default, therefore the name used by libpurple and the // print name is always identical return tgl_peer_get_by_name (TLS, purple_name); } if (! tgp_blist_buddy_has_id (buddy)) { return NULL; } return tgl_peer_get (TLS, tgp_blist_buddy_get_id (buddy)); }
PurpleChat *tgp_blist_chat_find (struct tgl_state *TLS, tgl_peer_id_t user) { PurpleBlistNode *node = purple_blist_get_root (); while (node) { if (PURPLE_BLIST_NODE_IS_CHAT(node)) { PurpleChat *chat = PURPLE_CHAT(node); if (purple_chat_get_account (chat) == tg_get_acc (TLS)) { const char *id = g_hash_table_lookup (purple_chat_get_components (chat), "id"); if (id && *id && atoi (id) == tgl_get_peer_id (user)) { return chat; } } } node = purple_blist_node_next (node, FALSE); } return NULL; }
PurpleBuddy *tgp_blist_buddy_find (struct tgl_state *TLS, tgl_peer_id_t user) { PurpleBlistNode *node = purple_blist_get_root (); while (node) { if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { PurpleBuddy *buddy = PURPLE_BUDDY(node); if (purple_buddy_get_account (buddy) == tg_get_acc (TLS)) { if (purple_blist_node_get_int (node, TGP_BUDDY_KEY_PEER_ID) == tgl_get_peer_id (user)) { assert (tgl_get_peer_type (user) == purple_blist_node_get_int (node, TGP_BUDDY_KEY_PEER_TYPE)); return buddy; } } } node = purple_blist_node_next (node, FALSE); } return NULL; }
PurpleBuddy *tgp_blist_buddy_new (struct tgl_state *TLS, tgl_peer_t *user) { PurpleBuddy *buddy = purple_buddy_new (tg_get_acc (TLS), tgp_blist_peer_get_purple_name (TLS, user->id), NULL); tgp_blist_buddy_set_id (buddy, user->id); return buddy; }
PurpleChat *p2tgl_chat_new (struct tgl_state *TLS, struct tgl_chat *chat) { return purple_chat_new (tg_get_acc(TLS), chat->title, tgp_chat_info_new (TLS, chat)); }