1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-09 03:03:12 +02:00

relay/remote: add, update and remove buffer local variables received from remote

This commit is contained in:
Sébastien Helleu
2024-05-16 07:45:02 +02:00
parent 1100b0e694
commit 47f40f961a
@@ -466,6 +466,69 @@ error:
return WEECHAT_RC_OK;
}
/*
* Checks if a local variable received in JSON object "local_variables" can
* be used.
*
* The following variables are ignored and must NOT be used:
* - "plugin": contains the plugin name
* - "name": contains the buffer name
* - "relay_remote*": variables reserved for relay remote (in case of nested
* remotes, the variables are not propagated)
*
* Returns:
* 1: variable can be used
* 0: variable must NOT be used (reserved)
*/
int
relay_remote_event_check_local_var (const char *name)
{
if (!name)
return 0;
return ((strcmp (name, "plugin") != 0)
&& (strcmp (name, "name") != 0)
&& (strncmp (name, "relay_remote", 12) != 0)) ?
1 : 0;
}
/*
* Remove local variables in buffer that are not in the JSON object
* "local_variables".
*/
void
relay_remote_event_remove_localvar_cb (void *data,
struct t_hashtable *hashtable,
const void *key,
const void *value)
{
void **pointers;
struct t_gui_buffer *buffer;
cJSON *json;
char str_local_var[1024];
/* make C compiler happy */
(void) hashtable;
(void) value;
pointers = (void **)data;
buffer = pointers[0];
json = pointers[1];
if (!relay_remote_event_check_local_var (key))
return;
if (!cJSON_GetObjectItem (json, key))
{
/* local variable removed on remote? => remove it locally */
snprintf (str_local_var, sizeof (str_local_var),
"localvar_del_%s", (const char *)key);
weechat_buffer_set (buffer, str_local_var, "");
}
}
/*
* Callback for a buffer event or response to GET /api/buffers.
*/
@@ -475,11 +538,13 @@ RELAY_REMOTE_EVENT_CALLBACK(buffer)
struct t_gui_buffer *ptr_buffer;
struct t_hashtable *buffer_props;
struct t_relay_remote_event event_line;
struct t_hashtable *local_variables;
cJSON *json_obj, *json_keys, *json_key, *json_key_name, *json_key_command;
cJSON *json_lines, *json_line, *json_nicklist_root;
cJSON *json_vars, *json_var, *json_lines, *json_line, *json_nicklist_root;
void *pointers[2];
const char *name, *short_name, *type, *title, *modes, *input_prompt, *input;
const char *ptr_key, *ptr_command;
char *full_name, str_number[64], *property;
char *full_name, str_number[64], str_local_var[1024], *property;
long long id;
int number, nicklist, nicklist_case_sensitive, nicklist_display_groups;
int apply_props, input_position, input_multiline;
@@ -574,6 +639,48 @@ RELAY_REMOTE_EVENT_CALLBACK(buffer)
&relay_remote_event_apply_props, ptr_buffer);
}
json_vars = cJSON_GetObjectItem (event->json, "local_variables");
if (json_vars && cJSON_IsObject (json_vars))
{
if (weechat_strcmp (event->name, "buffer_localvar_removed") == 0)
{
/*
* we don't know which variables have been removed, so we remove any
* local variable in the buffer that is not defined in the JSON
* object "local_variables" received
*/
pointers[0] = ptr_buffer;
pointers[1] = json_vars;
local_variables = weechat_hdata_pointer (relay_hdata_buffer,
ptr_buffer,
"local_variables");
if (local_variables)
{
weechat_hashtable_map (local_variables,
&relay_remote_event_remove_localvar_cb,
pointers);
}
}
else
{
/* add/update local variables */
cJSON_ArrayForEach (json_var, json_vars)
{
if (json_var->string
&& cJSON_IsString (json_var)
&& relay_remote_event_check_local_var (json_var->string))
{
snprintf (str_local_var, sizeof (str_local_var),
"localvar_set_%s",
json_var->string);
weechat_buffer_set (ptr_buffer,
str_local_var,
cJSON_GetStringValue (json_var));
}
}
}
}
/* add keys */
json_keys = cJSON_GetObjectItem (event->json, "keys");
if (json_keys && cJSON_IsArray (json_keys))