diff options
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | README | 3 | ||||
-rw-r--r-- | data/default_config.cfg | 16 | ||||
-rw-r--r-- | doc/en/configure.txt | 265 | ||||
-rw-r--r-- | doc/en/install.txt | 94 | ||||
-rw-r--r-- | doc/en/keys.txt | 66 | ||||
-rw-r--r-- | doc/poezio.txt | 83 | ||||
-rw-r--r-- | src/tabs.py | 66 |
8 files changed, 573 insertions, 24 deletions
@@ -34,5 +34,9 @@ uninstall: rm -rf $(DESTDIR)$(DATADIR)/poezio rm -rf $(DESTDIR)$(MANDIR)/man1/poezio.1 +doc: + find doc -name \*.txt -exec asciidoc {} \; pot: xgettext src/*.py --from-code=utf-8 --keyword=_ -o locale/poezio.pot + +.PHONY : doc
\ No newline at end of file @@ -28,6 +28,9 @@ You need python 3.0 (and the associated devel package, to build C modules) or higher, and the SleekXMPP python library. In the developpement version, you’ll need this fork of SleekXMPP http://github.com/louiz/SleekXMPP. +Additionally, you’ll need asciidoc to build the html documentation pages. +You can read the documentation using the .txt files, as well, if you don’t +have asciidoc, or read it on the web. The simplest way to have up-to-date dependencies and to be able to test this developpement version is to use the update.sh script that downloads diff --git a/data/default_config.cfg b/data/default_config.cfg index 858c90bf..e803a7d1 100644 --- a/data/default_config.cfg +++ b/data/default_config.cfg @@ -20,10 +20,10 @@ resource = # If this is empty, the $USER environnement variable will be used default_nick = -# Jabber identifiant. Specify it only if you want to connect using an existing +# Jabber identifier. Specify it only if you want to connect using an existing # account on a server. This is optional and useful only for some features, # like room administration, nickname registration. -# The 'server' option will be ignored if you specify a JID (Jabber identifiant) +# The 'server' option will be ignored if you specify a JID (Jabber identifier) # It should be in the form nickname@server.tld jid = @@ -112,9 +112,9 @@ alternative_nickname = # Limit the number of messages you want to receive when the # multiuserchat rooms send you recent history # 0: You won't receive any -# -1: You will receive the maximum (default) +# -1: You will receive the maximum # n: You will receive at most n messages -muc_history_length = -1 +muc_history_length = 50 # set to 'true' if you want to save logs of all the messages # in files. @@ -156,7 +156,7 @@ beep_on = highlight private # Theme # If themes_dir is not set, logs will searched for in $XDG_DATA_HOME/poezio/themes, -# i.e. in ~/.local/share/poezio/themes/. Si you should specify the directory you +# i.e. in ~/.local/share/poezio/themes/. So you should specify the directory you # want to use instead. This directory will be created at startup if it doesn't # exist themes_dir = @@ -165,7 +165,11 @@ themes_dir = # in the theme_dir directory. # If the file is not found (or no filename is specified) the default # theme will be used instead -theme = poezio +theme = + +# The nick of people who join, part, change their status, etc. in a MUC will +# be displayed using their nick color if true. +display_user_color_in_join_part = false # if true, chat states will be sent to the people you are talking to. # Chat states are, for example, messages informing that you are composing diff --git a/doc/en/configure.txt b/doc/en/configure.txt new file mode 100644 index 00000000..94f8e121 --- /dev/null +++ b/doc/en/configure.txt @@ -0,0 +1,265 @@ +Configure +========= + +The configuration is located in the file *~/.config/poezio/poezio.cfg* +On its first startup, poezio will create that file (and its containing +directories) with the default configuration. You can edit that file manually +or use the */set* command to edit some of its values directly from poezio. +This file is also used to configure key bindings, but this is explained +in the _keys_ documentation file. + +That file is read at each startup and the configuration is saved when poezio +is closed. + +This configuration file *requires* all the options to be in a section +named [Poezio]. + +An option is formatted with the form +====================== +option = value +====================== + +An empty value *doesn’t* mean that the default value will be used. That’s +just an empty value. To use the default value, just comment or remove the +option entirely. + +Here is a list of all the avalaible configuration options, their meaning +and their default value. + +Configuration options +--------------------- + +[horizontal] +*server*:: anon.louiz.org + + The server to use for *anonymous* authentication. + Make sure it accepts anonymous authentification + Note that this option doesn’t do anything at all if you’re using your own JID. + +*port*:: 5222 + + The port you’ll use to connect. + +*resource*:: [empty] + + the resource you will use + If it's empty, your resource will be chosen (most likely randomly) by the server + It is not recommended to use a resource that is easy to guess, because it can lead + to presence leak. + + +*default_nick*:: [empty] + + the nick you will use when joining a room with no associated nick + If this is empty, the $USER environnement variable will be used + + +*jid*:: [empty] + + Jabber identifiant. Specify it only if you want to connect using an existing + account on a server. This is optional and useful only for some features, + like room administration, nickname registration. + The 'server' option will be ignored if you specify a JID (Jabber identifiant) + It should be in the form nickname@server.tld + +*password*:: [empty] + + A password is needed only if you specified a jid. It will be ignored otherwise + If you leave this empty, the password will be asked at each startup + + + +*rooms*:: poezio@muc.poezio.eu + + the rooms you will join automatically on startup, with associated nickname or not + format : room@server.tld/nickname:room2@server.tld/nickname2 + default_nick will be used if "/nickname" is not specified + +*completion*:: normal + + the completion type you will use to complete nicknames + if "normal", complete the entire name to the first available completion + and then cycle through the possible completion with the next TABs + if "shell", if there's more than one nick for this completion, complete + only the part that all then nicks have in common (like in a shell) + + +*after_completion*:: , + + what will be put after the name, when using autocompletion + a SPACE will always be added after that + +*highlight_on*:: [empty] + + a list of words (separated by a colon (:)) that will be + highlighted if said by someone on a room + +*enable_xhtml_im*:: true + + XHTML-IM is an XMPP extension letting users send messages + containing XHTML and CSS formating. We can use this to make + colored text for example. + It is disabled by default because this is only in an experimental + state: you could miss some part of a message (mainly the URL) + but you can still send colored messages. You just won’t be able te see + the colors, though + Set to true if you want to see colored messages + +*hide_status_change*:: 120 + + Set a number for this setting. + The join OR status-change notices will be + displayed according to this number. + -1: the notices will ALWAYS be displayed + 0: the notices will NEVER be displayed + n: On any other number, the notices will only be displayed + if the user involved has talked since the last n seconds + if the value is incorrect, -1 is assumed + Default setting means : + - status changes won't be displayed unless + the user talked in the last 2 minutes + +*hide_exit_join*:: -1 + + Exact same thing than hide_status_change, except that it concerns + the quit message, and that it will be hidden only if the value is 0. + Default setting means: + - all quit and join notices will be displayed + + +*information_buffer_popup_on*:: error roster warning help info + + Some informational messages (error, a contact getting connected, etc) + are sometimes added to the information buffer. These settings can make + that buffer grow temporarly so you can read these information when they + appear. + + A list of message types that should make the information buffer grow + Possible values; error, roster, warning, info, help + +*popup_time*:: 4 + + The time the message will be visible in the information buffer when it + pops up. + If the message takes more than one line, the popup will stay visible + two more second per additional lines + +*autorejoin*:: false + + set to 'true' if you want to automatically rejoin the + room when you're kicked + +*alternative_nickname*:: [empty] + + If you want poezio to join + the room with an alternative nickname when + your nickname is already in use in the room you + wanted to join, put a non-empty value. + Else, poezio won't join the room + This value will be added to your nickname to + create the alternative nickname. + For example, if you set "\_", and wanted to use + the nickname "john", your alternative nickname + will be "john_" + +*muc_history_length*:: 50 + + Limit the number of messages you want to receive when the + multiuserchat rooms send you recent history + 0: You won't receive any + -1: You will receive the maximum + n: You will receive at most n messages + Note that if you set a huge number (like the default value), you + may not receive that much messages. The server has its own + maximum too + +*use_log*:: true + + set to 'false' if you don’t want to save logs of all the messages + in files. + + +*log_dir*:: [empty] + + If log_dir is not set, logs will be saved in $XDG_DATA_HOME/poezio/logs, + i.e. in ~/.local/share/poezio/logs/. So, you should specify the directory + you want to use instead. This directory will be created if it doesn't exist + +*show_inactive_tabs*:: true + + If you want to show all the tabs in the Tab bar, even those + with no activity, set to true. Else, set to false + + +*beep_on*:: highlight private + + The terminal can beep on various event. Put the event you want in a list + (separated by spaces). + The events can be + - highlight (when you are highlighted in a MUC) + - private (when a new private message is received, from your contacts or + someone from a MUC) + - message (any message from a MUC) + +*themes_dir*:: [empty] + + If themes_dir is not set, themes will searched for in $XDG_DATA_HOME/poezio/themes, + i.e. in ~/.local/share/poezio/themes/. So you should specify the directory you + want to use instead. This directory will be created at startup if it doesn't + exist + + +*theme*:: [empty] + + The name of the theme file (without the .py extension) that will be used. + The file should be located in the theme_dir directory. + If the file is not found (or no filename is specified) the default + theme will be used instead + +*send_chat_states*:: true + + if true, chat states will be sent to the people you are talking to. + Chat states are, for example, messages informing that you are composing + a message or that you closed the tab, etc + Set to false if you don't want people to know these information + Note that you won’t receive the chat states of your contacts + if you don't send yours. + + +*send_poezio_info*:: true + + if true, information about the software (name and version) + will be sent if requested by anyone + Set to false if you don't want people to know these information + + +*send_os_info*:: true + + if true, information about the Operation System you're using + will be sent when requested by anyone + Set to false if you don't want people to know these information + Note that this information will not be sent if send_poezio_info is False + +*send_time*:: true + + if true, your current time will be sent if asked + Set to false if you don't want people to know that information + + +*max_messages_in_memory*:: 2048 + + Configure the number of maximum messages (for each tab) that + can be kept in memory. If poezio consumes too much memory, lower these + values + +*max_lines_in_memory*:: 2048 + + Configure the number of maximum lines (for each tab) that + can be kept in memory. If poezio consumes too much memory, lower these + values + +*lazy_resize*:: true + + Defines if all tabs are resized at the same time (if set to false) + or if they are really resized only when needed (if set to true). + “true” should be the most comfortable value diff --git a/doc/en/install.txt b/doc/en/install.txt new file mode 100644 index 00000000..75cc0ea8 --- /dev/null +++ b/doc/en/install.txt @@ -0,0 +1,94 @@ +Install +======= + + +Poezio in the GNU/Linux distributions +------------------------------------- + +As far as I know, Poezio is available in the following distributions, you just have to install it by using the package manager of the distribution, if you're using one of these. + +* *Archlinux*: A poezio and poezio-git packages are in AUR (use your favourite AUR wrapper to install them) +* *Frugalware*: Just use pacmang-g2 to install the poezio package. (Thanks to its maintainer, Kooda) +* *Debian*: Use an other distro. + +(If an other distribution provides a poezio package, please tell us and we will add it to the list) + + +Install poezio from the sources +------------------------------- + +You can download poezio's https://dev.louiz.org/project/poezio/download[stable sources] or fetch the development version (trunk), using git: +============================ +git clone https://git.louiz.org/poezio +============================ + +In order for poezio to correctly work, you need the libs SleekXMPP and dnspython. You can install them by downloading it from the https://github.com/fritzy/SleekXMPP/[SleekXMPP] page and the http://www.dnspython.org/[dnspython] page , but you'll need the development versions. Alternatively, you can download poezio's sources including SleekXMPP and dnspython, that's the easier way. + +As for dnspython, you will have to use our python3 fork, or poke them to accept patches. + +=== Dependencies === + + +If you want to install SleekXMPP and dnspython yourself, follow these instructions. Else, go to the next section. + + +Download SleekXMPP +============================ +git clone git://github.com/louiz/SleekXMPP.git +============================ + +Make sure you're using the develop branch by typing +============================ +cd SleekXMPP + +git checkout develop +============================ + +Install SleekXMPP with +============================ +python3 setup.py build + +su -c "python3 setup.py install" +============================ + +Clone the repository at http://hg.louiz.org/dnspython (this is a fork, because upstream is unresponsive and didn’t fix an important bug). +============================ +hg clone http://hg.louiz.org/dnspython + +cd dnspython +============================ + +And do the same again: +============================ +python3 setup.py build + +su -c "python3 setup.py install" +============================ + + +=== Poezio installation === + +If you skipped the installation of the dependencies and you only want to test poezio without a system-wide install, do, in the _poezio_ directory: +============================ +sh update.sh +============================ + +If you have git and hg installed, it will download and update locally the libraries for you. + + +If you don't want to install poezio but just test it, do: +============================ + ./launch.sh +============================ + + +To install poezio, do, as root (or sudo with ubuntu or whatever): +============================ +make install +============================ + +And then start it with: +============================ +poezio +============================ + diff --git a/doc/en/keys.txt b/doc/en/keys.txt new file mode 100644 index 00000000..eaae961d --- /dev/null +++ b/doc/en/keys.txt @@ -0,0 +1,66 @@ +Keys +==== + +This file describes the default keys of poezio and explains how to +configure them. + +By default, most keys manipulating the input (where you type your +messages and commands) behave like emacs does. + +Note that keys are case sensitive. Ctrl-X is not the same than Ctrl-x + +Key bindings listing +-------------------- +Some key bindings are available only in some tabs, others are global. + +Global keys +~~~~~~~~~~~ +These keys work in *any* tab. + +*Ctrl-n*:: Go to the next tab. + +*Ctrl-p*:: Go to the previous tab. + +*Alt-number*:: Go to tab number x. + +*Alt-j*:: Waits for you to type a two-digits number. Go to tab number xx. + +Input keys +~~~~~~~~~~ +These keys concern only the inputs. + +*Ctrl-a*:: Move the cursor to the beginning of line. + +*Ctrl-e*:: Move the cursor to the end of line. + +Chat tab input keys +~~~~~~~~~~~~~~~~~~~~~ +These keys work in any conversation tab (MultiUserChat, Private or Conversation tabs) + +*Key Up*:: Use the previous message from the message history. + +*Key Down*:: Use the next message from the message history. + +*Page Up*:: Scroll up in the conversation by x lines, where x is the height of the conversation window - 1. + +*Page Down*:: Likfe Page Up, but down. + +*Alt-/*:: Complete what you’re typing using the "recent" words from the current conversation, if any. + +Key configuration +----------------- +Bindings are keyboard shortcut aliases. You can use them +to define your own keys to replace the default ones. +where ^x means Control + x +and M-x means Alt + x + +To know exactly what the code of a key is, just run +================== +python3 src/keyboard.py +================== +And enter any keys + +.Turn Alt-i into a tab key (completion, etc) +================== +M-i = ^I +================== diff --git a/doc/poezio.txt b/doc/poezio.txt new file mode 100644 index 00000000..47497434 --- /dev/null +++ b/doc/poezio.txt @@ -0,0 +1,83 @@ +Poezio documentation +==================== + +This page is the documentation for poezio. + +Poezio is an XMPP console client mostly written in python and a little +bit in C. + +It uses curses to draw its user interface. + +It has been written to create an XMPP client that could very easily be used by +any IRC user. Its interface tries to be like the ones of famous clients such +as irssi or weechat. + +:numbered: +== Usage == + +Poezio is composed of tabs which can be of various types. Each tab type has +a distinct interface, list of commands and list of key shortcuts, in addition +to the global commands and key shortcuts. + + +=== Commands === + +Commands start with the */* character and can take a list of any number +of arguments, separated by spaces. If an argument should contain a space, +you can use the *"* character to surround this argument. + +.The command nick with only one argument +========================================== +/nick "my new nick" +========================================== + +.The command status with two arguments +========================================== +/status away "on vacation" +========================================== + +.Note +The character *'* cannot be used instead of *"*. + + +To know the list of all available commands, use the *help* command with no +argument. To know more about the command (what it does and how to use it), +use the *help* command and pass the command name as its first argument. + +The list of all global commands is as follow: + +[horizontal] +*help*:: [command_name] + + Displays the list of all available commands in the current tab, or displays + the usage of the given command. +*message*:: <jid> [message] + + Open a conversation with the specified JID, and send a message to it, + if specified. + + + + + +.Get information on the status command +========================================== +/help status +========================================== + + +=== Tabs === +This section lists and describes all the tab types. + + +==== Roster Tab ==== +This is the first tab that you will see when starting poezio. + +It contains your roster + +[glossary] +== Glossary == + +This glossary explains some terms that are used in this documentation. + +[glossary] +Roster:: + The list of contacts, sorted by groups, status, or anything the client wishes. diff --git a/src/tabs.py b/src/tabs.py index a160a0a1..d605d251 100644 --- a/src/tabs.py +++ b/src/tabs.py @@ -413,6 +413,7 @@ class MucTab(ChatTab): self.commands['topic'] = (self.command_topic, _("Usage: /topic <subject>\nTopic: Change the subject of the room"), self.completion_topic) self.commands['query'] = (self.command_query, _('Usage: /query <nick> [message]\nQuery: Open a private conversation with <nick>. This nick has to be present in the room you\'re currently in. If you specified a message after the nickname, it will immediately be sent to this user'), None) self.commands['part'] = (self.command_part, _("Usage: /part [message]\nPart: disconnect from a room. You can specify an optional message."), None) + self.commands['close'] = (self.command_close, _("Usage: /close [message]\nClose: disconnect from a room and close the tab. You can specify an optional message if you are still connected."), None) self.commands['nick'] = (self.command_nick, _("Usage: /nick <nickname>\nNick: Change your nickname in the current room"), None) self.commands['recolor'] = (self.command_recolor, _('Usage: /recolor\nRecolor: Re-assign a color to all participants of the current room, based on the last time they talked. Use this if the participants currently talking have too many identical colors.'), None) self.commands['cycle'] = (self.command_cycle, _('Usage: /cycle [message]\nCycle: Leaves the current room and rejoin it immediately'), None) @@ -552,9 +553,20 @@ class MucTab(ChatTab): msg = None if self.get_room().joined: muc.leave_groupchat(self.core.xmpp, room.name, room.own_nick, arg) - self.core.close_tab() + self.get_room().joined = False + self.get_room().add_message(_("\x195}You left the chatroom\x193}")) + self.refresh() + self.core.doupdate() self.core.disable_private_tabs(self.get_room().name) + def command_close(self, arg): + """ + /close [msg] + """ + self.command_part(arg) + self.core.close_tab() + + def command_query(self, arg): """ /query <nick> [message] @@ -632,7 +644,8 @@ class MucTab(ChatTab): args = common.shell_split(arg) if not len(args): self.core.command_help('kick') - self._command_change_role('kick '+arg) + else: + self.command_role('none '+arg) def command_role(self, arg): """ @@ -898,14 +911,16 @@ class MucTab(ChatTab): """ When a new user joins the groupchat """ - room.users.append(User(from_nick, affiliation, - show, status, role, jid)) + user = User(from_nick, affiliation, + show, status, role, jid) + room.users.append(user) hide_exit_join = config.get('hide_exit_join', -1) if hide_exit_join != 0: + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 if not jid.full: - room.add_message('\x194}%(spec)s \x193}%(nick)s\x195} joined the room' % {'nick':from_nick, 'spec':get_theme().CHAR_JOIN}) + room.add_message('\x194}%(spec)s \x19%(color)d}%(nick)s\x195} joined the room' % {'nick':from_nick, 'color':color, 'spec':get_theme().CHAR_JOIN}) else: - room.add_message('\x194}%(spec)s \x193}%(nick)s \x195}(\x194}%(jid)s\x195}) joined the room' % {'spec':get_theme().CHAR_JOIN, 'nick':from_nick, 'jid':jid.full}) + room.add_message('\x194}%(spec)s \x19%(color)d}%(nick)s \x195}(\x194}%(jid)s\x195}) joined the room' % {'spec':get_theme().CHAR_JOIN, 'nick':from_nick, 'color':color, 'jid':jid.full}) self.core.on_user_rejoined_private_conversation(room.name, from_nick) @@ -918,7 +933,8 @@ class MucTab(ChatTab): if isinstance(_tab, PrivateTab) and JID(_tab.get_name()).bare == room.name: _tab.get_room().own_nick = new_nick user.change_nick(new_nick) - room.add_message('\x193}%(old)s\x195} is now known as \x193}%(new)s' % {'old':from_nick, 'new':new_nick}) + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 + room.add_message('\x19%(color)d}%(old)s\x195} is now known as \x19%(color)d}%(new)s' % {'old':from_nick, 'new':new_nick, 'color':color}) # rename the private tabs if needed self.core.rename_private_tabs(room.name, from_nick, new_nick) @@ -940,10 +956,11 @@ class MucTab(ChatTab): else: kick_msg = _('\x191}%(spec)s \x193}You\x195} have been banned.') % {'spec':get_theme().CHAR_KICK} else: + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 if by: - kick_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} has been banned by \x194}%(by)s') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick, 'by':by} + kick_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} has been banned by \x194}%(by)s') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick, 'color':color, 'by':by} else: - kick_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} has been banned') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick.replace('"', '\\"')} + kick_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} has been banned') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick.replace('"', '\\"'), 'color':color} if reason is not None and reason.text: kick_msg += _('\x195} Reason: \x196}%(reason)s\x195}') % {'reason': reason.text} room.add_message(kick_msg) @@ -969,10 +986,11 @@ class MucTab(ChatTab): if config.get('autorejoin', 'false') == 'true': muc.join_groupchat(self.core.xmpp, room.name, room.own_nick) else: + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 if by: - kick_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} has been kicked by \x193}%(by)s') % {'spec':get_theme().CHAR_KICK.replace('"', '\\"'), 'nick':from_nick.replace('"', '\\"'), 'by':by.replace('"', '\\"')} + kick_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} has been kicked by \x193}%(by)s') % {'spec':get_theme().CHAR_KICK.replace('"', '\\"'), 'nick':from_nick.replace('"', '\\"'), 'color':color, 'by':by.replace('"', '\\"')} else: - kick_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} has been kicked') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick.replace('"', '\\"')} + kick_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} has been kicked') % {'spec':get_theme().CHAR_KICK, 'nick':from_nick.replace('"', '\\"'), 'color':color} if reason is not None and reason.text: kick_msg += _('\x195} Reason: \x196}%(reason)s') % {'reason': reason.text} room.add_message(kick_msg) @@ -990,10 +1008,12 @@ class MucTab(ChatTab): self.core.doupdate() hide_exit_join = config.get('hide_exit_join', -1) if config.get('hide_exit_join', -1) >= -1 else -1 if hide_exit_join == -1 or user.has_talked_since(hide_exit_join): + log.debug("\n\nALLO: USERCOLOR: %s\n\n" % user.color.__repr__()) + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 if not jid.full: - leave_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} has left the room') % {'nick':from_nick, 'spec':get_theme().CHAR_QUIT} + leave_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} has left the room') % {'nick':from_nick, 'color':color, 'spec':get_theme().CHAR_QUIT} else: - leave_msg = _('\x191}%(spec)s \x193}%(nick)s\x195} (\x194}%(jid)s\x195}) has left the room') % {'spec':get_theme().CHAR_QUIT, 'nick':from_nick, 'jid':jid.full} + leave_msg = _('\x191}%(spec)s \x19%(color)d}%(nick)s\x195} (\x194}%(jid)s\x195}) has left the room') % {'spec':get_theme().CHAR_QUIT, 'nick':from_nick, 'color':color, 'jid':jid.full} if status: leave_msg += ' (%s)' % status room.add_message(leave_msg) @@ -1007,7 +1027,11 @@ class MucTab(ChatTab): # build the message display_message = False # flag to know if something significant enough # to be displayed has changed - msg = _('\x193}%s\x195} changed: ')% from_nick.replace('"', '\\"') + color = user.color[0] if config.get('display_user_color_in_join_part', '') == 'true' else 3 + if from_nick == room.own_nick: + msg = _('\x193}You\x195} changed: ') + else: + msg = _('\x19%(color)d}%(nick)s\x195} changed: ') % {'nick': from_nick.replace('"', '\\"'), 'color': color} if show not in SHOW_NAME: self.core.information("%s from room %s sent an invalid show: %s" %\ (from_nick, from_room, show), "warning") @@ -1031,7 +1055,9 @@ class MucTab(ChatTab): if not display_message: return msg = msg[:-2] # remove the last ", " - hide_status_change = config.get('hide_status_change', -1) if config.get('hide_status_change', -1) >= -1 else -1 + hide_status_change = config.get('hide_status_change', -1) + if hide_status_change < -1: + hide_status_change = -1 if (hide_status_change == -1 or \ user.has_talked_since(hide_status_change) or\ user.nick == room.own_nick)\ @@ -1062,7 +1088,7 @@ class PrivateTab(ChatTab): # commands self.commands['info'] = (self.command_info, _('Usage: /info\nInfo: Display some information about the user in the MUC: '), None) self.commands['unquery'] = (self.command_unquery, _("Usage: /unquery\nUnquery: close the tab"), None) - self.commands['part'] = (self.command_unquery, _("Usage: /part\nPart: close the tab"), None) + self.commands['close'] = (self.command_unquery, _("Usage: /close\nClose: close the tab"), None) self.commands['version'] = (self.command_version, _('Usage: /version\nVersion: get the software version of the current interlocutor (usually its XMPP client and Operating System)'), None) self.resize() self.parent_muc = self.core.get_tab_by_name(JID(room.name).bare, MucTab) @@ -1228,7 +1254,7 @@ class PrivateTab(ChatTab): The user (or at least someone with the same nick) came back in the MUC """ self.activate() - self.get_room().add_message('\x194}%(spec)s \x193}%(nick)s\x195} joined the room' % {'nick':nick, 'spec':get_theme().CHAR_JOIN}) + self.get_room().add_message('\x194}%(spec)s \x19%(color)d}%(nick)s\x195} joined the room' % {'nick':nick, 'color':user.color, 'spec':get_theme().CHAR_JOIN}) if self.core.current_tab() is self: self.refresh() self.core.doupdate() @@ -1634,6 +1660,8 @@ class RosterInfoTab(Tab): return False def move_cursor_down(self): + if isinstance(self.input, windows.CommandInput): + return self.roster_win.move_cursor_down() self.roster_win.refresh(roster) self.contact_info_win.refresh(self.roster_win.get_selected_row()) @@ -1641,6 +1669,8 @@ class RosterInfoTab(Tab): self.core.doupdate() def move_cursor_up(self): + if isinstance(self.input, windows.CommandInput): + return self.roster_win.move_cursor_up() self.roster_win.refresh(roster) self.contact_info_win.refresh(self.roster_win.get_selected_row()) @@ -1738,7 +1768,7 @@ class ConversationTab(ChatTab): self.key_func['^I'] = self.completion # commands self.commands['unquery'] = (self.command_unquery, _("Usage: /unquery\nUnquery: close the tab"), None) - self.commands['part'] = (self.command_unquery, _("Usage: /part\Part: close the tab"), None) + self.commands['close'] = (self.command_unquery, _("Usage: /close\Close: close the tab"), None) self.resize() def completion(self): |