1
0
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:
Sebastien Helleu
2013-02-07 22:08:31 +01:00
parent 3e2bf9be0a
commit e4149b073d
5 changed files with 344 additions and 229 deletions
+3 -1
View File
@@ -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"
+75 -38
View File
@@ -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')
|=====================================================
+251 -184
View File
@@ -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 \
+3 -6
View File
@@ -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);
}
}