changeset 1979:6febc7d1f760

Add /room setopt flag_joins (Hermitifier)
author Mikael Berthe <mikael@lilotux.net>
date Sat, 26 Mar 2011 14:45:19 +0100
parents 986e514bec97
children 3bcc57751283
files mcabber/doc/help/en/hlp_room.txt mcabber/mcabber/commands.c mcabber/mcabber/roster.c mcabber/mcabber/roster.h mcabber/mcabber/xmpp.c mcabber/mcabber/xmpp.h mcabber/mcabber/xmpp_iqrequest.c mcabber/mcabber/xmpp_muc.c
diffstat 8 files changed, 91 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/doc/help/en/hlp_room.txt	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/doc/help/en/hlp_room.txt	Sat Mar 26 14:45:19 2011 +0100
@@ -1,7 +1,7 @@
 
  /ROOM join|leave|names|nick|remove|topic|unlock|destroy
  /ROOM privmsg|invite|whois|kick|ban|unban|role|affil
- /ROOM setopt print_status|auto_whois [value]
+ /ROOM setopt print_status|auto_whois|flag_joins [value]
  /ROOM bookmark [add|del] [-autojoin|+autojoin] [-|nick]
 
 The 'room' command handles Multi-User Chat room actions.
@@ -39,11 +39,12 @@
  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]
+/room setopt print_status|auto_whois|flag_joins [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.
+ For flag_joins, the possible values are "default", "none", "joins", "all".
+ When the value is "default", the options muc_print_status / muc_auto_whois / muc_flag_joins is used.
 /room bookmark [add|del] [-autojoin|+autojoin] [-|nick]
  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/mcabber/commands.c	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/commands.c	Sat Mar 26 14:45:19 2011 +0100
@@ -2798,7 +2798,8 @@
 {
   char **paramlst;
   char *param, *value;
-  enum { opt_none = 0, opt_printstatus, opt_autowhois } option = 0;
+  enum { opt_none = 0, opt_printstatus,
+         opt_autowhois, opt_flagjoins } option = 0;
 
   paramlst = split_arg(arg, 2, 1); // param, value
   param = *paramlst;
@@ -2813,6 +2814,8 @@
     option = opt_printstatus;
   else if (!strcasecmp(param, "auto_whois"))
     option = opt_autowhois;
+  else if (!strcasecmp(param, "flag_joins"))
+    option = opt_flagjoins;
   else {
     scr_LogPrint(LPRINT_NORMAL, "Wrong option!");
     free_arg_lst(paramlst);
@@ -2824,8 +2827,10 @@
     const char *strval;
     if (option == opt_printstatus)
       strval = strprintstatus[buddy_getprintstatus(bud)];
+    else if (option == opt_autowhois)
+      strval = strautowhois[buddy_getautowhois(bud)];
     else
-      strval = strautowhois[buddy_getautowhois(bud)];
+      strval = strflagjoins[buddy_getflagjoins(bud)];
     scr_LogPrint(LPRINT_NORMAL, "%s is set to: %s", param, strval);
     free_arg_lst(paramlst);
     return;
@@ -2857,6 +2862,20 @@
         scr_LogPrint(LPRINT_NORMAL, "Unrecognized value, assuming default...");
     }
     buddy_setautowhois(bud, eval);
+  } else if (option == opt_flagjoins) {
+    enum room_flagjoins eval;
+    if (!strcasecmp(value, "none"))
+      eval = flagjoins_none;
+    else if (!strcasecmp(value, "joins"))
+      eval = flagjoins_joins;
+    else if (!strcasecmp(value, "all"))
+      eval = flagjoins_all;
+    else {
+      eval = flagjoins_default;
+      if (strcasecmp(value, "default") != 0)
+        scr_LogPrint(LPRINT_NORMAL, "Unrecognized value, assuming default...");
+    }
+    buddy_setflagjoins(bud, eval);
   }
 
   free_arg_lst(paramlst);
@@ -2962,6 +2981,7 @@
   const char *name = NULL, *nick = NULL, *group = NULL;
   char *tmpnick = NULL;
   enum room_autowhois autowhois = 0;
+  enum room_flagjoins flagjoins = 0;
   enum room_printstatus printstatus = 0;
   enum { bm_add = 0, bm_del = 1 } action = 0;
   int autojoin = 0;
@@ -3000,11 +3020,12 @@
       nick = buddy_getnickname(bud);
     printstatus = buddy_getprintstatus(bud);
     autowhois   = buddy_getautowhois(bud);
+    flagjoins   = buddy_getflagjoins(bud);
     group       = buddy_getgroupname(bud);
   }
 
   xmpp_set_storage_bookmark(roomid, name, nick, NULL, autojoin,
-                            printstatus, autowhois, group);
+                            printstatus, autowhois, flagjoins, group);
   g_free (tmpnick);
 }
 
