changeset 568:eb1df2371581

Add "/room kick"
author Mikael Berthe <mikael@lilotux.net>
date Sat, 03 Dec 2005 13:32:29 +0100
parents 6f490c725999
children 69afee8e1232
files mcabber/src/commands.c mcabber/src/jabglue.c mcabber/src/jabglue.h
diffstat 3 files changed, 87 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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__ */