--- 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);
}