summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2014-02-03 15:41:33 +0100
committerSebastien Helleu <flashcode@flashtux.org>2014-02-03 15:41:33 +0100
commit944972bc951c03605fbd7a9fd3236e63cfd0fd6d (patch)
tree3f94bb0b2266a6bab8d157d0d26091c456b833f3 /doc
parenta2839fabb5611e6f079afa39f963fb5b3213d586 (diff)
downloadweechat-944972bc951c03605fbd7a9fd3236e63cfd0fd6d.zip
doc: add French version of relay protocol
Diffstat (limited to 'doc')
-rw-r--r--doc/en/CMakeLists.txt22
-rw-r--r--doc/en/Makefile.am6
-rw-r--r--doc/en/weechat_relay_protocol.en.txt373
-rw-r--r--doc/fr/CMakeLists.txt11
-rw-r--r--doc/fr/Makefile.am6
-rw-r--r--doc/fr/weechat_relay_protocol.fr.txt1704
6 files changed, 1943 insertions, 179 deletions
diff --git a/doc/en/CMakeLists.txt b/doc/en/CMakeLists.txt
index cab89a174..a25eabb06 100644
--- a/doc/en/CMakeLists.txt
+++ b/doc/en/CMakeLists.txt
@@ -104,17 +104,6 @@ IF(ENABLE_DOC AND SOURCEHIGHLIGHT_FOUND)
ADD_CUSTOM_TARGET(doc-tester-en ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_tester.en.html)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_tester.en.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
- # developer's guide
- ADD_CUSTOM_COMMAND(
- OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html
- COMMAND ${ASCIIDOC_EXECUTABLE} ARGS -a revision="${VERSION}" -a stylesheet=${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.css -f ${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.conf -n -o ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html ${CMAKE_CURRENT_SOURCE_DIR}/weechat_dev.en.txt
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/weechat_dev.en.txt
- COMMENT "Building weechat_dev.en.html"
- )
- ADD_CUSTOM_TARGET(doc-dev-en ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html)
- INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
-
# relay protocol
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.en.html
@@ -126,4 +115,15 @@ IF(ENABLE_DOC AND SOURCEHIGHLIGHT_FOUND)
ADD_CUSTOM_TARGET(doc-relay-protocol-en ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.en.html)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.en.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
+ # developer's guide
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html
+ COMMAND ${ASCIIDOC_EXECUTABLE} ARGS -a revision="${VERSION}" -a stylesheet=${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.css -f ${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.conf -n -o ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html ${CMAKE_CURRENT_SOURCE_DIR}/weechat_dev.en.txt
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/weechat_dev.en.txt
+ COMMENT "Building weechat_dev.en.html"
+ )
+ ADD_CUSTOM_TARGET(doc-dev-en ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html)
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.en.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
+
ENDIF(ENABLE_DOC AND SOURCEHIGHLIGHT_FOUND)
diff --git a/doc/en/Makefile.am b/doc/en/Makefile.am
index 3bb2d8e99..a8817706b 100644
--- a/doc/en/Makefile.am
+++ b/doc/en/Makefile.am
@@ -29,8 +29,8 @@ EXTRA_DIST = CMakeLists.txt \
weechat_faq.en.txt \
weechat_quickstart.en.txt \
weechat_tester.en.txt \
- weechat_dev.en.txt \
weechat_relay_protocol.en.txt \
+ weechat_dev.en.txt \
$(wildcard autogen/user/*.txt) \
$(wildcard autogen/plugin_api/*.txt)
@@ -46,8 +46,8 @@ if DOC
weechat_faq.en.html \
weechat_quickstart.en.html \
weechat_tester.en.html \
- weechat_dev.en.html \
- weechat_relay_protocol.en.html
+ weechat_relay_protocol.en.html \
+ weechat_dev.en.html
doc_install = install-doc
doc_uninstall = uninstall-doc
endif
diff --git a/doc/en/weechat_relay_protocol.en.txt b/doc/en/weechat_relay_protocol.en.txt
index 1640b95d3..6efbe5be8 100644
--- a/doc/en/weechat_relay_protocol.en.txt
+++ b/doc/en/weechat_relay_protocol.en.txt
@@ -6,7 +6,7 @@
:toclevels: 4
-This document is the specification of WeeChat relay protocol: the protocol used
+This document is the specification of WeeChat Relay protocol: the protocol used
to relay WeeChat data to clients, which are mostly remote interfaces.
@@ -21,7 +21,7 @@ The following terms are used in this document:
* 'relay': this is the WeeChat with relay plugin, which acts as "server" and
allows 'clients' to connect
* 'client': this is another software, connected to 'relay' via a network
- connection; in most cases, this 'client' is a remote interface
+ connection; in most cases, this 'client' is a remote interface.
[[network_diagram]]
=== Network diagram
@@ -49,15 +49,14 @@ network servers ncurses interface relay remote interfaces
[NOTE]
All clients here are clients using 'weechat' protocol in 'relay' plugin. The
'relay' plugin also allows IRC clients, then 'relay' plugin acts as an
-'irc proxy' (not described in this document).
+'IRC proxy' (not described in this document).
[[protocol_generalities]]
== Protocol generalities
* Connections from 'client' to 'relay' are made using TCP sockets on IP/port
- used by 'relay' plugin to listen to new connections
- (option 'relay.port.weechat' in WeeChat).
-* Number of 'clients' is not limited.
+ used by 'relay' plugin to listen to new connections.
+* Number of 'clients' is limited by the option 'relay.network.max_clients'.
* Each 'client' is independent from other clients.
* Messages from 'client' to 'relay' are called 'commands', they are sent as text
(a string).
@@ -76,7 +75,7 @@ Fields are:
("_") (ids starting with underscore are reserved for WeeChat 'event' messages)
* 'command': a command (see table below)
* 'arguments': optional arguments for command (many arguments are separated by
- spaces)
+ spaces).
List of available commands (detail in next chapters):
@@ -84,10 +83,10 @@ List of available commands (detail in next chapters):
|===
| Command | Description
| init | Initialize connection with 'relay'
-| hdata | Request hdata
-| info | Request info
-| infolist | Request infolist
-| nicklist | Request nicklist
+| hdata | Request a 'hdata'
+| info | Request an 'info'
+| infolist | Request an 'infolist'
+| nicklist | Request a 'nicklist'
| input | Send data to a buffer (text or command)
| sync | Synchronize buffer(s) (get updates for buffer(s))
| desync | Desynchronize buffer(s) (stop updates for buffer(s))
@@ -113,11 +112,11 @@ Arguments:
** 'password': password used to authenticate on 'relay' (option
'relay.network.password' in WeeChat)
** 'compression': compression type:
-*** 'zlib': enable zlib compression for messages sent by 'relay'
+*** 'zlib': enable 'zlib' compression for messages sent by 'relay'
*** 'off': disable compression
[NOTE]
-Compression 'zlib' is enabled by default if 'relay' supports zlib compression.
+Compression 'zlib' is enabled by default if 'relay' supports 'zlib' compression.
Examples:
@@ -132,7 +131,7 @@ init password=mypass,compression=off
[[command_hdata]]
=== hdata
-Request hdata.
+Request a 'hdata'.
Syntax:
@@ -149,9 +148,8 @@ Arguments:
(count allowed, see below)
** 'var': a variable name in parent hdata (previous name in path)
(count allowed, see below)
-* 'keys': comma-separated list of keys to return in hdata returned (if not
- specified, all keys are returned, which is not recommended on large hdata
- structures)
+* 'keys': comma-separated list of keys to return in hdata (if not specified, all
+ keys are returned, which is not recommended on large hdata structures)
A count is allowed after pointer and variables, with format "(N)". Possible
values are:
@@ -164,21 +162,21 @@ Examples:
----
# request all buffers, hdata of type "buffer" is returned
-# keys number and name are returned for each buffer
+# keys "number" and "name" are returned for each buffer
hdata buffer:gui_buffers(*) number,name
# request all lines of all buffers, hdata of type "line_data" is returned
# all keys are returned
hdata buffer:gui_buffers(*)/lines/first_line(*)/data
-# request full_name of first buffer
+# request full name of first buffer
hdata buffer:gui_buffers full_name
----
[[command_info]]
=== info
-Request info.
+Request an 'info'.
Syntax:
@@ -199,7 +197,7 @@ info version
[[command_infolist]]
=== infolist
-Request infolist.
+Request an 'infolist'.
[IMPORTANT]
Content of infolist is a duplication of actual data. Wherever possible, use
@@ -209,13 +207,14 @@ faster, uses less memory and returns smaller objects in message).
Syntax:
----
-(id) infolist <name> <arguments>
+(id) infolist <name> [<pointer> [<arguments>]]
----
Arguments:
* 'name': name of infolist to retrieve
-* 'arguments': arguments for infolist
+* 'pointer': pointer (optional)
+* 'arguments': arguments (optional)
Example:
@@ -226,7 +225,7 @@ infolist buffer
[[command_nicklist]]
=== nicklist
-Request nicklist, for one or all buffers.
+Request a 'nicklist', for one or all buffers.
Syntax:
@@ -284,7 +283,7 @@ Synchronize one or more buffers, to get updates.
[IMPORTANT]
It is recommended to send this command immediately after you asked
data for buffers (lines, ...). It can be send in same message (after a new
-line).
+line char: "\n").
Syntax:
@@ -300,14 +299,14 @@ Arguments:
* 'options': one of following keywords, separated by commas (default is
'buffers,upgrade,buffer,nicklist' for "*" and 'buffer,nicklist' for a buffer):
** 'buffers': receive signals about buffers (opened/closed, moved, renamed,
- merged/unmerged, renamed); this can be used only with name "*"
- _(new in version 0.4.1)_
+ merged/unmerged); this can be used only with name "*"
+ _(WeeChat ≥ 0.4.1)_
** 'upgrade': receive signals about WeeChat upgrade (upgrade, upgrade ended);
this can be used only with name "*"
- _(new in version 0.4.1)_
+ _(WeeChat ≥ 0.4.1)_
** 'buffer': receive signals about buffer (new lines, type changed, title
- changed, local variable added/removed, and same signals as 'buffers' for the
- buffer) _(updated in version 0.4.1)_
+ changed, local variable added/removed, and same signals as 'buffers' for the
+ buffer) _(updated in version 0.4.1)_
** 'nicklist': receive nicklist after changes
Examples:
@@ -340,7 +339,7 @@ Desynchronize one or more buffers, to stop updates.
[NOTE]
This will remove 'options' for buffers. If some options are still active for
-buffers, the client will still receive updates for buffers.
+buffers, the client will still receive updates for these buffers.
Syntax:
@@ -355,7 +354,7 @@ Arguments:
specify all buffers
* 'options': one of following keywords, separated by commas (default is
'buffers,upgrade,buffer,nicklist' for "*" and 'buffer,nicklist' for a buffer);
- see <<command_sync,command sync>> for values.
+ see <<command_sync,command sync>> for values
[NOTE]
When using buffer "*", the other buffers synchronized (using a name) are kept. +
@@ -385,11 +384,12 @@ desync irc.freenode.#weechat
Test command: WeeChat will reply with various different objects.
-This command is useful to test the decoding of objects returned by WeeChat.
+This command is useful to test the decoding of binary objects returned by
+WeeChat.
[IMPORTANT]
You must not use the pointer values returned by this command, they are not
-valid. This command should only be used to test decoding of a message sent by
+valid. This command must be used only to test decoding of a message sent by
WeeChat.
Syntax:
@@ -422,19 +422,19 @@ Returned objects (in this order):
| pointer | ptr | 0x1234abcd
| pointer | ptr | NULL
| time | tim | 1321993456
-| array of strings | arr str | { "abc", "de" }
-| array of integers | arr int | { 123, 456, 789 }
+| array of strings | arr str | [ "abc", "de" ]
+| array of integers | arr int | [ 123, 456, 789 ]
|===
[[command_ping]]
=== ping
-_Added in version 0.4.2._
+_WeeChat ≥ 0.4.2._
Send a ping to WeeChat which will reply with a message "_pong" and same arguments.
This command is useful to test that connection with WeeChat is still alive and
-measure the network lag.
+measure the response time.
Syntax:
@@ -483,10 +483,10 @@ Messages are sent as binary data, using following format (with size in bytes):
....
* 'length' (unsigned integer): number of bytes of whole message (including
- this length)
+ this field)
* 'compression' (byte): flag:
** '0x00': following data is not compressed
-** '0x01': following data is zlib-compressed
+** '0x01': following data is compressed with 'zlib'
* 'id' (string): identifier sent by client (before command name); it can be
empty (string with zero length and no content) if no identifier was given in
command
@@ -497,12 +497,12 @@ Messages are sent as binary data, using following format (with size in bytes):
=== Compression
If flag 'compression' is equal to 0x01, then *all* data after is compressed
-with zlib, and therefore must be uncompressed before being processed.
+with 'zlib', and therefore must be uncompressed before being processed.
[[message_identifier]]
=== Identifier
-There are two different identifiers ('id'):
+There are two types of identifiers ('id'):
* 'id' sent by 'client': 'relay' will answer with same 'id' in its answer
* 'id' of an event: on some events, 'relay' will send message to 'client' using
@@ -512,30 +512,66 @@ WeeChat reserved identifiers:
[width="100%",cols="5,5,3,4,7",options="header"]
|===
-| Identifier | Description | Received with sync | Data sent | Recommended action in client
-| _buffer_opened | Buffer opened | buffers / buffer | hdata: buffer | Open buffer
-| _buffer_moved | Buffer moved | buffers / buffer | hdata: buffer | Move buffer
-| _buffer_merged | Buffer merged | buffers / buffer | hdata: buffer | Merge buffer
-| _buffer_unmerged | Buffer unmerged | buffers / buffer | hdata: buffer | Unmerge buffer
-| _buffer_renamed | Buffer renamed | buffers / buffer | hdata: buffer | Rename buffer
-| _buffer_title_changed | Title of buffer changed | buffers / buffer | hdata: buffer | Change title of buffer
-| _buffer_type_changed | Type of buffer changed | buffer | hdata: buffer | Change type of buffer
-| _buffer_localvar_added | Local variable added | buffer | hdata: buffer | Add local variable in buffer
-| _buffer_localvar_changed | Local variable changed | buffer | hdata: buffer | Change local variable in buffer
-| _buffer_localvar_removed | Local variable removed | buffer | hdata: buffer | Remove local variable from buffer
-| _buffer_line_added | Line added in buffer | buffer | hdata: line | Display line in buffer
-| _buffer_closing | Buffer closing | buffers / buffer | hdata: buffer | Close buffer
-| _nicklist | Nicklist for a buffer | nicklist | hdata: nicklist_item | Replace nicklist
-| _nicklist_diff | Nicklist diffs for a buffer | nicklist | hdata: nicklist_item | Update nicklist
-| _pong | Answer to a "ping" | (always) | string: ping arguments | Measure network lag
-| _upgrade | WeeChat is upgrading | upgrade | (empty) | Desync from WeeChat (or disconnect)
-| _upgrade_ended | Upgrade of WeeChat done | upgrade | (empty) | Sync/resync with WeeChat
+| Identifier | Received with sync | Data sent |
+ Description | Recommended action in client
+
+| _buffer_opened | buffers / buffer | hdata: buffer |
+ Buffer opened | Open buffer
+
+| _buffer_moved | buffers / buffer | hdata: buffer |
+ Buffer moved | Move buffer
+
+| _buffer_merged | buffers / buffer | hdata: buffer |
+ Buffer merged | Merge buffer
+
+| _buffer_unmerged | buffers / buffer | hdata: buffer |
+ Buffer unmerged | Unmerge buffer
+
+| _buffer_renamed | buffers / buffer | hdata: buffer |
+ Buffer renamed | Rename buffer
+
+| _buffer_title_changed | buffers / buffer | hdata: buffer |
+ Title of buffer changed | Change title of buffer
+
+| _buffer_type_changed | buffer | hdata: buffer |
+ Type of buffer changed | Change type of buffer
+
+| _buffer_localvar_added | buffer | hdata: buffer |
+ Local variable added | Add local variable in buffer
+
+| _buffer_localvar_changed | buffer | hdata: buffer |
+ Local variable changed | Change local variable in buffer
+
+| _buffer_localvar_removed | buffer | hdata: buffer |
+ Local variable removed | Remove local variable from buffer
+
+| _buffer_line_added | buffer | hdata: line |
+ Line added in buffer | Display line in buffer
+
+| _buffer_closing | buffers / buffer | hdata: buffer |
+ Buffer closing | Close buffer
+
+| _nicklist | nicklist | hdata: nicklist_item |
+ Nicklist for a buffer | Replace nicklist
+
+| _nicklist_diff | nicklist | hdata: nicklist_item |
+ Nicklist diffs for a buffer | Update nicklist
+
+| _pong | (always) | string: ping arguments |
+ Answer to a "ping" | Measure response time
+
+| _upgrade | upgrade | (empty) |
+ WeeChat is upgrading | Desync from WeeChat (or disconnect)
+
+| _upgrade_ended | upgrade | (empty) |
+ Upgrade of WeeChat done | Sync/resync with WeeChat
|===
[[message_buffer_opened]]
==== _buffer_opened
-It is sent to the client when the signal "buffer_opened" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_opened" is sent by
+WeeChat.
Data sent as hdata:
@@ -552,7 +588,7 @@ Data sent as hdata:
| next_buffer | pointer | Pointer to next buffer
|===
-Example: join of channel '#weechat' on freenode, new buffer
+Example: channel '#weechat' joined on freenode, new buffer
'irc.freenode.#weechat':
[source,python]
@@ -577,17 +613,18 @@ hda:
[[message_buffer_moved]]
==== _buffer_moved
-It is sent to the client when the signal "buffer_moved" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_moved" is sent by
+WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
-| prev_buffer | pointer | Pointer to previous buffer
-| next_buffer | pointer | Pointer to next buffer
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| prev_buffer | pointer | Pointer to previous buffer
+| next_buffer | pointer | Pointer to next buffer
|===
Example: buffer 'irc.freenode.#weechat' moved to number 2:
@@ -609,17 +646,18 @@ hda:
[[message_buffer_merged]]
==== _buffer_merged
-It is sent to the client when the signal "buffer_merged" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_merged" is sent by
+WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
-| prev_buffer | pointer | Pointer to previous buffer
-| next_buffer | pointer | Pointer to next buffer
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| prev_buffer | pointer | Pointer to previous buffer
+| next_buffer | pointer | Pointer to next buffer
|===
Example: buffer 'irc.freenode.#weechat' merged with buffer #2:
@@ -641,17 +679,18 @@ hda:
[[message_buffer_unmerged]]
==== _buffer_unmerged
-It is sent to the client when the signal "buffer_unmerged" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_unmerged" is sent by
+WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
-| prev_buffer | pointer | Pointer to previous buffer
-| next_buffer | pointer | Pointer to next buffer
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| prev_buffer | pointer | Pointer to previous buffer
+| next_buffer | pointer | Pointer to next buffer
|===
Example: buffer 'irc.freenode.#weechat' unmerged:
@@ -673,7 +712,8 @@ hda:
[[message_buffer_renamed]]
==== _buffer_renamed
-It is sent to the client when the signal "buffer_renamed" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_renamed" is sent by
+WeeChat.
Data sent as hdata:
@@ -706,17 +746,17 @@ hda:
[[message_buffer_title_changed]]
==== _buffer_title_changed
-It is sent to the client when the signal "buffer_title_changed" is sent by
-WeeChat.
+This message is sent to the client when the signal "buffer_title_changed" is
+sent by WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
-| title | string | Buffer title
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| title | string | Buffer title
|===
Example: topic changed on channel '#weechat':
@@ -737,19 +777,20 @@ hda:
[[message_buffer_type_changed]]
==== _buffer_type_changed
-It is sent to the client when the signal "buffer_type_changed" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_type_changed" is sent
+by WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
-| type | integer | Buffer type: 0 = formatted (default), 1 = free content
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| type | integer | Buffer type: 0 = formatted (default), 1 = free content
|===
-Example: type of buffer 'script.scripts' changed from 'formatted' (0) to free
+Example: type of buffer 'script.scripts' changed from formatted (0) to free
content (1):
[source,python]
@@ -768,8 +809,8 @@ hda:
[[message_buffer_localvar_added]]
==== _buffer_localvar_added
-It is sent to the client when the signal "buffer_localvar_added" is sent by
-WeeChat.
+This message is sent to the client when the signal "buffer_localvar_added" is
+sent by WeeChat.
Data sent as hdata:
@@ -801,8 +842,8 @@ hda:
[[message_buffer_localvar_changed]]
==== _buffer_localvar_changed
-It is sent to the client when the signal "buffer_localvar_changed" is sent by
-WeeChat.
+This message is sent to the client when the signal "buffer_localvar_changed" is
+sent by WeeChat.
Data sent as hdata:
@@ -834,8 +875,8 @@ hda:
[[message_buffer_localvar_removed]]
==== _buffer_localvar_removed
-It is sent to the client when the signal "buffer_localvar_removed" is sent by
-WeeChat.
+This message is sent to the client when the signal "buffer_localvar_removed" is
+sent by WeeChat.
Data sent as hdata:
@@ -866,24 +907,25 @@ hda:
[[message_buffer_line_added]]
==== _buffer_line_added
-It is sent to the client when the signal "buffer_line_added" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_line_added" is sent
+by WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| buffer | pointer | Buffer pointer
-| date | time | Date of message
-| date_printed | time | Date when WeeChat displayed message
-| displayed | char | 1 if message is displayed, 0 if message is filtered (hidden)
-| highlight | char | 1 if line has a highlight, otherwise 0
-| tags_array | array of strings | List of tags for line
-| prefix | string | Prefix
-| message | string | Message
+| Name | Type | Description
+| buffer | pointer | Buffer pointer
+| date | time | Date of message
+| date_printed | time | Date when WeeChat displayed message
+| displayed | char | 1 if message is displayed, 0 if message is filtered (hidden)
+| highlight | char | 1 if line has a highlight, otherwise 0
+| tags_array | array of strings | List of tags for line
+| prefix | string | Prefix
+| message | string | Message
|===
-Example: new message 'hello!' from nick 'FlashCode' in buffer 'irc.freenode.#weechat':
+Example: new message 'hello!' from nick 'FlashCode' on buffer 'irc.freenode.#weechat':
[source,python]
----
@@ -907,15 +949,16 @@ hda:
[[message_buffer_closing]]
==== _buffer_closing
-It is sent to the client when the signal "buffer_closing" is sent by WeeChat.
+This message is sent to the client when the signal "buffer_closing" is sent by
+WeeChat.
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| number | integer | Buffer number (≥ 1)
-| full_name | string | Full name (example: 'irc.freenode.#weechat')
+| Name | Type | Description
+| number | integer | Buffer number (≥ 1)
+| full_name | string | Full name (example: 'irc.freenode.#weechat')
|===
Example: buffer 'irc.freenode.#weechat' is being closed by WeeChat:
@@ -935,8 +978,8 @@ hda:
[[message_nicklist]]
==== _nicklist
-It is sent to the client when large updates are made on a nicklist (groups/nicks
-added/removed/changed). The message contains full nicklist.
+This message is sent to the client when large updates are made on a nicklist
+(groups/nicks added/removed/changed). The message contains full nicklist.
When small updates are made on a nicklist (for example just add one nick),
another message with identifier '_nicklist_diff' is sent (see below).
@@ -945,14 +988,14 @@ Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| group | char | 1 for a group, 0 for a nick
-| visible | char | 1 if group/nick is displayed, otherwise 0
-| level | integer | Level of group (0 for a nick)
-| name | string | Name of group/nick
-| color | string | Name color
-| prefix | string | Prefix (only for a nick)
-| prefix_color | string | Prefix color (only for a nick)
+| Name | Type | Description
+| group | char | 1 for a group, 0 for a nick
+| visible | char | 1 if group/nick is displayed, otherwise 0
+| level | integer | Level of group (0 for a nick)
+| name | string | Name of group/nick
+| color | string | Name color
+| prefix | string | Prefix (only for a nick)
+| prefix_color | string | Prefix color (only for a nick)
|===
Example: nicklist for buffer 'irc.freenode.#weechat':
@@ -1023,25 +1066,25 @@ hda:
[[message_nicklist_diff]]
==== _nicklist_diff
-_New in version 0.4.1._
+_WeeChat ≥ 0.4.1._
-It is sent to the client when small updates are made on a nicklist (groups/nicks
-added/removed/changed). The message contains nicklist differences (between old
-nicklist and current one).
+This message is sent to the client when small updates are made on a nicklist
+(groups/nicks added/removed/changed). The message contains nicklist differences
+(between old nicklist and current one).
Data sent as hdata:
[width="100%",cols="3m,2,10",options="header"]
|===
-| Name | Type | Description
-| _diff | char | Type of diff (see below)
-| group | char | 1 for a group, 0 for a nick
-| visible | char | 1 if group/nick is displayed, otherwise 0
-| level | integer | Level of group (0 for a nick)
-| name | string | Name of group/nick
-| color | string | Name color
-| prefix | string | Prefix (only for a nick)
-| prefix_color | string | Prefix color (only for a nick)
+| Name | Type | Description
+| _diff | char | Type of diff (see below)
+| group | char | 1 for a group, 0 for a nick
+| visible | char | 1 if group/nick is displayed, otherwise 0
+| level | integer | Level of group (0 for a nick)
+| name | string | Name of group/nick
+| color | string | Name color
+| prefix | string | Prefix (only for a nick)
+| prefix_color | string | Prefix color (only for a nick)
|===
The value of '_diff' can be:
@@ -1118,21 +1161,21 @@ hda:
[[message_pong]]
==== _pong
-_New in version 0.4.2._
+_WeeChat ≥ 0.4.2._
-It is sent to the client when WeeChat receives a "ping" message.
+This message is sent to the client when 'relay' receives a "ping" message.
-Data sent as string: arguments received in the ping message.
+Data sent as string: arguments received in the "ping" message.
-The recommended action in client is to measure network lag and disconnect if
-network lag is high.
+The recommended action in client is to measure the response time and disconnect
+if it is high.
[[message_upgrade]]
==== _upgrade
-_New in version 0.3.8._
+_WeeChat ≥ 0.3.8._
-It is sent to the client when WeeChat is starting upgrade process.
+This message is sent to the client when WeeChat is starting upgrade process.
There is no data in the message.
@@ -1141,15 +1184,16 @@ The recommended action in client is to desynchronize from WeeChat (send command
will change).
[NOTE]
-During WeeChat upgrade, the socket remains opened (except if connection was made
-with SSL).
+During WeeChat upgrade, the socket remains opened (except if connection uses
+SSL).
[[message_upgrade_ended]]
==== _upgrade_ended
-_New in version 0.3.8._
+_WeeChat ≥ 0.3.8._
-It is sent to the client when WeeChat has finished the upgrade process.
+This message is sent to the client when WeeChat has finished the upgrade
+process.
There is no data in the message.
@@ -1159,15 +1203,14 @@ commands sent on startup after the 'init'.
[[objects]]
=== Objects
-Objects are identified by 3 letters, called 'type'. Following types are
-available:
+Objects are identified by 3 letters, called 'type'. Following types are used:
[width="100%",cols="^2m,5,10",options="header"]
|===
| Type | Value | Length
| chr | Signed char | 1 byte
| int | Signed integer | 4 bytes
-| lon | Signed long integer | 1 byte + length of long as string
+| lon | Signed long integer | 1 byte + length of integer as string
| str | String | 4 bytes + length of string (without final '\0')
| buf | Buffer of bytes | 4 bytes + length of data
| ptr | Pointer | 1 byte + length of pointer as string
@@ -1176,13 +1219,13 @@ available:
| hda | Hdata content | Variable
| inf | Info: name + content | Variable
| inl | Infolist content | Variable
-| arr | Array of values | 3 bytes (type) + number of items + data
+| arr | Array of objects | 3 bytes (type) + number of objects + data
|===
[[object_char]]
==== Char
-A signed char is 1 byte.
+A signed char is stored as 1 byte.
Example:
@@ -1195,8 +1238,8 @@ Example:
[[object_integer]]
==== Integer
-A signed integer is 4 bytes, encoded as big-endian format (most significant byte
-first).
+A signed integer is stored as 4 bytes, encoded as big-endian format (most
+significant byte first).
Range: -2147483648 to 2147483647.
@@ -1364,8 +1407,8 @@ objects, and then set of objects (path with pointers, then objects).
* 'values': list of values (number of values is number of keys returned for
hdata)
-Example of hdata with 2 buffers (weechat core and freenode server) and two keys
-('number' and 'full_name'):
+Example of hdata with two buffers (weechat core and freenode server) and two
+keys ('number' and 'full_name'):
....
# command
@@ -1509,7 +1552,7 @@ An item is:
** 'type': type of variable ('int', 'str', ...)
** 'value': value of variable
-Example of infolist with 2 buffers (weechat core and freenode server):
+Example of infolist with two buffers (weechat core and freenode server):
....
# command
@@ -1532,9 +1575,9 @@ infolist buffer
[[object_array]]
==== Array
-An array is a type (3 bytes) + number of items (integer on 4 bytes) + data.
+An array is a type (3 bytes) + number of objects (integer on 4 bytes) + data.
-Example of array with 2 strings:
+Example of array with two strings:
....
┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥──
@@ -1544,13 +1587,13 @@ Example of array with 2 strings:
type number of strings length
──╥────┬────┬────╥────┬────┬────┬────╥────┬────┐
- ... ║ 61 │ 62 │ 63 ║ 00 │ 00 │ 00 │ 02 ║ 64 │ 65 │ ────► { "abc", "de" }
+ ... ║ 61 │ 62 │ 63 ║ 00 │ 00 │ 00 │ 02 ║ 64 │ 65 │ ────► [ "abc", "de" ]
──╨────┴────┴────╨────┴────┴────┴────╨────┴────┘
└────────────┘ └─────────────────┘ └───────┘
'a' 'b' 'c' length 'd' 'e'
....
-Example of array with 3 integers:
+Example of array with three integers:
....
┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥──
@@ -1560,7 +1603,7 @@ Example of array with 3 integers:
type number of integers 123 (0x7B)
──╥────┬────┬────┬────╥────┬────┬────┬────┐
- ... ║ 00 │ 00 │ 01 │ C8 ║ 00 │ 00 │ 03 │ 15 │ ────► { 123, 456, 789 }
+ ... ║ 00 │ 00 │ 01 │ C8 ║ 00 │ 00 │ 03 │ 15 │ ────► [ 123, 456, 789 ]
──╨────┴────┴────┴────╨────┴────┴────┴────┘
└─────────────────┘ └─────────────────┘
456 (0x1C8) 789 (0x315)
@@ -1617,8 +1660,8 @@ A 'NULL' array:
║ ║ ║
║ ◄───────────────────────────────╢ ║
measure ║ msg: id: "_pong" ... ║ ║
- lag ║ ║ ║
- ║ ........ ║ ........ ║
+response ║ ║ ║
+ time ║ ........ ║ ........ ║
║ ║ ║
╟───────────────────────────────► ║ ║
║ cmd: quit ║ disconnect client ║
diff --git a/doc/fr/CMakeLists.txt b/doc/fr/CMakeLists.txt
index d79f085d5..a316637ae 100644
--- a/doc/fr/CMakeLists.txt
+++ b/doc/fr/CMakeLists.txt
@@ -104,6 +104,17 @@ IF(ENABLE_DOC AND SOURCEHIGHLIGHT_FOUND)
ADD_CUSTOM_TARGET(doc-tester-fr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_tester.fr.html)
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_tester.fr.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
+ # relay protocol
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.fr.html
+ COMMAND ${ASCIIDOC_EXECUTABLE} ARGS -a revision="${VERSION}" -a stylesheet=${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.css -f ${CMAKE_CURRENT_SOURCE_DIR}/../asciidoc.conf -n -o ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.fr.html ${CMAKE_CURRENT_SOURCE_DIR}/weechat_relay_protocol.fr.txt
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/weechat_relay_protocol.fr.txt
+ COMMENT "Building weechat_relay_protocol.fr.html"
+ )
+ ADD_CUSTOM_TARGET(doc-relay-protocol-fr ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.fr.html)
+ INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/weechat_relay_protocol.fr.html DESTINATION ${SHAREDIR}/doc/${PROJECT_NAME})
+
# developer's guide
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/weechat_dev.fr.html
diff --git a/doc/fr/Makefile.am b/doc/fr/Makefile.am
index 78a4b15c1..2403e2fc8 100644
--- a/doc/fr/Makefile.am
+++ b/doc/fr/Makefile.am
@@ -29,6 +29,7 @@ EXTRA_DIST = CMakeLists.txt \
weechat_faq.fr.txt \
weechat_quickstart.fr.txt \
weechat_tester.fr.txt \
+ weechat_relay_protocol.fr.txt \
weechat_dev.fr.txt \
$(wildcard autogen/user/*.txt) \
$(wildcard autogen/plugin_api/*.txt)
@@ -45,6 +46,7 @@ if DOC
weechat_faq.fr.html \
weechat_quickstart.fr.html \
weechat_tester.fr.html \
+ weechat_relay_protocol.fr.html \
weechat_dev.fr.html
doc_install = install-doc
doc_uninstall = uninstall-doc
@@ -81,6 +83,10 @@ weechat_quickstart.fr.html: weechat_quickstart.fr.txt
weechat_tester.fr.html: weechat_tester.fr.txt
$(ASCIIDOC) -a revision="$(VERSION)" -a stylesheet=$(abs_top_srcdir)/doc/asciidoc.css -f $(abs_top_srcdir)/doc/asciidoc.conf -n -o weechat_tester.fr.html $(abs_top_srcdir)/doc/fr/weechat_tester.fr.txt
+# relay protocol
+weechat_relay_protocol.fr.html: weechat_relay_protocol.fr.txt
+ $(ASCIIDOC) -a revision="$(VERSION)" -a stylesheet=$(abs_top_srcdir)/doc/asciidoc.css -f $(abs_top_srcdir)/doc/asciidoc.conf -n -o weechat_relay_protocol.fr.html $(abs_top_srcdir)/doc/fr/weechat_relay_protocol.fr.txt
+
# developer's guide
weechat_dev.fr.html: weechat_dev.fr.txt
$(ASCIIDOC) -a revision="$(VERSION)" -a stylesheet=$(abs_top_srcdir)/doc/asciidoc.css -f $(abs_top_srcdir)/doc/asciidoc.conf -n -o weechat_dev.fr.html $(abs_top_srcdir)/doc/fr/weechat_dev.fr.txt
diff --git a/doc/fr/weechat_relay_protocol.fr.txt b/doc/fr/weechat_relay_protocol.fr.txt
new file mode 100644
index 000000000..16f28fff2
--- /dev/null
+++ b/doc/fr/weechat_relay_protocol.fr.txt
@@ -0,0 +1,1704 @@
+= Protocole Relay de WeeChat
+:author: Sébastien Helleu
+:email: flashcode@flashtux.org
+:lang: fr
+:toc:
+:toclevels: 4
+
+
+Ce document est une spécification du protocole Relay de WeeChat : le protocole
+utilisé pour relayer les données de WeeChat aux clients, qui sont surtout des
+interfaces distantes.
+
+
+[[introduction]]
+== Introduction
+
+[[terminology]]
+=== Terminologie
+
+Les termes suivants sont utilisés dans ce document :
+
+* 'relay' : il s'agit de l'extension "relay" de WeeChat, qui agit comme un
+ "serveur" et autorise les 'clients' à se connecter
+* 'client' : il s'agit d'un autre logiciel, connecté au 'relay' via une
+ connexion réseau; dans la plupart des cas, ce 'client' est une interface
+ distante.
+
+[[network_diagram]]
+=== Diagramme réseau
+
+Les 'clients' sont connectés au 'relay' comme dans le diagramme ci-dessous :
+
+....
+ ┌──────────┐ Station de travail
+ ┌────────┐ ┌───┤ client 1 │ (Linux, Windows,
+ │ irc │◄──┐ ╔═══════════╤═══════╗ │ └──────────┘ BSD, Mac OS X ...)
+ └────────┘ └──╢ │ ║◄───┘ ┌──────────┐
+ ...... ║ WeeChat │ Relay ║◄───────┤ client 2 │ Appareil mobile
+ ┌────────┐ ┌──╢ │ ║◄───┐ └──────────┘ (Android, iPhone ...)
+ │ jabber │◄──┘ ╚═══════════╧═══════╝ │ ......
+ └────────┘ │ ┌──────────┐
+ ...... └───┤ client N │ Autres appareils
+ └──────────┘
+
+
+└────────────┘ └───────────────────┘╘══════╛└────────────────────────────────┘
+ serveurs interface ncurses protocole interfaces distantes
+ relay
+....
+
+[NOTE]
+Tous les clients ici utilisent le protocole 'weechat' dans l'extension 'relay'.
+L'extension 'relay' autorise aussi des clients IRC, et 'relay' agit alors comme
+un 'proxy IRC' (non décrit dans ce document).
+
+[[protocol_generalities]]
+== Généralités sur le protocole
+
+* Les connexions du 'client' vers 'relay' sont faites avec des sockets TCP sur
+ l'IP/port utilisé par 'relay' pour écouter les nouvelles connexions.
+* Le nombre de clients est limité par l'option 'relay.network.max_clients'.
+* Chaque 'client' est indépendant des autres clients.
+* Les messages du 'client' vers 'relay' sont appelés 'commandes', elles sont
+ envoyées sous forme de texte (une chaîne de caractères).
+* Les messages de 'relay' vers le 'client' sont appelés des 'messages', ils sont
+ envoyés sous forme de données binaires.
+
+[[commands]]
+== Commandes (client → relay)
+
+Les commandes ont le format : "(id) commande paramètres\n".
+
+Les champs sont :
+
+* 'id' : identifiant du message (facultatif) qui sera envoyée dans la réponse de
+ 'relay'; elle doit être entre parenthèses, et ne doit pas commencer par un
+ underscore ("_") (les identifiants commençant par un underscore sont réservés
+ pour les messages 'évènements' de WeeChat)
+* 'commande' : une commande (voir le tableau ci-dessous)
+* 'paramètres' : paramètres facultatifs pour la commande (plusieurs paramètres
+ sont séparés par des espaces).
+
+Liste des commandes disponibles (détail dans les chapitres suivants) :
+
+[width="80%",cols="^3m,14",options="header"]
+|===
+| Commande | Description
+| init | Initialiser la connexion avec 'relay'
+| hdata | Demander un 'hdata'
+| info | Demander une 'info'
+| infolist | Demander une 'infolist'
+| nicklist | Demander une 'nicklist' (liste de pseudos)
+| input | Envoyer des données à un tampon (texte ou commande)
+| sync | Synchroniser un/des tampon(s) (recevoir les mises à jour pour le(s) tampon(s))
+| desync | Désynchroniser un/des tampon(s) (stopper les mises à jour pour le(s) tampon(s))
+| quit | Se déconnecter de 'relay'
+|===
+
+[[command_init]]
+=== init
+
+Initialiser la connexion avec 'relay'. Il doit s'agir de la première commande
+envoyée à 'relay'. Si elle n'est pas envoyée, 'relay' coupera la connexion à la
+première commande reçue, sans avertissement.
+
+Syntaxe :
+
+----
+init [<option>=<valeur>,[<option>=<valeur>,...]]
+----
+
+Paramètres :
+
+* 'option' : une des options suivantes :
+** 'password' : mot de passe utilisé pour s'authentifier avec 'relay' (option
+ 'relay.network.password' dans WeeChat)
+** 'compression' : type de compression :
+*** 'zlib' : activer la compression 'zlib' pour les messages envoyés par 'relay'
+*** 'off' : désactiver la compression
+
+[NOTE]
+La compression 'zlib' est activée par défaut si 'relay' supporte la compression
+'zlib'.
+
+Exemples :
+
+----
+# initialiser et utiliser la compression zlib par défaut (si WeeChat la supporte)
+init password=mypass
+
+# initialiser et désactiver la compression
+init password=mypass,compression=off
+----
+
+[[command_hdata]]
+=== hdata
+
+Demander un 'hdata'.
+
+Syntaxe :
+
+----
+(id) hdata <chemin> [<clés>]
+----
+
+Paramètres :
+
+* 'chemin' : chemin vers le hdata, avec le format :
+ "hdata:pointeur/var/var/.../var", la dernière variable est le hdata retourné :
+** 'hdata' : nom du hdata
+** 'pointeur' : pointeur ("0x12345") ou nom de liste (par exemple :
+ "gui_buffers") (nombre autorisé, voir ci-dessous)
+** 'var' : un nom de variable dans le hdata parent (nom précédent dans le
+ chemin) (nombre autorisé, voir ci-dessous)
+* 'clés' : liste de clés (séparées par des virgules) à retourner dans le hdata
+ (si non spécifié, toutes les clés sont retournées, ce qui n'est pas recommandé
+ avec les grosses structures hdata)
+
+Un nombre est autorisé après le pointeur et les variables, avec le format "(N)".
+Les valeurs possibles sont :
+
+* nombre positif : itérer en utilisant l'élément suivant, N fois
+* nombre négatif : itérer en utilisant l'élément précédent, N fois
+* '*' : itérer en utilisant l'élément suivant, jusqu'à la fin de la liste
+
+Exemples :
+
+----
+# demander tous les tampons, un hdata de type "buffer" est retourné
+# les clés "number" et "name" sont retournées pour chaque tampon
+hdata buffer:gui_buffers(*) number,name
+
+# demander toutes les lignes de tous les tampons, un hdata de type "line_data"
+# est retourné
+# toutes les clés sont retournées
+hdata buffer:gui_buffers(*)/lines/first_line(*)/data
+
+# demander le nom complet du premier tampon
+hdata buffer:gui_buffers full_name
+----
+
+[[command_info]]
+=== info
+
+Demander une 'info'.
+
+Syntaxe :
+
+----
+(id) info <nom> [<paramètres>]
+----
+
+Paramètres :
+
+* 'nom': nom de l'info à obtenir
+* 'paramètres': paramètres pour l'info (facultatif)
+
+Exemple :
+
+----
+info version
+----
+
+[[command_infolist]]
+=== infolist
+
+Demander une 'infolist'.
+
+[IMPORTANT]
+Le contenu de l'infolist est une duplication des données. Dans la mesure du
+possible, utilisez plutôt la commande <<command_hdata,hdata>>, qui est un accès
+direct aux données (cela est plus rapide, utilise moins de mémoire et retourne
+des objets plus petits dans le message).
+
+Syntaxe :
+
+----
+(id) infolist <nom> [<pointeur> [<paramètres>]]
+----
+
+Paramètres :
+
+* 'nom' : nom de l'infolist à obtenir
+* 'pointeur' : pointeur (facultatif)
+* 'paramètres' : paramètres (facultatif)
+
+Exemple :
+
+----
+infolist buffer
+----
+
+[[command_nicklist]]
+=== nicklist
+
+Demander une 'nicklist' (liste de pseudos), pour un ou tous les tampons.
+
+Syntaxe :
+
+----
+(id) nicklist [<tampon>]
+----
+
+Paramètres :
+
+* 'tampon' : pointeur ('0x12345') ou nom complet du tampon (par exemple :
+ 'core.weechat' ou 'irc.freenode.#weechat')
+
+Exemples :
+
+----
+# demander la liste de pseudos pour tous les tampons
+nicklist
+
+# demander la liste de pseudos pour irc.freenode.#weechat
+nicklist irc.freenode.#weechat
+----
+
+[[command_input]]
+=== input
+
+Envoyer des données à un tampon.
+
+Syntaxe :
+
+----
+input <tampon> <données>
+----
+
+Paramètres :
+
+* 'tampon' : pointeur ('0x12345') ou nom complet du tampon (par exemple :
+ 'core.weechat' ou 'irc.freenode.#weechat')
+* 'données' : données à envoyer au tampon : si elles commencent par '/',
+ cela sera exécuté comme une commande sur le tampon, sinon le texte est envoyé
+ comme entrée sur le tampon
+
+Exemples :
+
+----
+input core.weechat /help filter
+input irc.freenode.#weechat hello guys!
+----
+
+[[command_sync]]
+=== sync
+
+_Mis à jour dans la version 0.4.1._
+
+Synchroniser un ou plusieurs tampons, pour obtenir les mises à jour.
+
+[IMPORTANT]
+Il est recommandé d'utiliser cette commande immédiatement après avoir demandé
+les données des tampons (lignes, ...). Elle peut être envoyée dans le même
+message (après un caractère de nouvelle ligne : "\n").
+
+Syntaxe :
+
+----
+sync [<tampon>[,<tampon>...] <option>[,<option>...]]
+----
+
+Paramètres :
+
+* 'tampon' : pointeur ('0x12345') ou nom complet du tampon (par exemple :
+ 'core.weechat' ou 'irc.freenode.#weechat'); le nom "*" peut être utilisé pour
+ spécifier tous les tampons
+* 'options' : un ou plusieurs mots-clés, séparés par des virgules (par défaut
+ 'buffers,upgrade,buffer,nicklist' pour "*" et 'buffer,nicklist' pour un
+ tampon) :
+** 'buffers' : recevoir les signaux à propos des tampons (ouverts/fermés,
+ déplacés, renommés, mélangés); peut être utilisé seulement avec "*"
+ _(WeeChat ≥ 0.4.1)_
+** 'upgrade' : recevoir les signaux à propos de la mise à jour de WeeChat
+ (mise à jour, fin de mise à jour); peut être utilisé seulement avec "*"
+ _(WeeChat ≥ 0.4.1)_
+** 'buffer' : recevoir les signaux à propos du tampon (nouvelles lignes, type
+ changé, titre changé, variable locale ajoutée/supprimée, et les même signaux
+ que 'buffers' pour le tampon) _(mis à jour dans la version 0.4.1)_
+** 'nicklist' : recevoir la liste de pseudos après des changements
+
+Exemples :
+
+----
+# synchroniser tous les tampons avec la liste de pseudos
+# (les 3 commandes sont équivalentes, mais la première est recommandée pour une
+# compatibilité avec les futures versions)
+sync
+sync *
+sync * buffers,upgrade,buffer,nicklist
+
+# synchroniser le tampon "core"
+sync core.buffer
+
+# synchroniser le canal #weechat, sans la liste de pseudos
+sync irc.freenode.#weechat buffer
+
+# obtenir les signaux généraux + tous les signaux pour le canal #weechat
+sync * buffers,upgrade
+sync irc.freenode.#weechat
+----
+
+[[command_desync]]
+=== desync
+
+_Mis à jour dans la version 0.4.1._
+
+Désynchroniser un ou plusieurs tampons, pour stopper les mises à jour.
+
+[NOTE]
+Ceci retirera les 'options' pour les tampons. Si des options sont toujours
+actives pour les tampons, le client recevra toujours les mises à jour pour ces
+tampons.
+
+Syntaxe :
+
+----
+desync [<tampon>[,<tampon>...] <option>[,<option>...]]
+----
+
+Paramètres :
+
+* 'tampon' : pointeur ('0x12345') ou nom complet du tampon (par exemple :
+ 'core.weechat' ou 'irc.freenode.#weechat'); le nom "*" peut être utilisé pour
+ spécifier tous les tampons
+* 'options' : un ou plusieurs mots-clés, séparés par des virgules (le défaut est
+ 'buffers,upgrade,buffer,nicklist' pour "*" et 'buffer,nicklist' pour un
+ tampon); voir <<command_sync,la commande sync>> pour les valeurs
+
+[NOTE]
+En utilisant le tampon "*", les autres tampons synchronisés (en utilisant un
+nom) sont gardés. +
+Donc si vous envoyez : "sync *", puis "sync irc.freenode.#weechat", puis
+"desync *", les mises à jour sur le canal #weechat seront toujours envoyées par
+WeeChat (vous devez le retirer explicitement pour stopper les mises à jour).
+
+Exemples :
+
+----
+# désynchroniser tous les tampons
+# (les 3 commandes sont équivalentes, mais la première est recommandée pour une
+# compatibilité avec les futures versions)
+desync
+desync *
+desync * buffers,upgrade,buffer,nicklist
+
+# désynchroniser la liste de pseudos pour le canal #weechat
+# (garder les mises à jour du tampon)
+desync irc.freenode.#weechat nicklist
+
+# désynchroniser le canal #weechat
+desync irc.freenode.#weechat
+----
+
+[[command_test]]
+=== test
+
+Commande de test : WeeChat répondra avec différents objets.
+
+Cette commande est utile pour tester le décodage d'objets binaires retournés par
+WeeChat.
+
+[IMPORTANT]
+Vous ne devez pas utiliser les pointeurs retournés par cette commande, ils ne
+sont pas valides. Cette commande doit être utilisée seulement pour tester le
+décodage d'un message envoyé par WeeChat.
+
+Syntaxe :
+
+----
+test
+----
+
+Exemple :
+
+----
+test
+----
+
+Objets retournés (dans cet ordre) :
+
+[width="80%",cols="^3,3m,5m",options="header"]
+|===
+| Type | Type (dans le message) | Valeur
+| caractère | chr | 65 ("A")
+| entier | int | 123456
+| entier | int | -123456
+| long | lon | 1234567890
+| long | lon | -1234567890
+| chaîne | str | "a string"
+| chaîne | str | ""
+| chaîne | str | NULL
+| tampon de données | buf | "buffer"
+| tampon de données | buf | NULL
+| pointeur | ptr | 0x1234abcd
+| pointeur | ptr | NULL
+| date/heure | tim | 1321993456
+| tableau de chaînes | arr str | [ "abc", "de" ]
+| tableau d'entiers | arr int | [ 123, 456, 789 ]
+|===
+
+[[command_ping]]
+=== ping
+
+_WeeChat ≥ 0.4.2._
+
+Envoyer un ping à WeeChat qui répondra avec un message "_pong" et les mêmes
+paramètres.
+
+Cette commande est pratique pour tester que la connexion avec WeeChat est
+toujours active et mesurer le temps de réponse.
+
+Syntaxe :
+
+----
+ping [<paramètres>]
+----
+
+Exemple :
+
+----
+ping 1370802127000
+----
+
+[[command_quit]]
+=== quit
+
+Se déconnecter de 'relay'.
+
+Syntaxe :
+
+----
+quit
+----
+
+Exemple :
+
+----
+quit
+----
+
+[[messages]]
+== Messages (relay → client)
+
+Les messages sont envoyés sous forme de données binaires, en utilisant le format
+suivant (avec la taille en octets) :
+
+....
+┌────────╥─────────────╥────╥────────┬─────────╥───────╥────────┬─────────┐
+│ taille ║ compression ║ id ║ type 1 │ objet 1 ║ ... ║ type N │ objet N │
+└────────╨─────────────╨────╨────────┴─────────╨───────╨────────┴─────────┘
+ └──────┘ └───────────┘ └──┘ └──────┘ └───────┘ └──────┘ └───────┘
+ 4 1 ?? 3 ?? 3 ??
+ └────────────────────┘ └────────────────────────────────────────────────┘
+ en-tête (5) données compressées (??)
+ └───────────────────────────────────────────────────────────────────────┘
+ 'taille' octets
+....
+
+* 'taille' (entier non signé) : nombre d'octets du message entier (en incluant
+ ce champ)
+* 'compression' (octet) : drapeau :
+** '0x00' : les données qui suivent ne sont pas compressées
+** '0x01' : les données qui suivent sont compressées avec 'zlib'
+* 'id' (chaîne) : l'identifiant envoyé par le client (avant le nom de la
+ commande); il peut être vide (chaîne avec une longueur de zéro sans contenu)
+ si l'identifiant n'était pas donné dans la commande
+* 'type' (3 caractères) : un type : 3 lettres (voir le tableau ci-dessous)
+* 'objet' : un objet (voir tableau ci-dessous)
+
+[[message_compression]]
+=== Compression
+
+Si le drapeau de 'compression' est égal à 0x01, alors *toutes* les données après
+sont compressées avec 'zlib', et par conséquent doivent être décompressées avant
+d'être utilisées.
+
+[[message_identifier]]
+=== Identifiant
+
+Il y a deux types d'identifiants ('id'):
+
+* 'id' envoyé par le 'client' : 'relay' répondra avec le même 'id' dans sa
+ réponse
+* 'id' d'un évènement : pour certains évènements, 'relay' enverra un message au
+ 'client' en utilisant un 'id' spécifique, commençant par underscore (voir le
+ tableau ci-dessous)
+
+Les identifiants réservés par WeeChat :
+
+[width="100%",cols="5,5,3,4,7",options="header"]
+|===
+| Identifiant | Reçu avec sync | Données envoyées |
+ Description | Action recommendée dans le client
+
+| _buffer_opened | buffers / buffer | hdata: buffer |
+ Tampon ouvert | Ouvrir le tampon
+
+| _buffer_moved | buffers / buffer | hdata: buffer |
+ Tampon déplacé | Déplacer le tampon
+
+| _buffer_merged | buffers / buffer | hdata: buffer |
+ Tampon mélangé | Mélanger le tampon
+
+| _buffer_unmerged | buffers / buffer | hdata: buffer |
+ Tampon sorti du mélange | Sortir le tampon du mélange
+
+| _buffer_renamed | buffers / buffer | hdata: buffer |
+ Tampon renommé | Renommer le tampon
+
+| _buffer_title_changed | buffers / buffer | hdata: buffer |
+ Titre du tampon changé | Changer le titre du tampon
+
+| _buffer_type_changed | buffer | hdata: buffer |
+ Type de tampon changé | Changer le type de tampon
+
+| _buffer_localvar_added | buffer | hdata: buffer |
+ Variable locale ajoutée | Ajouter la variable locale dans le tampon
+
+| _buffer_localvar_changed | buffer | hdata: buffer |
+ Variable locale changée | Changer la variable locale dans le tampon
+
+| _buffer_localvar_removed | buffer | hdata: buffer |
+ Variable locale supprimée | Supprimer la variable locale du tampon
+
+| _buffer_line_added | buffer | hdata: line |
+ Ligne ajoutée dans le tampon | Afficher la ligne dans le tampon
+
+| _buffer_closing | buffers / buffer | hdata: buffer |
+ Tampon qui se ferme | Fermer le tampon
+
+| _nicklist | nicklist | hdata: nicklist_item |
+ Liste de pseudos pour un tampon | Remplacer la liste de pseudos
+
+| _nicklist_diff | nicklist | hdata: nicklist_item |
+ Différence de liste de pseudos pour un tampon | Mettre à jour la liste de pseudos
+
+| _pong | (always) | string: ping arguments |
+ Réponse à un "ping" | Mesurer le temps de réponse
+
+| _upgrade | upgrade | (empty) |
+ WeeChat se met à jour | Se désynchroniser de from WeeChat (ou quitter)
+
+| _upgrade_ended | upgrade | (empty) |
+ WeeChat a été mis à jour | (Re)synchroniser avec WeeChat
+|===
+
+[[message_buffer_opened]]
+==== _buffer_opened
+
+Ce message est envoyé au client lorsque le signal "buffer_opened" est envoyé par
+WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| short_name | chaîne | Nom court (exemple : '#weechat')
+| nicklist | entier | 1 si le tampon a une liste de pseudos, sinon 0
+| title | chaîne | Titre du tampon
+| local_variables | table de hachage | Variables locales
+| prev_buffer | pointeur | Pointeur vers le tampon précédent
+| next_buffer | pointeur | Pointeur vers le tampon suivant
+|===
+
+Exemple : canal '#weechat' rejoint sur freenode, nouveau tampon
+'irc.freenode.#weechat':
+
+[source,python]
+----
+id: '_buffer_opened'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'short_name': 'str', 'nicklist': 'int',
+ 'title': 'str', 'local_variables': 'htb', 'prev_buffer': 'ptr', 'next_buffer': 'ptr'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x35a8a60']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+ short_name: None
+ nicklist: 0
+ title: None
+ local_variables: {'plugin': 'irc', 'name': 'freenode.#weechat'}
+ prev_buffer: '0x34e7400'
+ next_buffer: '0x0'
+----
+
+[[message_buffer_moved]]
+==== _buffer_moved
+
+Ce message est envoyé au client lorsque le signal "buffer_moved" est envoyé par
+WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| prev_buffer | pointeur | Pointeur vers le tampon précédent
+| next_buffer | pointeur | Pointeur vers le tampon suivant
+|===
+
+Exemple : tampon 'irc.freenode.#weechat' déplacé vers le numéro 2 :
+
+[source,python]
+----
+id: '_buffer_moved'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'prev_buffer': 'ptr', 'next_buffer': 'ptr'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x34588c0']
+ number: 2
+ full_name: 'irc.freenode.#weechat'
+ prev_buffer: '0x347b9f0'
+ next_buffer: '0x3471bc0'
+----
+
+[[message_buffer_merged]]
+==== _buffer_merged
+
+Ce message est envoyé au client lorsque le signal "buffer_merged" est envoyé par
+WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| prev_buffer | pointeur | Pointeur vers le tampon précédent
+| next_buffer | pointeur | Pointeur vers le tampon suivant
+|===
+
+Exemple : tampon 'irc.freenode.#weechat' mélangé avec le tampon n°2 :
+
+[source,python]
+----
+id: '_buffer_merged'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'prev_buffer': 'ptr', 'next_buffer': 'ptr'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4db4c00']
+ number: 2
+ full_name: 'irc.freenode.#weechat'
+ prev_buffer: '0x4cef9b0'
+ next_buffer: '0x0'
+----
+
+[[message_buffer_unmerged]]
+==== _buffer_unmerged
+
+Ce message est envoyé au client lorsque le signal "buffer_unmerged" est envoyé
+par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| prev_buffer | pointeur | Pointeur vers le tampon précédent
+| next_buffer | pointeur | Pointeur vers le tampon suivant
+|===
+
+Exemple : tampon 'irc.freenode.#weechat' sorti du mélange :
+
+[source,python]
+----
+id: '_buffer_unmerged'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'prev_buffer': 'ptr', 'next_buffer': 'ptr'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4db4c00']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+ prev_buffer: '0x4cef9b0'
+ next_buffer: '0x0'
+----
+
+[[message_buffer_renamed]]
+==== _buffer_renamed
+
+Ce message est envoyé au client lorsque le signal "buffer_renamed" est envoyé
+par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| short_name | chaîne | Nom court (exemple : '#weechat')
+| local_variables | table de hachage | Variables locales
+|===
+
+Exemple : tampon privé renommé de 'FlashCode' en 'Flash2' :
+
+[source,python]
+----
+id: '_buffer_renamed'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'short_name': 'str', 'local_variables': 'htb'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4df7b80']
+ number: 5
+ full_name: 'irc.freenode.Flash2'
+ short_name: 'Flash2'
+ local_variables: {'server': 'freenode', 'plugin': 'irc', 'type': 'private',
+ 'channel': 'FlashCode', 'nick': 'test', 'name': 'local.Flash2'}
+----
+
+[[message_buffer_title_changed]]
+==== _buffer_title_changed
+
+Ce message est envoyé au client lorsque le signal "buffer_title_changed" est
+envoyé par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| title | chaîne | Titre du tampon
+|===
+
+Exemple : titre changé sur le canal '#weechat' :
+
+[source,python]
+----
+id: '_buffer_title_changed'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'title': 'str'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4a715d0']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+ title: 'Welcome on #weechat! http://weechat.org/'
+----
+
+[[message_buffer_type_changed]]
+==== _buffer_type_changed
+
+Ce message est envoyé au client lorsque le signal "buffer_type_changed" est
+envoyé par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| type | entier | Type de tampon : 0 = formaté (par défaut), 1 = contenu libre
+|===
+
+Exemple : type de tampon 'script.scripts' changé de formaté (0) à contenu
+libre (1) :
+
+[source,python]
+----
+id: '_buffer_type_changed'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'type': 'int'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x27c9a70']
+ number: 4
+ full_name: 'script.scripts'
+ type: 1
+----
+
+[[message_buffer_localvar_added]]
+==== _buffer_localvar_added
+
+Ce message est envoyé au client lorsque le signal "buffer_localvar_added" est
+envoyé par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Name | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| local_variables | table de hachage | Variables locales
+|===
+
+Exemple : variable locale 'test' ajoutée dans le tampon
+'irc.freenode.#weechat' :
+
+[source,python]
+----
+id='_buffer_localvar_added', objects:
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'local_variables': 'htb'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4a73de0']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+ local_variables: {'server': 'freenode', 'test': 'value', 'plugin': 'irc',
+ 'type': 'channel', 'channel': '#weechat', 'nick': 'test',
+ 'name': 'freenode.#weechat'}
+----
+
+[[message_buffer_localvar_changed]]
+==== _buffer_localvar_changed
+
+Ce message est envoyé au client lorsque le signal "buffer_localvar_changed" est
+envoyé par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| local_variables | table de hachage | Variables locales
+|===
+
+Exemple : variable locale 'test' mise à jour dans le tampon
+'irc.freenode.#weechat' :
+
+[source,python]
+----
+id='_buffer_localvar_changed', objects:
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'local_variables': 'htb'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4a73de0']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+ local_variables: {'server': 'local', 'test': 'value2', 'plugin': 'irc',
+ 'type': 'channel', 'channel': '#weechat', 'nick': 'test',
+ 'name': 'freenode.#weechat'}
+----
+
+[[message_buffer_localvar_removed]]
+==== _buffer_localvar_removed
+
+Ce message est envoyé au client lorsque le signal "buffer_localvar_removed" est
+envoyé par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+| local_variables | table de hachage | Variables locales
+|===
+
+Exemple : variable locale 'test' supprimée du tampon 'irc.freenode.#weechat' :
+
+[source,python]
+----
+id: '_buffer_localvar_removed'
+hda:
+ keys: {'number': 'int', 'full_name': 'str', 'local_variables': 'htb'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4a73de0']
+ number: 3
+ full_name: 'irc.freenode.#prout'
+ local_variables: {'server': 'local', 'plugin': 'irc', 'type': 'channel',
+ 'channel': '#weechat', 'nick': 'test', 'name': 'freenode.#weechat'}
+----
+
+[[message_buffer_line_added]]
+==== _buffer_line_added
+
+Ce message est envoyé au client lorsque le signal "buffer_line_added" est envoyé
+par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| buffer | pointeur | Pointeur vers le tampon
+| date | date/heure | Date du message
+| date_printed | date/heure | Date d'affichage du message
+| displayed | caractère | 1 si le message est affiché, 0 si le message est filtré (caché)
+| highlight | caractère | 1 si la ligne a un highlight, sinon 0
+| tags_array | tableau de chaînes | Liste des étiquettes de la ligne
+| prefix | chaîne | Préfixe
+| message | chaîne | Message
+|===
+
+Exemple : nouveau message 'hello!' du pseudo 'FlashCode' sur le tampon
+'irc.freenode.#weechat' :
+
+[source,python]
+----
+id: '_buffer_line_added'
+hda:
+ keys: {'buffer': 'ptr', 'date': 'tim', 'date_printed': 'tim', 'displayed': 'chr',
+ 'highlight': 'chr', 'tags_array': 'arr', 'prefix': 'str', 'message': 'str'}
+ path: ['line_data']
+ item 1:
+ __path: ['0x4a49600']
+ buffer: '0x4a715d0'
+ date: 1362728993
+ date_printed: 1362728993
+ displayed: 1
+ highlight: 0
+ tags_array: ['irc_privmsg', 'notify_message', 'prefix_nick_142', 'nick_FlashCode', 'log1']
+ prefix: 'F06@F@00142FlashCode'
+ message: 'hello!'
+----
+
+[[message_buffer_closing]]
+==== _buffer_closing
+
+Ce message est envoyé au client lorsque le signal "buffer_closing" est envoyé
+par WeeChat.
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| number | entier | Numéro de tampon (≥ 1)
+| full_name | chaîne | Nom complet (exemple : 'irc.freenode.#weechat')
+|===
+
+Exemple : tampon 'irc.freenode.#weechat' en cours de fermeture par WeeChat :
+
+[source,python]
+----
+id: '_buffer_closing'
+hda:
+ keys: {'number': 'int', 'full_name': 'str'}
+ path: ['buffer']
+ item 1:
+ __path: ['0x4a715d0']
+ number: 3
+ full_name: 'irc.freenode.#weechat'
+----
+
+[[message_nicklist]]
+==== _nicklist
+
+Ce message est envoyé au client lorsque de grosses mises à jour sont effectuées
+sur la liste de pseudos (groupes/pseudos ajoutés/supprimés/changés). Le message
+contient la liste complète des pseudos.
+
+Lorsque de petites mises à jour sont faites sur la liste de pseudos (par exemple
+l'ajout d'un seul pseudo), un autre message avec l'identifiant '_nicklist_diff'
+est envoyé (voir ci-dessous).
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| group | caractère | 1 pour un groupe, 0 pour un pseudo
+| visible | caractère | 1 si le groupe/pseudo est affiché, sinon 0
+| level | entier | Niveau du groupe (0 pour un pseudo)
+| name | chaîne | Nom du groupe/pseudo
+| color | chaîne | Couleur du nom
+| prefix | chaîne | Préfixe (seulement pour un pseudo)
+| prefix_color | chaîne | Couleur du préfixe (seulement pour un pseudo)
+|===
+
+Exemple : liste de pseudos pour le tampon 'irc.freenode.#weechat' :
+
+[source,python]
+----
+id: '_nicklist'
+hda:
+ keys: {'group': 'chr', 'visible': 'chr', 'level': 'int', 'name': 'str', 'color': 'str',
+ 'prefix': 'str', 'prefix_color': 'str'}
+ path: ['buffer', 'nicklist_item']
+ item 1:
+ __path: ['0x4a75cd0', '0x31e95d0']
+ group: 1
+ visible: 0
+ level: 0
+ name: 'root'
+ color: None
+ prefix: None
+ prefix_color: None
+ item 2:
+ __path: ['0x4a75cd0', '0x41247b0']
+ group: 1
+ visible: 1
+ level: 1
+ name: '000|o'
+ color: 'weechat.color.nicklist_group'
+ prefix: None
+ prefix_color: None
+ item 3:
+ __path: ['0x4a75cd0', '0x4a60d20']
+ group: 0
+ visible: 1
+ level: 0
+ name: 'FlashCode'
+ color: '142'
+ prefix: '@'
+ prefix_color: 'lightgreen'
+ item 4:
+ __path: ['0x4a75cd0', '0x4aafaf0']
+ group: 1
+ visible: 1
+ level: 1
+ name: '001|v'
+ color: 'weechat.color.nicklist_group'
+ prefix: None
+ prefix_color: None
+ item 5:
+ __path: ['0x4a75cd0', '0x4a48d80']
+ group: 1
+ visible: 1
+ level: 1
+ name: '999|...'
+ color: 'weechat.color.nicklist_group'
+ prefix: None
+ prefix_color: None
+ item 6:
+ __path: ['0x4a75cd0', '0x4a5f560']
+ group: 0
+ visible: 1
+ level: 0
+ name: 'test'
+ color: 'weechat.color.chat_nick_self'
+ prefix: ' '
+ prefix_color: ''
+----
+
+[[message_nicklist_diff]]
+==== _nicklist_diff
+
+_WeeChat ≥ 0.4.1._
+
+Ce message est envoyé au client lorsque de petites mises à jour sont effectuées
+sur la liste de pseudos (groupes/pseudos ajoutés/supprimés/changés). Le message
+contient les différences de la liste de pseudos (entre l'ancienne liste de
+pseudos et la nouvelle).
+
+Données envoyées dans le hdata :
+
+[width="100%",cols="3m,2,10",options="header"]
+|===
+| Nom | Type | Description
+| _diff | caractère | Type de différence (voir ci-dessous)
+| group | caractère | 1 pour un groupe, 0 pour un pseudo
+| visible | caractère | 1 si le groupe/pseudo est affiché, sinon 0
+| level | entier | Niveau du groupe (0 pour un pseudo)
+| name | chaîne | Nom du groupe/pseudo
+| color | chaîne | Couleur du nom
+| prefix | chaîne | Préfixe (seulement pour un pseudo)
+| prefix_color | chaîne | Couleur du préfixe (seulement pour un pseudo)
+|===
+
+La valeur de '_diff' peut être :
+
+* `^` : le groupe parent : le(s) groupe(s)/pseudo(s) après celui-ci sont liés à
+ ce groupe
+* `+` : groupe/pseudo ajouté dans le groupe parent
+* `-` : groupe/pseudo supprimé du groupe parent
+* `*` : groupe/pseudo mis à jour dans le groupe parent
+
+Exemple : pseudo 'master' ajouté dans le groupe '000|o' (opérateurs de canel sur
+un canal IRC), pseudos 'nick1' et 'nick2' ajoutés dans le groupe '999|...'
+(utilisateurs standard sur un canal IRC) :
+
+[source,python]
+----
+id: '_nicklist_diff'
+hda:
+ keys: {'_diff': 'chr', 'group': 'chr', 'visible': 'chr', 'level': 'int', 'name': 'str',
+ 'color': 'str', 'prefix': 'str', 'prefix_color': 'str'}
+ path: ['buffer', 'nicklist_item']
+ item 1:
+ __path: ['0x46f2ee0', '0x343c9b0']
+ _diff: 94 ('^')
+ group: 1
+ visible: 1
+ level: 1
+ name: '000|o'
+ color: 'weechat.color.nicklist_group'
+ prefix: None
+ prefix_color: None
+ item 2:
+ __path: ['0x46f2ee0', '0x47e7f60']
+ _diff: 43 ('+')
+ group: 0
+ visible: 1
+ level: 0
+ name: 'master'
+ color: 'magenta'
+ prefix: '@'
+ prefix_color: 'lightgreen'
+ item 3:
+ __path: ['0x46f2ee0', '0x46b8e70']
+ _diff: 94 ('^')
+ group: 1
+ visible: 1
+ level: 1
+ name: '999|...'
+ color: 'weechat.color.nicklist_group'
+ prefix: None
+ prefix_color: None
+ item 4:
+ __path: ['0x46f2ee0', '0x3dba240']
+ _diff: 43 ('+')
+ group: 0
+ visible: 1
+ level: 0
+ name: 'nick1'
+ color: 'green'
+ prefix: ' '
+ prefix_color: ''
+ item 5:
+ __path: ['0x46f2ee0', '0x3c379d0']
+ _diff: 43 ('+')
+ group: 0
+ visible: 1
+ level: 0
+ name: 'nick2'
+ color: 'lightblue'
+ prefix: ' '
+ prefix_color: ''
+----
+
+[[message_pong]]
+==== _pong
+
+_WeeChat ≥ 0.4.2._
+
+Ce message est envoyé au client lorsque 'relay' reçoit un message "ping".
+
+Données envoyées dans la chaîne : paramètres reçus dans le message "ping".
+
+L'action recommandée dans le client est de mesurer le temps dé réponse et se
+déconnecter si le temps est très long.
+
+[[message_upgrade]]
+==== _upgrade
+
+_WeeChat ≥ 0.3.8._
+
+Ce message est envoyé au client lorsque WeeChat commence sa mise à jour.
+
+Il n'y a pas de données dans le message.
+
+L'action recommandée dans le client est de se désynchroniser de WeeChat (envoi
+de la commande 'desync'), ou de se déconnecter de WeeChat (car après la mise à
+jour, tous les pointeurs changeront).
+
+[NOTE]
+Pendant la mise à jour de WeeChat, le socket reste ouvert (sauf si la connexion
+utilise SSL).
+
+[[message_upgrade_ended]]
+==== _upgrade_ended
+
+_WeeChat ≥ 0.3.8._
+
+Ce message est envoyé au client lorsque WeeChat a terminé sa mise à jour.
+
+Il n'y a pas de données dans le message.
+
+L'action recommandée dans le client est de se resynchroniser avec WeeChat :
+envoyer à nouveau les commandes envoyées au démarrage après 'init'.
+
+[[objects]]
+=== Objets
+
+Les objets sont identifiés par 3 lettres, appelées 'type'. Les types suivants
+sont utilisés :
+
+[width="100%",cols="^2m,5,10",options="header"]
+|===
+| Type | Valeur | Longueur
+| chr | Caractère signé | 1 octet
+| int | Entier signé | 4 octets
+| lon | Entier long signé | 1 octet + longueur de l'entier sous forme de chaîne
+| str | Chaîne | 4 octets + longueur de la chaîne (sans le '\0' final)
+| buf | Tampon d'octets | 4 octets + longueur des données
+| ptr | Pointeur | 1 octet + longueur du pointeur sous forme de chaîne
+| tim | Date/heure | 1 octet + longueur de la date/heure sous forme de chaîne
+| htb | Table de hachage | Variable
+| hda | Contenu du hdata | Variable
+| inf | Info: nom + contenu | Variable
+| inl | Contenu de l'infolist | Variable
+| arr | Tableau d'objets | 3 octets (type) + nombre d'objets + données
+|===
+
+[[object_char]]
+==== Caractère
+
+Un caractère signé est un octet.
+
+Exemple :
+
+....
+┌────┐
+│ 41 │ ────► 65 (0x41: "A")
+└────┘
+....
+
+[[object_integer]]
+==== Entier
+
+Un entier signé est stocké sur 4 octets, encodé au format "big-endian" (octet le
+plus significatif en premier).
+
+Intervalle : -2147483648 à 2147483647.
+
+Exemples :
+
+....
+┌────┬────┬────┬────┐
+│ 00 │ 01 │ E2 │ 40 │ ────► 123456
+└────┴────┴────┴────┘
+
+┌────┬────┬────┬────┐
+│ FF │ FE │ 1D │ C0 │ ────► -123456
+└────┴────┴────┴────┘
+....
+
+[[object_long_integer]]
+==== Entier long
+
+Un entier long signé est encodé sous forme de chaîne de caractères, avec la
+longueur sur un octet.
+
+Intervalle : -9223372036854775808 à 9223372036854775807.
+
+Exemples :
+
+....
+┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+│ 0A ║ 31 │ 32 │ 33 │ 34 │ 35 │ 36 │ 37 │ 38 │ 39 │ 30 │ ────► 1234567890
+└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
+ └──┘ └───────────────────────────────────────────────┘
+long. '1' '2' '3' '4' '5' '6' '7' '8' '9' '0'
+
+┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+│ 0B ║ 2D │ 31 │ 32 │ 33 │ 34 │ 35 │ 36 │ 37 │ 38 │ 39 │ 30 │ ────► -1234567890
+└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
+ └──┘ └────────────────────────────────────────────────────┘
+long. '-' '1' '2' '3' '4' '5' '6' '7' '8' '9' '0'
+....
+
+[[object_string]]
+==== Chaîne de caractères
+
+Une chaîne de caractère est une longueur (un entier sur 4 octets) + le contenu
+de la chaîne (sans le '\0' final).
+
+Exemple :
+
+....
+┌────┬────┬────┬────╥────┬────┬────┬────┬────┐
+│ 00 │ 00 │ 00 │ 05 ║ 68 │ 65 │ 6C │ 6C │ 6F │ ────► "hello"
+└────┴────┴────┴────╨────┴────┴────┴────┴────┘
+ └─────────────────┘ └──────────────────────┘
+ longueur 'h' 'e' 'l' 'l' 'o'
+....
+
+Une chaîne vide a une longueur de zéro :
+
+....
+┌────┬────┬────┬────┐
+│ 00 │ 00 │ 00 │ 00 │ ────► ""
+└────┴────┴────┴────┘
+ └─────────────────┘
+ longueur
+....
+
+Une chaîne 'NULL' (pointeur NULL en C) a une longueur de -1 :
+
+....
+┌────┬────┬────┬────┐
+│ FF │ FF │ FF │ FF │ ────► NULL
+└────┴────┴────┴────┘
+ └─────────────────┘
+ longueur
+....
+
+[[object_buffer]]
+==== Tampon de données
+
+Même format que l'objet <<object_string,chaîne>>; le contenu est simplement un
+tableau d'octets.
+
+[[object_pointer]]
+==== Pointeur
+
+Un pointeur est encodé sous forme de chaîne de caractère (hexadécimal), avec la
+longueur sur un octet.
+
+Exemple :
+
+....
+┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┐
+│ 09 ║ 31 │ 61 │ 32 │ 62 │ 33 │ 63 │ 34 │ 64 │ 35 │ ────► 0x1a2b3c4d5
+└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┘
+ └──┘ └──────────────────────────────────────────┘
+long. '1' 'a' '2' 'b' '3' 'c' '4' 'd' '5'
+....
+
+Un pointeur 'NULL' a une longueur de 1 avec la valeur 0 :
+
+....
+┌────╥────┐
+│ 01 ║ 00 │ ────► NULL (0x0)
+└────╨────┘
+ └──┘ └──┘
+long. 0
+....
+
+[[object_time]]
+==== Date/heure
+
+La date/heure (nombre de secondes) est encodé sous forme de chaîne de
+caractères, avec la longueur sur un octet.
+
+Exemple :
+
+....
+┌────╥────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
+│ 0A ║ 31 │ 33 │ 32 │ 31 │ 39 │ 39 │ 33 │ 34 │ 35 │ 36 │ ────► 1321993456
+└────╨────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
+ └──┘ └───────────────────────────────────────────────┘
+long. '1' '3' '2' '1' '9' '9' '3' '4' '5' '6'
+....
+
+[[object_hashtable]]
+==== Table de hachage
+
+Une table de hachage contient le type pour les clés, le type pour les valeurs,
+le nombre d'éléments dans la table de hachage (entier sur 4 octets), et les clés
+et valeurs de chaque élément.
+
+....
+┌───────────┬─────────────┬───────╥───────┬─────────╥─────╥───────┬─────────┐
+│ type_keys │ type_values │ count ║ key 1 │ value 1 ║ ... ║ key N │ value N │
+└───────────┴─────────────┴───────╨───────┴─────────╨─────╨───────┴─────────┘
+....
+
+Exemple :
+
+....
+┌─────┬─────┬───╥──────┬─────╥──────┬─────┐
+│ str │ str │ 2 ║ key1 │ abc ║ key2 │ def │ ────► { 'key1' => 'abc',
+└─────┴─────┴───╨──────┴─────╨──────┴─────┘ 'key2' => 'def' }
+ └───┘ └───┘ └─┘ └──────────┘ └──────────┘
+ type type nombre élément 1 élement 2
+ clés valeurs
+....
+
+[[object_hdata]]
+==== Hdata
+
+Un 'hdata' contient un chemin avec les noms de hdata, une liste de clés, le
+nombre d'objets, et l'ensemble des objets (chemin avec les pointeurs, puis les
+objets).
+
+....
+┌────────┬──────┬───────╥────────┬─────────────────────╥──
+│ h-path │ keys │ count ║ p-path │ value 1 ... value N ║ ...
+└────────┴──────┴───────╨────────┴─────────────────────╨──
+
+ ──╥────────┬─────────────────────╥─────┐
+ ... ║ p-path │ value 1 ... value N ║ ... │
+ ──╨────────┴─────────────────────╨─────┘
+....
+
+* 'h-path' (chaîne) : chemin utilise pour atteindre le hdata (exemple :
+ 'buffer/lines/line/line_data'); le dernier élément du chemin est le hdata
+ retourné
+* 'keys' (chaînes) : chaîne avec une liste de 'clé:type' (séparés par des
+ virgules), exemple : 'number:int,name:str'
+* 'count' (entier) : nombre d'objets
+* 'p-path' : chemin avec les pointeurs vers les objets (le nombre de pointeurs
+ ici est le nombre d'éléments dans le chemin)
+* 'values' : liste de valeurs (le nombre de valeurs est le nombre de clés
+ retournées pour le hdata)
+
+Exemple de hdata avec deux tampons (tampon "core" weechat et le serveur
+freenode) et deux clés ('number' et 'full_name') :
+
+....
+# commande
+hdata buffer:gui_buffers(*) number,full_name
+
+# réponse
+┌────────┬──────────────────────────┬───╥──
+│ buffer │ number:int,full_name:str │ 2 ║ ...
+└────────┴──────────────────────────┴───╨──
+ └──────┘ └────────────────────────┘ └─┘
+ h-path clés nombre
+
+ ──╥─────────┬───┬──────────────╥─────────┬───┬────────────────────┐
+ ... ║ 0x12345 │ 1 │ core.weechat ║ 0x6789a │ 2 │irc.server.freenode │
+ ──╨─────────┴───┴──────────────╨─────────┴───┴────────────────────┘
+ └──────────────────────────┘ └────────────────────────────────┘
+ tampon 1 tampon 2
+....
+
+Exemple de hdata avec les lignes du tampon "core" :
+
+....
+# commande
+hdata buffer:gui_buffers(*)/lines/first_line(*)/data
+
+# réponse
+┌─────────────────────────────┬─────┬────╥──
+│ buffer/lines/line/line_data │ ... │ 50 ║ ...
+└─────────────────────────────┴─────┴────╨──
+ └───────────────────────────┘ └───┘ └──┘
+ h-path (hdata names) clés nombre
+
+ ──╥───────────┬───────────┬───────────┬───────╥──
+ ... ║ 0x23cf970 │ 0x23cfb60 │ 0x23d5f40 │ ..... ║ ...
+ ──╨───────────┴───────────┴───────────┴───────╨──
+ └─────────────────────────────────┘ └─────┘
+ p-path (pointeurs) objets
+ └─────────────────────────────────────────┘
+ ligne 1
+
+ ──╥───────────┬───────────┬───────────┬───────╥──────────────┐
+ ... ║ 0x23cf970 │ 0x23cfb60 │ 0x23d6110 │ ..... ║ ............ │
+ ──╨───────────┴───────────┴───────────┴───────╨──────────────┘
+ └─────────────────────────────────┘ └─────┘
+ p-path (pointeurs) objets
+ └─────────────────────────────────────────┘ └────────────┘
+ ligne 2 lignes 3-50
+....
+
+Exemple de hdata avec la liste des pseudos :
+
+....
+# commande
+nicklist
+
+# réponse
+┌───────────────────┬──
+│ buffer/nick_group │ ...
+└───────────────────┴──
+ └─────────────────┘
+ h-path
+
+ ──╥───────────────────────────────────────────────────────────┬────╥──
+ ... ║ group:chr,visible:chr,name:str,color:str,prefix:str,(...) │ 12 ║ ...
+ ──╨───────────────────────────────────────────────────────────┴────╨──
+ └─────────────────────────────────────────────────────────┘ └──┘
+ clés nombre
+
+ ──╥─────────┬─────────┬───┬───┬──────┬─┬─┬─┬───╥──
+ ... ║ 0x12345 │ 0x6789a │ 1 │ 0 │ root │ │ │ │ 0 ║ ...
+ ──╨─────────┴─────────┴───┴───┴──────┴─┴─┴─┴───╨──
+ └─────────────────┘ └──────────────────────┘
+ p-path objets
+ └──────────────────────────────────────────┘
+ groupe (racine de la liste des pseudos)
+
+ ──╥─────────┬─────────┬───┬───┬───────┬─┬─┬─┬───╥──
+ ... ║ 0x123cf │ 0x678d4 │ 1 │ 0 │ 000|o │ │ │ │ 1 ║ ...
+ ──╨─────────┴─────────┴───┴───┴───────┴─┴─┴─┴───╨──
+ └─────────────────┘ └───────────────────────┘
+ p-path objets
+ └───────────────────────────────────────────┘
+ groupe (ops du canal)
+
+ ──╥─────────┬─────────┬───┬───┬──────────┬──────┬───┬────────────┬───╥──
+ ... ║ 0x128a7 │ 0x67ab2 │ 0 │ 1 │ ChanServ │ blue │ @ │ lightgreen │ 0 ║ ...
+ ──╨─────────┴─────────┴───┴───┴──────────┴──────┴───┴────────────┴───╨──
+ └─────────────────┘ └────────────────────────────────────────────┘
+ p-path objets
+ └────────────────────────────────────────────────────────────────┘
+ pseudo (@ChanServ)
+....
+
+[[object_info]]
+==== Info
+
+Une 'info' contient un nom et une valeur (les deux sont des chaînes de
+caractères).
+
+....
+┌──────┬───────┐
+│ name │ value │
+└──────┴───────┘
+....
+
+* 'nom' (chaîne) : nom de l'info
+* 'value' (chaîne) : valeur
+
+Exemple de l'info 'version' :
+
+....
+┌─────────┬───────────────────┐
+│ version │ WeeChat 0.3.7-dev │
+└─────────┴───────────────────┘
+....
+
+[[object_infolist]]
+==== Infolist
+
+Une 'infolist' contient un nom, nombre d'éléments, et les éléments (ensemble de
+variables).
+
+....
+┌──────┬───────╥────────╥─────╥────────┐
+│ name │ count ║ item 1 ║ ... ║ item N │
+└──────┴───────╨────────╨─────╨────────┘
+....
+
+Un élément est :
+
+....
+┌───────╥────────┬────────┬─────────╥─────╥────────┬────────┬─────────┐
+│ count ║ name 1 │ type 1 │ value 1 ║ ... ║ name N │ type N │ value N │
+└───────╨────────┴────────┴─────────╨─────╨────────┴────────┴─────────┘
+....
+
+* 'name' (chaîne) : nom de l'infolist ('buffer', 'window', 'bar', ...)
+* 'count' (entier) : nombre d'éléments
+* 'item' :
+** 'count' : nombre de variables dans l'élément
+** 'name' : nom de variable
+** 'type' : type de variable ('int', 'str', ...)
+** 'value' : valeur de la variable
+
+Exemple d'infolist avec deux tampons (tampon "core" weechat et le serveur
+freenode) :
+
+....
+# commande
+infolist buffer
+
+# réponse
+┌────────┬───╥────┬─────────┬─────┬─────────┬─────╥──
+│ buffer │ 2 ║ 42 │ pointer │ ptr │ 0x12345 │ ... ║ ...
+└────────┴───╨────┴─────────┴─────┴─────────┴─────╨──
+ └──────┘ └─┘ └──────────────────────────────────┘
+ nom nombre élément 1
+
+ ──╥────┬─────────┬─────┬─────────┬─────┐
+ ... ║ 42 │ pointer │ ptr │ 0x6789a │ ... │
+ ──╨────┴─────────┴─────┴─────────┴─────┘
+ └──────────────────────────────────┘
+ élément 2
+....
+
+[[object_array]]
+==== Tableau
+
+Un tableau est un type (3 octets) + nombre d'objets (entier sur 4 octets) + les
+données.
+
+Exemple de tableau avec deux chaînes de caractères :
+
+....
+┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥──
+│ str ║ 00 │ 00 │ 00 │ 02 ║ 00 │ 00 │ 00 │ 03 ║ ...
+└─────╨────┴────┴────┴────╨────┴────┴────┴────╨──
+ └───┘ └─────────────────┘ └─────────────────┘
+ type nombre de chaînes longueur
+
+ ──╥────┬────┬────╥────┬────┬────┬────╥────┬────┐
+ ... ║ 61 │ 62 │ 63 ║ 00 │ 00 │ 00 │ 02 ║ 64 │ 65 │ ────► [ "abc", "de" ]
+ ──╨────┴────┴────╨────┴────┴────┴────╨────┴────┘
+ └────────────┘ └─────────────────┘ └───────┘
+ 'a' 'b' 'c' longueur 'd' 'e'
+....
+
+Exemple de tableau avec trois entiers :
+
+....
+┌─────╥────┬────┬────┬────╥────┬────┬────┬────╥──
+│ int ║ 00 │ 00 │ 00 │ 03 ║ 00 │ 00 │ 00 │ 7B ║ ...
+└─────╨────┴────┴────┴────╨────┴────┴────┴────╨──
+ └───┘ └─────────────────┘ └─────────────────┘
+ type nombre d'entiers 123 (0x7B)
+
+ ──╥────┬────┬────┬────╥────┬────┬────┬────┐
+ ... ║ 00 │ 00 │ 01 │ C8 ║ 00 │ 00 │ 03 │ 15 │ ────► [ 123, 456, 789 ]
+ ──╨────┴────┴────┴────╨────┴────┴────┴────┘
+ └─────────────────┘ └─────────────────┘
+ 456 (0x1C8) 789 (0x315)
+....
+
+Un tableau 'NULL' :
+
+....
+┌─────╥────┬────┬────┬────┐
+│ str ║ 00 │ 00 │ 00 │ 00 │ ────► NULL
+└─────╨────┴────┴────┴────┘
+ └───┘ └─────────────────┘
+ type nombre de chaînes
+....
+
+[[typical_session]]
+== Session typique
+
+....
+ ┌────────┐ ┌───────┐ ┌─────────┐
+ │ Client ├ ─ ─ ─ ─ (réseau)─ ─ ─ ─ ┤ Relay ├────────────────┤ WeeChat │
+ └────────┘ └───────┘ └─────────┘
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ ouverture socket ║ ajout du client ║
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ cmd: init password=xxx,... ║ init/autoriser client ║
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ cmd: hdata buffer ... ╟───────────────────────► ║
+ ║ sync ... ║ demande de hdata ║ lecture
+ ║ ║ ║ valeurs
+ ║ ║ ◄───────────────────────╢ hdata
+ ║ ◄───────────────────────────────╢ hdata ║
+ créat° ║ msg: hda buffer ║ ║
+ tampons ║ ║ ║
+ ║ ........ ║ ........ ║
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ cmd: input ... ╟───────────────────────► ║
+ ║ ║ envoi données au tampon ║ envoi données
+ ║ ║ ║ au tampon
+ ║ ........ ║ ........ ║
+ ║ ║ ║ signal
+ ║ ║ ◄───────────────────────╢ reçu
+ ║ ◄───────────────────────────────╢ signal XXX ║ (accroché
+ MAJ ║ msg: id: "_buffer_..." ║ ║ par relay)
+ tampons ║ ║ ║
+ ║ ........ ║ ........ ║
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ cmd: ping ... ║ ║
+ ║ ║ ║
+ ║ ◄───────────────────────────────╢ ║
+ mesure ║ msg: id: "_pong" ... ║ ║
+ temps ║ ║ ║
+ réponse ║ ........ ║ ........ ║
+ ║ ║ ║
+ ╟───────────────────────────────► ║ ║
+ ║ cmd: quit ║ déconnexion du client ║
+ ║ ║ ║
+....