diff --git a/telegram-base.c b/telegram-base.c index 72a00f0..cb5df41 100644 --- a/telegram-base.c +++ b/telegram-base.c @@ -614,6 +614,113 @@ void request_accept_secret_chat (struct tgl_state *TLS, struct tgl_secret_chat * g_free (message); } +static void create_group_chat_done_cb (struct tgl_state *TLS, void *_, int success) { + if (! success) { + // alert + purple_notify_error (_telegram_protocol, "Creating Group Chat Failed", + "Creating Group Chat Failed", "Check the error log for further information."); + } +} + +static const char* tgp_request_field_get_value_label (PurpleRequestFields *fields, const char *id) { + GList *labels = purple_request_field_choice_get_labels (purple_request_fields_get_field (fields, id)); + const char *value = g_list_nth_data(labels, purple_request_fields_get_choice(fields, id)); + debug ("Found choice: %s", value); + return value; +} + +static void create_group_chat_cb (void *_data, PurpleRequestFields* fields) { + debug ("create_group_chat_cb()"); + struct accept_create_chat_data *data = _data; + const char *users[3] = { + tgp_request_field_get_value_label (fields, "user1"), + tgp_request_field_get_value_label (fields, "user2"), + tgp_request_field_get_value_label (fields, "user3") + }; + tgl_peer_id_t ids[4]; + ids[0] = TGL_MK_USER(data->TLS->our_id); + int i = 1; + for (int j = 0; j < 3; j++) { + tgl_peer_t *P = NULL; + if ((P = tgl_peer_get_by_name (data->TLS, users[j])) && tgl_get_peer_id(P->id) != data->TLS->our_id) { + ids[i++] = P->id; + debug("adding user id: %d", tgl_get_peer_id(P->id)); + } else { + debug("User %s not found in peer list", users[j]); + } + } + if (i > 1) { + tgl_do_create_group_chat (data->TLS, i, ids, data->title, (int) strlen(data->title), + create_group_chat_done_cb, NULL); + } else { + purple_notify_message (_telegram_protocol, PURPLE_NOTIFY_MSG_INFO, + "Group not created", "Not enough users selected", + NULL, NULL, NULL); + } + g_free (data->title); + free (data); +} + +static void cancel_group_chat_cb (gpointer data) { + debug ("cancel_group_chat_cb()"); + + struct accept_create_chat_data *d = data; + g_free (d->title); + free (d); +} + +static void create_user_list_entry (tgl_peer_t *P, void *extra) { + GList **list = extra; + if (tgl_get_peer_type (P->id) == TGL_PEER_USER) { + *list = g_list_append(*list, P->print_name); + } +} + +static PurpleRequestField *create_user_list (struct tgl_state *TLS, const char *id, const char *txt, int nullable) { + PurpleRequestField *field = purple_request_field_new (id, txt, PURPLE_REQUEST_FIELD_CHOICE); + GList *list = NULL; + if (nullable) { + list = g_list_append (list, ""); + } + tgl_peer_iterator_ex (TLS, create_user_list_entry, &list); + list = g_list_sort(list, (GCompareFunc) g_ascii_strcasecmp); + while (list) { + purple_request_field_choice_add (field, list->data); + list = list->next; + } + g_list_free(list); + return field; +} + +void request_choose_user (struct accept_create_chat_data *data) { + struct tgl_state *TLS = data->TLS; + connection_data *conn = TLS->ev_base; + + PurpleRequestFields* fields = purple_request_fields_new(); + PurpleRequestFieldGroup* group = purple_request_field_group_new ("Invite at least one other user. You can always add more users later..."); + purple_request_field_group_add_field (group, create_user_list (TLS, "user1", "User 1", 0)); + purple_request_field_group_add_field (group, create_user_list (TLS, "user2", "User 2", 1)); + purple_request_field_group_add_field (group, create_user_list (TLS, "user3", "User 3", 1)); + purple_request_fields_add_group(fields, group); + purple_request_fields (conn->gc, "Create Groupe", "Invite Users", NULL, fields, + "Ok", G_CALLBACK(create_group_chat_cb), "Cancel", + G_CALLBACK(cancel_group_chat_cb), NULL, NULL, NULL, data); +} + +void request_create_chat (struct tgl_state *TLS, const char *subject) { + connection_data *conn = TLS->ev_base; + + struct accept_create_chat_data *data = malloc(sizeof(struct accept_create_chat_data)); + data->title = g_strdup(subject); + data->TLS = TLS; + + char *title = g_strdup_printf ("Chat doesn't exist, create a new group chat named '%s'?", subject); + purple_request_accept_cancel (conn->gc, "Create New Group Chat", title, NULL, 1, + conn->pa, NULL, NULL, data, G_CALLBACK(request_choose_user), + G_CALLBACK(cancel_group_chat_cb)); + g_free (title); +} + static void sign_in_callback (struct tgl_state *TLS, void *extra, int success, int registered, const char *mhash) { connection_data *conn = TLS->ev_base; if (!error_if_val_false (TLS, success, "Invalid phone number", diff --git a/telegram-base.h b/telegram-base.h index 53155ef..d7af3eb 100644 --- a/telegram-base.h +++ b/telegram-base.h @@ -43,6 +43,8 @@ void request_password (struct tgl_state *TLS, void (*callback)(struct tgl_state void request_accept_secret_chat (struct tgl_state *TLS, struct tgl_secret_chat *U); +void request_create_chat (struct tgl_state *TLS, const char *subject); + gchar *get_config_dir (struct tgl_state *TLS, char const *username); gchar *get_download_dir (struct tgl_state *TLS); void assert_file_exists (PurpleConnection *gc, const char *filepath, const char *format); diff --git a/telegram-purple.c b/telegram-purple.c index 14c88ab..4eca320 100755 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -620,14 +620,14 @@ static void tgprpl_chat_join (PurpleConnection * gc, GHashTable * data) { return; } - subject = g_hash_table_lookup(data, "subject"); + subject = g_hash_table_lookup (data, "subject"); if (str_not_empty (subject)) { tgl_peer_t *P = tgl_peer_get_by_name (conn->TLS, subject); if (P && tgl_get_peer_type (P->id) == TGL_PEER_CHAT) { chat_show (conn->gc, tgl_get_peer_id (P->id)); return; } - debug ("Peer with name %s not found or not a chat.", subject); + request_create_chat (conn->TLS, subject); } } @@ -704,7 +704,7 @@ static PurplePluginProtocolInfo prpl_info = { tgprpl_status_types, tgprpl_blist_node_menu, // blist_node_menu tgprpl_chat_join_info, - tgprpl_chat_info_deflt, + NULL, tgprpl_login, tgprpl_close, tgprpl_send_im, diff --git a/tgp-structs.h b/tgp-structs.h index c13eb23..c9a65f7 100755 --- a/tgp-structs.h +++ b/tgp-structs.h @@ -79,6 +79,11 @@ struct accept_secret_chat_data { struct tgl_secret_chat *U; }; +struct accept_create_chat_data { + struct tgl_state *TLS; + char *title; +}; + void pending_reads_send_all (GQueue *queue, struct tgl_state *TLS); void pending_reads_add (GQueue *queue, tgl_peer_id_t id); struct message_text *message_text_init (struct tgl_message *M, gchar *text);