mirror of
https://github.com/weechat/weechat.git
synced 2026-07-08 02:33:12 +02:00
This is a workaround (disabled by default) to join and chat on ISO encoded channels (or another charset different from UTF-8). This option may be removed in future if a better solution is implemented.
This commit is contained in:
@@ -135,6 +135,7 @@ struct t_config_option *irc_config_network_alternate_nick;
|
||||
struct t_config_option *irc_config_network_autoreconnect_delay_growing;
|
||||
struct t_config_option *irc_config_network_autoreconnect_delay_max;
|
||||
struct t_config_option *irc_config_network_ban_mask_default;
|
||||
struct t_config_option *irc_config_network_channel_encode;
|
||||
struct t_config_option *irc_config_network_colors_receive;
|
||||
struct t_config_option *irc_config_network_colors_send;
|
||||
struct t_config_option *irc_config_network_lag_check;
|
||||
@@ -2971,6 +2972,15 @@ irc_config_init ()
|
||||
"default mask is used only if WeeChat knows the host for the nick"),
|
||||
NULL, 0, 0, "*!$ident@$host", NULL, 0, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL);
|
||||
irc_config_network_channel_encode = weechat_config_new_option (
|
||||
irc_config_file, ptr_section,
|
||||
"channel_encode", "boolean",
|
||||
N_("decode/encode channel name inside messages using charset options "
|
||||
"(like it was done in WeeChat <= 1.2); it is recommended to keep "
|
||||
"that off if you use only UTF-8 in channel names; you can enable "
|
||||
"this option if you are using an exotic charset like ISO in "
|
||||
"channel names"),
|
||||
NULL, 0, 0, "off", NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
irc_config_network_colors_receive = weechat_config_new_option (
|
||||
irc_config_file, ptr_section,
|
||||
"colors_receive", "boolean",
|
||||
|
||||
@@ -176,6 +176,7 @@ extern struct t_config_option *irc_config_network_alternate_nick;
|
||||
extern struct t_config_option *irc_config_network_autoreconnect_delay_growing;
|
||||
extern struct t_config_option *irc_config_network_autoreconnect_delay_max;
|
||||
extern struct t_config_option *irc_config_network_ban_mask_default;
|
||||
extern struct t_config_option *irc_config_network_channel_encode;
|
||||
extern struct t_config_option *irc_config_network_colors_receive;
|
||||
extern struct t_config_option *irc_config_network_colors_send;
|
||||
extern struct t_config_option *irc_config_network_lag_check;
|
||||
|
||||
@@ -844,11 +844,22 @@ irc_info_init ()
|
||||
N_("parse an IRC message"),
|
||||
N_("\"message\": IRC message, \"server\": server name (optional)"),
|
||||
/* TRANSLATORS: please do not translate key names (enclosed by quotes) */
|
||||
N_("\"tags\": tags, \"message_without_tags\": message without the "
|
||||
"tags, \"nick\": nick, \"host\": host, \"command\": command, "
|
||||
"\"channel\": channel, \"arguments\": arguments (includes channel), "
|
||||
"\"text\": text (for example user message), \"pos_text\": index of "
|
||||
"text in message (\"-1\" if no text found)"),
|
||||
N_("\"tags\": tags, "
|
||||
"\"message_without_tags\": message without the tags, "
|
||||
"\"nick\": nick, "
|
||||
"\"host\": host, "
|
||||
"\"command\": command, "
|
||||
"\"channel\": channel, "
|
||||
"\"arguments\": arguments (includes channel), "
|
||||
"\"text\": text (for example user message), "
|
||||
"\"pos_command\": index of \"command\" message (\"-1\" if "
|
||||
"\"command\" was not found), "
|
||||
"\"pos_arguments\": index of \"arguments\" message (\"-1\" if "
|
||||
"\"arguments\" was not found), "
|
||||
"\"pos_channel\": index of \"channel\" message (\"-1\" if "
|
||||
"\"channel\" was not found), "
|
||||
"\"pos_text\": index of \"text\" message (\"-1\" if "
|
||||
"\"text\" was not found)"),
|
||||
&irc_info_info_hashtable_irc_message_parse_cb, NULL);
|
||||
weechat_hook_info_hashtable (
|
||||
"irc_message_split",
|
||||
|
||||
@@ -39,6 +39,9 @@
|
||||
* - channel (string)
|
||||
* - arguments (string)
|
||||
* - text (string)
|
||||
* - pos_command (integer: command index in message)
|
||||
* - pos_arguments (integer: arguments index in message)
|
||||
* - pos_channel (integer: channel index in message)
|
||||
* - pos_text (integer: text index in message)
|
||||
*
|
||||
* Example:
|
||||
@@ -53,6 +56,9 @@
|
||||
* channel: "#weechat"
|
||||
* arguments: "#weechat :hello!"
|
||||
* text: "hello!"
|
||||
* pos_command: 47
|
||||
* pos_arguments: 55
|
||||
* pos_channel: 55
|
||||
* pos_text: 65
|
||||
*/
|
||||
|
||||
@@ -60,7 +66,9 @@ void
|
||||
irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
char **tags, char **message_without_tags, char **nick,
|
||||
char **host, char **command, char **channel,
|
||||
char **arguments, char **text, int *pos_text)
|
||||
char **arguments, char **text,
|
||||
int *pos_command, int *pos_arguments, int *pos_channel,
|
||||
int *pos_text)
|
||||
{
|
||||
const char *ptr_message, *pos, *pos2, *pos3, *pos4;
|
||||
|
||||
@@ -80,6 +88,12 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
*arguments = NULL;
|
||||
if (text)
|
||||
*text = NULL;
|
||||
if (pos_command)
|
||||
*pos_command = -1;
|
||||
if (pos_arguments)
|
||||
*pos_arguments = -1;
|
||||
if (pos_channel)
|
||||
*pos_channel = -1;
|
||||
if (pos_text)
|
||||
*pos_text = -1;
|
||||
|
||||
@@ -166,6 +180,8 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
{
|
||||
if (command)
|
||||
*command = weechat_strndup (ptr_message, pos - ptr_message);
|
||||
if (pos_command)
|
||||
*pos_command = ptr_message - message;
|
||||
pos++;
|
||||
while (pos[0] == ' ')
|
||||
{
|
||||
@@ -174,6 +190,8 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
/* now we have: pos --> "#weechat :hello!" */
|
||||
if (arguments)
|
||||
*arguments = strdup (pos);
|
||||
if (pos_arguments)
|
||||
*pos_arguments = pos - message;
|
||||
if ((pos[0] == ':')
|
||||
&& ((strncmp (ptr_message, "JOIN ", 5) == 0)
|
||||
|| (strncmp (ptr_message, "PART ", 5) == 0)))
|
||||
@@ -199,6 +217,8 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
else
|
||||
*channel = strdup (pos);
|
||||
}
|
||||
if (pos_channel)
|
||||
*pos_channel = pos - message;
|
||||
if (pos2)
|
||||
{
|
||||
while (pos2[0] == ' ')
|
||||
@@ -241,6 +261,8 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
else
|
||||
*channel = strdup (pos2);
|
||||
}
|
||||
if (pos_channel)
|
||||
*pos_channel = pos2 - message;
|
||||
if (pos4)
|
||||
{
|
||||
while (pos4[0] == ' ')
|
||||
@@ -255,9 +277,13 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
*pos_text = pos4 - message;
|
||||
}
|
||||
}
|
||||
else if (channel && !*channel)
|
||||
else if ((channel && !*channel)
|
||||
|| (pos_channel && (*pos_channel < 0)))
|
||||
{
|
||||
*channel = weechat_strndup (pos, pos3 - pos);
|
||||
if (channel)
|
||||
*channel = weechat_strndup (pos, pos3 - pos);
|
||||
if (pos_channel)
|
||||
*pos_channel = pos - message;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -267,6 +293,8 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
{
|
||||
if (command)
|
||||
*command = strdup (ptr_message);
|
||||
if (pos_command)
|
||||
*pos_command = ptr_message - message;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -281,6 +309,9 @@ irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
* - channel
|
||||
* - arguments
|
||||
* - text
|
||||
* - pos_command
|
||||
* - pos_arguments
|
||||
* - pos_channel
|
||||
* - pos_text
|
||||
*
|
||||
* Note: hashtable must be freed after use.
|
||||
@@ -291,14 +322,14 @@ irc_message_parse_to_hashtable (struct t_irc_server *server,
|
||||
const char *message)
|
||||
{
|
||||
char *tags,*message_without_tags, *nick, *host, *command, *channel;
|
||||
char *arguments, *text, str_pos_text[32];
|
||||
char *arguments, *text, str_pos[32];
|
||||
char empty_str[1] = { '\0' };
|
||||
int pos_text;
|
||||
int pos_command, pos_arguments, pos_channel, pos_text;
|
||||
struct t_hashtable *hashtable;
|
||||
|
||||
irc_message_parse (server, message, &tags, &message_without_tags, &nick,
|
||||
&host, &command, &channel, &arguments, &text,
|
||||
&pos_text);
|
||||
&pos_command, &pos_arguments, &pos_channel, &pos_text);
|
||||
|
||||
hashtable = weechat_hashtable_new (32,
|
||||
WEECHAT_HASHTABLE_STRING,
|
||||
@@ -324,8 +355,14 @@ irc_message_parse_to_hashtable (struct t_irc_server *server,
|
||||
(arguments) ? arguments : empty_str);
|
||||
weechat_hashtable_set (hashtable, "text",
|
||||
(text) ? text : empty_str);
|
||||
snprintf (str_pos_text, sizeof (str_pos_text), "%d", pos_text);
|
||||
weechat_hashtable_set (hashtable, "pos_text", str_pos_text);
|
||||
snprintf (str_pos, sizeof (str_pos), "%d", pos_command);
|
||||
weechat_hashtable_set (hashtable, "pos_command", str_pos);
|
||||
snprintf (str_pos, sizeof (str_pos), "%d", pos_arguments);
|
||||
weechat_hashtable_set (hashtable, "pos_arguments", str_pos);
|
||||
snprintf (str_pos, sizeof (str_pos), "%d", pos_channel);
|
||||
weechat_hashtable_set (hashtable, "pos_channel", str_pos);
|
||||
snprintf (str_pos, sizeof (str_pos), "%d", pos_text);
|
||||
weechat_hashtable_set (hashtable, "pos_text", str_pos);
|
||||
|
||||
if (tags)
|
||||
free (tags);
|
||||
|
||||
@@ -27,7 +27,8 @@ extern void irc_message_parse (struct t_irc_server *server, const char *message,
|
||||
char **tags, char **message_without_tags,
|
||||
char **nick, char **host, char **command,
|
||||
char **channel, char **arguments, char **text,
|
||||
int *pos_text);
|
||||
int *pos_command, int *pos_arguments,
|
||||
int *pos_channel, int *pos_text);
|
||||
extern struct t_hashtable *irc_message_parse_to_hashtable (struct t_irc_server *server,
|
||||
const char *message);
|
||||
extern char *irc_message_convert_charset (const char *message,
|
||||
|
||||
@@ -835,7 +835,8 @@ irc_notify_hsignal_cb (void *data, const char *signal,
|
||||
for (i = 0; i < num_messages; i++)
|
||||
{
|
||||
irc_message_parse (ptr_server, messages[i], NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, &arguments, NULL, NULL);
|
||||
NULL, NULL, NULL, &arguments, NULL, NULL,
|
||||
NULL, NULL, NULL);
|
||||
if (arguments)
|
||||
{
|
||||
pos = strchr (arguments, ' ');
|
||||
@@ -918,7 +919,7 @@ irc_notify_hsignal_cb (void *data, const char *signal,
|
||||
{
|
||||
irc_message_parse (ptr_server, messages[0], NULL, NULL,
|
||||
NULL, NULL, &irc_cmd, NULL, &arguments,
|
||||
NULL, NULL);
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
if (irc_cmd && arguments)
|
||||
{
|
||||
if (strcmp (irc_cmd, "401") == 0)
|
||||
|
||||
@@ -2059,7 +2059,8 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
|
||||
const char *ptr_msg, *ptr_chan_nick;
|
||||
char *new_msg, *pos, *tags_to_send, *msg_encoded;
|
||||
char str_modifier[128], modifier_data[256];
|
||||
int rc, queue_msg, add_to_queue, first_message, anti_flood, pos_text;
|
||||
int rc, queue_msg, add_to_queue, first_message, anti_flood;
|
||||
int pos_channel, pos_text, pos_encode;
|
||||
time_t time_now;
|
||||
struct t_irc_redirect *ptr_redirect;
|
||||
|
||||
@@ -2088,8 +2089,12 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
|
||||
|
||||
msg_encoded = NULL;
|
||||
irc_message_parse (server, ptr_msg, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, &pos_text);
|
||||
if (pos_text >= 0)
|
||||
NULL, NULL, NULL, NULL, &pos_channel, &pos_text);
|
||||
if (weechat_config_boolean (irc_config_network_channel_encode))
|
||||
pos_encode = (pos_channel >= 0) ? pos_channel : pos_text;
|
||||
else
|
||||
pos_encode = pos_text;
|
||||
if (pos_encode >= 0)
|
||||
{
|
||||
ptr_chan_nick = (channel) ? channel : nick;
|
||||
if (ptr_chan_nick)
|
||||
@@ -2107,7 +2112,7 @@ irc_server_send_one_msg (struct t_irc_server *server, int flags,
|
||||
weechat_plugin->name,
|
||||
server->name);
|
||||
}
|
||||
msg_encoded = irc_message_convert_charset (ptr_msg, pos_text,
|
||||
msg_encoded = irc_message_convert_charset (ptr_msg, pos_encode,
|
||||
"charset_encode",
|
||||
modifier_data);
|
||||
}
|
||||
@@ -2283,7 +2288,8 @@ irc_server_sendf (struct t_irc_server *server, int flags, const char *tags,
|
||||
{
|
||||
/* run modifier "irc_out1_xxx" (like "irc_out_xxx", but before split) */
|
||||
irc_message_parse (server, items[i], NULL, NULL,
|
||||
&nick, NULL, &command, &channel, NULL, NULL, NULL);
|
||||
&nick, NULL, &command, &channel, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL);
|
||||
snprintf (str_modifier, sizeof (str_modifier),
|
||||
"irc_out1_%s",
|
||||
(command) ? command : "unknown");
|
||||
@@ -2520,7 +2526,7 @@ irc_server_msgq_flush ()
|
||||
char *tags, *nick, *host, *command, *channel, *arguments;
|
||||
char *msg_decoded, *msg_decoded_without_color;
|
||||
char str_modifier[128], modifier_data[256];
|
||||
int pos_text;
|
||||
int pos_channel, pos_text, pos_decode;
|
||||
|
||||
while (irc_recv_msgq)
|
||||
{
|
||||
@@ -2542,7 +2548,8 @@ irc_server_msgq_flush ()
|
||||
|
||||
irc_message_parse (irc_recv_msgq->server,
|
||||
ptr_data, NULL, NULL, NULL, NULL,
|
||||
&command, NULL, NULL, NULL, NULL);
|
||||
&command, NULL, NULL, NULL, NULL, NULL,
|
||||
NULL, NULL);
|
||||
snprintf (str_modifier, sizeof (str_modifier),
|
||||
"irc_in_%s",
|
||||
(command) ? command : "unknown");
|
||||
@@ -2583,10 +2590,15 @@ irc_server_msgq_flush ()
|
||||
irc_message_parse (irc_recv_msgq->server, ptr_msg,
|
||||
&tags, NULL, &nick, &host,
|
||||
&command, &channel, &arguments,
|
||||
NULL, &pos_text);
|
||||
NULL, NULL, NULL,
|
||||
&pos_channel, &pos_text);
|
||||
|
||||
msg_decoded = NULL;
|
||||
if (pos_text >= 0)
|
||||
if (weechat_config_boolean (irc_config_network_channel_encode))
|
||||
pos_decode = (pos_channel >= 0) ? pos_channel : pos_text;
|
||||
else
|
||||
pos_decode = pos_text;
|
||||
if (pos_decode >= 0)
|
||||
{
|
||||
/* convert charset for message */
|
||||
if (channel
|
||||
@@ -2620,7 +2632,7 @@ irc_server_msgq_flush ()
|
||||
}
|
||||
}
|
||||
msg_decoded = irc_message_convert_charset (
|
||||
ptr_msg, pos_text,
|
||||
ptr_msg, pos_decode,
|
||||
"charset_decode", modifier_data);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user