mirror of
https://github.com/irssi/irssi.git
synced 2025-02-02 15:08:01 -05:00
Added <tag>/<target> support for recode.
git-svn-id: http://svn.irssi.org/repos/irssi/trunk@3692 dbcabf3a-b0e7-0310-adc4-f8d773084564
This commit is contained in:
parent
5f81451df6
commit
7be7dd374c
@ -4,9 +4,11 @@
|
||||
RECODE
|
||||
%|List the conversion database
|
||||
|
||||
RECODE ADD %|[<target>] <charset>
|
||||
RECODE ADD %|[[<tag>/]<target>] <charset>
|
||||
%|Add an entry to the conversion database (if target is omitted,
|
||||
the current channel or query will be used)
|
||||
the current channel or query will be used). You can specify the
|
||||
<tag> to have different charsets for the same <target> for
|
||||
different networks.
|
||||
|
||||
RECODE REMOVE %|[<target>]
|
||||
%|Remove an entry from the conversion database (if target is
|
||||
@ -46,3 +48,5 @@ You can enable it per target by adding //TRANSLIT to the <charset>
|
||||
|
||||
Hint: <charset> can be almost everything listed by 'iconv -l'
|
||||
|
||||
See also: NETWORK
|
||||
|
||||
|
@ -402,7 +402,7 @@ static void cmd_msg(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
|
||||
SEND_TARGET_CHANNEL : SEND_TARGET_NICK;
|
||||
}
|
||||
}
|
||||
recoded = recode_out(msg, target);
|
||||
recoded = recode_out(server, msg, target);
|
||||
if (target != NULL) {
|
||||
signal_emit("server sendmsg", 4, server, target, recoded,
|
||||
GINT_TO_POINTER(target_type));
|
||||
|
@ -65,13 +65,14 @@ static gboolean is_translit(const char *charset)
|
||||
return (pos != NULL);
|
||||
}
|
||||
|
||||
char *recode_in(const char *str, const char *target)
|
||||
char *recode_in(const SERVER_REC *server, const char *str, const char *target)
|
||||
{
|
||||
#ifdef HAVE_GLIB2
|
||||
const char *from = NULL;
|
||||
const char *to = NULL;
|
||||
char *translit_to = NULL;
|
||||
char *recoded = NULL;
|
||||
char *tagtarget = NULL;
|
||||
gboolean term_is_utf8, str_is_utf8, translit;
|
||||
int len;
|
||||
|
||||
@ -83,7 +84,13 @@ char *recode_in(const char *str, const char *target)
|
||||
str_is_utf8 = g_utf8_validate(str, len, NULL);
|
||||
translit = settings_get_bool("recode_transliterate");
|
||||
|
||||
if (target != NULL)
|
||||
if (server != NULL)
|
||||
tagtarget = server->tag == NULL ? NULL :
|
||||
g_strdup_printf("%s/%s", server->tag, target);
|
||||
if (tagtarget != NULL)
|
||||
from = iconfig_get_str("conversions", tagtarget, NULL);
|
||||
g_free(tagtarget);
|
||||
if (target != NULL && from == NULL)
|
||||
from = iconfig_get_str("conversions", target, NULL);
|
||||
|
||||
term_is_utf8 = recode_get_charset(&to);
|
||||
@ -115,7 +122,7 @@ char *recode_in(const char *str, const char *target)
|
||||
#endif
|
||||
}
|
||||
|
||||
char *recode_out(const char *str, const char *target)
|
||||
char *recode_out(const SERVER_REC *server, const char *str, const char *target)
|
||||
{
|
||||
#ifdef HAVE_GLIB2
|
||||
char *recoded = NULL;
|
||||
@ -133,8 +140,16 @@ char *recode_out(const char *str, const char *target)
|
||||
if (target) {
|
||||
const char *to = NULL;
|
||||
char *translit_to = NULL;
|
||||
char *tagtarget = NULL;
|
||||
|
||||
to = iconfig_get_str("conversions", target, NULL);
|
||||
if (server != NULL)
|
||||
tagtarget = server->tag == NULL ? NULL :
|
||||
g_strdup_printf("%s/%s", server->tag, target);
|
||||
if (tagtarget != NULL)
|
||||
to = iconfig_get_str("conversions", tagtarget, NULL);
|
||||
else
|
||||
to = iconfig_get_str("conversions", target, NULL);
|
||||
g_free(tagtarget);
|
||||
if (to == NULL || *to == '\0')
|
||||
/* default outgoing charset if set */
|
||||
to = settings_get_str("recode_out_default_charset");
|
||||
|
@ -1,8 +1,8 @@
|
||||
#ifndef __RECODE_H
|
||||
#define __RECODE_H
|
||||
|
||||
char *recode_in (const char *str, const char *target);
|
||||
char *recode_out (const char *str, const char *target);
|
||||
char *recode_in (const SERVER_REC *server, const char *str, const char *target);
|
||||
char *recode_out (const SERVER_REC *server, const char *str, const char *target);
|
||||
gboolean is_valid_charset(const char *charset);
|
||||
|
||||
void recode_init (void);
|
||||
|
@ -363,7 +363,7 @@ static void sig_message_quit(SERVER_REC *server, const char *nick,
|
||||
window = window_item_window((WI_ITEM_REC *) rec);
|
||||
if (g_slist_find(windows, window) == NULL) {
|
||||
windows = g_slist_append(windows, window);
|
||||
recoded = recode_in(reason, rec->visible_name);
|
||||
recoded = recode_in(server, reason, rec->visible_name);
|
||||
printformat(server, rec->visible_name,
|
||||
MSGLEVEL_QUITS,
|
||||
TXT_QUIT, nick, address, recoded,
|
||||
@ -380,7 +380,7 @@ static void sig_message_quit(SERVER_REC *server, const char *nick,
|
||||
display the quit there too */
|
||||
QUERY_REC *query = query_find(server, nick);
|
||||
if (query != NULL) {
|
||||
recoded = recode_in(reason, nick);
|
||||
recoded = recode_in(server, reason, nick);
|
||||
printformat(server, nick, MSGLEVEL_QUITS,
|
||||
TXT_QUIT, nick, address, recoded, "");
|
||||
g_free(recoded);
|
||||
@ -391,7 +391,7 @@ static void sig_message_quit(SERVER_REC *server, const char *nick,
|
||||
if (chans->len > 0)
|
||||
g_string_truncate(chans, chans->len-1);
|
||||
/* at least recode_fallback will be used */
|
||||
recoded = recode_in(reason, nick);
|
||||
recoded = recode_in(server, reason, nick);
|
||||
printformat(server, print_channel, MSGLEVEL_QUITS,
|
||||
count <= 1 ? TXT_QUIT : TXT_QUIT_ONCE,
|
||||
nick, address, recoded, chans->str);
|
||||
|
@ -192,7 +192,7 @@ static void message_own_public(const SERVER_REC *server, const char *msg,
|
||||
const char *target)
|
||||
{
|
||||
char *recoded;
|
||||
recoded = recode_in(msg, target);
|
||||
recoded = recode_in(server, msg, target);
|
||||
signal_continue(3, server, recoded, target);
|
||||
g_free(recoded);
|
||||
}
|
||||
@ -201,7 +201,7 @@ static void message_own_private(const SERVER_REC *server, const char *msg,
|
||||
const char *target, const char *orig_target)
|
||||
{
|
||||
char *recoded;
|
||||
recoded = recode_in(msg, target);
|
||||
recoded = recode_in(server, msg, target);
|
||||
signal_continue(4, server, recoded, target, orig_target);
|
||||
g_free(recoded);
|
||||
}
|
||||
@ -211,7 +211,7 @@ static void message_irc_own_action(const SERVER_REC *server, const char *msg,
|
||||
const char *target)
|
||||
{
|
||||
char *recoded;
|
||||
recoded = recode_in(msg, target);
|
||||
recoded = recode_in(server, msg, target);
|
||||
signal_continue(5, server, recoded, nick, addr, target);
|
||||
g_free(recoded);
|
||||
}
|
||||
@ -220,7 +220,7 @@ static void message_irc_own_notice(const SERVER_REC *server, const char *msg,
|
||||
const char *channel)
|
||||
{
|
||||
char *recoded;
|
||||
recoded = recode_in(msg, channel);
|
||||
recoded = recode_in(server, msg, channel);
|
||||
signal_continue(3, server, recoded, channel);
|
||||
g_free(recoded);
|
||||
}
|
||||
|
@ -119,7 +119,7 @@ static void event_who(IRC_SERVER_REC *server, const char *data)
|
||||
while (*realname == ' ') realname++;
|
||||
if (realname > hops) realname[-1] = '\0';
|
||||
|
||||
recoded = recode_in(realname, nick);
|
||||
recoded = recode_in(SERVER(server), realname, nick);
|
||||
printformat(server, NULL, MSGLEVEL_CRAP, IRCTXT_WHO,
|
||||
channel, nick, stat, hops, user, host, recoded, serv);
|
||||
|
||||
@ -236,7 +236,7 @@ static void event_topic_get(IRC_SERVER_REC *server, const char *data)
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
params = event_get_params(data, 3, NULL, &channel, &topic);
|
||||
recoded = recode_in(topic, channel);
|
||||
recoded = recode_in(SERVER(server), topic, channel);
|
||||
channel = get_visible_target(server, channel);
|
||||
printformat(server, channel, MSGLEVEL_CRAP,
|
||||
IRCTXT_TOPIC, channel, recoded);
|
||||
@ -316,7 +316,7 @@ static void event_away(IRC_SERVER_REC *server, const char *data)
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
params = event_get_params(data, 3, NULL, &nick, &awaymsg);
|
||||
recoded = recode_in(awaymsg, nick);
|
||||
recoded = recode_in(SERVER(server), awaymsg, nick);
|
||||
if (!settings_get_bool("show_away_once") ||
|
||||
last_away_nick == NULL || g_strcasecmp(last_away_nick, nick) != 0 ||
|
||||
last_away_msg == NULL || g_strcasecmp(last_away_msg, awaymsg) != 0) {
|
||||
|
@ -52,7 +52,7 @@ static void event_privmsg(IRC_SERVER_REC *server, const char *data,
|
||||
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
|
||||
if (nick == NULL) nick = server->real_address;
|
||||
if (addr == NULL) addr = "";
|
||||
recoded = recode_in(msg, target);
|
||||
recoded = recode_in(SERVER(server), msg, target);
|
||||
if (*target == '@' && ischannel(target[1])) {
|
||||
/* Hybrid 6 feature, send msg to all ops in channel */
|
||||
signal_emit("message irc op_public", 5,
|
||||
@ -76,7 +76,7 @@ static void ctcp_action(IRC_SERVER_REC *server, const char *data,
|
||||
char *recoded;
|
||||
|
||||
g_return_if_fail(data != NULL);
|
||||
recoded = recode_in(data, target);
|
||||
recoded = recode_in(SERVER(server), data, target);
|
||||
signal_emit("message irc action", 5,
|
||||
server, recoded, nick, addr,
|
||||
get_visible_target(server, target));
|
||||
@ -91,7 +91,7 @@ static void event_notice(IRC_SERVER_REC *server, const char *data,
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
params = event_get_params(data, 2 | PARAM_FLAG_GETREST, &target, &msg);
|
||||
recoded = recode_in(msg, target);
|
||||
recoded = recode_in(SERVER(server), msg, target);
|
||||
if (nick == NULL) {
|
||||
nick = server->real_address == NULL ?
|
||||
server->connrec->address :
|
||||
@ -129,7 +129,7 @@ static void event_part(IRC_SERVER_REC *server, const char *data,
|
||||
|
||||
params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
|
||||
&channel, &reason);
|
||||
recoded = recode_in(reason, channel);
|
||||
recoded = recode_in(SERVER(server), reason, channel);
|
||||
signal_emit("message part", 5, server,
|
||||
get_visible_target(server, channel), nick, addr, recoded);
|
||||
g_free(params);
|
||||
@ -154,7 +154,7 @@ static void event_kick(IRC_SERVER_REC *server, const char *data,
|
||||
|
||||
params = event_get_params(data, 3 | PARAM_FLAG_GETREST,
|
||||
&channel, &nick, &reason);
|
||||
recoded = recode_in(reason, channel);
|
||||
recoded = recode_in(SERVER(server), reason, channel);
|
||||
signal_emit("message kick", 6,
|
||||
server, get_visible_target(server, channel),
|
||||
nick, kicker, addr, recoded);
|
||||
@ -261,7 +261,7 @@ static void event_topic(IRC_SERVER_REC *server, const char *data,
|
||||
|
||||
params = event_get_params(data, 2 | PARAM_FLAG_GETREST,
|
||||
&channel, &topic);
|
||||
recoded = recode_in(topic, channel);
|
||||
recoded = recode_in(SERVER(server), topic, channel);
|
||||
signal_emit("message topic", 5, server,
|
||||
get_visible_target(server, channel), recoded, nick, addr);
|
||||
g_free(params);
|
||||
|
@ -68,7 +68,7 @@ static void cmd_me(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item)
|
||||
cmd_return_error(CMDERR_NOT_CONNECTED);
|
||||
|
||||
target = window_item_get_target(item);
|
||||
recoded = recode_out(data, target);
|
||||
recoded = recode_out(SERVER(server), data, target);
|
||||
|
||||
signal_emit("message irc own_action", 3, server, recoded,
|
||||
item->visible_name);
|
||||
@ -100,7 +100,7 @@ static void cmd_action(const char *data, IRC_SERVER_REC *server)
|
||||
if (server == NULL || !server->connected)
|
||||
cmd_param_error(CMDERR_NOT_CONNECTED);
|
||||
|
||||
recoded = recode_out(text, target);
|
||||
recoded = recode_out(SERVER(server), text, target);
|
||||
irc_send_cmdv(server, "PRIVMSG %s :\001ACTION %s\001", target, recoded);
|
||||
|
||||
target = skip_target(target);
|
||||
@ -128,7 +128,7 @@ static void cmd_notice(const char *data, IRC_SERVER_REC *server,
|
||||
if (*target == '\0' || *msg == '\0')
|
||||
cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||
|
||||
recoded = recode_out(msg, target);
|
||||
recoded = recode_out(SERVER(server), msg, target);
|
||||
signal_emit("message irc own_notice", 3, server, recoded, target);
|
||||
|
||||
g_free(recoded);
|
||||
|
@ -20,7 +20,7 @@ static void event_whois(IRC_SERVER_REC *server, const char *data)
|
||||
|
||||
params = event_get_params(data, 6, NULL, &nick, &user,
|
||||
&host, NULL, &realname);
|
||||
recoded = recode_in(realname, nick);
|
||||
recoded = recode_in(SERVER(server), realname, nick);
|
||||
printformat(server, nick, MSGLEVEL_CRAP,
|
||||
IRCTXT_WHOIS, nick, user, host, recoded);
|
||||
g_free(params);
|
||||
@ -255,7 +255,7 @@ static void event_whois_channels(IRC_SERVER_REC *server, const char *data)
|
||||
chans = show_lowascii(chans);
|
||||
if (settings_get_bool("whois_hide_safe_channel_id"))
|
||||
hide_safe_channel_id(server, chans);
|
||||
recoded = recode_in(chans, nick);
|
||||
recoded = recode_in(SERVER(server), chans, nick);
|
||||
printformat(server, nick, MSGLEVEL_CRAP,
|
||||
IRCTXT_WHOIS_CHANNELS, nick, recoded);
|
||||
g_free(chans);
|
||||
@ -271,7 +271,7 @@ static void event_whois_away(IRC_SERVER_REC *server, const char *data)
|
||||
g_return_if_fail(data != NULL);
|
||||
|
||||
params = event_get_params(data, 3, NULL, &nick, &awaymsg);
|
||||
recoded = recode_in(awaymsg, nick);
|
||||
recoded = recode_in(SERVER(server), awaymsg, nick);
|
||||
printformat(server, nick, MSGLEVEL_CRAP,
|
||||
IRCTXT_WHOIS_AWAY, nick, recoded);
|
||||
g_free(params);
|
||||
@ -312,7 +312,7 @@ static void event_whowas(IRC_SERVER_REC *server, const char *data)
|
||||
|
||||
params = event_get_params(data, 6, NULL, &nick, &user,
|
||||
&host, NULL, &realname);
|
||||
recoded = recode_in(realname, nick);
|
||||
recoded = recode_in(SERVER(server), realname, nick);
|
||||
printformat(server, nick, MSGLEVEL_CRAP,
|
||||
IRCTXT_WHOWAS, nick, user, host, recoded);
|
||||
g_free(params);
|
||||
|
@ -143,7 +143,7 @@ static void channel_change_topic(IRC_SERVER_REC *server, const char *channel,
|
||||
if (chanrec == NULL) return;
|
||||
/* the topic may be send out encoded, so we need to
|
||||
recode it back or /topic <tab> will not work properly */
|
||||
recoded = recode_in(topic, channel);
|
||||
recoded = recode_in(SERVER(server), topic, channel);
|
||||
if (topic != NULL) {
|
||||
g_free_not_null(chanrec->topic);
|
||||
chanrec->topic = recoded == NULL ? NULL : g_strdup(recoded);
|
||||
|
@ -77,7 +77,7 @@ static void cmd_notice(const char *data, IRC_SERVER_REC *server,
|
||||
if (*target == '\0' || *msg == '\0')
|
||||
cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||
|
||||
recoded = recode_out(msg, target);
|
||||
recoded = recode_out(SERVER(server), msg, target);
|
||||
g_string_sprintf(tmpstr, "NOTICE %s :%s", target, recoded);
|
||||
g_free(recoded);
|
||||
|
||||
@ -110,7 +110,7 @@ static void cmd_ctcp(const char *data, IRC_SERVER_REC *server,
|
||||
else {
|
||||
char *recoded;
|
||||
|
||||
recoded = recode_out(ctcpdata, target);
|
||||
recoded = recode_out(SERVER(server), ctcpdata, target);
|
||||
g_string_sprintf(tmpstr, "PRIVMSG %s :\001%s %s\001", target, ctcpcmd, recoded);
|
||||
g_free(recoded);
|
||||
}
|
||||
@ -139,7 +139,7 @@ static void cmd_nctcp(const char *data, IRC_SERVER_REC *server,
|
||||
cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||
|
||||
g_strup(ctcpcmd);
|
||||
recoded = recode_out(ctcpdata, target);
|
||||
recoded = recode_out(SERVER(server), ctcpdata, target);
|
||||
g_string_sprintf(tmpstr, "NOTICE %s :\001%s %s\001", target, ctcpcmd, recoded);
|
||||
g_free(recoded);
|
||||
|
||||
@ -169,7 +169,7 @@ static void cmd_part(const char *data, IRC_SERVER_REC *server,
|
||||
irc_server_purge_output(server, channame);
|
||||
|
||||
if (*msg != '\0')
|
||||
recoded = recode_out(msg, channame);
|
||||
recoded = recode_out(SERVER(server), msg, channame);
|
||||
irc_send_cmdv(server, ! recoded ? "PART %s" : "PART %s :%s",
|
||||
channame, recoded);
|
||||
|
||||
@ -193,7 +193,7 @@ static void cmd_kick(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item
|
||||
if (*channame == '\0' || *nicks == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||
if (!ischannel(*channame)) cmd_param_error(CMDERR_NOT_JOINED);
|
||||
|
||||
recoded = recode_out(reason, channame);
|
||||
recoded = recode_out(SERVER(server), reason, channame);
|
||||
g_string_sprintf(tmpstr, "KICK %s %s :%s", channame, nicks, recoded);
|
||||
g_free(recoded);
|
||||
|
||||
@ -218,7 +218,7 @@ static void cmd_topic(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *ite
|
||||
return;
|
||||
|
||||
if (*topic != '\0' || g_hash_table_lookup(optlist, "delete") != NULL)
|
||||
recoded = recode_out(topic, channame);
|
||||
recoded = recode_out(SERVER(server), topic, channame);
|
||||
irc_send_cmdv(server, recoded == NULL ? "TOPIC %s" : "TOPIC %s :%s",
|
||||
channame, recoded);
|
||||
g_free(recoded);
|
||||
@ -675,7 +675,7 @@ static void cmd_wall(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC *item
|
||||
SERVER(server), item, args, NULL, 0);
|
||||
g_free(args);
|
||||
|
||||
recoded = recode_out(msg, channame);
|
||||
recoded = recode_out(SERVER(server), msg, channame);
|
||||
|
||||
for (tmp = nicks; tmp != NULL; tmp = tmp->next) {
|
||||
NICK_REC *rec = tmp->data;
|
||||
@ -709,7 +709,7 @@ static void cmd_wallchops(const char *data, IRC_SERVER_REC *server, WI_ITEM_REC
|
||||
return;
|
||||
if (*msg == '\0') cmd_param_error(CMDERR_NOT_ENOUGH_PARAMS);
|
||||
|
||||
recoded = recode_out(msg, channame);
|
||||
recoded = recode_out(SERVER(server), msg, channame);
|
||||
irc_send_cmdv(server, "WALLCHOPS %s :%s", channame, recoded);
|
||||
|
||||
g_free(recoded);
|
||||
@ -744,7 +744,7 @@ static void cmd_kickban(const char *data, IRC_SERVER_REC *server,
|
||||
spacenicks = g_strjoinv(" ", nicklist);
|
||||
g_strfreev(nicklist);
|
||||
|
||||
recoded = recode_out(reason, channel);
|
||||
recoded = recode_out(SERVER(server), reason, channel);
|
||||
kickcmd = g_strdup_printf("%s %s %s", chanrec->name, nicks, recoded);
|
||||
g_free(recoded);
|
||||
|
||||
@ -842,7 +842,7 @@ static void cmd_knockout(const char *data, IRC_SERVER_REC *server,
|
||||
banmasks = ban_get_masks(channel, spacenicks, 0);
|
||||
g_free(spacenicks);
|
||||
|
||||
recoded = recode_out(reason, channel->name);
|
||||
recoded = recode_out(SERVER(server), reason, channel->name);
|
||||
kickcmd = g_strdup_printf("%s %s %s", channel->name, nicks, recoded);
|
||||
g_free(recoded);
|
||||
|
||||
|
@ -199,7 +199,7 @@ static void dump_join(IRC_CHANNEL_REC *channel, CLIENT_REC *client)
|
||||
client->proxy_address, client->nick, channel->name);
|
||||
if (channel->topic != NULL) {
|
||||
/* this is needed because the topic may be encoded into other charsets internaly */
|
||||
recoded = recode_out(channel->topic, channel->name);
|
||||
recoded = recode_out(SERVER(client->server), channel->topic, channel->name);
|
||||
proxy_outdata(client, ":%s 332 %s %s :%s\n",
|
||||
client->proxy_address, client->nick,
|
||||
channel->name, recoded);
|
||||
|
Loading…
Reference in New Issue
Block a user