changeset 1377:cd9182f0b5c7

Add /room setopt {print_status,auto_whois} - add the command /room setopt - add option 'muc_auto_whois' The MUC settings auto_whois and print_status can be set on a per-room basis.
author Mikael Berthe <mikael@lilotux.net>
date Tue, 27 Nov 2007 23:57:20 +0100
parents a0deb5124ebf
children 61fc9eddf763
files mcabber/doc/help/de/hlp_room.txt mcabber/doc/help/en/hlp_room.txt mcabber/doc/help/fr/hlp_room.txt mcabber/doc/help/it/hlp_room.txt mcabber/doc/help/nl/hlp_room.txt mcabber/doc/help/pl/hlp_room.txt mcabber/doc/help/ru/hlp_room.txt mcabber/doc/help/uk/hlp_room.txt mcabber/mcabberrc.example mcabber/src/commands.c mcabber/src/jabglue.c mcabber/src/roster.c mcabber/src/roster.h
diffstat 13 files changed, 222 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/doc/help/de/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/de/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Der "room" Befehl umfasst die Multi-User Chat (kurz MUC) Befehle.
@@ -37,6 +38,7 @@
  Ändert die Rolle der jid (rolle kann "none", "visitor", "participant" oder "moderator" sein)
 /room affil jid zugeh [grund]
  Ändert die Zugehörigkeit der jid zum Raum. (zugh kann "none", "member", "admin" oder "owner" sein)
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [-autojoin|+autojoin]
  Zum Hinzufügen, Löschen und Ändern von Raum-Bookmarks.
  Wenn autojoin gesetzt ist, wird mcabber nach dem verbinden zum Server diesen MUC automatisch betreten.
--- a/mcabber/doc/help/en/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/en/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 The 'room' command handles Multi-User Chat room actions.
@@ -37,6 +38,11 @@
  Change jid's role (role can be "none", "visitor", "participant", "moderator")
 /room affil jid affil [reason]
  Change jid's affiliation (affil can be "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [value]
+ Change settings for the current room
+ For print_status, the possible values are "default", "none", "in_and_out", "all".
+ For auto_whois, the possible values are "default", "off", "on".
+ When the value is "default", the options muc_print_status / muc_auto_whois is used.
 /room bookmark [add|del] [-autojoin|+autojoin]
  Add, remove or update a bookmark (default is add).
  If autojoin is set, mcabber will automatically join the MUC room when it connects to the server.
--- a/mcabber/doc/help/fr/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/fr/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [valeur]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Cette commande permet de gérer les salons de discussions MUC (Multi-User Chat).
@@ -37,6 +38,11 @@
  Change le rôle de jid (role peut être "none", "visitor", "participant", "moderator")
 /room affil jid affil [raison]
  Change l'affiliation de jid (affil peut être "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [valeur]
+ Change certains paramètres du salon sélectionné
+ Pour print_status, les valeurs possibles sont "default", "none", "in_and_out", "all".
+ Pour auto_whois, les valeurs possibles sont "default", "off", "on".
+ Si la valeur est "default", la configuration utilisée sera celle des options muc_print_status et muc_auto_whois.
 /room bookmark [add|del] [-autojoin|+autojoin]
  Ajoute, supprime ou met à jour le signet (par défaut, ajoute).
  Si "autojoin" est activé, mcabber entrera automatiquement dans la salle de conférence après s'être connecté au serveur.
--- a/mcabber/doc/help/it/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/it/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|unban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Il comando 'room' gestisce le azioni per le stanze di chat multi-utente.
@@ -38,6 +39,7 @@
  Cambia il ruolo di jid (il ruolo pu essere "none", "visitor", "participant", "moderator")
 /room affil jid affil [motivo]
  Cambia l'affiliazione di jid (l'affiliazione pu essere "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [-autojoin|+autojoin]
  Aggiunge, rimuove o aggiorna un bookmark (di default aggiunge).
  Se  impostato l'autojoin, mcabber entrer automaticamente nella stanza quando si connette al server.
