Do not add group chats in which the user is not a member
Clean up and refactor group chat code, move chat functions into separate file, always load all chat infos on plugin load so we know the members.
This commit is contained in:
parent
2ec44834fc
commit
c85b8da619
11 changed files with 138 additions and 138 deletions
|
@ -15,7 +15,7 @@ OBJ=objs
|
|||
LIB=libs
|
||||
DIR_LIST=${DEP} ${AUTO} ${EXE} ${OBJ} ${LIB} ${DEP}/auto ${OBJ}/auto ${DEP}/lodepng ${OBJ}/lodepng
|
||||
|
||||
PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ${OBJ}/tgp-utils.o ${OBJ}/lodepng/lodepng.o
|
||||
PLUGIN_OBJECTS=${OBJ}/tgp-net.o ${OBJ}/tgp-timers.o ${OBJ}/msglog.o ${OBJ}/telegram-base.o ${OBJ}/telegram-purple.o ${OBJ}/tgp-2prpl.o ${OBJ}/tgp-structs.o ${OBJ}/tgp-utils.o ${OBJ}/tgp-chat.o ${OBJ}/lodepng/lodepng.o
|
||||
ALL_OBJS=${PLUGIN_OBJECTS}
|
||||
|
||||
.SUFFIXES:
|
||||
|
|
|
@ -555,58 +555,6 @@ void telegram_login (struct tgl_state *TLS) {
|
|||
conn->login_timer = purple_timeout_add (100, check_all_authorized, TLS);
|
||||
}
|
||||
|
||||
PurpleConversation *chat_show (PurpleConnection *gc, int id) {
|
||||
debug ("show chat");
|
||||
connection_data *conn = purple_connection_get_protocol_data(gc);
|
||||
|
||||
PurpleConversation *convo = purple_find_chat(gc, id);
|
||||
if (! convo) {
|
||||
gchar *name = g_strdup_printf ("%d", id);
|
||||
if (! g_hash_table_lookup (conn->joining_chats, name)) {
|
||||
g_hash_table_insert (conn->joining_chats, name, (void *)1);
|
||||
tgl_do_get_chat_info (conn->TLS, TGL_MK_CHAT(id), 0, on_chat_get_info, NULL);
|
||||
} else {
|
||||
g_free(name);
|
||||
}
|
||||
}
|
||||
return convo;
|
||||
}
|
||||
|
||||
int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text) {
|
||||
connection_data *conn = TLS->ev_base;
|
||||
|
||||
if (chat_show (conn->gc, tgl_get_peer_id (M->to_id))) {
|
||||
p2tgl_got_chat_in(TLS, M->to_id, M->from_id, text ? text : M->message,
|
||||
M->service ? PURPLE_MESSAGE_SYSTEM : PURPLE_MESSAGE_RECV, M->date);
|
||||
|
||||
pending_reads_add (conn->pending_reads, M->to_id);
|
||||
if (p2tgl_status_is_present(purple_account_get_active_status(conn->pa))) {
|
||||
pending_reads_send_all (conn->pending_reads, conn->TLS);
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
// add message once the chat was initialised
|
||||
struct message_text *mt = message_text_init (M, text);
|
||||
g_queue_push_tail (conn->new_messages, mt);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat) {
|
||||
struct tgl_chat_user *curr = chat->user_list;
|
||||
if (!curr) {
|
||||
warning ("add_all_users_to_chat: chat contains no user list, cannot add users\n.");
|
||||
return;
|
||||
}
|
||||
|
||||
int i;
|
||||
for (i = 0; i < chat->user_list_size; i++) {
|
||||
struct tgl_chat_user *uid = (curr + i);
|
||||
int flags = (chat->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE);
|
||||
p2tgl_conv_add_user(pc, *uid, NULL, flags, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* This function generates a png image to visualize the sha1 key from an encrypted chat.
|
||||
*/
|
||||
|
|
|
@ -31,9 +31,6 @@ void read_secret_chat_file (struct tgl_state *TLS);
|
|||
void write_secret_chat_file (struct tgl_state *TLS);
|
||||
|
||||
void telegram_login (struct tgl_state *TLS);
|
||||
PurpleConversation *chat_show (PurpleConnection *gc, int id);
|
||||
int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text);
|
||||
void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat);
|
||||
void request_code_entered (gpointer data, const gchar *code);
|
||||
int generate_ident_icon(struct tgl_state *TLS, unsigned char* sha1_key);
|
||||
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#include "telegram-purple.h"
|
||||
#include "msglog.h"
|
||||
#include "tgp-utils.h"
|
||||
#include "tgp-chat.h"
|
||||
|
||||
#define _(m) m
|
||||
|
||||
|
@ -74,14 +75,8 @@ PurplePlugin *_telegram_protocol = NULL;
|
|||
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 *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 (
|
||||
purple_account_get_connection (purple_buddy_get_account (buddy)));
|
||||
return c;
|
||||
}
|
||||
void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, struct tgl_user *U);
|
||||
|
||||
static char *format_status (struct tgl_user_status *status) {
|
||||
return status->online ? "Online" : "Mobile";
|
||||
|
@ -269,30 +264,10 @@ static void tgl_do_send_unescape_message (struct tgl_state *TLS, const char *mes
|
|||
|
||||
static void start_secret_chat (PurpleBlistNode *node, gpointer data) {
|
||||
PurpleBuddy *buddy = data;
|
||||
connection_data *conn = purple_connection_get_protocol_data (
|
||||
purple_account_get_connection (purple_buddy_get_account(buddy)));
|
||||
|
||||
tgl_do_create_secret_chat(conn->TLS, TGL_MK_USER(atoi (purple_buddy_get_name (buddy))),
|
||||
0, 0);
|
||||
}
|
||||
|
||||
static void on_update_user_name (struct tgl_state *TLS, tgl_peer_t *user) __attribute__ ((unused));
|
||||
static void on_update_user_name (struct tgl_state *TLS, tgl_peer_t *user) {
|
||||
p2tgl_got_alias(TLS, user->id, p2tgl_strdup_alias(user));
|
||||
}
|
||||
|
||||
static void on_update_chat_participants (struct tgl_state *TLS, struct tgl_chat *chat) {
|
||||
PurpleConversation *pc = purple_find_chat(tg_get_conn(TLS), tgl_get_peer_id(chat->id));
|
||||
if (pc) {
|
||||
purple_conv_chat_clear_users (purple_conversation_get_chat_data(pc));
|
||||
chat_add_all_users (pc, chat);
|
||||
}
|
||||
}
|
||||
|
||||
static void on_update_new_user_status (struct tgl_state *TLS, void *peer) __attribute__ ((unused));
|
||||
static void on_update_new_user_status (struct tgl_state *TLS, void *peer) {
|
||||
tgl_peer_t *p = peer;
|
||||
p2tgl_prpl_got_user_status(TLS, p->id, &p->user.status);
|
||||
connection_data *conn = get_conn_from_buddy (buddy);
|
||||
const char *name = purple_buddy_get_name (buddy);
|
||||
tgl_do_create_secret_chat (conn->TLS, TGL_MK_USER(atoi (name)), 0, 0);
|
||||
}
|
||||
|
||||
static void update_message_received (struct tgl_state *TLS, struct tgl_message *M);
|
||||
|
@ -527,24 +502,19 @@ static void update_secret_chat_handler (struct tgl_state *TLS, struct tgl_secret
|
|||
|
||||
static void update_chat_handler (struct tgl_state *TLS, struct tgl_chat *chat, unsigned flags) {
|
||||
PurpleChat *ch = p2tgl_chat_find (TLS, chat->id);
|
||||
|
||||
|
||||
if (flags & TGL_UPDATE_CREATED) {
|
||||
if (!ch) {
|
||||
ch = p2tgl_chat_new (TLS, chat);
|
||||
purple_blist_add_chat(ch, NULL, NULL);
|
||||
}
|
||||
tgl_do_get_chat_info (TLS, chat->id, 0, on_chat_get_info, 0);
|
||||
}
|
||||
if (flags & TGL_UPDATE_TITLE && ch) {
|
||||
purple_blist_alias_chat (ch, chat->print_title);
|
||||
}
|
||||
if (flags & (TGL_UPDATE_MEMBERS | TGL_UPDATE_ADMIN) && ch) {
|
||||
on_update_chat_participants (TLS, chat);
|
||||
chat_users_update (TLS, chat);
|
||||
}
|
||||
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) {
|
||||
|
@ -618,34 +588,17 @@ void on_user_get_info (struct tgl_state *TLS, void *info_data, int success, stru
|
|||
}
|
||||
|
||||
void on_chat_get_info (struct tgl_state *TLS, void *extra, int success, struct tgl_chat *C) {
|
||||
assert (success);
|
||||
|
||||
debug ("on_chat_joined(%d)\n", tgl_get_peer_id (C->id));
|
||||
connection_data *conn = TLS->ev_base;
|
||||
|
||||
PurpleConversation *conv;
|
||||
if (!(conv = purple_find_chat (conn->gc, tgl_get_peer_id(C->id)))) {
|
||||
// chat conversation is not existing, create it
|
||||
conv = serv_got_joined_chat (conn->gc, tgl_get_peer_id(C->id), C->title);
|
||||
}
|
||||
purple_conv_chat_clear_users (purple_conversation_get_chat_data(conv));
|
||||
chat_add_all_users (conv, C);
|
||||
|
||||
struct message_text *mt = 0;
|
||||
while ((mt = g_queue_pop_head (conn->new_messages))) {
|
||||
if (!chat_add_message(TLS, mt->M, mt->text)) {
|
||||
warning ("WARNING, chat %d still not existing... \n", tgl_get_peer_id (C->id));
|
||||
break;
|
||||
}
|
||||
if (mt->text) {
|
||||
g_free (mt->text);
|
||||
}
|
||||
free (mt);
|
||||
if (!success || !chat_is_member (TLS->our_id, C)) {
|
||||
return;
|
||||
}
|
||||
|
||||
gchar *name = g_strdup_printf ("%d", tgl_get_peer_id (C->id));
|
||||
g_hash_table_remove (conn->joining_chats, name);
|
||||
g_free (name);
|
||||
PurpleChat *PC = p2tgl_chat_find (TLS, C->id);
|
||||
if (!PC) {
|
||||
PC = p2tgl_chat_new (TLS, C);
|
||||
purple_blist_add_chat (PC, NULL, NULL);
|
||||
}
|
||||
|
||||
chat_users_update (TLS, C);
|
||||
}
|
||||
|
||||
void on_ready (struct tgl_state *TLS) {
|
||||
|
@ -896,7 +849,6 @@ static void tgprpl_remove_buddy (PurpleConnection * gc, PurpleBuddy * buddy, Pur
|
|||
// 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
|
||||
|
@ -923,17 +875,9 @@ static void tgprpl_chat_join (PurpleConnection * gc, GHashTable * data) {
|
|||
debug ("tgprpl_chat_join()\n");
|
||||
|
||||
connection_data *conn = purple_connection_get_protocol_data (gc);
|
||||
const char *groupname = g_hash_table_lookup (data, "subject");
|
||||
|
||||
char *id = g_hash_table_lookup(data, "id");
|
||||
if (!id) {
|
||||
warning ("Got no chat id, aborting...\n");
|
||||
return;
|
||||
}
|
||||
if (!purple_find_chat(gc, atoi(id))) {
|
||||
tgl_do_get_chat_info (conn->TLS, TGL_MK_CHAT(atoi(id)), 0, on_chat_get_info, 0);
|
||||
} else {
|
||||
serv_got_joined_chat(conn->gc, atoi(id), groupname);
|
||||
int id = atoi (g_hash_table_lookup (data, "id"));
|
||||
if (id) {
|
||||
chat_show (conn->gc, id);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -94,9 +94,9 @@ void p2tgl_got_chat_left (struct tgl_state *TLS, tgl_peer_id_t chat) {
|
|||
}
|
||||
|
||||
void p2tgl_got_chat_in (struct tgl_state *TLS, tgl_peer_id_t chat, tgl_peer_id_t who, const char *message, int flags, time_t when) {
|
||||
char *name = p2tgl_peer_strdup_id(who);
|
||||
char *name = p2tgl_peer_strdup_id (who);
|
||||
|
||||
serv_got_chat_in(tg_get_conn(TLS), tgl_get_peer_id (chat), name, flags, message, when);
|
||||
serv_got_chat_in (tg_get_conn(TLS), tgl_get_peer_id (chat), name, flags, message, when);
|
||||
|
||||
g_free (name);
|
||||
}
|
||||
|
|
71
tgp-chat.c
Normal file
71
tgp-chat.c
Normal file
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
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 2014
|
||||
*/
|
||||
|
||||
#include "tgp-chat.h"
|
||||
|
||||
void chat_add_all_users (PurpleConversation *pc, struct tgl_chat *chat) {
|
||||
for (int i = 0; i < chat->user_list_size; i++) {
|
||||
struct tgl_chat_user *uid = (chat->user_list + i);
|
||||
int flags = (chat->admin_id == uid->user_id ? PURPLE_CBFLAGS_FOUNDER : PURPLE_CBFLAGS_NONE);
|
||||
p2tgl_conv_add_user (pc, *uid, NULL, flags, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void chat_users_update (struct tgl_state *TLS, struct tgl_chat *chat) {
|
||||
PurpleConversation *pc = purple_find_chat(tg_get_conn(TLS), tgl_get_peer_id(chat->id));
|
||||
if (pc) {
|
||||
purple_conv_chat_clear_users (purple_conversation_get_chat_data(pc));
|
||||
chat_add_all_users (pc, chat);
|
||||
}
|
||||
}
|
||||
|
||||
PurpleConversation *chat_show (PurpleConnection *gc, int id) {
|
||||
connection_data *conn = purple_connection_get_protocol_data(gc);
|
||||
|
||||
PurpleConversation *convo = purple_find_chat (gc, id);
|
||||
if (! convo) {
|
||||
tgl_peer_t *P = tgl_peer_get (conn->TLS, TGL_MK_CHAT(id));
|
||||
convo = p2tgl_got_joined_chat (conn->TLS, &P->chat);
|
||||
chat_users_update (conn->TLS, &P->chat);
|
||||
}
|
||||
return convo;
|
||||
}
|
||||
|
||||
int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text) {
|
||||
connection_data *conn = TLS->ev_base;
|
||||
|
||||
if (chat_show (conn->gc, tgl_get_peer_id (M->to_id))) {
|
||||
p2tgl_got_chat_in(TLS, M->to_id, M->from_id, text ? text : M->message, M->service ? PURPLE_MESSAGE_SYSTEM : PURPLE_MESSAGE_RECV, M->date);
|
||||
|
||||
pending_reads_add (conn->pending_reads, M->to_id);
|
||||
if (p2tgl_status_is_present (purple_account_get_active_status (conn->pa))) {
|
||||
pending_reads_send_all (conn->pending_reads, conn->TLS);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int chat_is_member (int who, struct tgl_chat *chat) {
|
||||
for (int i = 0; i < chat->user_list_size; i++) if ((chat->user_list + i)->user_id) {
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
34
tgp-chat.h
Normal file
34
tgp-chat.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
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 2014
|
||||
*/
|
||||
|
||||
#ifndef __telegram_adium__tgp_chat__
|
||||
#define __telegram_adium__tgp_chat__
|
||||
|
||||
#include "telegram-purple.h"
|
||||
#include "tgp-structs.h"
|
||||
#include "tgp-2prpl.h"
|
||||
#include <purple.h>
|
||||
|
||||
PurpleConversation *chat_show (PurpleConnection *gc, int id);
|
||||
void chat_users_update (struct tgl_state *TLS, struct tgl_chat *chat);
|
||||
int chat_add_message (struct tgl_state *TLS, struct tgl_message *M, char *text);
|
||||
int chat_is_member (int who, struct tgl_chat *chat);
|
||||
|
||||
#endif
|
|
@ -90,7 +90,6 @@ connection_data *connection_data_init (struct tgl_state *TLS, PurpleConnection *
|
|||
conn->pa = pa;
|
||||
conn->new_messages = g_queue_new ();
|
||||
conn->pending_reads = g_queue_new ();
|
||||
conn->joining_chats = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
|
||||
return conn;
|
||||
}
|
||||
|
||||
|
@ -100,7 +99,6 @@ void *connection_data_free (connection_data *conn) {
|
|||
|
||||
tgp_g_queue_free_full (conn->pending_reads, pending_reads_free_cb);
|
||||
tgp_g_queue_free_full (conn->new_messages, message_text_free);
|
||||
g_hash_table_destroy (conn->joining_chats);
|
||||
g_list_free_full (conn->used_images, used_image_free);
|
||||
tgl_free_all (conn->TLS);
|
||||
free (conn->TLS);
|
||||
|
|
|
@ -35,7 +35,6 @@ typedef struct {
|
|||
GQueue *new_messages;
|
||||
GQueue *pending_reads;
|
||||
GList *used_images;
|
||||
GHashTable *joining_chats;
|
||||
guint write_timer;
|
||||
guint login_timer;
|
||||
int in_fallback_chat;
|
||||
|
|
|
@ -19,7 +19,13 @@
|
|||
*/
|
||||
|
||||
#include "tgp-utils.h"
|
||||
#include "purple.h"
|
||||
#include <purple.h>
|
||||
|
||||
connection_data *get_conn_from_buddy (PurpleBuddy *buddy) {
|
||||
connection_data *c = purple_connection_get_protocol_data (
|
||||
purple_account_get_connection (purple_buddy_get_account (buddy)));
|
||||
return c;
|
||||
}
|
||||
|
||||
const char *format_time (time_t date) {
|
||||
struct tm *datetime = localtime(&date);
|
||||
|
|
|
@ -20,11 +20,14 @@
|
|||
#ifndef __telegram_adium__tgp_util__
|
||||
#define __telegram_adium__tgp_util__
|
||||
|
||||
#include "tgp-structs.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <tgl.h>
|
||||
#include <glib.h>
|
||||
|
||||
connection_data *get_conn_from_buddy (PurpleBuddy *buddy);
|
||||
tgl_peer_t *tgp_encr_chat_get_partner (struct tgl_state *TLS, struct tgl_secret_chat *chat);
|
||||
tgl_peer_t *find_peer_by_name (struct tgl_state *TLS, const char *who);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue