diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2020-06-20 17:28:28 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2020-06-20 17:28:28 +0200 |
commit | 12051a506ddbb0fe37ec9ebcc4b5df1eaeaa23bf (patch) | |
tree | b27d60e68961a756ddd5f7cf3648d5478b972a20 | |
parent | bf964de9399733f99e2183abd04a1612d99429cb (diff) | |
download | weechat-12051a506ddbb0fe37ec9ebcc4b5df1eaeaa23bf.zip |
irc: add support of UTF8MAPPING, add support of optional server in info "irc_is_nick" (closes #1528)
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 @@ -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ů) ==========" @@ -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) ==========" @@ -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) ==========" @@ -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) ==========" @@ -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 "" @@ -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) ==========" @@ -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 行) ==========" @@ -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) ==========" @@ -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) ==========" @@ -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 "" @@ -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); } |