1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-05 17:23:15 +02:00

* commands from users outside channel now authorized (if special user or channel without "n" flag)

* completion added for config option (with /set command)
This commit is contained in:
Sebastien Helleu
2005-06-30 12:55:36 +00:00
parent 2fab4da03d
commit 5bd56f86c6
26 changed files with 1140 additions and 914 deletions
+1 -1
View File
@@ -708,7 +708,7 @@ user_command (t_irc_server *server, t_gui_buffer *buffer, char *command)
ptr_nick = nick_search (CHANNEL(buffer), server->nick);
if (ptr_nick)
{
irc_display_nick (CHANNEL(buffer)->buffer, ptr_nick,
irc_display_nick (CHANNEL(buffer)->buffer, ptr_nick, NULL,
MSG_TYPE_NICK, 1, 1, 0);
gui_printf_color (CHANNEL(buffer)->buffer,
COLOR_WIN_CHAT, "%s\n", command);
+86 -16
View File
@@ -47,6 +47,7 @@ completion_init (t_completion *completion)
completion->base_command_arg = 0;
completion->position = -1;
completion->base_word = NULL;
completion->args = NULL;
completion->completion_list = NULL;
completion->last_completion = NULL;
@@ -67,6 +68,10 @@ completion_free (t_completion *completion)
free (completion->base_word);
completion->base_word = NULL;
if (completion->args)
free (completion->args);
completion->args = NULL;
while (completion->completion_list)
weelist_remove (&completion->completion_list,
&completion->last_completion,
@@ -97,8 +102,11 @@ completion_build_list (t_completion *completion, void *channel)
int i, j;
t_irc_server *ptr_server;
t_irc_channel *ptr_channel;
char option_name[256];
char *pos, option_name[256];
t_weechat_alias *ptr_alias;
t_config_option *option;
void *option_value;
char option_string[2048];
/* WeeChat internal commands */
@@ -211,32 +219,92 @@ completion_build_list (t_completion *completion, void *channel)
"unload");
return;
}
if ((strcasecmp (completion->base_command, "set") == 0)
&& (completion->base_command_arg == 1))
if (strcasecmp (completion->base_command, "set") == 0)
{
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
if (completion->base_command_arg == 1)
{
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
for (i = 0; i < CONFIG_NUMBER_SECTIONS; i++)
{
for (j = 0; weechat_options[i][j].option_name; j++)
if ((i != CONFIG_SECTION_ALIAS) && (i != CONFIG_SECTION_SERVER))
{
for (j = 0; weechat_options[i][j].option_name; j++)
{
weelist_add (&completion->completion_list,
&completion->last_completion,
weechat_options[i][j].option_name);
}
}
}
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
{
for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
{
snprintf (option_name, sizeof (option_name), "%s.%s",
ptr_server->name,
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
weelist_add (&completion->completion_list,
&completion->last_completion,
weechat_options[i][j].option_name);
option_name);
}
}
}
for (ptr_server = irc_servers; ptr_server;
ptr_server = ptr_server->next_server)
else if (completion->base_command_arg == 3)
{
for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
if (completion->args)
{
snprintf (option_name, sizeof (option_name), "%s.%s",
ptr_server->name,
weechat_options[CONFIG_SECTION_SERVER][i].option_name);
weelist_add (&completion->completion_list,
&completion->last_completion,
option_name);
pos = strchr (completion->args, ' ');
if (pos)
pos[0] = '\0';
option = NULL;
option_value = NULL;
config_option_search_option_value (completion->args, &option, &option_value);
if (option && option_value)
{
switch (option->option_type)
{
case OPTION_TYPE_BOOLEAN:
if (option_value && (*((int *)(option_value))))
weelist_add (&completion->completion_list,
&completion->last_completion,
"on");
else
weelist_add (&completion->completion_list,
&completion->last_completion,
"off");
break;
case OPTION_TYPE_INT:
snprintf (option_string, sizeof (option_string) - 1,
"%d", (option_value) ? *((int *)(option_value)) : option->default_int);
weelist_add (&completion->completion_list,
&completion->last_completion,
option_string);
break;
case OPTION_TYPE_INT_WITH_STRING:
weelist_add (&completion->completion_list,
&completion->last_completion,
(option_value) ?
option->array_values[*((int *)(option_value))] :
option->array_values[option->default_int]);
break;
case OPTION_TYPE_COLOR:
weelist_add (&completion->completion_list,
&completion->last_completion,
(option_value) ?
gui_get_color_by_value (*((int *)(option_value))) :
option->default_string);
break;
case OPTION_TYPE_STRING:
weelist_add (&completion->completion_list,
&completion->last_completion,
(option_value) ?
*((char **)(option_value)) :
option->default_string);
break;
}
}
if (pos)
pos[0] = ' ';
}
}
return;
@@ -471,6 +539,8 @@ completion_find_context (t_completion *completion, void *channel, char *buffer,
command_arg++;
i++;
while ((i < pos) && (buffer[i] == ' ')) i++;
if (!completion->args)
completion->args = strdup (buffer + i);
}
else
i++;
+1
View File
@@ -39,6 +39,7 @@ struct t_completion
char *base_word; /* word to complete (when Tab was pressed) */
int base_word_pos; /* beggining of base word */
int position; /* position where Tab was pressed */
char *args; /* command line args (including base word) */
/* for command argument completion */
t_weelist *completion_list; /* data list for completion */
+66
View File
@@ -1054,6 +1054,72 @@ config_option_search (char *option_name)
return NULL;
}
/*
* config_option_search_option_value: look for type and value of an option
* (including server options)
* if option is not found, NULL is returned
*/
void
config_option_search_option_value (char *option_name, t_config_option **option,
void **option_value)
{
t_config_option *ptr_option;
t_irc_server *ptr_server;
int i;
void *ptr_value;
char *pos;
ptr_option = NULL;
ptr_value = NULL;
ptr_option = config_option_search (option_name);
if (!ptr_option)
{
pos = strchr (option_name, '.');
if (pos)
{
pos[0] = '\0';
ptr_server = server_search (option_name);
if (ptr_server)
{
for (i = 0; weechat_options[CONFIG_SECTION_SERVER][i].option_name; i++)
{
if (strcmp (weechat_options[CONFIG_SECTION_SERVER][i].option_name,
pos + 1) == 0)
{
ptr_option = &weechat_options[CONFIG_SECTION_SERVER][i];
ptr_value = config_get_server_option_ptr (ptr_server, pos + 1);
break;
}
}
}
pos[0] = '.';
}
}
else
{
switch (ptr_option->option_type)
{
case OPTION_TYPE_BOOLEAN:
case OPTION_TYPE_INT:
case OPTION_TYPE_INT_WITH_STRING:
case OPTION_TYPE_COLOR:
ptr_value = (void *)(ptr_option->ptr_int);
break;
case OPTION_TYPE_STRING:
ptr_value = (void *)(ptr_option->ptr_string);
break;
}
}
if (ptr_option)
{
*option = ptr_option;
*option_value = ptr_value;
}
}
/*
* config_set_value: set new value for an option (found by name)
* return: 0 if success
+1
View File
@@ -196,6 +196,7 @@ extern void config_change_fifo_pipe ();
extern void config_change_notify_levels ();
extern int config_option_set_value (t_config_option *, char *);
extern t_config_option *config_option_search (char *);
extern void config_option_search_option_value (char *, t_config_option **, void **);
extern int config_set_value (char *, char *);
extern void *config_get_server_option_ptr (t_irc_server *, char *);
extern int config_set_server_value (t_irc_server *, char *, char *);