/soc/2015/jgeboski/facebook: 53cb588d8760: facebook: implemented...
James Geboski <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 53cb588d876050e10ed633096f10c5e0234f5ec8 Author: James Geboski <[email protected]> Date: 2015-07-05 14:44 -0400 Branch: facebook URL: https://hg.pidgin.im/soc/2015/jgeboski/facebook/rev/53cb588d8760 Description: facebook: implemented kicking/leaving group chats diffstat: libpurple/protocols/facebook/api.c | 48 +++++++++++- libpurple/protocols/facebook/api.h | 3 + libpurple/protocols/facebook/facebook.c | 127 ++++++++++++++++++++++++++++++- libpurple/protocols/facebook/json.c | 24 ++++- libpurple/protocols/facebook/util.c | 62 +++++++++++++++ libpurple/protocols/facebook/util.h | 16 ++++ 6 files changed, 266 insertions(+), 14 deletions(-) diffs (truncated from 431 to 300 lines): diff --git a/libpurple/protocols/facebook/api.c b/libpurple/protocols/facebook/api.c --- a/libpurple/protocols/facebook/api.c +++ b/libpurple/protocols/facebook/api.c @@ -1219,6 +1219,7 @@ fb_api_cb_threads(PurpleHttpConnection * FbApiPrivate *priv = api->priv; FbApiThread thrd; FbApiUser user; + gboolean haself; gchar *str; GError *err = NULL; GList *elms = NULL; @@ -1258,7 +1259,7 @@ fb_api_cb_threads(PurpleHttpConnection * FB_API_ERROR_CHK(api, err, goto finish); elms2 = json_array_get_elements(arr2); - for (m = elms2; m != NULL; m = m->next) { + for (haself = FALSE, m = elms2; m != NULL; m = m->next) { node2 = m->data; fb_api_user_reset(&user, FALSE); @@ -1268,6 +1269,7 @@ fb_api_cb_threads(PurpleHttpConnection * g_free(str); if (user.uid == priv->uid) { + haself = TRUE; continue; } @@ -1289,8 +1291,12 @@ fb_api_cb_threads(PurpleHttpConnection * continue; } - mptr = fb_api_thread_dup(&thrd, FALSE); - thrds = g_slist_prepend(thrds, mptr); + if (haself) { + mptr = fb_api_thread_dup(&thrd, FALSE); + thrds = g_slist_prepend(thrds, mptr); + } else { + fb_api_thread_reset(&thrd, TRUE); + } } ret = g_slist_reverse(thrds); @@ -1428,6 +1434,42 @@ fb_api_thread_list(FbApi *api) } void +fb_api_thread_remove(FbApi *api, FbId tid, FbId uid) +{ + FbApiPrivate *priv; + FbHttpParams *prms; + gchar *json; + JsonBuilder *bldr; + + static const FbApiHttpInfo info = { + fb_api_cb_http_bool, + "com.facebook.orca.protocol.a", + "removeMembers", + "DELETE" + }; + + g_return_if_fail(api != NULL); + priv = api->priv; + + prms = fb_http_params_new(); + fb_http_params_set_strf(prms, "id", "t_id.%" FB_ID_FORMAT, tid); + + if (uid == 0) { + uid = priv->uid; + } + + if (uid != priv->uid) { + bldr = fb_json_bldr_new(JSON_NODE_ARRAY); + fb_json_bldr_add_strf(bldr, NULL, "%" FB_ID_FORMAT, uid); + json = fb_json_bldr_close(bldr, JSON_NODE_ARRAY, NULL); + fb_http_params_set_str(prms, "to", json); + g_free(json); + } + + fb_api_http_req(api, &info, prms, FB_API_URL_PARTS); +} + +void fb_api_thread_topic(FbApi *api, FbId tid, const gchar *topic) { FbHttpParams *prms; diff --git a/libpurple/protocols/facebook/api.h b/libpurple/protocols/facebook/api.h --- a/libpurple/protocols/facebook/api.h +++ b/libpurple/protocols/facebook/api.h @@ -191,6 +191,9 @@ void fb_api_thread_list(FbApi *api); void +fb_api_thread_remove(FbApi *api, FbId tid, FbId uid); + +void fb_api_thread_topic(FbApi *api, FbId tid, const gchar *topic); void diff --git a/libpurple/protocols/facebook/facebook.c b/libpurple/protocols/facebook/facebook.c --- a/libpurple/protocols/facebook/facebook.c +++ b/libpurple/protocols/facebook/facebook.c @@ -30,11 +30,13 @@ #include "version.h" #include "api.h" +#include "cmds.h" #include "data.h" #include "facebook.h" #include "util.h" -static PurpleProtocol *my_protocol = NULL; +static GSList *fb_cmds = NULL; +static PurpleProtocol *fb_protocol = NULL; static void fb_cb_api_error(FbApi *api, GError *error, gpointer data); @@ -739,6 +741,79 @@ fb_roomlist_cancel(PurpleRoomlist *list) g_object_unref(list); } +static PurpleCmdRet +fb_cmd_kick(PurpleConversation *conv, const gchar *cmd, gchar **args, + gchar **error, gpointer data) +{ + const gchar *name; + FbApi *api; + FbData *fata; + FbId tid; + FbId uid; + GError *err = NULL; + PurpleAccount *acct; + PurpleBuddy *bdy; + PurpleConnection *gc; + PurpleChatConversation *chat; + + g_return_val_if_fail(PURPLE_IS_CHAT_CONVERSATION(conv), + PURPLE_CMD_RET_FAILED); + + gc = purple_conversation_get_connection(conv); + acct = purple_connection_get_account(gc); + chat = PURPLE_CHAT_CONVERSATION(conv); + bdy = fb_util_account_find_buddy(acct, chat, args[0], &err); + + if (err != NULL) { + *error = g_strdup_printf(_("%s."), err->message); + g_error_free(err); + return PURPLE_CMD_RET_FAILED; + } + + fata = purple_connection_get_protocol_data(gc); + api = fb_data_get_api(fata); + + name = purple_conversation_get_name(conv); + tid = FB_ID_FROM_STR(name); + + name = purple_buddy_get_name(bdy); + uid = FB_ID_FROM_STR(name); + + purple_chat_conversation_remove_user(chat, name, NULL); + fb_api_thread_remove(api, tid, uid); + return PURPLE_CMD_RET_OK; +} + +static PurpleCmdRet +fb_cmd_leave(PurpleConversation *conv, const gchar *cmd, gchar **args, + gchar **error, gpointer data) +{ + const gchar *name; + FbApi *api; + FbData *fata; + FbId tid; + gint id; + PurpleConnection *gc; + PurpleChatConversation *chat; + + g_return_val_if_fail(PURPLE_IS_CHAT_CONVERSATION(conv), + PURPLE_CMD_RET_FAILED); + + gc = purple_conversation_get_connection(conv); + fata = purple_connection_get_protocol_data(gc); + api = fb_data_get_api(fata); + + chat = PURPLE_CHAT_CONVERSATION(conv); + id = purple_chat_conversation_get_id(chat); + + name = purple_conversation_get_name(conv); + tid = FB_ID_FROM_STR(name); + + purple_serv_got_chat_left(gc, id); + fb_api_thread_remove(api, tid, 0); + return PURPLE_CMD_RET_OK; +} + static void facebook_protocol_init(PurpleProtocol *protocol) { @@ -814,6 +889,43 @@ PURPLE_DEFINE_TYPE_EXTENDED( facebook_protocol_roomlist_iface_init) ); +static void +fb_cmds_register(void) +{ + PurpleCmdId id; + + static PurpleCmdFlag cflags = + PURPLE_CMD_FLAG_CHAT | + PURPLE_CMD_FLAG_PROTOCOL_ONLY; + + g_return_if_fail(fb_cmds == NULL); + + id = purple_cmd_register("kick", "s", PURPLE_CMD_P_PROTOCOL, cflags, + fb_protocol->id, fb_cmd_kick, + _("kick: Kick someone from the chat"), + NULL); + fb_cmds = g_slist_prepend(fb_cmds, GUINT_TO_POINTER(id)); + + id = purple_cmd_register("leave", "", PURPLE_CMD_P_PROTOCOL, cflags, + fb_protocol->id, fb_cmd_leave, + _("leave: Leave the chat"), + NULL); + fb_cmds = g_slist_prepend(fb_cmds, GUINT_TO_POINTER(id)); +} + +static void +fb_cmds_unregister_free(gpointer data) +{ + PurpleCmdId id = GPOINTER_TO_UINT(data); + purple_cmd_unregister(id); +} + +static void +fb_cmds_unregister(void) +{ + g_slist_free_full(fb_cmds, fb_cmds_unregister_free); +} + static PurplePluginInfo * plugin_query(GError **error) { @@ -836,14 +948,21 @@ static gboolean plugin_load(PurplePlugin *plugin, GError **error) { facebook_protocol_register_type(plugin); - my_protocol = purple_protocols_add(FACEBOOK_TYPE_PROTOCOL, error); - return my_protocol != NULL; + fb_protocol = purple_protocols_add(FACEBOOK_TYPE_PROTOCOL, error); + + if (fb_protocol == NULL) { + return FALSE; + } + + fb_cmds_register(); + return TRUE; } static gboolean plugin_unload(PurplePlugin *plugin, GError **error) { - return purple_protocols_remove(my_protocol, error); + fb_cmds_unregister(); + return purple_protocols_remove(fb_protocol, error); } PURPLE_PLUGIN_INIT(facebook, plugin_query, plugin_load, plugin_unload); diff --git a/libpurple/protocols/facebook/json.c b/libpurple/protocols/facebook/json.c --- a/libpurple/protocols/facebook/json.c +++ b/libpurple/protocols/facebook/json.c @@ -128,28 +128,40 @@ fb_json_bldr_obj_end(JsonBuilder *bldr) void fb_json_bldr_add_bool(JsonBuilder *bldr, const gchar *name, gboolean value) { - json_builder_set_member_name(bldr, name); + if (name != NULL) { + json_builder_set_member_name(bldr, name); + } + json_builder_add_boolean_value(bldr, value); } void fb_json_bldr_add_dbl(JsonBuilder *bldr, const gchar *name, gdouble value) { - json_builder_set_member_name(bldr, name); + if (name != NULL) { + json_builder_set_member_name(bldr, name); + } + json_builder_add_double_value(bldr, value); } void fb_json_bldr_add_int(JsonBuilder *bldr, const gchar *name, gint64 value) { - json_builder_set_member_name(bldr, name); + if (name != NULL) { + json_builder_set_member_name(bldr, name); + } + _______________________________________________ Commits mailing list [email protected] https://pidgin.im/cgi-bin/mailman/listinfo/commits