--- 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);
--- 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"
--- 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__ */