--- a/mcabber/doc/help/nl/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/nl/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Het 'room' commando verzorgt de Multi-User Chat (MUC) room acties.
@@ -37,6 +38,7 @@
  Verander jid's rol (rol kan zijn: "none", "visitor", "participant", "moderator")
 /room affil jid affil [reden]
  Verander jid's verbintenis (affil kan zijn: "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [-autojoin|+autojoin]
  Toevoegen, verwijderen of aanpassen van een bookmark (standaard is toevoegen).
  Indien 'autojoin' actief is, zal mcabber automatisch de MUC chatroom betreden wanner het verbinding met de server heeft gemaakt.
--- a/mcabber/doc/help/pl/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/pl/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Polecenie 'room' służy do obsługi wieloużytkownikowych chat-room'ów.
@@ -37,6 +38,7 @@
  Zmienia rolę użytkownika jid (może być: "none", "visitor", "participant", "moderator")
 /room affil jid affil [powód]
  Zmienia przynależność jid'a (może być: "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [-autojoin|+autojoin]
  Dodaje, usuwa, aktualizuje zakładki (domyślnie dodaje).
  Jeśli ustawiona jest opcja "autojoin", mcabber automatycznie dołączy do danego MUC po połączeniu z serwerem.
--- a/mcabber/doc/help/ru/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/ru/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin]
 
 Команда 'room' работает с конференциями (Multi-User Chat room).
@@ -37,6 +38,7 @@
  Изменить статус  пользователя "jid" (статус может быть "none", "visitor", "participant", "moderator")
 /room affil jid affil [reason]
  Принять пользователя "jid" в члены конференции (члены могут быть "none", "member", "admin", "owner")
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [-autojoin|+autojoin]
  Добавить, удалить или обновить закладку (по умолчанию: add - добавить)
  Если включена опция autojoin, mcabber автоматически подключается к конференции после соединения с Jabber-сервером.
--- a/mcabber/doc/help/uk/hlp_room.txt	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/doc/help/uk/hlp_room.txt	Tue Nov 27 23:57:20 2007 +0100
@@ -1,6 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|kick|ban|unban|role|affil
+ /ROOM setopt print_status|auto_whois [value]
  /ROOM bookmark [add|del] [+autojoin|-autojoin]
 
 Команда, відповідальна за дії при багатокористувацькій розмові.
@@ -37,6 +38,7 @@
  Змінити роль jid у комнаті ("none", "visitor", "participant", "moderator")
 /room affil jid ступінь [причина]
  Змінити ступінь довіри для jid ("none", "member", "admin", "owner").
+/room setopt print_status|auto_whois [value]
 /room bookmark [add|del] [+autojoin|-autojoin]
  Додати, потерти, або замінити закладку (якщо не вказано - додасть).
  Якщо встановити автовхід, mcabber буде заходити в цю кімнату після з'єднання з сервером.
--- a/mcabber/mcabberrc.example	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/mcabberrc.example	Tue Nov 27 23:57:20 2007 +0100
@@ -245,6 +245,12 @@
 # the roster when somebody joins a room.  Set it to 2 if you want a flag
 # for leaves too.
 #set muc_flag_joins = 0
+# Set 'muc_print_status' to see status changes in MUC rooms:
+# 1: (none)       do not display joining/leaving members
+# 2: (in_and_out) display joining/leaving members
+# 3: (all)        display joining/leaving members and member status changes
+# (default: in_and_out)
+#set muc_print_status = 2
 # Set 'muc_auto_whois' to 1 if you want to call /room whois each time
 # somebody joins a room. (default: 0)
 #set muc_auto_whois = 0
--- a/mcabber/src/commands.c	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/src/commands.c	Tue Nov 27 23:57:20 2007 +0100
@@ -236,6 +236,7 @@
   compl_add_category_word(COMPL_ROOM, "privmsg");
   compl_add_category_word(COMPL_ROOM, "remove");
   compl_add_category_word(COMPL_ROOM, "role");
