|
|
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
// License, version 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include "weechat-plugin.h"
|
|
|
|
#include "slack.h"
|
|
|
|
#include "slack-config.h"
|
|
|
|
#include "slack-workspace.h"
|
|
|
|
|
|
|
|
struct t_config_file *slack_config_file;
|
|
|
|
|
|
|
|
struct t_config_section *slack_config_section_workspace_default;
|
|
|
|
struct t_config_section *slack_config_section_workspace;
|
|
|
|
|
|
|
|
struct t_config_option *slack_config_look_nick_completion_smart;
|
|
|
|
|
|
|
|
struct t_config_option *slack_config_workspace_default[SLACK_WORKSPACE_NUM_OPTIONS];
|
|
|
|
|
|
|
|
int slack_config_workspace_check_value_cb(const void *pointer, void *data,
|
|
|
|
struct t_config_option *option,
|
|
|
|
const char *value)
|
|
|
|
{
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
(void) option;
|
|
|
|
(void) value;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void slack_config_workspace_change_cb(const void *pointer, void *data,
|
|
|
|
struct t_config_option *option)
|
|
|
|
{
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
(void) option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void slack_config_workspace_default_change_cb(const void *pointer, void *data,
|
|
|
|
struct t_config_option *option)
|
|
|
|
{
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
(void) option;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct t_config_option *
|
|
|
|
slack_config_workspace_new_option (struct t_config_file *config_file,
|
|
|
|
struct t_config_section *section,
|
|
|
|
int index_option,
|
|
|
|
const char *option_name,
|
|
|
|
const char *default_value,
|
|
|
|
const char *value,
|
|
|
|
int null_value_allowed,
|
|
|
|
int (*callback_check_value)(const void *pointer,
|
|
|
|
void *data,
|
|
|
|
struct t_config_option *option,
|
|
|
|
const char *value),
|
|
|
|
const void *callback_check_value_pointer,
|
|
|
|
void *callback_check_value_data,
|
|
|
|
void (*callback_change)(const void *pointer,
|
|
|
|
void *data,
|
|
|
|
struct t_config_option *option),
|
|
|
|
const void *callback_change_pointer,
|
|
|
|
void *callback_change_data)
|
|
|
|
{
|
|
|
|
struct t_config_option *new_option;
|
|
|
|
|
|
|
|
new_option = NULL;
|
|
|
|
|
|
|
|
switch (index_option)
|
|
|
|
{
|
|
|
|
case SLACK_WORKSPACE_OPTION_TOKEN:
|
|
|
|
new_option = weechat_config_new_option (
|
|
|
|
config_file, section,
|
|
|
|
option_name, "string",
|
|
|
|
N_("slack api token"),
|
|
|
|
NULL, 0, 0,
|
|
|
|
default_value, value,
|
|
|
|
null_value_allowed,
|
|
|
|
callback_check_value,
|
|
|
|
callback_check_value_pointer,
|
|
|
|
callback_check_value_data,
|
|
|
|
callback_change,
|
|
|
|
callback_change_pointer,
|
|
|
|
callback_change_data,
|
|
|
|
NULL, NULL, NULL);
|
|
|
|
break;
|
|
|
|
case SLACK_WORKSPACE_NUM_OPTIONS:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return new_option;
|
|
|
|
}
|
|
|
|
|
|
|
|
void slack_config_workspace_create_default_options(struct t_config_section *section)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < SLACK_WORKSPACE_NUM_OPTIONS; i++)
|
|
|
|
{
|
|
|
|
slack_config_workspace_default[i] = slack_config_workspace_new_option(
|
|
|
|
slack_config_file,
|
|
|
|
section,
|
|
|
|
i,
|
|
|
|
slack_workspace_options[i][0],
|
|
|
|
slack_workspace_options[i][1],
|
|
|
|
slack_workspace_options[i][1],
|
|
|
|
0,
|
|
|
|
&slack_config_workspace_check_value_cb,
|
|
|
|
slack_workspace_options[i][0],
|
|
|
|
NULL,
|
|
|
|
&slack_config_workspace_default_change_cb,
|
|
|
|
slack_workspace_options[i][0],
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int slack_config_reload (const void *pointer, void *data,
|
|
|
|
struct t_config_file *config_file)
|
|
|
|
{
|
|
|
|
/* make C compiler happy */
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
|
|
|
|
//weechat_config_section_free_options(slack_config_section_workspace_default);
|
|
|
|
//weechat_config_section_free_options(slack_config_section_workspace);
|
|
|
|
//slack_workspace_free_all();
|
|
|
|
|
|
|
|
return weechat_config_reload(config_file);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int slack_config_workspace_read_cb (const void *pointer, void *data,
|
|
|
|
struct t_config_file *config_file,
|
|
|
|
struct t_config_section *section,
|
|
|
|
const char *option_name, const char *value)
|
|
|
|
{
|
|
|
|
struct t_slack_workspace *ptr_workspace;
|
|
|
|
int index_option, rc, i;
|
|
|
|
char *pos_option, *workspace_domain;
|
|
|
|
|
|
|
|
/* make C compiler happy */
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
(void) config_file;
|
|
|
|
(void) section;
|
|
|
|
|
|
|
|
rc = WEECHAT_CONFIG_OPTION_SET_ERROR;
|
|
|
|
|
|
|
|
if (option_name)
|
|
|
|
{
|
|
|
|
pos_option = strrchr(option_name, '.');
|
|
|
|
if (pos_option)
|
|
|
|
{
|
|
|
|
workspace_domain = weechat_strndup(option_name,
|
|
|
|
pos_option - option_name);
|
|
|
|
pos_option++;
|
|
|
|
if (workspace_domain)
|
|
|
|
{
|
|
|
|
index_option = slack_workspace_search_option(pos_option);
|
|
|
|
if (index_option >= 0)
|
|
|
|
{
|
|
|
|
ptr_workspace = slack_workspace_search(workspace_domain);
|
|
|
|
if (!ptr_workspace)
|
|
|
|
ptr_workspace = slack_workspace_alloc(workspace_domain);
|
|
|
|
if (ptr_workspace)
|
|
|
|
{
|
|
|
|
if (ptr_workspace->reloading_from_config
|
|
|
|
&& !ptr_workspace->reloaded_from_config)
|
|
|
|
{
|
|
|
|
for (i = 0; i < SLACK_WORKSPACE_NUM_OPTIONS; i++)
|
|
|
|
{
|
|
|
|
weechat_config_option_set(
|
|
|
|
ptr_workspace->options[i], NULL, 1);
|
|
|
|
}
|
|
|
|
ptr_workspace->reloaded_from_config = 1;
|
|
|
|
}
|
|
|
|
rc = weechat_config_option_set(
|
|
|
|
ptr_workspace->options[index_option], value, 1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
weechat_printf(
|
|
|
|
NULL,
|
|
|
|
_("%s%s: error adding workspace \"%s\""),
|
|
|
|
weechat_prefix("error"), SLACK_PLUGIN_NAME,
|
|
|
|
workspace_domain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(workspace_domain);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (rc == WEECHAT_CONFIG_OPTION_SET_ERROR)
|
|
|
|
{
|
|
|
|
weechat_printf(
|
|
|
|
NULL,
|
|
|
|
_("%s%s: error creating workspace option \"%s\""),
|
|
|
|
weechat_prefix("error"), SLACK_PLUGIN_NAME, option_name);
|
|
|
|
}
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
int slack_config_workspace_write_cb (const void *pointer, void *data,
|
|
|
|
struct t_config_file *config_file,
|
|
|
|
const char *section_name)
|
|
|
|
{
|
|
|
|
struct t_slack_workspace *ptr_workspace;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* make C compiler happy */
|
|
|
|
(void) pointer;
|
|
|
|
(void) data;
|
|
|
|
|
|
|
|
if (!weechat_config_write_line(config_file, section_name, NULL))
|
|
|
|
return WEECHAT_CONFIG_WRITE_ERROR;
|
|
|
|
|
|
|
|
for (ptr_workspace = slack_workspaces; ptr_workspace;
|
|
|
|
ptr_workspace = ptr_workspace->next_workspace)
|
|
|
|
{
|
|
|
|
for (i = 0; i < SLACK_WORKSPACE_NUM_OPTIONS; i++)
|
|
|
|
{
|
|
|
|
if (!weechat_config_write_option(config_file,
|
|
|
|
ptr_workspace->options[i]))
|
|
|
|
return WEECHAT_CONFIG_WRITE_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return WEECHAT_CONFIG_WRITE_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
int slack_config_init()
|
|
|
|
{
|
|
|
|
struct t_config_section *ptr_section;
|
|
|
|
|
|
|
|
slack_config_file = weechat_config_new(SLACK_CONFIG_NAME,
|
|
|
|
&slack_config_reload, NULL, NULL);
|
|
|
|
|
|
|
|
if(!slack_config_file)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
ptr_section = weechat_config_new_section(
|
|
|
|
slack_config_file, "look",
|
|
|
|
0, 0,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (!ptr_section)
|
|
|
|
{
|
|
|
|
weechat_config_free(slack_config_file);
|
|
|
|
slack_config_file = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
slack_config_look_nick_completion_smart = weechat_config_new_option (
|
|
|
|
slack_config_file, ptr_section,
|
|
|
|
"nick_completion_smart", "integer",
|
|
|
|
N_("smart completion for nicks (completes first with last speakers): "
|
|
|
|
"speakers = all speakers (including highlights), "
|
|
|
|
"speakers_highlights = only speakers with highlight"),
|
|
|
|
"off|speakers|speakers_highlights", 0, 0, "speakers", NULL, 0,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
|
|
|
|
|
|
|
|
ptr_section = weechat_config_new_section(
|
|
|
|
slack_config_file, "workspace_default",
|
|
|
|
0, 0,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (!ptr_section)
|
|
|
|
{
|
|
|
|
weechat_config_free(slack_config_file);
|
|
|
|
slack_config_file = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
slack_config_section_workspace_default = ptr_section;
|
|
|
|
|
|
|
|
slack_config_workspace_create_default_options(ptr_section);
|
|
|
|
|
|
|
|
ptr_section = weechat_config_new_section(
|
|
|
|
slack_config_file, "workspace",
|
|
|
|
0, 0,
|
|
|
|
&slack_config_workspace_read_cb, NULL, NULL,
|
|
|
|
&slack_config_workspace_write_cb, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL);
|
|
|
|
|
|
|
|
if (!ptr_section)
|
|
|
|
{
|
|
|
|
weechat_config_free(slack_config_file);
|
|
|
|
slack_config_file = NULL;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
slack_config_section_workspace = ptr_section;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
int slack_config_read()
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
rc = weechat_config_read(slack_config_file);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
int slack_config_write()
|
|
|
|
{
|
|
|
|
return weechat_config_write(slack_config_file);
|
|
|
|
}
|
|
|
|
|
|
|
|
void slack_config_free()
|
|
|
|
{
|
|
|
|
}
|