From 4f446552a3e05da85bebbc89464d48de49562be1 Mon Sep 17 00:00:00 2001 From: Jos Ahrens Date: Sat, 20 Apr 2019 07:58:14 +0000 Subject: [PATCH 1/6] modules: Remove Q Q can be replaced with the perform module, and will still be available as a third-party module for those who use the module and QuakeNet. In general, the Q module only targets a single network not everyone may use, the additional support and maintenance burden is not worth it. References #786 Closes #1636 as wontfix Closes #554 as wontfix --- modules/po/q.de_DE.po | 296 ------------------ modules/po/q.es_ES.po | 305 ------------------- modules/po/q.fr_FR.po | 296 ------------------ modules/po/q.id_ID.po | 300 ------------------ modules/po/q.nl_NL.po | 313 ------------------- modules/po/q.pot | 287 ------------------ modules/po/q.pt_BR.po | 296 ------------------ modules/po/q.ru_RU.po | 298 ------------------ modules/q.cpp | 689 ------------------------------------------ src/IRCNetwork.cpp | 14 + 10 files changed, 14 insertions(+), 3080 deletions(-) delete mode 100644 modules/po/q.de_DE.po delete mode 100644 modules/po/q.es_ES.po delete mode 100644 modules/po/q.fr_FR.po delete mode 100644 modules/po/q.id_ID.po delete mode 100644 modules/po/q.nl_NL.po delete mode 100644 modules/po/q.pot delete mode 100644 modules/po/q.pt_BR.po delete mode 100644 modules/po/q.ru_RU.po delete mode 100644 modules/q.cpp diff --git a/modules/po/q.de_DE.po b/modules/po/q.de_DE.po deleted file mode 100644 index 2c8a6e45..00000000 --- a/modules/po/q.de_DE.po +++ /dev/null @@ -1,296 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: de\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: German\n" -"Language: de_DE\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "" - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "" - -#: q.cpp:135 -msgid "Set " -msgstr "" - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/po/q.es_ES.po b/modules/po/q.es_ES.po deleted file mode 100644 index 2a29acb8..00000000 --- a/modules/po/q.es_ES.po +++ /dev/null @@ -1,305 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: es-ES\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Spanish\n" -"Language: es_ES\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "Usuario:" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "Introduce un nombre de usuario." - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "Contraseña:" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "Introduce una contraseña." - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "Opciones" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "Guardar" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" -"Aviso: tu host será enmascarado la próxima vez que conectes al IRC. Si " -"quieres enmascarar tu host ahora, /msg *q Cloak. Puedes configurar tu " -"preferencia con /msg *q SET UseCloakedHost true/false." - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "Los siguientes comandos están disponibles:" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "Comando" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "Descripción" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "Auth [ ]" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "Intenta autenticarte con Q. Ambos parámetros son opcionales." - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "Intenta ponerte el modo de usuario +x para ocultar tu host real." - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "Muestra el estado actual del módulo." - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "Re-solicita la información actual del usuario desde Q." - -#: q.cpp:135 -msgid "Set " -msgstr "Set " - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "Cambia el valor del ajuste. Consulta la lista de ajustes debajo." - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "Muestra la configuración actual. Consulta la lista de ajustes debajo." - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "Las siguientes opciones están disponibles:" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "Ajuste" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "Tipo" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "Cadena" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "Tu usuario de Q." - -#: q.cpp:158 -msgid "Your Q password." -msgstr "Tu contraseña de Q." - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "Booleano" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "Intentar ocultar tu host (+x) al conectar." - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" -"Intentar usar el mecanismo CHALLENGEAUTH para evitar enviar la contraseña en " -"texto plano." - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "Pedir voz/op a Q al entrar/devoice/deop a/de un canal." - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "Entrar a los canales cuando Q te invite." - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "Retrasar la entrada a canales hasta que tu host haya sido ocultado." - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "Este módulo tiene 2 parámetros opcionales: " - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "Los ajustes del módulo se guardan entre reinicios." - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "Sintaxis: Set " - -#: q.cpp:203 -msgid "Username set" -msgstr "Usuario guardado" - -#: q.cpp:206 -msgid "Password set" -msgstr "Contraseña guardada" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "UseCloakedHost guardado" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "UseChallenge guardado" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "RequestPerms guardado" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "JoinOnInvite guardado" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "JoinAfterCloaked guardado" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "Opción desconocida: {1}" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "Valor" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "Conectado: sí" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "Conectado: no" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "Enmascarado: sí" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "Enmascarado: no" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "Autenticado: sí" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "Autenticado: no" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "Error: no estás conectado al IRC." - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "Error: ya estás enmascarado!" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "Error: ya estás autenticado!" - -#: q.cpp:280 -msgid "Update requested." -msgstr "Actualización solicitada." - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "Comando desconocido. Escribe 'Help'." - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "Ocultación correcta: ahora tu host está enmascarado." - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "Tus cambios han sido guardados" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "Cloak: intentando ocultar tu host, poniendo +x..." - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" -"Tienes que configurar un nombre de usuario y una contraseña para usar este " -"módulo. Escribe 'help' para ver más detalles." - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "Auth: solicitando CHALLENGE..." - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "Auth: enviando respuesta AUTH..." - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "Auth: reto recibido, enviando petición CHALLENGEAUTH..." - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "Fallo de autenticación: {1}" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "Autenticación correcta: {1}" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" -"Fallo en autenticación: Q no soporta HMAC-SHA-256 en CHALLENGEAUTH, " -"intentando autenticación estándar." - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "RequestPerms: pidiendo op en {1}" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "RequestPerms: pidiendo voz en {1}" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "Introduce tu nombre de usuario y contraseña de Q." - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "Te identifica con el bot Q de Quakenet." diff --git a/modules/po/q.fr_FR.po b/modules/po/q.fr_FR.po deleted file mode 100644 index 2cdfc290..00000000 --- a/modules/po/q.fr_FR.po +++ /dev/null @@ -1,296 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: fr\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: French\n" -"Language: fr_FR\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "" - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "" - -#: q.cpp:135 -msgid "Set " -msgstr "" - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/po/q.id_ID.po b/modules/po/q.id_ID.po deleted file mode 100644 index f024149d..00000000 --- a/modules/po/q.id_ID.po +++ /dev/null @@ -1,300 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: id\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Indonesian\n" -"Language: id_ID\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "Nama pengguna:" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "Silahkan masukan nama pengguna." - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "Kata Sandi:" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "Silakan masukkan sandi." - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "Opsi" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "Simpan" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "Perintah berikut tersedia:" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "Perintah" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "Deskripsi" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "Auth [ ]" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" -"Mencoba untuk mengautentikasi anda dengan Q. Kedua parameter bersifat " -"opsional." - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" -"Mencoba untuk menetapkan usermode +x untuk menyembunyikan nama host anda " -"yang sebenarnya." - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "Mencetak status modul saat ini." - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "Minta ulang informasi pengguna saat ini dari Q." - -#: q.cpp:135 -msgid "Set " -msgstr "Set " - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "Setelan" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "Tipe" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "String" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/po/q.nl_NL.po b/modules/po/q.nl_NL.po deleted file mode 100644 index 2158a61c..00000000 --- a/modules/po/q.nl_NL.po +++ /dev/null @@ -1,313 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: nl\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Dutch\n" -"Language: nl_NL\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "Gebruikersnaam:" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "Voer alsjeblieft een gebruikersnaam in." - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "Wachtwoord:" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "Voer alsjeblieft een wachtwoord in." - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "Opties" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "Opslaan" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" -"Melding: Je host zal omhuld worden de volgende keer dat je met IRC verbind. " -"Als je dit nu wilt doen, doe dan: /msg *q Cloak. Je kan je voorkeur " -"instellen met /msg *q Set UseCloakedHost true/false." - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "De volgende commando's zijn beschikbaar:" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "Commando" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "Beschrijving" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "Auth [ ]" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "Probeert je te authenticeren met Q, beide parameters zijn optioneel." - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" -"Probeert gebruikersmodus +x in te stellen om je echte hostname te verbergen." - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "Toont de huidige status van de module." - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "Vraagt de huidige gebruikersinformatie opnieuw aan bij Q." - -#: q.cpp:135 -msgid "Set " -msgstr "Set " - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" -"Past de waarde aan van de gegeven instelling. Zie de lijst van instellingen " -"hier onder." - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" -"Toont de huidige configuratie. Zie de onderstaande lijst van instellingen." - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "De volgende instellingen zijn beschikbaar:" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "Instelling" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "Type" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "Tekenreeks" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "Jouw Q gebruikersnaam." - -#: q.cpp:158 -msgid "Your Q password." -msgstr "Jouw Q wachtwoord." - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "Boolen (waar/onwaar)" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "Je hostname automatisch omhullen (+x) wanneer er verbonden is." - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" -"Of CHALLENGEAUTH mechanisme gebruikt moet worden om te voorkomen dat je " -"wachtwoord onversleuteld verstuurd word." - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" -"Of je automatisch stem/beheerdersrechten van Q wilt aanvragen als je " -"toetreed/stem kwijt raakt/beheerdersrechten kwijt raakt." - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "Automatisch kanalen toetreden waar Q je voor uitnodigd." - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "Wachten met het toetreden van kanalen totdat je host omhuld is." - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" -"Deze module accepteerd twee optionele parameters: " -"" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "Module instellingen worden opgeslagen tussen herstarts." - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "Syntax: Set " - -#: q.cpp:203 -msgid "Username set" -msgstr "Gebruikersnaam ingesteld" - -#: q.cpp:206 -msgid "Password set" -msgstr "Wachtwoord ingesteld" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "UseCloakedHost ingesteld" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "UseChallenge ingesteld" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "RequestPerms ingesteld" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "JoinOnInvite ingesteld" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "JoinAfterCloaked ingesteld" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "Onbekende instelling: {1}" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "Waarde" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "Verbonden: ja" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "Verbonden: nee" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "Host omhuld: ja" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "Host omhuld: nee" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "Geauthenticeerd: ja" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "Geauthenticeerd: nee" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "Fout: Je bent niet verbonden met IRC." - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "Fout: Je bent al omhuld!" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "Fout: Je bent al geauthenticeerd!" - -#: q.cpp:280 -msgid "Update requested." -msgstr "Update aangevraagd." - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "Onbekend commando. Probeer 'help'." - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "Omhulling succesvol: Je host is nu omhuld." - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "Wijzigingen zijn opgeslagen!" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "Omhulling: Proberen je host te omhullen, +x aan het instellen..." - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" -"Je moet een gebruikersnaam en wachtwoord instellen om deze module te " -"gebruiken! Zie 'help' voor details." - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "Auth: CHALLENGE aanvragen..." - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "Auth: AUTH aanvraag aan het versturen..." - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "Auth: Uitdaging ontvangen, nu CHALLENGEAUTH aanvraag sturen..." - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "Authenticatie mislukt: {1}" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "Authenticatie gelukt: {1}" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" -"Auth mislukt: Q ondersteund geen HMAC-SHA-256 voor CHALLENGEAUTH, " -"terugvallen naar standaard AUTH." - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "RequestPerms: Beheerdersrechten aanvragen in {1}" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "RequestPerms: Stem aanvragen in {1}" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "Voer alsjeblieft je gebruikersnaam en wachtwoord in voor Q." - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "Authenticeert je met QuakeNet's Q bot." diff --git a/modules/po/q.pot b/modules/po/q.pot deleted file mode 100644 index c419b7c6..00000000 --- a/modules/po/q.pot +++ /dev/null @@ -1,287 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "" - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "" - -#: q.cpp:135 -msgid "Set " -msgstr "" - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/po/q.pt_BR.po b/modules/po/q.pt_BR.po deleted file mode 100644 index 783e2ca3..00000000 --- a/modules/po/q.pt_BR.po +++ /dev/null @@ -1,296 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: pt-BR\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Portuguese, Brazilian\n" -"Language: pt_BR\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "" - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "" - -#: q.cpp:135 -msgid "Set " -msgstr "" - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/po/q.ru_RU.po b/modules/po/q.ru_RU.po deleted file mode 100644 index cf34a8db..00000000 --- a/modules/po/q.ru_RU.po +++ /dev/null @@ -1,298 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 " -"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 " -"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: ru\n" -"X-Crowdin-File: /master/modules/po/q.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Russian\n" -"Language: ru_RU\n" - -#: modules/po/../data/q/tmpl/index.tmpl:11 -msgid "Username:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:13 -msgid "Please enter a username." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:16 -msgid "Password:" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:18 -msgid "Please enter a password." -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:26 -msgid "Options" -msgstr "" - -#: modules/po/../data/q/tmpl/index.tmpl:42 -msgid "Save" -msgstr "" - -#: q.cpp:74 -msgid "" -"Notice: Your host will be cloaked the next time you reconnect to IRC. If you " -"want to cloak your host now, /msg *q Cloak. You can set your preference " -"with /msg *q Set UseCloakedHost true/false." -msgstr "" - -#: q.cpp:111 -msgid "The following commands are available:" -msgstr "" - -#: q.cpp:113 q.cpp:116 q.cpp:121 q.cpp:126 q.cpp:130 q.cpp:135 q.cpp:140 -msgid "Command" -msgstr "" - -#: q.cpp:114 q.cpp:117 q.cpp:123 q.cpp:127 q.cpp:132 q.cpp:136 q.cpp:141 -#: q.cpp:150 q.cpp:154 q.cpp:158 q.cpp:162 q.cpp:168 q.cpp:174 q.cpp:180 -#: q.cpp:186 -msgid "Description" -msgstr "" - -#: q.cpp:116 -msgid "Auth [ ]" -msgstr "" - -#: q.cpp:118 -msgid "Tries to authenticate you with Q. Both parameters are optional." -msgstr "" - -#: q.cpp:124 -msgid "Tries to set usermode +x to hide your real hostname." -msgstr "" - -#: q.cpp:128 -msgid "Prints the current status of the module." -msgstr "" - -#: q.cpp:133 -msgid "Re-requests the current user information from Q." -msgstr "" - -#: q.cpp:135 -msgid "Set " -msgstr "" - -#: q.cpp:137 -msgid "Changes the value of the given setting. See the list of settings below." -msgstr "" - -#: q.cpp:142 -msgid "Prints out the current configuration. See the list of settings below." -msgstr "" - -#: q.cpp:146 -msgid "The following settings are available:" -msgstr "" - -#: q.cpp:148 q.cpp:152 q.cpp:156 q.cpp:160 q.cpp:166 q.cpp:172 q.cpp:178 -#: q.cpp:183 q.cpp:227 q.cpp:230 q.cpp:233 q.cpp:236 q.cpp:239 q.cpp:242 -#: q.cpp:245 q.cpp:248 -msgid "Setting" -msgstr "" - -#: q.cpp:149 q.cpp:153 q.cpp:157 q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 -#: q.cpp:184 -msgid "Type" -msgstr "" - -#: q.cpp:153 q.cpp:157 -msgid "String" -msgstr "" - -#: q.cpp:154 -msgid "Your Q username." -msgstr "" - -#: q.cpp:158 -msgid "Your Q password." -msgstr "" - -#: q.cpp:161 q.cpp:167 q.cpp:173 q.cpp:179 q.cpp:184 -msgid "Boolean" -msgstr "" - -#: q.cpp:163 q.cpp:373 -msgid "Whether to cloak your hostname (+x) automatically on connect." -msgstr "" - -#: q.cpp:169 q.cpp:381 -msgid "" -"Whether to use the CHALLENGEAUTH mechanism to avoid sending passwords in " -"cleartext." -msgstr "" - -#: q.cpp:175 q.cpp:389 -msgid "Whether to request voice/op from Q on join/devoice/deop." -msgstr "" - -#: q.cpp:181 q.cpp:395 -msgid "Whether to join channels when Q invites you." -msgstr "" - -#: q.cpp:187 q.cpp:402 -msgid "Whether to delay joining channels until after you are cloaked." -msgstr "" - -#: q.cpp:192 -msgid "This module takes 2 optional parameters: " -msgstr "" - -#: q.cpp:194 -msgid "Module settings are stored between restarts." -msgstr "" - -#: q.cpp:200 -msgid "Syntax: Set " -msgstr "" - -#: q.cpp:203 -msgid "Username set" -msgstr "" - -#: q.cpp:206 -msgid "Password set" -msgstr "" - -#: q.cpp:209 -msgid "UseCloakedHost set" -msgstr "" - -#: q.cpp:212 -msgid "UseChallenge set" -msgstr "" - -#: q.cpp:215 -msgid "RequestPerms set" -msgstr "" - -#: q.cpp:218 -msgid "JoinOnInvite set" -msgstr "" - -#: q.cpp:221 -msgid "JoinAfterCloaked set" -msgstr "" - -#: q.cpp:223 -msgid "Unknown setting: {1}" -msgstr "" - -#: q.cpp:228 q.cpp:231 q.cpp:234 q.cpp:237 q.cpp:240 q.cpp:243 q.cpp:246 -#: q.cpp:249 -msgid "Value" -msgstr "" - -#: q.cpp:253 -msgid "Connected: yes" -msgstr "" - -#: q.cpp:254 -msgid "Connected: no" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: yes" -msgstr "" - -#: q.cpp:255 -msgid "Cloacked: no" -msgstr "" - -#: q.cpp:256 -msgid "Authenticated: yes" -msgstr "" - -#: q.cpp:257 -msgid "Authenticated: no" -msgstr "" - -#: q.cpp:262 -msgid "Error: You are not connected to IRC." -msgstr "" - -#: q.cpp:270 -msgid "Error: You are already cloaked!" -msgstr "" - -#: q.cpp:276 -msgid "Error: You are already authed!" -msgstr "" - -#: q.cpp:280 -msgid "Update requested." -msgstr "" - -#: q.cpp:283 -msgid "Unknown command. Try 'help'." -msgstr "" - -#: q.cpp:293 -msgid "Cloak successful: Your hostname is now cloaked." -msgstr "" - -#: q.cpp:408 -msgid "Changes have been saved!" -msgstr "" - -#: q.cpp:435 -msgid "Cloak: Trying to cloak your hostname, setting +x..." -msgstr "" - -#: q.cpp:452 -msgid "" -"You have to set a username and password to use this module! See 'help' for " -"details." -msgstr "" - -#: q.cpp:458 -msgid "Auth: Requesting CHALLENGE..." -msgstr "" - -#: q.cpp:462 -msgid "Auth: Sending AUTH request..." -msgstr "" - -#: q.cpp:479 -msgid "Auth: Received challenge, sending CHALLENGEAUTH request..." -msgstr "" - -#: q.cpp:521 -msgid "Authentication failed: {1}" -msgstr "" - -#: q.cpp:525 -msgid "Authentication successful: {1}" -msgstr "" - -#: q.cpp:539 -msgid "" -"Auth failed: Q does not support HMAC-SHA-256 for CHALLENGEAUTH, falling back " -"to standard AUTH." -msgstr "" - -#: q.cpp:566 -msgid "RequestPerms: Requesting op on {1}" -msgstr "" - -#: q.cpp:579 -msgid "RequestPerms: Requesting voice on {1}" -msgstr "" - -#: q.cpp:686 -msgid "Please provide your username and password for Q." -msgstr "" - -#: q.cpp:689 -msgid "Auths you with QuakeNet's Q bot." -msgstr "" diff --git a/modules/q.cpp b/modules/q.cpp deleted file mode 100644 index f7df628c..00000000 --- a/modules/q.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/* - * Copyright (C) 2004-2019 ZNC, see the NOTICE file for details. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -using std::set; - -#ifndef Q_DEBUG_COMMUNICATION -#define Q_DEBUG_COMMUNICATION 0 -#endif - -class CQModule : public CModule { - public: - MODCONSTRUCTOR(CQModule) {} - ~CQModule() override {} - - bool OnLoad(const CString& sArgs, CString& sMessage) override { - if (!sArgs.empty()) { - SetUsername(sArgs.Token(0)); - SetPassword(sArgs.Token(1)); - } else { - m_sUsername = GetNV("Username"); - m_sPassword = GetNV("Password"); - } - - CString sTmp; - m_bUseCloakedHost = - (sTmp = GetNV("UseCloakedHost")).empty() ? true : sTmp.ToBool(); - m_bUseChallenge = - (sTmp = GetNV("UseChallenge")).empty() ? true : sTmp.ToBool(); - m_bRequestPerms = GetNV("RequestPerms").ToBool(); - m_bJoinOnInvite = - (sTmp = GetNV("JoinOnInvite")).empty() ? true : sTmp.ToBool(); - m_bJoinAfterCloaked = - (sTmp = GetNV("JoinAfterCloaked")).empty() ? true : sTmp.ToBool(); - - // Make sure NVs are stored in config. Note: SetUseCloakedHost() is - // called further down. - SetUseChallenge(m_bUseChallenge); - SetRequestPerms(m_bRequestPerms); - SetJoinOnInvite(m_bJoinOnInvite); - SetJoinAfterCloaked(m_bJoinAfterCloaked); - - OnIRCDisconnected(); // reset module's state - - if (IsIRCConnected()) { - // check for usermode +x if we are already connected - set scUserModes = - GetNetwork()->GetIRCSock()->GetUserModes(); - if (scUserModes.find('x') != scUserModes.end()) m_bCloaked = true; - - // This will only happen once, and only if the user loads the module - // after connecting to IRC. - // Also don't notify the user in case he already had mode +x set. - if (GetNV("UseCloakedHost").empty()) { - if (!m_bCloaked) - PutModule(t_s( - "Notice: Your host will be cloaked the next time you " - "reconnect to IRC. " - "If you want to cloak your host now, /msg *q Cloak. " - "You can set your preference " - "with /msg *q Set UseCloakedHost true/false.")); - m_bUseCloakedHost = true; - SetUseCloakedHost(m_bUseCloakedHost); - m_bJoinAfterCloaked = true; - SetJoinAfterCloaked(m_bJoinAfterCloaked); - } else if (m_bUseChallenge) { - Cloak(); - } - WhoAmI(); - } else { - SetUseCloakedHost(m_bUseCloakedHost); - } - - return true; - } - - void OnIRCDisconnected() override { - m_bCloaked = false; - m_bAuthed = false; - m_bRequestedWhoami = false; - m_bRequestedChallenge = false; - m_bCatchResponse = false; - } - - void OnIRCConnected() override { - if (m_bUseCloakedHost) Cloak(); - WhoAmI(); - } - - void OnModCommand(const CString& sLine) override { - CString sCommand = sLine.Token(0).AsLower(); - - if (sCommand == "help") { - PutModule(t_s("The following commands are available:")); - CTable Table; - Table.AddColumn(t_s("Command")); - Table.AddColumn(t_s("Description")); - Table.AddRow(); - Table.SetCell(t_s("Command"), t_s("Auth [ ]")); - Table.SetCell(t_s("Description"), - t_s("Tries to authenticate you with Q. Both " - "parameters are optional.")); - Table.AddRow(); - Table.SetCell(t_s("Command"), "Cloak"); - Table.SetCell( - t_s("Description"), - t_s("Tries to set usermode +x to hide your real hostname.")); - Table.AddRow(); - Table.SetCell(t_s("Command"), "Status"); - Table.SetCell(t_s("Description"), - t_s("Prints the current status of the module.")); - Table.AddRow(); - Table.SetCell(t_s("Command"), "Update"); - Table.SetCell( - t_s("Description"), - t_s("Re-requests the current user information from Q.")); - Table.AddRow(); - Table.SetCell(t_s("Command"), t_s("Set ")); - Table.SetCell(t_s("Description"), - t_s("Changes the value of the given setting. See the " - "list of settings below.")); - Table.AddRow(); - Table.SetCell(t_s("Command"), "Get"); - Table.SetCell(t_s("Description"), - t_s("Prints out the current configuration. See the " - "list of settings below.")); - PutModule(Table); - - PutModule(t_s("The following settings are available:")); - CTable Table2; - Table2.AddColumn(t_s("Setting")); - Table2.AddColumn(t_s("Type")); - Table2.AddColumn(t_s("Description")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"),"Username"); - Table2.SetCell(t_s("Type"), t_s("String")); - Table2.SetCell(t_s("Description"), t_s("Your Q username.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "Password"); - Table2.SetCell(t_s("Type"), t_s("String")); - Table2.SetCell(t_s("Description"), t_s("Your Q password.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "UseCloakedHost"); - Table2.SetCell(t_s("Type"), t_s("Boolean")); - Table2.SetCell(t_s("Description"), - t_s("Whether to cloak your hostname (+x) " - "automatically on connect.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "UseChallenge"); - Table2.SetCell(t_s("Type"), t_s("Boolean")); - Table2.SetCell(t_s("Description"), - t_s("Whether to use the CHALLENGEAUTH mechanism to " - "avoid sending passwords in cleartext.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "RequestPerms"); - Table2.SetCell(t_s("Type"), t_s("Boolean")); - Table2.SetCell(t_s("Description"), - t_s("Whether to request voice/op from Q on " - "join/devoice/deop.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "JoinOnInvite"); - Table2.SetCell(t_s("Type"), t_s("Boolean")); - Table2.SetCell(t_s("Description"), - t_s("Whether to join channels when Q invites you.")); - Table2.AddRow(); - Table2.SetCell(t_s("Setting"), "JoinAfterCloaked"); - Table2.SetCell(t_s("Type"), t_s("Boolean")); - Table2.SetCell( - t_s("Description"), - t_s("Whether to delay joining channels until after you " - "are cloaked.")); - PutModule(Table2); - - PutModule( - t_s("This module takes 2 optional parameters: " - "")); - PutModule(t_s("Module settings are stored between restarts.")); - - } else if (sCommand == "set") { - CString sSetting = sLine.Token(1).AsLower(); - CString sValue = sLine.Token(2); - if (sSetting.empty() || sValue.empty()) { - PutModule(t_s("Syntax: Set ")); - } else if (sSetting == "username") { - SetUsername(sValue); - PutModule(t_s("Username set")); - } else if (sSetting == "password") { - SetPassword(sValue); - PutModule(t_s("Password set")); - } else if (sSetting == "usecloakedhost") { - SetUseCloakedHost(sValue.ToBool()); - PutModule(t_s("UseCloakedHost set")); - } else if (sSetting == "usechallenge") { - SetUseChallenge(sValue.ToBool()); - PutModule(t_s("UseChallenge set")); - } else if (sSetting == "requestperms") { - SetRequestPerms(sValue.ToBool()); - PutModule(t_s("RequestPerms set")); - } else if (sSetting == "joinoninvite") { - SetJoinOnInvite(sValue.ToBool()); - PutModule(t_s("JoinOnInvite set")); - } else if (sSetting == "joinaftercloaked") { - SetJoinAfterCloaked(sValue.ToBool()); - PutModule(t_s("JoinAfterCloaked set")); - } else - PutModule(t_f("Unknown setting: {1}")(sSetting)); - - } else if (sCommand == "get" || sCommand == "list") { - CTable Table; - Table.AddColumn(t_s("Setting")); - Table.AddColumn(t_s("Value")); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "Username"); - Table.SetCell(t_s("Value"), m_sUsername); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "Password"); - Table.SetCell(t_s("Value"), "*****"); // m_sPassword - Table.AddRow(); - Table.SetCell(t_s("Setting"), "UseCloakedHost"); - Table.SetCell(t_s("Value"), CString(m_bUseCloakedHost)); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "UseChallenge"); - Table.SetCell(t_s("Value"), CString(m_bUseChallenge)); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "RequestPerms"); - Table.SetCell(t_s("Value"), CString(m_bRequestPerms)); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "JoinOnInvite"); - Table.SetCell(t_s("Value"), CString(m_bJoinOnInvite)); - Table.AddRow(); - Table.SetCell(t_s("Setting"), "JoinAfterCloaked"); - Table.SetCell(t_s("Value"), CString(m_bJoinAfterCloaked)); - PutModule(Table); - - } else if (sCommand == "status") { - PutModule(IsIRCConnected() ? t_s("Connected: yes") - : t_s("Connected: no")); - PutModule(m_bCloaked ? t_s("Cloacked: yes") : t_s("Cloacked: no")); - PutModule(m_bAuthed ? t_s("Authenticated: yes") - : t_s("Authenticated: no")); - - } else { - // The following commands require an IRC connection. - if (!IsIRCConnected()) { - PutModule(t_s("Error: You are not connected to IRC.")); - return; - } - - if (sCommand == "cloak") { - if (!m_bCloaked) - Cloak(); - else - PutModule(t_s("Error: You are already cloaked!")); - - } else if (sCommand == "auth") { - if (!m_bAuthed) - Auth(sLine.Token(1), sLine.Token(2)); - else - PutModule(t_s("Error: You are already authed!")); - - } else if (sCommand == "update") { - WhoAmI(); - PutModule(t_s("Update requested.")); - - } else { - PutModule(t_s("Unknown command. Try 'help'.")); - } - } - } - - EModRet OnRaw(CString& sLine) override { - // use OnRaw because OnUserMode is not defined (yet?) - if (sLine.Token(1) == "396" && - sLine.Token(3).find("users.quakenet.org") != CString::npos) { - m_bCloaked = true; - PutModule(t_s("Cloak successful: Your hostname is now cloaked.")); - - // Join channels immediately after our spoof is set, but only if - // both UseCloakedHost and JoinAfterCloaked is enabled. See #602. - if (m_bJoinAfterCloaked) { - GetNetwork()->JoinChans(); - } - } - return CONTINUE; - } - - EModRet OnPrivMsg(CNick& Nick, CString& sMessage) override { - return HandleMessage(Nick, sMessage); - } - - EModRet OnPrivNotice(CNick& Nick, CString& sMessage) override { - return HandleMessage(Nick, sMessage); - } - - EModRet OnJoining(CChan& Channel) override { - // Halt if are not already cloaked, but the user requres that we delay - // channel join till after we are cloaked. - if (!m_bCloaked && m_bUseCloakedHost && m_bJoinAfterCloaked) - return HALT; - - return CONTINUE; - } - - void OnJoin(const CNick& Nick, CChan& Channel) override { - if (m_bRequestPerms && IsSelf(Nick)) HandleNeed(Channel, "ov"); - } - - void OnDeop2(const CNick* pOpNick, const CNick& Nick, CChan& Channel, - bool bNoChange) override { - if (m_bRequestPerms && IsSelf(Nick) && (!pOpNick || !IsSelf(*pOpNick))) - HandleNeed(Channel, "o"); - } - - void OnDevoice2(const CNick* pOpNick, const CNick& Nick, CChan& Channel, - bool bNoChange) override { - if (m_bRequestPerms && IsSelf(Nick) && (!pOpNick || !IsSelf(*pOpNick))) - HandleNeed(Channel, "v"); - } - - EModRet OnInvite(const CNick& Nick, const CString& sChan) override { - if (!Nick.NickEquals("Q") || - !Nick.GetHost().Equals("CServe.quakenet.org")) - return CONTINUE; - if (m_bJoinOnInvite) GetNetwork()->AddChan(sChan, false); - return CONTINUE; - } - - CString GetWebMenuTitle() override { return "Q"; } - - bool OnWebRequest(CWebSock& WebSock, const CString& sPageName, - CTemplate& Tmpl) override { - if (sPageName == "index") { - bool bSubmitted = (WebSock.GetParam("submitted").ToInt() != 0); - - if (bSubmitted) { - CString FormUsername = WebSock.GetParam("user"); - if (!FormUsername.empty()) SetUsername(FormUsername); - - CString FormPassword = WebSock.GetParam("password"); - if (!FormPassword.empty()) SetPassword(FormPassword); - - SetUseCloakedHost(WebSock.GetParam("usecloakedhost").ToBool()); - SetUseChallenge(WebSock.GetParam("usechallenge").ToBool()); - SetRequestPerms(WebSock.GetParam("requestperms").ToBool()); - SetJoinOnInvite(WebSock.GetParam("joinoninvite").ToBool()); - SetJoinAfterCloaked( - WebSock.GetParam("joinaftercloaked").ToBool()); - } - - Tmpl["Username"] = m_sUsername; - - CTemplate& o1 = Tmpl.AddRow("OptionLoop"); - o1["Name"] = "usecloakedhost"; - o1["DisplayName"] = "UseCloakedHost"; - o1["Tooltip"] = - t_s("Whether to cloak your hostname (+x) automatically on " - "connect."); - o1["Checked"] = CString(m_bUseCloakedHost); - - CTemplate& o2 = Tmpl.AddRow("OptionLoop"); - o2["Name"] = "usechallenge"; - o2["DisplayName"] = "UseChallenge"; - o2["Tooltip"] = - t_s("Whether to use the CHALLENGEAUTH mechanism to avoid " - "sending passwords in cleartext."); - o2["Checked"] = CString(m_bUseChallenge); - - CTemplate& o3 = Tmpl.AddRow("OptionLoop"); - o3["Name"] = "requestperms"; - o3["DisplayName"] = "RequestPerms"; - o3["Tooltip"] = - t_s("Whether to request voice/op from Q on join/devoice/deop."); - o3["Checked"] = CString(m_bRequestPerms); - - CTemplate& o4 = Tmpl.AddRow("OptionLoop"); - o4["Name"] = "joinoninvite"; - o4["DisplayName"] = "JoinOnInvite"; - o4["Tooltip"] = t_s("Whether to join channels when Q invites you."); - o4["Checked"] = CString(m_bJoinOnInvite); - - CTemplate& o5 = Tmpl.AddRow("OptionLoop"); - o5["Name"] = "joinaftercloaked"; - o5["DisplayName"] = "JoinAfterCloaked"; - o5["Tooltip"] = - t_s("Whether to delay joining channels until after you are " - "cloaked."); - o5["Checked"] = CString(m_bJoinAfterCloaked); - - if (bSubmitted) { - WebSock.GetSession()->AddSuccess( - t_s("Changes have been saved!")); - } - - return true; - } - - return false; - } - - private: - bool m_bCloaked{}; - bool m_bAuthed{}; - bool m_bRequestedWhoami{}; - bool m_bRequestedChallenge{}; - bool m_bCatchResponse{}; - MCString m_msChanModes; - - void PutQ(const CString& sMessage) { - PutIRC("PRIVMSG Q@CServe.quakenet.org :" + sMessage); -#if Q_DEBUG_COMMUNICATION - PutModule("[ZNC --> Q] " + sMessage); -#endif - } - - void Cloak() { - if (m_bCloaked) return; - - PutModule(t_s("Cloak: Trying to cloak your hostname, setting +x...")); - PutIRC("MODE " + GetNetwork()->GetIRCSock()->GetNick() + " +x"); - } - - void WhoAmI() { - m_bRequestedWhoami = true; - PutQ("WHOAMI"); - } - - void Auth(const CString& sUsername = "", const CString& sPassword = "") { - if (m_bAuthed) return; - - if (!sUsername.empty()) SetUsername(sUsername); - if (!sPassword.empty()) SetPassword(sPassword); - - if (m_sUsername.empty() || m_sPassword.empty()) { - PutModule( - t_s("You have to set a username and password to use this " - "module! See 'help' for details.")); - return; - } - - if (m_bUseChallenge) { - PutModule(t_s("Auth: Requesting CHALLENGE...")); - m_bRequestedChallenge = true; - PutQ("CHALLENGE"); - } else { - PutModule(t_s("Auth: Sending AUTH request...")); - PutQ("AUTH " + m_sUsername + " " + m_sPassword); - } - } - - void ChallengeAuth(CString sChallenge) { - if (m_bAuthed) return; - - CString sUsername = m_sUsername.AsLower() - .Replace_n("[", "{") - .Replace_n("]", "}") - .Replace_n("\\", "|"); - CString sPasswordHash = m_sPassword.Left(10).SHA256(); - CString sKey = CString(sUsername + ":" + sPasswordHash).SHA256(); - CString sResponse = HMAC_SHA256(sKey, sChallenge); - - PutModule( - t_s("Auth: Received challenge, sending CHALLENGEAUTH request...")); - PutQ("CHALLENGEAUTH " + m_sUsername + " " + sResponse + - " HMAC-SHA-256"); - } - - EModRet HandleMessage(const CNick& Nick, CString sMessage) { - if (!Nick.NickEquals("Q") || - !Nick.GetHost().Equals("CServe.quakenet.org")) - return CONTINUE; - - sMessage.Trim(); - -#if Q_DEBUG_COMMUNICATION - PutModule("[ZNC <-- Q] " + sMessage); -#endif - - // WHOAMI - if (sMessage.find("WHOAMI is only available to authed users") != - CString::npos) { - m_bAuthed = false; - Auth(); - m_bCatchResponse = m_bRequestedWhoami; - } else if (sMessage.find("Information for user") != CString::npos) { - m_bAuthed = true; - m_msChanModes.clear(); - m_bCatchResponse = m_bRequestedWhoami; - m_bRequestedWhoami = true; - } else if (m_bRequestedWhoami && sMessage.WildCmp("#*")) { - CString sChannel = sMessage.Token(0); - CString sFlags = sMessage.Token(1, true).Trim_n().TrimLeft_n("+"); - m_msChanModes[sChannel] = sFlags; - } else if (m_bRequestedWhoami && m_bCatchResponse && - (sMessage.Equals("End of list.") || - sMessage.Equals( - "account, or HELLO to create an account."))) { - m_bRequestedWhoami = m_bCatchResponse = false; - return HALT; - } - - // AUTH - else if (sMessage.Equals("Username or password incorrect.")) { - m_bAuthed = false; - PutModule(t_f("Authentication failed: {1}")(sMessage)); - return HALT; - } else if (sMessage.WildCmp("You are now logged in as *.")) { - m_bAuthed = true; - PutModule(t_f("Authentication successful: {1}")(sMessage)); - WhoAmI(); - return HALT; - } else if (m_bRequestedChallenge && - sMessage.Token(0).Equals("CHALLENGE")) { - m_bRequestedChallenge = false; - if (sMessage.find("not available once you have authed") != - CString::npos) { - m_bAuthed = true; - } else { - if (sMessage.find("HMAC-SHA-256") != CString::npos) { - ChallengeAuth(sMessage.Token(1)); - } else { - PutModule( - t_s("Auth failed: Q does not support HMAC-SHA-256 for " - "CHALLENGEAUTH, falling back to standard AUTH.")); - SetUseChallenge(false); - Auth(); - } - } - return HALT; - } - - // prevent buffering of Q's responses - return !m_bCatchResponse && GetUser()->IsUserAttached() ? CONTINUE - : HALT; - } - - void HandleNeed(const CChan& Channel, const CString& sPerms) { - MCString::iterator it = m_msChanModes.find(Channel.GetName()); - if (it == m_msChanModes.end()) return; - CString sModes = it->second; - - bool bMaster = (sModes.find("m") != CString::npos) || - (sModes.find("n") != CString::npos); - - if (sPerms.find("o") != CString::npos) { - bool bOp = (sModes.find("o") != CString::npos); - bool bAutoOp = (sModes.find("a") != CString::npos); - if (bMaster || bOp) { - if (!bAutoOp) { - PutModule(t_f("RequestPerms: Requesting op on {1}")( - Channel.GetName())); - PutQ("OP " + Channel.GetName()); - } - return; - } - } - - if (sPerms.find("v") != CString::npos) { - bool bVoice = (sModes.find("v") != CString::npos); - bool bAutoVoice = (sModes.find("g") != CString::npos); - if (bMaster || bVoice) { - if (!bAutoVoice) { - PutModule(t_f("RequestPerms: Requesting voice on {1}")( - Channel.GetName())); - PutQ("VOICE " + Channel.GetName()); - } - return; - } - } - } - - /* Utility Functions */ - bool IsIRCConnected() { - CIRCSock* pIRCSock = GetNetwork()->GetIRCSock(); - return pIRCSock && pIRCSock->IsAuthed(); - } - - bool IsSelf(const CNick& Nick) { - return Nick.NickEquals(GetNetwork()->GetCurNick()); - } - - bool PackHex(const CString& sHex, CString& sPackedHex) { - if (sHex.length() % 2) return false; - - sPackedHex.clear(); - - CString::size_type len = sHex.length() / 2; - for (CString::size_type i = 0; i < len; i++) { - unsigned int value; - int n = sscanf(&sHex[i * 2], "%02x", &value); - if (n != 1 || value > 0xff) return false; - sPackedHex += (unsigned char)value; - } - - return true; - } - - CString HMAC_SHA256(const CString& sKey, const CString& sData) { - CString sRealKey; - if (sKey.length() > 64) - PackHex(sKey.SHA256(), sRealKey); - else - sRealKey = sKey; - - CString sOuterKey, sInnerKey; - CString::size_type iKeyLength = sRealKey.length(); - for (unsigned int i = 0; i < 64; i++) { - char r = (i < iKeyLength ? sRealKey[i] : '\0'); - sOuterKey += r ^ 0x5c; - sInnerKey += r ^ 0x36; - } - - CString sInnerHash; - PackHex(CString(sInnerKey + sData).SHA256(), sInnerHash); - return CString(sOuterKey + sInnerHash).SHA256(); - } - - /* Settings */ - CString m_sUsername; - CString m_sPassword; - bool m_bUseCloakedHost{}; - bool m_bUseChallenge{}; - bool m_bRequestPerms{}; - bool m_bJoinOnInvite{}; - bool m_bJoinAfterCloaked{}; - - void SetUsername(const CString& sUsername) { - m_sUsername = sUsername; - SetNV("Username", sUsername); - } - - void SetPassword(const CString& sPassword) { - m_sPassword = sPassword; - SetNV("Password", sPassword); - } - - void SetUseCloakedHost(const bool bUseCloakedHost) { - m_bUseCloakedHost = bUseCloakedHost; - SetNV("UseCloakedHost", CString(bUseCloakedHost)); - - if (!m_bCloaked && m_bUseCloakedHost && IsIRCConnected()) Cloak(); - } - - void SetUseChallenge(const bool bUseChallenge) { - m_bUseChallenge = bUseChallenge; - SetNV("UseChallenge", CString(bUseChallenge)); - } - - void SetRequestPerms(const bool bRequestPerms) { - m_bRequestPerms = bRequestPerms; - SetNV("RequestPerms", CString(bRequestPerms)); - } - - void SetJoinOnInvite(const bool bJoinOnInvite) { - m_bJoinOnInvite = bJoinOnInvite; - SetNV("JoinOnInvite", CString(bJoinOnInvite)); - } - - void SetJoinAfterCloaked(const bool bJoinAfterCloaked) { - m_bJoinAfterCloaked = bJoinAfterCloaked; - SetNV("JoinAfterCloaked", CString(bJoinAfterCloaked)); - } -}; - -template <> -void TModInfo(CModInfo& Info) { - Info.SetWikiPage("Q"); - Info.SetHasArgs(true); - Info.SetArgsHelpText( - Info.t_s("Please provide your username and password for Q.")); -} - -NETWORKMODULEDEFS(CQModule, t_s("Auths you with QuakeNet's Q bot.")) diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index 3872ace9..ee6d468b 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -456,6 +456,20 @@ bool CIRCNetwork::ParseConfig(CConfig* pConfig, CString& sError, bool bModRet = LoadModule(sModName, sArgs, sNotice, sModRet); if (!bModRet) { + // Q is removed in znc 1.8 + if (sModName == "q") { + CUtils::PrintError( + "NOTICE: [q] is unavailable, cannot load."); + CUtils::PrintError( + "NOTICE: [q] is removed in this release of ZNC. Please " + "either remove it from your config or install it as a " + "third party module with the same name."); + CUtils::PrintError( + "NOTICE: More info can be found on " + "https://wiki.znc.in/Q"); + return false; + } + // XXX The awaynick module was retired in 1.6 (still available // as external module) if (sModName == "awaynick") { From d7c5eecfe5cf35fa40c3a36ba34a5a359465a7de Mon Sep 17 00:00:00 2001 From: "MalaGaM @ ARTiSPRETiS" Date: Sun, 19 May 2019 09:33:23 +0200 Subject: [PATCH 2/6] =?UTF-8?q?Update=20modtcl=20->=20adding=20GetServerNa?= =?UTF-8?q?me=20function=20and=20network=20varia=E2=80=A6=20(#1658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update modtcl -> adding GetServerName function and network variable with network name value. Modification to have the variable ::network such as an eggdrop. Example usage: return $network <*modtcl> artis return $::network <*modtcl> artis return [GetServerName] <*modtcl> artis --- modules/modtcl.cpp | 9 +++++++++ modules/modtcl/modtcl.tcl | 1 + 2 files changed, 10 insertions(+) diff --git a/modules/modtcl.cpp b/modules/modtcl.cpp index 8a3452d3..4f3900b7 100644 --- a/modules/modtcl.cpp +++ b/modules/modtcl.cpp @@ -116,6 +116,8 @@ class CModTcl : public CModule { Tcl_CreateCommand(interp, "GetCurNick", tcl_GetCurNick, this, nullptr); Tcl_CreateCommand(interp, "GetUsername", tcl_GetUsername, this, nullptr); + Tcl_CreateCommand(interp, "GetNetworkName", tcl_GetNetworkName, this, + nullptr); Tcl_CreateCommand(interp, "GetRealName", tcl_GetRealName, this, nullptr); Tcl_CreateCommand(interp, "GetVHost", tcl_GetBindHost, this, nullptr); @@ -305,6 +307,13 @@ class CModTcl : public CModule { return TCL_OK; } + static int tcl_GetNetworkName STDVAR { + CModTcl* mod = static_cast(cd); + Tcl_SetResult(irp, (char*)mod->GetNetwork()->GetName().c_str(), + TCL_VOLATILE); + return TCL_OK; + } + static int tcl_GetRealName STDVAR { CModTcl* mod = static_cast(cd); Tcl_SetResult(irp, (char*)mod->GetUser()->GetRealName().c_str(), diff --git a/modules/modtcl/modtcl.tcl b/modules/modtcl/modtcl.tcl index 06d0e3ea..e3f24438 100644 --- a/modules/modtcl/modtcl.tcl +++ b/modules/modtcl/modtcl.tcl @@ -34,6 +34,7 @@ set ::botnet-nick ZNC_[GetUsername] set ::botnick [GetCurNick] set ::server [GetServer] set ::server-online [expr [GetServerOnline] / 1000] +set ::network [GetNetworkName] # add some eggdrop style procs proc putlog message {PutModule $message} From 3988cfef98b70924984d6ba402402059a6ec2165 Mon Sep 17 00:00:00 2001 From: girst Date: Sun, 21 Apr 2019 17:21:24 +0200 Subject: [PATCH 3/6] ListStyle (compact) replacement for two-column tables by calling CTable::SetStyle(CTable::ListStyle) one can switch from the bulky and unreadable-on-narrow-devices-or-nonmonospaced-fonts tables to a more compact list style of output. The first "column" will be bolded for better visibility and seperated with a colon from the second. This is currently designed to replace two column tables only. --- include/znc/Utils.h | 29 +++++++++++++++++++++++++++-- src/ClientCommand.cpp | 4 +++- src/Utils.cpp | 29 +++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/include/znc/Utils.h b/include/znc/Utils.h index c2a06a66..76f3717f 100644 --- a/include/znc/Utils.h +++ b/include/znc/Utils.h @@ -128,7 +128,7 @@ class CException { }; -/** Generate a grid-like output from a given input. +/** Generate a grid-like or list-like output from a given input. * * @code * CTable table; @@ -152,9 +152,25 @@ class CException { +-------+-------+ | hello | world | +-------+-------+@endverbatim + * + * If the table has at most two columns, one can switch to ListStyle output + * like so: + * @code + * CTable table; + * table.AddColumn("a"); + * table.AddColumn("b"); + * table.SetStyle(CTable::ListStyle); + * // ... + * @endcode + * + * This will yield the following (Note that the header is omitted; asterisks + * denote bold text): + * @verbatim +*hello*: world@endverbatim */ class CTable : protected std::vector> { public: + enum EStyle { GridStyle, ListStyle }; CTable() {} virtual ~CTable() {} @@ -162,10 +178,18 @@ class CTable : protected std::vector> { * Please note that you should add all columns before starting to fill * the table! * @param sName The name of the column. - * @return false if a column by that name already existed. + * @return false if a column by that name already existed or the current + * style does not allow this many columns. */ bool AddColumn(const CString& sName); + /** Selects the output style of the table. + * Select between different styles for printing. Default is GridStyle. + * @param eNewStyle Table style type. + * @return false if the style cannot be applied (usually too many columns). + */ + bool SetStyle(EStyle eNewStyle); + /** Adds a new row to the table. * After calling this you can fill the row with content. * @return The index of this row @@ -213,6 +237,7 @@ class CTable : protected std::vector> { std::vector m_vsHeaders; // Used to cache the width of a column std::map m_msuWidths; + EStyle eStyle = GridStyle; }; #ifdef HAVE_LIBSSL diff --git a/src/ClientCommand.cpp b/src/ClientCommand.cpp index f49cdacf..d0d8518d 100644 --- a/src/ClientCommand.cpp +++ b/src/ClientCommand.cpp @@ -1658,6 +1658,7 @@ void CClient::HelpUser(const CString& sFilter) { CTable Table; Table.AddColumn(t_s("Command", "helpcmd")); Table.AddColumn(t_s("Description", "helpcmd")); + Table.SetStyle(CTable::ListStyle); if (sFilter.empty()) { PutStatus( @@ -1670,7 +1671,8 @@ void CClient::HelpUser(const CString& sFilter) { if (sFilter.empty() || sCmd.StartsWith(sFilter) || sCmd.AsLower().WildCmp(sFilter.AsLower())) { Table.AddRow(); - Table.SetCell(t_s("Command", "helpcmd"), sCmd + " " + sArgs); + Table.SetCell(t_s("Command", "helpcmd"), + sCmd + (sArgs.empty() ? "" : " ") + sArgs); Table.SetCell(t_s("Description", "helpcmd"), sDesc); } }; diff --git a/src/Utils.cpp b/src/Utils.cpp index 29d28858..a5a6c9ba 100644 --- a/src/Utils.cpp +++ b/src/Utils.cpp @@ -760,6 +760,8 @@ void CUtils::SetMessageTags(CString& sLine, const MCString& mssTags) { } bool CTable::AddColumn(const CString& sName) { + if (eStyle == ListStyle && m_vsHeaders.size() >= 2) + return false; for (const CString& sHeader : m_vsHeaders) { if (sHeader.Equals(sName)) { return false; @@ -772,6 +774,19 @@ bool CTable::AddColumn(const CString& sName) { return true; } +bool CTable::SetStyle(EStyle eNewStyle) { + switch (eNewStyle) { + case GridStyle: + break; + case ListStyle: + if (m_vsHeaders.size() > 2) return false; + break; + } + + eStyle = eNewStyle; + return true; +} + CTable::size_type CTable::AddRow() { // Don't add a row if no headers are defined if (m_vsHeaders.empty()) { @@ -812,6 +827,20 @@ bool CTable::GetLine(unsigned int uIdx, CString& sLine) const { return false; } + if (eStyle == ListStyle) { + if (m_vsHeaders.size() > 2) return false; // definition list mode can only do up to two columns + if (uIdx >= size()) return false; + + const std::vector& mRow = (*this)[uIdx]; + ssRet << "\x02" << mRow[0] << "\x0f"; //bold first column + if (m_vsHeaders.size() >= 2 && mRow[1] != "") { + ssRet << ": " << mRow[1]; + } + + sLine = ssRet.str(); + return true; + } + if (uIdx == 1) { ssRet.fill(' '); ssRet << "| "; From 51f15d5baced16b7cf4239cc9aec51cee4a371b6 Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Tue, 14 May 2019 07:53:38 -0700 Subject: [PATCH 4/6] route_replies: Update to support freenode --- modules/route_replies.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/route_replies.cpp b/modules/route_replies.cpp index c6eabafd..7d2f71a6 100644 --- a/modules/route_replies.cpp +++ b/modules/route_replies.cpp @@ -25,7 +25,7 @@ struct reply { // TODO this list is far from complete, no errors are handled static const struct { const char* szRequest; - struct reply vReplies[19]; + struct reply vReplies[20]; } vRouteReplies[] = { {"WHO", {{"402", true}, /* rfc1459 ERR_NOSUCHSERVER */ @@ -65,11 +65,12 @@ static const struct { {"313", false}, /* rfc1459 RPL_WHOISOPERATOR */ {"317", false}, /* rfc1459 RPL_WHOISIDLE */ {"319", false}, /* rfc1459 RPL_WHOISCHANNELS */ + {"320", false}, /* unreal RPL_WHOISSPECIAL */ {"301", false}, /* rfc1459 RPL_AWAY */ {"276", false}, /* oftc-hybrid RPL_WHOISCERTFP */ {"330", false}, /* ratbox RPL_WHOISLOGGEDIN aka ircu RPL_WHOISACCOUNT */ - {"338", false}, /* RPL_WHOISACTUALLY -- "actually using host" */ + {"338", false}, /* ircu RPL_WHOISACTUALLY -- "actually using host" */ {"378", false}, /* RPL_WHOISHOST -- real address of vhosts */ {"671", false}, /* RPL_WHOISSECURE */ {"307", false}, /* RPL_WHOISREGNICK */ @@ -97,6 +98,9 @@ static const struct { {{"406", false}, /* rfc1459 ERR_WASNOSUCHNICK */ {"312", false}, /* rfc1459 RPL_WHOISSERVER */ {"314", false}, /* rfc1459 RPL_WHOWASUSER */ + {"330", false}, /* ratbox RPL_WHOISLOGGEDIN + aka ircu RPL_WHOISACCOUNT */ + {"338", false}, /* ircu RPL_WHOISACTUALLY -- "actually using host" */ {"369", true}, /* rfc1459 RPL_ENDOFWHOWAS */ {"431", true}, /* rfc1459 ERR_NONICKNAMEGIVEN */ {nullptr, true}}}, From efa7543dfae663339b1306f143dad7b48b29f85f Mon Sep 17 00:00:00 2001 From: jesopo Date: Wed, 22 May 2019 10:12:10 +0100 Subject: [PATCH 5/6] Support both ERR_NOSUCHNICK and ERR_NOSUCHCHANNEL for *route_replies NAMES --- modules/route_replies.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/route_replies.cpp b/modules/route_replies.cpp index c6eabafd..804caedf 100644 --- a/modules/route_replies.cpp +++ b/modules/route_replies.cpp @@ -44,8 +44,8 @@ static const struct { { {"353", false}, /* rfc1459 RPL_NAMREPLY */ {"366", true}, /* rfc1459 RPL_ENDOFNAMES */ - // No such nick/channel - {"401", true}, + {"401", true}, /* rfc1459 ERR_NOSUCHNICK */ + {"403", true}, /* rfc1459 ERR_NOSUCHCHANNEL */ {nullptr, true}, }}, {"LUSERS", From 05e9675e85468f0ce0501c36dfb7ff049fa43bf7 Mon Sep 17 00:00:00 2001 From: Jos Ahrens Date: Fri, 12 Apr 2019 15:36:07 +0000 Subject: [PATCH 6/6] modules: Remove partyline Fixes #1632 Closes #1301 as wontfix Closes #1058 as wontfix Closes #386 as wontfix Closes #362 as wontfix Closes #302 as wontfix --- modules/partyline.cpp | 739 ---------------------------------- modules/po/partyline.de_DE.po | 41 -- modules/po/partyline.es_ES.po | 41 -- modules/po/partyline.fr_FR.po | 39 -- modules/po/partyline.id_ID.po | 39 -- modules/po/partyline.nl_NL.po | 42 -- modules/po/partyline.pot | 30 -- modules/po/partyline.pt_BR.po | 39 -- modules/po/partyline.ru_RU.po | 41 -- src/IRCNetwork.cpp | 15 + 10 files changed, 15 insertions(+), 1051 deletions(-) delete mode 100644 modules/partyline.cpp delete mode 100644 modules/po/partyline.de_DE.po delete mode 100644 modules/po/partyline.es_ES.po delete mode 100644 modules/po/partyline.fr_FR.po delete mode 100644 modules/po/partyline.id_ID.po delete mode 100644 modules/po/partyline.nl_NL.po delete mode 100644 modules/po/partyline.pot delete mode 100644 modules/po/partyline.pt_BR.po delete mode 100644 modules/po/partyline.ru_RU.po diff --git a/modules/partyline.cpp b/modules/partyline.cpp deleted file mode 100644 index 43bd39ec..00000000 --- a/modules/partyline.cpp +++ /dev/null @@ -1,739 +0,0 @@ -/* - * Copyright (C) 2004-2019 ZNC, see the NOTICE file for details. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -using std::set; -using std::vector; -using std::map; - -// If you change these and it breaks, you get to keep the pieces -#define CHAN_PREFIX_1 "~" -#define CHAN_PREFIX_1C '~' -#define CHAN_PREFIX CHAN_PREFIX_1 "#" - -#define NICK_PREFIX CString("?") -#define NICK_PREFIX_C '?' - -class CPartylineChannel { - public: - CPartylineChannel(const CString& sName) { m_sName = sName.AsLower(); } - ~CPartylineChannel() {} - - const CString& GetTopic() const { return m_sTopic; } - const CString& GetName() const { return m_sName; } - const set& GetNicks() const { return m_ssNicks; } - - void SetTopic(const CString& s) { m_sTopic = s; } - - void AddNick(const CString& s) { m_ssNicks.insert(s); } - void DelNick(const CString& s) { m_ssNicks.erase(s); } - - bool IsInChannel(const CString& s) { - return m_ssNicks.find(s) != m_ssNicks.end(); - } - - protected: - CString m_sTopic; - CString m_sName; - set m_ssNicks; -}; - -class CPartylineMod : public CModule { - public: - void ListChannelsCommand(const CString& sLine) { - if (m_ssChannels.empty()) { - PutModule(t_s("There are no open channels.")); - return; - } - - CTable Table; - - Table.AddColumn(t_s("Channel")); - Table.AddColumn(t_s("Users")); - - for (set::const_iterator a = m_ssChannels.begin(); - a != m_ssChannels.end(); ++a) { - Table.AddRow(); - - Table.SetCell(t_s("Channel"), (*a)->GetName()); - Table.SetCell(t_s("Users"), CString((*a)->GetNicks().size())); - } - - PutModule(Table); - } - - MODCONSTRUCTOR(CPartylineMod) { - AddHelpCommand(); - AddCommand("List", "", t_d("List all open channels"), - [=](const CString& sLine) { ListChannelsCommand(sLine); }); - } - - ~CPartylineMod() override { - // Kick all clients who are in partyline channels - for (set::iterator it = m_ssChannels.begin(); - it != m_ssChannels.end(); ++it) { - set ssNicks = (*it)->GetNicks(); - - for (set::const_iterator it2 = ssNicks.begin(); - it2 != ssNicks.end(); ++it2) { - CUser* pUser = CZNC::Get().FindUser(*it2); - vector vClients = pUser->GetAllClients(); - - for (vector::const_iterator it3 = vClients.begin(); - it3 != vClients.end(); ++it3) { - CClient* pClient = *it3; - pClient->PutClient(":*" + GetModName() + - "!znc@znc.in KICK " + (*it)->GetName() + - " " + pClient->GetNick() + " :" + - GetModName() + " unloaded"); - } - } - } - - while (!m_ssChannels.empty()) { - delete *m_ssChannels.begin(); - m_ssChannels.erase(m_ssChannels.begin()); - } - } - - bool OnBoot() override { - // The config is now read completely, so all Users are set up - Load(); - - return true; - } - - bool OnLoad(const CString& sArgs, CString& sMessage) override { - const map& msUsers = CZNC::Get().GetUserMap(); - - for (map::const_iterator it = msUsers.begin(); - it != msUsers.end(); ++it) { - CUser* pUser = it->second; - for (CClient* pClient : pUser->GetAllClients()) { - CIRCNetwork* pNetwork = pClient->GetNetwork(); - if (!pNetwork || !pNetwork->IsIRCConnected() || - !pNetwork->GetChanPrefixes().Contains(CHAN_PREFIX_1)) { - pClient->PutClient( - ":" + GetIRCServer(pNetwork) + " 005 " + - pClient->GetNick() + " CHANTYPES=" + - (pNetwork ? pNetwork->GetChanPrefixes() : "") + - CHAN_PREFIX_1 " :are supported by this server."); - } - } - } - - VCString vsChans; - VCString::const_iterator it; - sArgs.Split(" ", vsChans, false); - - for (it = vsChans.begin(); it != vsChans.end(); ++it) { - if (it->Left(2) == CHAN_PREFIX) { - m_ssDefaultChans.insert(it->Left(32)); - } - } - - Load(); - - return true; - } - - void Load() { - CString sAction, sKey; - CPartylineChannel* pChannel; - for (MCString::iterator it = BeginNV(); it != EndNV(); ++it) { - if (it->first.find(":") != CString::npos) { - sAction = it->first.Token(0, false, ":"); - sKey = it->first.Token(1, true, ":"); - } else { - // backwards compatibility for older NV data - sAction = "fixedchan"; - sKey = it->first; - } - - if (sAction == "fixedchan") { - // Sorry, this was removed - } - - if (sAction == "topic") { - pChannel = FindChannel(sKey); - if (pChannel && !(it->second).empty()) { - PutChan(pChannel->GetNicks(), ":irc.znc.in TOPIC " + - pChannel->GetName() + - " :" + it->second); - pChannel->SetTopic(it->second); - } - } - } - - return; - } - - void SaveTopic(CPartylineChannel* pChannel) { - if (!pChannel->GetTopic().empty()) - SetNV("topic:" + pChannel->GetName(), pChannel->GetTopic()); - else - DelNV("topic:" + pChannel->GetName()); - } - - EModRet OnDeleteUser(CUser& User) override { - // Loop through each chan - for (set::iterator it = m_ssChannels.begin(); - it != m_ssChannels.end();) { - CPartylineChannel* pChan = *it; - // RemoveUser() might delete channels, so make sure our - // iterator doesn't break. - ++it; - RemoveUser(&User, pChan, "KICK", "User deleted", true); - } - - return CONTINUE; - } - - EModRet OnNumericMessage(CNumericMessage& Msg) override { - if (Msg.GetCode() == 5) { - for (int i = 0; i < Msg.GetParams().size(); ++i) { - if (Msg.GetParams()[i].StartsWith("CHANTYPES=")) { - Msg.SetParam(i, Msg.GetParam(i) + CHAN_PREFIX_1); - m_spInjectedPrefixes.insert(GetNetwork()); - break; - } - } - } - - return CONTINUE; - } - - void OnIRCDisconnected() override { - m_spInjectedPrefixes.erase(GetNetwork()); - } - - void OnClientLogin() override { - CUser* pUser = GetUser(); - CClient* pClient = GetClient(); - CIRCNetwork* pNetwork = GetNetwork(); - if (!pNetwork || !pNetwork->IsIRCConnected()) { - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 005 " + - pClient->GetNick() + " CHANTYPES=" + - CHAN_PREFIX_1 " :are supported by this server."); - } - - // Make sure this user is in the default channels - for (set::iterator a = m_ssDefaultChans.begin(); - a != m_ssDefaultChans.end(); ++a) { - CPartylineChannel* pChannel = GetChannel(*a); - const CString& sNick = pUser->GetUsername(); - - if (pChannel->IsInChannel(sNick)) continue; - - CString sHost = pUser->GetBindHost(); - const set& ssNicks = pChannel->GetNicks(); - - if (sHost.empty()) { - sHost = "znc.in"; - } - PutChan(ssNicks, - ":" + NICK_PREFIX + sNick + "!" + pUser->GetIdent() + "@" + - sHost + " JOIN " + *a, - false); - pChannel->AddNick(sNick); - } - - CString sNickMask = pClient->GetNickMask(); - - for (set::iterator it = m_ssChannels.begin(); - it != m_ssChannels.end(); ++it) { - const set& ssNicks = (*it)->GetNicks(); - - if ((*it)->IsInChannel(pUser->GetUsername())) { - pClient->PutClient(":" + sNickMask + " JOIN " + - (*it)->GetName()); - - if (!(*it)->GetTopic().empty()) { - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 332 " + - pClient->GetNickMask() + " " + - (*it)->GetName() + " :" + - (*it)->GetTopic()); - } - - SendNickList(pUser, pNetwork, ssNicks, (*it)->GetName()); - PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " + - (*it)->GetName() + " +" + - CString(pUser->IsAdmin() ? "o" : "v") + - " " + NICK_PREFIX + pUser->GetUsername(), - false); - } - } - } - - void OnClientDisconnect() override { - CUser* pUser = GetUser(); - if (!pUser->IsUserAttached() && !pUser->IsBeingDeleted()) { - for (set::iterator it = m_ssChannels.begin(); - it != m_ssChannels.end(); ++it) { - const set& ssNicks = (*it)->GetNicks(); - - if (ssNicks.find(pUser->GetUsername()) != ssNicks.end()) { - PutChan(ssNicks, - ":*" + GetModName() + "!znc@znc.in MODE " + - (*it)->GetName() + " -ov " + NICK_PREFIX + - pUser->GetUsername() + " " + NICK_PREFIX + - pUser->GetUsername(), - false); - } - } - } - } - - EModRet OnUserRawMessage(CMessage& Msg) override { - if ((Msg.GetCommand().Equals("WHO") || - Msg.GetCommand().Equals("MODE")) && - Msg.GetParam(0).StartsWith(CHAN_PREFIX_1)) { - return HALT; - } else if (Msg.GetCommand().Equals("TOPIC") && - Msg.GetParam(0).StartsWith(CHAN_PREFIX)) { - const CString sChannel = Msg.As().GetTarget(); - CString sTopic = Msg.As().GetText(); - - sTopic.TrimPrefix(":"); - - CUser* pUser = GetUser(); - CClient* pClient = GetClient(); - CPartylineChannel* pChannel = FindChannel(sChannel); - - if (pChannel && pChannel->IsInChannel(pUser->GetUsername())) { - const set& ssNicks = pChannel->GetNicks(); - if (!sTopic.empty()) { - if (pUser->IsAdmin()) { - PutChan(ssNicks, ":" + pClient->GetNickMask() + - " TOPIC " + sChannel + " :" + - sTopic); - pChannel->SetTopic(sTopic); - SaveTopic(pChannel); - } else { - pUser->PutUser(":irc.znc.in 482 " + pClient->GetNick() + - " " + sChannel + - " :You're not channel operator"); - } - } else { - sTopic = pChannel->GetTopic(); - - if (sTopic.empty()) { - pUser->PutUser(":irc.znc.in 331 " + pClient->GetNick() + - " " + sChannel + " :No topic is set."); - } else { - pUser->PutUser(":irc.znc.in 332 " + pClient->GetNick() + - " " + sChannel + " :" + sTopic); - } - } - } else { - pUser->PutUser(":irc.znc.in 442 " + pClient->GetNick() + " " + - sChannel + " :You're not on that channel"); - } - return HALT; - } - - return CONTINUE; - } - - EModRet OnUserPart(CString& sChannel, CString& sMessage) override { - if (sChannel.Left(1) != CHAN_PREFIX_1) { - return CONTINUE; - } - - if (sChannel.Left(2) != CHAN_PREFIX) { - GetClient()->PutClient(":" + GetIRCServer(GetNetwork()) + " 401 " + - GetClient()->GetNick() + " " + sChannel + - " :No such channel"); - return HALT; - } - - CPartylineChannel* pChannel = FindChannel(sChannel); - - PartUser(GetUser(), pChannel); - - return HALT; - } - - void PartUser(CUser* pUser, CPartylineChannel* pChannel, - const CString& sMessage = "") { - RemoveUser(pUser, pChannel, "PART", sMessage); - } - - void RemoveUser(CUser* pUser, CPartylineChannel* pChannel, - const CString& sCommand, const CString& sMessage = "", - bool bNickAsTarget = false) { - if (!pChannel || !pChannel->IsInChannel(pUser->GetUsername())) { - return; - } - - vector vClients = pUser->GetAllClients(); - - CString sCmd = " " + sCommand + " "; - CString sMsg = sMessage; - if (!sMsg.empty()) sMsg = " :" + sMsg; - - pChannel->DelNick(pUser->GetUsername()); - - const set& ssNicks = pChannel->GetNicks(); - CString sHost = pUser->GetBindHost(); - - if (sHost.empty()) { - sHost = "znc.in"; - } - - if (bNickAsTarget) { - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pClient = *it; - - pClient->PutClient(":" + pClient->GetNickMask() + sCmd + - pChannel->GetName() + " " + - pClient->GetNick() + sMsg); - } - - PutChan(ssNicks, ":" + NICK_PREFIX + pUser->GetUsername() + "!" + - pUser->GetIdent() + "@" + sHost + sCmd + - pChannel->GetName() + " " + NICK_PREFIX + - pUser->GetUsername() + sMsg, - false, true, pUser); - } else { - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pClient = *it; - - pClient->PutClient(":" + pClient->GetNickMask() + sCmd + - pChannel->GetName() + sMsg); - } - - PutChan(ssNicks, ":" + NICK_PREFIX + pUser->GetUsername() + "!" + - pUser->GetIdent() + "@" + sHost + sCmd + - pChannel->GetName() + sMsg, - false, true, pUser); - } - - if (!pUser->IsBeingDeleted() && - m_ssDefaultChans.find(pChannel->GetName()) != - m_ssDefaultChans.end()) { - JoinUser(pUser, pChannel); - } - - if (ssNicks.empty()) { - delete pChannel; - m_ssChannels.erase(pChannel); - } - } - - EModRet OnUserJoin(CString& sChannel, CString& sKey) override { - if (sChannel.Left(1) != CHAN_PREFIX_1) { - return CONTINUE; - } - - if (sChannel.Left(2) != CHAN_PREFIX) { - GetClient()->PutClient(":" + GetIRCServer(GetNetwork()) + " 403 " + - GetClient()->GetNick() + " " + sChannel + - " :Channels look like " CHAN_PREFIX "znc"); - return HALT; - } - - sChannel = sChannel.Left(32); - CPartylineChannel* pChannel = GetChannel(sChannel); - - JoinUser(GetUser(), pChannel); - - return HALT; - } - - void JoinUser(CUser* pUser, CPartylineChannel* pChannel) { - if (pChannel && !pChannel->IsInChannel(pUser->GetUsername())) { - vector vClients = pUser->GetAllClients(); - - const set& ssNicks = pChannel->GetNicks(); - const CString& sNick = pUser->GetUsername(); - pChannel->AddNick(sNick); - - CString sHost = pUser->GetBindHost(); - - if (sHost.empty()) { - sHost = "znc.in"; - } - - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pClient = *it; - pClient->PutClient(":" + pClient->GetNickMask() + " JOIN " + - pChannel->GetName()); - } - - PutChan(ssNicks, - ":" + NICK_PREFIX + sNick + "!" + pUser->GetIdent() + "@" + - sHost + " JOIN " + pChannel->GetName(), - false, true, pUser); - - if (!pChannel->GetTopic().empty()) { - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pClient = *it; - pClient->PutClient( - ":" + GetIRCServer(pClient->GetNetwork()) + " 332 " + - pClient->GetNickMask() + " " + pChannel->GetName() + - " :" + pChannel->GetTopic()); - } - } - - SendNickList(pUser, nullptr, ssNicks, pChannel->GetName()); - - /* Tell the other clients we have op or voice, the current user's - * clients already know from NAMES list */ - - if (pUser->IsAdmin()) { - PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " + - pChannel->GetName() + " +o " + - NICK_PREFIX + pUser->GetUsername(), - false, false, pUser); - } - - PutChan(ssNicks, ":*" + GetModName() + "!znc@znc.in MODE " + - pChannel->GetName() + " +v " + NICK_PREFIX + - pUser->GetUsername(), - false, false, pUser); - } - } - - EModRet HandleMessage(const CString& sCmd, const CString& sTarget, - const CString& sMessage) { - if (sTarget.empty()) { - return CONTINUE; - } - - char cPrefix = sTarget[0]; - - if (cPrefix != CHAN_PREFIX_1C && cPrefix != NICK_PREFIX_C) { - return CONTINUE; - } - - CUser* pUser = GetUser(); - CClient* pClient = GetClient(); - CIRCNetwork* pNetwork = GetNetwork(); - CString sHost = pUser->GetBindHost(); - - if (sHost.empty()) { - sHost = "znc.in"; - } - - if (cPrefix == CHAN_PREFIX_1C) { - if (FindChannel(sTarget) == nullptr) { - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " + - pClient->GetNick() + " " + sTarget + - " :No such channel"); - return HALT; - } - - PutChan(sTarget, ":" + NICK_PREFIX + pUser->GetUsername() + "!" + - pUser->GetIdent() + "@" + sHost + " " + sCmd + - " " + sTarget + " :" + sMessage, - true, false); - } else { - CString sNick = sTarget.LeftChomp_n(1); - CUser* pTargetUser = CZNC::Get().FindUser(sNick); - - if (pTargetUser) { - vector vClients = pTargetUser->GetAllClients(); - - if (vClients.empty()) { - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " + - pClient->GetNick() + " " + sTarget + - " :User is not attached: " + sNick + ""); - return HALT; - } - - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pTarget = *it; - - pTarget->PutClient( - ":" + NICK_PREFIX + pUser->GetUsername() + "!" + - pUser->GetIdent() + "@" + sHost + " " + sCmd + " " + - pTarget->GetNick() + " :" + sMessage); - } - } else { - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 401 " + - pClient->GetNick() + " " + sTarget + - " :No such znc user: " + sNick + ""); - } - } - - return HALT; - } - - EModRet OnUserMsg(CString& sTarget, CString& sMessage) override { - return HandleMessage("PRIVMSG", sTarget, sMessage); - } - - EModRet OnUserNotice(CString& sTarget, CString& sMessage) override { - return HandleMessage("NOTICE", sTarget, sMessage); - } - - EModRet OnUserCTCP(CString& sTarget, CString& sMessage) override { - return HandleMessage("PRIVMSG", sTarget, "\001" + sMessage + "\001"); - } - - EModRet OnUserCTCPReply(CString& sTarget, CString& sMessage) override { - return HandleMessage("NOTICE", sTarget, "\001" + sMessage + "\001"); - } - - const CString GetIRCServer(CIRCNetwork* pNetwork) { - if (!pNetwork) { - return "irc.znc.in"; - } - - const CString& sServer = pNetwork->GetIRCServer(); - if (!sServer.empty()) return sServer; - return "irc.znc.in"; - } - - bool PutChan(const CString& sChan, const CString& sLine, - bool bIncludeCurUser = true, bool bIncludeClient = true, - CUser* pUser = nullptr, CClient* pClient = nullptr) { - CPartylineChannel* pChannel = FindChannel(sChan); - - if (pChannel != nullptr) { - PutChan(pChannel->GetNicks(), sLine, bIncludeCurUser, - bIncludeClient, pUser, pClient); - return true; - } - - return false; - } - - void PutChan(const set& ssNicks, const CString& sLine, - bool bIncludeCurUser = true, bool bIncludeClient = true, - CUser* pUser = nullptr, CClient* pClient = nullptr) { - const map& msUsers = CZNC::Get().GetUserMap(); - - if (!pUser) pUser = GetUser(); - if (!pClient) pClient = GetClient(); - - for (map::const_iterator it = msUsers.begin(); - it != msUsers.end(); ++it) { - if (ssNicks.find(it->first) != ssNicks.end()) { - if (it->second == pUser) { - if (bIncludeCurUser) { - it->second->PutAllUser( - sLine, nullptr, - (bIncludeClient ? nullptr : pClient)); - } - } else { - it->second->PutAllUser(sLine); - } - } - } - } - - void PutUserIRCNick(CUser* pUser, const CString& sPre, - const CString& sPost) { - const vector& vClients = pUser->GetAllClients(); - vector::const_iterator it; - for (it = vClients.begin(); it != vClients.end(); ++it) { - (*it)->PutClient(sPre + (*it)->GetNick() + sPost); - } - } - - void SendNickList(CUser* pUser, CIRCNetwork* pNetwork, - const set& ssNicks, const CString& sChan) { - CString sNickList; - - for (set::const_iterator it = ssNicks.begin(); - it != ssNicks.end(); ++it) { - CUser* pChanUser = CZNC::Get().FindUser(*it); - - if (pChanUser == pUser) { - continue; - } - - if (pChanUser && pChanUser->IsUserAttached()) { - sNickList += (pChanUser->IsAdmin()) ? "@" : "+"; - } - - sNickList += NICK_PREFIX + (*it) + " "; - - if (sNickList.size() >= 500) { - PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 353 ", - " @ " + sChan + " :" + sNickList); - sNickList.clear(); - } - } - - if (sNickList.size()) { - PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 353 ", - " @ " + sChan + " :" + sNickList); - } - - vector vClients = pUser->GetAllClients(); - for (vector::const_iterator it = vClients.begin(); - it != vClients.end(); ++it) { - CClient* pClient = *it; - pClient->PutClient(":" + GetIRCServer(pNetwork) + " 353 " + - pClient->GetNick() + " @ " + sChan + " :" + - ((pUser->IsAdmin()) ? "@" : "+") + - pClient->GetNick()); - } - - PutUserIRCNick(pUser, ":" + GetIRCServer(pNetwork) + " 366 ", - " " + sChan + " :End of /NAMES list."); - } - - CPartylineChannel* FindChannel(const CString& sChan) { - CString sChannel = sChan.AsLower(); - - for (set::iterator it = m_ssChannels.begin(); - it != m_ssChannels.end(); ++it) { - if ((*it)->GetName().AsLower() == sChannel) return *it; - } - - return nullptr; - } - - CPartylineChannel* GetChannel(const CString& sChannel) { - CPartylineChannel* pChannel = FindChannel(sChannel); - - if (!pChannel) { - pChannel = new CPartylineChannel(sChannel.AsLower()); - m_ssChannels.insert(pChannel); - } - - return pChannel; - } - - private: - set m_ssChannels; - set m_spInjectedPrefixes; - set m_ssDefaultChans; -}; - -template <> -void TModInfo(CModInfo& Info) { - Info.SetWikiPage("partyline"); - Info.SetHasArgs(true); - Info.SetArgsHelpText( - Info.t_s("You may enter a list of channels the user joins, when " - "entering the internal partyline.")); -} - -GLOBALMODULEDEFS( - CPartylineMod, - t_s("Internal channels and queries for users connected to ZNC")) diff --git a/modules/po/partyline.de_DE.po b/modules/po/partyline.de_DE.po deleted file mode 100644 index ab582ac8..00000000 --- a/modules/po/partyline.de_DE.po +++ /dev/null @@ -1,41 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: de\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: German\n" -"Language: de_DE\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "Es gibt keine offenen Kanäle." - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "Kanal" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "Benutzer" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "Liste alle offenen Kanäle auf" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" -"Du kannst eine Liste von Kanälen angeben, die der Benutzer betritt, wenn er " -"die interne Partyline betritt." - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "Interne Kanäle und Queries für mit ZNC verbundene Benutzer" diff --git a/modules/po/partyline.es_ES.po b/modules/po/partyline.es_ES.po deleted file mode 100644 index e008a9ca..00000000 --- a/modules/po/partyline.es_ES.po +++ /dev/null @@ -1,41 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: es-ES\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Spanish\n" -"Language: es_ES\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "No hay canales abiertos." - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "Canal" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "Usuarios" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "Mostrar canales abiertos" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" -"Puedes añadir una lista de canales a los que el usuario se meterá cuando se " -"conecte a la partyline." - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "Privados y canales internos para usuarios conectados a ZNC" diff --git a/modules/po/partyline.fr_FR.po b/modules/po/partyline.fr_FR.po deleted file mode 100644 index e7d3a655..00000000 --- a/modules/po/partyline.fr_FR.po +++ /dev/null @@ -1,39 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: fr\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: French\n" -"Language: fr_FR\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "" - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" diff --git a/modules/po/partyline.id_ID.po b/modules/po/partyline.id_ID.po deleted file mode 100644 index 2d324007..00000000 --- a/modules/po/partyline.id_ID.po +++ /dev/null @@ -1,39 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: id\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Indonesian\n" -"Language: id_ID\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "" - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" diff --git a/modules/po/partyline.nl_NL.po b/modules/po/partyline.nl_NL.po deleted file mode 100644 index a5011e22..00000000 --- a/modules/po/partyline.nl_NL.po +++ /dev/null @@ -1,42 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: nl\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Dutch\n" -"Language: nl_NL\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "Er zijn geen open kanalen." - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "Kanaal" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "Gebruikers" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "Laat alle open kanalen zien" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" -"Je mag een lijst van kanalen toevoegen wanneer een gebruiker toetreed tot de " -"interne partijlijn." - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" -"Interne kanalen en privé berichten voor gebruikers die verbonden zijn met ZNC" diff --git a/modules/po/partyline.pot b/modules/po/partyline.pot deleted file mode 100644 index adb499e1..00000000 --- a/modules/po/partyline.pot +++ /dev/null @@ -1,30 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "" - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" diff --git a/modules/po/partyline.pt_BR.po b/modules/po/partyline.pt_BR.po deleted file mode 100644 index c65d3875..00000000 --- a/modules/po/partyline.pt_BR.po +++ /dev/null @@ -1,39 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: pt-BR\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Portuguese, Brazilian\n" -"Language: pt_BR\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "" - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" diff --git a/modules/po/partyline.ru_RU.po b/modules/po/partyline.ru_RU.po deleted file mode 100644 index 56ceac06..00000000 --- a/modules/po/partyline.ru_RU.po +++ /dev/null @@ -1,41 +0,0 @@ -msgid "" -msgstr "" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 " -"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 " -"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n" -"X-Generator: crowdin.com\n" -"X-Crowdin-Project: znc-bouncer\n" -"X-Crowdin-Language: ru\n" -"X-Crowdin-File: /master/modules/po/partyline.pot\n" -"Project-Id-Version: znc-bouncer\n" -"Last-Translator: DarthGandalf \n" -"Language-Team: Russian\n" -"Language: ru_RU\n" - -#: partyline.cpp:60 -msgid "There are no open channels." -msgstr "" - -#: partyline.cpp:66 partyline.cpp:73 -msgid "Channel" -msgstr "" - -#: partyline.cpp:67 partyline.cpp:74 -msgid "Users" -msgstr "" - -#: partyline.cpp:82 -msgid "List all open channels" -msgstr "" - -#: partyline.cpp:733 -msgid "" -"You may enter a list of channels the user joins, when entering the internal " -"partyline." -msgstr "" - -#: partyline.cpp:739 -msgid "Internal channels and queries for users connected to ZNC" -msgstr "" diff --git a/src/IRCNetwork.cpp b/src/IRCNetwork.cpp index ee6d468b..6d5df0af 100644 --- a/src/IRCNetwork.cpp +++ b/src/IRCNetwork.cpp @@ -470,6 +470,21 @@ bool CIRCNetwork::ParseConfig(CConfig* pConfig, CString& sError, return false; } + // Partyline is removed in znc 1.8 + if (sModName == "partyline") { + CUtils::PrintError( + "NOTICE: [partyline] is unavailable, cannot load."); + CUtils::PrintError( + "NOTICE: [partyline] is removed in this release" + " of ZNC. Please either remove it from your config or " + "install it as a third party module with the same " + "name."); + CUtils::PrintError( + "NOTICE: More info can be found on " + "https://wiki.znc.in/Partyline"); + return false; + } + // XXX The awaynick module was retired in 1.6 (still available // as external module) if (sModName == "awaynick") {