+  compl_add_category_word(COMPL_ROOM, "setopt");
   compl_add_category_word(COMPL_ROOM, "topic");
   compl_add_category_word(COMPL_ROOM, "unban");
   compl_add_category_word(COMPL_ROOM, "unlock");
@@ -2426,6 +2427,74 @@
   jb_room_unlock(buddy_getjid(bud));
 }
 
+static void room_setopt(gpointer bud, char *arg)
+{
+  char **paramlst;
+  char *param, *value;
+  enum { opt_none = 0, opt_printstatus, opt_autowhois } option = 0;
+
+  paramlst = split_arg(arg, 2, 1); // param, value
+  param = *paramlst;
+  value = *(paramlst+1);
+  if (!param) {
+    scr_LogPrint(LPRINT_NORMAL, "Please specify a room option.");
+    free_arg_lst(paramlst);
+    return;
+  }
+
+  if (!strcasecmp(param, "print_status"))
+    option = opt_printstatus;
+  else if (!strcasecmp(param, "auto_whois"))
+    option = opt_autowhois;
+  else {
+    scr_LogPrint(LPRINT_NORMAL, "Wrong option!");
+    free_arg_lst(paramlst);
+    return;
+  }
+
+  // If no value is given, display the current value
+  if (!value) {
+    const char *strval;
+    if (option == opt_printstatus)
+      strval = strprintstatus[buddy_getprintstatus(bud)];
+    else
+      strval = strautowhois[buddy_getautowhois(bud)];
+    scr_LogPrint(LPRINT_NORMAL, "%s is set to: %s", param, strval);
+    free_arg_lst(paramlst);
+    return;
+  }
+
+  if (option == opt_printstatus) {
+    enum room_printstatus eval;
+    if (!strcasecmp(value, "none"))
+      eval = status_none;
+    else if (!strcasecmp(value, "in_and_out"))
+      eval = status_in_and_out;
+    else if (!strcasecmp(value, "all"))
+      eval = status_all;
+    else {
+      eval = status_default;
+      if (strcasecmp(value, "default") != 0)
+        scr_LogPrint(LPRINT_NORMAL, "Unrecognized value, assuming default...");
+    }
+    buddy_setprintstatus(bud, eval);
+  } else if (option == opt_autowhois) {
+    enum room_autowhois eval;
+    if (!strcasecmp(value, "on"))
+      eval = autowhois_on;
+    else if (!strcasecmp(value, "off"))
+      eval = autowhois_off;
+    else {
+      eval = autowhois_default;
+      if (strcasecmp(value, "default") != 0)
+        scr_LogPrint(LPRINT_NORMAL, "Unrecognized value, assuming default...");
+    }
+    buddy_setautowhois(bud, eval);
+  }
+
+  free_arg_lst(paramlst);
+}
+
 //  room_whois(..)
 // If interactive is TRUE, chatmode can be enabled.
 void room_whois(gpointer bud, char *arg, guint interactive)
@@ -2656,6 +2725,9 @@
   } else if (!strcasecmp(subcmd, "unlock"))  {
     if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL)
       room_unlock(bud, arg);
+  } else if (!strcasecmp(subcmd, "setopt"))  {
+    if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL)
+      room_setopt(bud, arg);
   } else if (!strcasecmp(subcmd, "topic"))  {
     if ((arg = check_room_subcommand(arg, FALSE, bud)) != NULL)
       room_topic(bud, arg);
--- a/mcabber/src/jabglue.c	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/src/jabglue.c	Tue Nov 27 23:57:20 2007 +0100
@@ -2000,10 +2000,13 @@
   const char *ournick;
   enum imrole mbrole = role_none;
   enum imaffiliation mbaffil = affil_none;
+  enum room_printstatus printstatus;
+  enum room_autowhois autowhois;
   const char *mbjid = NULL, *mbnick = NULL;
   const char *actorjid = NULL, *reason = NULL;
   bool new_member = FALSE; // True if somebody else joins the room (not us)
-  unsigned int statuscode = 0;
+  guint statuscode = 0;
+  guint nickchange = 0;
   GSList *room_elt;
   int log_muc_conf;
   guint msgflags;
@@ -2084,6 +2087,14 @@
       statuscode = atoi(p);
   }
 