--- a/mcabber/mcabber/roster.c	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/roster.c	Sat Mar 26 14:45:19 2011 +0100
@@ -55,6 +55,13 @@
   "on",
 };
 
+char *strflagjoins[] = {    /* Should match enum in roster.h */
+  "default",
+  "none",
+  "joins",
+  "all"
+};
+
 /* Resource structure */
 
 typedef struct {
@@ -94,6 +101,7 @@
   guint inside_room;
   guint print_status;
   guint auto_whois;
+  guint flag_joins;
 
   /* on_server is TRUE if the item is present on the server roster */
   guint on_server;
@@ -1201,6 +1209,18 @@
   return roster_usr->auto_whois;
 }
 
+void buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins fjoins)
+{
+  roster *roster_usr = rosterdata;
+  roster_usr->flag_joins = fjoins;
+}
+
+enum room_flagjoins buddy_getflagjoins(gpointer rosterdata)
+{
+  roster *roster_usr = rosterdata;
+  return roster_usr->flag_joins;
+}
+
 //  buddy_getgroupname()
 // Returns a pointer on buddy's group name.
 const char *buddy_getgroupname(gpointer rosterdata)
--- a/mcabber/mcabber/roster.h	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/roster.h	Sat Mar 26 14:45:19 2011 +0100
@@ -90,6 +90,15 @@
   autowhois_on
 };
 
+extern char *strflagjoins[];
+
+enum room_flagjoins {
+  flagjoins_default,
+  flagjoins_none,
+  flagjoins_joins,
+  flagjoins_all
+};
+
 struct role_affil {
   enum { type_role, type_affil } type;
   union {
@@ -213,6 +222,8 @@
 enum room_printstatus buddy_getprintstatus(gpointer rosterdata);
 void    buddy_setautowhois(gpointer rosterdata, enum room_autowhois);
 enum room_autowhois buddy_getautowhois(gpointer rosterdata);
+void    buddy_setflagjoins(gpointer rosterdata, enum room_flagjoins);
+enum room_flagjoins buddy_getflagjoins(gpointer rosterdata);
 void    buddy_settype(gpointer rosterdata, guint type);
 guint   buddy_gettype(gpointer rosterdata);
 guint   buddy_getsubscription(gpointer rosterdata);
--- a/mcabber/mcabber/xmpp.c	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/xmpp.c	Sat Mar 26 14:45:19 2011 +0100
@@ -2131,13 +2131,14 @@
 }
 
 //  xmpp_set_storage_bookmark(roomid, name, nick, passwd, autojoin,
-//                          printstatus, autowhois)
+//                          printstatus, autowhois, flagjoins, group)
 // Update the private storage bookmarks: add a conference room.
 // If name is nil, we remove the bookmark.
 void xmpp_set_storage_bookmark(const char *roomid, const char *name,
                                const char *nick, const char *passwd,
                                int autojoin, enum room_printstatus pstatus,
-                               enum room_autowhois awhois, const char *group)
+                               enum room_autowhois awhois,
+                               enum room_flagjoins fjoins, const char *group)
 {
   LmMessageNode *x;
   bool changed = FALSE;
@@ -2188,6 +2189,8 @@
       lm_message_node_set_attributes(x, "autowhois",
                                      (awhois == autowhois_on) ? "1" : "0",
                                      NULL);
+    if (fjoins)
+      lm_message_node_add_child(x, "flag_joins", strflagjoins[fjoins]);
     if (group)
       lm_message_node_add_child(x, "group", group);
     changed = TRUE;
--- a/mcabber/mcabber/xmpp.h	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/xmpp.h	Sat Mar 26 14:45:19 2011 +0100
@@ -27,6 +27,8 @@
   guint autojoin;
   /* enum room_printstatus pstatus; */
   /* enum room_autowhois awhois; */
+  /* enum room_flagjoins fjoins; */
+  /* const char *group; */
 };
 
 extern LmConnection* lconnection;
