# HG changeset patch # User Mikael Berthe # Date 1196204240 -3600 # Node ID cd9182f0b5c7303a730cfdfa322bd4ae8128df0f # Parent a0deb5124ebfa17ecd2d564a43c266a065268ebf 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/de/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/en/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/fr/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/it/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/nl/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/pl/hlp_room.txt --- 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. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/ru/hlp_room.txt --- 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-сервером. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/doc/help/uk/hlp_room.txt --- 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 буде заходити в цю кімнату після з'єднання з сервером. diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/mcabberrc.example --- 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 diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/src/commands.c --- 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); diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/src/jabglue.c --- 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(); } diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/src/roster.c --- 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) diff -r a0deb5124ebf -r cd9182f0b5c7 mcabber/src/roster.h --- 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);