diff --git a/telegram-purple.c b/telegram-purple.c index 6540818..55b8c04 100644 --- a/telegram-purple.c +++ b/telegram-purple.c @@ -408,6 +408,26 @@ void leave_and_delete_chat_by_name (struct tgl_state *TLS, const char *name) { leave_and_delete_chat (TLS, P); } +static PurpleCmdRet +tgprpl_cmd_kick(PurpleConversation *conv, const gchar *cmd, gchar **args, gchar **error, void *data) +{ + PurpleConnection *pc = NULL; + int id = -1; + gchar *who; + + pc = conv->account->gc; + id = purple_conv_chat_get_id(PURPLE_CONV_CHAT(conv)); + + if (pc == NULL || id == -1) + return PURPLE_CMD_RET_FAILED; + + who = g_strjoinv(" ", args); + tgprpl_kick_from_chat(pc, id, who); + g_free(who); + + return PURPLE_CMD_RET_OK; +} + static void import_chat_link_done (struct tgl_state *TLS, void *extra, int success) { if (! success) { tgp_notify_on_error_gw (TLS, NULL, success); @@ -797,6 +817,15 @@ static PurplePluginProtocolInfo prpl_info = { NULL // add_buddies_with_invite }; +static gboolean tgprpl_load (PurplePlugin *plugin) { + purple_cmd_register("kick", "s", PURPLE_CMD_P_PLUGIN, PURPLE_CMD_FLAG_CHAT | + PURPLE_CMD_FLAG_PRPL_ONLY | PURPLE_CMD_FLAG_ALLOW_WRONG_ARGS, + PLUGIN_ID, tgprpl_cmd_kick, + _("kick : Kick a user from the room."), NULL); + + return TRUE; +} + static void tgprpl_init (PurplePlugin *plugin) { PurpleAccountOption *opt; @@ -884,7 +913,7 @@ static PurplePluginInfo plugin_info = { N_("Telegram Protocol Plugin."), PLUGIN_AUTHOR, "https://github.com/majn/telegram-purple", - NULL, // on load + tgprpl_load, // on load NULL, // on unload NULL, // on destroy NULL, // ui specific struct diff --git a/tgp-chat.c b/tgp-chat.c index 2e4a1c1..e00ee6e 100644 --- a/tgp-chat.c +++ b/tgp-chat.c @@ -218,6 +218,21 @@ int tgprpl_send_chat (PurpleConnection *gc, int id, const char *message, PurpleM return tgp_msg_send (gc_get_tls (gc), message, P->id); } +void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who) { + debug ("tgprpl_kick_from_chat()"); + + tgl_peer_t *P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHAT(id)); + if (! P) { + P = tgl_peer_get (gc_get_tls (gc), TGL_MK_CHANNEL(id)); + } + g_return_if_fail(P != NULL); + + tgl_peer_t *other_id = tgp_blist_lookup_peer_get (gc_get_tls (gc), who); + g_return_if_fail(P != NULL); + + tgl_do_del_user_from_chat (gc_get_tls (gc), P->id, other_id->id, tgp_notify_on_error_gw, NULL); +} + GList *tgprpl_chat_join_info (PurpleConnection *gc) { struct proto_chat_entry *pce; pce = g_new0 (struct proto_chat_entry, 1); diff --git a/tgp-chat.h b/tgp-chat.h index a7154fa..d6aff67 100644 --- a/tgp-chat.h +++ b/tgp-chat.h @@ -53,6 +53,7 @@ PurpleRoomlist *tgprpl_roomlist_get_list (PurpleConnection *gc); void tgprpl_roomlist_cancel (PurpleRoomlist *list); GHashTable *tgprpl_chat_info_defaults (PurpleConnection *gc, const char *chat_name); void tgp_chat_join_all_pending (struct tgl_state *TLS); +void tgprpl_kick_from_chat (PurpleConnection *gc, int id, const char *who); void tgp_channel_load (struct tgl_state *TLS, tgl_peer_t *P, void (*callback) (struct tgl_state *, void *, int, tgl_peer_t *),