+  // Get the room's "print_status" settings
+  printstatus = buddy_getprintstatus(room_elt->data);
+  if (printstatus == status_default) {
+    printstatus = (guint) settings_opt_get_int("muc_print_status");
+    if (printstatus > 3)
+      printstatus = status_default;
+  }
+
   // Check for nickname change
   if (statuscode == 303 && mbnick) {
     mbuf = g_strdup_printf("%s is now known as %s", rname, mbnick);
@@ -2096,6 +2107,7 @@
     // Maybe it's _our_ nickname...
     if (ournick && !strcmp(rname, ournick))
       buddy_setnickname(room_elt->data, mbnick);
+    nickchange = TRUE;
   }
 
   // Check for departure/arrival
@@ -2169,11 +2181,14 @@
       }
     }
 
-    msgflags = HBB_PREFIX_INFO;
-    if (!we_left && settings_opt_get_int("muc_flag_joins") != 2)
-      msgflags |= HBB_PREFIX_NOFLAG;
-
-    scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
+    // Display the mbuf message if we're concerned
+    // or if the print_status isn't set to none.
+    if (we_left || printstatus != status_none) {
+      msgflags = HBB_PREFIX_INFO;
+      if (!we_left && settings_opt_get_int("muc_flag_joins") != 2)
+        msgflags |= HBB_PREFIX_NOFLAG;
+      scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
+    }
 
     if (log_muc_conf)
       hlog_write_message(roomjid, 0, -1, mbuf);
@@ -2210,15 +2225,19 @@
         if (log_muc_conf)
           hlog_write_message(roomjid, 0, -1, mbuf);
         g_free(mbuf);
-        mbuf = g_strdup_printf("%s has joined", rname);
+        if (printstatus != status_none)
+          mbuf = g_strdup_printf("%s has joined", rname);
+        else
+          mbuf = NULL;
         new_member = TRUE;
       }
     } else {
+      mbuf = NULL;
       if (strcmp(ournick, rname)) {
-        mbuf = g_strdup_printf("%s has joined", rname);
+        if (printstatus != status_none)
+          mbuf = g_strdup_printf("%s has joined", rname);
         new_member = TRUE;
-      } else
-        mbuf = NULL;
+      }
     }
 
     if (mbuf) {
@@ -2230,20 +2249,36 @@
         hlog_write_message(roomjid, 0, -1, mbuf);
       g_free(mbuf);
     }
+  } else {
+    // This is a simple member status change
+
+    if (printstatus == status_all && !nickchange) {
+      mbuf = g_strdup_printf("Member status has changed: %s [%c] %s", rname,
+                             imstatus2char[ust], ((ustmsg) ? ustmsg : ""));
+      scr_WriteIncomingMessage(roomjid, mbuf, usttime, HBB_PREFIX_INFO, 0);
+      g_free(mbuf);
+    }
   }
 
+  // Sanity check, shouldn't happen...
+  if (!rname)
+    return;
+
   // Update room member status
-  if (rname) {
-    roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime,
-                     mbrole, mbaffil, mbjid);
-    if (new_member && settings_opt_get_int("muc_auto_whois")) {
-      // FIXME: This will fail for some UTF-8 nicknames.
-      gchar *joiner_nick = from_utf8(rname);
-      room_whois(room_elt->data, joiner_nick, FALSE);
-      g_free(joiner_nick);
-    }
-  } else
-    scr_LogPrint(LPRINT_LOGNORM, "MUC DBG: no rname!"); /* DBG */
+  roster_setstatus(roomjid, rname, bpprio, ust, ustmsg, usttime,
+                   mbrole, mbaffil, mbjid);
+
+  autowhois = buddy_getautowhois(room_elt->data);
+  if (autowhois == autowhois_default)
+    autowhois = (settings_opt_get_int("muc_auto_whois") ?
+                 autowhois_on : autowhois_off);
+
+  if (new_member && autowhois == autowhois_on) {
+    // FIXME: This will fail for some UTF-8 nicknames.
+    gchar *joiner_nick = from_utf8(rname);
+    room_whois(room_elt->data, joiner_nick, FALSE);
+    g_free(joiner_nick);
+  }
 
   scr_DrawRoster();
 }
