mirror of
https://github.com/hexchat/hexchat.git
synced 2024-11-06 03:02:30 +01:00
Add variables for user credentials in connect commands
This commit is contained in:
parent
f778245a86
commit
c168a9adc6
@ -4356,6 +4356,85 @@ xit:
|
||||
free (newcmd);
|
||||
}
|
||||
|
||||
char *
|
||||
command_insert_vars (session *sess, char *cmd)
|
||||
{
|
||||
int pos;
|
||||
GString *expanded;
|
||||
ircnet *mynet = (ircnet *) sess->server->network;
|
||||
|
||||
if (!mynet) /* shouldn't really happen */
|
||||
{
|
||||
return g_strdup (cmd); /* the return value will be freed so we must srtdup() it */
|
||||
}
|
||||
|
||||
expanded = g_string_new (NULL);
|
||||
|
||||
while (strchr (cmd, '%') != NULL)
|
||||
{
|
||||
pos = (int) (strchr (cmd, '%') - cmd); /* offset to the first '%' */
|
||||
g_string_append_len (expanded, cmd, pos); /* copy contents till the '%' */
|
||||
cmd += pos + 1; /* jump to the char after the '%' */
|
||||
|
||||
switch (cmd[0])
|
||||
{
|
||||
case 'n':
|
||||
if (mynet->nick)
|
||||
{
|
||||
g_string_append (expanded, mynet->nick);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_append (expanded, prefs.hex_irc_nick1);
|
||||
}
|
||||
cmd++;
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
if (mynet->pass)
|
||||
{
|
||||
g_string_append (expanded, mynet->pass);
|
||||
}
|
||||
cmd++;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
if (mynet->real)
|
||||
{
|
||||
g_string_append (expanded, mynet->real);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_append (expanded, prefs.hex_irc_real_name);
|
||||
}
|
||||
cmd++;
|
||||
break;
|
||||
|
||||
case 'u':
|
||||
if (mynet->user)
|
||||
{
|
||||
g_string_append (expanded, mynet->user);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_append (expanded, prefs.hex_irc_user_name);
|
||||
}
|
||||
cmd++;
|
||||
break;
|
||||
|
||||
default: /* unsupported character? copy it along with the '%'! */
|
||||
cmd--;
|
||||
g_string_append_len (expanded, cmd, 2);
|
||||
cmd += 2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
g_string_append (expanded, cmd); /* copy any remaining string after the last '%' */
|
||||
|
||||
return g_string_free (expanded, FALSE);
|
||||
}
|
||||
|
||||
/* handle a command, without the '/' prefix */
|
||||
|
||||
int
|
||||
@ -4372,6 +4451,7 @@ handle_command (session *sess, char *cmd, int check_spch)
|
||||
char tbuf_static[TBUFSIZE];
|
||||
char *pdibuf;
|
||||
char *tbuf;
|
||||
char *cmd_vars;
|
||||
int len;
|
||||
int ret = TRUE;
|
||||
|
||||
@ -4383,19 +4463,29 @@ handle_command (session *sess, char *cmd, int check_spch)
|
||||
command_level++;
|
||||
/* anything below MUST DEC command_level before returning */
|
||||
|
||||
len = strlen (cmd);
|
||||
cmd_vars = command_insert_vars (sess, cmd);
|
||||
|
||||
len = strlen (cmd_vars);
|
||||
if (len >= sizeof (pdibuf_static))
|
||||
{
|
||||
pdibuf = malloc (len + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
pdibuf = pdibuf_static;
|
||||
}
|
||||
|
||||
if ((len * 2) >= sizeof (tbuf_static))
|
||||
{
|
||||
tbuf = malloc ((len * 2) + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
tbuf = tbuf_static;
|
||||
}
|
||||
|
||||
/* split the text into words and word_eol */
|
||||
process_data_init (pdibuf, cmd, word, word_eol, TRUE, TRUE);
|
||||
process_data_init (pdibuf, cmd_vars, word, word_eol, TRUE, TRUE);
|
||||
|
||||
/* ensure an empty string at index 32 for cmd_deop etc */
|
||||
/* (internal use only, plugins can still only read 1-31). */
|
||||
@ -4405,17 +4495,25 @@ handle_command (session *sess, char *cmd, int check_spch)
|
||||
int_cmd = find_internal_command (word[1]);
|
||||
/* redo it without quotes processing, for some commands like /JOIN */
|
||||
if (int_cmd && !int_cmd->handle_quotes)
|
||||
process_data_init (pdibuf, cmd, word, word_eol, FALSE, FALSE);
|
||||
{
|
||||
process_data_init (pdibuf, cmd_vars, word, word_eol, FALSE, FALSE);
|
||||
}
|
||||
|
||||
if (check_spch && prefs.hex_input_perc_color)
|
||||
check_special_chars (cmd, prefs.hex_input_perc_ascii);
|
||||
{
|
||||
check_special_chars (cmd_vars, prefs.hex_input_perc_ascii);
|
||||
}
|
||||
|
||||
if (plugin_emit_command (sess, word[1], word, word_eol))
|
||||
{
|
||||
goto xit;
|
||||
}
|
||||
|
||||
/* incase a plugin did /close */
|
||||
if (!is_session (sess))
|
||||
{
|
||||
goto xit;
|
||||
}
|
||||
|
||||
/* first see if it's a userCommand */
|
||||
list = command_list;
|
||||
@ -4431,7 +4529,9 @@ handle_command (session *sess, char *cmd, int check_spch)
|
||||
}
|
||||
|
||||
if (user_cmd)
|
||||
{
|
||||
goto xit;
|
||||
}
|
||||
|
||||
/* now check internal commands */
|
||||
int_cmd = find_internal_command (word[1]);
|
||||
@ -4441,38 +4541,51 @@ handle_command (session *sess, char *cmd, int check_spch)
|
||||
if (int_cmd->needserver && !sess->server->connected)
|
||||
{
|
||||
notc_msg (sess);
|
||||
} else if (int_cmd->needchannel && !sess->channel[0])
|
||||
}
|
||||
else if (int_cmd->needchannel && !sess->channel[0])
|
||||
{
|
||||
notj_msg (sess);
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (int_cmd->callback (sess, tbuf, word, word_eol))
|
||||
{
|
||||
case FALSE:
|
||||
help (sess, tbuf, int_cmd->name, TRUE);
|
||||
break;
|
||||
case 2:
|
||||
ret = FALSE;
|
||||
goto xit;
|
||||
case FALSE:
|
||||
help (sess, tbuf, int_cmd->name, TRUE);
|
||||
break;
|
||||
case 2:
|
||||
ret = FALSE;
|
||||
goto xit;
|
||||
}
|
||||
}
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
/* unknown command, just send it to the server and hope */
|
||||
if (!sess->server->connected)
|
||||
{
|
||||
PrintText (sess, _("Unknown Command. Try /help\n"));
|
||||
}
|
||||
else
|
||||
sess->server->p_raw (sess->server, cmd);
|
||||
{
|
||||
sess->server->p_raw (sess->server, cmd_vars);
|
||||
}
|
||||
}
|
||||
|
||||
xit:
|
||||
command_level--;
|
||||
|
||||
if (pdibuf != pdibuf_static)
|
||||
{
|
||||
free (pdibuf);
|
||||
}
|
||||
|
||||
if (tbuf != tbuf_static)
|
||||
{
|
||||
free (tbuf);
|
||||
}
|
||||
|
||||
g_free (cmd_vars);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -1593,6 +1593,7 @@ servlist_open_edit (GtkWidget *parent, ircnet *net)
|
||||
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
|
||||
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow5), GTK_SHADOW_IN);
|
||||
add_tip (scrolledwindow5, _("%n=Nick name\n%p=Password\n%r=Real name\n%u=User name"));
|
||||
|
||||
|
||||
/* Server Tree */
|
||||
|
Loading…
Reference in New Issue
Block a user