# HG changeset patch # User Mikael Berthe # Date 1133613149 -3600 # Node ID eb1df2371581dac1bea64f4649e515fa7370afa0 # Parent 6f490c725999879d88d001668479adced2363174 Add "/room kick" diff -r 6f490c725999 -r eb1df2371581 mcabber/src/commands.c --- a/mcabber/src/commands.c Sat Dec 03 00:24:05 2005 +0100 +++ b/mcabber/src/commands.c Sat Dec 03 13:32:29 2005 +0100 @@ -158,6 +158,7 @@ // Room category compl_add_category_word(COMPL_ROOM, "invite"); compl_add_category_word(COMPL_ROOM, "join"); + compl_add_category_word(COMPL_ROOM, "kick"); compl_add_category_word(COMPL_ROOM, "leave"); compl_add_category_word(COMPL_ROOM, "names"); compl_add_category_word(COMPL_ROOM, "nick"); @@ -1176,7 +1177,7 @@ if (param_needed) { if (!arg) { - scr_LogPrint(LPRINT_NORMAL, "Wrong or missing parameter"); + scr_LogPrint(LPRINT_NORMAL, "Missing parameter"); return NULL; } } @@ -1244,6 +1245,27 @@ free_arg_lst(paramlst); } +static void room_kick(gpointer bud, char *arg) +{ + char **paramlst; + gchar *nick; + const char *roomid = buddy_getjid(bud); + + paramlst = split_arg(arg, 2, 1); // nickname, reason + nick = *paramlst; + arg = *(paramlst+1); + + if (!nick || !*nick) { + scr_LogPrint(LPRINT_NORMAL, "Missing parameter (nickname)"); + free_arg_lst(paramlst); + return; + } + + jb_room_kickban(roomid, NULL, nick, 1, arg); + + free_arg_lst(paramlst); +} + static void room_leave(gpointer bud, char *arg) { gchar *roomid, *utf8_nickname; @@ -1376,6 +1398,9 @@ } else if (!strcasecmp(subcmd, "invite")) { if ((arg = check_room_subcommand(arg, TRUE, bud)) != NULL) room_invite(bud, arg); + } else if (!strcasecmp(subcmd, "kick")) { + if ((arg = check_room_subcommand(arg, TRUE, bud)) != NULL) + room_kick(bud, arg); } else if (!strcasecmp(subcmd, "leave")) { if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL) room_leave(bud, arg); diff -r 6f490c725999 -r eb1df2371581 mcabber/src/jabglue.c --- a/mcabber/src/jabglue.c Sat Dec 03 00:24:05 2005 +0100 +++ b/mcabber/src/jabglue.c Sat Dec 03 13:32:29 2005 +0100 @@ -584,6 +584,65 @@ jb_reset_keepalive(); } +// Kick or ban a MUC room member +// room syntax: "room@server" +// Either the jid or the nickname must be set (when banning, only the jid is +// allowed) +// kickban: 1=kick 2=ban +// The reason can be null +// Return 0 if everything is ok +int jb_room_kickban(const char *roomid, const char *jid, const char *nick, + int kickban, const char *reason) +{ + xmlnode x, y, z; + + if (!online || !roomid) return 1; + if (kickban != 1 && kickban != 2) return 1; + + if (check_jid_syntax((char*)roomid)) { + scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", roomid); + return 1; + } + if (jid && check_jid_syntax((char*)jid)) { + scr_LogPrint(LPRINT_NORMAL, "<%s> is not a valid Jabber id", jid); + return 1; + } + + if (kickban == 2 && !jid) + return 1; // Shouldn't happen + + x = jutil_iqnew(JPACKET__SET, "http://jabber.org/protocol/muc#admin"); + xmlnode_put_attrib(x, "id", "kick1"); // XXX + xmlnode_put_attrib(x, "to", roomid); + xmlnode_put_attrib(x, "type", "set"); + y = xmlnode_get_tag(x, "query"); + z = xmlnode_insert_tag(y, "item"); + + if (!jid) { + gchar *utf8_nickname = to_utf8(nick); + xmlnode_put_attrib(z, "nick", utf8_nickname); + g_free(utf8_nickname); + } else { + xmlnode_put_attrib(z, "jid", jid); + if (kickban == 2) + xmlnode_put_attrib(z, "affiliation", "outcast"); + } + if (kickban == 1) + xmlnode_put_attrib(z, "role", "none"); + + if (reason) { + gchar *utf8_reason = to_utf8(reason); + y = xmlnode_insert_tag(z, "reason"); + xmlnode_insert_cdata(y, utf8_reason, (unsigned) -1); + g_free(utf8_reason); + } + + jab_send(jc, x); + xmlnode_free(x); + jb_reset_keepalive(); + + return 0; +} // Invite a user to a MUC room // room syntax: "room@server" diff -r 6f490c725999 -r eb1df2371581 mcabber/src/jabglue.h --- a/mcabber/src/jabglue.h Sat Dec 03 00:24:05 2005 +0100 +++ b/mcabber/src/jabglue.h Sat Dec 03 13:32:29 2005 +0100 @@ -58,5 +58,7 @@ void jb_room_join(const char *room, const char *nickname); void jb_room_unlock(const char *room); void jb_room_invite(const char *room, const char *jid, const char *reason); +int jb_room_kickban(const char *roomid, const char *jid, const char *nick, + int kickban, const char *reason); #endif /* __JABGLUE_H__ */