Add support for a /kick command in chat rooms

This commit is contained in:
Eion Robb 2016-11-13 09:22:28 +13:00
parent cd451723ef
commit 71276b109e
3 changed files with 46 additions and 1 deletions

View file

@ -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 <user>: 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

View file

@ -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);

View file

@ -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 *),