mirror of
https://github.com/weechat/weechat.git
synced 2026-07-06 09:43:13 +02:00
relay: add options "buffers" and "upgrade" for commands sync/desync in weechat protocol
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
WeeChat ChangeLog
|
||||
=================
|
||||
Sébastien Helleu <flashcode@flashtux.org>
|
||||
v0.4.1-dev, 2013-02-04
|
||||
v0.4.1-dev, 2013-02-07
|
||||
|
||||
|
||||
Version 0.4.1 (under dev!)
|
||||
@@ -21,6 +21,8 @@ Version 0.4.1 (under dev!)
|
||||
* irc: add color in output of /names when result is on server buffer (channel
|
||||
not joined) (bug #38070)
|
||||
* perl: simplify code to load scripts
|
||||
* relay: add options "buffers" and "upgrade" for commands sync/desync in weechat
|
||||
protocol
|
||||
* relay: fix commands sync/desync in weechat protocol (bug #38215)
|
||||
* scripts: do not allow empty script name in function "register"
|
||||
|
||||
|
||||
@@ -282,43 +282,66 @@ input irc.freenode.#weechat hello guys!
|
||||
sync
|
||||
~~~~
|
||||
|
||||
_Updated in version 0.4.1._
|
||||
|
||||
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).
|
||||
|
||||
Syntax:
|
||||
|
||||
----------------------------------------
|
||||
sync [<buffer>[,<buffer>...] <options>]
|
||||
sync [<buffer>[,<buffer>...] <option>[,<option>...]]
|
||||
----------------------------------------
|
||||
|
||||
Arguments:
|
||||
|
||||
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
||||
'core.weechat' or 'irc.freenode.#weechat'); name '*' can be used to
|
||||
'core.weechat' or 'irc.freenode.#weechat'); name "*" can be used to
|
||||
specify all buffers
|
||||
* 'options': one of following keywords, separated by commas (default is
|
||||
'buffer,nicklist'):
|
||||
** 'buffer': receive signals about buffer (new lines, buffer renamed/moved/...)
|
||||
'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_)
|
||||
** 'upgrade': receive signals about WeeChat upgrade (upgrade, upgrade ended);
|
||||
this can be used only with name "*"
|
||||
(_new in version 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_)
|
||||
** 'nicklist': receive nicklist after changes
|
||||
|
||||
Examples:
|
||||
|
||||
----------------------------------------
|
||||
# synchronize all buffers with nicklist (the 3 commands are equivalent)
|
||||
# synchronize all buffers with nicklist
|
||||
# (the 3 commands are equivalent, but the first one is recommended
|
||||
# for compatibility with future versions)
|
||||
sync
|
||||
sync *
|
||||
sync * buffer,nicklist
|
||||
sync * buffers,upgrade,buffer,nicklist
|
||||
|
||||
# synchronize core buffer
|
||||
sync core.buffer
|
||||
|
||||
# synchronize #weechat channel, without nicklist
|
||||
sync irc.freenode.#weechat buffer
|
||||
|
||||
# get general signals + all signals for #weechat channel
|
||||
sync * buffers,upgrade
|
||||
sync irc.freenode.#weechat
|
||||
----------------------------------------
|
||||
|
||||
[[command_desync]]
|
||||
desync
|
||||
~~~~~~
|
||||
|
||||
_Updated in version 0.4.1._
|
||||
|
||||
Desynchronize one or more buffers, to stop updates.
|
||||
|
||||
[NOTE]
|
||||
@@ -328,24 +351,33 @@ buffers, the client will still receive updates for buffers.
|
||||
Syntax:
|
||||
|
||||
----------------------------------------
|
||||
desync [<buffer>[,<buffer>...] <options>]
|
||||
desync [<buffer>[,<buffer>...] <option>[,<option>...]]
|
||||
----------------------------------------
|
||||
|
||||
Arguments:
|
||||
|
||||
* 'buffer': pointer ('0x12345') or full name of buffer (for example:
|
||||
'core.weechat' or 'irc.freenode.#weechat'); name '*' can be used to
|
||||
'core.weechat' or 'irc.freenode.#weechat'); name "*" can be used to
|
||||
specify all buffers
|
||||
* 'options': one of following keywords, separated by commas (default is
|
||||
'buffer,nicklist'):
|
||||
** 'buffer': receive signals about buffer (new lines, buffer renamed/moved...)
|
||||
** 'nicklist': receive nicklist after changes
|
||||
'buffers,upgrade,buffer,nicklist' for "*" and 'buffer,nicklist' for a buffer);
|
||||
see <<command_sync,command sync>> for values.
|
||||
|
||||
[NOTE]
|
||||
When using buffer "*", the other buffers synchronized (using a name) are kept. +
|
||||
So if you send: "sync *", then "sync irc.freenode.#weechat", then "desync *",
|
||||
the updates on #weechat channel will still be sent by WeeChat (you must remove
|
||||
it explicitly to stop updates).
|
||||
|
||||
Examples:
|
||||
|
||||
----------------------------------------
|
||||
# desynchronize all buffers
|
||||
# (the 3 commands are equivalent, but the first one is recommended
|
||||
# for compatibility with future versions)
|
||||
desync
|
||||
desync *
|
||||
desync * buffers,upgrade,buffer,nicklist
|
||||
|
||||
# desynchronize nicklist for #weechat channel (keep buffer updates)
|
||||
desync irc.freenode.#weechat nicklist
|
||||
@@ -360,7 +392,12 @@ test
|
||||
|
||||
Test command: WeeChat will reply with various different objects.
|
||||
|
||||
This command is useful to test the decoding of objects rerutned by WeeChat.
|
||||
This command is useful to test the decoding of 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
|
||||
WeeChat.
|
||||
|
||||
Syntax:
|
||||
|
||||
@@ -460,81 +497,81 @@ There are two different identifiers ('id'):
|
||||
|
||||
WeeChat reserved identifiers:
|
||||
|
||||
[width="100%",cols="5m,5,3,10,8",options="header"]
|
||||
[width="100%",cols="5m,5,3,3,10,8",options="header"]
|
||||
|=====================================================
|
||||
| Identifier | Description | Hdata type | Hdata content
|
||||
| Identifier | Description | Received with sync | Hdata type | Hdata content
|
||||
| Recommended action in client
|
||||
|
||||
| _buffer_opened | Buffer opened | buffer |
|
||||
| _buffer_opened | Buffer opened | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'short_name' (string), +
|
||||
'nicklist' (integer), 'title' (string), 'local_variables' (hashtable), +
|
||||
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
||||
Open buffer
|
||||
|
||||
| _buffer_type_changed | Type of buffer changed | buffer |
|
||||
'number' (integer), 'full_name' (string), +
|
||||
'type' (integer) |
|
||||
Change type of buffer
|
||||
|
||||
| _buffer_moved | Buffer moved | buffer |
|
||||
| _buffer_moved | Buffer moved | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), +
|
||||
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
||||
Move buffer
|
||||
|
||||
| _buffer_merged | Buffer merged | buffer |
|
||||
| _buffer_merged | Buffer merged | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), +
|
||||
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
||||
Merge buffer
|
||||
|
||||
| _buffer_unmerged | Buffer unmerged | buffer |
|
||||
| _buffer_unmerged | Buffer unmerged | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), +
|
||||
'prev_buffer' (pointer), 'next_buffer' (pointer) |
|
||||
Unmerge buffer
|
||||
|
||||
| _buffer_renamed | Buffer renamed | buffer |
|
||||
| _buffer_renamed | Buffer renamed | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'short_name' (string),
|
||||
'local_variables' (hashtable) |
|
||||
Rename buffer
|
||||
|
||||
| _buffer_title_changed | Title of buffer changed | buffer |
|
||||
| _buffer_title_changed | Title of buffer changed | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'title' (string) |
|
||||
Change title of buffer
|
||||
|
||||
| _buffer_localvar_added | Local variable added | buffer |
|
||||
| _buffer_closing | Buffer closing | buffers / buffer | buffer |
|
||||
'number' (integer), 'full_name' (string) |
|
||||
Close buffer
|
||||
|
||||
| _buffer_type_changed | Type of buffer changed | buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), +
|
||||
'type' (integer) |
|
||||
Change type of buffer
|
||||
|
||||
| _buffer_localvar_added | Local variable added | buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
||||
Add local variable in buffer
|
||||
|
||||
| _buffer_localvar_changed | Local variable changed | buffer |
|
||||
| _buffer_localvar_changed | Local variable changed | buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
||||
Change local variable in buffer
|
||||
|
||||
| _buffer_localvar_removed | Local variable removed | buffer |
|
||||
| _buffer_localvar_removed | Local variable removed | buffer | buffer |
|
||||
'number' (integer), 'full_name' (string), 'local_variables' (hashtable) |
|
||||
Remove local variable from buffer
|
||||
|
||||
| _buffer_line_added | Line added in buffer | line |
|
||||
| _buffer_line_added | Line added in buffer | buffer | line |
|
||||
'buffer' (pointer), 'date' (time), 'date_printed' (time), 'displayed' (char),
|
||||
'highlight' (char), 'tags_array' (array of strings), 'prefix' (string),
|
||||
'message' (string) |
|
||||
Display line in buffer
|
||||
|
||||
| _buffer_closing | Buffer closing | buffer |
|
||||
'number' (integer), 'full_name' (string) |
|
||||
Close buffer
|
||||
|
||||
| _nicklist | Nicklist for a buffer | nicklist_item |
|
||||
| _nicklist | Nicklist for a buffer | nicklist | nicklist_item |
|
||||
'group' (char), 'visible' (char), 'level' (integer), +
|
||||
'name' (string), 'color' (string), +
|
||||
'prefix' (string), 'prefix_color' (string) |
|
||||
Update nicklist
|
||||
|
||||
| _upgrade | WeeChat is upgrading +
|
||||
(_new in version 0.3.8_) | (empty) |
|
||||
| _upgrade | WeeChat is upgrading +
|
||||
(_new in version 0.3.8_) | upgrade | (empty) |
|
||||
(empty) |
|
||||
Desync from WeeChat (send command 'desync')
|
||||
|
||||
| _upgrade_ended | Upgrade of WeeChat done +
|
||||
(_new in version 0.3.8_) | (empty) |
|
||||
| _upgrade_ended | Upgrade of WeeChat done +
|
||||
(_new in version 0.3.8_) | upgrade | (empty) |
|
||||
(empty) |
|
||||
Resync with WeeChat (resend all commands sent on startup after the 'init')
|
||||
|=====================================================
|
||||
|
||||
@@ -88,33 +88,59 @@ relay_weechat_protocol_get_buffer (const char *arg)
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if buffer is synchronized, according to flags.
|
||||
* Gets integer value of a synchronization flag.
|
||||
*/
|
||||
|
||||
int
|
||||
relay_weechat_protocol_sync_flag (const char *flag)
|
||||
{
|
||||
if (strcmp (flag, "buffer") == 0)
|
||||
return RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER;
|
||||
if (strcmp (flag, "nicklist") == 0)
|
||||
return RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
if (strcmp (flag, "buffers") == 0)
|
||||
return RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS;
|
||||
if (strcmp (flag, "upgrade") == 0)
|
||||
return RELAY_WEECHAT_PROTOCOL_SYNC_UPGRADE;
|
||||
|
||||
/* unknown flag */
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Checks if buffer is synchronized with at least one of the flags given.
|
||||
*
|
||||
* First search buffer with full_name in hashtable "buffers_sync".
|
||||
* If buffer is not found, search "*" (which means "all buffers").
|
||||
* First searches buffer with full_name in hashtable "buffers_sync" (if buffer
|
||||
* is not NULL).
|
||||
* If buffer is NULL or not found, searches "*" (which means "all buffers").
|
||||
*
|
||||
* The "flags" argument can be a combination (logical OR) of:
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS
|
||||
* RELAY_WEECHAT_PROTOCOL_SYNC_UPGRADE
|
||||
*
|
||||
* Returns:
|
||||
* 1: buffer is synchronized for these flags
|
||||
* 0: buffer is NOT synchronized for these flags
|
||||
* 1: buffer is synchronized with at least one flag given
|
||||
* 0: buffer is NOT synchronized with any of the flags given
|
||||
*/
|
||||
|
||||
int
|
||||
relay_weechat_protocol_buffer_is_sync (struct t_relay_client *ptr_client,
|
||||
const char *full_name, int flags)
|
||||
relay_weechat_protocol_is_sync (struct t_relay_client *ptr_client,
|
||||
struct t_gui_buffer *buffer, int flags)
|
||||
{
|
||||
int *ptr_flags;
|
||||
|
||||
/* search buffer using "full_name" */
|
||||
ptr_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
full_name);
|
||||
if (ptr_flags)
|
||||
return ((*ptr_flags) & flags) ? 1 : 0;
|
||||
/* search buffer using its full name */
|
||||
if (buffer)
|
||||
{
|
||||
ptr_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
weechat_buffer_get_string (buffer, "full_name"));
|
||||
if (ptr_flags)
|
||||
return ((*ptr_flags) & flags) ? 1 : 0;
|
||||
}
|
||||
|
||||
/* search buffer "*" */
|
||||
/* search special name "*" as fallback */
|
||||
ptr_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(ptr_client, buffers_sync),
|
||||
"*");
|
||||
if (ptr_flags)
|
||||
@@ -361,17 +387,23 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,short_name,"
|
||||
"nicklist,title,local_variables,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,short_name,"
|
||||
"nicklist,title,local_variables,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (signal, "buffer_type_changed") == 0)
|
||||
@@ -380,15 +412,20 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if buffer is synchronized with flag "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,type");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,type");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (signal, "buffer_moved") == 0)
|
||||
@@ -397,16 +434,22 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((strcmp (signal, "buffer_merged") == 0)
|
||||
@@ -416,16 +459,22 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,"
|
||||
"prev_buffer,next_buffer");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (signal, "buffer_renamed") == 0)
|
||||
@@ -434,16 +483,22 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,short_name,"
|
||||
"local_variables");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,short_name,"
|
||||
"local_variables");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (signal, "buffer_title_changed") == 0)
|
||||
@@ -452,15 +507,21 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,title");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,title");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strncmp (signal, "buffer_localvar_", 16) == 0)
|
||||
@@ -469,15 +530,20 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if buffer is synchronized with flag "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,local_variables");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name,local_variables");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (strcmp (signal, "buffer_line_added") == 0)
|
||||
@@ -503,11 +569,9 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer || (relay_raw_buffer && (ptr_buffer == relay_raw_buffer)))
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
/* check if buffer is synchronized with flag "buffer" */
|
||||
if (relay_weechat_protocol_buffer_is_sync (ptr_client,
|
||||
weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name"),
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
/* send line only if buffer is synchronized with flag "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
@@ -530,17 +594,23 @@ relay_weechat_protocol_signal_buffer_cb (void *data, const char *signal,
|
||||
if (!ptr_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if sync with flag "buffers" or "buffer" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, ptr_buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER))
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
weechat_hashtable_remove (RELAY_WEECHAT_DATA(ptr_client, buffers_nicklist),
|
||||
cmd_hdata + 7);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
snprintf (cmd_hdata, sizeof (cmd_hdata),
|
||||
"buffer:0x%lx", (long unsigned int)ptr_buffer);
|
||||
weechat_hashtable_remove (RELAY_WEECHAT_DATA(ptr_client, buffers_nicklist),
|
||||
cmd_hdata + 7);
|
||||
relay_weechat_msg_add_hdata (msg, cmd_hdata,
|
||||
"number,full_name");
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -649,14 +719,12 @@ relay_weechat_protocol_signal_nicklist_cb (void *data, const char *signal,
|
||||
if (!str_buffer)
|
||||
return WEECHAT_RC_OK;
|
||||
|
||||
/* check if buffer is synchronized with flag "nicklist" */
|
||||
rc = sscanf (str_buffer, "%lx", &buffer);
|
||||
if ((rc != EOF) && (rc != 0))
|
||||
{
|
||||
if (relay_weechat_protocol_buffer_is_sync (ptr_client,
|
||||
weechat_buffer_get_string ((void *)buffer,
|
||||
"full_name"),
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST))
|
||||
/* send nicklist only if buffer is synchronized with flag "nicklist" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, (void *)buffer,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST))
|
||||
{
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(ptr_client, buffers_nicklist),
|
||||
str_buffer, "1");
|
||||
@@ -700,11 +768,16 @@ relay_weechat_protocol_signal_upgrade_cb (void *data, const char *signal,
|
||||
if ((strcmp (signal, "upgrade") == 0)
|
||||
|| (strcmp (signal, "upgrade_ended") == 0))
|
||||
{
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
/* send signal only if client is synchronized with flag "upgrade" */
|
||||
if (relay_weechat_protocol_is_sync (ptr_client, NULL,
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_UPGRADE))
|
||||
{
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
msg = relay_weechat_msg_new (str_signal);
|
||||
if (msg)
|
||||
{
|
||||
relay_weechat_msg_send (ptr_client, msg);
|
||||
relay_weechat_msg_free (msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -723,8 +796,9 @@ relay_weechat_protocol_signal_upgrade_cb (void *data, const char *signal,
|
||||
RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
{
|
||||
char **buffers, **flags, *full_name;
|
||||
int num_buffers, num_flags, i, add_flags, *ptr_old_flags, new_flags;
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
int num_buffers, num_flags, i, add_flags, mask, *ptr_old_flags, new_flags;
|
||||
int rc;
|
||||
long unsigned int value;
|
||||
|
||||
RELAY_WEECHAT_PROTOCOL_MIN_ARGS(0);
|
||||
|
||||
@@ -732,61 +806,61 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
&num_buffers);
|
||||
if (buffers)
|
||||
{
|
||||
add_flags = RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
add_flags = RELAY_WEECHAT_PROTOCOL_SYNC_ALL;
|
||||
if (argc > 1)
|
||||
{
|
||||
add_flags = 0;
|
||||
flags = weechat_string_split (argv[1], ",", 0, 0, &num_flags);
|
||||
if (flags)
|
||||
{
|
||||
add_flags = 0;
|
||||
for (i = 0; i < num_flags; i++)
|
||||
{
|
||||
if (strcmp (flags[i], "buffer") == 0)
|
||||
add_flags |= RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER;
|
||||
else if (strcmp (flags[i], "nicklist") == 0)
|
||||
add_flags |= RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
}
|
||||
if (add_flags == 0)
|
||||
{
|
||||
add_flags = RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
add_flags |= relay_weechat_protocol_sync_flag (flags[i]);
|
||||
}
|
||||
weechat_string_free_split (flags);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < num_buffers; i++)
|
||||
if (add_flags)
|
||||
{
|
||||
full_name = NULL;
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
for (i = 0; i < num_buffers; i++)
|
||||
{
|
||||
full_name = strdup (buffers[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr_buffer = relay_weechat_protocol_get_buffer (buffers[i]);
|
||||
if (ptr_buffer)
|
||||
full_name = strdup (weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name"));
|
||||
}
|
||||
if (full_name)
|
||||
{
|
||||
ptr_old_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
new_flags = ((ptr_old_flags) ? *ptr_old_flags : 0);
|
||||
new_flags |= add_flags;
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name,
|
||||
&new_flags);
|
||||
free (full_name);
|
||||
full_name = NULL;
|
||||
mask = RELAY_WEECHAT_PROTOCOL_SYNC_FOR_BUFFER;
|
||||
if (strncmp (buffers[i], "0x", 2) == 0)
|
||||
{
|
||||
rc = sscanf (buffers[i], "%lx", &value);
|
||||
if ((rc != EOF) && (rc != 0))
|
||||
{
|
||||
full_name = strdup (weechat_buffer_get_string ((struct t_gui_buffer *)value,
|
||||
"full_name"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
full_name = strdup (buffers[i]);
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
mask = RELAY_WEECHAT_PROTOCOL_SYNC_ALL;
|
||||
}
|
||||
|
||||
if (full_name)
|
||||
{
|
||||
ptr_old_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
new_flags = ((ptr_old_flags) ? *ptr_old_flags : 0);
|
||||
new_flags |= (add_flags & mask);
|
||||
if (new_flags)
|
||||
{
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name,
|
||||
&new_flags);
|
||||
}
|
||||
free (full_name);
|
||||
}
|
||||
}
|
||||
}
|
||||
weechat_string_free_split (buffers);
|
||||
}
|
||||
|
||||
if (!RELAY_WEECHAT_DATA(client, hook_signal_buffer))
|
||||
relay_weechat_hook_signals (client);
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
@@ -802,8 +876,9 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(sync)
|
||||
RELAY_WEECHAT_PROTOCOL_CALLBACK(desync)
|
||||
{
|
||||
char **buffers, **flags, *full_name;
|
||||
int num_buffers, num_flags, i, sub_flags, *ptr_old_flags, new_flags;
|
||||
struct t_gui_buffer *ptr_buffer;
|
||||
int num_buffers, num_flags, i, sub_flags, mask, *ptr_old_flags, new_flags;
|
||||
int rc;
|
||||
long unsigned int value;
|
||||
|
||||
RELAY_WEECHAT_PROTOCOL_MIN_ARGS(0);
|
||||
|
||||
@@ -811,74 +886,66 @@ RELAY_WEECHAT_PROTOCOL_CALLBACK(desync)
|
||||
&num_buffers);
|
||||
if (buffers)
|
||||
{
|
||||
sub_flags = RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
sub_flags = RELAY_WEECHAT_PROTOCOL_SYNC_ALL;
|
||||
if (argc > 1)
|
||||
{
|
||||
sub_flags = 0;
|
||||
flags = weechat_string_split (argv[1], ",", 0, 0, &num_flags);
|
||||
if (flags)
|
||||
{
|
||||
sub_flags = 0;
|
||||
for (i = 0; i < num_flags; i++)
|
||||
{
|
||||
if (strcmp (flags[i], "buffer") == 0)
|
||||
sub_flags |= RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER;
|
||||
else if (strcmp (flags[i], "nicklist") == 0)
|
||||
sub_flags |= RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
}
|
||||
if (sub_flags == 0)
|
||||
{
|
||||
sub_flags = RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER |
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST;
|
||||
sub_flags |= relay_weechat_protocol_sync_flag (flags[i]);
|
||||
}
|
||||
weechat_string_free_split (flags);
|
||||
}
|
||||
}
|
||||
for (i = 0; i < num_buffers; i++)
|
||||
if (sub_flags)
|
||||
{
|
||||
full_name = NULL;
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
for (i = 0; i < num_buffers; i++)
|
||||
{
|
||||
full_name = strdup (buffers[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
ptr_buffer = relay_weechat_protocol_get_buffer (buffers[i]);
|
||||
if (ptr_buffer)
|
||||
full_name = NULL;
|
||||
mask = RELAY_WEECHAT_PROTOCOL_SYNC_FOR_BUFFER;
|
||||
if (strncmp (buffers[i], "0x", 2) == 0)
|
||||
{
|
||||
full_name = strdup (weechat_buffer_get_string (ptr_buffer,
|
||||
"full_name"));
|
||||
}
|
||||
}
|
||||
if (full_name)
|
||||
{
|
||||
ptr_old_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
new_flags = ((ptr_old_flags) ? *ptr_old_flags : 0);
|
||||
new_flags &= ~sub_flags;
|
||||
if (new_flags)
|
||||
{
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name,
|
||||
&new_flags);
|
||||
rc = sscanf (buffers[i], "%lx", &value);
|
||||
if ((rc != EOF) && (rc != 0))
|
||||
{
|
||||
full_name = strdup (weechat_buffer_get_string ((struct t_gui_buffer *)value,
|
||||
"full_name"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_hashtable_remove (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
full_name = strdup (buffers[i]);
|
||||
if (strcmp (buffers[i], "*") == 0)
|
||||
mask = RELAY_WEECHAT_PROTOCOL_SYNC_ALL;
|
||||
}
|
||||
|
||||
if (full_name)
|
||||
{
|
||||
ptr_old_flags = weechat_hashtable_get (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
new_flags = ((ptr_old_flags) ? *ptr_old_flags : 0);
|
||||
new_flags &= ~(sub_flags & mask);
|
||||
if (new_flags)
|
||||
{
|
||||
weechat_hashtable_set (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name,
|
||||
&new_flags);
|
||||
}
|
||||
else
|
||||
{
|
||||
weechat_hashtable_remove (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
full_name);
|
||||
}
|
||||
free (full_name);
|
||||
}
|
||||
free (full_name);
|
||||
}
|
||||
}
|
||||
weechat_string_free_split (buffers);
|
||||
}
|
||||
|
||||
if (weechat_hashtable_get_integer (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
"items_count") == 0)
|
||||
{
|
||||
relay_weechat_unhook_signals (client);
|
||||
}
|
||||
|
||||
return WEECHAT_RC_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,18 @@
|
||||
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER 1
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST 2
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS 4
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_UPGRADE 8
|
||||
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_ALL \
|
||||
(RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER | \
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST | \
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_BUFFERS | \
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_UPGRADE)
|
||||
|
||||
#define RELAY_WEECHAT_PROTOCOL_SYNC_FOR_BUFFER \
|
||||
(RELAY_WEECHAT_PROTOCOL_SYNC_BUFFER | \
|
||||
RELAY_WEECHAT_PROTOCOL_SYNC_NICKLIST)
|
||||
|
||||
#define RELAY_WEECHAT_PROTOCOL_CALLBACK(__command) \
|
||||
int \
|
||||
|
||||
@@ -219,6 +219,8 @@ relay_weechat_alloc (struct t_relay_client *client)
|
||||
NULL,
|
||||
NULL);
|
||||
RELAY_WEECHAT_DATA(client, hook_timer_nicklist) = NULL;
|
||||
|
||||
relay_weechat_hook_signals (client);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -289,12 +291,7 @@ relay_weechat_alloc_with_infolist (struct t_relay_client *client,
|
||||
}
|
||||
RELAY_WEECHAT_DATA(client, hook_timer_nicklist) = NULL;
|
||||
|
||||
if (weechat_hashtable_get_integer (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
"items_count") > 0)
|
||||
relay_weechat_hook_signals (client);
|
||||
if (weechat_hashtable_get_integer (RELAY_WEECHAT_DATA(client, buffers_sync),
|
||||
"items_count") > 0)
|
||||
relay_weechat_hook_timer_nicklist (client);
|
||||
relay_weechat_hook_signals (client);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user