@@ -70,7 +72,8 @@
 void xmpp_set_storage_bookmark(const char *roomid, const char *name,
                                const char *nick, const char *passwd,
                                int autojoin, enum room_printstatus pstatus,
-                               enum room_autowhois awhois, const char *group);
+                               enum room_autowhois awhois,
+                               enum room_flagjoins fjoins, const char *group);
 struct annotation *xmpp_get_storage_rosternotes(const char *barejid,
                                                 int silent);
 void xmpp_set_storage_rosternotes(const char *barejid, const char *note);
--- a/mcabber/mcabber/xmpp_iqrequest.c	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/xmpp_iqrequest.c	Sat Mar 26 14:45:19 2011 +0100
@@ -561,7 +561,7 @@
 static void storage_bookmarks_parse_conference(LmMessageNode *node)
 {
   const char *fjid, *name, *autojoin;
-  const char *pstatus, *awhois, *group;
+  const char *pstatus, *awhois, *fjoins, *group;
   char *bjid;
   GSList *room_elt;
 
@@ -572,6 +572,7 @@
   autojoin = lm_message_node_get_attribute(node, "autojoin");
   awhois = lm_message_node_get_attribute(node, "autowhois");
   pstatus = lm_message_node_get_child_value(node, "print_status");
+  fjoins = lm_message_node_get_child_value(node, "flag_joins");
   group = lm_message_node_get_child_value(node, "group");
 
   bjid = jidtodisp(fjid); // Bare jid
@@ -614,6 +615,14 @@
     if (i != autowhois_default)
       buddy_setautowhois(room_elt->data, i);
   }
+  if (fjoins) {
+    enum room_flagjoins i;
+    for (i = flagjoins_none; i <= flagjoins_all; i++)
+      if (!strcasecmp(fjoins, strflagjoins[i]))
+        break;
+    if (i <= flagjoins_all)
+      buddy_setflagjoins(room_elt->data, i);
+  }
 
   // Is autojoin set?
   // If it is, we'll look up for more information (nick? password?) and
--- a/mcabber/mcabber/xmpp_muc.c	Sat Mar 26 13:56:41 2011 +0100
+++ b/mcabber/mcabber/xmpp_muc.c	Sat Mar 26 14:45:19 2011 +0100
@@ -344,6 +344,7 @@
 {
   bool new_member = FALSE; // True if somebody else joins the room (not us)
   gchar *mbuf;
+  enum room_flagjoins flagjoins;
 
   if (!buddy_getinsideroom(room_elt->data)) {
     // We weren't inside the room yet.  Now we are.
@@ -385,7 +386,11 @@
 
   if (mbuf) {
     guint msgflags = HBB_PREFIX_INFO;
-    if (!settings_opt_get_int("muc_flag_joins"))
+    flagjoins = buddy_getflagjoins(room_elt->data);
+    if (flagjoins == flagjoins_default &&
+        !settings_opt_get_int("muc_flag_joins"))
+      flagjoins = flagjoins_none;
+    if (flagjoins == flagjoins_none)
       msgflags |= HBB_PREFIX_NOFLAG;
     scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
     if (log_muc_conf)
@@ -407,6 +412,7 @@
   enum imaffiliation mbaffil = affil_none;
   enum room_printstatus printstatus;
   enum room_autowhois autowhois;
+  enum room_flagjoins flagjoins;
   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)
@@ -640,8 +646,13 @@
     // or if the print_status isn't set to none.
     if (our_presence || printstatus != status_none) {
       msgflags = HBB_PREFIX_INFO;
-      if (!our_presence && settings_opt_get_int("muc_flag_joins") != 2)
+      flagjoins = buddy_getflagjoins(room_elt->data);
+      if (flagjoins == flagjoins_default &&
+          settings_opt_get_int("muc_flag_joins") == 2)
+	flagjoins = flagjoins_all;
+      if (!our_presence && flagjoins != flagjoins_all)
         msgflags |= HBB_PREFIX_NOFLAG;
+      //silent message if someone else joins, and we care about noone
       scr_WriteIncomingMessage(roomjid, mbuf, usttime, msgflags, 0);
     }