summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--README3
-rw-r--r--data/default_config.cfg16
-rw-r--r--doc/en/configure.txt265
-rw-r--r--doc/en/install.txt94
-rw-r--r--doc/en/keys.txt66
-rw-r--r--doc/poezio.txt83
-rw-r--r--src/tabs.py66
8 files changed, 573 insertions, 24 deletions
diff --git a/Makefile b/Makefile
index e055d203..7e71edb1 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/README b/README
index dbce3f79..53f36de0 100644
--- a/README
+++ b/README
@@ -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):