diff --git a/mtproto-client.c b/mtproto-client.c index 1c7a635..a0a9018 100644 --- a/mtproto-client.c +++ b/mtproto-client.c @@ -938,9 +938,9 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { { peer_id_t chat_id = MK_CHAT (fetch_int (self)); peer_id_t id = MK_USER (fetch_int (self)); - peer_t *C UU = user_chat_get (bl, chat_id); - peer_t *U UU = user_chat_get (bl, id); - event_update_user_typing(tg, U); + peer_t *C = user_chat_get (bl, chat_id); + peer_t *U = user_chat_get (bl, id); + event_update_chat_user_typing(tg, C, U, 0); if (log_level >= 2) { //print_start (); //push_color (COLOR_YELLOW); @@ -1004,6 +1004,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { fetch_skip_str (self); fetch_skip_str (self); } + event_update_user_name (tg, UC); } break; case CODE_update_user_photo: @@ -1050,6 +1051,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { fetch_file_location (self, &t); } } + event_update_user_photo(tg, UC); fetch_bool (self); } break; @@ -1125,12 +1127,15 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { } //pop_color (); //print_end (); + if (C) { + event_update_chat_participants(tg, C); + } } break; case CODE_update_contact_registered: { peer_id_t user_id = MK_USER (fetch_int (self)); - peer_t *U UU = user_chat_get (bl, user_id); + peer_t *U = user_chat_get (bl, user_id); fetch_int (self); // date //print_start (); //push_color (COLOR_YELLOW); @@ -1140,6 +1145,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { printf (" registered\n"); //pop_color (); //print_end (); + event_update_user_registered(tg, U); } break; case CODE_update_contact_link: @@ -1193,6 +1199,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { s, location); //pop_color (); //print_end (); + event_update_auth_new(tg, location); tfree_str (s); tfree_str (location); } @@ -1333,6 +1340,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { printf ("\n"); //pop_color (); //print_end (); + event_update_chat_add_participant(tg, C, user_id, inviter_id); } break; case CODE_update_chat_participant_delete: @@ -1356,6 +1364,7 @@ void work_update (struct mtproto_connection *self, long long msg_id UU) { printf (" deleted\n"); //pop_color (); //print_end (); + event_update_chat_del_participant(tg, C, user_id, 0); } break; case CODE_update_dc_options: diff --git a/purple-plugin/telegram-purple.c b/purple-plugin/telegram-purple.c index 0014d95..dd58418 100644 --- a/purple-plugin/telegram-purple.c +++ b/purple-plugin/telegram-purple.c @@ -401,10 +401,53 @@ void tgprpl_login_on_connected(gpointer *data, gint fd, const gchar *error_messa conn->mtp = telegram_add_proxy(tg, req, fd, conn); } -void telegram_on_disconnected (struct telegram *tg) +void telegram_on_error (struct telegram *tg, const char *err) { - debug ("telegram_on_disconnected()\n"); - assert (0); + debug ("telegram_on_error()\n"); + telegram_conn *conn = tg->extra; + + purple_connection_error_reason(conn->gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, + err); +} + +void on_update_user_name (struct telegram *tg, peer_t *user) +{ + +} + +void on_update_user_photo (struct telegram *tg, peer_t *user) +{ + +} + +void on_update_user_registered (struct telegram *tg, peer_t *user) +{ + +} + +void on_update_chat_participants (struct telegram *tg, peer_t *chat) +{ + +} + +void on_update_chat_add_participant (struct telegram *tg, peer_t *chat, peer_id_t user, peer_id_t inviter) +{ + +} + +void on_update_chat_del_participant (struct telegram *tg, peer_t *chat, peer_id_t user, void *_ UU) +{ + +} + +void on_update_chat_user_typing (struct telegram *tg, peer_t *chat, peer_t *user, void *_ UU) +{ + +} + +void on_update_auth_new (struct telegram *tg, char *location) +{ + } struct telegram_config tgconf = { @@ -415,15 +458,29 @@ struct telegram_config tgconf = { telegram_on_phone_registration, telegram_on_client_registration, telegram_on_ready, - telegram_on_disconnected, + telegram_on_error, - message_allocated_handler, + // user peer_allocated_handler, - user_info_received_handler, - download_finished_handler, on_new_user_status, on_user_typing, + on_update_user_name, + on_update_user_photo, + on_update_user_registered, + + // chat + on_update_chat_participants, + on_update_chat_add_participant, + on_update_chat_del_participant, + on_update_chat_user_typing, + + // misc + on_update_auth_new, + message_allocated_handler, + download_finished_handler, + user_info_received_handler, on_chat_joined + }; diff --git a/queries.c b/queries.c index a714543..238016a 100644 --- a/queries.c +++ b/queries.c @@ -1865,7 +1865,7 @@ void end_load (struct telegram *instance, struct download *D) { //update_prompt (); close (D->fd); debug ("Done: %s\n", D->name); - event_download_finished_handler(instance, D); + event_download_finished (instance, D); instance->dl_curr = 0; if (D->dc != telegram_get_working_dc(instance)->id) { debug ("%d Not the working dc %d, closing...\n", D->dc, diff --git a/telegram.c b/telegram.c index 941e9dd..6ddadec 100755 --- a/telegram.c +++ b/telegram.c @@ -15,29 +15,8 @@ #include "loop.h" - /* - * New message received - */ -void event_update_new_message(struct telegram *instance, struct message *M) -{ - if (instance->config->on_msg_handler) { - instance->config->on_msg_handler (instance, M); - } -} - -/* - * Peer allocated - */ -void event_peer_allocated(struct telegram *instance, void *peer) -{ - if (instance->config->on_peer_allocated_handler) { - instance->config->on_peer_allocated_handler (instance, peer); - } -} - -/* - * Peer user fetched full + * Events */ void event_user_info_received_handler(struct telegram *instance, struct tgl_user *peer, int show_info) { @@ -46,42 +25,28 @@ void event_user_info_received_handler(struct telegram *instance, struct tgl_user } } -/* - * Download finished - */ -void event_download_finished_handler(struct telegram *instance, struct download *D) -{ - if (instance->config->on_download_finished_handler) { - instance->config->on_download_finished_handler (instance, D); - } -} +DEFINE_EVENT_HANDLER (peer_allocated, void); +DEFINE_EVENT_HANDLER (update_user_status, void); +DEFINE_EVENT_HANDLER (update_user_typing, void); -/* - * User status changed - */ -void event_update_user_status (struct telegram *instance, void *peer) -{ - if (instance->config->on_update_user_status_handler) { - instance->config->on_update_user_status_handler (instance, peer); - } -} +DEFINE_EVENT_HANDLER (update_user_name, peer_t); +DEFINE_EVENT_HANDLER (update_user_photo, peer_t); +DEFINE_EVENT_HANDLER (update_user_registered, peer_t); -/* - * User typing changed - */ -void event_update_user_typing (struct telegram *instance, void *peer) -{ - if (instance->config->on_update_uesr_typing_handler) { - instance->config->on_update_uesr_typing_handler (instance, peer); - } -} +DEFINE_EVENT_HANDLER (update_chat_participants, peer_t); +DEFINE_EVENT_HANDLER_3(update_chat_add_participant, peer_t *, peer_id_t, peer_id_t); +DEFINE_EVENT_HANDLER_3(update_chat_del_participant, peer_t *, peer_id_t, void *); +DEFINE_EVENT_HANDLER_3(update_chat_user_typing, peer_t *, peer_t *, void *); +DEFINE_EVENT_HANDLER (update_auth_new, char); +DEFINE_EVENT_HANDLER (update_new_message, struct message); +DEFINE_EVENT_HANDLER (download_finished, struct download); /** * Calculate the configuration path for the given config file and the given instance * - * @returns The full path to the configuration. + * @returns The full path to the configuration. * * NOTE: the returned string must be freed manually using gfree */ @@ -93,7 +58,8 @@ char *telegram_get_config(struct telegram *instance, char *config) /** * Return whether the current client is registered. */ -int telegram_is_registered(struct telegram *tg) { +int telegram_is_registered(struct telegram *tg) +{ return telegram_get_working_dc(tg)->has_auth; } diff --git a/telegram.h b/telegram.h index 95fdde7..eebf435 100644 --- a/telegram.h +++ b/telegram.h @@ -109,6 +109,46 @@ struct proxy_request { struct telegram; struct download; + +/* + * Events 1 arg + */ + +#define DEFINE_EVENT_LISTENER(E_NAME, D_TYPE) void (*on_ ## E_NAME) (struct telegram *tg, D_TYPE *data); + +#define DECLARE_EVENT_HANDLER(E_NAME, D_TYPE) \ +void event_ ## E_NAME (struct telegram *tg, D_TYPE *data) + +#define DEFINE_EVENT_HANDLER(E_NAME, D_TYPE) \ +void event_ ## E_NAME (struct telegram *tg, D_TYPE *data) \ +{ \ + if (tg->config->on_ ## E_NAME) { \ + tg->config->on_ ## E_NAME (tg, data); \ + } else { \ + warning ("Trying to execute non-existing event listener %s\n", "E_NAME"); \ + } \ +} + +/* + * Events 3 args + */ + +#define DEFINE_EVENT_LISTENER_3(E_NAME, D_TYPE, D_TYPE2, D_TYPE3) void (*on_ ## E_NAME) (struct telegram *tg, D_TYPE data, D_TYPE2 data2, D_TYPE3 data3); + +#define DECLARE_EVENT_HANDLER_3(E_NAME, D_TYPE, D_TYPE2, D_TYPE3) \ +void event_ ## E_NAME (struct telegram *tg, D_TYPE data, D_TYPE2 data2, D_TYPE3 data3) + +#define DEFINE_EVENT_HANDLER_3(E_NAME, D_TYPE, D_TYPE2, D_TYPE3) \ +void event_ ## E_NAME (struct telegram *tg, D_TYPE data, D_TYPE2 data2, D_TYPE3 data3) \ +{ \ + if (tg->config->on_ ## E_NAME) { \ + tg->config->on_ ## E_NAME (tg, data, data2, data3); \ + } else { \ + warning ("Trying to execute non-existing event listener %s\n", "E_NAME"); \ + } \ +} + + /** * Contains all options and pointer to callback functions required by telegram */ @@ -161,48 +201,105 @@ struct telegram_config { /** * A callback function that is called when telegram is disconnected */ - void (*on_disconnected) (struct telegram *instance); - - /** - * A callback function that is called when a new message was allocated. This is useful - * for adding new messages to the GUI. - */ - void (*on_msg_handler) (struct telegram *instance, struct message *M); + void (*on_error) (struct telegram *instance, const char *err); /** * A callback function that is called when a new peer was allocated. This is useful * for populating the GUI with new peers. */ - void (*on_peer_allocated_handler) (struct telegram *instance, void *peer); + DEFINE_EVENT_LISTENER(peer_allocated, void); + + /** + * A callback function that is called when a user's status has changed + */ + DEFINE_EVENT_LISTENER(update_user_status, void); + /** + * A callback function that is called when a user starts or stops typing + */ + DEFINE_EVENT_LISTENER(update_user_typing, void); + DEFINE_EVENT_LISTENER(update_user_name, peer_t); + DEFINE_EVENT_LISTENER(update_user_photo, peer_t); + DEFINE_EVENT_LISTENER(update_user_registered, peer_t); + + DEFINE_EVENT_LISTENER(update_chat_participants, peer_t); + + /** + * A new user is added to a chat + * + * @param data1 The chat + * @param data2 The added user + * @param data3 The inviter + */ + DEFINE_EVENT_LISTENER_3(update_chat_add_participant, peer_t *, peer_id_t, peer_id_t); + + /** + * A user is deleted from a chat + * + * @param data1 The chat + * @param data2 The added user + * @param data3 NULL + */ + DEFINE_EVENT_LISTENER_3(update_chat_del_participant, peer_t *, peer_id_t, void *); + + /** + * A user in a chat is typing + * + * @param data1 The chat + * @param data2 The user + * @param data3 NULL + */ + DEFINE_EVENT_LISTENER_3(update_chat_user_typing, peer_t *, peer_t *, void *); + + /** + * A new device was registered for @location + * + * @param tg + * @param location + */ + DEFINE_EVENT_LISTENER(update_auth_new, char); + + /** + * A callback function that is called when a new message was allocated. This is useful + * for adding new messages to the GUI. + */ + DEFINE_EVENT_LISTENER(update_new_message, struct message); + + /** + * A callback function that is called when a download is completed. This is useful + * for populating the GUI with new user photos. + */ + DEFINE_EVENT_LISTENER(download_finished, struct download); + /** * A callback function that is called when a peer user info was received. This is useful * for populating the GUI with new user photos. */ void (*on_user_info_received_handler) (struct telegram *instance, struct tgl_user *peer, int showInfo); - /** - * A callback function that is called when a download is completed. This is useful - * for populating the GUI with new user photos. - */ - void (*on_download_finished_handler) (struct telegram *instance, struct download *D); - - /** - * A callback function that is called when a user's status has changed - */ - void (*on_update_user_status_handler) (struct telegram *instance, void *peer); - - /** - * A callback function that is called when a user starts or stops typing - */ - void (*on_update_uesr_typing_handler) (struct telegram *instance, void *peer); - /** * A callback function that is called when chat info is received */ void (*on_chat_info_received) (struct telegram *instance, peer_id_t chatid); }; +DECLARE_EVENT_HANDLER (peer_allocated, void); +DECLARE_EVENT_HANDLER (update_user_status, void); +DECLARE_EVENT_HANDLER (update_user_typing, void); + +DECLARE_EVENT_HANDLER (update_user_name, peer_t); +DECLARE_EVENT_HANDLER (update_user_photo, peer_t); +DECLARE_EVENT_HANDLER (update_user_registered, peer_t); + +DECLARE_EVENT_HANDLER (update_chat_participants, peer_t); +DECLARE_EVENT_HANDLER_3 (update_chat_add_participant, peer_t *, peer_id_t, peer_id_t); +DECLARE_EVENT_HANDLER_3 (update_chat_del_participant, peer_t *, peer_id_t, void *); +DECLARE_EVENT_HANDLER_3 (update_chat_user_typing, peer_t *, peer_t *, void *); +DECLARE_EVENT_HANDLER (update_auth_new, char); + +DECLARE_EVENT_HANDLER (update_new_message, struct message); +DECLARE_EVENT_HANDLER (download_finished, struct download); + #define MSG_STORE_SIZE 10000 /** @@ -362,53 +459,11 @@ int network_verify_registration(const char *code, const char *sms_hash); int network_verify_phone_registration(const char *code, const char *sms_hash, const char *first, const char *last); -/** - * Retur if the current phone is registered in the given network. - */ -int network_phone_is_registered(); - -/** - * Return if the current client is registered. - */ -int network_client_is_registered(); - -/** - * Export the current registration to all available data centers - */ -void network_export_registration(); - -/** - * Fetch all unknown messages of the current session - */ -void session_get_difference(); - -/** - * Fetch all known contacts - */ -void session_update_contact_list(); - -/* - * Events - */ -void event_update_new_message(struct telegram *instance, struct message *M); -void event_update_user_status(struct telegram *instance, void *peer); -void event_update_user_typing(struct telegram *instance, void *peer); - -/* - * Load known users and chats on connect - */ -void event_peer_allocated(struct telegram *instance, void *peer); - /* * Load known users and chats on connect */ void event_user_info_received_handler(struct telegram *instance, struct tgl_user *peer, int showInfo); -/* - * Load known users and chats on connect - */ -void event_download_finished_handler(struct telegram *instance, struct download *D); - /** * Set the connection after a proxy_request_cb *