summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSébastien Helleu <flashcode@flashtux.org>2020-06-20 17:28:28 +0200
committerSébastien Helleu <flashcode@flashtux.org>2020-06-20 17:28:28 +0200
commit12051a506ddbb0fe37ec9ebcc4b5df1eaeaa23bf (patch)
treeb27d60e68961a756ddd5f7cf3648d5478b972a20
parentbf964de9399733f99e2183abd04a1612d99429cb (diff)
downloadweechat-12051a506ddbb0fe37ec9ebcc4b5df1eaeaa23bf.zip
irc: add support of UTF8MAPPING, add support of optional server in info "irc_is_nick" (closes #1528)
-rw-r--r--ChangeLog.adoc2
-rw-r--r--doc/de/includes/autogen_api_hdata.de.adoc1
-rw-r--r--doc/de/includes/autogen_api_infos.de.adoc2
-rw-r--r--doc/en/includes/autogen_api_hdata.en.adoc1
-rw-r--r--doc/en/includes/autogen_api_infos.en.adoc2
-rw-r--r--doc/fr/includes/autogen_api_hdata.fr.adoc1
-rw-r--r--doc/fr/includes/autogen_api_infos.fr.adoc2
-rw-r--r--doc/it/includes/autogen_api_hdata.it.adoc1
-rw-r--r--doc/it/includes/autogen_api_infos.it.adoc2
-rw-r--r--doc/ja/includes/autogen_api_hdata.ja.adoc1
-rw-r--r--doc/ja/includes/autogen_api_infos.ja.adoc2
-rw-r--r--doc/pl/includes/autogen_api_hdata.pl.adoc1
-rw-r--r--doc/pl/includes/autogen_api_infos.pl.adoc2
-rw-r--r--po/cs.po18
-rw-r--r--po/de.po18
-rw-r--r--po/es.po18
-rw-r--r--po/fr.po19
-rw-r--r--po/hu.po18
-rw-r--r--po/it.po18
-rw-r--r--po/ja.po18
-rw-r--r--po/pl.po18
-rw-r--r--po/pt.po18
-rw-r--r--po/pt_BR.po18
-rw-r--r--po/ru.po18
-rw-r--r--po/tr.po15
-rw-r--r--po/weechat.pot15
-rw-r--r--src/plugins/irc/irc-info.c22
-rw-r--r--src/plugins/irc/irc-nick.c54
-rw-r--r--src/plugins/irc/irc-nick.h3
-rw-r--r--src/plugins/irc/irc-protocol.c17
-rw-r--r--src/plugins/irc/irc-server.c42
-rw-r--r--src/plugins/irc/irc-server.h11
-rw-r--r--src/plugins/irc/irc-upgrade.c23
-rw-r--r--tests/unit/plugins/irc/test-irc-nick.cpp98
34 files changed, 388 insertions, 131 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc
index 43cd7b4c4..77da97675 100644
--- a/ChangeLog.adoc
+++ b/ChangeLog.adoc
@@ -39,6 +39,7 @@ New features::
* buflist: add default key kbd:[Alt+Shift+B] to toggle buflist
* buflist: add options enable/disable/toggle in command /buflist
* buflist: evaluate option buflist.look.sort so that sort can be customized for each of the three buflist bar items (issue #1465)
+ * irc: add support of UTF8MAPPING (issue #1528)
* irc: display account messages in buffers (issue #1250)
* relay: increase default limits for IRC backlog options
* relay: add command "handshake" in weechat relay protocol and nonce to prevent replay attacks, add options relay.network.password_hash_algo, relay.network.password_hash_iterations, relay.network.nonce_size (issue #1474)
@@ -64,6 +65,7 @@ Bug fixes::
* exec: fix use of same task id for different tasks (issue #1491)
* fifo: fix errors when writing in the FIFO pipe (issue #713)
* guile: enable again /guile eval (issue #1514)
+ * irc: add support of optional server in info "irc_is_nick", fix check of nick using UTF8MAPPING isupport value (issue #1528)
* irc: fix add of ignore with flags in regex, display full ignore mask in list of ignores (issue #1518)
* irc: do not remove spaces at the end of users messages received (issue #1513)
* irc: fix realname delimiter color in WHO/WHOX response (issue #1497)
diff --git a/doc/de/includes/autogen_api_hdata.de.adoc b/doc/de/includes/autogen_api_hdata.de.adoc
index 2b41faf3b..2b725d8b3 100644
--- a/doc/de/includes/autogen_api_hdata.de.adoc
+++ b/doc/de/includes/autogen_api_hdata.de.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/de/includes/autogen_api_infos.de.adoc b/doc/de/includes/autogen_api_infos.de.adoc
index 76eec6f67..75f99e536 100644
--- a/doc/de/includes/autogen_api_infos.de.adoc
+++ b/doc/de/includes/autogen_api_infos.de.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 1, falls die Zeichenkette ein gültiger IRC-Channelname für den Server ist | Server,Channel (Server ist optional)
-| irc | irc_is_nick | 1, falls die Zeichenkette ein gültiger IRC Nickname ist | Nickname
+| irc | irc_is_nick | 1, falls die Zeichenkette ein gültiger IRC Nickname ist | server,nickname (server is optional)
| irc | irc_nick | aktuellen Nicknamen für den Server erhalten | Servername
diff --git a/doc/en/includes/autogen_api_hdata.en.adoc b/doc/en/includes/autogen_api_hdata.en.adoc
index d25f819fd..dfac74fda 100644
--- a/doc/en/includes/autogen_api_hdata.en.adoc
+++ b/doc/en/includes/autogen_api_hdata.en.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/en/includes/autogen_api_infos.en.adoc b/doc/en/includes/autogen_api_infos.en.adoc
index 2f8653c46..e8a926693 100644
--- a/doc/en/includes/autogen_api_infos.en.adoc
+++ b/doc/en/includes/autogen_api_infos.en.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 1 if string is a valid IRC channel name for server | server,channel (server is optional)
-| irc | irc_is_nick | 1 if string is a valid IRC nick name | nickname
+| irc | irc_is_nick | 1 if string is a valid IRC nick name | server,nickname (server is optional)
| irc | irc_nick | get current nick on a server | server name
diff --git a/doc/fr/includes/autogen_api_hdata.fr.adoc b/doc/fr/includes/autogen_api_hdata.fr.adoc
index dcb18086a..2d9ea401d 100644
--- a/doc/fr/includes/autogen_api_hdata.fr.adoc
+++ b/doc/fr/includes/autogen_api_hdata.fr.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/fr/includes/autogen_api_infos.fr.adoc b/doc/fr/includes/autogen_api_infos.fr.adoc
index e70f3997f..3d1077b6a 100644
--- a/doc/fr/includes/autogen_api_infos.fr.adoc
+++ b/doc/fr/includes/autogen_api_infos.fr.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 1 si la chaîne est un nom de canal IRC valide pour le serveur | serveur,canal (le serveur est optionnel)
-| irc | irc_is_nick | 1 si la chaîne est un pseudo IRC valide | pseudo
+| irc | irc_is_nick | 1 si la chaîne est un pseudo IRC valide | serveur,pseudo (le serveur est optionnel)
| irc | irc_nick | retourne le pseudo utilisé actuellement sur un serveur | nom de serveur
diff --git a/doc/it/includes/autogen_api_hdata.it.adoc b/doc/it/includes/autogen_api_hdata.it.adoc
index 8938c0fc6..c14e135d9 100644
--- a/doc/it/includes/autogen_api_hdata.it.adoc
+++ b/doc/it/includes/autogen_api_hdata.it.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/it/includes/autogen_api_infos.it.adoc b/doc/it/includes/autogen_api_infos.it.adoc
index 59b1c1b6b..1878e2276 100644
--- a/doc/it/includes/autogen_api_infos.it.adoc
+++ b/doc/it/includes/autogen_api_infos.it.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 1 se la stringa è il nome di un canale IRC valido per il server | server,canale (server è opzionale)
-| irc | irc_is_nick | 1 se la stringa è un nick IRC valido | nick
+| irc | irc_is_nick | 1 se la stringa è un nick IRC valido | server,nickname (server is optional)
| irc | irc_nick | ottiene nick corrente su un server | nome server
diff --git a/doc/ja/includes/autogen_api_hdata.ja.adoc b/doc/ja/includes/autogen_api_hdata.ja.adoc
index 8423f86e1..348f49fa6 100644
--- a/doc/ja/includes/autogen_api_hdata.ja.adoc
+++ b/doc/ja/includes/autogen_api_hdata.ja.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/ja/includes/autogen_api_infos.ja.adoc b/doc/ja/includes/autogen_api_infos.ja.adoc
index 97e22b801..4cc6389dd 100644
--- a/doc/ja/includes/autogen_api_infos.ja.adoc
+++ b/doc/ja/includes/autogen_api_infos.ja.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 文字列がサーバの有効な IRC チャンネル名なら 1 | サーバ、チャンネル (サーバは任意)
-| irc | irc_is_nick | 文字列が有効な IRC ニックネームなら 1 | ニックネーム
+| irc | irc_is_nick | 文字列が有効な IRC ニックネームなら 1 | server,nickname (server is optional)
| irc | irc_nick | あるサーバの現在のニックネームを取得 | サーバ名
diff --git a/doc/pl/includes/autogen_api_hdata.pl.adoc b/doc/pl/includes/autogen_api_hdata.pl.adoc
index 616578373..93446dff9 100644
--- a/doc/pl/includes/autogen_api_hdata.pl.adoc
+++ b/doc/pl/includes/autogen_api_hdata.pl.adoc
@@ -258,6 +258,7 @@ _nick_max_length_   (integer) +
_user_max_length_   (integer) +
_host_max_length_   (integer) +
_casemapping_   (integer) +
+_utf8mapping_   (integer) +
_chantypes_   (string) +
_chanmodes_   (string) +
_monitor_   (integer) +
diff --git a/doc/pl/includes/autogen_api_infos.pl.adoc b/doc/pl/includes/autogen_api_infos.pl.adoc
index bc7a958eb..74de8a42d 100644
--- a/doc/pl/includes/autogen_api_infos.pl.adoc
+++ b/doc/pl/includes/autogen_api_infos.pl.adoc
@@ -20,7 +20,7 @@
| irc | irc_is_channel | 1 jeśli ciąg jest poprawną nazwą kanału IRC dla serwera | serwer,kanał (serWer jest opcjonalny)
-| irc | irc_is_nick | 1 jeśli ciąg jest poprawną nazwą użytkownika IRC | nazwa użytkownika
+| irc | irc_is_nick | 1 jeśli ciąg jest poprawną nazwą użytkownika IRC | server,nickname (server is optional)
| irc | irc_nick | pobiera aktualny nick z serwera | nazwa serwera
diff --git a/po/cs.po b/po/cs.po
index 01307832f..f1d50b4ca 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Ondřej Súkup <mimi.vx@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -6133,10 +6133,6 @@ msgstr "%s: skript \"%s\" odebrán"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: skript \"%s\" nenačten"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sBarva \"%s\" není definovávána v paletě"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "server"
@@ -8836,8 +8832,9 @@ msgstr "server,kanál (kanál je volitelný)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 pokud je řetězec validní jméno IRC přezdívky"
-msgid "nickname"
-msgstr "přezdívka"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "server,kanál (kanál je volitelný)"
msgid "get current nick on a server"
msgstr "získat aktuální přezdívku na serveru"
@@ -8856,6 +8853,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr "přezdívka"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -9808,6 +9808,10 @@ msgstr "%s%s: nemůžu načíst soubor \"%s\""
msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: nemůžu spustit soubor \"%s\""
+#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sBarva \"%s\" není definovávána v paletě"
+
#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== konec backlogu (%d řádků) =========="
diff --git a/po/de.po b/po/de.po
index 3a8bb78c9..6c8871444 100644
--- a/po/de.po
+++ b/po/de.po
@@ -24,7 +24,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-06-16 18:32+0200\n"
"Last-Translator: Nils Görs <weechatter@arcor.de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
@@ -7614,10 +7614,6 @@ msgstr "%s: Skript \"%s\" wurde beendet"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: Das Skript \"%s\" wurde nicht installiert"
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sBefehl \"/%s eval\" ist zur Zeit noch nicht implementiert"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "Server"
@@ -10674,8 +10670,9 @@ msgstr "Server,Channel (Server ist optional)"
msgid "1 if string is a valid IRC nick name"
msgstr "1, falls die Zeichenkette ein gültiger IRC Nickname ist"
-msgid "nickname"
-msgstr "Nickname"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "Server,Channel (Server ist optional)"
msgid "get current nick on a server"
msgstr "aktuellen Nicknamen für den Server erhalten"
@@ -10696,6 +10693,9 @@ msgstr ""
"erhalte nick color code (*veraltet* ab Version 1.5, wird ersetzt durch "
"\"nick_color\")"
+msgid "nickname"
+msgstr "Nickname"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -11682,6 +11682,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: Die Datei \"%s\" kann nicht ausgeführt werden"
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sBefehl \"/%s eval\" ist zur Zeit noch nicht implementiert"
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== Ende des Verlaufspeichers (%d Zeilen) =========="
diff --git a/po/es.po b/po/es.po
index 09720f8fa..a044ea2ad 100644
--- a/po/es.po
+++ b/po/es.po
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Elián Hanisch <lambdae2@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -6347,10 +6347,6 @@ msgstr "%s: script \"%s\" descargado"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: el script \"%s\" no está cargado"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sColor \"%s\" no está definido en la paleta"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "servidor"
@@ -9134,8 +9130,9 @@ msgstr "servidor,canal (servidor es opcional)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 si la cadena es un apodo IRC válido"
-msgid "nickname"
-msgstr "apodo"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "servidor,canal (servidor es opcional)"
msgid "get current nick on a server"
msgstr "devuelve el apodo actual en el servidor"
@@ -9154,6 +9151,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr "apodo"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -10118,6 +10118,10 @@ msgstr "%s%s: no es posible cargar el archivo \"%s\""
msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: no es posible ejecutar el archivo \"%s\""
+#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sColor \"%s\" no está definido en la paleta"
+
#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== Fin del último registro (%d líneas) =========="
diff --git a/po/fr.po b/po/fr.po
index c932d70e0..c54f3f2f8 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
-"PO-Revision-Date: 2020-06-03 07:55+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
+"PO-Revision-Date: 2020-06-20 17:05+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
"Language: fr\n"
@@ -7454,10 +7454,6 @@ msgstr "%s : script \"%s\" déchargé"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s : script \"%s\" non chargé"
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sLa commande \"/%s eval\" n'est pas implémentée"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "serveur"
@@ -10425,8 +10421,8 @@ msgstr "serveur,canal (le serveur est optionnel)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 si la chaîne est un pseudo IRC valide"
-msgid "nickname"
-msgstr "pseudo"
+msgid "server,nickname (server is optional)"
+msgstr "serveur,pseudo (le serveur est optionnel)"
msgid "get current nick on a server"
msgstr "retourne le pseudo utilisé actuellement sur un serveur"
@@ -10447,6 +10443,9 @@ msgstr ""
"retourne le code couleur du pseudo (*obsolète* depuis la version 1.5, "
"remplacé par \"nick_color\")"
+msgid "nickname"
+msgstr "pseudo"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -11412,6 +11411,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s : impossible d'exécuter le fichier \"%s\""
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sLa commande \"/%s eval\" n'est pas implémentée"
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== Fin de l'historique (%d lignes) =========="
diff --git a/po/hu.po b/po/hu.po
index ed3fc32e6..06c81797f 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Andras Voroskoi <voroskoi@frugalware.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5665,10 +5665,6 @@ msgstr "A \"%s\" modul eltávolítva.\n"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s a \"%s\" szerver nem található\n"
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr ""
-
#, fuzzy
msgid "server"
msgid_plural "servers"
@@ -8224,8 +8220,8 @@ msgid "1 if string is a valid IRC nick name"
msgstr "felhasználók listája a szobában"
#, fuzzy
-msgid "nickname"
-msgstr "[-all] név"
+msgid "server,nickname (server is optional)"
+msgstr "szoba: szoba neve"
#, fuzzy
msgid "get current nick on a server"
@@ -8247,6 +8243,10 @@ msgid ""
"\")"
msgstr ""
+#, fuzzy
+msgid "nickname"
+msgstr "[-all] név"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -9190,6 +9190,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "Nem sikerült a(z) \"%s\" naplófájlt írni\n"
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr ""
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr ""
diff --git a/po/it.po b/po/it.po
index a47be465c..f2ae6c7ab 100644
--- a/po/it.po
+++ b/po/it.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Esteban I. Ruiz Moreno <exio4.com@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -6515,10 +6515,6 @@ msgstr "%s: script \"%s\" scaricato"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: script \"%s\" non caricato"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sColore \"%s\" non definito nella tavolozza"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "server"
@@ -9329,8 +9325,9 @@ msgstr "server,canale (server è opzionale)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 se la stringa è un nick IRC valido"
-msgid "nickname"
-msgstr "nick"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "server,canale (server è opzionale)"
msgid "get current nick on a server"
msgstr "ottiene nick corrente su un server"
@@ -9349,6 +9346,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr "nick"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -10303,6 +10303,10 @@ msgstr "%s%s: impossibile caricare il file \"%s\""
msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: impossibile eseguire il file \"%s\""
+#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sColore \"%s\" non definito nella tavolozza"
+
#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== Fine della cronologia (%d righe) =========="
diff --git a/po/ja.po b/po/ja.po
index 581f58920..ff2355e08 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: AYANOKOUZI, Ryuunosuke <i38w7i3@yahoo.co.jp>\n"
"Language-Team: Japanese <https://github.com/l/weechat/tree/master/"
@@ -7107,10 +7107,6 @@ msgstr "%s: スクリプト \"%s\" がアンロードされました"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: スクリプト \"%s\" はロードされていません"
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sコマンド \"/%s eval\" はまだ実装されていません"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "サーバ"
@@ -9958,8 +9954,9 @@ msgstr "サーバ、チャンネル (サーバは任意)"
msgid "1 if string is a valid IRC nick name"
msgstr "文字列が有効な IRC ニックネームなら 1"
-msgid "nickname"
-msgstr "ニックネーム"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "サーバ、チャンネル (サーバは任意)"
msgid "get current nick on a server"
msgstr "あるサーバの現在のニックネームを取得"
@@ -9980,6 +9977,9 @@ msgstr ""
"ニックネームの色コードを取得 (バージョン 1.5 で *廃止* されました。代わりに "
"\"nick_color\" を使ってください)"
+msgid "nickname"
+msgstr "ニックネーム"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -10944,6 +10944,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: ファイル \"%s\" を実行できません"
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sコマンド \"/%s eval\" はまだ実装されていません"
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== バックログの最後 (%d 行) =========="
diff --git a/po/pl.po b/po/pl.po
index f214192d8..74134d389 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -22,7 +22,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Krzysztof Korościk <soltys@soltys.info>\n"
"Language-Team: Polish <kde-i18n-doc@kde.org>\n"
@@ -7248,10 +7248,6 @@ msgstr "%s: skrypt \"%s\" wyładowano"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: skrypt \"%s\" nie załadowany"
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sKomenda \"/%s eval\" nie jest jeszcze zaimplementowana"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "serwer"
@@ -10169,8 +10165,9 @@ msgstr "serwer,kanał (serWer jest opcjonalny)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 jeśli ciąg jest poprawną nazwą użytkownika IRC"
-msgid "nickname"
-msgstr "nazwa użytkownika"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "serwer,kanał (serWer jest opcjonalny)"
msgid "get current nick on a server"
msgstr "pobiera aktualny nick z serwera"
@@ -10191,6 +10188,9 @@ msgstr ""
"pobierz kod koloru nicka (*przestarzałe* od wersji 1.5, zamienione przez "
"\"nick_color\")"
+msgid "nickname"
+msgstr "nazwa użytkownika"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -11145,6 +11145,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: nie można wykonać pliku \"%s\""
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sKomenda \"/%s eval\" nie jest jeszcze zaimplementowana"
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s========== Koniec backloga (%d linii) =========="
diff --git a/po/pt.po b/po/pt.po
index 35ad9741d..b94c8aadf 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Vasco Almeida <vascomalmeida@sapo.pt>\n"
"Language-Team: Portuguese <>\n"
@@ -6887,10 +6887,6 @@ msgstr "%s: script \"%s\" descarregado"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: script \"%s\" não carregado"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sA cor \"%s\" não está definida na paleta"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "servidor"
@@ -9779,8 +9775,9 @@ msgstr "servidor,canal (o servidor é opcional)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 se a cadeia for um nick de IRC válido"
-msgid "nickname"
-msgstr "nickname"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "servidor,canal (o servidor é opcional)"
msgid "get current nick on a server"
msgstr "obter nick atual num servidor"
@@ -9801,6 +9798,9 @@ msgstr ""
"obter código de cor do nick (*obsoleto* desde a versão 1.5, substituído por "
"\"nick_color\")"
+msgid "nickname"
+msgstr "nickname"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -10771,6 +10771,10 @@ msgstr "%s%s: não foi possível carregar o ficheiro \"%s\""
msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: não foi possível executar o ficheiro \"%s\""
+#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sA cor \"%s\" não está definida na paleta"
+
#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "%s===\t%s====== Fim do registo recente (%d linhas) ====="
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 481f5b6e9..10a2d4a55 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-18 11:34+0200\n"
"Last-Translator: Eduardo Elias <camponez@gmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -6312,10 +6312,6 @@ msgstr "%s: script \"%s\" descarregado"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s%s: script \"%s\" não carregado"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sCor \"%s\" não está definida na palheta"
-
msgid "server"
msgid_plural "servers"
msgstr[0] "servidor"
@@ -8658,8 +8654,9 @@ msgstr "servidor,canal (servidor é opcional)"
msgid "1 if string is a valid IRC nick name"
msgstr "1 se string é um apelido IRC válido"
-msgid "nickname"
-msgstr "apelido"
+#, fuzzy
+msgid "server,nickname (server is optional)"
+msgstr "servidor,canal (servidor é opcional)"
msgid "get current nick on a server"
msgstr "obter apelido atual em um servidor"
@@ -8678,6 +8675,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr "apelido"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -9633,6 +9633,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr "%s%s: não foi possível executar arquivo \"%s\""
#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sCor \"%s\" não está definida na palheta"
+
+#, fuzzy, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr "===\t========== Fim do backlog (%d linhas) =========="
diff --git a/po/ru.po b/po/ru.po
index cf0e41d90..efd6d1989 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2020-04-28 16:40+0200\n"
"Last-Translator: Aleksey V Zapparov AKA ixti <ixti@member.fsf.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5702,10 +5702,6 @@ msgstr "Plugin \"%s\" выгружен.\n"
msgid "%s%s: script \"%s\" not loaded"
msgstr "%s сервер \"%s\" не найден\n"
-#, fuzzy, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr "%sЦвет \"%s\" не определён в палитре"
-
#, fuzzy
msgid "server"
msgid_plural "servers"
@@ -8260,8 +8256,8 @@ msgid "1 if string is a valid IRC nick name"
msgstr "список ников на канале"
#, fuzzy
-msgid "nickname"
-msgstr "[-all] ник"
+msgid "server,nickname (server is optional)"
+msgstr "канал: название канала"
#, fuzzy
msgid "get current nick on a server"
@@ -8283,6 +8279,10 @@ msgid ""
"\")"
msgstr ""
+#, fuzzy
+msgid "nickname"
+msgstr "[-all] ник"
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -9226,6 +9226,10 @@ msgstr "Не могу записать лог-файл \"%s\"\n"
msgid "%s%s: unable to execute file \"%s\""
msgstr "Не могу записать лог-файл \"%s\"\n"
+#, fuzzy, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr "%sЦвет \"%s\" не определён в палитре"
+
#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 9441c35c0..6dccd8e84 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -20,7 +20,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2019-11-03 08:38+0100\n"
"Last-Translator: Hasan Kiran <sunder67@hotmail.com>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5232,10 +5232,6 @@ msgstr ""
msgid "%s%s: script \"%s\" not loaded"
msgstr ""
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr ""
-
msgid "server"
msgid_plural "servers"
msgstr[0] "sunucu(lar)"
@@ -7470,7 +7466,7 @@ msgstr ""
msgid "1 if string is a valid IRC nick name"
msgstr ""
-msgid "nickname"
+msgid "server,nickname (server is optional)"
msgstr ""
msgid "get current nick on a server"
@@ -7490,6 +7486,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr ""
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -8395,6 +8394,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr ""
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr ""
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr ""
diff --git a/po/weechat.pot b/po/weechat.pot
index 3577774c1..bdd3cbba6 100644
--- a/po/weechat.pot
+++ b/po/weechat.pot
@@ -21,7 +21,7 @@ msgid ""
msgstr ""
"Project-Id-Version: WeeChat\n"
"Report-Msgid-Bugs-To: flashcode@flashtux.org\n"
-"POT-Creation-Date: 2020-06-03 07:54+0200\n"
+"POT-Creation-Date: 2020-06-20 17:04+0200\n"
"PO-Revision-Date: 2014-08-16 10:27+0200\n"
"Last-Translator: Sébastien Helleu <flashcode@flashtux.org>\n"
"Language-Team: weechat-dev <weechat-dev@nongnu.org>\n"
@@ -5172,10 +5172,6 @@ msgstr ""
msgid "%s%s: script \"%s\" not loaded"
msgstr ""
-#, c-format
-msgid "%sCommand \"/%s eval\" is not yet implemented"
-msgstr ""
-
msgid "server"
msgid_plural "servers"
msgstr[0] ""
@@ -7330,7 +7326,7 @@ msgstr ""
msgid "1 if string is a valid IRC nick name"
msgstr ""
-msgid "nickname"
+msgid "server,nickname (server is optional)"
msgstr ""
msgid "get current nick on a server"
@@ -7350,6 +7346,9 @@ msgid ""
"\")"
msgstr ""
+msgid "nickname"
+msgstr ""
+
msgid ""
"get nick color name (*deprecated* since version 1.5, replaced by "
"\"nick_color_name\")"
@@ -8257,6 +8256,10 @@ msgid "%s%s: unable to execute file \"%s\""
msgstr ""
#, c-format
+msgid "%sCommand \"/%s eval\" is not yet implemented"
+msgstr ""
+
+#, c-format
msgid "%s===\t%s========== End of backlog (%d lines) =========="
msgstr ""
diff --git a/src/plugins/irc/irc-info.c b/src/plugins/irc/irc-info.c
index a933ac366..12519a1d6 100644
--- a/src/plugins/irc/irc-info.c
+++ b/src/plugins/irc/irc-info.c
@@ -108,6 +108,10 @@ irc_info_info_irc_is_nick_cb (const void *pointer, void *data,
const char *info_name,
const char *arguments)
{
+ char *pos_comma, *server;
+ const char *pos_nick;
+ struct t_irc_server *ptr_server;
+
/* make C compiler happy */
(void) pointer;
(void) data;
@@ -116,7 +120,21 @@ irc_info_info_irc_is_nick_cb (const void *pointer, void *data,
if (!arguments || !arguments[0])
return NULL;
- return (irc_nick_is_nick (arguments)) ? strdup ("1") : NULL;
+ ptr_server = NULL;
+ pos_nick = arguments;
+ pos_comma = strchr (arguments, ',');
+ if (pos_comma)
+ {
+ pos_nick = pos_comma + 1;
+ server = weechat_strndup (arguments, pos_comma - arguments);
+ if (server)
+ {
+ ptr_server = irc_server_search (server);
+ free (server);
+ }
+ }
+
+ return (irc_nick_is_nick (ptr_server, pos_nick)) ? strdup ("1") : NULL;
}
/*
@@ -1072,7 +1090,7 @@ irc_info_init ()
weechat_hook_info (
"irc_is_nick",
N_("1 if string is a valid IRC nick name"),
- N_("nickname"),
+ N_("server,nickname (server is optional)"),
&irc_info_info_irc_is_nick_cb, NULL, NULL);
weechat_hook_info (
"irc_nick",
diff --git a/src/plugins/irc/irc-nick.c b/src/plugins/irc/irc-nick.c
index 06b9d79b7..277bd0cf7 100644
--- a/src/plugins/irc/irc-nick.c
+++ b/src/plugins/irc/irc-nick.c
@@ -62,31 +62,63 @@ irc_nick_valid (struct t_irc_channel *channel, struct t_irc_nick *nick)
}
/*
- * Checks if string is a valid nick string (RFC 1459).
+ * Checks if string is a valid nick string, using server UTF8MAPPING.
*
* Returns:
- * 1: string is a valid nick
- * 0: string is not a valid nick
+ * 1: string is a valid nick on this server
+ * 0: string is not a valid nick on this server
*/
int
-irc_nick_is_nick (const char *string)
+irc_nick_is_nick (struct t_irc_server *server, const char *string)
{
- const char *ptr;
+ const char *ptr_string;
+ int utf8mapping;
if (!string || !string[0])
return 0;
- /* first char must not be a number or hyphen */
- ptr = string;
- if (strchr ("0123456789-", *ptr))
+ utf8mapping = (server) ? server->utf8mapping : IRC_SERVER_UTF8MAPPING_NONE;
+
+ /* check length of nick in bytes (if we have a limit in the server) */
+ if (server && (server->nick_max_length > 0)
+ && (int)strlen (string) > server->nick_max_length)
+ {
+ /* nick is too long */
+ return 0;
+ }
+
+ /* check if nick is UTF-8 valid */
+ if ((utf8mapping == IRC_SERVER_UTF8MAPPING_RFC8265)
+ && !weechat_utf8_is_valid (string, -1, NULL))
+ {
+ /* invalid UTF-8 */
+ return 0;
+ }
+
+ /* check the first char in the nick */
+ if ((utf8mapping == IRC_SERVER_UTF8MAPPING_NONE)
+ && strchr ("0123456789-", string[0]))
+ {
+ /* first char is invalid */
return 0;
+ }
- while (ptr && ptr[0])
+ /* check if there are forbidden chars in nick */
+ ptr_string = string;
+ while (ptr_string && ptr_string[0])
{
- if (!strchr (IRC_NICK_VALID_CHARS, *ptr))
+ if ((utf8mapping == IRC_SERVER_UTF8MAPPING_NONE)
+ && !strchr (IRC_NICK_VALID_CHARS, ptr_string[0]))
+ {
return 0;
- ptr++;
+ }
+ if ((utf8mapping == IRC_SERVER_UTF8MAPPING_RFC8265)
+ && strchr (IRC_NICK_INVALID_CHARS, ptr_string[0]))
+ {
+ return 0;
+ }
+ ptr_string = weechat_utf8_next_char (ptr_string);
}
return 1;
diff --git a/src/plugins/irc/irc-nick.h b/src/plugins/irc/irc-nick.h
index a5f57ca41..c25dfef5c 100644
--- a/src/plugins/irc/irc-nick.h
+++ b/src/plugins/irc/irc-nick.h
@@ -22,6 +22,7 @@
#define IRC_NICK_VALID_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHI" \
"JKLMNOPQRSTUVWXYZ0123456789-[]\\`_^{|}"
+#define IRC_NICK_INVALID_CHARS " ,:\n\r*?.!@"
/* nicklist group for nicks without prefix is "999|..." */
#define IRC_NICK_GROUP_OTHER_NUMBER 999
@@ -47,7 +48,7 @@ struct t_irc_nick
extern int irc_nick_valid (struct t_irc_channel *channel,
struct t_irc_nick *nick);
-extern int irc_nick_is_nick (const char *string);
+extern int irc_nick_is_nick (struct t_irc_server *server, const char *string);
extern char *irc_nick_find_color (const char *nickname);
extern char *irc_nick_find_color_name (const char *nickname);
extern void irc_nick_set_host (struct t_irc_nick *nick, const char *host);
diff --git a/src/plugins/irc/irc-protocol.c b/src/plugins/irc/irc-protocol.c
index 7a92d54d8..d20860898 100644
--- a/src/plugins/irc/irc-protocol.c
+++ b/src/plugins/irc/irc-protocol.c
@@ -3096,7 +3096,7 @@ IRC_PROTOCOL_CALLBACK(001)
IRC_PROTOCOL_CALLBACK(005)
{
char *pos, *pos2, *pos_start, *error, *isupport2;
- int length_isupport, length, casemapping;
+ int length_isupport, length, casemapping, utf8mapping;
long value;
IRC_PROTOCOL_MIN_ARGS(4);
@@ -3181,6 +3181,21 @@ IRC_PROTOCOL_CALLBACK(005)
pos2[0] = ' ';
}
+ /* save utf8mapping */
+ pos = strstr (argv_eol[3], "UTF8MAPPING=");
+ if (pos)
+ {
+ pos += 12;
+ pos2 = strchr (pos, ' ');
+ if (pos2)
+ pos2[0] = '\0';
+ utf8mapping = irc_server_search_utf8mapping (pos);
+ if (utf8mapping >= 0)
+ server->utf8mapping = utf8mapping;
+ if (pos2)
+ pos2[0] = ' ';
+ }
+
/* save chantypes */
pos = strstr (argv_eol[3], "CHANTYPES=");
if (pos)
diff --git a/src/plugins/irc/irc-server.c b/src/plugins/irc/irc-server.c
index 6e9149a05..5918ba027 100644
--- a/src/plugins/irc/irc-server.c
+++ b/src/plugins/irc/irc-server.c
@@ -124,6 +124,9 @@ char *irc_server_options[IRC_SERVER_NUM_OPTIONS][2] =
char *irc_server_casemapping_string[IRC_SERVER_NUM_CASEMAPPING] =
{ "rfc1459", "strict-rfc1459", "ascii" };
+char *irc_server_utf8mapping_string[IRC_SERVER_NUM_UTF8MAPPING] =
+{ "none", "rfc8265" };
+
char *irc_server_prefix_modes_default = "ov";
char *irc_server_prefix_chars_default = "@+";
char *irc_server_chanmodes_default = "beI,k,l";
@@ -248,8 +251,8 @@ irc_server_search_option (const char *option_name)
/*
* Searches for a casemapping.
*
- * Returns index of casemapping in array "irc_server_casemapping_string", -1 if
- * not found.
+ * Returns index of casemapping in array "irc_server_casemapping_string",
+ * -1 if not found.
*/
int
@@ -268,6 +271,28 @@ irc_server_search_casemapping (const char *casemapping)
}
/*
+ * Searches for a utf8mapping.
+ *
+ * Returns index of utf8mapping in array "irc_server_utf8mapping_string",
+ * -1 if not found.
+ */
+
+int
+irc_server_search_utf8mapping (const char *utf8mapping)
+{
+ int i;
+
+ for (i = 0; i < IRC_SERVER_NUM_UTF8MAPPING; i++)
+ {
+ if (weechat_strcasecmp (irc_server_utf8mapping_string[i], utf8mapping) == 0)
+ return i;
+ }
+
+ /* utf8mapping not found */
+ return -1;
+}
+
+/*
* Compares two strings on server (case insensitive, depends on casemapping).
*
* Returns:
@@ -302,8 +327,8 @@ irc_server_strcasecmp (struct t_irc_server *server,
}
/*
- * Compares two strings on server (case insensitive, depends on casemapping) for
- * max chars.
+ * Compares two strings on server (case insensitive, depends on casemapping)
+ * for max chars.
*
* Returns:
* < 0: string1 < string2
@@ -1415,6 +1440,7 @@ irc_server_alloc (const char *name)
new_server->user_max_length = 0;
new_server->host_max_length = 0;
new_server->casemapping = IRC_SERVER_CASEMAPPING_RFC1459;
+ new_server->utf8mapping = IRC_SERVER_UTF8MAPPING_NONE;
new_server->chantypes = NULL;
new_server->chanmodes = NULL;
new_server->monitor = 0;
@@ -5743,6 +5769,7 @@ irc_server_hdata_server_cb (const void *pointer, void *data,
WEECHAT_HDATA_VAR(struct t_irc_server, user_max_length, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, host_max_length, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, casemapping, INTEGER, 0, NULL, NULL);
+ WEECHAT_HDATA_VAR(struct t_irc_server, utf8mapping, INTEGER, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, chantypes, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, chanmodes, STRING, 0, NULL, NULL);
WEECHAT_HDATA_VAR(struct t_irc_server, monitor, INTEGER, 0, NULL, NULL);
@@ -5990,6 +6017,10 @@ irc_server_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "casemapping_string", irc_server_casemapping_string[server->casemapping]))
return 0;
+ if (!weechat_infolist_new_var_integer (ptr_item, "utf8mapping", server->utf8mapping))
+ return 0;
+ if (!weechat_infolist_new_var_string (ptr_item, "utf8mapping_string", irc_server_utf8mapping_string[server->utf8mapping]))
+ return 0;
if (!weechat_infolist_new_var_string (ptr_item, "chantypes", server->chantypes))
return 0;
if (!weechat_infolist_new_var_string (ptr_item, "chanmodes", server->chanmodes))
@@ -6378,6 +6409,9 @@ irc_server_print_log ()
weechat_log_printf (" casemapping. . . . . : %d (%s)",
ptr_server->casemapping,
irc_server_casemapping_string[ptr_server->casemapping]);
+ weechat_log_printf (" utf8mapping. . . . . : %d (%s)",
+ ptr_server->utf8mapping,
+ irc_server_utf8mapping_string[ptr_server->utf8mapping]);
weechat_log_printf (" chantypes. . . . . . : '%s'", ptr_server->chantypes);
weechat_log_printf (" chanmodes. . . . . . : '%s'", ptr_server->chanmodes);
weechat_log_printf (" monitor. . . . . . . : %d", ptr_server->monitor);
diff --git a/src/plugins/irc/irc-server.h b/src/plugins/irc/irc-server.h
index 2d57bf1c2..4c4b985f3 100644
--- a/src/plugins/irc/irc-server.h
+++ b/src/plugins/irc/irc-server.h
@@ -142,6 +142,15 @@ enum t_irc_server_casemapping
IRC_SERVER_NUM_CASEMAPPING,
};
+/* utf8mapping (string comparisons for nicks/channels) */
+enum t_irc_server_utf8mapping
+{
+ IRC_SERVER_UTF8MAPPING_NONE = 0,
+ IRC_SERVER_UTF8MAPPING_RFC8265,
+ /* number of utf8mapping */
+ IRC_SERVER_NUM_UTF8MAPPING,
+};
+
/* output queue of messages to server (for sending slowly to server) */
struct t_irc_outqueue
@@ -210,6 +219,7 @@ struct t_irc_server
int user_max_length; /* max length of user (from msg 005) */
int host_max_length; /* max length of host (from msg 005) */
int casemapping; /* casemapping from msg 005 */
+ int utf8mapping; /* utf8mapping from msg 005 */
char *chantypes; /* chantypes from msg 005 (eg "&#") */
char *chanmodes; /* chanmodes from msg 005 */
/* (eg "beI,k,l,imnpstaqr") */
@@ -284,6 +294,7 @@ extern struct t_irc_server *irc_server_search (const char *server_name);
extern struct t_irc_server *irc_server_casesearch (const char *server_name);
extern int irc_server_search_option (const char *option_name);
extern int irc_server_search_casemapping (const char *casemapping);
+extern int irc_server_search_utf8mapping (const char *utf8mapping);
extern int irc_server_strcasecmp (struct t_irc_server *server,
const char *string1, const char *string2);
extern int irc_server_strncasecmp (struct t_irc_server *server,
diff --git a/src/plugins/irc/irc-upgrade.c b/src/plugins/irc/irc-upgrade.c
index 33a4667fd..1bba5fe26 100644
--- a/src/plugins/irc/irc-upgrade.c
+++ b/src/plugins/irc/irc-upgrade.c
@@ -339,7 +339,7 @@ irc_upgrade_read_cb (const void *pointer, void *data,
int object_id,
struct t_infolist *infolist)
{
- int flags, sock, size, i, index, nicks_count, num_items;
+ int flags, sock, size, i, index, nicks_count, num_items, utf8mapping;
long number;
time_t join_time;
char *buf, option_name[64], **nicks, *nick_join, *pos, *error;
@@ -479,7 +479,7 @@ irc_upgrade_read_cb (const void *pointer, void *data,
irc_upgrade_current_server->prefix_chars = strdup (str);
}
irc_upgrade_current_server->nick_max_length = weechat_infolist_integer (infolist, "nick_max_length");
- /* "user_max_length" is new in WeeChat 2.6 */
+ /* "user_max_length" is new in WeeChat 2.6 */
if (weechat_infolist_search_var (infolist, "user_max_length"))
{
irc_upgrade_current_server->user_max_length = weechat_infolist_integer (infolist, "user_max_length");
@@ -497,7 +497,7 @@ irc_upgrade_read_cb (const void *pointer, void *data,
irc_upgrade_current_server->user_max_length = (int)number;
}
}
- /* "host_max_length" is new in WeeChat 2.6 */
+ /* "host_max_length" is new in WeeChat 2.6 */
if (weechat_infolist_search_var (infolist, "host_max_length"))
{
irc_upgrade_current_server->host_max_length = weechat_infolist_integer (infolist, "host_max_length");
@@ -516,6 +516,23 @@ irc_upgrade_read_cb (const void *pointer, void *data,
}
}
irc_upgrade_current_server->casemapping = weechat_infolist_integer (infolist, "casemapping");
+ /* "utf8mapping" is new in WeeChat 2.9 */
+ if (weechat_infolist_search_var (infolist, "utf8mapping"))
+ {
+ irc_upgrade_current_server->utf8mapping = weechat_infolist_integer (infolist, "utf8mapping");
+ }
+ else
+ {
+ /* WeeChat <= 2.8 */
+ str = irc_server_get_isupport_value (irc_upgrade_current_server,
+ "UTF8MAPPING");
+ if (str)
+ {
+ utf8mapping = irc_server_search_utf8mapping (str);
+ if (utf8mapping >= 0)
+ irc_upgrade_current_server->utf8mapping = utf8mapping;
+ }
+ }
str = weechat_infolist_string (infolist, "chantypes");
if (str)
irc_upgrade_current_server->chantypes = strdup (str);
diff --git a/tests/unit/plugins/irc/test-irc-nick.cpp b/tests/unit/plugins/irc/test-irc-nick.cpp
index 9c859ef9f..a114e24f0 100644
--- a/tests/unit/plugins/irc/test-irc-nick.cpp
+++ b/tests/unit/plugins/irc/test-irc-nick.cpp
@@ -24,6 +24,7 @@
extern "C"
{
#include "src/plugins/irc/irc-nick.h"
+#include "src/plugins/irc/irc-server.h"
}
TEST_GROUP(IrcNick)
@@ -47,24 +48,95 @@ TEST(IrcNick, Valid)
TEST(IrcNick, IsNick)
{
+ struct t_irc_server *server;
+
+ /* no server, default utf8mapping = none */
+
/* empty nick */
- LONGS_EQUAL(0, irc_nick_is_nick (NULL));
- LONGS_EQUAL(0, irc_nick_is_nick (""));
- LONGS_EQUAL(0, irc_nick_is_nick (" "));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, NULL));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, ""));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, " "));
/* invalid first char */
- LONGS_EQUAL(0, irc_nick_is_nick ("0abc"));
- LONGS_EQUAL(0, irc_nick_is_nick ("9abc"));
- LONGS_EQUAL(0, irc_nick_is_nick ("-abc"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "0abc"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "9abc"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "-abc"));
+
+ /* invalid chars in nick */
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "nick test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "nick,test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "nick?test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "nick!test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "nick@test"));
+
+ /* UTF-8 wide chars in nick */
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "noël"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "testé"));
+ LONGS_EQUAL(0, irc_nick_is_nick (NULL, "\xf0\xa4\xad\xa2")); /* han char */
+
+ /* valid nicks */
+ LONGS_EQUAL(1, irc_nick_is_nick (NULL, "tester"));
+ LONGS_EQUAL(1, irc_nick_is_nick (NULL, "bob"));
+ LONGS_EQUAL(1, irc_nick_is_nick (NULL, "alice"));
+ LONGS_EQUAL(1, irc_nick_is_nick (NULL, "very_long_nick_which_is_valid"));
+
+ /* server with utf8mapping = rfc8265, nicklen = 20 */
+ server = irc_server_alloc ("my_ircd");
+ CHECK(server);
+ if (server->chantypes)
+ free (server->chantypes);
+ server->utf8mapping =IRC_SERVER_UTF8MAPPING_RFC8265;
+ server->nick_max_length = 20;
+
+ /* empty nick */
+ LONGS_EQUAL(0, irc_nick_is_nick (server, NULL));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, ""));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, " "));
+
+ /* nick too long */
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "long_nick___length_21"));
+
+ /* valid nicks: first char allowed with utf8mapping = rfc8265 */
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "0abc"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "9abc"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "-abc"));
/* invalid chars in nick */
- LONGS_EQUAL(0, irc_nick_is_nick ("noël"));
- LONGS_EQUAL(0, irc_nick_is_nick ("testé"));
- LONGS_EQUAL(0, irc_nick_is_nick ("nick space"));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "nick test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "nick,test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "nick?test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "nick!test"));
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "nick@test"));
+
+ /* valid nicks: UTF-8 */
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "noël"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "testé"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "\xf0\xa4\xad\xa2")); /* han char */
+
+ /* valid nicks with UTF-8 wide chars */
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "noël"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "testé"));
/* valid nicks */
- LONGS_EQUAL(1, irc_nick_is_nick ("tester"));
- LONGS_EQUAL(1, irc_nick_is_nick ("bob"));
- LONGS_EQUAL(1, irc_nick_is_nick ("alice"));
- LONGS_EQUAL(1, irc_nick_is_nick ("very_long_nick_which_is_valid"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "tester"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "bob"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "alice"));
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "long_nick__length_20"));
+
+ /* max length: 4 bytes */
+ server->nick_max_length = 4;
+
+ /* invalid nick: 8 bytes */
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "\xf0\xa4\xad\xa2\xf0\xa4\xad\xa2"));
+
+ /* valid nick: 4 bytes */
+ LONGS_EQUAL(1, irc_nick_is_nick (server, "\xf0\xa4\xad\xa2")); /* han char */
+
+ /* max length: 3 bytes */
+ server->nick_max_length = 3;
+
+ /* invalid nick: 4 bytes */
+ LONGS_EQUAL(0, irc_nick_is_nick (server, "\xf0\xa4\xad\xa2")); /* han char */
+
+ irc_server_free (server);
}