# HG changeset patch # User Mikael Berthe # Date 1301147119 -3600 # Node ID 6febc7d1f760abc26ed1d97ff4cac851b2d624e8 # Parent 986e514bec976fe165683101b11272240ad27579 Add /room setopt flag_joins (Hermitifier) diff -r 986e514bec97 -r 6febc7d1f760 mcabber/doc/help/en/hlp_room.txt --- 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. diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/commands.c --- 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); } diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/roster.c --- 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) diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/roster.h --- 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); diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/xmpp.c --- 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; diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/xmpp.h --- 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); diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/xmpp_iqrequest.c --- 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 diff -r 986e514bec97 -r 6febc7d1f760 mcabber/mcabber/xmpp_muc.c --- 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); }