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