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"