--- a/mcabber/src/roster.c	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/src/roster.c	Tue Nov 27 23:57:20 2007 +0100
@@ -25,14 +25,14 @@
 #include "utils.h"
 
 
-char *strrole[] = { /* Should match enum in roster.h */
+char *strrole[] = {   /* Should match enum in roster.h */
   "none",
   "moderator",
   "participant",
   "visitor"
 };
 
-char *straffil[] = { /* Should match enum roster.h */
+char *straffil[] = {  /* Should match enum in roster.h */
   "none",
   "owner",
   "admin",
@@ -40,6 +40,19 @@
   "outcast"
 };
 
+char *strprintstatus[] = {  /* Should match enum in roster.h */
+  "default",
+  "none",
+  "in_and_out",
+  "all"
+};
+
+char *strautowhois[] = {    /* Should match enum in roster.h */
+  "default",
+  "off",
+  "on",
+};
+
 /* Resource structure */
 
 typedef struct {
@@ -76,6 +89,8 @@
   gchar *nickname;
   gchar *topic;
   guint inside_room;
+  guint print_status;
+  guint auto_whois;
 
   /* on_server is TRUE if the item is present on the server roster */
   guint on_server;
@@ -1026,6 +1041,30 @@
   return roster_usr->topic;
 }
 
+void buddy_setprintstatus(gpointer rosterdata, enum room_printstatus pstatus)
+{
+  roster *roster_usr = rosterdata;
+  roster_usr->print_status = pstatus;
+}
+
+enum room_printstatus buddy_getprintstatus(gpointer rosterdata)
+{
+  roster *roster_usr = rosterdata;
+  return roster_usr->print_status;
+}
+
+void buddy_setautowhois(gpointer rosterdata, enum room_autowhois awhois)
+{
+  roster *roster_usr = rosterdata;
+  roster_usr->auto_whois = awhois;
+}
+
+enum room_autowhois buddy_getautowhois(gpointer rosterdata)
+{
+  roster *roster_usr = rosterdata;
+  return roster_usr->auto_whois;
+}
+
 //  buddy_getgroupname()
 // Returns a pointer on buddy's group name.
 const char *buddy_getgroupname(gpointer rosterdata)
--- a/mcabber/src/roster.h	Fri Nov 23 21:56:58 2007 +0100
+++ b/mcabber/src/roster.h	Tue Nov 27 23:57:20 2007 +0100
@@ -56,6 +56,25 @@
   namesearch
 };
 
+extern char *strprintstatus[];
+
+// Note: do not change the ordering as these values are visible
+// to the user (option 'muc_print_status')!
+enum room_printstatus {
+  status_default,
+  status_none,
+  status_in_and_out,
+  status_all
+};
+
+extern char *strautowhois[];
+
+enum room_autowhois {
+  autowhois_default,
+  autowhois_off,
+  autowhois_on
+};
+
 struct role_affil {
   enum { type_role, type_affil } type;
   union {
@@ -170,6 +189,10 @@
 guint       buddy_getinsideroom(gpointer rosterdata);
 void        buddy_settopic(gpointer rosterdata, const char *newtopic);
 const char *buddy_gettopic(gpointer rosterdata);
+void    buddy_setprintstatus(gpointer rosterdata, enum room_printstatus);
+enum room_printstatus buddy_getprintstatus(gpointer rosterdata);
+void    buddy_setautowhois(gpointer rosterdata, enum room_autowhois);
+enum room_autowhois buddy_getautowhois(gpointer rosterdata);
 void    buddy_settype(gpointer rosterdata, guint type);
 guint   buddy_gettype(gpointer rosterdata);
 guint   buddy_getsubscription(gpointer rosterdata);