diff --git a/ChangeLog b/ChangeLog index 7771cc0f2..2b51773f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,12 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2005-02-26 +ChangeLog - 2005-02-27 Version 0.1.1 (under dev!): * added new display engine: doesn't cut words at end of lines - * added DCC send + * added DCC send and DCC chat * connection to IRC server is now made by child process (non blocking) * added support for UnrealIrcd ("~" for chan owner, "&" for chan admin) * new key for window switch (now: F5/F6=switch buffer, F7/F8=switch window) diff --git a/TODO b/TODO index 07c7c5e3c..3c25767e6 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,7 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -TODO - 2005-02-20 +TODO - 2005-02-27 Legend: # done @@ -16,10 +16,11 @@ v0.1.1: * General: + Windows version + Solaris version - - *BSD version + + *BSD version * IRC protocol: # "/dcc send" command + # "/dcc chat" command (and incoming DCC chats) - customizable CTCP version reply * Interface: @@ -34,7 +35,6 @@ Future versions: --------------- * IRC protocol: - - "/dcc chat" command (and incoming DCC chats) - complete "/list" command: add regexp search, display only channels that match regexp - "/ignore" and "/unignore" commands: hide all that is write by a given diff --git a/po/fr.po b/po/fr.po index 6f783b12f..03dff2da5 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.1.1-cvs\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-21 21:28+0100\n" +"POT-Creation-Date: 2005-02-27 03:28+0100\n" "PO-Revision-Date: 2005-02-12 12:00+0100\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -29,102 +29,102 @@ msgstr "Impossible de d msgid "%s cannot allocate new server\n" msgstr "%s impossible d'allouer un nouveau serveur\n" -#: src/irc/irc-server.c:412 +#: src/irc/irc-server.c:416 #, c-format msgid "%s error sending data to IRC server\n" msgstr "%s erreur d'envoi de données au serveur IRC\n" -#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 +#: src/irc/irc-server.c:436 src/irc/irc-server.c:449 src/irc/irc-server.c:515 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "%s mémoire insuffisante pour un message IRC reçu\n" -#: src/irc/irc-server.c:520 +#: src/irc/irc-server.c:524 #, c-format msgid "%s unable to explode received buffer\n" msgstr "%s impossible d'exploser le tampon de réception\n" -#: src/irc/irc-server.c:594 +#: src/irc/irc-server.c:598 #, c-format msgid "%s Command '%s' failed!\n" msgstr "%s La commande '%s' a échoué !\n" -#: src/irc/irc-server.c:599 +#: src/irc/irc-server.c:603 #, c-format msgid "%s No command to execute!\n" msgstr "%s Pas de commande à exécuter !\n" -#: src/irc/irc-server.c:604 +#: src/irc/irc-server.c:608 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "%s Commande inconnue: cmd=%s, params=%s\n" -#: src/irc/irc-server.c:646 +#: src/irc/irc-server.c:650 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" "%s impossible de lire des données sur la socket, déconnexion du serveur...\n" -#: src/irc/irc-server.c:718 +#: src/irc/irc-server.c:722 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "%s: Reconnexion au serveur dans %d secondes\n" -#: src/irc/irc-server.c:749 +#: src/irc/irc-server.c:753 #, c-format msgid "%s address \"%s\" not found\n" msgstr "%s adresse \"%s\" introuvable\n" -#: src/irc/irc-server.c:758 +#: src/irc/irc-server.c:762 #, c-format msgid "%s IP address not found\n" msgstr "%s adresse IP introuvable\n" -#: src/irc/irc-server.c:766 +#: src/irc/irc-server.c:770 #, c-format msgid "%s connection refused\n" msgstr "%s connexion refusée\n" -#: src/irc/irc-server.c:832 +#: src/irc/irc-server.c:836 #, c-format msgid "%s: connecting to %s:%d...\n" msgstr "%s: connexion à %s:%d...\n" -#: src/irc/irc-server.c:834 +#: src/irc/irc-server.c:838 #, c-format msgid "connecting to server %s:%d...\n" msgstr "connexion au serveur %s:%d...\n" -#: src/irc/irc-server.c:845 +#: src/irc/irc-server.c:849 #, c-format msgid "%s cannot create pipe\n" msgstr "%s impossible de créer le pipe\n" -#: src/irc/irc-server.c:857 +#: src/irc/irc-server.c:861 #, c-format msgid "%s cannot create socket\n" msgstr "%s impossible de créer la socket\n" -#: src/irc/irc-server.c:869 +#: src/irc/irc-server.c:873 #, c-format msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" -#: src/irc/irc-server.c:880 +#: src/irc/irc-server.c:884 #, c-format msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" -#: src/irc/irc-server.c:911 +#: src/irc/irc-server.c:915 #, c-format msgid "%s: Reconnecting to server...\n" msgstr "%s: Reconnexion au serveur...\n" -#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 +#: src/irc/irc-server.c:968 src/irc/irc-server.c:973 msgid "Disconnected from server!\n" msgstr "Déconnecté du serveur !\n" -#: src/irc/irc-channel.c:50 +#: src/irc/irc-channel.c:51 #, c-format msgid "%s cannot allocate new channel" msgstr "%s impossible d'allouer un nouveau canal" @@ -178,20 +178,21 @@ msgstr "" "type: \"action\" ou \"version\"" #: src/irc/irc-commands.c:47 -msgid "starts DCC (file or chat)" -msgstr "démarre le DCC (fichier ou discussion)" +msgid "starts DCC (file or chat) or close chat" +msgstr "démarre le DCC (fichier ou discussion) ou ferme une discussion" #: src/irc/irc-commands.c:48 -msgid "action nickname [file]" -msgstr "action pseudo [fichier]" +msgid "action [nickname [file]]" +msgstr "action [pseudo [fichier]]" #: src/irc/irc-commands.c:49 msgid "" -"action: 'send' (file) or 'chat'\n" +"action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)" msgstr "" -"action: 'send' (envoi de fichier) ou 'chat' (discussion)\n" +"action: 'send' (envoi de fichier) ou 'chat' (discussion) ou " +"'close' (fermeture discussion)\n" "pseudo: pseudo pour envoyer le fichier ou discuter\n" "fichier: nom du fichier (sur la machine locale)" @@ -1166,35 +1167,35 @@ msgstr "drapeau de mode inconnu" msgid "can't change mode for other users" msgstr "impossible de changer le mode pour les autres utilisateurs" -#: src/irc/irc-display.c:153 src/common/command.c:800 +#: src/irc/irc-display.c:154 src/common/command.c:804 msgid "Server: " msgstr "Serveur: " -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "connected" msgstr "connecté" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "not connected" msgstr "non connecté" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "yes" msgstr "oui" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "no" msgstr "non" -#: src/irc/irc-display.c:164 +#: src/irc/irc-display.c:165 msgid " (temporary server, will not be saved)" msgstr " (serveur temporaire, ne sera pas sauvé)" -#: src/irc/irc-display.c:180 +#: src/irc/irc-display.c:181 msgid "(hidden)" msgstr "(caché)" -#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3116 +#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3186 msgid "unknown" msgstr "inconnu" @@ -1203,43 +1204,44 @@ msgstr "inconnu" msgid "%s: using local hostname \"%s\"\n" msgstr "%s: utilisation du nom de machine local \"%s\"\n" -#: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:265 src/irc/irc-send.c:277 src/irc/irc-send.c:295 +#: src/irc/irc-send.c:775 src/irc/irc-send.c:849 src/common/command.c:1359 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "%s nombre de paramètres erroné pour la commande \"%s\"\n" -#: src/irc/irc-send.c:292 -msgid "This command is not developed!\n" -msgstr "Cette commande n'est pas développée !\n" +#: src/irc/irc-send.c:318 +#, c-format +msgid "%s wrong arguments for \"%s\" command\n" +msgstr "%s paramètres invalides pour la commande \"%s\"\n" -#: src/irc/irc-send.c:319 src/irc/irc-send.c:345 src/irc/irc-send.c:446 -#: src/irc/irc-send.c:770 src/irc/irc-send.c:849 src/irc/irc-send.c:1349 +#: src/irc/irc-send.c:346 src/irc/irc-send.c:372 src/irc/irc-send.c:473 +#: src/irc/irc-send.c:797 src/irc/irc-send.c:876 src/irc/irc-send.c:1376 #, c-format msgid "%s \"%s\" command can only be executed in a channel window\n" msgstr "" "%s la commande \"%s\" peut seulement être exécutée dans une fenêtre de " "canal\n" -#: src/irc/irc-send.c:556 src/irc/irc-send.c:623 src/irc/irc-send.c:897 -#: src/irc/irc-send.c:911 src/irc/irc-send.c:1243 +#: src/irc/irc-send.c:583 src/irc/irc-send.c:650 src/irc/irc-send.c:924 +#: src/irc/irc-send.c:938 src/irc/irc-send.c:1270 #, c-format msgid "%s \"%s\" command can not be executed on a server window\n" msgstr "" "%s la commande \"%s\" ne peut pas être exécutée dans une fenêtre serveur\n" -#: src/irc/irc-send.c:641 src/irc/irc-send.c:666 src/irc/irc-recv.c:264 +#: src/irc/irc-send.c:668 src/irc/irc-send.c:693 src/irc/irc-recv.c:264 #: src/irc/irc-recv.c:1089 #, c-format msgid "%s nick not found for \"%s\" command\n" msgstr "%s utilisateur non trouvé pour la commande \"%s\"\n" -#: src/irc/irc-send.c:718 src/irc/irc-send.c:995 src/irc/irc-recv.c:1256 +#: src/irc/irc-send.c:745 src/irc/irc-send.c:1022 src/irc/irc-recv.c:1327 #, c-format msgid "%s cannot create new private window \"%s\"\n" msgstr "%s impossible de créer la fenêtre privée \"%s\"\n" -#: src/irc/irc-send.c:1321 +#: src/irc/irc-send.c:1348 #, c-format msgid "%s, compiled on %s %s\n" msgstr "%s, compilé le %s %s\n" @@ -1254,7 +1256,7 @@ msgid " has joined " msgstr " a rejoint " #: src/irc/irc-recv.c:231 src/irc/irc-recv.c:599 src/irc/irc-recv.c:925 -#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2563 src/irc/irc-recv.c:2630 +#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2633 src/irc/irc-recv.c:2700 #, c-format msgid "%s channel not found for \"%s\" command\n" msgstr "%s canal non trouvé pour la commande \"%s\"\n" @@ -1356,7 +1358,7 @@ msgid "removes voice from" msgstr "supprime la voix de" #: src/irc/irc-recv.c:554 src/irc/irc-recv.c:639 src/irc/irc-recv.c:999 -#: src/irc/irc-recv.c:1352 +#: src/irc/irc-recv.c:1423 #, c-format msgid "%s \"%s\" command received without host\n" msgstr "%s commande \"%s\" reçue sans host\n" @@ -1405,7 +1407,7 @@ msgstr "%s commande \"%s\" re msgid " has left " msgstr " a quitté " -#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1282 +#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1353 #, c-format msgid "On %s: * %s %s" msgstr "Sur %s: * %s %s" @@ -1427,194 +1429,200 @@ msgstr "CTCP VERSION " msgid "from" msgstr "de" -#: src/irc/irc-recv.c:1184 src/irc/irc-recv.c:1199 src/irc/irc-recv.c:1215 -#: src/irc/irc-recv.c:1231 src/irc/irc-recv.c:1328 src/irc/irc-recv.c:2867 -#: src/irc/irc-recv.c:2924 +#: src/irc/irc-recv.c:1185 src/irc/irc-recv.c:1202 src/irc/irc-recv.c:1218 +#: src/irc/irc-recv.c:1234 src/irc/irc-recv.c:1259 src/irc/irc-recv.c:1276 +#: src/irc/irc-recv.c:1291 src/irc/irc-recv.c:1399 src/irc/irc-recv.c:2937 +#: src/irc/irc-recv.c:2994 #, c-format msgid "%s cannot parse \"%s\" command\n" msgstr "%s impossible d'analyser la commande \"%s\"\n" -#: src/irc/irc-recv.c:1308 +#: src/irc/irc-recv.c:1304 +#, c-format +msgid "%s unknown DCC CHAT type received from " +msgstr "%s type de DCC CHAT inconnu reçu de " + +#: src/irc/irc-recv.c:1379 src/irc/irc-dcc.c:751 #, c-format msgid "Private %s> %s" msgstr "Prive %s> %s" -#: src/irc/irc-recv.c:1384 +#: src/irc/irc-recv.c:1455 msgid "has quit" msgstr "a quitté" -#: src/irc/irc-recv.c:1505 +#: src/irc/irc-recv.c:1575 #, c-format msgid "%s \"%s\" command received without channel\n" msgstr "%s commande \"%s\" reçue sans canal\n" -#: src/irc/irc-recv.c:1533 +#: src/irc/irc-recv.c:1603 msgid " has changed topic for " msgstr " a changé le titre pour " -#: src/irc/irc-recv.c:1538 +#: src/irc/irc-recv.c:1608 #, c-format msgid " to: \"%s\"\n" msgstr " en: \"%s\"\n" -#: src/irc/irc-recv.c:1544 +#: src/irc/irc-recv.c:1614 msgid " has unset topic for " msgstr " a retiré le titre pour " -#: src/irc/irc-recv.c:1655 +#: src/irc/irc-recv.c:1725 #, c-format msgid " is away: %s\n" msgstr " est absent: %s\n" -#: src/irc/irc-recv.c:1729 +#: src/irc/irc-recv.c:1799 msgid "Users online: " msgstr "Utilisateurs en ligne: " -#: src/irc/irc-recv.c:2134 +#: src/irc/irc-recv.c:2204 msgid "idle: " msgstr "inactivité: " -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "days" msgstr "jours" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "day" msgstr "jour" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hours" msgstr "heures" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hour" msgstr "heure" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minutes" msgstr "minutes" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minute" msgstr "minute" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "seconds" msgstr "secondes" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "second" msgstr "seconde" -#: src/irc/irc-recv.c:2169 +#: src/irc/irc-recv.c:2239 msgid "signon at: " msgstr "signé le: " -#: src/irc/irc-recv.c:2257 +#: src/irc/irc-recv.c:2327 msgid "Channels: " msgstr "Canaux: " -#: src/irc/irc-recv.c:2509 +#: src/irc/irc-recv.c:2579 msgid "No topic set for " msgstr "Pas de titre défini pour " -#: src/irc/irc-recv.c:2551 +#: src/irc/irc-recv.c:2621 msgid "Topic for " msgstr "Le titre pour " -#: src/irc/irc-recv.c:2555 +#: src/irc/irc-recv.c:2625 #, c-format msgid " is: \"%s\"\n" msgstr " est: \"%s\"\n" -#: src/irc/irc-recv.c:2573 src/irc/irc-recv.c:2657 +#: src/irc/irc-recv.c:2643 src/irc/irc-recv.c:2727 #, c-format msgid "%s cannot identify channel for \"%s\" command\n" msgstr "%s impossible de déterminer le canal pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2619 +#: src/irc/irc-recv.c:2689 msgid "Topic set by " msgstr "Titre défini par " -#: src/irc/irc-recv.c:2639 +#: src/irc/irc-recv.c:2709 #, c-format msgid "%s cannot identify date/time for \"%s\" command\n" msgstr "%s impossible d'identifier la date/heure pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2648 +#: src/irc/irc-recv.c:2718 #, c-format msgid "%s cannot identify nickname for \"%s\" command\n" msgstr "" "%s impossible de déterminer le nom d'utilisateur pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2790 +#: src/irc/irc-recv.c:2860 msgid " on " msgstr " sur " -#: src/irc/irc-recv.c:2913 +#: src/irc/irc-recv.c:2983 #, c-format msgid "%s cannot create nick \"%s\" for channel \"%s\"\n" msgstr "%s impossible de créer l'utilisateur \"%s\" pour le canal \"%s\"\n" -#: src/irc/irc-recv.c:2968 +#: src/irc/irc-recv.c:3038 msgid "Nicks " msgstr "Utilisateurs " -#: src/irc/irc-recv.c:2988 +#: src/irc/irc-recv.c:3058 msgid "Channel " msgstr "Canal " -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nicks" msgstr "utilisateurs" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nick" msgstr "utilisateur" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "ops" msgstr "ops" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "op" msgstr "op" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfops" msgstr "halfops" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfop" msgstr "halfop" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voices" msgstr "voices" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voice" msgstr "voice" -#: src/irc/irc-recv.c:3034 +#: src/irc/irc-recv.c:3104 msgid "normal" msgstr "normal" -#: src/irc/irc-recv.c:3070 +#: src/irc/irc-recv.c:3140 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 2nd nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai avec le 2nd " "nom d'utilisateur \"%s\"\n" -#: src/irc/irc-recv.c:3082 +#: src/irc/irc-recv.c:3152 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 3rd nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai du 3ème nom " "d'utilisateur \"%s\"\n" -#: src/irc/irc-recv.c:3094 +#: src/irc/irc-recv.c:3164 #, c-format msgid "" "%s: all declared nicknames are already in use, closing connection with " @@ -1623,100 +1631,138 @@ msgstr "" "%s: tous les noms d'utilisateurs déclarés sont déjà en cours d'utilisation, " "fermeture de la connexion avec le serveur !\n" -#: src/irc/irc-recv.c:3104 +#: src/irc/irc-recv.c:3174 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 1st nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai avec le 1er " "nom d'utilisateur \"%s\"\n" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Waiting" msgstr "Attente" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Connecting" msgstr "Connexion" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Active" msgstr "Actif" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Done" msgstr "Terminé" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Failed" msgstr "Echoué" -#: src/irc/irc-dcc.c:46 +#: src/irc/irc-dcc.c:47 msgid "Aborted" msgstr "Interrompu" -#: src/irc/irc-dcc.c:149 +#: src/irc/irc-dcc.c:155 msgid "DCC: file " msgstr "DCC: fichier " -#: src/irc/irc-dcc.c:154 src/irc/irc-dcc.c:334 +#: src/irc/irc-dcc.c:160 src/irc/irc-dcc.c:406 msgid " (local filename: " msgstr " (nom local: " -#: src/irc/irc-dcc.c:160 +#: src/irc/irc-dcc.c:166 msgid ") sent to " msgstr ") envoyé à " -#: src/irc/irc-dcc.c:162 +#: src/irc/irc-dcc.c:168 msgid ") received from " msgstr ") reçu de " -#: src/irc/irc-dcc.c:167 +#: src/irc/irc-dcc.c:173 msgid ": ok!\n" msgstr ": ok!\n" -#: src/irc/irc-dcc.c:278 +#: src/irc/irc-dcc.c:181 +msgid "DCC chat closed with " +msgstr "Discussion DCC fermée avec " + +#: src/irc/irc-dcc.c:219 +#, c-format +msgid "" +"%s can't associate DCC chat with private buffer (maybe private buffer has " +"already DCC CHAT?)\n" +msgstr "" +"%s impossible d'associer la discussion DCC avec un tampon privé (le tampon " +"privé a peut-être déjà un DCC CHAT ?)\n" + +#: src/irc/irc-dcc.c:229 +msgid "Connected to " +msgstr "Connecté à " + +#: src/irc/irc-dcc.c:238 +msgid "via DCC chat\n" +msgstr "via une discussion DCC\n" + +#: src/irc/irc-dcc.c:348 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "%s pas assez de mémoire pour un nouveau DCC\n" -#: src/irc/irc-dcc.c:308 +#: src/irc/irc-dcc.c:365 +msgid "DCC chat" +msgstr "Discussion DCC" + +#: src/irc/irc-dcc.c:386 msgid "Incoming DCC file from " msgstr "Réception fichier DCC de " -#: src/irc/irc-dcc.c:319 src/irc/irc-dcc.c:338 +#: src/irc/irc-dcc.c:397 src/irc/irc-dcc.c:410 msgid " bytes\n" msgstr " octets\n" -#: src/irc/irc-dcc.c:325 +#: src/irc/irc-dcc.c:402 msgid "Sending DCC file to " msgstr "Envoi fichier DCC à " -#: src/irc/irc-dcc.c:393 +#: src/irc/irc-dcc.c:415 +msgid "Incoming DCC chat request from " +msgstr "Demande de discussion DCC reçue de " + +#: src/irc/irc-dcc.c:426 +msgid "Sending DCC chat request to " +msgstr "Envoi d'une demande discussion DCC à " + +#: src/irc/irc-dcc.c:490 #, c-format msgid "%s not enough memory for DCC SEND\n" msgstr "%s pas assez de mémoire pour le DCC SEND\n" -#: src/irc/irc-dcc.c:415 +#: src/irc/irc-dcc.c:512 #, c-format msgid "%s cannot access file \"%s\"\n" msgstr "%s impossible d'accéder au fichier \"%s\"\n" -#: src/irc/irc-dcc.c:434 +#: src/irc/irc-dcc.c:533 #, c-format msgid "%s cannot create socket for DCC\n" msgstr "%s impossible de créer la socket pour le DCC\n" -#: src/irc/irc-dcc.c:446 +#: src/irc/irc-dcc.c:546 #, c-format msgid "%s cannot find port for DCC\n" msgstr "%s impossible de trouver le port pour le DCC\n" -#: src/irc/irc-dcc.c:484 +#: src/irc/irc-dcc.c:593 #, c-format msgid "%s cannot send DCC\n" msgstr "%s impossible d'envoyer le DCC\n" -#: src/irc/irc-dcc.c:599 +#: src/irc/irc-dcc.c:672 +#, c-format +msgid "%s error sending data to \"%s\" via DCC CHAT\n" +msgstr "%s erreur d'envoi de données à \"%s\" via DCC CHAT\n" + +#: src/irc/irc-dcc.c:930 #, c-format msgid "" "%s DCC failed because blocksize is too big. Check value of \"dcc_blocksize\" " @@ -1725,7 +1771,7 @@ msgstr "" "%s le DCC a échoué car la taille de bloc est trop grande. Vérifiez la valeur " "de l'option \"dcc_blocksize\", le maximum est %d.\n" -#: src/irc/irc-dcc.c:672 +#: src/irc/irc-dcc.c:1003 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "abandon du DCC actif: \"%s\" de %s\n" @@ -1804,66 +1850,66 @@ msgstr "" "%s impossible d'ajouter la fonction pour le message \"%s\" (mémoire " "insuffisante)\n" -#: src/gui/curses/gui-input.c:763 +#: src/gui/curses/gui-input.c:756 #, c-format msgid "%s lag is high, disconnecting from server...\n" msgstr "%s le lag est élevé, déconnexion du serveur...\n" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "bytes" msgstr "octets" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Kb" msgstr "Ko" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Mb" msgstr "Mo" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Gb" msgstr "Go" -#: src/gui/curses/gui-display.c:969 +#: src/gui/curses/gui-display.c:1061 msgid "(away)" msgstr "(absent)" -#: src/gui/curses/gui-display.c:1054 +#: src/gui/curses/gui-display.c:1174 #, c-format msgid "%d:[not connected] " msgstr "%d:[non connecté] " -#: src/gui/curses/gui-display.c:1071 +#: src/gui/curses/gui-display.c:1191 msgid "Act: " msgstr "Act: " -#: src/gui/curses/gui-display.c:1120 +#: src/gui/curses/gui-display.c:1240 #, c-format msgid "Lag: %.1f" msgstr "Lag: %.1f" -#: src/gui/curses/gui-display.c:1135 +#: src/gui/curses/gui-display.c:1255 msgid "-MORE-" msgstr "-PLUS-" -#: src/gui/curses/gui-display.c:1310 +#: src/gui/curses/gui-display.c:1429 msgid " [A] Accept" msgstr " [A] Accepter" -#: src/gui/curses/gui-display.c:1311 src/gui/curses/gui-display.c:1315 +#: src/gui/curses/gui-display.c:1430 src/gui/curses/gui-display.c:1434 msgid " [C] Cancel" msgstr " [C] Annuler" -#: src/gui/curses/gui-display.c:1320 +#: src/gui/curses/gui-display.c:1439 msgid " [R] Remove" msgstr " [R] Retirer" -#: src/gui/curses/gui-display.c:1324 +#: src/gui/curses/gui-display.c:1443 msgid " [P] Purge old DCC" msgstr " [P] Purger anciens DCC" -#: src/gui/curses/gui-display.c:1325 +#: src/gui/curses/gui-display.c:1444 msgid " [Q] Close DCC view" msgstr " [Q] Fermer la vue DCC" @@ -1876,12 +1922,12 @@ msgstr "serveur" msgid "%s not enough memory for infobar message\n" msgstr "%s pas assez de mémoire pour un message de la barre d'infos\n" -#: src/gui/gui-common.c:497 +#: src/gui/gui-common.c:503 #, c-format msgid "%s not enough memory for new line!\n" msgstr "%s pas assez de mémoire pour une nouvelle ligne !\n" -#: src/gui/gui-common.c:540 +#: src/gui/gui-common.c:546 msgid "not enough memory!\n" msgstr "pas assez de mémoire !\n" @@ -2150,166 +2196,166 @@ msgstr "%s la commande \"%s\" n msgid "%s unknown command \"%s\" (type /help for help)\n" msgstr "%s commande \"%s\" inconnue (tapez /help pour l'aide)\n" -#: src/common/command.c:699 +#: src/common/command.c:703 #, c-format msgid "%s cannot find nick for sending message\n" msgstr "%s impossible de trouver le pseudo pour envoyer le message\n" -#: src/common/command.c:708 +#: src/common/command.c:712 msgid "This window is not a channel!\n" msgstr "Cette fenêtre n'est pas un canal !\n" -#: src/common/command.c:736 src/common/command.c:760 src/common/command.c:864 +#: src/common/command.c:740 src/common/command.c:764 src/common/command.c:868 #, c-format msgid "%s missing arguments for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:745 +#: src/common/command.c:749 #, c-format msgid "Alias \"%s\" => \"%s\" created\n" msgstr "Alias \"%s\" => \"%s\" créé\n" -#: src/common/command.c:751 +#: src/common/command.c:755 #, c-format msgid "Failed to create alias \"%s\" => \"%s\" (not enough memory)\n" msgstr "Impossible de créer l'alias \"%s\" => \"%s\" (pas assez de mémoire)\n" -#: src/common/command.c:771 +#: src/common/command.c:775 msgid "List of aliases:\n" msgstr "Liste des alias:\n" -#: src/common/command.c:783 +#: src/common/command.c:787 msgid "No alias defined.\n" msgstr "Aucun alias défini.\n" -#: src/common/command.c:806 +#: src/common/command.c:810 msgid "Channel: " msgstr "Canal: " -#: src/common/command.c:809 src/common/command.c:819 +#: src/common/command.c:813 src/common/command.c:823 msgid " (server: " msgstr " (serveur: " -#: src/common/command.c:816 +#: src/common/command.c:820 msgid "Private with: " msgstr "Privé avec: " -#: src/common/command.c:844 +#: src/common/command.c:848 msgid "Opened buffers:\n" msgstr "Tampons ouverts:\n" -#: src/common/command.c:887 src/common/command.c:1014 +#: src/common/command.c:891 src/common/command.c:1018 #, c-format msgid "%s incorrect buffer number\n" msgstr "%s numéro de buffer incorrect\n" -#: src/common/command.c:901 +#: src/common/command.c:905 #, c-format msgid "%s can not close the single buffer\n" msgstr "%s impossible de fermer le tampon unique\n" -#: src/common/command.c:911 +#: src/common/command.c:915 #, c-format msgid "%s can not close server buffer while channels are opened\n" msgstr "" "%s impossible de fermer le tampon du serveur tant que des canaux sont " "ouverts\n" -#: src/common/command.c:950 +#: src/common/command.c:954 msgid "Notify levels: " msgstr "Niveaux de notification: " -#: src/common/command.c:977 src/common/command.c:987 +#: src/common/command.c:981 src/common/command.c:991 #, c-format msgid "%s incorrect notify level (must be between 0 and 3)\n" msgstr "%s niveau de notification incorrect (doit être entre 0 et 3)\n" -#: src/common/command.c:1005 +#: src/common/command.c:1009 #, c-format msgid "%s buffer \"%s\" not found for \"%s\" command\n" msgstr "%s buffer \"%s\" non trouvé pour la commande \"%s\"\n" -#: src/common/command.c:1039 +#: src/common/command.c:1043 #, c-format msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "paramètre inconnu \"%s\" pour la commande \"%s\"\n" -#: src/common/command.c:1069 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "%s déjà connecté au serveur \"%s\" !\n" -#: src/common/command.c:1077 +#: src/common/command.c:1081 #, c-format msgid "%s currently connecting to server \"%s\"!\n" msgstr "%s une connexion vers le serveur \"%s\" est en cours !\n" -#: src/common/command.c:1095 src/common/command.c:1138 +#: src/common/command.c:1099 src/common/command.c:1142 #, c-format msgid "%s server not found\n" msgstr "%s serveur non trouvé\n" -#: src/common/command.c:1122 +#: src/common/command.c:1126 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "%s non connecté au serveur \"%s\" !\n" -#: src/common/command.c:1130 +#: src/common/command.c:1134 msgid "Auto-reconnection is cancelled\n" msgstr "La reconnexion automatique est annulée\n" -#: src/common/command.c:1156 +#: src/common/command.c:1160 #, c-format msgid "%s internal commands:\n" msgstr "Commandes internes %s :\n" -#: src/common/command.c:1165 +#: src/common/command.c:1169 msgid "IRC commands:\n" msgstr "Commandes IRC :\n" -#: src/common/command.c:1224 +#: src/common/command.c:1228 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "Pas d'aide disponible, la commande \"%s\" est inconnue\n" -#: src/common/command.c:1249 +#: src/common/command.c:1253 msgid "Registered Perl scripts:\n" msgstr "Scripts Perl enregistrés :\n" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1270 src/common/command.c:1292 +#: src/common/command.c:1314 msgid " (none)\n" msgstr " (aucun)\n" -#: src/common/command.c:1271 +#: src/common/command.c:1275 msgid "Perl message handlers:\n" msgstr "Fonctions Perl pour messages :\n" -#: src/common/command.c:1280 +#: src/common/command.c:1284 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr " IRC(%s) => Perl(%s)\n" -#: src/common/command.c:1293 +#: src/common/command.c:1297 msgid "Perl command handlers:\n" msgstr "Commandes Perl :\n" -#: src/common/command.c:1302 +#: src/common/command.c:1306 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr " Commande /%s => Perl(%s)\n" -#: src/common/command.c:1322 +#: src/common/command.c:1326 msgid "Perl scripts unloaded\n" msgstr "Scripts Perl déchargés\n" -#: src/common/command.c:1348 src/common/command.c:2045 -#: src/common/command.c:2057 +#: src/common/command.c:1352 src/common/command.c:2049 +#: src/common/command.c:2061 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "%s option inconnue pour la commande \"%s\"\n" -#: src/common/command.c:1361 +#: src/common/command.c:1365 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" @@ -2318,31 +2364,31 @@ msgstr "" "Merci de reconstruire WeeChat avec l'option \"--enable-perl\" pour le " "script ./configure\n" -#: src/common/command.c:1415 +#: src/common/command.c:1419 msgid "No server.\n" msgstr "Pas de serveur.\n" -#: src/common/command.c:1426 +#: src/common/command.c:1430 #, c-format msgid "Server '%s' not found.\n" msgstr "Serveur '%s' non trouvé.\n" -#: src/common/command.c:1438 +#: src/common/command.c:1442 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "%s il manque le nom du serveur pour la commande \"%s\"\n" -#: src/common/command.c:1446 +#: src/common/command.c:1450 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "%s trop de paramètres pour la commande \"%s\", paramètres ignorés\n" -#: src/common/command.c:1465 +#: src/common/command.c:1469 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "%s le serveur \"%s\" n'existe pas pour la commande \"%s\"\n" -#: src/common/command.c:1473 +#: src/common/command.c:1477 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" @@ -2351,106 +2397,106 @@ msgstr "" "%s vous ne pouvez pas supprimer le server \"%s\" car vous êtes connecté " "dessus. Essayez /disconnect %s avant.\n" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1493 src/common/command.c:1634 msgid "Server" msgstr "Serveur" -#: src/common/command.c:1492 +#: src/common/command.c:1496 msgid "has been deleted\n" msgstr "a été supprimé\n" -#: src/common/command.c:1507 +#: src/common/command.c:1511 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:1517 +#: src/common/command.c:1521 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "%s le serveur \"%s\" existe déjà, impossible de le créer !\n" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1546 src/common/command.c:1574 +#: src/common/command.c:1587 src/common/command.c:1613 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "%s mot de passe manquant pour le paramètre \"%s\"\n" -#: src/common/command.c:1555 +#: src/common/command.c:1559 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "%s pseudo(s) manquant(s) pour le paramètre \"%s\"\n" -#: src/common/command.c:1596 +#: src/common/command.c:1600 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "%s commande manquante pour le paramètre \"%s\"\n" -#: src/common/command.c:1633 +#: src/common/command.c:1637 msgid "created\n" msgstr "créé\n" -#: src/common/command.c:1639 +#: src/common/command.c:1643 #, c-format msgid "%s unable to create server\n" msgstr "%s impossible de créer le serveur\n" -#: src/common/command.c:1694 +#: src/common/command.c:1698 msgid "(unknown)" msgstr "(inconnu)" -#: src/common/command.c:1717 +#: src/common/command.c:1721 msgid "(password hidden) " msgstr "(mot de passe caché)" -#: src/common/command.c:1781 +#: src/common/command.c:1785 #, c-format msgid "%s server \"%s\" not found\n" msgstr "%s serveur \"%s\" non trouvé\n" -#: src/common/command.c:1812 src/common/command.c:1858 +#: src/common/command.c:1816 src/common/command.c:1862 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "%s option de configuration \"%s\" non trouvée\n" -#: src/common/command.c:1817 src/common/command.c:1850 +#: src/common/command.c:1821 src/common/command.c:1854 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "%s valeur incorrecte pour l'option \"%s\"\n" -#: src/common/command.c:1833 +#: src/common/command.c:1837 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "%s l'option \"%s\" ne peut pas être changée lorsque WeeChat tourne\n" -#: src/common/command.c:1931 +#: src/common/command.c:1935 #, c-format msgid "No config option found with \"%s\"\n" msgstr "Aucune option de configuration trouvée avec \"%s\"\n" -#: src/common/command.c:1934 +#: src/common/command.c:1938 msgid "No config option found\n" msgstr "Aucune option de configuration trouvée\n" -#: src/common/command.c:1940 +#: src/common/command.c:1944 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "option(s) de configuration trouvée(s) avec \"%s\"\n" -#: src/common/command.c:1943 +#: src/common/command.c:1947 msgid "config option(s) found\n" msgstr "option(s) de configuration trouvée(s)\n" -#: src/common/command.c:1963 +#: src/common/command.c:1967 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "%s alias ou commande \"%s\" non trouvé\n" -#: src/common/command.c:1973 +#: src/common/command.c:1977 #, c-format msgid "Alias \"%s\" removed\n" msgstr "Alias \"%s\" supprimé\n" -#: src/common/command.c:1993 +#: src/common/command.c:1997 msgid "Opened windows:\n" msgstr "Fenêtres ouvertes:\n" @@ -3480,18 +3526,3 @@ msgstr "" #: src/common/weeconfig.c:1529 msgid "saving config to disk\n" msgstr "sauvegarde de la configuration sur disque\n" - -#~ msgid "servername" -#~ msgstr "nom_serveur" - -#~ msgid "%s cannot connect to irc server\n" -#~ msgstr "%s connexion au serveur irc impossible\n" - -#~ msgid "%s: server IP is: %s\n" -#~ msgstr "%s: l'adresse IP du serveur est : %s\n" - -#~ msgid "%s IRC command \"%s\" failed\n" -#~ msgstr "%s la commande IRC \"%s\" a échoué\n" - -#~ msgid ") from " -#~ msgstr ") de " diff --git a/po/weechat.pot b/po/weechat.pot index 207a727ac..2302d8674 100644 --- a/po/weechat.pot +++ b/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-21 21:28+0100\n" +"POT-Creation-Date: 2005-02-27 03:28+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,101 +29,101 @@ msgstr "" msgid "%s cannot allocate new server\n" msgstr "" -#: src/irc/irc-server.c:412 +#: src/irc/irc-server.c:416 #, c-format msgid "%s error sending data to IRC server\n" msgstr "" -#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 +#: src/irc/irc-server.c:436 src/irc/irc-server.c:449 src/irc/irc-server.c:515 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "" -#: src/irc/irc-server.c:520 +#: src/irc/irc-server.c:524 #, c-format msgid "%s unable to explode received buffer\n" msgstr "" -#: src/irc/irc-server.c:594 +#: src/irc/irc-server.c:598 #, c-format msgid "%s Command '%s' failed!\n" msgstr "" -#: src/irc/irc-server.c:599 +#: src/irc/irc-server.c:603 #, c-format msgid "%s No command to execute!\n" msgstr "" -#: src/irc/irc-server.c:604 +#: src/irc/irc-server.c:608 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "" -#: src/irc/irc-server.c:646 +#: src/irc/irc-server.c:650 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" -#: src/irc/irc-server.c:718 +#: src/irc/irc-server.c:722 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "" -#: src/irc/irc-server.c:749 +#: src/irc/irc-server.c:753 #, c-format msgid "%s address \"%s\" not found\n" msgstr "" -#: src/irc/irc-server.c:758 +#: src/irc/irc-server.c:762 #, c-format msgid "%s IP address not found\n" msgstr "" -#: src/irc/irc-server.c:766 +#: src/irc/irc-server.c:770 #, c-format msgid "%s connection refused\n" msgstr "" -#: src/irc/irc-server.c:832 +#: src/irc/irc-server.c:836 #, c-format msgid "%s: connecting to %s:%d...\n" msgstr "" -#: src/irc/irc-server.c:834 +#: src/irc/irc-server.c:838 #, c-format msgid "connecting to server %s:%d...\n" msgstr "" -#: src/irc/irc-server.c:845 +#: src/irc/irc-server.c:849 #, c-format msgid "%s cannot create pipe\n" msgstr "" -#: src/irc/irc-server.c:857 +#: src/irc/irc-server.c:861 #, c-format msgid "%s cannot create socket\n" msgstr "" -#: src/irc/irc-server.c:869 +#: src/irc/irc-server.c:873 #, c-format msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" msgstr "" -#: src/irc/irc-server.c:880 +#: src/irc/irc-server.c:884 #, c-format msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" msgstr "" -#: src/irc/irc-server.c:911 +#: src/irc/irc-server.c:915 #, c-format msgid "%s: Reconnecting to server...\n" msgstr "" -#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 +#: src/irc/irc-server.c:968 src/irc/irc-server.c:973 msgid "Disconnected from server!\n" msgstr "" -#: src/irc/irc-channel.c:50 +#: src/irc/irc-channel.c:51 #, c-format msgid "%s cannot allocate new channel" msgstr "" @@ -172,16 +172,16 @@ msgid "" msgstr "" #: src/irc/irc-commands.c:47 -msgid "starts DCC (file or chat)" +msgid "starts DCC (file or chat) or close chat" msgstr "" #: src/irc/irc-commands.c:48 -msgid "action nickname [file]" +msgid "action [nickname [file]]" msgstr "" #: src/irc/irc-commands.c:49 msgid "" -"action: 'send' (file) or 'chat'\n" +"action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)" msgstr "" @@ -1072,35 +1072,35 @@ msgstr "" msgid "can't change mode for other users" msgstr "" -#: src/irc/irc-display.c:153 src/common/command.c:800 +#: src/irc/irc-display.c:154 src/common/command.c:804 msgid "Server: " msgstr "" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "connected" msgstr "" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "not connected" msgstr "" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "yes" msgstr "" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "no" msgstr "" -#: src/irc/irc-display.c:164 +#: src/irc/irc-display.c:165 msgid " (temporary server, will not be saved)" msgstr "" -#: src/irc/irc-display.c:180 +#: src/irc/irc-display.c:181 msgid "(hidden)" msgstr "" -#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3116 +#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3186 msgid "unknown" msgstr "" @@ -1109,40 +1109,41 @@ msgstr "" msgid "%s: using local hostname \"%s\"\n" msgstr "" -#: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:265 src/irc/irc-send.c:277 src/irc/irc-send.c:295 +#: src/irc/irc-send.c:775 src/irc/irc-send.c:849 src/common/command.c:1359 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:292 -msgid "This command is not developed!\n" +#: src/irc/irc-send.c:318 +#, c-format +msgid "%s wrong arguments for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:319 src/irc/irc-send.c:345 src/irc/irc-send.c:446 -#: src/irc/irc-send.c:770 src/irc/irc-send.c:849 src/irc/irc-send.c:1349 +#: src/irc/irc-send.c:346 src/irc/irc-send.c:372 src/irc/irc-send.c:473 +#: src/irc/irc-send.c:797 src/irc/irc-send.c:876 src/irc/irc-send.c:1376 #, c-format msgid "%s \"%s\" command can only be executed in a channel window\n" msgstr "" -#: src/irc/irc-send.c:556 src/irc/irc-send.c:623 src/irc/irc-send.c:897 -#: src/irc/irc-send.c:911 src/irc/irc-send.c:1243 +#: src/irc/irc-send.c:583 src/irc/irc-send.c:650 src/irc/irc-send.c:924 +#: src/irc/irc-send.c:938 src/irc/irc-send.c:1270 #, c-format msgid "%s \"%s\" command can not be executed on a server window\n" msgstr "" -#: src/irc/irc-send.c:641 src/irc/irc-send.c:666 src/irc/irc-recv.c:264 +#: src/irc/irc-send.c:668 src/irc/irc-send.c:693 src/irc/irc-recv.c:264 #: src/irc/irc-recv.c:1089 #, c-format msgid "%s nick not found for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:718 src/irc/irc-send.c:995 src/irc/irc-recv.c:1256 +#: src/irc/irc-send.c:745 src/irc/irc-send.c:1022 src/irc/irc-recv.c:1327 #, c-format msgid "%s cannot create new private window \"%s\"\n" msgstr "" -#: src/irc/irc-send.c:1321 +#: src/irc/irc-send.c:1348 #, c-format msgid "%s, compiled on %s %s\n" msgstr "" @@ -1157,7 +1158,7 @@ msgid " has joined " msgstr "" #: src/irc/irc-recv.c:231 src/irc/irc-recv.c:599 src/irc/irc-recv.c:925 -#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2563 src/irc/irc-recv.c:2630 +#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2633 src/irc/irc-recv.c:2700 #, c-format msgid "%s channel not found for \"%s\" command\n" msgstr "" @@ -1259,7 +1260,7 @@ msgid "removes voice from" msgstr "" #: src/irc/irc-recv.c:554 src/irc/irc-recv.c:639 src/irc/irc-recv.c:999 -#: src/irc/irc-recv.c:1352 +#: src/irc/irc-recv.c:1423 #, c-format msgid "%s \"%s\" command received without host\n" msgstr "" @@ -1308,7 +1309,7 @@ msgstr "" msgid " has left " msgstr "" -#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1282 +#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1353 #, c-format msgid "On %s: * %s %s" msgstr "" @@ -1330,294 +1331,336 @@ msgstr "" msgid "from" msgstr "" -#: src/irc/irc-recv.c:1184 src/irc/irc-recv.c:1199 src/irc/irc-recv.c:1215 -#: src/irc/irc-recv.c:1231 src/irc/irc-recv.c:1328 src/irc/irc-recv.c:2867 -#: src/irc/irc-recv.c:2924 +#: src/irc/irc-recv.c:1185 src/irc/irc-recv.c:1202 src/irc/irc-recv.c:1218 +#: src/irc/irc-recv.c:1234 src/irc/irc-recv.c:1259 src/irc/irc-recv.c:1276 +#: src/irc/irc-recv.c:1291 src/irc/irc-recv.c:1399 src/irc/irc-recv.c:2937 +#: src/irc/irc-recv.c:2994 #, c-format msgid "%s cannot parse \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:1308 +#: src/irc/irc-recv.c:1304 +#, c-format +msgid "%s unknown DCC CHAT type received from " +msgstr "" + +#: src/irc/irc-recv.c:1379 src/irc/irc-dcc.c:751 #, c-format msgid "Private %s> %s" msgstr "" -#: src/irc/irc-recv.c:1384 +#: src/irc/irc-recv.c:1455 msgid "has quit" msgstr "" -#: src/irc/irc-recv.c:1505 +#: src/irc/irc-recv.c:1575 #, c-format msgid "%s \"%s\" command received without channel\n" msgstr "" -#: src/irc/irc-recv.c:1533 +#: src/irc/irc-recv.c:1603 msgid " has changed topic for " msgstr "" -#: src/irc/irc-recv.c:1538 +#: src/irc/irc-recv.c:1608 #, c-format msgid " to: \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:1544 +#: src/irc/irc-recv.c:1614 msgid " has unset topic for " msgstr "" -#: src/irc/irc-recv.c:1655 +#: src/irc/irc-recv.c:1725 #, c-format msgid " is away: %s\n" msgstr "" -#: src/irc/irc-recv.c:1729 +#: src/irc/irc-recv.c:1799 msgid "Users online: " msgstr "" -#: src/irc/irc-recv.c:2134 +#: src/irc/irc-recv.c:2204 msgid "idle: " msgstr "" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "days" msgstr "" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "day" msgstr "" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hours" msgstr "" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hour" msgstr "" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minutes" msgstr "" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minute" msgstr "" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "seconds" msgstr "" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "second" msgstr "" -#: src/irc/irc-recv.c:2169 +#: src/irc/irc-recv.c:2239 msgid "signon at: " msgstr "" -#: src/irc/irc-recv.c:2257 +#: src/irc/irc-recv.c:2327 msgid "Channels: " msgstr "" -#: src/irc/irc-recv.c:2509 +#: src/irc/irc-recv.c:2579 msgid "No topic set for " msgstr "" -#: src/irc/irc-recv.c:2551 +#: src/irc/irc-recv.c:2621 msgid "Topic for " msgstr "" -#: src/irc/irc-recv.c:2555 +#: src/irc/irc-recv.c:2625 #, c-format msgid " is: \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:2573 src/irc/irc-recv.c:2657 +#: src/irc/irc-recv.c:2643 src/irc/irc-recv.c:2727 #, c-format msgid "%s cannot identify channel for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2619 +#: src/irc/irc-recv.c:2689 msgid "Topic set by " msgstr "" -#: src/irc/irc-recv.c:2639 +#: src/irc/irc-recv.c:2709 #, c-format msgid "%s cannot identify date/time for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2648 +#: src/irc/irc-recv.c:2718 #, c-format msgid "%s cannot identify nickname for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2790 +#: src/irc/irc-recv.c:2860 msgid " on " msgstr "" -#: src/irc/irc-recv.c:2913 +#: src/irc/irc-recv.c:2983 #, c-format msgid "%s cannot create nick \"%s\" for channel \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:2968 +#: src/irc/irc-recv.c:3038 msgid "Nicks " msgstr "" -#: src/irc/irc-recv.c:2988 +#: src/irc/irc-recv.c:3058 msgid "Channel " msgstr "" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nicks" msgstr "" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nick" msgstr "" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "ops" msgstr "" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "op" msgstr "" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfops" msgstr "" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfop" msgstr "" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voices" msgstr "" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voice" msgstr "" -#: src/irc/irc-recv.c:3034 +#: src/irc/irc-recv.c:3104 msgid "normal" msgstr "" -#: src/irc/irc-recv.c:3070 +#: src/irc/irc-recv.c:3140 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 2nd nickname \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:3082 +#: src/irc/irc-recv.c:3152 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 3rd nickname \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:3094 +#: src/irc/irc-recv.c:3164 #, c-format msgid "" "%s: all declared nicknames are already in use, closing connection with " "server!\n" msgstr "" -#: src/irc/irc-recv.c:3104 +#: src/irc/irc-recv.c:3174 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 1st nickname \"%s\"\n" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Waiting" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Connecting" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Active" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Done" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Failed" msgstr "" -#: src/irc/irc-dcc.c:46 +#: src/irc/irc-dcc.c:47 msgid "Aborted" msgstr "" -#: src/irc/irc-dcc.c:149 +#: src/irc/irc-dcc.c:155 msgid "DCC: file " msgstr "" -#: src/irc/irc-dcc.c:154 src/irc/irc-dcc.c:334 +#: src/irc/irc-dcc.c:160 src/irc/irc-dcc.c:406 msgid " (local filename: " msgstr "" -#: src/irc/irc-dcc.c:160 +#: src/irc/irc-dcc.c:166 msgid ") sent to " msgstr "" -#: src/irc/irc-dcc.c:162 +#: src/irc/irc-dcc.c:168 msgid ") received from " msgstr "" -#: src/irc/irc-dcc.c:167 +#: src/irc/irc-dcc.c:173 msgid ": ok!\n" msgstr "" -#: src/irc/irc-dcc.c:278 +#: src/irc/irc-dcc.c:181 +msgid "DCC chat closed with " +msgstr "" + +#: src/irc/irc-dcc.c:219 +#, c-format +msgid "" +"%s can't associate DCC chat with private buffer (maybe private buffer has " +"already DCC CHAT?)\n" +msgstr "" + +#: src/irc/irc-dcc.c:229 +msgid "Connected to " +msgstr "" + +#: src/irc/irc-dcc.c:238 +msgid "via DCC chat\n" +msgstr "" + +#: src/irc/irc-dcc.c:348 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "" -#: src/irc/irc-dcc.c:308 +#: src/irc/irc-dcc.c:365 +msgid "DCC chat" +msgstr "" + +#: src/irc/irc-dcc.c:386 msgid "Incoming DCC file from " msgstr "" -#: src/irc/irc-dcc.c:319 src/irc/irc-dcc.c:338 +#: src/irc/irc-dcc.c:397 src/irc/irc-dcc.c:410 msgid " bytes\n" msgstr "" -#: src/irc/irc-dcc.c:325 +#: src/irc/irc-dcc.c:402 msgid "Sending DCC file to " msgstr "" -#: src/irc/irc-dcc.c:393 +#: src/irc/irc-dcc.c:415 +msgid "Incoming DCC chat request from " +msgstr "" + +#: src/irc/irc-dcc.c:426 +msgid "Sending DCC chat request to " +msgstr "" + +#: src/irc/irc-dcc.c:490 #, c-format msgid "%s not enough memory for DCC SEND\n" msgstr "" -#: src/irc/irc-dcc.c:415 +#: src/irc/irc-dcc.c:512 #, c-format msgid "%s cannot access file \"%s\"\n" msgstr "" -#: src/irc/irc-dcc.c:434 +#: src/irc/irc-dcc.c:533 #, c-format msgid "%s cannot create socket for DCC\n" msgstr "" -#: src/irc/irc-dcc.c:446 +#: src/irc/irc-dcc.c:546 #, c-format msgid "%s cannot find port for DCC\n" msgstr "" -#: src/irc/irc-dcc.c:484 +#: src/irc/irc-dcc.c:593 #, c-format msgid "%s cannot send DCC\n" msgstr "" -#: src/irc/irc-dcc.c:599 +#: src/irc/irc-dcc.c:672 +#, c-format +msgid "%s error sending data to \"%s\" via DCC CHAT\n" +msgstr "" + +#: src/irc/irc-dcc.c:930 #, c-format msgid "" "%s DCC failed because blocksize is too big. Check value of \"dcc_blocksize\" " "option, max is %d.\n" msgstr "" -#: src/irc/irc-dcc.c:672 +#: src/irc/irc-dcc.c:1003 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "" @@ -1690,66 +1733,66 @@ msgstr "" msgid "%s unable to add handler for \"%s\" message (not enough memory)\n" msgstr "" -#: src/gui/curses/gui-input.c:763 +#: src/gui/curses/gui-input.c:756 #, c-format msgid "%s lag is high, disconnecting from server...\n" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "bytes" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Kb" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Mb" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Gb" msgstr "" -#: src/gui/curses/gui-display.c:969 +#: src/gui/curses/gui-display.c:1061 msgid "(away)" msgstr "" -#: src/gui/curses/gui-display.c:1054 +#: src/gui/curses/gui-display.c:1174 #, c-format msgid "%d:[not connected] " msgstr "" -#: src/gui/curses/gui-display.c:1071 +#: src/gui/curses/gui-display.c:1191 msgid "Act: " msgstr "" -#: src/gui/curses/gui-display.c:1120 +#: src/gui/curses/gui-display.c:1240 #, c-format msgid "Lag: %.1f" msgstr "" -#: src/gui/curses/gui-display.c:1135 +#: src/gui/curses/gui-display.c:1255 msgid "-MORE-" msgstr "" -#: src/gui/curses/gui-display.c:1310 +#: src/gui/curses/gui-display.c:1429 msgid " [A] Accept" msgstr "" -#: src/gui/curses/gui-display.c:1311 src/gui/curses/gui-display.c:1315 +#: src/gui/curses/gui-display.c:1430 src/gui/curses/gui-display.c:1434 msgid " [C] Cancel" msgstr "" -#: src/gui/curses/gui-display.c:1320 +#: src/gui/curses/gui-display.c:1439 msgid " [R] Remove" msgstr "" -#: src/gui/curses/gui-display.c:1324 +#: src/gui/curses/gui-display.c:1443 msgid " [P] Purge old DCC" msgstr "" -#: src/gui/curses/gui-display.c:1325 +#: src/gui/curses/gui-display.c:1444 msgid " [Q] Close DCC view" msgstr "" @@ -1762,12 +1805,12 @@ msgstr "" msgid "%s not enough memory for infobar message\n" msgstr "" -#: src/gui/gui-common.c:497 +#: src/gui/gui-common.c:503 #, c-format msgid "%s not enough memory for new line!\n" msgstr "" -#: src/gui/gui-common.c:540 +#: src/gui/gui-common.c:546 msgid "not enough memory!\n" msgstr "" @@ -1995,300 +2038,300 @@ msgstr "" msgid "%s unknown command \"%s\" (type /help for help)\n" msgstr "" -#: src/common/command.c:699 +#: src/common/command.c:703 #, c-format msgid "%s cannot find nick for sending message\n" msgstr "" -#: src/common/command.c:708 +#: src/common/command.c:712 msgid "This window is not a channel!\n" msgstr "" -#: src/common/command.c:736 src/common/command.c:760 src/common/command.c:864 +#: src/common/command.c:740 src/common/command.c:764 src/common/command.c:868 #, c-format msgid "%s missing arguments for \"%s\" command\n" msgstr "" -#: src/common/command.c:745 +#: src/common/command.c:749 #, c-format msgid "Alias \"%s\" => \"%s\" created\n" msgstr "" -#: src/common/command.c:751 +#: src/common/command.c:755 #, c-format msgid "Failed to create alias \"%s\" => \"%s\" (not enough memory)\n" msgstr "" -#: src/common/command.c:771 +#: src/common/command.c:775 msgid "List of aliases:\n" msgstr "" -#: src/common/command.c:783 +#: src/common/command.c:787 msgid "No alias defined.\n" msgstr "" -#: src/common/command.c:806 +#: src/common/command.c:810 msgid "Channel: " msgstr "" -#: src/common/command.c:809 src/common/command.c:819 +#: src/common/command.c:813 src/common/command.c:823 msgid " (server: " msgstr "" -#: src/common/command.c:816 +#: src/common/command.c:820 msgid "Private with: " msgstr "" -#: src/common/command.c:844 +#: src/common/command.c:848 msgid "Opened buffers:\n" msgstr "" -#: src/common/command.c:887 src/common/command.c:1014 +#: src/common/command.c:891 src/common/command.c:1018 #, c-format msgid "%s incorrect buffer number\n" msgstr "" -#: src/common/command.c:901 +#: src/common/command.c:905 #, c-format msgid "%s can not close the single buffer\n" msgstr "" -#: src/common/command.c:911 +#: src/common/command.c:915 #, c-format msgid "%s can not close server buffer while channels are opened\n" msgstr "" -#: src/common/command.c:950 +#: src/common/command.c:954 msgid "Notify levels: " msgstr "" -#: src/common/command.c:977 src/common/command.c:987 +#: src/common/command.c:981 src/common/command.c:991 #, c-format msgid "%s incorrect notify level (must be between 0 and 3)\n" msgstr "" -#: src/common/command.c:1005 +#: src/common/command.c:1009 #, c-format msgid "%s buffer \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1039 +#: src/common/command.c:1043 #, c-format msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "" -#: src/common/command.c:1069 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1077 +#: src/common/command.c:1081 #, c-format msgid "%s currently connecting to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1095 src/common/command.c:1138 +#: src/common/command.c:1099 src/common/command.c:1142 #, c-format msgid "%s server not found\n" msgstr "" -#: src/common/command.c:1122 +#: src/common/command.c:1126 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1130 +#: src/common/command.c:1134 msgid "Auto-reconnection is cancelled\n" msgstr "" -#: src/common/command.c:1156 +#: src/common/command.c:1160 #, c-format msgid "%s internal commands:\n" msgstr "" -#: src/common/command.c:1165 +#: src/common/command.c:1169 msgid "IRC commands:\n" msgstr "" -#: src/common/command.c:1224 +#: src/common/command.c:1228 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "" -#: src/common/command.c:1249 +#: src/common/command.c:1253 msgid "Registered Perl scripts:\n" msgstr "" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1270 src/common/command.c:1292 +#: src/common/command.c:1314 msgid " (none)\n" msgstr "" -#: src/common/command.c:1271 +#: src/common/command.c:1275 msgid "Perl message handlers:\n" msgstr "" -#: src/common/command.c:1280 +#: src/common/command.c:1284 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr "" -#: src/common/command.c:1293 +#: src/common/command.c:1297 msgid "Perl command handlers:\n" msgstr "" -#: src/common/command.c:1302 +#: src/common/command.c:1306 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr "" -#: src/common/command.c:1322 +#: src/common/command.c:1326 msgid "Perl scripts unloaded\n" msgstr "" -#: src/common/command.c:1348 src/common/command.c:2045 -#: src/common/command.c:2057 +#: src/common/command.c:1352 src/common/command.c:2049 +#: src/common/command.c:2061 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "" -#: src/common/command.c:1361 +#: src/common/command.c:1365 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" msgstr "" -#: src/common/command.c:1415 +#: src/common/command.c:1419 msgid "No server.\n" msgstr "" -#: src/common/command.c:1426 +#: src/common/command.c:1430 #, c-format msgid "Server '%s' not found.\n" msgstr "" -#: src/common/command.c:1438 +#: src/common/command.c:1442 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "" -#: src/common/command.c:1446 +#: src/common/command.c:1450 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "" -#: src/common/command.c:1465 +#: src/common/command.c:1469 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1473 +#: src/common/command.c:1477 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" "disconnect %s before.\n" msgstr "" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1493 src/common/command.c:1634 msgid "Server" msgstr "" -#: src/common/command.c:1492 +#: src/common/command.c:1496 msgid "has been deleted\n" msgstr "" -#: src/common/command.c:1507 +#: src/common/command.c:1511 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "" -#: src/common/command.c:1517 +#: src/common/command.c:1521 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1546 src/common/command.c:1574 +#: src/common/command.c:1587 src/common/command.c:1613 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1555 +#: src/common/command.c:1559 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1596 +#: src/common/command.c:1600 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1633 +#: src/common/command.c:1637 msgid "created\n" msgstr "" -#: src/common/command.c:1639 +#: src/common/command.c:1643 #, c-format msgid "%s unable to create server\n" msgstr "" -#: src/common/command.c:1694 +#: src/common/command.c:1698 msgid "(unknown)" msgstr "" -#: src/common/command.c:1717 +#: src/common/command.c:1721 msgid "(password hidden) " msgstr "" -#: src/common/command.c:1781 +#: src/common/command.c:1785 #, c-format msgid "%s server \"%s\" not found\n" msgstr "" -#: src/common/command.c:1812 src/common/command.c:1858 +#: src/common/command.c:1816 src/common/command.c:1862 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "" -#: src/common/command.c:1817 src/common/command.c:1850 +#: src/common/command.c:1821 src/common/command.c:1854 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "" -#: src/common/command.c:1833 +#: src/common/command.c:1837 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "" -#: src/common/command.c:1931 +#: src/common/command.c:1935 #, c-format msgid "No config option found with \"%s\"\n" msgstr "" -#: src/common/command.c:1934 +#: src/common/command.c:1938 msgid "No config option found\n" msgstr "" -#: src/common/command.c:1940 +#: src/common/command.c:1944 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "" -#: src/common/command.c:1943 +#: src/common/command.c:1947 msgid "config option(s) found\n" msgstr "" -#: src/common/command.c:1963 +#: src/common/command.c:1967 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "" -#: src/common/command.c:1973 +#: src/common/command.c:1977 #, c-format msgid "Alias \"%s\" removed\n" msgstr "" -#: src/common/command.c:1993 +#: src/common/command.c:1997 msgid "Opened windows:\n" msgstr "" diff --git a/src/common/command.c b/src/common/command.c index c706139a3..4e6c65ab2 100644 --- a/src/common/command.c +++ b/src/common/command.c @@ -662,23 +662,27 @@ user_command (t_irc_server *server, char *command) command++; if (server && (!BUFFER_IS_SERVER(gui_current_window->buffer))) { - server_sendf (server, "PRIVMSG %s :%s\r\n", - CHANNEL(gui_current_window->buffer)->name, - command); + if (CHANNEL(gui_current_window->buffer)->dcc_chat) + dcc_chat_sendf ((t_irc_dcc *)(CHANNEL(gui_current_window->buffer)->dcc_chat), + "%s\r\n", command); + else + server_sendf (server, "PRIVMSG %s :%s\r\n", + CHANNEL(gui_current_window->buffer)->name, + command); if (BUFFER_IS_PRIVATE(gui_current_window->buffer)) { - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", command); } diff --git a/src/common/completion.c b/src/common/completion.c index ce9d0e5ce..f01b42e9a 100644 --- a/src/common/completion.c +++ b/src/common/completion.c @@ -339,6 +339,9 @@ completion_build_list (t_completion *completion, void *channel) weelist_add (&completion->completion_list, &completion->last_completion, "send"); + weelist_add (&completion->completion_list, + &completion->last_completion, + "close"); return; } if (strcasecmp (completion->base_command, "invite") == 0) diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 643f7f123..82b636ab0 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -394,7 +394,7 @@ t_config_option weechat_options_colors[] = { "col_dcc_waiting", N_("color for \"waiting\" dcc status"), N_("color for \"waiting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, - "white", NULL, &cfg_col_dcc_waiting, NULL, &config_change_color }, + "lightcyan", NULL, &cfg_col_dcc_waiting, NULL, &config_change_color }, { "col_dcc_connecting", N_("color for \"connecting\" dcc status"), N_("color for \"connecting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index 679c90372..26481f740 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -706,33 +706,42 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) { if (i >= ptr_win->win_chat_height - 1) break; - if ((ptr_dcc->type == DCC_FILE_RECV) - || (ptr_dcc->type == DCC_FILE_SEND)) + + /* nickname and filename */ + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", + (ptr_dcc == dcc_selected) ? "***" : " ", + ptr_dcc->nick, + (DCC_IS_CHAT(ptr_dcc->type)) ? + _(ptr_dcc->filename) : ptr_dcc->filename); + if (DCC_IS_FILE(ptr_dcc->type)) { - gui_window_set_color (ptr_win->win_chat, - (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", - (ptr_dcc == dcc_selected) ? "***" : " ", - ptr_dcc->nick, ptr_dcc->filename); if (ptr_dcc->filename_suffix > 0) wprintw (ptr_win->win_chat, " (.%d)", ptr_dcc->filename_suffix); + } + + /* status */ + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i + 1, 0, "%s %s ", + (ptr_dcc == dcc_selected) ? "***" : " ", + (DCC_IS_RECV(ptr_dcc->type)) ? "-->>" : "<<--"); + gui_window_set_color (ptr_win->win_chat, + COLOR_DCC_WAITING + ptr_dcc->status); + wprintw (ptr_win->win_chat, "%-10s", + _(dcc_status_string[ptr_dcc->status])); + + /* other infos */ + if (DCC_IS_FILE(ptr_dcc->type)) + { gui_window_set_color (ptr_win->win_chat, (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i + 1, 0, "%s %s ", - (ptr_dcc == dcc_selected) ? "***" : " ", - (ptr_dcc->type == DCC_FILE_RECV) ? "-->>" : "<<--"); - gui_window_set_color (ptr_win->win_chat, - COLOR_DCC_WAITING + ptr_dcc->status); - wprintw (ptr_win->win_chat, "%-10s", - dcc_status_string[ptr_dcc->status]); - gui_window_set_color (ptr_win->win_chat, - (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - wprintw (ptr_win->win_chat, " [", - dcc_status_string[ptr_dcc->status]); + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + wprintw (ptr_win->win_chat, " ["); if (ptr_dcc->size == 0) num_bars = 10; else @@ -752,8 +761,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) else num_unit = 3; wprintw (ptr_win->win_chat, "] %3lu%% ", - (unsigned long)(((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100), - dcc_status_string[ptr_dcc->status]); + (unsigned long)(((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100)); sprintf (format, "%s %%s / %s %%s", unit_format[num_unit], unit_format[num_unit]); @@ -762,9 +770,14 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) unit_name[num_unit], ((long double) ptr_dcc->size) / ((long double)(unit_divide[num_unit])), unit_name[num_unit]); - ptr_win->dcc_last_displayed = ptr_dcc; - i += 2; } + else + { + wclrtoeol (ptr_win->win_chat); + } + + ptr_win->dcc_last_displayed = ptr_dcc; + i += 2; } } else @@ -1089,42 +1102,61 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase) else wprintw (ptr_win->win_status, "%s", CHANNEL(ptr_win->buffer)->name); - if ((ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer) - && (CHANNEL(ptr_win->buffer)->type == CHAT_CHANNEL)) + if (ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer) { /* display channel modes */ - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS_DELIMITERS); - wprintw (ptr_win->win_status, "("); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS); - i = 0; - first_mode = 1; - while (CHANNEL(ptr_win->buffer)->modes[i]) + if (CHANNEL(ptr_win->buffer)->type == CHAT_CHANNEL) { - if (CHANNEL(ptr_win->buffer)->modes[i] != ' ') + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, "("); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + i = 0; + first_mode = 1; + while (CHANNEL(ptr_win->buffer)->modes[i]) { - if (first_mode) + if (CHANNEL(ptr_win->buffer)->modes[i] != ' ') { - wprintw (ptr_win->win_status, "+"); - first_mode = 0; + if (first_mode) + { + wprintw (ptr_win->win_status, "+"); + first_mode = 0; + } + wprintw (ptr_win->win_status, "%c", + CHANNEL(ptr_win->buffer)->modes[i]); } - wprintw (ptr_win->win_status, "%c", - CHANNEL(ptr_win->buffer)->modes[i]); + i++; } - i++; + if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_KEY] != ' ') + wprintw (ptr_win->win_status, ",%s", + CHANNEL(ptr_win->buffer)->key); + if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_LIMIT] != ' ') + wprintw (ptr_win->win_status, ",%d", + CHANNEL(ptr_win->buffer)->limit); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, ")"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + } + + /* display DCC if private is DCC CHAT */ + if ((CHANNEL(ptr_win->buffer)->type == CHAT_PRIVATE) + && (CHANNEL(ptr_win->buffer)->dcc_chat)) + { + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, "("); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + wprintw (ptr_win->win_status, "DCC"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, ")"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); } - if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_KEY] != ' ') - wprintw (ptr_win->win_status, ",%s", - CHANNEL(ptr_win->buffer)->key); - if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_LIMIT] != ' ') - wprintw (ptr_win->win_status, ",%d", - CHANNEL(ptr_win->buffer)->limit); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS_DELIMITERS); - wprintw (ptr_win->win_status, ")"); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS); } wprintw (ptr_win->win_status, " "); } @@ -1393,8 +1425,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase) switch (dcc_selected->status) { case DCC_WAITING: - if ((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV)) + if (DCC_IS_RECV(dcc_selected->type)) wprintw (ptr_win->win_input, _(" [A] Accept")); wprintw (ptr_win->win_input, _(" [C] Cancel")); break; @@ -2271,15 +2302,11 @@ gui_end () /* delete all buffers */ while (gui_buffers) - { gui_buffer_free (gui_buffers, 0); - } /* delete all windows */ while (gui_windows) - { gui_window_free (gui_windows); - } /* delete general history */ history_general_free (); @@ -2355,11 +2382,11 @@ gui_add_message (t_gui_buffer *buffer, int type, int color, char *message) } /* - * gui_printf_color_type: display a message in a buffer + * gui_printf_type_color: display a message in a buffer */ void -gui_printf_color_type (t_gui_buffer *buffer, int type, int color, char *message, ...) +gui_printf_type_color (t_gui_buffer *buffer, int type, int color, char *message, ...) { static char buf[8192]; char timestamp[16]; diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index ca29e837b..9aff7153d 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -569,9 +569,8 @@ gui_read_keyb () case 'a': case 'A': if (dcc_selected - && (((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV)) - && (dcc_selected->status == DCC_WAITING))) + && (DCC_IS_RECV(dcc_selected->status)) + && (dcc_selected->status == DCC_WAITING)) { dcc_accept (dcc_selected); } @@ -580,9 +579,7 @@ gui_read_keyb () case 'c': case 'C': if (dcc_selected - && ((dcc_selected->status == DCC_WAITING) - || (dcc_selected->status == DCC_CONNECTING) - || (dcc_selected->status == DCC_ACTIVE))) + && (!DCC_ENDED(dcc_selected->status))) { dcc_close (dcc_selected, DCC_ABORTED); gui_redraw_buffer (gui_current_window->buffer); @@ -594,9 +591,7 @@ gui_read_keyb () gui_current_window->dcc_selected = NULL; for (ptr_dcc = dcc_list; ptr_dcc; ptr_dcc = ptr_dcc->next_dcc) { - if ((dcc_selected->status == DCC_DONE) - || (dcc_selected->status == DCC_FAILED) - || (dcc_selected->status == DCC_ABORTED)) + if (DCC_ENDED(ptr_dcc->status)) dcc_free (ptr_dcc); } gui_redraw_buffer (gui_current_window->buffer); @@ -618,12 +613,7 @@ gui_read_keyb () case 'r': case 'R': if (dcc_selected - && (((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV) - || (dcc_selected->type == DCC_FILE_SEND)) - && ((dcc_selected->status == DCC_DONE) - || (dcc_selected->status == DCC_FAILED) - || (dcc_selected->status == DCC_ABORTED)))) + && (DCC_ENDED(dcc_selected->status))) { if (dcc_selected->next_dcc) gui_current_window->dcc_selected = dcc_selected->next_dcc; @@ -775,8 +765,8 @@ gui_main_loop () FD_SET (ptr_server->child_read, &read_fd); else { - if (ptr_server->sock4 >= 0) - FD_SET (ptr_server->sock4, &read_fd); + if (ptr_server->sock >= 0) + FD_SET (ptr_server->sock, &read_fd); } } } @@ -798,8 +788,8 @@ gui_main_loop () } else { - if ((ptr_server->sock4 >= 0) && - (FD_ISSET (ptr_server->sock4, &read_fd))) + if ((ptr_server->sock >= 0) && + (FD_ISSET (ptr_server->sock, &read_fd))) server_recv (ptr_server); } } diff --git a/src/gui/gui.h b/src/gui/gui.h index 7c7ddbc6e..6885ecf3d 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -86,13 +86,16 @@ #define MSG_TYPE_NOLOG 64 #define gui_printf_color(buffer, color, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO, color, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO, color, fmt, ##argz) + +#define gui_printf_type(buffer, type, fmt, argz...) \ + gui_printf_type_color(buffer, type, -1, fmt, ##argz) #define gui_printf(buffer, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO, -1, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO, -1, fmt, ##argz) #define gui_printf_nolog(buffer, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO | MSG_TYPE_NOLOG, -1, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO | MSG_TYPE_NOLOG, -1, fmt, ##argz) typedef struct t_gui_message t_gui_message; @@ -313,7 +316,7 @@ extern void gui_init_colors (); extern void gui_set_window_title (); extern void gui_init (); extern void gui_end (); -extern void gui_printf_color_type (/*@null@*/ t_gui_buffer *, int, int, char *, ...); +extern void gui_printf_type_color (/*@null@*/ t_gui_buffer *, int, int, char *, ...); extern void gui_main_loop (); #endif /* gui.h */ diff --git a/src/irc/irc-channel.c b/src/irc/irc-channel.c index c4ba4e9b2..10faf44b0 100644 --- a/src/irc/irc-channel.c +++ b/src/irc/irc-channel.c @@ -25,6 +25,7 @@ #endif #include +#include #include #include "../common/weechat.h" @@ -53,6 +54,7 @@ channel_new (t_irc_server *server, int channel_type, char *channel_name, /* initialize new channel */ new_channel->type = channel_type; + new_channel->dcc_chat = NULL; new_channel->name = strdup (channel_name); new_channel->topic = NULL; memset (new_channel->modes, ' ', sizeof (new_channel->modes)); @@ -101,6 +103,14 @@ channel_free (t_irc_server *server, t_irc_channel *channel) if (channel->next_channel) (channel->next_channel)->prev_channel = channel->prev_channel; + /* close DCC CHAT */ + if ((t_irc_dcc *)(channel->dcc_chat) && + (!DCC_ENDED(((t_irc_dcc *)(channel->dcc_chat))->status))) + { + dcc_close ((t_irc_dcc *)(channel->dcc_chat), DCC_ABORTED); + dcc_redraw (1); + } + /* free data */ if (channel->name) free (channel->name); @@ -204,3 +214,49 @@ channel_set_away (t_irc_channel *channel, char *nick, int is_away) nick_set_away (channel, ptr_nick, is_away); } } + +/* + * channel_create_dcc: create DCC CHAT channel + */ + +int +channel_create_dcc (t_irc_dcc *ptr_dcc) +{ + t_irc_channel *ptr_channel; + + ptr_channel = channel_search (ptr_dcc->server, ptr_dcc->nick); + if (!ptr_channel) + ptr_channel = channel_new (ptr_dcc->server, CHAT_PRIVATE, + ptr_dcc->nick, 0); + if (!ptr_channel) + return 0; + + if (ptr_channel->dcc_chat && + (!DCC_ENDED(((t_irc_dcc *)(ptr_channel->dcc_chat))->status))) + return 0; + + ptr_channel->dcc_chat = ptr_dcc; + ptr_dcc->channel = ptr_channel; + gui_redraw_buffer (ptr_channel->buffer); + return 1; +} + +/* + * channel_remove_dcc: remove a DCC CHAT + */ + +void +channel_remove_dcc (t_irc_dcc *ptr_dcc) +{ + t_irc_channel *ptr_channel; + + for (ptr_channel = ptr_dcc->server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if ((t_irc_dcc *)(ptr_channel->dcc_chat) == ptr_dcc) + { + ptr_channel->dcc_chat = NULL; + gui_redraw_buffer (ptr_channel->buffer); + } + } +} diff --git a/src/irc/irc-commands.c b/src/irc/irc-commands.c index 88cc8065b..54ea5c843 100644 --- a/src/irc/irc-commands.c +++ b/src/irc/irc-commands.c @@ -44,12 +44,12 @@ t_irc_command irc_commands[] = N_("nickname type"), N_("nickname: user to send ctcp to\ntype: \"action\" or \"version\""), 2, MAX_ARGS, 1, NULL, irc_cmd_send_ctcp, NULL }, - { "dcc", N_("starts DCC (file or chat)"), - N_("action nickname [file]"), - N_("action: 'send' (file) or 'chat'\n" + { "dcc", N_("starts DCC (file or chat) or close chat"), + N_("action [nickname [file]]"), + N_("action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)"), - 2, MAX_ARGS, 1, NULL, irc_cmd_send_dcc, NULL }, + 1, MAX_ARGS, 1, NULL, irc_cmd_send_dcc, NULL }, { "deop", N_("removes channel operator status from nickname(s)"), N_("nickname [nickname]"), "", 1, MAX_ARGS, 1, irc_cmd_send_deop, NULL, NULL }, diff --git a/src/irc/irc-dcc.c b/src/irc/irc-dcc.c index 2d51c7e1a..6cc21774f 100644 --- a/src/irc/irc-dcc.c +++ b/src/irc/irc-dcc.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,10 @@ dcc_connect (t_irc_dcc *ptr_dcc) { struct sockaddr_in addr; - ptr_dcc->status = DCC_CONNECTING; + if (ptr_dcc->type == DCC_CHAT_SEND) + ptr_dcc->status = DCC_WAITING; + else + ptr_dcc->status = DCC_CONNECTING; if (ptr_dcc->sock == -1) { @@ -81,8 +85,8 @@ dcc_connect (t_irc_dcc *ptr_dcc) if (fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK) == -1) return 0; - /* for DCC SEND, listen to socket for a connection */ - if (ptr_dcc->type == DCC_FILE_SEND) + /* for sending (chat or file), listen to socket for a connection */ + if (DCC_IS_SEND(ptr_dcc->type)) { if (listen (ptr_dcc->sock, 1) == -1) return 0; @@ -90,8 +94,8 @@ dcc_connect (t_irc_dcc *ptr_dcc) return 0; } - /* for DCC RECV, connect to listening host */ - if (ptr_dcc->type == DCC_FILE_RECV) + /* for receiving (chat or file), connect to listening host */ + if (DCC_IS_RECV(ptr_dcc->type)) { memset (&addr, 0, sizeof (addr)); addr.sin_port = htons (ptr_dcc->port); @@ -125,6 +129,8 @@ dcc_free (t_irc_dcc *ptr_dcc) if (ptr_dcc->nick) free (ptr_dcc->nick); + if (ptr_dcc->unterminated_message) + free (ptr_dcc->unterminated_message); if (ptr_dcc->filename) free (ptr_dcc->filename); @@ -143,7 +149,7 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) if (status == DCC_DONE) { - if ((ptr_dcc->type == DCC_FILE_SEND) || (ptr_dcc->type == DCC_FILE_RECV)) + if (DCC_IS_FILE(ptr_dcc->type)) { irc_display_prefix (ptr_dcc->server->buffer, PREFIX_INFO); gui_printf (ptr_dcc->server->buffer, _("DCC: file ")); @@ -167,6 +173,25 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) gui_printf (ptr_dcc->server->buffer, _(": ok!\n")); } } + if (status == DCC_ABORTED) + { + if (DCC_IS_CHAT(ptr_dcc->type)) + { + irc_display_prefix (ptr_dcc->channel->buffer, PREFIX_INFO); + gui_printf (ptr_dcc->channel->buffer, _("DCC chat closed with ")); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_NICK, + "%s", ptr_dcc->nick); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + ptr_dcc->addr >> 24, (ptr_dcc->addr >> 16) & 0xff, + (ptr_dcc->addr >> 8) & 0xff, ptr_dcc->addr & 0xff); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, ")\n"); + } + } + + if (DCC_IS_CHAT(ptr_dcc->type)) + channel_remove_dcc (ptr_dcc); if (ptr_dcc->sock != -1) { @@ -180,6 +205,39 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) } } +/* + * dcc_channel_for_chat: create channel for DCC chat + */ + +void +dcc_channel_for_chat (t_irc_dcc *ptr_dcc) +{ + if (!channel_create_dcc (ptr_dcc)) + { + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_ERROR); + gui_printf (ptr_dcc->server->buffer, + _("%s can't associate DCC chat with private buffer " + "(maybe private buffer has already DCC CHAT?)\n"), + WEECHAT_ERROR); + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + + irc_display_prefix (ptr_dcc->channel->buffer, PREFIX_INFO); + gui_printf_type (ptr_dcc->channel->buffer, MSG_TYPE_MSG, + _("Connected to ")); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_NICK, + "%s", ptr_dcc->nick); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + ptr_dcc->addr >> 24, (ptr_dcc->addr >> 16) & 0xff, + (ptr_dcc->addr >> 8) & 0xff, ptr_dcc->addr & 0xff); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, ") "); + gui_printf (ptr_dcc->channel->buffer, _("via DCC chat\n")); +} + /* * dcc_accept: accepts a DCC file or chat request */ @@ -197,67 +255,77 @@ dcc_accept (t_irc_dcc *ptr_dcc) else { ptr_dcc->status = DCC_ACTIVE; - ptr_home = getenv ("HOME"); - ptr_dcc->local_filename = (char *) malloc (strlen (cfg_dcc_download_path) + - strlen (ptr_dcc->nick) + - strlen (ptr_dcc->filename) + - ((cfg_dcc_download_path[0] == '~') ? - strlen (ptr_home) : 0) + - 4); - if (!ptr_dcc->local_filename) + + /* DCC file => look for local filename and open it in writing mode */ + if (DCC_IS_FILE(ptr_dcc->type)) { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - if (cfg_dcc_download_path[0] == '~') - { - strcpy (ptr_dcc->local_filename, ptr_home); - strcat (ptr_dcc->local_filename, cfg_dcc_download_path + 1); + ptr_home = getenv ("HOME"); + ptr_dcc->local_filename = (char *) malloc (strlen (cfg_dcc_download_path) + + strlen (ptr_dcc->nick) + + strlen (ptr_dcc->filename) + + ((cfg_dcc_download_path[0] == '~') ? + strlen (ptr_home) : 0) + + 4); + if (!ptr_dcc->local_filename) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + if (cfg_dcc_download_path[0] == '~') + { + strcpy (ptr_dcc->local_filename, ptr_home); + strcat (ptr_dcc->local_filename, cfg_dcc_download_path + 1); + } + else + strcpy (ptr_dcc->local_filename, cfg_dcc_download_path); + if (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != DIR_SEPARATOR_CHAR) + strcat (ptr_dcc->local_filename, DIR_SEPARATOR); + strcat (ptr_dcc->local_filename, ptr_dcc->nick); + strcat (ptr_dcc->local_filename, "."); + strcat (ptr_dcc->local_filename, ptr_dcc->filename); + + /* file already exists? */ + if (access (ptr_dcc->local_filename, F_OK) == 0) + { + /* if auto rename is not set, then abort DCC */ + if (!cfg_dcc_auto_rename) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + + filename2 = (char *) malloc (strlen (ptr_dcc->local_filename) + 16); + if (!filename2) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->filename_suffix = 0; + do + { + ptr_dcc->filename_suffix++; + sprintf (filename2, "%s.%d", + ptr_dcc->local_filename, + ptr_dcc->filename_suffix); + } + while (access (filename2, F_OK) == 0); + + free (ptr_dcc->local_filename); + ptr_dcc->local_filename = strdup (filename2); + free (filename2); + } + ptr_dcc->file = open (ptr_dcc->local_filename, + O_CREAT | O_TRUNC | O_WRONLY | O_NONBLOCK, + 0644); } else - strcpy (ptr_dcc->local_filename, cfg_dcc_download_path); - if (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != DIR_SEPARATOR_CHAR) - strcat (ptr_dcc->local_filename, DIR_SEPARATOR); - strcat (ptr_dcc->local_filename, ptr_dcc->nick); - strcat (ptr_dcc->local_filename, "."); - strcat (ptr_dcc->local_filename, ptr_dcc->filename); - - /* file already exists? */ - if (access (ptr_dcc->local_filename, F_OK) == 0) { - /* if auto rename is not set, then abort DCC */ - if (!cfg_dcc_auto_rename) - { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - - filename2 = (char *) malloc (strlen (ptr_dcc->local_filename) + 16); - if (!filename2) - { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - ptr_dcc->filename_suffix = 0; - do - { - ptr_dcc->filename_suffix++; - sprintf (filename2, "%s.%d", - ptr_dcc->local_filename, - ptr_dcc->filename_suffix); - } - while (access (filename2, F_OK) == 0); - - free (ptr_dcc->local_filename); - ptr_dcc->local_filename = strdup (filename2); - free (filename2); + /* DCC CHAT => associate DCC with channel */ + dcc_channel_for_chat (ptr_dcc); } - ptr_dcc->file = open (ptr_dcc->local_filename, - O_CREAT | O_TRUNC | O_WRONLY | O_NONBLOCK, - 0644); } dcc_redraw (1); } @@ -272,22 +340,31 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic { t_irc_dcc *new_dcc; + /* create new DCC struct */ if ((new_dcc = (t_irc_dcc *) malloc (sizeof (t_irc_dcc))) == NULL) { - gui_printf_nolog (server->buffer, - _("%s not enough memory for new DCC\n"), - WEECHAT_ERROR); + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s not enough memory for new DCC\n"), + WEECHAT_ERROR); return NULL; } + + /* initialize new DCC */ new_dcc->server = server; + new_dcc->channel = NULL; new_dcc->type = type; new_dcc->status = DCC_WAITING; new_dcc->addr = addr; new_dcc->port = port; new_dcc->nick = strdup (nick); new_dcc->sock = sock; + new_dcc->unterminated_message = NULL; new_dcc->file = -1; - new_dcc->filename = strdup (filename); + if (DCC_IS_CHAT(type)) + new_dcc->filename = strdup (_("DCC chat")); + else + new_dcc->filename = (filename) ? strdup (filename) : NULL; new_dcc->local_filename = (local_filename) ? strdup (local_filename) : NULL; new_dcc->filename_suffix = -1; new_dcc->size = size; @@ -302,6 +379,7 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_current_window->dcc_first = NULL; gui_current_window->dcc_selected = NULL; + /* write info message on server buffer */ if (type == DCC_FILE_RECV) { irc_display_prefix (server->buffer, PREFIX_INFO); @@ -318,17 +396,11 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%lu", size); gui_printf (server->buffer, _(" bytes\n")); } - if (type == DCC_FILE_SEND) { irc_display_prefix (server->buffer, PREFIX_INFO); gui_printf (server->buffer, _("Sending DCC file to ")); gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s", nick); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, " ("); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_HOST, - "%d.%d.%d.%d", - addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, ")"); gui_printf (server->buffer, ": "); gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%s", filename); gui_printf (server->buffer, _(" (local filename: ")); @@ -337,8 +409,26 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%lu", size); gui_printf (server->buffer, _(" bytes\n")); } + if (type == DCC_CHAT_RECV) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Incoming DCC chat request from ")); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s", nick); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, ")\n"); + } + if (type == DCC_CHAT_SEND) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Sending DCC chat request to ")); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s\n", nick); + } - if (type == DCC_FILE_SEND) + /* connect if needed and redraw DCC buffer */ + if (DCC_IS_SEND(type)) { if (!dcc_connect (new_dcc)) { @@ -358,11 +448,11 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic } /* - * dcc_send: send DCC request (file or chat) + * dcc_send_request: send DCC request (file or chat) */ void -dcc_send (t_irc_server *server, char *nick, char *filename) +dcc_send_request (t_irc_server *server, int type, char *nick, char *filename) { char *ptr_home, *filename2, *short_filename, *pos; int spaces; @@ -371,57 +461,66 @@ dcc_send (t_irc_server *server, char *nick, char *filename) struct sockaddr_in addr; socklen_t length; unsigned long local_addr; + t_irc_dcc *ptr_dcc; - /* add home if filename not beginning with '/' (not for Win32) */ - #ifdef _WIN32 - filename2 = strdup (filename); - #else - if (filename[0] == '/') - filename2 = strdup (filename); - else + filename2 = NULL; + short_filename = NULL; + spaces = 0; + + if (type == DCC_FILE_SEND) { - ptr_home = getenv ("HOME"); - filename2 = (char *) malloc (strlen (cfg_dcc_upload_path) + - strlen (filename) + - ((cfg_dcc_upload_path[0] == '~') ? - strlen (ptr_home) : 0) + - 4); - if (!filename2) + /* add home if filename not beginning with '/' (not for Win32) */ + #ifdef _WIN32 + filename2 = strdup (filename); + #else + if (filename[0] == '/') + filename2 = strdup (filename); + else + { + ptr_home = getenv ("HOME"); + filename2 = (char *) malloc (strlen (cfg_dcc_upload_path) + + strlen (filename) + + ((cfg_dcc_upload_path[0] == '~') ? + strlen (ptr_home) : 0) + + 4); + if (!filename2) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s not enough memory for DCC SEND\n"), + WEECHAT_ERROR); + return; + } + if (cfg_dcc_upload_path[0] == '~') + { + strcpy (filename2, ptr_home); + strcat (filename2, cfg_dcc_upload_path + 1); + } + else + strcpy (filename2, cfg_dcc_upload_path); + if (filename2[strlen (filename2) - 1] != DIR_SEPARATOR_CHAR) + strcat (filename2, DIR_SEPARATOR); + strcat (filename2, filename); + } + #endif + + /* check if file exists */ + if (stat (filename2, &st) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s not enough memory for DCC SEND\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot access file \"%s\"\n"), + WEECHAT_ERROR, filename2); + if (filename2) + free (filename2); return; } - if (cfg_dcc_upload_path[0] == '~') - { - strcpy (filename2, ptr_home); - strcat (filename2, cfg_dcc_upload_path + 1); - } - else - strcpy (filename2, cfg_dcc_upload_path); - if (filename2[strlen (filename2) - 1] != DIR_SEPARATOR_CHAR) - strcat (filename2, DIR_SEPARATOR); - strcat (filename2, filename); - } - #endif - - /* check if file exists */ - if (stat (filename2, &st) == -1) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot access file \"%s\"\n"), - WEECHAT_ERROR, filename2); - free (filename2); - return; } /* get local IP address */ memset (&addr, 0, sizeof (struct sockaddr_in)); length = sizeof (addr); - getsockname (server->sock4, (struct sockaddr *) &addr, &length); + getsockname (server->sock, (struct sockaddr *) &addr, &length); addr.sin_family = AF_INET; local_addr = ntohl (addr.sin_addr.s_addr); @@ -430,10 +529,11 @@ dcc_send (t_irc_server *server, char *nick, char *filename) if (sock == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create socket for DCC\n"), - WEECHAT_ERROR); - free (filename2); + gui_printf (server->buffer, + _("%s cannot create socket for DCC\n"), + WEECHAT_ERROR); + if (filename2) + free (filename2); return; } @@ -442,68 +542,243 @@ dcc_send (t_irc_server *server, char *nick, char *filename) if (bind (sock, (struct sockaddr *) &addr, sizeof (addr)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot find port for DCC\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot find port for DCC\n"), + WEECHAT_ERROR); close (sock); - free (filename2); + if (filename2) + free (filename2); return; } length = sizeof (addr); getsockname (sock, (struct sockaddr *) &addr, &length); port = ntohs (addr.sin_port); - /* extract short filename (without path) */ - pos = strrchr (filename2, DIR_SEPARATOR_CHAR); - if (pos) - short_filename = strdup (pos + 1); - else - short_filename = strdup (filename2); - - /* convert spaces to underscore if asked and needed */ - pos = short_filename; - spaces = 0; - while (pos[0]) + if (type == DCC_FILE_SEND) { - if (pos[0] == ' ') + /* extract short filename (without path) */ + pos = strrchr (filename2, DIR_SEPARATOR_CHAR); + if (pos) + short_filename = strdup (pos + 1); + else + short_filename = strdup (filename2); + + /* convert spaces to underscore if asked and needed */ + pos = short_filename; + spaces = 0; + while (pos[0]) { - if (cfg_dcc_convert_spaces) - pos[0] = '_'; - else - spaces = 1; + if (pos[0] == ' ') + { + if (cfg_dcc_convert_spaces) + pos[0] = '_'; + else + spaces = 1; + } + pos++; } - pos++; } /* add DCC entry and listen to socket */ - if (!dcc_add (server, DCC_FILE_SEND, local_addr, port, nick, sock, - short_filename, filename2, st.st_size)) + if (type == DCC_CHAT_SEND) + ptr_dcc = dcc_add (server, DCC_CHAT_SEND, local_addr, port, nick, sock, + NULL, NULL, 0); + else + ptr_dcc = dcc_add (server, DCC_FILE_SEND, local_addr, port, nick, sock, + short_filename, filename2, st.st_size); + if (!ptr_dcc) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot send DCC\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot send DCC\n"), + WEECHAT_ERROR); close (sock); - free (short_filename); - free (filename2); + if (short_filename) + free (short_filename); + if (filename2) + free (filename2); return; } /* send DCC request to nick */ - server_sendf (server, - (spaces) ? - "PRIVMSG %s :\01DCC SEND \"%s\" %lu %d %u\01\r\n" : - "PRIVMSG %s :\01DCC SEND %s %lu %d %u\01\r\n", - nick, short_filename, local_addr, port, - (unsigned long) st.st_size); + if (type == DCC_CHAT_SEND) + server_sendf (server, + "PRIVMSG %s :\01DCC CHAT chat %lu %d\01\r\n", + nick, local_addr, port); + else + server_sendf (server, + (spaces) ? + "PRIVMSG %s :\01DCC SEND \"%s\" %lu %d %u\01\r\n" : + "PRIVMSG %s :\01DCC SEND %s %lu %d %u\01\r\n", + nick, short_filename, local_addr, port, + (unsigned long) st.st_size); - free (short_filename); - free (filename2); + if (short_filename) + free (short_filename); + if (filename2) + free (filename2); } +/* + * dcc_chat_send: send data to remote host via DCC CHAT + */ + +int +dcc_chat_send (t_irc_dcc *ptr_dcc, char *buffer, int size_buf) +{ + if (!ptr_dcc) + return -1; + + return send (ptr_dcc->sock, buffer, size_buf, 0); +} /* - * dcc_handle: receive/send data for each active DCC + * dcc_chat_sendf: send formatted data to remote host via DCC CHAT + */ + +void +dcc_chat_sendf (t_irc_dcc *ptr_dcc, char *fmt, ...) +{ + va_list args; + static char buffer[4096]; + char *buf2; + int size_buf; + + if (!ptr_dcc || (ptr_dcc->sock == -1)) + return; + + va_start (args, fmt); + size_buf = vsnprintf (buffer, sizeof (buffer) - 1, fmt, args); + va_end (args); + + if ((size_buf == 0) || (strcmp (buffer, "\r\n") == 0)) + return; + + buffer[sizeof (buffer) - 1] = '\0'; + if ((size_buf < 0) || (size_buf > (int) (sizeof (buffer) - 1))) + size_buf = strlen (buffer); + #ifdef DEBUG + buffer[size_buf - 2] = '\0'; + gui_printf (ptr_dcc->server->buffer, "[DEBUG] Sending to remote host (DCC CHAT) >>> %s\n", buffer); + buffer[size_buf - 2] = '\r'; + #endif + buf2 = weechat_convert_encoding ((cfg_look_charset_internal && cfg_look_charset_internal[0]) ? + cfg_look_charset_internal : local_charset, + cfg_look_charset_encode, + buffer); + if (dcc_chat_send (ptr_dcc, buf2, strlen (buf2)) <= 0) + { + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_ERROR); + gui_printf (ptr_dcc->server->buffer, _("%s error sending data to \"%s\" via DCC CHAT\n"), + WEECHAT_ERROR, ptr_dcc->nick); + dcc_close (ptr_dcc, DCC_FAILED); + } + free (buf2); +} + +/* + * dcc_chat_recv: receive data from DCC CHAT host + */ + +void +dcc_chat_recv (t_irc_dcc *ptr_dcc) +{ + static char buffer[4096 + 2]; + char *buf2, *pos, *ptr_buf, *next_ptr_buf; + int num_read; + + num_read = recv (ptr_dcc->sock, buffer, sizeof (buffer) - 2, 0); + if (num_read > 0) + { + buffer[num_read] = '\0'; + + buf2 = NULL; + ptr_buf = buffer; + if (ptr_dcc->unterminated_message) + { + buf2 = (char *) malloc (strlen (ptr_dcc->unterminated_message) + + strlen (buffer) + 1); + if (buf2) + { + strcpy (buf2, ptr_dcc->unterminated_message); + strcat (buf2, buffer); + } + ptr_buf = buf2; + free (ptr_dcc->unterminated_message); + ptr_dcc->unterminated_message = NULL; + } + + while (ptr_buf && ptr_buf[0]) + { + next_ptr_buf = NULL; + pos = strstr (ptr_buf, "\r\n"); + if (pos) + { + pos[0] = '\0'; + next_ptr_buf = pos + 2; + } + else + { + pos = strstr (ptr_buf, "\n"); + if (pos) + { + pos[0] = '\0'; + next_ptr_buf = pos + 1; + } + else + { + ptr_dcc->unterminated_message = strdup (ptr_buf); + ptr_buf = NULL; + next_ptr_buf = NULL; + } + } + + if (ptr_buf) + { + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "<"); + if (strstr (ptr_buf, ptr_dcc->server->nick)) + { + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK | MSG_TYPE_HIGHLIGHT, + COLOR_WIN_CHAT_HIGHLIGHT, + "%s", ptr_dcc->nick); + if ( (cfg_look_infobar_delay_highlight > 0) + && (ptr_dcc->channel->buffer != gui_current_window->buffer) ) + gui_infobar_printf (cfg_look_infobar_delay_highlight, + COLOR_WIN_INFOBAR_HIGHLIGHT, + _("Private %s> %s"), + ptr_dcc->nick, ptr_buf); + } + else + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_NICK_PRIVATE, + "%s", ptr_dcc->nick); + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "> "); + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_MSG, + COLOR_WIN_CHAT, "%s\n", ptr_buf); + } + + ptr_buf = next_ptr_buf; + } + + if (buf2) + free (buf2); + } + else + { + dcc_close (ptr_dcc, DCC_ABORTED); + dcc_redraw (1); + } +} + +/* + * dcc_handle: receive/send data for each active DCC (files only) */ void @@ -555,6 +830,47 @@ dcc_handle () ptr_dcc->addr = ntohl (addr.sin_addr.s_addr); ptr_dcc->status = DCC_ACTIVE; ptr_dcc->file = open (ptr_dcc->local_filename, O_RDONLY | O_NONBLOCK, 0644); + dcc_redraw (1); + } + } + } + } + + if (ptr_dcc->status == DCC_WAITING) + { + if (ptr_dcc->type == DCC_CHAT_SEND) + { + FD_ZERO (&read_fd); + FD_SET (ptr_dcc->sock, &read_fd); + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + /* something to read on socket? */ + if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) + { + if (FD_ISSET (ptr_dcc->sock, &read_fd)) + { + length = sizeof (addr); + sock = accept (ptr_dcc->sock, (struct sockaddr *) &addr, &length); + close (ptr_dcc->sock); + ptr_dcc->sock = -1; + if (sock < 0) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->sock = sock; + if (fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK) == -1) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->addr = ntohl (addr.sin_addr.s_addr); + ptr_dcc->status = DCC_ACTIVE; + dcc_redraw (1); + dcc_channel_for_chat (ptr_dcc); } } } @@ -562,6 +878,20 @@ dcc_handle () if (ptr_dcc->status == DCC_ACTIVE) { + if (DCC_IS_CHAT(ptr_dcc->type)) + { + FD_ZERO (&read_fd); + FD_SET (ptr_dcc->sock, &read_fd); + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + /* something to read on socket? */ + if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) + { + if (FD_ISSET (ptr_dcc->sock, &read_fd)) + dcc_chat_recv (ptr_dcc); + } + } if (ptr_dcc->type == DCC_FILE_RECV) { num_read = recv (ptr_dcc->sock, buffer, sizeof (buffer), 0); @@ -596,6 +926,7 @@ dcc_handle () { if (cfg_dcc_blocksize > (int) sizeof (buffer)) { + irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, _("%s DCC failed because blocksize is too " "big. Check value of \"dcc_blocksize\" option, " "max is %d.\n"), diff --git a/src/irc/irc-display.c b/src/irc/irc-display.c index ec5f135b0..4b5212fa3 100644 --- a/src/irc/irc-display.c +++ b/src/irc/irc-display.c @@ -52,9 +52,9 @@ irc_display_prefix (t_gui_buffer *buffer, char *prefix) if (prefix[0] == prefix[2]) { - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c", prefix[0]); - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX2, "%c", prefix[1]); - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c ", prefix[2]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c", prefix[0]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX2, "%c", prefix[1]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c ", prefix[2]); } else gui_printf_color (buffer, COLOR_WIN_CHAT_PREFIX1, "%s ", prefix); @@ -70,43 +70,43 @@ irc_display_nick (t_gui_buffer *buffer, t_irc_nick *nick, int message_type, int display_around, int color_nick, int no_nickmode) { if (display_around) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_DARK, "<"); if (cfg_look_nickmode) { if (nick->is_chanowner) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "~"); else if (nick->is_chanadmin) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "&"); else if (nick->is_op) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "@"); else if (nick->is_halfop) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_HALFOP, "%%"); else if (nick->has_voice) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_VOICE, "+"); else if (cfg_look_nickmode_empty && !no_nickmode) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT, " "); } if (color_nick < 0) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_HIGHLIGHT, "%s", nick->nick); else - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, (color_nick) ? ((cfg_look_color_nicks) ? @@ -115,7 +115,7 @@ irc_display_nick (t_gui_buffer *buffer, t_irc_nick *nick, int message_type, "%s", nick->nick); if (display_around) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_DARK, "> "); } diff --git a/src/irc/irc-recv.c b/src/irc/irc-recv.c index 6b34d4cd2..ab69abe8d 100644 --- a/src/irc/irc-recv.c +++ b/src/irc/irc-recv.c @@ -160,9 +160,9 @@ irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create new channel \"%s\"\n"), - WEECHAT_ERROR, arguments); + gui_printf (server->buffer, + _("%s cannot create new channel \"%s\"\n"), + WEECHAT_ERROR, arguments); return -1; } } @@ -227,9 +227,9 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "kick"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "kick"); return -1; } @@ -260,9 +260,9 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nick not found for \"%s\" command\n"), - WEECHAT_ERROR, "kick"); + gui_printf (server->buffer, + _("%s nick not found for \"%s\" command\n"), + WEECHAT_ERROR, "kick"); return -1; } if (strcmp (pos_nick, server->nick) == 0) @@ -550,9 +550,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "mode"); return -1; } @@ -565,9 +565,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) if (!pos) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without channel or nickname\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s \"%s\" command received without channel or nickname\n"), + WEECHAT_ERROR, "mode"); return -1; } pos[0] = '\0'; @@ -595,9 +595,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "mode"); return -1; } } @@ -635,9 +635,9 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "nick"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "nick"); return -1; } @@ -753,9 +753,9 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nickname not found for \"%s\" command\n"), - WEECHAT_ERROR, "notice"); + gui_printf (server->buffer, + _("%s nickname not found for \"%s\" command\n"), + WEECHAT_ERROR, "notice"); return -1; } if (strncmp (pos, "\01VERSION", 8) == 0) @@ -846,9 +846,9 @@ irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments) if (!host || !arguments) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host or channel\n"), - WEECHAT_ERROR, "part"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host or channel\n"), + WEECHAT_ERROR, "part"); return -1; } @@ -921,9 +921,9 @@ irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "part"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "part"); return -1; } @@ -995,9 +995,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "privmsg"); return -1; } @@ -1036,7 +1036,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) irc_display_prefix (ptr_channel->buffer, PREFIX_ACTION_ME); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1050,7 +1050,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT_NICK, "%s", host); gui_printf_color (ptr_channel->buffer, @@ -1078,16 +1078,16 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nick not found for \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s nick not found for \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1095,9 +1095,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1176,16 +1176,19 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) /* incoming DCC file */ if (strncmp (pos, "\01DCC SEND", 9) == 0) { - pos2 = strchr (pos, '\01'); + /* check if DCC SEND is ok, i.e. with 0x01 at end */ + pos2 = strchr (pos + 1, '\01'); if (!pos2) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2[0] = '\0'; + + /* DCC filename */ pos_file = pos + 9; while (pos_file[0] == ' ') pos_file++; @@ -1195,9 +1198,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!pos_size) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_size; @@ -1211,9 +1214,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!pos_port) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_port; @@ -1222,14 +1225,14 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) pos2--; pos2[1] = '\0'; - /* look for DCC address (IP) */ + /* look for DCC IP address */ pos_addr = strrchr (pos_file, ' '); if (!pos_addr) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_addr; @@ -1244,6 +1247,74 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) return 0; } + /* incoming DCC CHAT */ + if (strncmp (pos, "\01DCC CHAT", 9) == 0) + { + /* check if DCC CHAT is ok, i.e. with 0x01 at end */ + pos2 = strchr (pos + 1, '\01'); + if (!pos2) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos2[0] = '\0'; + + /* CHAT type */ + pos_file = pos + 9; + while (pos_file[0] == ' ') + pos_file++; + + /* DCC IP address */ + pos_addr = strchr (pos_file, ' '); + if (!pos_addr) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos_addr[0] = '\0'; + pos_addr++; + while (pos_addr[0] == ' ') + pos_addr++; + + /* look for DCC port */ + pos_port = strchr (pos_addr, ' '); + if (!pos_port) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos_port[0] = '\0'; + pos_port++; + while (pos_port[0] == ' ') + pos_port++; + + if (strcasecmp (pos_file, "chat") != 0) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s unknown DCC CHAT type received from "), + WEECHAT_ERROR); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, + "%s", host); + gui_printf (server->buffer, ": \"%s\"\n", pos_file); + return -1; + } + + dcc_add (server, DCC_CHAT_RECV, (unsigned long) atol (pos_addr), + atoi (pos_port), host, -1, NULL, NULL, 0); + + return 0; + } + /* private message received => display it */ ptr_channel = channel_search (server, host); if (!ptr_channel) @@ -1252,9 +1323,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create new private window \"%s\"\n"), - WEECHAT_ERROR, host); + gui_printf (server->buffer, + _("%s cannot create new private window \"%s\"\n"), + WEECHAT_ERROR, host); return -1; } } @@ -1270,7 +1341,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) irc_display_prefix (ptr_channel->buffer, PREFIX_ACTION_ME); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1284,7 +1355,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT_NICK, "%s", host); gui_printf_color (ptr_channel->buffer, @@ -1292,12 +1363,12 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) } else { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1309,14 +1380,14 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_PRIVATE, "%s", host); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -1324,9 +1395,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1348,9 +1419,9 @@ irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "quit"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "quit"); return -1; } @@ -1500,9 +1571,9 @@ irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments) if (!string_is_channel (arguments)) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without channel\n"), - WEECHAT_ERROR, "topic"); + gui_printf (server->buffer, + _("%s \"%s\" command received without channel\n"), + WEECHAT_ERROR, "topic"); return -1; } @@ -2558,9 +2629,9 @@ irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "332"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "332"); return -1; } } @@ -2568,9 +2639,9 @@ irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify channel for \"%s\" command\n"), - WEECHAT_ERROR, "332"); + gui_printf (server->buffer, + _("%s cannot identify channel for \"%s\" command\n"), + WEECHAT_ERROR, "332"); return -1; } return 0; @@ -2625,36 +2696,36 @@ irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify date/time for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify date/time for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify nickname for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify nickname for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify channel for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify channel for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } return 0; @@ -2862,9 +2933,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) if (pos[0] != ':') { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "353"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "353"); return -1; } pos++; @@ -2908,9 +2979,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) is_op, is_halfop, has_voice)) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create nick \"%s\" for channel \"%s\"\n"), - WEECHAT_ERROR, pos_nick, ptr_channel->name); + gui_printf (server->buffer, + _("%s cannot create nick \"%s\" for channel \"%s\"\n"), + WEECHAT_ERROR, pos_nick, ptr_channel->name); } } } @@ -2919,9 +2990,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "353"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "353"); return -1; } return 0; diff --git a/src/irc/irc-send.c b/src/irc/irc-send.c index 1226df884..8fc1ec071 100644 --- a/src/irc/irc-send.c +++ b/src/irc/irc-send.c @@ -246,7 +246,7 @@ irc_cmd_send_ctcp (t_irc_server *server, char *arguments) } /* - * irc_cmd_send_dcc: starts DCC (file or chat) + * irc_cmd_send_dcc: start DCC (file or chat) */ int @@ -254,8 +254,6 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) { char *pos_nick, *pos_file; - /* TODO: develop DCC CHAT */ - /* DCC SEND file */ if (strncasecmp (arguments, "send", 4) == 0) { @@ -270,6 +268,7 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) } while (pos_nick[0] == ' ') pos_nick++; + pos_file = strchr (pos_nick, ' '); if (!pos_file) { @@ -284,13 +283,41 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) while (pos_file[0] == ' ') pos_file++; - dcc_send (server, pos_nick, pos_file); + dcc_send_request (server, DCC_FILE_SEND, pos_nick, pos_file); } else if (strncasecmp (arguments, "chat", 4) == 0) + { + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf_nolog (server->buffer, + _("%s wrong argument count for \"%s\" command\n"), + WEECHAT_ERROR, "dcc chat"); + return -1; + } + while (pos_nick[0] == ' ') + pos_nick++; + + dcc_send_request (server, DCC_CHAT_SEND, pos_nick, NULL); + } + else if (strcasecmp (arguments, "close") == 0) + { + if (BUFFER_IS_PRIVATE(gui_current_window->buffer) && + CHANNEL(gui_current_window->buffer)->dcc_chat) + { + dcc_close ((t_irc_dcc *)(CHANNEL(gui_current_window->buffer)->dcc_chat), + DCC_ABORTED); + dcc_redraw (1); + } + } + else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, _("This command is not developed!\n")); - return 0; + gui_printf_nolog (server->buffer, + _("%s wrong arguments for \"%s\" command\n"), + WEECHAT_ERROR, "dcc"); + return -1; } return 0; @@ -630,7 +657,7 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) { irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -655,7 +682,7 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) { irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -691,13 +718,13 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) } } irc_display_prefix (server->buffer, PREFIX_SERVER); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "-"); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_NICK, "%s", arguments); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "-"); gui_printf_color (server->buffer, @@ -722,17 +749,17 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) gui_draw_buffer_title (ptr_channel->buffer, 1); } - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); @@ -1014,17 +1041,17 @@ irc_cmd_send_query (t_irc_server *server, char *arguments) /* display text if given */ if (pos) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); diff --git a/src/irc/irc-server.c b/src/irc/irc-server.c index bb23fc956..191ef7dc9 100644 --- a/src/irc/irc-server.c +++ b/src/irc/irc-server.c @@ -82,7 +82,7 @@ server_init (t_irc_server *server) server->child_pid = 0; server->child_read = -1; server->child_write = -1; - server->sock4 = -1; + server->sock = -1; server->is_connected = 0; server->unterminated_message = NULL; server->nick = NULL; @@ -271,6 +271,10 @@ server_free (t_irc_server *server) { t_irc_server *new_irc_servers; + /* close any opened channel/private */ + while (server->channels) + channel_free (server, server->channels); + /* remove server from queue */ if (last_irc_server == server) last_irc_server = server->prev_server; @@ -364,12 +368,12 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de */ int -server_send (t_irc_server * server, char *buffer, int size_buf) +server_send (t_irc_server *server, char *buffer, int size_buf) { if (!server) return -1; - return send (server->sock4, buffer, size_buf, 0); + return send (server->sock, buffer, size_buf, 0); } /* @@ -377,23 +381,23 @@ server_send (t_irc_server * server, char *buffer, int size_buf) */ void -server_sendf (t_irc_server * server, char *fmt, ...) +server_sendf (t_irc_server *server, char *fmt, ...) { va_list args; - static char buffer[1024]; + static char buffer[4096]; char *buf2; int size_buf; - + if (!server) return; - + va_start (args, fmt); size_buf = vsnprintf (buffer, sizeof (buffer) - 1, fmt, args); va_end (args); if ((size_buf == 0) || (strcmp (buffer, "\r\n") == 0)) return; - + buffer[sizeof (buffer) - 1] = '\0'; if ((size_buf < 0) || (size_buf > (int) (sizeof (buffer) - 1))) size_buf = strlen (buffer); @@ -632,7 +636,7 @@ server_recv (t_irc_server *server) static char buffer[4096 + 2]; int num_read; - num_read = recv (server->sock4, buffer, sizeof (buffer) - 2, 0); + num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0); if (num_read > 0) { buffer[num_read] = '\0'; @@ -687,10 +691,10 @@ server_close_connection (t_irc_server *server) server_kill_child (server); /* close network socket */ - if (server->sock4 != -1) + if (server->sock != -1) { - close (server->sock4); - server->sock4 = -1; + close (server->sock); + server->sock = -1; } /* free any pending message */ @@ -804,7 +808,7 @@ server_child (t_irc_server *server) } /* connect to server */ - error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); + error = connect (server->sock, (struct sockaddr *) &addr, sizeof (addr)); if (error != 0) { write (server->child_write, "3", 1); @@ -849,8 +853,8 @@ server_connect (t_irc_server *server) server->child_write = child_pipe[1]; /* create socket and set options */ - server->sock4 = socket (AF_INET, SOCK_STREAM, 0); - if (server->sock4 == -1) + server->sock = socket (AF_INET, SOCK_STREAM, 0); + if (server->sock == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, @@ -861,7 +865,7 @@ server_connect (t_irc_server *server) /* set SO_REUSEADDR option for socket */ set = 1; - if (setsockopt (server->sock4, SOL_SOCKET, SO_REUSEADDR, + if (setsockopt (server->sock, SOL_SOCKET, SO_REUSEADDR, (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); @@ -872,7 +876,7 @@ server_connect (t_irc_server *server) /* set SO_KEEPALIVE option for socket */ set = 1; - if (setsockopt (server->sock4, SOL_SOCKET, SO_KEEPALIVE, + if (setsockopt (server->sock, SOL_SOCKET, SO_KEEPALIVE, (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); diff --git a/src/irc/irc.h b/src/irc/irc.h index 828bca973..755bb874b 100644 --- a/src/irc/irc.h +++ b/src/irc/irc.h @@ -71,6 +71,14 @@ #define DCC_FAILED 4 /* DCC failed */ #define DCC_ABORTED 5 /* DCC aborted by user */ +#define DCC_IS_CHAT(type) ((type == DCC_CHAT_RECV) || (type == DCC_CHAT_SEND)) +#define DCC_IS_FILE(type) ((type == DCC_FILE_RECV) || (type == DCC_FILE_SEND)) +#define DCC_IS_RECV(type) ((type == DCC_CHAT_RECV) || (type == DCC_FILE_RECV)) +#define DCC_IS_SEND(type) ((type == DCC_CHAT_SEND) || (type == DCC_FILE_SEND)) + +#define DCC_ENDED(status) ((status == DCC_DONE) || (status == DCC_FAILED) || \ + (status == DCC_ABORTED)) + /* nick types */ typedef struct t_irc_nick t_irc_nick; @@ -100,6 +108,7 @@ typedef struct t_irc_channel t_irc_channel; struct t_irc_channel { int type; /* channel type */ + void *dcc_chat; /* DCC CHAT pointer (NULL if not DCC) */ char *name; /* name of channel (exemple: "#abc") */ char *topic; /* topic of channel (host for private) */ char modes[NUM_CHANNEL_MODES+1];/* channel modes */ @@ -142,7 +151,7 @@ struct t_irc_server pid_t child_pid; /* pid of child process (connecting) */ int child_read; /* to read into child pipe */ int child_write; /* to write into child pipe */ - int sock4; /* socket for server */ + int sock; /* socket for server */ int is_connected; /* 1 if WeeChat is connected to server */ char *unterminated_message; /* beginning of a message in input buf */ char *nick; /* current nickname */ @@ -198,12 +207,14 @@ typedef struct t_irc_dcc t_irc_dcc; struct t_irc_dcc { t_irc_server *server; /* irc server */ + t_irc_channel *channel; /* irc channel (for DCC chat only) */ int type; /* DCC type (send or receive) */ int status; /* DCC status (waiting, sending, ..) */ unsigned long addr; /* IP address */ int port; /* port */ char *nick; /* remote nick */ int sock; /* socket for connection */ + char *unterminated_message; /* beginning of a message in input buf */ int file; /* local file (for reading or writing) */ char *filename; /* filename (given by sender) */ char *local_filename; /* local filename (with path) */ @@ -260,6 +271,8 @@ extern int string_is_channel (char *); extern void channel_remove_away (t_irc_channel *); extern void channel_check_away (t_irc_server *, t_irc_channel *); extern void channel_set_away (t_irc_channel *, char *, int); +extern int channel_create_dcc (t_irc_dcc *); +extern void channel_remove_dcc (t_irc_dcc *); /* nick functions (irc-nick.c) */ @@ -275,13 +288,15 @@ extern void nick_set_away (t_irc_channel *, t_irc_nick *, int); /* DCC functions (irc-dcc.c) */ +extern void dcc_redraw (int); extern void dcc_free (t_irc_dcc *); extern void dcc_close (t_irc_dcc *, int); extern void dcc_accept (t_irc_dcc *); extern t_irc_dcc *dcc_add (t_irc_server *, int, unsigned long, int, char *, int, char *, char *, unsigned long); +extern void dcc_send_request (t_irc_server *, int, char *, char *); +extern void dcc_chat_sendf (t_irc_dcc *, char *, ...); extern void dcc_handle (); -extern void dcc_send (t_irc_server *, char *, char *); extern void dcc_end (); /* IRC display (irc-diplay.c) */ diff --git a/weechat/ChangeLog b/weechat/ChangeLog index 7771cc0f2..2b51773f8 100644 --- a/weechat/ChangeLog +++ b/weechat/ChangeLog @@ -1,12 +1,12 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -ChangeLog - 2005-02-26 +ChangeLog - 2005-02-27 Version 0.1.1 (under dev!): * added new display engine: doesn't cut words at end of lines - * added DCC send + * added DCC send and DCC chat * connection to IRC server is now made by child process (non blocking) * added support for UnrealIrcd ("~" for chan owner, "&" for chan admin) * new key for window switch (now: F5/F6=switch buffer, F7/F8=switch window) diff --git a/weechat/TODO b/weechat/TODO index 07c7c5e3c..3c25767e6 100644 --- a/weechat/TODO +++ b/weechat/TODO @@ -1,7 +1,7 @@ WeeChat - Wee Enhanced Environment for Chat =========================================== -TODO - 2005-02-20 +TODO - 2005-02-27 Legend: # done @@ -16,10 +16,11 @@ v0.1.1: * General: + Windows version + Solaris version - - *BSD version + + *BSD version * IRC protocol: # "/dcc send" command + # "/dcc chat" command (and incoming DCC chats) - customizable CTCP version reply * Interface: @@ -34,7 +35,6 @@ Future versions: --------------- * IRC protocol: - - "/dcc chat" command (and incoming DCC chats) - complete "/list" command: add regexp search, display only channels that match regexp - "/ignore" and "/unignore" commands: hide all that is write by a given diff --git a/weechat/po/fr.po b/weechat/po/fr.po index 6f783b12f..03dff2da5 100644 --- a/weechat/po/fr.po +++ b/weechat/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: WeeChat 0.1.1-cvs\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-21 21:28+0100\n" +"POT-Creation-Date: 2005-02-27 03:28+0100\n" "PO-Revision-Date: 2005-02-12 12:00+0100\n" "Last-Translator: FlashCode \n" "Language-Team: weechat-dev \n" @@ -29,102 +29,102 @@ msgstr "Impossible de d msgid "%s cannot allocate new server\n" msgstr "%s impossible d'allouer un nouveau serveur\n" -#: src/irc/irc-server.c:412 +#: src/irc/irc-server.c:416 #, c-format msgid "%s error sending data to IRC server\n" msgstr "%s erreur d'envoi de données au serveur IRC\n" -#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 +#: src/irc/irc-server.c:436 src/irc/irc-server.c:449 src/irc/irc-server.c:515 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "%s mémoire insuffisante pour un message IRC reçu\n" -#: src/irc/irc-server.c:520 +#: src/irc/irc-server.c:524 #, c-format msgid "%s unable to explode received buffer\n" msgstr "%s impossible d'exploser le tampon de réception\n" -#: src/irc/irc-server.c:594 +#: src/irc/irc-server.c:598 #, c-format msgid "%s Command '%s' failed!\n" msgstr "%s La commande '%s' a échoué !\n" -#: src/irc/irc-server.c:599 +#: src/irc/irc-server.c:603 #, c-format msgid "%s No command to execute!\n" msgstr "%s Pas de commande à exécuter !\n" -#: src/irc/irc-server.c:604 +#: src/irc/irc-server.c:608 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "%s Commande inconnue: cmd=%s, params=%s\n" -#: src/irc/irc-server.c:646 +#: src/irc/irc-server.c:650 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" "%s impossible de lire des données sur la socket, déconnexion du serveur...\n" -#: src/irc/irc-server.c:718 +#: src/irc/irc-server.c:722 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "%s: Reconnexion au serveur dans %d secondes\n" -#: src/irc/irc-server.c:749 +#: src/irc/irc-server.c:753 #, c-format msgid "%s address \"%s\" not found\n" msgstr "%s adresse \"%s\" introuvable\n" -#: src/irc/irc-server.c:758 +#: src/irc/irc-server.c:762 #, c-format msgid "%s IP address not found\n" msgstr "%s adresse IP introuvable\n" -#: src/irc/irc-server.c:766 +#: src/irc/irc-server.c:770 #, c-format msgid "%s connection refused\n" msgstr "%s connexion refusée\n" -#: src/irc/irc-server.c:832 +#: src/irc/irc-server.c:836 #, c-format msgid "%s: connecting to %s:%d...\n" msgstr "%s: connexion à %s:%d...\n" -#: src/irc/irc-server.c:834 +#: src/irc/irc-server.c:838 #, c-format msgid "connecting to server %s:%d...\n" msgstr "connexion au serveur %s:%d...\n" -#: src/irc/irc-server.c:845 +#: src/irc/irc-server.c:849 #, c-format msgid "%s cannot create pipe\n" msgstr "%s impossible de créer le pipe\n" -#: src/irc/irc-server.c:857 +#: src/irc/irc-server.c:861 #, c-format msgid "%s cannot create socket\n" msgstr "%s impossible de créer la socket\n" -#: src/irc/irc-server.c:869 +#: src/irc/irc-server.c:873 #, c-format msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" msgstr "%s impossible de paramétrer l'option socket \"SO_REUSEADDR\"\n" -#: src/irc/irc-server.c:880 +#: src/irc/irc-server.c:884 #, c-format msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" msgstr "%s impossible de paramétrer l'option socket \"SO_KEEPALIVE\"\n" -#: src/irc/irc-server.c:911 +#: src/irc/irc-server.c:915 #, c-format msgid "%s: Reconnecting to server...\n" msgstr "%s: Reconnexion au serveur...\n" -#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 +#: src/irc/irc-server.c:968 src/irc/irc-server.c:973 msgid "Disconnected from server!\n" msgstr "Déconnecté du serveur !\n" -#: src/irc/irc-channel.c:50 +#: src/irc/irc-channel.c:51 #, c-format msgid "%s cannot allocate new channel" msgstr "%s impossible d'allouer un nouveau canal" @@ -178,20 +178,21 @@ msgstr "" "type: \"action\" ou \"version\"" #: src/irc/irc-commands.c:47 -msgid "starts DCC (file or chat)" -msgstr "démarre le DCC (fichier ou discussion)" +msgid "starts DCC (file or chat) or close chat" +msgstr "démarre le DCC (fichier ou discussion) ou ferme une discussion" #: src/irc/irc-commands.c:48 -msgid "action nickname [file]" -msgstr "action pseudo [fichier]" +msgid "action [nickname [file]]" +msgstr "action [pseudo [fichier]]" #: src/irc/irc-commands.c:49 msgid "" -"action: 'send' (file) or 'chat'\n" +"action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)" msgstr "" -"action: 'send' (envoi de fichier) ou 'chat' (discussion)\n" +"action: 'send' (envoi de fichier) ou 'chat' (discussion) ou " +"'close' (fermeture discussion)\n" "pseudo: pseudo pour envoyer le fichier ou discuter\n" "fichier: nom du fichier (sur la machine locale)" @@ -1166,35 +1167,35 @@ msgstr "drapeau de mode inconnu" msgid "can't change mode for other users" msgstr "impossible de changer le mode pour les autres utilisateurs" -#: src/irc/irc-display.c:153 src/common/command.c:800 +#: src/irc/irc-display.c:154 src/common/command.c:804 msgid "Server: " msgstr "Serveur: " -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "connected" msgstr "connecté" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "not connected" msgstr "non connecté" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "yes" msgstr "oui" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "no" msgstr "non" -#: src/irc/irc-display.c:164 +#: src/irc/irc-display.c:165 msgid " (temporary server, will not be saved)" msgstr " (serveur temporaire, ne sera pas sauvé)" -#: src/irc/irc-display.c:180 +#: src/irc/irc-display.c:181 msgid "(hidden)" msgstr "(caché)" -#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3116 +#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3186 msgid "unknown" msgstr "inconnu" @@ -1203,43 +1204,44 @@ msgstr "inconnu" msgid "%s: using local hostname \"%s\"\n" msgstr "%s: utilisation du nom de machine local \"%s\"\n" -#: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:265 src/irc/irc-send.c:277 src/irc/irc-send.c:295 +#: src/irc/irc-send.c:775 src/irc/irc-send.c:849 src/common/command.c:1359 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "%s nombre de paramètres erroné pour la commande \"%s\"\n" -#: src/irc/irc-send.c:292 -msgid "This command is not developed!\n" -msgstr "Cette commande n'est pas développée !\n" +#: src/irc/irc-send.c:318 +#, c-format +msgid "%s wrong arguments for \"%s\" command\n" +msgstr "%s paramètres invalides pour la commande \"%s\"\n" -#: src/irc/irc-send.c:319 src/irc/irc-send.c:345 src/irc/irc-send.c:446 -#: src/irc/irc-send.c:770 src/irc/irc-send.c:849 src/irc/irc-send.c:1349 +#: src/irc/irc-send.c:346 src/irc/irc-send.c:372 src/irc/irc-send.c:473 +#: src/irc/irc-send.c:797 src/irc/irc-send.c:876 src/irc/irc-send.c:1376 #, c-format msgid "%s \"%s\" command can only be executed in a channel window\n" msgstr "" "%s la commande \"%s\" peut seulement être exécutée dans une fenêtre de " "canal\n" -#: src/irc/irc-send.c:556 src/irc/irc-send.c:623 src/irc/irc-send.c:897 -#: src/irc/irc-send.c:911 src/irc/irc-send.c:1243 +#: src/irc/irc-send.c:583 src/irc/irc-send.c:650 src/irc/irc-send.c:924 +#: src/irc/irc-send.c:938 src/irc/irc-send.c:1270 #, c-format msgid "%s \"%s\" command can not be executed on a server window\n" msgstr "" "%s la commande \"%s\" ne peut pas être exécutée dans une fenêtre serveur\n" -#: src/irc/irc-send.c:641 src/irc/irc-send.c:666 src/irc/irc-recv.c:264 +#: src/irc/irc-send.c:668 src/irc/irc-send.c:693 src/irc/irc-recv.c:264 #: src/irc/irc-recv.c:1089 #, c-format msgid "%s nick not found for \"%s\" command\n" msgstr "%s utilisateur non trouvé pour la commande \"%s\"\n" -#: src/irc/irc-send.c:718 src/irc/irc-send.c:995 src/irc/irc-recv.c:1256 +#: src/irc/irc-send.c:745 src/irc/irc-send.c:1022 src/irc/irc-recv.c:1327 #, c-format msgid "%s cannot create new private window \"%s\"\n" msgstr "%s impossible de créer la fenêtre privée \"%s\"\n" -#: src/irc/irc-send.c:1321 +#: src/irc/irc-send.c:1348 #, c-format msgid "%s, compiled on %s %s\n" msgstr "%s, compilé le %s %s\n" @@ -1254,7 +1256,7 @@ msgid " has joined " msgstr " a rejoint " #: src/irc/irc-recv.c:231 src/irc/irc-recv.c:599 src/irc/irc-recv.c:925 -#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2563 src/irc/irc-recv.c:2630 +#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2633 src/irc/irc-recv.c:2700 #, c-format msgid "%s channel not found for \"%s\" command\n" msgstr "%s canal non trouvé pour la commande \"%s\"\n" @@ -1356,7 +1358,7 @@ msgid "removes voice from" msgstr "supprime la voix de" #: src/irc/irc-recv.c:554 src/irc/irc-recv.c:639 src/irc/irc-recv.c:999 -#: src/irc/irc-recv.c:1352 +#: src/irc/irc-recv.c:1423 #, c-format msgid "%s \"%s\" command received without host\n" msgstr "%s commande \"%s\" reçue sans host\n" @@ -1405,7 +1407,7 @@ msgstr "%s commande \"%s\" re msgid " has left " msgstr " a quitté " -#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1282 +#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1353 #, c-format msgid "On %s: * %s %s" msgstr "Sur %s: * %s %s" @@ -1427,194 +1429,200 @@ msgstr "CTCP VERSION " msgid "from" msgstr "de" -#: src/irc/irc-recv.c:1184 src/irc/irc-recv.c:1199 src/irc/irc-recv.c:1215 -#: src/irc/irc-recv.c:1231 src/irc/irc-recv.c:1328 src/irc/irc-recv.c:2867 -#: src/irc/irc-recv.c:2924 +#: src/irc/irc-recv.c:1185 src/irc/irc-recv.c:1202 src/irc/irc-recv.c:1218 +#: src/irc/irc-recv.c:1234 src/irc/irc-recv.c:1259 src/irc/irc-recv.c:1276 +#: src/irc/irc-recv.c:1291 src/irc/irc-recv.c:1399 src/irc/irc-recv.c:2937 +#: src/irc/irc-recv.c:2994 #, c-format msgid "%s cannot parse \"%s\" command\n" msgstr "%s impossible d'analyser la commande \"%s\"\n" -#: src/irc/irc-recv.c:1308 +#: src/irc/irc-recv.c:1304 +#, c-format +msgid "%s unknown DCC CHAT type received from " +msgstr "%s type de DCC CHAT inconnu reçu de " + +#: src/irc/irc-recv.c:1379 src/irc/irc-dcc.c:751 #, c-format msgid "Private %s> %s" msgstr "Prive %s> %s" -#: src/irc/irc-recv.c:1384 +#: src/irc/irc-recv.c:1455 msgid "has quit" msgstr "a quitté" -#: src/irc/irc-recv.c:1505 +#: src/irc/irc-recv.c:1575 #, c-format msgid "%s \"%s\" command received without channel\n" msgstr "%s commande \"%s\" reçue sans canal\n" -#: src/irc/irc-recv.c:1533 +#: src/irc/irc-recv.c:1603 msgid " has changed topic for " msgstr " a changé le titre pour " -#: src/irc/irc-recv.c:1538 +#: src/irc/irc-recv.c:1608 #, c-format msgid " to: \"%s\"\n" msgstr " en: \"%s\"\n" -#: src/irc/irc-recv.c:1544 +#: src/irc/irc-recv.c:1614 msgid " has unset topic for " msgstr " a retiré le titre pour " -#: src/irc/irc-recv.c:1655 +#: src/irc/irc-recv.c:1725 #, c-format msgid " is away: %s\n" msgstr " est absent: %s\n" -#: src/irc/irc-recv.c:1729 +#: src/irc/irc-recv.c:1799 msgid "Users online: " msgstr "Utilisateurs en ligne: " -#: src/irc/irc-recv.c:2134 +#: src/irc/irc-recv.c:2204 msgid "idle: " msgstr "inactivité: " -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "days" msgstr "jours" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "day" msgstr "jour" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hours" msgstr "heures" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hour" msgstr "heure" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minutes" msgstr "minutes" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minute" msgstr "minute" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "seconds" msgstr "secondes" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "second" msgstr "seconde" -#: src/irc/irc-recv.c:2169 +#: src/irc/irc-recv.c:2239 msgid "signon at: " msgstr "signé le: " -#: src/irc/irc-recv.c:2257 +#: src/irc/irc-recv.c:2327 msgid "Channels: " msgstr "Canaux: " -#: src/irc/irc-recv.c:2509 +#: src/irc/irc-recv.c:2579 msgid "No topic set for " msgstr "Pas de titre défini pour " -#: src/irc/irc-recv.c:2551 +#: src/irc/irc-recv.c:2621 msgid "Topic for " msgstr "Le titre pour " -#: src/irc/irc-recv.c:2555 +#: src/irc/irc-recv.c:2625 #, c-format msgid " is: \"%s\"\n" msgstr " est: \"%s\"\n" -#: src/irc/irc-recv.c:2573 src/irc/irc-recv.c:2657 +#: src/irc/irc-recv.c:2643 src/irc/irc-recv.c:2727 #, c-format msgid "%s cannot identify channel for \"%s\" command\n" msgstr "%s impossible de déterminer le canal pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2619 +#: src/irc/irc-recv.c:2689 msgid "Topic set by " msgstr "Titre défini par " -#: src/irc/irc-recv.c:2639 +#: src/irc/irc-recv.c:2709 #, c-format msgid "%s cannot identify date/time for \"%s\" command\n" msgstr "%s impossible d'identifier la date/heure pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2648 +#: src/irc/irc-recv.c:2718 #, c-format msgid "%s cannot identify nickname for \"%s\" command\n" msgstr "" "%s impossible de déterminer le nom d'utilisateur pour la commande \"%s\"\n" -#: src/irc/irc-recv.c:2790 +#: src/irc/irc-recv.c:2860 msgid " on " msgstr " sur " -#: src/irc/irc-recv.c:2913 +#: src/irc/irc-recv.c:2983 #, c-format msgid "%s cannot create nick \"%s\" for channel \"%s\"\n" msgstr "%s impossible de créer l'utilisateur \"%s\" pour le canal \"%s\"\n" -#: src/irc/irc-recv.c:2968 +#: src/irc/irc-recv.c:3038 msgid "Nicks " msgstr "Utilisateurs " -#: src/irc/irc-recv.c:2988 +#: src/irc/irc-recv.c:3058 msgid "Channel " msgstr "Canal " -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nicks" msgstr "utilisateurs" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nick" msgstr "utilisateur" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "ops" msgstr "ops" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "op" msgstr "op" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfops" msgstr "halfops" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfop" msgstr "halfop" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voices" msgstr "voices" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voice" msgstr "voice" -#: src/irc/irc-recv.c:3034 +#: src/irc/irc-recv.c:3104 msgid "normal" msgstr "normal" -#: src/irc/irc-recv.c:3070 +#: src/irc/irc-recv.c:3140 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 2nd nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai avec le 2nd " "nom d'utilisateur \"%s\"\n" -#: src/irc/irc-recv.c:3082 +#: src/irc/irc-recv.c:3152 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 3rd nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai du 3ème nom " "d'utilisateur \"%s\"\n" -#: src/irc/irc-recv.c:3094 +#: src/irc/irc-recv.c:3164 #, c-format msgid "" "%s: all declared nicknames are already in use, closing connection with " @@ -1623,100 +1631,138 @@ msgstr "" "%s: tous les noms d'utilisateurs déclarés sont déjà en cours d'utilisation, " "fermeture de la connexion avec le serveur !\n" -#: src/irc/irc-recv.c:3104 +#: src/irc/irc-recv.c:3174 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 1st nickname \"%s\"\n" msgstr "" "%s: l'utilisateur \"%s\" est déjà en cours d'utilisation, essai avec le 1er " "nom d'utilisateur \"%s\"\n" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Waiting" msgstr "Attente" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Connecting" msgstr "Connexion" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Active" msgstr "Actif" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Done" msgstr "Terminé" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Failed" msgstr "Echoué" -#: src/irc/irc-dcc.c:46 +#: src/irc/irc-dcc.c:47 msgid "Aborted" msgstr "Interrompu" -#: src/irc/irc-dcc.c:149 +#: src/irc/irc-dcc.c:155 msgid "DCC: file " msgstr "DCC: fichier " -#: src/irc/irc-dcc.c:154 src/irc/irc-dcc.c:334 +#: src/irc/irc-dcc.c:160 src/irc/irc-dcc.c:406 msgid " (local filename: " msgstr " (nom local: " -#: src/irc/irc-dcc.c:160 +#: src/irc/irc-dcc.c:166 msgid ") sent to " msgstr ") envoyé à " -#: src/irc/irc-dcc.c:162 +#: src/irc/irc-dcc.c:168 msgid ") received from " msgstr ") reçu de " -#: src/irc/irc-dcc.c:167 +#: src/irc/irc-dcc.c:173 msgid ": ok!\n" msgstr ": ok!\n" -#: src/irc/irc-dcc.c:278 +#: src/irc/irc-dcc.c:181 +msgid "DCC chat closed with " +msgstr "Discussion DCC fermée avec " + +#: src/irc/irc-dcc.c:219 +#, c-format +msgid "" +"%s can't associate DCC chat with private buffer (maybe private buffer has " +"already DCC CHAT?)\n" +msgstr "" +"%s impossible d'associer la discussion DCC avec un tampon privé (le tampon " +"privé a peut-être déjà un DCC CHAT ?)\n" + +#: src/irc/irc-dcc.c:229 +msgid "Connected to " +msgstr "Connecté à " + +#: src/irc/irc-dcc.c:238 +msgid "via DCC chat\n" +msgstr "via une discussion DCC\n" + +#: src/irc/irc-dcc.c:348 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "%s pas assez de mémoire pour un nouveau DCC\n" -#: src/irc/irc-dcc.c:308 +#: src/irc/irc-dcc.c:365 +msgid "DCC chat" +msgstr "Discussion DCC" + +#: src/irc/irc-dcc.c:386 msgid "Incoming DCC file from " msgstr "Réception fichier DCC de " -#: src/irc/irc-dcc.c:319 src/irc/irc-dcc.c:338 +#: src/irc/irc-dcc.c:397 src/irc/irc-dcc.c:410 msgid " bytes\n" msgstr " octets\n" -#: src/irc/irc-dcc.c:325 +#: src/irc/irc-dcc.c:402 msgid "Sending DCC file to " msgstr "Envoi fichier DCC à " -#: src/irc/irc-dcc.c:393 +#: src/irc/irc-dcc.c:415 +msgid "Incoming DCC chat request from " +msgstr "Demande de discussion DCC reçue de " + +#: src/irc/irc-dcc.c:426 +msgid "Sending DCC chat request to " +msgstr "Envoi d'une demande discussion DCC à " + +#: src/irc/irc-dcc.c:490 #, c-format msgid "%s not enough memory for DCC SEND\n" msgstr "%s pas assez de mémoire pour le DCC SEND\n" -#: src/irc/irc-dcc.c:415 +#: src/irc/irc-dcc.c:512 #, c-format msgid "%s cannot access file \"%s\"\n" msgstr "%s impossible d'accéder au fichier \"%s\"\n" -#: src/irc/irc-dcc.c:434 +#: src/irc/irc-dcc.c:533 #, c-format msgid "%s cannot create socket for DCC\n" msgstr "%s impossible de créer la socket pour le DCC\n" -#: src/irc/irc-dcc.c:446 +#: src/irc/irc-dcc.c:546 #, c-format msgid "%s cannot find port for DCC\n" msgstr "%s impossible de trouver le port pour le DCC\n" -#: src/irc/irc-dcc.c:484 +#: src/irc/irc-dcc.c:593 #, c-format msgid "%s cannot send DCC\n" msgstr "%s impossible d'envoyer le DCC\n" -#: src/irc/irc-dcc.c:599 +#: src/irc/irc-dcc.c:672 +#, c-format +msgid "%s error sending data to \"%s\" via DCC CHAT\n" +msgstr "%s erreur d'envoi de données à \"%s\" via DCC CHAT\n" + +#: src/irc/irc-dcc.c:930 #, c-format msgid "" "%s DCC failed because blocksize is too big. Check value of \"dcc_blocksize\" " @@ -1725,7 +1771,7 @@ msgstr "" "%s le DCC a échoué car la taille de bloc est trop grande. Vérifiez la valeur " "de l'option \"dcc_blocksize\", le maximum est %d.\n" -#: src/irc/irc-dcc.c:672 +#: src/irc/irc-dcc.c:1003 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "abandon du DCC actif: \"%s\" de %s\n" @@ -1804,66 +1850,66 @@ msgstr "" "%s impossible d'ajouter la fonction pour le message \"%s\" (mémoire " "insuffisante)\n" -#: src/gui/curses/gui-input.c:763 +#: src/gui/curses/gui-input.c:756 #, c-format msgid "%s lag is high, disconnecting from server...\n" msgstr "%s le lag est élevé, déconnexion du serveur...\n" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "bytes" msgstr "octets" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Kb" msgstr "Ko" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Mb" msgstr "Mo" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Gb" msgstr "Go" -#: src/gui/curses/gui-display.c:969 +#: src/gui/curses/gui-display.c:1061 msgid "(away)" msgstr "(absent)" -#: src/gui/curses/gui-display.c:1054 +#: src/gui/curses/gui-display.c:1174 #, c-format msgid "%d:[not connected] " msgstr "%d:[non connecté] " -#: src/gui/curses/gui-display.c:1071 +#: src/gui/curses/gui-display.c:1191 msgid "Act: " msgstr "Act: " -#: src/gui/curses/gui-display.c:1120 +#: src/gui/curses/gui-display.c:1240 #, c-format msgid "Lag: %.1f" msgstr "Lag: %.1f" -#: src/gui/curses/gui-display.c:1135 +#: src/gui/curses/gui-display.c:1255 msgid "-MORE-" msgstr "-PLUS-" -#: src/gui/curses/gui-display.c:1310 +#: src/gui/curses/gui-display.c:1429 msgid " [A] Accept" msgstr " [A] Accepter" -#: src/gui/curses/gui-display.c:1311 src/gui/curses/gui-display.c:1315 +#: src/gui/curses/gui-display.c:1430 src/gui/curses/gui-display.c:1434 msgid " [C] Cancel" msgstr " [C] Annuler" -#: src/gui/curses/gui-display.c:1320 +#: src/gui/curses/gui-display.c:1439 msgid " [R] Remove" msgstr " [R] Retirer" -#: src/gui/curses/gui-display.c:1324 +#: src/gui/curses/gui-display.c:1443 msgid " [P] Purge old DCC" msgstr " [P] Purger anciens DCC" -#: src/gui/curses/gui-display.c:1325 +#: src/gui/curses/gui-display.c:1444 msgid " [Q] Close DCC view" msgstr " [Q] Fermer la vue DCC" @@ -1876,12 +1922,12 @@ msgstr "serveur" msgid "%s not enough memory for infobar message\n" msgstr "%s pas assez de mémoire pour un message de la barre d'infos\n" -#: src/gui/gui-common.c:497 +#: src/gui/gui-common.c:503 #, c-format msgid "%s not enough memory for new line!\n" msgstr "%s pas assez de mémoire pour une nouvelle ligne !\n" -#: src/gui/gui-common.c:540 +#: src/gui/gui-common.c:546 msgid "not enough memory!\n" msgstr "pas assez de mémoire !\n" @@ -2150,166 +2196,166 @@ msgstr "%s la commande \"%s\" n msgid "%s unknown command \"%s\" (type /help for help)\n" msgstr "%s commande \"%s\" inconnue (tapez /help pour l'aide)\n" -#: src/common/command.c:699 +#: src/common/command.c:703 #, c-format msgid "%s cannot find nick for sending message\n" msgstr "%s impossible de trouver le pseudo pour envoyer le message\n" -#: src/common/command.c:708 +#: src/common/command.c:712 msgid "This window is not a channel!\n" msgstr "Cette fenêtre n'est pas un canal !\n" -#: src/common/command.c:736 src/common/command.c:760 src/common/command.c:864 +#: src/common/command.c:740 src/common/command.c:764 src/common/command.c:868 #, c-format msgid "%s missing arguments for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:745 +#: src/common/command.c:749 #, c-format msgid "Alias \"%s\" => \"%s\" created\n" msgstr "Alias \"%s\" => \"%s\" créé\n" -#: src/common/command.c:751 +#: src/common/command.c:755 #, c-format msgid "Failed to create alias \"%s\" => \"%s\" (not enough memory)\n" msgstr "Impossible de créer l'alias \"%s\" => \"%s\" (pas assez de mémoire)\n" -#: src/common/command.c:771 +#: src/common/command.c:775 msgid "List of aliases:\n" msgstr "Liste des alias:\n" -#: src/common/command.c:783 +#: src/common/command.c:787 msgid "No alias defined.\n" msgstr "Aucun alias défini.\n" -#: src/common/command.c:806 +#: src/common/command.c:810 msgid "Channel: " msgstr "Canal: " -#: src/common/command.c:809 src/common/command.c:819 +#: src/common/command.c:813 src/common/command.c:823 msgid " (server: " msgstr " (serveur: " -#: src/common/command.c:816 +#: src/common/command.c:820 msgid "Private with: " msgstr "Privé avec: " -#: src/common/command.c:844 +#: src/common/command.c:848 msgid "Opened buffers:\n" msgstr "Tampons ouverts:\n" -#: src/common/command.c:887 src/common/command.c:1014 +#: src/common/command.c:891 src/common/command.c:1018 #, c-format msgid "%s incorrect buffer number\n" msgstr "%s numéro de buffer incorrect\n" -#: src/common/command.c:901 +#: src/common/command.c:905 #, c-format msgid "%s can not close the single buffer\n" msgstr "%s impossible de fermer le tampon unique\n" -#: src/common/command.c:911 +#: src/common/command.c:915 #, c-format msgid "%s can not close server buffer while channels are opened\n" msgstr "" "%s impossible de fermer le tampon du serveur tant que des canaux sont " "ouverts\n" -#: src/common/command.c:950 +#: src/common/command.c:954 msgid "Notify levels: " msgstr "Niveaux de notification: " -#: src/common/command.c:977 src/common/command.c:987 +#: src/common/command.c:981 src/common/command.c:991 #, c-format msgid "%s incorrect notify level (must be between 0 and 3)\n" msgstr "%s niveau de notification incorrect (doit être entre 0 et 3)\n" -#: src/common/command.c:1005 +#: src/common/command.c:1009 #, c-format msgid "%s buffer \"%s\" not found for \"%s\" command\n" msgstr "%s buffer \"%s\" non trouvé pour la commande \"%s\"\n" -#: src/common/command.c:1039 +#: src/common/command.c:1043 #, c-format msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "paramètre inconnu \"%s\" pour la commande \"%s\"\n" -#: src/common/command.c:1069 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "%s déjà connecté au serveur \"%s\" !\n" -#: src/common/command.c:1077 +#: src/common/command.c:1081 #, c-format msgid "%s currently connecting to server \"%s\"!\n" msgstr "%s une connexion vers le serveur \"%s\" est en cours !\n" -#: src/common/command.c:1095 src/common/command.c:1138 +#: src/common/command.c:1099 src/common/command.c:1142 #, c-format msgid "%s server not found\n" msgstr "%s serveur non trouvé\n" -#: src/common/command.c:1122 +#: src/common/command.c:1126 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "%s non connecté au serveur \"%s\" !\n" -#: src/common/command.c:1130 +#: src/common/command.c:1134 msgid "Auto-reconnection is cancelled\n" msgstr "La reconnexion automatique est annulée\n" -#: src/common/command.c:1156 +#: src/common/command.c:1160 #, c-format msgid "%s internal commands:\n" msgstr "Commandes internes %s :\n" -#: src/common/command.c:1165 +#: src/common/command.c:1169 msgid "IRC commands:\n" msgstr "Commandes IRC :\n" -#: src/common/command.c:1224 +#: src/common/command.c:1228 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "Pas d'aide disponible, la commande \"%s\" est inconnue\n" -#: src/common/command.c:1249 +#: src/common/command.c:1253 msgid "Registered Perl scripts:\n" msgstr "Scripts Perl enregistrés :\n" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1270 src/common/command.c:1292 +#: src/common/command.c:1314 msgid " (none)\n" msgstr " (aucun)\n" -#: src/common/command.c:1271 +#: src/common/command.c:1275 msgid "Perl message handlers:\n" msgstr "Fonctions Perl pour messages :\n" -#: src/common/command.c:1280 +#: src/common/command.c:1284 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr " IRC(%s) => Perl(%s)\n" -#: src/common/command.c:1293 +#: src/common/command.c:1297 msgid "Perl command handlers:\n" msgstr "Commandes Perl :\n" -#: src/common/command.c:1302 +#: src/common/command.c:1306 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr " Commande /%s => Perl(%s)\n" -#: src/common/command.c:1322 +#: src/common/command.c:1326 msgid "Perl scripts unloaded\n" msgstr "Scripts Perl déchargés\n" -#: src/common/command.c:1348 src/common/command.c:2045 -#: src/common/command.c:2057 +#: src/common/command.c:1352 src/common/command.c:2049 +#: src/common/command.c:2061 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "%s option inconnue pour la commande \"%s\"\n" -#: src/common/command.c:1361 +#: src/common/command.c:1365 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" @@ -2318,31 +2364,31 @@ msgstr "" "Merci de reconstruire WeeChat avec l'option \"--enable-perl\" pour le " "script ./configure\n" -#: src/common/command.c:1415 +#: src/common/command.c:1419 msgid "No server.\n" msgstr "Pas de serveur.\n" -#: src/common/command.c:1426 +#: src/common/command.c:1430 #, c-format msgid "Server '%s' not found.\n" msgstr "Serveur '%s' non trouvé.\n" -#: src/common/command.c:1438 +#: src/common/command.c:1442 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "%s il manque le nom du serveur pour la commande \"%s\"\n" -#: src/common/command.c:1446 +#: src/common/command.c:1450 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "%s trop de paramètres pour la commande \"%s\", paramètres ignorés\n" -#: src/common/command.c:1465 +#: src/common/command.c:1469 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "%s le serveur \"%s\" n'existe pas pour la commande \"%s\"\n" -#: src/common/command.c:1473 +#: src/common/command.c:1477 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" @@ -2351,106 +2397,106 @@ msgstr "" "%s vous ne pouvez pas supprimer le server \"%s\" car vous êtes connecté " "dessus. Essayez /disconnect %s avant.\n" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1493 src/common/command.c:1634 msgid "Server" msgstr "Serveur" -#: src/common/command.c:1492 +#: src/common/command.c:1496 msgid "has been deleted\n" msgstr "a été supprimé\n" -#: src/common/command.c:1507 +#: src/common/command.c:1511 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "%s paramètres manquants pour la commande \"%s\"\n" -#: src/common/command.c:1517 +#: src/common/command.c:1521 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "%s le serveur \"%s\" existe déjà, impossible de le créer !\n" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1546 src/common/command.c:1574 +#: src/common/command.c:1587 src/common/command.c:1613 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "%s mot de passe manquant pour le paramètre \"%s\"\n" -#: src/common/command.c:1555 +#: src/common/command.c:1559 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "%s pseudo(s) manquant(s) pour le paramètre \"%s\"\n" -#: src/common/command.c:1596 +#: src/common/command.c:1600 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "%s commande manquante pour le paramètre \"%s\"\n" -#: src/common/command.c:1633 +#: src/common/command.c:1637 msgid "created\n" msgstr "créé\n" -#: src/common/command.c:1639 +#: src/common/command.c:1643 #, c-format msgid "%s unable to create server\n" msgstr "%s impossible de créer le serveur\n" -#: src/common/command.c:1694 +#: src/common/command.c:1698 msgid "(unknown)" msgstr "(inconnu)" -#: src/common/command.c:1717 +#: src/common/command.c:1721 msgid "(password hidden) " msgstr "(mot de passe caché)" -#: src/common/command.c:1781 +#: src/common/command.c:1785 #, c-format msgid "%s server \"%s\" not found\n" msgstr "%s serveur \"%s\" non trouvé\n" -#: src/common/command.c:1812 src/common/command.c:1858 +#: src/common/command.c:1816 src/common/command.c:1862 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "%s option de configuration \"%s\" non trouvée\n" -#: src/common/command.c:1817 src/common/command.c:1850 +#: src/common/command.c:1821 src/common/command.c:1854 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "%s valeur incorrecte pour l'option \"%s\"\n" -#: src/common/command.c:1833 +#: src/common/command.c:1837 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "%s l'option \"%s\" ne peut pas être changée lorsque WeeChat tourne\n" -#: src/common/command.c:1931 +#: src/common/command.c:1935 #, c-format msgid "No config option found with \"%s\"\n" msgstr "Aucune option de configuration trouvée avec \"%s\"\n" -#: src/common/command.c:1934 +#: src/common/command.c:1938 msgid "No config option found\n" msgstr "Aucune option de configuration trouvée\n" -#: src/common/command.c:1940 +#: src/common/command.c:1944 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "option(s) de configuration trouvée(s) avec \"%s\"\n" -#: src/common/command.c:1943 +#: src/common/command.c:1947 msgid "config option(s) found\n" msgstr "option(s) de configuration trouvée(s)\n" -#: src/common/command.c:1963 +#: src/common/command.c:1967 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "%s alias ou commande \"%s\" non trouvé\n" -#: src/common/command.c:1973 +#: src/common/command.c:1977 #, c-format msgid "Alias \"%s\" removed\n" msgstr "Alias \"%s\" supprimé\n" -#: src/common/command.c:1993 +#: src/common/command.c:1997 msgid "Opened windows:\n" msgstr "Fenêtres ouvertes:\n" @@ -3480,18 +3526,3 @@ msgstr "" #: src/common/weeconfig.c:1529 msgid "saving config to disk\n" msgstr "sauvegarde de la configuration sur disque\n" - -#~ msgid "servername" -#~ msgstr "nom_serveur" - -#~ msgid "%s cannot connect to irc server\n" -#~ msgstr "%s connexion au serveur irc impossible\n" - -#~ msgid "%s: server IP is: %s\n" -#~ msgstr "%s: l'adresse IP du serveur est : %s\n" - -#~ msgid "%s IRC command \"%s\" failed\n" -#~ msgstr "%s la commande IRC \"%s\" a échoué\n" - -#~ msgid ") from " -#~ msgstr ") de " diff --git a/weechat/po/weechat.pot b/weechat/po/weechat.pot index 207a727ac..2302d8674 100644 --- a/weechat/po/weechat.pot +++ b/weechat/po/weechat.pot @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: flashcode@flashtux.org\n" -"POT-Creation-Date: 2005-02-21 21:28+0100\n" +"POT-Creation-Date: 2005-02-27 03:28+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -29,101 +29,101 @@ msgstr "" msgid "%s cannot allocate new server\n" msgstr "" -#: src/irc/irc-server.c:412 +#: src/irc/irc-server.c:416 #, c-format msgid "%s error sending data to IRC server\n" msgstr "" -#: src/irc/irc-server.c:432 src/irc/irc-server.c:445 src/irc/irc-server.c:511 +#: src/irc/irc-server.c:436 src/irc/irc-server.c:449 src/irc/irc-server.c:515 #, c-format msgid "%s not enough memory for received IRC message\n" msgstr "" -#: src/irc/irc-server.c:520 +#: src/irc/irc-server.c:524 #, c-format msgid "%s unable to explode received buffer\n" msgstr "" -#: src/irc/irc-server.c:594 +#: src/irc/irc-server.c:598 #, c-format msgid "%s Command '%s' failed!\n" msgstr "" -#: src/irc/irc-server.c:599 +#: src/irc/irc-server.c:603 #, c-format msgid "%s No command to execute!\n" msgstr "" -#: src/irc/irc-server.c:604 +#: src/irc/irc-server.c:608 #, c-format msgid "%s Unknown command: cmd=%s, args=%s\n" msgstr "" -#: src/irc/irc-server.c:646 +#: src/irc/irc-server.c:650 #, c-format msgid "%s cannot read data from socket, disconnecting from server...\n" msgstr "" -#: src/irc/irc-server.c:718 +#: src/irc/irc-server.c:722 #, c-format msgid "%s: Reconnecting to server in %d seconds\n" msgstr "" -#: src/irc/irc-server.c:749 +#: src/irc/irc-server.c:753 #, c-format msgid "%s address \"%s\" not found\n" msgstr "" -#: src/irc/irc-server.c:758 +#: src/irc/irc-server.c:762 #, c-format msgid "%s IP address not found\n" msgstr "" -#: src/irc/irc-server.c:766 +#: src/irc/irc-server.c:770 #, c-format msgid "%s connection refused\n" msgstr "" -#: src/irc/irc-server.c:832 +#: src/irc/irc-server.c:836 #, c-format msgid "%s: connecting to %s:%d...\n" msgstr "" -#: src/irc/irc-server.c:834 +#: src/irc/irc-server.c:838 #, c-format msgid "connecting to server %s:%d...\n" msgstr "" -#: src/irc/irc-server.c:845 +#: src/irc/irc-server.c:849 #, c-format msgid "%s cannot create pipe\n" msgstr "" -#: src/irc/irc-server.c:857 +#: src/irc/irc-server.c:861 #, c-format msgid "%s cannot create socket\n" msgstr "" -#: src/irc/irc-server.c:869 +#: src/irc/irc-server.c:873 #, c-format msgid "%s cannot set socket option \"SO_REUSEADDR\"\n" msgstr "" -#: src/irc/irc-server.c:880 +#: src/irc/irc-server.c:884 #, c-format msgid "%s cannot set socket option \"SO_KEEPALIVE\"\n" msgstr "" -#: src/irc/irc-server.c:911 +#: src/irc/irc-server.c:915 #, c-format msgid "%s: Reconnecting to server...\n" msgstr "" -#: src/irc/irc-server.c:960 src/irc/irc-server.c:965 +#: src/irc/irc-server.c:968 src/irc/irc-server.c:973 msgid "Disconnected from server!\n" msgstr "" -#: src/irc/irc-channel.c:50 +#: src/irc/irc-channel.c:51 #, c-format msgid "%s cannot allocate new channel" msgstr "" @@ -172,16 +172,16 @@ msgid "" msgstr "" #: src/irc/irc-commands.c:47 -msgid "starts DCC (file or chat)" +msgid "starts DCC (file or chat) or close chat" msgstr "" #: src/irc/irc-commands.c:48 -msgid "action nickname [file]" +msgid "action [nickname [file]]" msgstr "" #: src/irc/irc-commands.c:49 msgid "" -"action: 'send' (file) or 'chat'\n" +"action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)" msgstr "" @@ -1072,35 +1072,35 @@ msgstr "" msgid "can't change mode for other users" msgstr "" -#: src/irc/irc-display.c:153 src/common/command.c:800 +#: src/irc/irc-display.c:154 src/common/command.c:804 msgid "Server: " msgstr "" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "connected" msgstr "" -#: src/irc/irc-display.c:158 +#: src/irc/irc-display.c:159 msgid "not connected" msgstr "" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "yes" msgstr "" -#: src/irc/irc-display.c:162 src/irc/irc-display.c:167 +#: src/irc/irc-display.c:163 src/irc/irc-display.c:168 msgid "no" msgstr "" -#: src/irc/irc-display.c:164 +#: src/irc/irc-display.c:165 msgid " (temporary server, will not be saved)" msgstr "" -#: src/irc/irc-display.c:180 +#: src/irc/irc-display.c:181 msgid "(hidden)" msgstr "" -#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3116 +#: src/irc/irc-send.c:58 src/irc/irc-recv.c:3186 msgid "unknown" msgstr "" @@ -1109,40 +1109,41 @@ msgstr "" msgid "%s: using local hostname \"%s\"\n" msgstr "" -#: src/irc/irc-send.c:267 src/irc/irc-send.c:278 src/irc/irc-send.c:748 -#: src/irc/irc-send.c:822 src/common/command.c:1355 +#: src/irc/irc-send.c:265 src/irc/irc-send.c:277 src/irc/irc-send.c:295 +#: src/irc/irc-send.c:775 src/irc/irc-send.c:849 src/common/command.c:1359 #, c-format msgid "%s wrong argument count for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:292 -msgid "This command is not developed!\n" +#: src/irc/irc-send.c:318 +#, c-format +msgid "%s wrong arguments for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:319 src/irc/irc-send.c:345 src/irc/irc-send.c:446 -#: src/irc/irc-send.c:770 src/irc/irc-send.c:849 src/irc/irc-send.c:1349 +#: src/irc/irc-send.c:346 src/irc/irc-send.c:372 src/irc/irc-send.c:473 +#: src/irc/irc-send.c:797 src/irc/irc-send.c:876 src/irc/irc-send.c:1376 #, c-format msgid "%s \"%s\" command can only be executed in a channel window\n" msgstr "" -#: src/irc/irc-send.c:556 src/irc/irc-send.c:623 src/irc/irc-send.c:897 -#: src/irc/irc-send.c:911 src/irc/irc-send.c:1243 +#: src/irc/irc-send.c:583 src/irc/irc-send.c:650 src/irc/irc-send.c:924 +#: src/irc/irc-send.c:938 src/irc/irc-send.c:1270 #, c-format msgid "%s \"%s\" command can not be executed on a server window\n" msgstr "" -#: src/irc/irc-send.c:641 src/irc/irc-send.c:666 src/irc/irc-recv.c:264 +#: src/irc/irc-send.c:668 src/irc/irc-send.c:693 src/irc/irc-recv.c:264 #: src/irc/irc-recv.c:1089 #, c-format msgid "%s nick not found for \"%s\" command\n" msgstr "" -#: src/irc/irc-send.c:718 src/irc/irc-send.c:995 src/irc/irc-recv.c:1256 +#: src/irc/irc-send.c:745 src/irc/irc-send.c:1022 src/irc/irc-recv.c:1327 #, c-format msgid "%s cannot create new private window \"%s\"\n" msgstr "" -#: src/irc/irc-send.c:1321 +#: src/irc/irc-send.c:1348 #, c-format msgid "%s, compiled on %s %s\n" msgstr "" @@ -1157,7 +1158,7 @@ msgid " has joined " msgstr "" #: src/irc/irc-recv.c:231 src/irc/irc-recv.c:599 src/irc/irc-recv.c:925 -#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2563 src/irc/irc-recv.c:2630 +#: src/irc/irc-recv.c:1099 src/irc/irc-recv.c:2633 src/irc/irc-recv.c:2700 #, c-format msgid "%s channel not found for \"%s\" command\n" msgstr "" @@ -1259,7 +1260,7 @@ msgid "removes voice from" msgstr "" #: src/irc/irc-recv.c:554 src/irc/irc-recv.c:639 src/irc/irc-recv.c:999 -#: src/irc/irc-recv.c:1352 +#: src/irc/irc-recv.c:1423 #, c-format msgid "%s \"%s\" command received without host\n" msgstr "" @@ -1308,7 +1309,7 @@ msgstr "" msgid " has left " msgstr "" -#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1282 +#: src/irc/irc-recv.c:1048 src/irc/irc-recv.c:1353 #, c-format msgid "On %s: * %s %s" msgstr "" @@ -1330,294 +1331,336 @@ msgstr "" msgid "from" msgstr "" -#: src/irc/irc-recv.c:1184 src/irc/irc-recv.c:1199 src/irc/irc-recv.c:1215 -#: src/irc/irc-recv.c:1231 src/irc/irc-recv.c:1328 src/irc/irc-recv.c:2867 -#: src/irc/irc-recv.c:2924 +#: src/irc/irc-recv.c:1185 src/irc/irc-recv.c:1202 src/irc/irc-recv.c:1218 +#: src/irc/irc-recv.c:1234 src/irc/irc-recv.c:1259 src/irc/irc-recv.c:1276 +#: src/irc/irc-recv.c:1291 src/irc/irc-recv.c:1399 src/irc/irc-recv.c:2937 +#: src/irc/irc-recv.c:2994 #, c-format msgid "%s cannot parse \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:1308 +#: src/irc/irc-recv.c:1304 +#, c-format +msgid "%s unknown DCC CHAT type received from " +msgstr "" + +#: src/irc/irc-recv.c:1379 src/irc/irc-dcc.c:751 #, c-format msgid "Private %s> %s" msgstr "" -#: src/irc/irc-recv.c:1384 +#: src/irc/irc-recv.c:1455 msgid "has quit" msgstr "" -#: src/irc/irc-recv.c:1505 +#: src/irc/irc-recv.c:1575 #, c-format msgid "%s \"%s\" command received without channel\n" msgstr "" -#: src/irc/irc-recv.c:1533 +#: src/irc/irc-recv.c:1603 msgid " has changed topic for " msgstr "" -#: src/irc/irc-recv.c:1538 +#: src/irc/irc-recv.c:1608 #, c-format msgid " to: \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:1544 +#: src/irc/irc-recv.c:1614 msgid " has unset topic for " msgstr "" -#: src/irc/irc-recv.c:1655 +#: src/irc/irc-recv.c:1725 #, c-format msgid " is away: %s\n" msgstr "" -#: src/irc/irc-recv.c:1729 +#: src/irc/irc-recv.c:1799 msgid "Users online: " msgstr "" -#: src/irc/irc-recv.c:2134 +#: src/irc/irc-recv.c:2204 msgid "idle: " msgstr "" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "days" msgstr "" -#: src/irc/irc-recv.c:2142 +#: src/irc/irc-recv.c:2212 msgid "day" msgstr "" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hours" msgstr "" -#: src/irc/irc-recv.c:2152 +#: src/irc/irc-recv.c:2222 msgid "hour" msgstr "" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minutes" msgstr "" -#: src/irc/irc-recv.c:2158 +#: src/irc/irc-recv.c:2228 msgid "minute" msgstr "" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "seconds" msgstr "" -#: src/irc/irc-recv.c:2164 +#: src/irc/irc-recv.c:2234 msgid "second" msgstr "" -#: src/irc/irc-recv.c:2169 +#: src/irc/irc-recv.c:2239 msgid "signon at: " msgstr "" -#: src/irc/irc-recv.c:2257 +#: src/irc/irc-recv.c:2327 msgid "Channels: " msgstr "" -#: src/irc/irc-recv.c:2509 +#: src/irc/irc-recv.c:2579 msgid "No topic set for " msgstr "" -#: src/irc/irc-recv.c:2551 +#: src/irc/irc-recv.c:2621 msgid "Topic for " msgstr "" -#: src/irc/irc-recv.c:2555 +#: src/irc/irc-recv.c:2625 #, c-format msgid " is: \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:2573 src/irc/irc-recv.c:2657 +#: src/irc/irc-recv.c:2643 src/irc/irc-recv.c:2727 #, c-format msgid "%s cannot identify channel for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2619 +#: src/irc/irc-recv.c:2689 msgid "Topic set by " msgstr "" -#: src/irc/irc-recv.c:2639 +#: src/irc/irc-recv.c:2709 #, c-format msgid "%s cannot identify date/time for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2648 +#: src/irc/irc-recv.c:2718 #, c-format msgid "%s cannot identify nickname for \"%s\" command\n" msgstr "" -#: src/irc/irc-recv.c:2790 +#: src/irc/irc-recv.c:2860 msgid " on " msgstr "" -#: src/irc/irc-recv.c:2913 +#: src/irc/irc-recv.c:2983 #, c-format msgid "%s cannot create nick \"%s\" for channel \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:2968 +#: src/irc/irc-recv.c:3038 msgid "Nicks " msgstr "" -#: src/irc/irc-recv.c:2988 +#: src/irc/irc-recv.c:3058 msgid "Channel " msgstr "" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nicks" msgstr "" -#: src/irc/irc-recv.c:2999 +#: src/irc/irc-recv.c:3069 msgid "nick" msgstr "" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "ops" msgstr "" -#: src/irc/irc-recv.c:3007 +#: src/irc/irc-recv.c:3077 msgid "op" msgstr "" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfops" msgstr "" -#: src/irc/irc-recv.c:3016 +#: src/irc/irc-recv.c:3086 msgid "halfop" msgstr "" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voices" msgstr "" -#: src/irc/irc-recv.c:3025 +#: src/irc/irc-recv.c:3095 msgid "voice" msgstr "" -#: src/irc/irc-recv.c:3034 +#: src/irc/irc-recv.c:3104 msgid "normal" msgstr "" -#: src/irc/irc-recv.c:3070 +#: src/irc/irc-recv.c:3140 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 2nd nickname \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:3082 +#: src/irc/irc-recv.c:3152 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 3rd nickname \"%s\"\n" msgstr "" -#: src/irc/irc-recv.c:3094 +#: src/irc/irc-recv.c:3164 #, c-format msgid "" "%s: all declared nicknames are already in use, closing connection with " "server!\n" msgstr "" -#: src/irc/irc-recv.c:3104 +#: src/irc/irc-recv.c:3174 #, c-format msgid "%s: nickname \"%s\" is already in use, trying 1st nickname \"%s\"\n" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Waiting" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Connecting" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Active" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Done" msgstr "" -#: src/irc/irc-dcc.c:45 +#: src/irc/irc-dcc.c:46 msgid "Failed" msgstr "" -#: src/irc/irc-dcc.c:46 +#: src/irc/irc-dcc.c:47 msgid "Aborted" msgstr "" -#: src/irc/irc-dcc.c:149 +#: src/irc/irc-dcc.c:155 msgid "DCC: file " msgstr "" -#: src/irc/irc-dcc.c:154 src/irc/irc-dcc.c:334 +#: src/irc/irc-dcc.c:160 src/irc/irc-dcc.c:406 msgid " (local filename: " msgstr "" -#: src/irc/irc-dcc.c:160 +#: src/irc/irc-dcc.c:166 msgid ") sent to " msgstr "" -#: src/irc/irc-dcc.c:162 +#: src/irc/irc-dcc.c:168 msgid ") received from " msgstr "" -#: src/irc/irc-dcc.c:167 +#: src/irc/irc-dcc.c:173 msgid ": ok!\n" msgstr "" -#: src/irc/irc-dcc.c:278 +#: src/irc/irc-dcc.c:181 +msgid "DCC chat closed with " +msgstr "" + +#: src/irc/irc-dcc.c:219 +#, c-format +msgid "" +"%s can't associate DCC chat with private buffer (maybe private buffer has " +"already DCC CHAT?)\n" +msgstr "" + +#: src/irc/irc-dcc.c:229 +msgid "Connected to " +msgstr "" + +#: src/irc/irc-dcc.c:238 +msgid "via DCC chat\n" +msgstr "" + +#: src/irc/irc-dcc.c:348 #, c-format msgid "%s not enough memory for new DCC\n" msgstr "" -#: src/irc/irc-dcc.c:308 +#: src/irc/irc-dcc.c:365 +msgid "DCC chat" +msgstr "" + +#: src/irc/irc-dcc.c:386 msgid "Incoming DCC file from " msgstr "" -#: src/irc/irc-dcc.c:319 src/irc/irc-dcc.c:338 +#: src/irc/irc-dcc.c:397 src/irc/irc-dcc.c:410 msgid " bytes\n" msgstr "" -#: src/irc/irc-dcc.c:325 +#: src/irc/irc-dcc.c:402 msgid "Sending DCC file to " msgstr "" -#: src/irc/irc-dcc.c:393 +#: src/irc/irc-dcc.c:415 +msgid "Incoming DCC chat request from " +msgstr "" + +#: src/irc/irc-dcc.c:426 +msgid "Sending DCC chat request to " +msgstr "" + +#: src/irc/irc-dcc.c:490 #, c-format msgid "%s not enough memory for DCC SEND\n" msgstr "" -#: src/irc/irc-dcc.c:415 +#: src/irc/irc-dcc.c:512 #, c-format msgid "%s cannot access file \"%s\"\n" msgstr "" -#: src/irc/irc-dcc.c:434 +#: src/irc/irc-dcc.c:533 #, c-format msgid "%s cannot create socket for DCC\n" msgstr "" -#: src/irc/irc-dcc.c:446 +#: src/irc/irc-dcc.c:546 #, c-format msgid "%s cannot find port for DCC\n" msgstr "" -#: src/irc/irc-dcc.c:484 +#: src/irc/irc-dcc.c:593 #, c-format msgid "%s cannot send DCC\n" msgstr "" -#: src/irc/irc-dcc.c:599 +#: src/irc/irc-dcc.c:672 +#, c-format +msgid "%s error sending data to \"%s\" via DCC CHAT\n" +msgstr "" + +#: src/irc/irc-dcc.c:930 #, c-format msgid "" "%s DCC failed because blocksize is too big. Check value of \"dcc_blocksize\" " "option, max is %d.\n" msgstr "" -#: src/irc/irc-dcc.c:672 +#: src/irc/irc-dcc.c:1003 #, c-format msgid "aborting active DCC: \"%s\" from %s\n" msgstr "" @@ -1690,66 +1733,66 @@ msgstr "" msgid "%s unable to add handler for \"%s\" message (not enough memory)\n" msgstr "" -#: src/gui/curses/gui-input.c:763 +#: src/gui/curses/gui-input.c:756 #, c-format msgid "%s lag is high, disconnecting from server...\n" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "bytes" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Kb" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Mb" msgstr "" -#: src/gui/curses/gui-display.c:600 +#: src/gui/curses/gui-display.c:674 msgid "Gb" msgstr "" -#: src/gui/curses/gui-display.c:969 +#: src/gui/curses/gui-display.c:1061 msgid "(away)" msgstr "" -#: src/gui/curses/gui-display.c:1054 +#: src/gui/curses/gui-display.c:1174 #, c-format msgid "%d:[not connected] " msgstr "" -#: src/gui/curses/gui-display.c:1071 +#: src/gui/curses/gui-display.c:1191 msgid "Act: " msgstr "" -#: src/gui/curses/gui-display.c:1120 +#: src/gui/curses/gui-display.c:1240 #, c-format msgid "Lag: %.1f" msgstr "" -#: src/gui/curses/gui-display.c:1135 +#: src/gui/curses/gui-display.c:1255 msgid "-MORE-" msgstr "" -#: src/gui/curses/gui-display.c:1310 +#: src/gui/curses/gui-display.c:1429 msgid " [A] Accept" msgstr "" -#: src/gui/curses/gui-display.c:1311 src/gui/curses/gui-display.c:1315 +#: src/gui/curses/gui-display.c:1430 src/gui/curses/gui-display.c:1434 msgid " [C] Cancel" msgstr "" -#: src/gui/curses/gui-display.c:1320 +#: src/gui/curses/gui-display.c:1439 msgid " [R] Remove" msgstr "" -#: src/gui/curses/gui-display.c:1324 +#: src/gui/curses/gui-display.c:1443 msgid " [P] Purge old DCC" msgstr "" -#: src/gui/curses/gui-display.c:1325 +#: src/gui/curses/gui-display.c:1444 msgid " [Q] Close DCC view" msgstr "" @@ -1762,12 +1805,12 @@ msgstr "" msgid "%s not enough memory for infobar message\n" msgstr "" -#: src/gui/gui-common.c:497 +#: src/gui/gui-common.c:503 #, c-format msgid "%s not enough memory for new line!\n" msgstr "" -#: src/gui/gui-common.c:540 +#: src/gui/gui-common.c:546 msgid "not enough memory!\n" msgstr "" @@ -1995,300 +2038,300 @@ msgstr "" msgid "%s unknown command \"%s\" (type /help for help)\n" msgstr "" -#: src/common/command.c:699 +#: src/common/command.c:703 #, c-format msgid "%s cannot find nick for sending message\n" msgstr "" -#: src/common/command.c:708 +#: src/common/command.c:712 msgid "This window is not a channel!\n" msgstr "" -#: src/common/command.c:736 src/common/command.c:760 src/common/command.c:864 +#: src/common/command.c:740 src/common/command.c:764 src/common/command.c:868 #, c-format msgid "%s missing arguments for \"%s\" command\n" msgstr "" -#: src/common/command.c:745 +#: src/common/command.c:749 #, c-format msgid "Alias \"%s\" => \"%s\" created\n" msgstr "" -#: src/common/command.c:751 +#: src/common/command.c:755 #, c-format msgid "Failed to create alias \"%s\" => \"%s\" (not enough memory)\n" msgstr "" -#: src/common/command.c:771 +#: src/common/command.c:775 msgid "List of aliases:\n" msgstr "" -#: src/common/command.c:783 +#: src/common/command.c:787 msgid "No alias defined.\n" msgstr "" -#: src/common/command.c:806 +#: src/common/command.c:810 msgid "Channel: " msgstr "" -#: src/common/command.c:809 src/common/command.c:819 +#: src/common/command.c:813 src/common/command.c:823 msgid " (server: " msgstr "" -#: src/common/command.c:816 +#: src/common/command.c:820 msgid "Private with: " msgstr "" -#: src/common/command.c:844 +#: src/common/command.c:848 msgid "Opened buffers:\n" msgstr "" -#: src/common/command.c:887 src/common/command.c:1014 +#: src/common/command.c:891 src/common/command.c:1018 #, c-format msgid "%s incorrect buffer number\n" msgstr "" -#: src/common/command.c:901 +#: src/common/command.c:905 #, c-format msgid "%s can not close the single buffer\n" msgstr "" -#: src/common/command.c:911 +#: src/common/command.c:915 #, c-format msgid "%s can not close server buffer while channels are opened\n" msgstr "" -#: src/common/command.c:950 +#: src/common/command.c:954 msgid "Notify levels: " msgstr "" -#: src/common/command.c:977 src/common/command.c:987 +#: src/common/command.c:981 src/common/command.c:991 #, c-format msgid "%s incorrect notify level (must be between 0 and 3)\n" msgstr "" -#: src/common/command.c:1005 +#: src/common/command.c:1009 #, c-format msgid "%s buffer \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1039 +#: src/common/command.c:1043 #, c-format msgid "unknown parameter \"%s\" for \"%s\" command\n" msgstr "" -#: src/common/command.c:1069 +#: src/common/command.c:1073 #, c-format msgid "%s already connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1077 +#: src/common/command.c:1081 #, c-format msgid "%s currently connecting to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1095 src/common/command.c:1138 +#: src/common/command.c:1099 src/common/command.c:1142 #, c-format msgid "%s server not found\n" msgstr "" -#: src/common/command.c:1122 +#: src/common/command.c:1126 #, c-format msgid "%s not connected to server \"%s\"!\n" msgstr "" -#: src/common/command.c:1130 +#: src/common/command.c:1134 msgid "Auto-reconnection is cancelled\n" msgstr "" -#: src/common/command.c:1156 +#: src/common/command.c:1160 #, c-format msgid "%s internal commands:\n" msgstr "" -#: src/common/command.c:1165 +#: src/common/command.c:1169 msgid "IRC commands:\n" msgstr "" -#: src/common/command.c:1224 +#: src/common/command.c:1228 #, c-format msgid "No help available, \"%s\" is an unknown command\n" msgstr "" -#: src/common/command.c:1249 +#: src/common/command.c:1253 msgid "Registered Perl scripts:\n" msgstr "" -#: src/common/command.c:1266 src/common/command.c:1288 -#: src/common/command.c:1310 +#: src/common/command.c:1270 src/common/command.c:1292 +#: src/common/command.c:1314 msgid " (none)\n" msgstr "" -#: src/common/command.c:1271 +#: src/common/command.c:1275 msgid "Perl message handlers:\n" msgstr "" -#: src/common/command.c:1280 +#: src/common/command.c:1284 #, c-format msgid " IRC(%s) => Perl(%s)\n" msgstr "" -#: src/common/command.c:1293 +#: src/common/command.c:1297 msgid "Perl command handlers:\n" msgstr "" -#: src/common/command.c:1302 +#: src/common/command.c:1306 #, c-format msgid " Command /%s => Perl(%s)\n" msgstr "" -#: src/common/command.c:1322 +#: src/common/command.c:1326 msgid "Perl scripts unloaded\n" msgstr "" -#: src/common/command.c:1348 src/common/command.c:2045 -#: src/common/command.c:2057 +#: src/common/command.c:1352 src/common/command.c:2049 +#: src/common/command.c:2061 #, c-format msgid "%s unknown option for \"%s\" command\n" msgstr "" -#: src/common/command.c:1361 +#: src/common/command.c:1365 msgid "" "WeeChat was build without Perl support.\n" "Please rebuild WeeChat with \"--enable-perl\" option for ./configure script\n" msgstr "" -#: src/common/command.c:1415 +#: src/common/command.c:1419 msgid "No server.\n" msgstr "" -#: src/common/command.c:1426 +#: src/common/command.c:1430 #, c-format msgid "Server '%s' not found.\n" msgstr "" -#: src/common/command.c:1438 +#: src/common/command.c:1442 #, c-format msgid "%s missing servername for \"%s\" command\n" msgstr "" -#: src/common/command.c:1446 +#: src/common/command.c:1450 #, c-format msgid "%s too much arguments for \"%s\" command, ignoring arguments\n" msgstr "" -#: src/common/command.c:1465 +#: src/common/command.c:1469 #, c-format msgid "%s server \"%s\" not found for \"%s\" command\n" msgstr "" -#: src/common/command.c:1473 +#: src/common/command.c:1477 #, c-format msgid "" "%s you can not delete server \"%s\" because you are connected to. Try /" "disconnect %s before.\n" msgstr "" -#: src/common/command.c:1489 src/common/command.c:1630 +#: src/common/command.c:1493 src/common/command.c:1634 msgid "Server" msgstr "" -#: src/common/command.c:1492 +#: src/common/command.c:1496 msgid "has been deleted\n" msgstr "" -#: src/common/command.c:1507 +#: src/common/command.c:1511 #, c-format msgid "%s missing parameters for \"%s\" command\n" msgstr "" -#: src/common/command.c:1517 +#: src/common/command.c:1521 #, c-format msgid "%s server \"%s\" already exists, can't create it!\n" msgstr "" -#: src/common/command.c:1542 src/common/command.c:1570 -#: src/common/command.c:1583 src/common/command.c:1609 +#: src/common/command.c:1546 src/common/command.c:1574 +#: src/common/command.c:1587 src/common/command.c:1613 #, c-format msgid "%s missing password for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1555 +#: src/common/command.c:1559 #, c-format msgid "%s missing nick(s) for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1596 +#: src/common/command.c:1600 #, c-format msgid "%s missing command for \"%s\" parameter\n" msgstr "" -#: src/common/command.c:1633 +#: src/common/command.c:1637 msgid "created\n" msgstr "" -#: src/common/command.c:1639 +#: src/common/command.c:1643 #, c-format msgid "%s unable to create server\n" msgstr "" -#: src/common/command.c:1694 +#: src/common/command.c:1698 msgid "(unknown)" msgstr "" -#: src/common/command.c:1717 +#: src/common/command.c:1721 msgid "(password hidden) " msgstr "" -#: src/common/command.c:1781 +#: src/common/command.c:1785 #, c-format msgid "%s server \"%s\" not found\n" msgstr "" -#: src/common/command.c:1812 src/common/command.c:1858 +#: src/common/command.c:1816 src/common/command.c:1862 #, c-format msgid "%s config option \"%s\" not found\n" msgstr "" -#: src/common/command.c:1817 src/common/command.c:1850 +#: src/common/command.c:1821 src/common/command.c:1854 #, c-format msgid "%s incorrect value for option \"%s\"\n" msgstr "" -#: src/common/command.c:1833 +#: src/common/command.c:1837 #, c-format msgid "%s option \"%s\" can not be changed while WeeChat is running\n" msgstr "" -#: src/common/command.c:1931 +#: src/common/command.c:1935 #, c-format msgid "No config option found with \"%s\"\n" msgstr "" -#: src/common/command.c:1934 +#: src/common/command.c:1938 msgid "No config option found\n" msgstr "" -#: src/common/command.c:1940 +#: src/common/command.c:1944 #, c-format msgid "config option(s) found with \"%s\"\n" msgstr "" -#: src/common/command.c:1943 +#: src/common/command.c:1947 msgid "config option(s) found\n" msgstr "" -#: src/common/command.c:1963 +#: src/common/command.c:1967 #, c-format msgid "%s alias or command \"%s\" not found\n" msgstr "" -#: src/common/command.c:1973 +#: src/common/command.c:1977 #, c-format msgid "Alias \"%s\" removed\n" msgstr "" -#: src/common/command.c:1993 +#: src/common/command.c:1997 msgid "Opened windows:\n" msgstr "" diff --git a/weechat/src/common/command.c b/weechat/src/common/command.c index c706139a3..4e6c65ab2 100644 --- a/weechat/src/common/command.c +++ b/weechat/src/common/command.c @@ -662,23 +662,27 @@ user_command (t_irc_server *server, char *command) command++; if (server && (!BUFFER_IS_SERVER(gui_current_window->buffer))) { - server_sendf (server, "PRIVMSG %s :%s\r\n", - CHANNEL(gui_current_window->buffer)->name, - command); + if (CHANNEL(gui_current_window->buffer)->dcc_chat) + dcc_chat_sendf ((t_irc_dcc *)(CHANNEL(gui_current_window->buffer)->dcc_chat), + "%s\r\n", command); + else + server_sendf (server, "PRIVMSG %s :%s\r\n", + CHANNEL(gui_current_window->buffer)->name, + command); if (BUFFER_IS_PRIVATE(gui_current_window->buffer)) { - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (CHANNEL(gui_current_window->buffer)->buffer, + gui_printf_type_color (CHANNEL(gui_current_window->buffer)->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", command); } diff --git a/weechat/src/common/completion.c b/weechat/src/common/completion.c index ce9d0e5ce..f01b42e9a 100644 --- a/weechat/src/common/completion.c +++ b/weechat/src/common/completion.c @@ -339,6 +339,9 @@ completion_build_list (t_completion *completion, void *channel) weelist_add (&completion->completion_list, &completion->last_completion, "send"); + weelist_add (&completion->completion_list, + &completion->last_completion, + "close"); return; } if (strcasecmp (completion->base_command, "invite") == 0) diff --git a/weechat/src/common/weeconfig.c b/weechat/src/common/weeconfig.c index 643f7f123..82b636ab0 100644 --- a/weechat/src/common/weeconfig.c +++ b/weechat/src/common/weeconfig.c @@ -394,7 +394,7 @@ t_config_option weechat_options_colors[] = { "col_dcc_waiting", N_("color for \"waiting\" dcc status"), N_("color for \"waiting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, - "white", NULL, &cfg_col_dcc_waiting, NULL, &config_change_color }, + "lightcyan", NULL, &cfg_col_dcc_waiting, NULL, &config_change_color }, { "col_dcc_connecting", N_("color for \"connecting\" dcc status"), N_("color for \"connecting\" dcc status"), OPTION_TYPE_COLOR, 0, 0, 0, diff --git a/weechat/src/gui/curses/gui-display.c b/weechat/src/gui/curses/gui-display.c index 679c90372..26481f740 100644 --- a/weechat/src/gui/curses/gui-display.c +++ b/weechat/src/gui/curses/gui-display.c @@ -706,33 +706,42 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) { if (i >= ptr_win->win_chat_height - 1) break; - if ((ptr_dcc->type == DCC_FILE_RECV) - || (ptr_dcc->type == DCC_FILE_SEND)) + + /* nickname and filename */ + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", + (ptr_dcc == dcc_selected) ? "***" : " ", + ptr_dcc->nick, + (DCC_IS_CHAT(ptr_dcc->type)) ? + _(ptr_dcc->filename) : ptr_dcc->filename); + if (DCC_IS_FILE(ptr_dcc->type)) { - gui_window_set_color (ptr_win->win_chat, - (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i, 0, "%s %-16s %s", - (ptr_dcc == dcc_selected) ? "***" : " ", - ptr_dcc->nick, ptr_dcc->filename); if (ptr_dcc->filename_suffix > 0) wprintw (ptr_win->win_chat, " (.%d)", ptr_dcc->filename_suffix); + } + + /* status */ + gui_window_set_color (ptr_win->win_chat, + (ptr_dcc == dcc_selected) ? + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + mvwprintw (ptr_win->win_chat, i + 1, 0, "%s %s ", + (ptr_dcc == dcc_selected) ? "***" : " ", + (DCC_IS_RECV(ptr_dcc->type)) ? "-->>" : "<<--"); + gui_window_set_color (ptr_win->win_chat, + COLOR_DCC_WAITING + ptr_dcc->status); + wprintw (ptr_win->win_chat, "%-10s", + _(dcc_status_string[ptr_dcc->status])); + + /* other infos */ + if (DCC_IS_FILE(ptr_dcc->type)) + { gui_window_set_color (ptr_win->win_chat, (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - mvwprintw (ptr_win->win_chat, i + 1, 0, "%s %s ", - (ptr_dcc == dcc_selected) ? "***" : " ", - (ptr_dcc->type == DCC_FILE_RECV) ? "-->>" : "<<--"); - gui_window_set_color (ptr_win->win_chat, - COLOR_DCC_WAITING + ptr_dcc->status); - wprintw (ptr_win->win_chat, "%-10s", - dcc_status_string[ptr_dcc->status]); - gui_window_set_color (ptr_win->win_chat, - (ptr_dcc == dcc_selected) ? - COLOR_DCC_SELECTED : COLOR_WIN_CHAT); - wprintw (ptr_win->win_chat, " [", - dcc_status_string[ptr_dcc->status]); + COLOR_DCC_SELECTED : COLOR_WIN_CHAT); + wprintw (ptr_win->win_chat, " ["); if (ptr_dcc->size == 0) num_bars = 10; else @@ -752,8 +761,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) else num_unit = 3; wprintw (ptr_win->win_chat, "] %3lu%% ", - (unsigned long)(((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100), - dcc_status_string[ptr_dcc->status]); + (unsigned long)(((long double)(ptr_dcc->pos)/(long double)(ptr_dcc->size))*100)); sprintf (format, "%s %%s / %s %%s", unit_format[num_unit], unit_format[num_unit]); @@ -762,9 +770,14 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase) unit_name[num_unit], ((long double) ptr_dcc->size) / ((long double)(unit_divide[num_unit])), unit_name[num_unit]); - ptr_win->dcc_last_displayed = ptr_dcc; - i += 2; } + else + { + wclrtoeol (ptr_win->win_chat); + } + + ptr_win->dcc_last_displayed = ptr_dcc; + i += 2; } } else @@ -1089,42 +1102,61 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase) else wprintw (ptr_win->win_status, "%s", CHANNEL(ptr_win->buffer)->name); - if ((ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer) - && (CHANNEL(ptr_win->buffer)->type == CHAT_CHANNEL)) + if (ptr_win->buffer == CHANNEL(ptr_win->buffer)->buffer) { /* display channel modes */ - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS_DELIMITERS); - wprintw (ptr_win->win_status, "("); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS); - i = 0; - first_mode = 1; - while (CHANNEL(ptr_win->buffer)->modes[i]) + if (CHANNEL(ptr_win->buffer)->type == CHAT_CHANNEL) { - if (CHANNEL(ptr_win->buffer)->modes[i] != ' ') + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, "("); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + i = 0; + first_mode = 1; + while (CHANNEL(ptr_win->buffer)->modes[i]) { - if (first_mode) + if (CHANNEL(ptr_win->buffer)->modes[i] != ' ') { - wprintw (ptr_win->win_status, "+"); - first_mode = 0; + if (first_mode) + { + wprintw (ptr_win->win_status, "+"); + first_mode = 0; + } + wprintw (ptr_win->win_status, "%c", + CHANNEL(ptr_win->buffer)->modes[i]); } - wprintw (ptr_win->win_status, "%c", - CHANNEL(ptr_win->buffer)->modes[i]); + i++; } - i++; + if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_KEY] != ' ') + wprintw (ptr_win->win_status, ",%s", + CHANNEL(ptr_win->buffer)->key); + if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_LIMIT] != ' ') + wprintw (ptr_win->win_status, ",%d", + CHANNEL(ptr_win->buffer)->limit); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, ")"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + } + + /* display DCC if private is DCC CHAT */ + if ((CHANNEL(ptr_win->buffer)->type == CHAT_PRIVATE) + && (CHANNEL(ptr_win->buffer)->dcc_chat)) + { + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, "("); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); + wprintw (ptr_win->win_status, "DCC"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS_DELIMITERS); + wprintw (ptr_win->win_status, ")"); + gui_window_set_color (ptr_win->win_status, + COLOR_WIN_STATUS); } - if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_KEY] != ' ') - wprintw (ptr_win->win_status, ",%s", - CHANNEL(ptr_win->buffer)->key); - if (CHANNEL(ptr_win->buffer)->modes[CHANNEL_MODE_LIMIT] != ' ') - wprintw (ptr_win->win_status, ",%d", - CHANNEL(ptr_win->buffer)->limit); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS_DELIMITERS); - wprintw (ptr_win->win_status, ")"); - gui_window_set_color (ptr_win->win_status, - COLOR_WIN_STATUS); } wprintw (ptr_win->win_status, " "); } @@ -1393,8 +1425,7 @@ gui_draw_buffer_input (t_gui_buffer *buffer, int erase) switch (dcc_selected->status) { case DCC_WAITING: - if ((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV)) + if (DCC_IS_RECV(dcc_selected->type)) wprintw (ptr_win->win_input, _(" [A] Accept")); wprintw (ptr_win->win_input, _(" [C] Cancel")); break; @@ -2271,15 +2302,11 @@ gui_end () /* delete all buffers */ while (gui_buffers) - { gui_buffer_free (gui_buffers, 0); - } /* delete all windows */ while (gui_windows) - { gui_window_free (gui_windows); - } /* delete general history */ history_general_free (); @@ -2355,11 +2382,11 @@ gui_add_message (t_gui_buffer *buffer, int type, int color, char *message) } /* - * gui_printf_color_type: display a message in a buffer + * gui_printf_type_color: display a message in a buffer */ void -gui_printf_color_type (t_gui_buffer *buffer, int type, int color, char *message, ...) +gui_printf_type_color (t_gui_buffer *buffer, int type, int color, char *message, ...) { static char buf[8192]; char timestamp[16]; diff --git a/weechat/src/gui/curses/gui-input.c b/weechat/src/gui/curses/gui-input.c index ca29e837b..9aff7153d 100644 --- a/weechat/src/gui/curses/gui-input.c +++ b/weechat/src/gui/curses/gui-input.c @@ -569,9 +569,8 @@ gui_read_keyb () case 'a': case 'A': if (dcc_selected - && (((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV)) - && (dcc_selected->status == DCC_WAITING))) + && (DCC_IS_RECV(dcc_selected->status)) + && (dcc_selected->status == DCC_WAITING)) { dcc_accept (dcc_selected); } @@ -580,9 +579,7 @@ gui_read_keyb () case 'c': case 'C': if (dcc_selected - && ((dcc_selected->status == DCC_WAITING) - || (dcc_selected->status == DCC_CONNECTING) - || (dcc_selected->status == DCC_ACTIVE))) + && (!DCC_ENDED(dcc_selected->status))) { dcc_close (dcc_selected, DCC_ABORTED); gui_redraw_buffer (gui_current_window->buffer); @@ -594,9 +591,7 @@ gui_read_keyb () gui_current_window->dcc_selected = NULL; for (ptr_dcc = dcc_list; ptr_dcc; ptr_dcc = ptr_dcc->next_dcc) { - if ((dcc_selected->status == DCC_DONE) - || (dcc_selected->status == DCC_FAILED) - || (dcc_selected->status == DCC_ABORTED)) + if (DCC_ENDED(ptr_dcc->status)) dcc_free (ptr_dcc); } gui_redraw_buffer (gui_current_window->buffer); @@ -618,12 +613,7 @@ gui_read_keyb () case 'r': case 'R': if (dcc_selected - && (((dcc_selected->type == DCC_CHAT_RECV) - || (dcc_selected->type == DCC_FILE_RECV) - || (dcc_selected->type == DCC_FILE_SEND)) - && ((dcc_selected->status == DCC_DONE) - || (dcc_selected->status == DCC_FAILED) - || (dcc_selected->status == DCC_ABORTED)))) + && (DCC_ENDED(dcc_selected->status))) { if (dcc_selected->next_dcc) gui_current_window->dcc_selected = dcc_selected->next_dcc; @@ -775,8 +765,8 @@ gui_main_loop () FD_SET (ptr_server->child_read, &read_fd); else { - if (ptr_server->sock4 >= 0) - FD_SET (ptr_server->sock4, &read_fd); + if (ptr_server->sock >= 0) + FD_SET (ptr_server->sock, &read_fd); } } } @@ -798,8 +788,8 @@ gui_main_loop () } else { - if ((ptr_server->sock4 >= 0) && - (FD_ISSET (ptr_server->sock4, &read_fd))) + if ((ptr_server->sock >= 0) && + (FD_ISSET (ptr_server->sock, &read_fd))) server_recv (ptr_server); } } diff --git a/weechat/src/gui/gui.h b/weechat/src/gui/gui.h index 7c7ddbc6e..6885ecf3d 100644 --- a/weechat/src/gui/gui.h +++ b/weechat/src/gui/gui.h @@ -86,13 +86,16 @@ #define MSG_TYPE_NOLOG 64 #define gui_printf_color(buffer, color, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO, color, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO, color, fmt, ##argz) + +#define gui_printf_type(buffer, type, fmt, argz...) \ + gui_printf_type_color(buffer, type, -1, fmt, ##argz) #define gui_printf(buffer, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO, -1, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO, -1, fmt, ##argz) #define gui_printf_nolog(buffer, fmt, argz...) \ - gui_printf_color_type(buffer, MSG_TYPE_INFO | MSG_TYPE_NOLOG, -1, fmt, ##argz) + gui_printf_type_color(buffer, MSG_TYPE_INFO | MSG_TYPE_NOLOG, -1, fmt, ##argz) typedef struct t_gui_message t_gui_message; @@ -313,7 +316,7 @@ extern void gui_init_colors (); extern void gui_set_window_title (); extern void gui_init (); extern void gui_end (); -extern void gui_printf_color_type (/*@null@*/ t_gui_buffer *, int, int, char *, ...); +extern void gui_printf_type_color (/*@null@*/ t_gui_buffer *, int, int, char *, ...); extern void gui_main_loop (); #endif /* gui.h */ diff --git a/weechat/src/irc/irc-channel.c b/weechat/src/irc/irc-channel.c index c4ba4e9b2..10faf44b0 100644 --- a/weechat/src/irc/irc-channel.c +++ b/weechat/src/irc/irc-channel.c @@ -25,6 +25,7 @@ #endif #include +#include #include #include "../common/weechat.h" @@ -53,6 +54,7 @@ channel_new (t_irc_server *server, int channel_type, char *channel_name, /* initialize new channel */ new_channel->type = channel_type; + new_channel->dcc_chat = NULL; new_channel->name = strdup (channel_name); new_channel->topic = NULL; memset (new_channel->modes, ' ', sizeof (new_channel->modes)); @@ -101,6 +103,14 @@ channel_free (t_irc_server *server, t_irc_channel *channel) if (channel->next_channel) (channel->next_channel)->prev_channel = channel->prev_channel; + /* close DCC CHAT */ + if ((t_irc_dcc *)(channel->dcc_chat) && + (!DCC_ENDED(((t_irc_dcc *)(channel->dcc_chat))->status))) + { + dcc_close ((t_irc_dcc *)(channel->dcc_chat), DCC_ABORTED); + dcc_redraw (1); + } + /* free data */ if (channel->name) free (channel->name); @@ -204,3 +214,49 @@ channel_set_away (t_irc_channel *channel, char *nick, int is_away) nick_set_away (channel, ptr_nick, is_away); } } + +/* + * channel_create_dcc: create DCC CHAT channel + */ + +int +channel_create_dcc (t_irc_dcc *ptr_dcc) +{ + t_irc_channel *ptr_channel; + + ptr_channel = channel_search (ptr_dcc->server, ptr_dcc->nick); + if (!ptr_channel) + ptr_channel = channel_new (ptr_dcc->server, CHAT_PRIVATE, + ptr_dcc->nick, 0); + if (!ptr_channel) + return 0; + + if (ptr_channel->dcc_chat && + (!DCC_ENDED(((t_irc_dcc *)(ptr_channel->dcc_chat))->status))) + return 0; + + ptr_channel->dcc_chat = ptr_dcc; + ptr_dcc->channel = ptr_channel; + gui_redraw_buffer (ptr_channel->buffer); + return 1; +} + +/* + * channel_remove_dcc: remove a DCC CHAT + */ + +void +channel_remove_dcc (t_irc_dcc *ptr_dcc) +{ + t_irc_channel *ptr_channel; + + for (ptr_channel = ptr_dcc->server->channels; ptr_channel; + ptr_channel = ptr_channel->next_channel) + { + if ((t_irc_dcc *)(ptr_channel->dcc_chat) == ptr_dcc) + { + ptr_channel->dcc_chat = NULL; + gui_redraw_buffer (ptr_channel->buffer); + } + } +} diff --git a/weechat/src/irc/irc-commands.c b/weechat/src/irc/irc-commands.c index 88cc8065b..54ea5c843 100644 --- a/weechat/src/irc/irc-commands.c +++ b/weechat/src/irc/irc-commands.c @@ -44,12 +44,12 @@ t_irc_command irc_commands[] = N_("nickname type"), N_("nickname: user to send ctcp to\ntype: \"action\" or \"version\""), 2, MAX_ARGS, 1, NULL, irc_cmd_send_ctcp, NULL }, - { "dcc", N_("starts DCC (file or chat)"), - N_("action nickname [file]"), - N_("action: 'send' (file) or 'chat'\n" + { "dcc", N_("starts DCC (file or chat) or close chat"), + N_("action [nickname [file]]"), + N_("action: 'send' (file) or 'chat' or 'close' (chat)\n" "nickname: nickname to send file or chat\n" "file: filename (on local host)"), - 2, MAX_ARGS, 1, NULL, irc_cmd_send_dcc, NULL }, + 1, MAX_ARGS, 1, NULL, irc_cmd_send_dcc, NULL }, { "deop", N_("removes channel operator status from nickname(s)"), N_("nickname [nickname]"), "", 1, MAX_ARGS, 1, irc_cmd_send_deop, NULL, NULL }, diff --git a/weechat/src/irc/irc-dcc.c b/weechat/src/irc/irc-dcc.c index 2d51c7e1a..6cc21774f 100644 --- a/weechat/src/irc/irc-dcc.c +++ b/weechat/src/irc/irc-dcc.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -70,7 +71,10 @@ dcc_connect (t_irc_dcc *ptr_dcc) { struct sockaddr_in addr; - ptr_dcc->status = DCC_CONNECTING; + if (ptr_dcc->type == DCC_CHAT_SEND) + ptr_dcc->status = DCC_WAITING; + else + ptr_dcc->status = DCC_CONNECTING; if (ptr_dcc->sock == -1) { @@ -81,8 +85,8 @@ dcc_connect (t_irc_dcc *ptr_dcc) if (fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK) == -1) return 0; - /* for DCC SEND, listen to socket for a connection */ - if (ptr_dcc->type == DCC_FILE_SEND) + /* for sending (chat or file), listen to socket for a connection */ + if (DCC_IS_SEND(ptr_dcc->type)) { if (listen (ptr_dcc->sock, 1) == -1) return 0; @@ -90,8 +94,8 @@ dcc_connect (t_irc_dcc *ptr_dcc) return 0; } - /* for DCC RECV, connect to listening host */ - if (ptr_dcc->type == DCC_FILE_RECV) + /* for receiving (chat or file), connect to listening host */ + if (DCC_IS_RECV(ptr_dcc->type)) { memset (&addr, 0, sizeof (addr)); addr.sin_port = htons (ptr_dcc->port); @@ -125,6 +129,8 @@ dcc_free (t_irc_dcc *ptr_dcc) if (ptr_dcc->nick) free (ptr_dcc->nick); + if (ptr_dcc->unterminated_message) + free (ptr_dcc->unterminated_message); if (ptr_dcc->filename) free (ptr_dcc->filename); @@ -143,7 +149,7 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) if (status == DCC_DONE) { - if ((ptr_dcc->type == DCC_FILE_SEND) || (ptr_dcc->type == DCC_FILE_RECV)) + if (DCC_IS_FILE(ptr_dcc->type)) { irc_display_prefix (ptr_dcc->server->buffer, PREFIX_INFO); gui_printf (ptr_dcc->server->buffer, _("DCC: file ")); @@ -167,6 +173,25 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) gui_printf (ptr_dcc->server->buffer, _(": ok!\n")); } } + if (status == DCC_ABORTED) + { + if (DCC_IS_CHAT(ptr_dcc->type)) + { + irc_display_prefix (ptr_dcc->channel->buffer, PREFIX_INFO); + gui_printf (ptr_dcc->channel->buffer, _("DCC chat closed with ")); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_NICK, + "%s", ptr_dcc->nick); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + ptr_dcc->addr >> 24, (ptr_dcc->addr >> 16) & 0xff, + (ptr_dcc->addr >> 8) & 0xff, ptr_dcc->addr & 0xff); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, ")\n"); + } + } + + if (DCC_IS_CHAT(ptr_dcc->type)) + channel_remove_dcc (ptr_dcc); if (ptr_dcc->sock != -1) { @@ -180,6 +205,39 @@ dcc_close (t_irc_dcc *ptr_dcc, int status) } } +/* + * dcc_channel_for_chat: create channel for DCC chat + */ + +void +dcc_channel_for_chat (t_irc_dcc *ptr_dcc) +{ + if (!channel_create_dcc (ptr_dcc)) + { + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_ERROR); + gui_printf (ptr_dcc->server->buffer, + _("%s can't associate DCC chat with private buffer " + "(maybe private buffer has already DCC CHAT?)\n"), + WEECHAT_ERROR); + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + + irc_display_prefix (ptr_dcc->channel->buffer, PREFIX_INFO); + gui_printf_type (ptr_dcc->channel->buffer, MSG_TYPE_MSG, + _("Connected to ")); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_NICK, + "%s", ptr_dcc->nick); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + ptr_dcc->addr >> 24, (ptr_dcc->addr >> 16) & 0xff, + (ptr_dcc->addr >> 8) & 0xff, ptr_dcc->addr & 0xff); + gui_printf_color (ptr_dcc->channel->buffer, COLOR_WIN_CHAT_DARK, ") "); + gui_printf (ptr_dcc->channel->buffer, _("via DCC chat\n")); +} + /* * dcc_accept: accepts a DCC file or chat request */ @@ -197,67 +255,77 @@ dcc_accept (t_irc_dcc *ptr_dcc) else { ptr_dcc->status = DCC_ACTIVE; - ptr_home = getenv ("HOME"); - ptr_dcc->local_filename = (char *) malloc (strlen (cfg_dcc_download_path) + - strlen (ptr_dcc->nick) + - strlen (ptr_dcc->filename) + - ((cfg_dcc_download_path[0] == '~') ? - strlen (ptr_home) : 0) + - 4); - if (!ptr_dcc->local_filename) + + /* DCC file => look for local filename and open it in writing mode */ + if (DCC_IS_FILE(ptr_dcc->type)) { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - if (cfg_dcc_download_path[0] == '~') - { - strcpy (ptr_dcc->local_filename, ptr_home); - strcat (ptr_dcc->local_filename, cfg_dcc_download_path + 1); + ptr_home = getenv ("HOME"); + ptr_dcc->local_filename = (char *) malloc (strlen (cfg_dcc_download_path) + + strlen (ptr_dcc->nick) + + strlen (ptr_dcc->filename) + + ((cfg_dcc_download_path[0] == '~') ? + strlen (ptr_home) : 0) + + 4); + if (!ptr_dcc->local_filename) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + if (cfg_dcc_download_path[0] == '~') + { + strcpy (ptr_dcc->local_filename, ptr_home); + strcat (ptr_dcc->local_filename, cfg_dcc_download_path + 1); + } + else + strcpy (ptr_dcc->local_filename, cfg_dcc_download_path); + if (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != DIR_SEPARATOR_CHAR) + strcat (ptr_dcc->local_filename, DIR_SEPARATOR); + strcat (ptr_dcc->local_filename, ptr_dcc->nick); + strcat (ptr_dcc->local_filename, "."); + strcat (ptr_dcc->local_filename, ptr_dcc->filename); + + /* file already exists? */ + if (access (ptr_dcc->local_filename, F_OK) == 0) + { + /* if auto rename is not set, then abort DCC */ + if (!cfg_dcc_auto_rename) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + + filename2 = (char *) malloc (strlen (ptr_dcc->local_filename) + 16); + if (!filename2) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->filename_suffix = 0; + do + { + ptr_dcc->filename_suffix++; + sprintf (filename2, "%s.%d", + ptr_dcc->local_filename, + ptr_dcc->filename_suffix); + } + while (access (filename2, F_OK) == 0); + + free (ptr_dcc->local_filename); + ptr_dcc->local_filename = strdup (filename2); + free (filename2); + } + ptr_dcc->file = open (ptr_dcc->local_filename, + O_CREAT | O_TRUNC | O_WRONLY | O_NONBLOCK, + 0644); } else - strcpy (ptr_dcc->local_filename, cfg_dcc_download_path); - if (ptr_dcc->local_filename[strlen (ptr_dcc->local_filename) - 1] != DIR_SEPARATOR_CHAR) - strcat (ptr_dcc->local_filename, DIR_SEPARATOR); - strcat (ptr_dcc->local_filename, ptr_dcc->nick); - strcat (ptr_dcc->local_filename, "."); - strcat (ptr_dcc->local_filename, ptr_dcc->filename); - - /* file already exists? */ - if (access (ptr_dcc->local_filename, F_OK) == 0) { - /* if auto rename is not set, then abort DCC */ - if (!cfg_dcc_auto_rename) - { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - - filename2 = (char *) malloc (strlen (ptr_dcc->local_filename) + 16); - if (!filename2) - { - dcc_close (ptr_dcc, DCC_FAILED); - dcc_redraw (1); - return; - } - ptr_dcc->filename_suffix = 0; - do - { - ptr_dcc->filename_suffix++; - sprintf (filename2, "%s.%d", - ptr_dcc->local_filename, - ptr_dcc->filename_suffix); - } - while (access (filename2, F_OK) == 0); - - free (ptr_dcc->local_filename); - ptr_dcc->local_filename = strdup (filename2); - free (filename2); + /* DCC CHAT => associate DCC with channel */ + dcc_channel_for_chat (ptr_dcc); } - ptr_dcc->file = open (ptr_dcc->local_filename, - O_CREAT | O_TRUNC | O_WRONLY | O_NONBLOCK, - 0644); } dcc_redraw (1); } @@ -272,22 +340,31 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic { t_irc_dcc *new_dcc; + /* create new DCC struct */ if ((new_dcc = (t_irc_dcc *) malloc (sizeof (t_irc_dcc))) == NULL) { - gui_printf_nolog (server->buffer, - _("%s not enough memory for new DCC\n"), - WEECHAT_ERROR); + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s not enough memory for new DCC\n"), + WEECHAT_ERROR); return NULL; } + + /* initialize new DCC */ new_dcc->server = server; + new_dcc->channel = NULL; new_dcc->type = type; new_dcc->status = DCC_WAITING; new_dcc->addr = addr; new_dcc->port = port; new_dcc->nick = strdup (nick); new_dcc->sock = sock; + new_dcc->unterminated_message = NULL; new_dcc->file = -1; - new_dcc->filename = strdup (filename); + if (DCC_IS_CHAT(type)) + new_dcc->filename = strdup (_("DCC chat")); + else + new_dcc->filename = (filename) ? strdup (filename) : NULL; new_dcc->local_filename = (local_filename) ? strdup (local_filename) : NULL; new_dcc->filename_suffix = -1; new_dcc->size = size; @@ -302,6 +379,7 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_current_window->dcc_first = NULL; gui_current_window->dcc_selected = NULL; + /* write info message on server buffer */ if (type == DCC_FILE_RECV) { irc_display_prefix (server->buffer, PREFIX_INFO); @@ -318,17 +396,11 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%lu", size); gui_printf (server->buffer, _(" bytes\n")); } - if (type == DCC_FILE_SEND) { irc_display_prefix (server->buffer, PREFIX_INFO); gui_printf (server->buffer, _("Sending DCC file to ")); gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s", nick); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, " ("); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_HOST, - "%d.%d.%d.%d", - addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); - gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, ")"); gui_printf (server->buffer, ": "); gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%s", filename); gui_printf (server->buffer, _(" (local filename: ")); @@ -337,8 +409,26 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic gui_printf_color (server->buffer, COLOR_WIN_CHAT_CHANNEL, "%lu", size); gui_printf (server->buffer, _(" bytes\n")); } + if (type == DCC_CHAT_RECV) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Incoming DCC chat request from ")); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s", nick); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, " ("); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_HOST, + "%d.%d.%d.%d", + addr >> 24, (addr >> 16) & 0xff, (addr >> 8) & 0xff, addr & 0xff); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_DARK, ")\n"); + } + if (type == DCC_CHAT_SEND) + { + irc_display_prefix (server->buffer, PREFIX_INFO); + gui_printf (server->buffer, _("Sending DCC chat request to ")); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, "%s\n", nick); + } - if (type == DCC_FILE_SEND) + /* connect if needed and redraw DCC buffer */ + if (DCC_IS_SEND(type)) { if (!dcc_connect (new_dcc)) { @@ -358,11 +448,11 @@ dcc_add (t_irc_server *server, int type, unsigned long addr, int port, char *nic } /* - * dcc_send: send DCC request (file or chat) + * dcc_send_request: send DCC request (file or chat) */ void -dcc_send (t_irc_server *server, char *nick, char *filename) +dcc_send_request (t_irc_server *server, int type, char *nick, char *filename) { char *ptr_home, *filename2, *short_filename, *pos; int spaces; @@ -371,57 +461,66 @@ dcc_send (t_irc_server *server, char *nick, char *filename) struct sockaddr_in addr; socklen_t length; unsigned long local_addr; + t_irc_dcc *ptr_dcc; - /* add home if filename not beginning with '/' (not for Win32) */ - #ifdef _WIN32 - filename2 = strdup (filename); - #else - if (filename[0] == '/') - filename2 = strdup (filename); - else + filename2 = NULL; + short_filename = NULL; + spaces = 0; + + if (type == DCC_FILE_SEND) { - ptr_home = getenv ("HOME"); - filename2 = (char *) malloc (strlen (cfg_dcc_upload_path) + - strlen (filename) + - ((cfg_dcc_upload_path[0] == '~') ? - strlen (ptr_home) : 0) + - 4); - if (!filename2) + /* add home if filename not beginning with '/' (not for Win32) */ + #ifdef _WIN32 + filename2 = strdup (filename); + #else + if (filename[0] == '/') + filename2 = strdup (filename); + else + { + ptr_home = getenv ("HOME"); + filename2 = (char *) malloc (strlen (cfg_dcc_upload_path) + + strlen (filename) + + ((cfg_dcc_upload_path[0] == '~') ? + strlen (ptr_home) : 0) + + 4); + if (!filename2) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s not enough memory for DCC SEND\n"), + WEECHAT_ERROR); + return; + } + if (cfg_dcc_upload_path[0] == '~') + { + strcpy (filename2, ptr_home); + strcat (filename2, cfg_dcc_upload_path + 1); + } + else + strcpy (filename2, cfg_dcc_upload_path); + if (filename2[strlen (filename2) - 1] != DIR_SEPARATOR_CHAR) + strcat (filename2, DIR_SEPARATOR); + strcat (filename2, filename); + } + #endif + + /* check if file exists */ + if (stat (filename2, &st) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s not enough memory for DCC SEND\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot access file \"%s\"\n"), + WEECHAT_ERROR, filename2); + if (filename2) + free (filename2); return; } - if (cfg_dcc_upload_path[0] == '~') - { - strcpy (filename2, ptr_home); - strcat (filename2, cfg_dcc_upload_path + 1); - } - else - strcpy (filename2, cfg_dcc_upload_path); - if (filename2[strlen (filename2) - 1] != DIR_SEPARATOR_CHAR) - strcat (filename2, DIR_SEPARATOR); - strcat (filename2, filename); - } - #endif - - /* check if file exists */ - if (stat (filename2, &st) == -1) - { - irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot access file \"%s\"\n"), - WEECHAT_ERROR, filename2); - free (filename2); - return; } /* get local IP address */ memset (&addr, 0, sizeof (struct sockaddr_in)); length = sizeof (addr); - getsockname (server->sock4, (struct sockaddr *) &addr, &length); + getsockname (server->sock, (struct sockaddr *) &addr, &length); addr.sin_family = AF_INET; local_addr = ntohl (addr.sin_addr.s_addr); @@ -430,10 +529,11 @@ dcc_send (t_irc_server *server, char *nick, char *filename) if (sock == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create socket for DCC\n"), - WEECHAT_ERROR); - free (filename2); + gui_printf (server->buffer, + _("%s cannot create socket for DCC\n"), + WEECHAT_ERROR); + if (filename2) + free (filename2); return; } @@ -442,68 +542,243 @@ dcc_send (t_irc_server *server, char *nick, char *filename) if (bind (sock, (struct sockaddr *) &addr, sizeof (addr)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot find port for DCC\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot find port for DCC\n"), + WEECHAT_ERROR); close (sock); - free (filename2); + if (filename2) + free (filename2); return; } length = sizeof (addr); getsockname (sock, (struct sockaddr *) &addr, &length); port = ntohs (addr.sin_port); - /* extract short filename (without path) */ - pos = strrchr (filename2, DIR_SEPARATOR_CHAR); - if (pos) - short_filename = strdup (pos + 1); - else - short_filename = strdup (filename2); - - /* convert spaces to underscore if asked and needed */ - pos = short_filename; - spaces = 0; - while (pos[0]) + if (type == DCC_FILE_SEND) { - if (pos[0] == ' ') + /* extract short filename (without path) */ + pos = strrchr (filename2, DIR_SEPARATOR_CHAR); + if (pos) + short_filename = strdup (pos + 1); + else + short_filename = strdup (filename2); + + /* convert spaces to underscore if asked and needed */ + pos = short_filename; + spaces = 0; + while (pos[0]) { - if (cfg_dcc_convert_spaces) - pos[0] = '_'; - else - spaces = 1; + if (pos[0] == ' ') + { + if (cfg_dcc_convert_spaces) + pos[0] = '_'; + else + spaces = 1; + } + pos++; } - pos++; } /* add DCC entry and listen to socket */ - if (!dcc_add (server, DCC_FILE_SEND, local_addr, port, nick, sock, - short_filename, filename2, st.st_size)) + if (type == DCC_CHAT_SEND) + ptr_dcc = dcc_add (server, DCC_CHAT_SEND, local_addr, port, nick, sock, + NULL, NULL, 0); + else + ptr_dcc = dcc_add (server, DCC_FILE_SEND, local_addr, port, nick, sock, + short_filename, filename2, st.st_size); + if (!ptr_dcc) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot send DCC\n"), - WEECHAT_ERROR); + gui_printf (server->buffer, + _("%s cannot send DCC\n"), + WEECHAT_ERROR); close (sock); - free (short_filename); - free (filename2); + if (short_filename) + free (short_filename); + if (filename2) + free (filename2); return; } /* send DCC request to nick */ - server_sendf (server, - (spaces) ? - "PRIVMSG %s :\01DCC SEND \"%s\" %lu %d %u\01\r\n" : - "PRIVMSG %s :\01DCC SEND %s %lu %d %u\01\r\n", - nick, short_filename, local_addr, port, - (unsigned long) st.st_size); + if (type == DCC_CHAT_SEND) + server_sendf (server, + "PRIVMSG %s :\01DCC CHAT chat %lu %d\01\r\n", + nick, local_addr, port); + else + server_sendf (server, + (spaces) ? + "PRIVMSG %s :\01DCC SEND \"%s\" %lu %d %u\01\r\n" : + "PRIVMSG %s :\01DCC SEND %s %lu %d %u\01\r\n", + nick, short_filename, local_addr, port, + (unsigned long) st.st_size); - free (short_filename); - free (filename2); + if (short_filename) + free (short_filename); + if (filename2) + free (filename2); } +/* + * dcc_chat_send: send data to remote host via DCC CHAT + */ + +int +dcc_chat_send (t_irc_dcc *ptr_dcc, char *buffer, int size_buf) +{ + if (!ptr_dcc) + return -1; + + return send (ptr_dcc->sock, buffer, size_buf, 0); +} /* - * dcc_handle: receive/send data for each active DCC + * dcc_chat_sendf: send formatted data to remote host via DCC CHAT + */ + +void +dcc_chat_sendf (t_irc_dcc *ptr_dcc, char *fmt, ...) +{ + va_list args; + static char buffer[4096]; + char *buf2; + int size_buf; + + if (!ptr_dcc || (ptr_dcc->sock == -1)) + return; + + va_start (args, fmt); + size_buf = vsnprintf (buffer, sizeof (buffer) - 1, fmt, args); + va_end (args); + + if ((size_buf == 0) || (strcmp (buffer, "\r\n") == 0)) + return; + + buffer[sizeof (buffer) - 1] = '\0'; + if ((size_buf < 0) || (size_buf > (int) (sizeof (buffer) - 1))) + size_buf = strlen (buffer); + #ifdef DEBUG + buffer[size_buf - 2] = '\0'; + gui_printf (ptr_dcc->server->buffer, "[DEBUG] Sending to remote host (DCC CHAT) >>> %s\n", buffer); + buffer[size_buf - 2] = '\r'; + #endif + buf2 = weechat_convert_encoding ((cfg_look_charset_internal && cfg_look_charset_internal[0]) ? + cfg_look_charset_internal : local_charset, + cfg_look_charset_encode, + buffer); + if (dcc_chat_send (ptr_dcc, buf2, strlen (buf2)) <= 0) + { + irc_display_prefix (ptr_dcc->server->buffer, PREFIX_ERROR); + gui_printf (ptr_dcc->server->buffer, _("%s error sending data to \"%s\" via DCC CHAT\n"), + WEECHAT_ERROR, ptr_dcc->nick); + dcc_close (ptr_dcc, DCC_FAILED); + } + free (buf2); +} + +/* + * dcc_chat_recv: receive data from DCC CHAT host + */ + +void +dcc_chat_recv (t_irc_dcc *ptr_dcc) +{ + static char buffer[4096 + 2]; + char *buf2, *pos, *ptr_buf, *next_ptr_buf; + int num_read; + + num_read = recv (ptr_dcc->sock, buffer, sizeof (buffer) - 2, 0); + if (num_read > 0) + { + buffer[num_read] = '\0'; + + buf2 = NULL; + ptr_buf = buffer; + if (ptr_dcc->unterminated_message) + { + buf2 = (char *) malloc (strlen (ptr_dcc->unterminated_message) + + strlen (buffer) + 1); + if (buf2) + { + strcpy (buf2, ptr_dcc->unterminated_message); + strcat (buf2, buffer); + } + ptr_buf = buf2; + free (ptr_dcc->unterminated_message); + ptr_dcc->unterminated_message = NULL; + } + + while (ptr_buf && ptr_buf[0]) + { + next_ptr_buf = NULL; + pos = strstr (ptr_buf, "\r\n"); + if (pos) + { + pos[0] = '\0'; + next_ptr_buf = pos + 2; + } + else + { + pos = strstr (ptr_buf, "\n"); + if (pos) + { + pos[0] = '\0'; + next_ptr_buf = pos + 1; + } + else + { + ptr_dcc->unterminated_message = strdup (ptr_buf); + ptr_buf = NULL; + next_ptr_buf = NULL; + } + } + + if (ptr_buf) + { + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "<"); + if (strstr (ptr_buf, ptr_dcc->server->nick)) + { + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK | MSG_TYPE_HIGHLIGHT, + COLOR_WIN_CHAT_HIGHLIGHT, + "%s", ptr_dcc->nick); + if ( (cfg_look_infobar_delay_highlight > 0) + && (ptr_dcc->channel->buffer != gui_current_window->buffer) ) + gui_infobar_printf (cfg_look_infobar_delay_highlight, + COLOR_WIN_INFOBAR_HIGHLIGHT, + _("Private %s> %s"), + ptr_dcc->nick, ptr_buf); + } + else + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_NICK_PRIVATE, + "%s", ptr_dcc->nick); + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_NICK, + COLOR_WIN_CHAT_DARK, "> "); + gui_printf_type_color (ptr_dcc->channel->buffer, + MSG_TYPE_MSG, + COLOR_WIN_CHAT, "%s\n", ptr_buf); + } + + ptr_buf = next_ptr_buf; + } + + if (buf2) + free (buf2); + } + else + { + dcc_close (ptr_dcc, DCC_ABORTED); + dcc_redraw (1); + } +} + +/* + * dcc_handle: receive/send data for each active DCC (files only) */ void @@ -555,6 +830,47 @@ dcc_handle () ptr_dcc->addr = ntohl (addr.sin_addr.s_addr); ptr_dcc->status = DCC_ACTIVE; ptr_dcc->file = open (ptr_dcc->local_filename, O_RDONLY | O_NONBLOCK, 0644); + dcc_redraw (1); + } + } + } + } + + if (ptr_dcc->status == DCC_WAITING) + { + if (ptr_dcc->type == DCC_CHAT_SEND) + { + FD_ZERO (&read_fd); + FD_SET (ptr_dcc->sock, &read_fd); + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + /* something to read on socket? */ + if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) + { + if (FD_ISSET (ptr_dcc->sock, &read_fd)) + { + length = sizeof (addr); + sock = accept (ptr_dcc->sock, (struct sockaddr *) &addr, &length); + close (ptr_dcc->sock); + ptr_dcc->sock = -1; + if (sock < 0) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->sock = sock; + if (fcntl (ptr_dcc->sock, F_SETFL, O_NONBLOCK) == -1) + { + dcc_close (ptr_dcc, DCC_FAILED); + dcc_redraw (1); + return; + } + ptr_dcc->addr = ntohl (addr.sin_addr.s_addr); + ptr_dcc->status = DCC_ACTIVE; + dcc_redraw (1); + dcc_channel_for_chat (ptr_dcc); } } } @@ -562,6 +878,20 @@ dcc_handle () if (ptr_dcc->status == DCC_ACTIVE) { + if (DCC_IS_CHAT(ptr_dcc->type)) + { + FD_ZERO (&read_fd); + FD_SET (ptr_dcc->sock, &read_fd); + timeout.tv_sec = 0; + timeout.tv_usec = 0; + + /* something to read on socket? */ + if (select (FD_SETSIZE, &read_fd, NULL, NULL, &timeout) > 0) + { + if (FD_ISSET (ptr_dcc->sock, &read_fd)) + dcc_chat_recv (ptr_dcc); + } + } if (ptr_dcc->type == DCC_FILE_RECV) { num_read = recv (ptr_dcc->sock, buffer, sizeof (buffer), 0); @@ -596,6 +926,7 @@ dcc_handle () { if (cfg_dcc_blocksize > (int) sizeof (buffer)) { + irc_display_prefix (NULL, PREFIX_ERROR); gui_printf (NULL, _("%s DCC failed because blocksize is too " "big. Check value of \"dcc_blocksize\" option, " "max is %d.\n"), diff --git a/weechat/src/irc/irc-display.c b/weechat/src/irc/irc-display.c index ec5f135b0..4b5212fa3 100644 --- a/weechat/src/irc/irc-display.c +++ b/weechat/src/irc/irc-display.c @@ -52,9 +52,9 @@ irc_display_prefix (t_gui_buffer *buffer, char *prefix) if (prefix[0] == prefix[2]) { - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c", prefix[0]); - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX2, "%c", prefix[1]); - gui_printf_color_type (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c ", prefix[2]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c", prefix[0]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX2, "%c", prefix[1]); + gui_printf_type_color (buffer, type, COLOR_WIN_CHAT_PREFIX1, "%c ", prefix[2]); } else gui_printf_color (buffer, COLOR_WIN_CHAT_PREFIX1, "%s ", prefix); @@ -70,43 +70,43 @@ irc_display_nick (t_gui_buffer *buffer, t_irc_nick *nick, int message_type, int display_around, int color_nick, int no_nickmode) { if (display_around) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_DARK, "<"); if (cfg_look_nickmode) { if (nick->is_chanowner) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "~"); else if (nick->is_chanadmin) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "&"); else if (nick->is_op) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_OP, "@"); else if (nick->is_halfop) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_HALFOP, "%%"); else if (nick->has_voice) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_NICK_VOICE, "+"); else if (cfg_look_nickmode_empty && !no_nickmode) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT, " "); } if (color_nick < 0) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_HIGHLIGHT, "%s", nick->nick); else - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, (color_nick) ? ((cfg_look_color_nicks) ? @@ -115,7 +115,7 @@ irc_display_nick (t_gui_buffer *buffer, t_irc_nick *nick, int message_type, "%s", nick->nick); if (display_around) - gui_printf_color_type (buffer, + gui_printf_type_color (buffer, message_type, COLOR_WIN_CHAT_DARK, "> "); } diff --git a/weechat/src/irc/irc-recv.c b/weechat/src/irc/irc-recv.c index 6b34d4cd2..ab69abe8d 100644 --- a/weechat/src/irc/irc-recv.c +++ b/weechat/src/irc/irc-recv.c @@ -160,9 +160,9 @@ irc_cmd_recv_join (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create new channel \"%s\"\n"), - WEECHAT_ERROR, arguments); + gui_printf (server->buffer, + _("%s cannot create new channel \"%s\"\n"), + WEECHAT_ERROR, arguments); return -1; } } @@ -227,9 +227,9 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "kick"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "kick"); return -1; } @@ -260,9 +260,9 @@ irc_cmd_recv_kick (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nick not found for \"%s\" command\n"), - WEECHAT_ERROR, "kick"); + gui_printf (server->buffer, + _("%s nick not found for \"%s\" command\n"), + WEECHAT_ERROR, "kick"); return -1; } if (strcmp (pos_nick, server->nick) == 0) @@ -550,9 +550,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "mode"); return -1; } @@ -565,9 +565,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) if (!pos) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without channel or nickname\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s \"%s\" command received without channel or nickname\n"), + WEECHAT_ERROR, "mode"); return -1; } pos[0] = '\0'; @@ -595,9 +595,9 @@ irc_cmd_recv_mode (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "mode"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "mode"); return -1; } } @@ -635,9 +635,9 @@ irc_cmd_recv_nick (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "nick"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "nick"); return -1; } @@ -753,9 +753,9 @@ irc_cmd_recv_notice (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nickname not found for \"%s\" command\n"), - WEECHAT_ERROR, "notice"); + gui_printf (server->buffer, + _("%s nickname not found for \"%s\" command\n"), + WEECHAT_ERROR, "notice"); return -1; } if (strncmp (pos, "\01VERSION", 8) == 0) @@ -846,9 +846,9 @@ irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments) if (!host || !arguments) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host or channel\n"), - WEECHAT_ERROR, "part"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host or channel\n"), + WEECHAT_ERROR, "part"); return -1; } @@ -921,9 +921,9 @@ irc_cmd_recv_part (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "part"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "part"); return -1; } @@ -995,9 +995,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "privmsg"); return -1; } @@ -1036,7 +1036,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) irc_display_prefix (ptr_channel->buffer, PREFIX_ACTION_ME); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1050,7 +1050,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT_NICK, "%s", host); gui_printf_color (ptr_channel->buffer, @@ -1078,16 +1078,16 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s nick not found for \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s nick not found for \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1095,9 +1095,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1176,16 +1176,19 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) /* incoming DCC file */ if (strncmp (pos, "\01DCC SEND", 9) == 0) { - pos2 = strchr (pos, '\01'); + /* check if DCC SEND is ok, i.e. with 0x01 at end */ + pos2 = strchr (pos + 1, '\01'); if (!pos2) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2[0] = '\0'; + + /* DCC filename */ pos_file = pos + 9; while (pos_file[0] == ' ') pos_file++; @@ -1195,9 +1198,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!pos_size) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_size; @@ -1211,9 +1214,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!pos_port) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_port; @@ -1222,14 +1225,14 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) pos2--; pos2[1] = '\0'; - /* look for DCC address (IP) */ + /* look for DCC IP address */ pos_addr = strrchr (pos_file, ' '); if (!pos_addr) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } pos2 = pos_addr; @@ -1244,6 +1247,74 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) return 0; } + /* incoming DCC CHAT */ + if (strncmp (pos, "\01DCC CHAT", 9) == 0) + { + /* check if DCC CHAT is ok, i.e. with 0x01 at end */ + pos2 = strchr (pos + 1, '\01'); + if (!pos2) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos2[0] = '\0'; + + /* CHAT type */ + pos_file = pos + 9; + while (pos_file[0] == ' ') + pos_file++; + + /* DCC IP address */ + pos_addr = strchr (pos_file, ' '); + if (!pos_addr) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos_addr[0] = '\0'; + pos_addr++; + while (pos_addr[0] == ' ') + pos_addr++; + + /* look for DCC port */ + pos_port = strchr (pos_addr, ' '); + if (!pos_port) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); + return -1; + } + pos_port[0] = '\0'; + pos_port++; + while (pos_port[0] == ' ') + pos_port++; + + if (strcasecmp (pos_file, "chat") != 0) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf (server->buffer, + _("%s unknown DCC CHAT type received from "), + WEECHAT_ERROR); + gui_printf_color (server->buffer, COLOR_WIN_CHAT_NICK, + "%s", host); + gui_printf (server->buffer, ": \"%s\"\n", pos_file); + return -1; + } + + dcc_add (server, DCC_CHAT_RECV, (unsigned long) atol (pos_addr), + atoi (pos_port), host, -1, NULL, NULL, 0); + + return 0; + } + /* private message received => display it */ ptr_channel = channel_search (server, host); if (!ptr_channel) @@ -1252,9 +1323,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) if (!ptr_channel) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create new private window \"%s\"\n"), - WEECHAT_ERROR, host); + gui_printf (server->buffer, + _("%s cannot create new private window \"%s\"\n"), + WEECHAT_ERROR, host); return -1; } } @@ -1270,7 +1341,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) irc_display_prefix (ptr_channel->buffer, PREFIX_ACTION_ME); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1284,7 +1355,7 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT_NICK, "%s", host); gui_printf_color (ptr_channel->buffer, @@ -1292,12 +1363,12 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) } else { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); if (strstr (pos, server->nick)) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK | MSG_TYPE_HIGHLIGHT, COLOR_WIN_CHAT_HIGHLIGHT, "%s", host); @@ -1309,14 +1380,14 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) host, pos); } else - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_PRIVATE, "%s", host); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -1324,9 +1395,9 @@ irc_cmd_recv_privmsg (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "privmsg"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "privmsg"); return -1; } } @@ -1348,9 +1419,9 @@ irc_cmd_recv_quit (t_irc_server *server, char *host, char *arguments) if (host == NULL) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without host\n"), - WEECHAT_ERROR, "quit"); + gui_printf (server->buffer, + _("%s \"%s\" command received without host\n"), + WEECHAT_ERROR, "quit"); return -1; } @@ -1500,9 +1571,9 @@ irc_cmd_recv_topic (t_irc_server *server, char *host, char *arguments) if (!string_is_channel (arguments)) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s \"%s\" command received without channel\n"), - WEECHAT_ERROR, "topic"); + gui_printf (server->buffer, + _("%s \"%s\" command received without channel\n"), + WEECHAT_ERROR, "topic"); return -1; } @@ -2558,9 +2629,9 @@ irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "332"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "332"); return -1; } } @@ -2568,9 +2639,9 @@ irc_cmd_recv_332 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify channel for \"%s\" command\n"), - WEECHAT_ERROR, "332"); + gui_printf (server->buffer, + _("%s cannot identify channel for \"%s\" command\n"), + WEECHAT_ERROR, "332"); return -1; } return 0; @@ -2625,36 +2696,36 @@ irc_cmd_recv_333 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s channel not found for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s channel not found for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify date/time for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify date/time for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify nickname for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify nickname for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } } else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot identify channel for \"%s\" command\n"), - WEECHAT_ERROR, "333"); + gui_printf (server->buffer, + _("%s cannot identify channel for \"%s\" command\n"), + WEECHAT_ERROR, "333"); return -1; } return 0; @@ -2862,9 +2933,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) if (pos[0] != ':') { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "353"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "353"); return -1; } pos++; @@ -2908,9 +2979,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) is_op, is_halfop, has_voice)) { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot create nick \"%s\" for channel \"%s\"\n"), - WEECHAT_ERROR, pos_nick, ptr_channel->name); + gui_printf (server->buffer, + _("%s cannot create nick \"%s\" for channel \"%s\"\n"), + WEECHAT_ERROR, pos_nick, ptr_channel->name); } } } @@ -2919,9 +2990,9 @@ irc_cmd_recv_353 (t_irc_server *server, char *host, char *arguments) else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, - _("%s cannot parse \"%s\" command\n"), - WEECHAT_ERROR, "353"); + gui_printf (server->buffer, + _("%s cannot parse \"%s\" command\n"), + WEECHAT_ERROR, "353"); return -1; } return 0; diff --git a/weechat/src/irc/irc-send.c b/weechat/src/irc/irc-send.c index 1226df884..8fc1ec071 100644 --- a/weechat/src/irc/irc-send.c +++ b/weechat/src/irc/irc-send.c @@ -246,7 +246,7 @@ irc_cmd_send_ctcp (t_irc_server *server, char *arguments) } /* - * irc_cmd_send_dcc: starts DCC (file or chat) + * irc_cmd_send_dcc: start DCC (file or chat) */ int @@ -254,8 +254,6 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) { char *pos_nick, *pos_file; - /* TODO: develop DCC CHAT */ - /* DCC SEND file */ if (strncasecmp (arguments, "send", 4) == 0) { @@ -270,6 +268,7 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) } while (pos_nick[0] == ' ') pos_nick++; + pos_file = strchr (pos_nick, ' '); if (!pos_file) { @@ -284,13 +283,41 @@ irc_cmd_send_dcc (t_irc_server *server, char *arguments) while (pos_file[0] == ' ') pos_file++; - dcc_send (server, pos_nick, pos_file); + dcc_send_request (server, DCC_FILE_SEND, pos_nick, pos_file); } else if (strncasecmp (arguments, "chat", 4) == 0) + { + pos_nick = strchr (arguments, ' '); + if (!pos_nick) + { + irc_display_prefix (server->buffer, PREFIX_ERROR); + gui_printf_nolog (server->buffer, + _("%s wrong argument count for \"%s\" command\n"), + WEECHAT_ERROR, "dcc chat"); + return -1; + } + while (pos_nick[0] == ' ') + pos_nick++; + + dcc_send_request (server, DCC_CHAT_SEND, pos_nick, NULL); + } + else if (strcasecmp (arguments, "close") == 0) + { + if (BUFFER_IS_PRIVATE(gui_current_window->buffer) && + CHANNEL(gui_current_window->buffer)->dcc_chat) + { + dcc_close ((t_irc_dcc *)(CHANNEL(gui_current_window->buffer)->dcc_chat), + DCC_ABORTED); + dcc_redraw (1); + } + } + else { irc_display_prefix (server->buffer, PREFIX_ERROR); - gui_printf_nolog (server->buffer, _("This command is not developed!\n")); - return 0; + gui_printf_nolog (server->buffer, + _("%s wrong arguments for \"%s\" command\n"), + WEECHAT_ERROR, "dcc"); + return -1; } return 0; @@ -630,7 +657,7 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) { irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -655,7 +682,7 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) { irc_display_nick (ptr_channel->buffer, ptr_nick, MSG_TYPE_NICK, 1, 1, 0); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); } @@ -691,13 +718,13 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) } } irc_display_prefix (server->buffer, PREFIX_SERVER); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "-"); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_NICK, "%s", arguments); - gui_printf_color_type (server->buffer, + gui_printf_type_color (server->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "-"); gui_printf_color (server->buffer, @@ -722,17 +749,17 @@ irc_cmd_send_msg (t_irc_server *server, char *arguments) gui_draw_buffer_title (ptr_channel->buffer, 1); } - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); @@ -1014,17 +1041,17 @@ irc_cmd_send_query (t_irc_server *server, char *arguments) /* display text if given */ if (pos) { - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "<"); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_NICK_SELF, "%s", server->nick); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_NICK, COLOR_WIN_CHAT_DARK, "> "); - gui_printf_color_type (ptr_channel->buffer, + gui_printf_type_color (ptr_channel->buffer, MSG_TYPE_MSG, COLOR_WIN_CHAT, "%s\n", pos); server_sendf (server, "PRIVMSG %s :%s\r\n", arguments, pos); diff --git a/weechat/src/irc/irc-server.c b/weechat/src/irc/irc-server.c index bb23fc956..191ef7dc9 100644 --- a/weechat/src/irc/irc-server.c +++ b/weechat/src/irc/irc-server.c @@ -82,7 +82,7 @@ server_init (t_irc_server *server) server->child_pid = 0; server->child_read = -1; server->child_write = -1; - server->sock4 = -1; + server->sock = -1; server->is_connected = 0; server->unterminated_message = NULL; server->nick = NULL; @@ -271,6 +271,10 @@ server_free (t_irc_server *server) { t_irc_server *new_irc_servers; + /* close any opened channel/private */ + while (server->channels) + channel_free (server, server->channels); + /* remove server from queue */ if (last_irc_server == server) last_irc_server = server->prev_server; @@ -364,12 +368,12 @@ server_new (char *name, int autoconnect, int autoreconnect, int autoreconnect_de */ int -server_send (t_irc_server * server, char *buffer, int size_buf) +server_send (t_irc_server *server, char *buffer, int size_buf) { if (!server) return -1; - return send (server->sock4, buffer, size_buf, 0); + return send (server->sock, buffer, size_buf, 0); } /* @@ -377,23 +381,23 @@ server_send (t_irc_server * server, char *buffer, int size_buf) */ void -server_sendf (t_irc_server * server, char *fmt, ...) +server_sendf (t_irc_server *server, char *fmt, ...) { va_list args; - static char buffer[1024]; + static char buffer[4096]; char *buf2; int size_buf; - + if (!server) return; - + va_start (args, fmt); size_buf = vsnprintf (buffer, sizeof (buffer) - 1, fmt, args); va_end (args); if ((size_buf == 0) || (strcmp (buffer, "\r\n") == 0)) return; - + buffer[sizeof (buffer) - 1] = '\0'; if ((size_buf < 0) || (size_buf > (int) (sizeof (buffer) - 1))) size_buf = strlen (buffer); @@ -632,7 +636,7 @@ server_recv (t_irc_server *server) static char buffer[4096 + 2]; int num_read; - num_read = recv (server->sock4, buffer, sizeof (buffer) - 2, 0); + num_read = recv (server->sock, buffer, sizeof (buffer) - 2, 0); if (num_read > 0) { buffer[num_read] = '\0'; @@ -687,10 +691,10 @@ server_close_connection (t_irc_server *server) server_kill_child (server); /* close network socket */ - if (server->sock4 != -1) + if (server->sock != -1) { - close (server->sock4); - server->sock4 = -1; + close (server->sock); + server->sock = -1; } /* free any pending message */ @@ -804,7 +808,7 @@ server_child (t_irc_server *server) } /* connect to server */ - error = connect (server->sock4, (struct sockaddr *) &addr, sizeof (addr)); + error = connect (server->sock, (struct sockaddr *) &addr, sizeof (addr)); if (error != 0) { write (server->child_write, "3", 1); @@ -849,8 +853,8 @@ server_connect (t_irc_server *server) server->child_write = child_pipe[1]; /* create socket and set options */ - server->sock4 = socket (AF_INET, SOCK_STREAM, 0); - if (server->sock4 == -1) + server->sock = socket (AF_INET, SOCK_STREAM, 0); + if (server->sock == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); gui_printf (server->buffer, @@ -861,7 +865,7 @@ server_connect (t_irc_server *server) /* set SO_REUSEADDR option for socket */ set = 1; - if (setsockopt (server->sock4, SOL_SOCKET, SO_REUSEADDR, + if (setsockopt (server->sock, SOL_SOCKET, SO_REUSEADDR, (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); @@ -872,7 +876,7 @@ server_connect (t_irc_server *server) /* set SO_KEEPALIVE option for socket */ set = 1; - if (setsockopt (server->sock4, SOL_SOCKET, SO_KEEPALIVE, + if (setsockopt (server->sock, SOL_SOCKET, SO_KEEPALIVE, (void *) &set, sizeof (set)) == -1) { irc_display_prefix (server->buffer, PREFIX_ERROR); diff --git a/weechat/src/irc/irc.h b/weechat/src/irc/irc.h index 828bca973..755bb874b 100644 --- a/weechat/src/irc/irc.h +++ b/weechat/src/irc/irc.h @@ -71,6 +71,14 @@ #define DCC_FAILED 4 /* DCC failed */ #define DCC_ABORTED 5 /* DCC aborted by user */ +#define DCC_IS_CHAT(type) ((type == DCC_CHAT_RECV) || (type == DCC_CHAT_SEND)) +#define DCC_IS_FILE(type) ((type == DCC_FILE_RECV) || (type == DCC_FILE_SEND)) +#define DCC_IS_RECV(type) ((type == DCC_CHAT_RECV) || (type == DCC_FILE_RECV)) +#define DCC_IS_SEND(type) ((type == DCC_CHAT_SEND) || (type == DCC_FILE_SEND)) + +#define DCC_ENDED(status) ((status == DCC_DONE) || (status == DCC_FAILED) || \ + (status == DCC_ABORTED)) + /* nick types */ typedef struct t_irc_nick t_irc_nick; @@ -100,6 +108,7 @@ typedef struct t_irc_channel t_irc_channel; struct t_irc_channel { int type; /* channel type */ + void *dcc_chat; /* DCC CHAT pointer (NULL if not DCC) */ char *name; /* name of channel (exemple: "#abc") */ char *topic; /* topic of channel (host for private) */ char modes[NUM_CHANNEL_MODES+1];/* channel modes */ @@ -142,7 +151,7 @@ struct t_irc_server pid_t child_pid; /* pid of child process (connecting) */ int child_read; /* to read into child pipe */ int child_write; /* to write into child pipe */ - int sock4; /* socket for server */ + int sock; /* socket for server */ int is_connected; /* 1 if WeeChat is connected to server */ char *unterminated_message; /* beginning of a message in input buf */ char *nick; /* current nickname */ @@ -198,12 +207,14 @@ typedef struct t_irc_dcc t_irc_dcc; struct t_irc_dcc { t_irc_server *server; /* irc server */ + t_irc_channel *channel; /* irc channel (for DCC chat only) */ int type; /* DCC type (send or receive) */ int status; /* DCC status (waiting, sending, ..) */ unsigned long addr; /* IP address */ int port; /* port */ char *nick; /* remote nick */ int sock; /* socket for connection */ + char *unterminated_message; /* beginning of a message in input buf */ int file; /* local file (for reading or writing) */ char *filename; /* filename (given by sender) */ char *local_filename; /* local filename (with path) */ @@ -260,6 +271,8 @@ extern int string_is_channel (char *); extern void channel_remove_away (t_irc_channel *); extern void channel_check_away (t_irc_server *, t_irc_channel *); extern void channel_set_away (t_irc_channel *, char *, int); +extern int channel_create_dcc (t_irc_dcc *); +extern void channel_remove_dcc (t_irc_dcc *); /* nick functions (irc-nick.c) */ @@ -275,13 +288,15 @@ extern void nick_set_away (t_irc_channel *, t_irc_nick *, int); /* DCC functions (irc-dcc.c) */ +extern void dcc_redraw (int); extern void dcc_free (t_irc_dcc *); extern void dcc_close (t_irc_dcc *, int); extern void dcc_accept (t_irc_dcc *); extern t_irc_dcc *dcc_add (t_irc_server *, int, unsigned long, int, char *, int, char *, char *, unsigned long); +extern void dcc_send_request (t_irc_server *, int, char *, char *); +extern void dcc_chat_sendf (t_irc_dcc *, char *, ...); extern void dcc_handle (); -extern void dcc_send (t_irc_server *, char *, char *); extern void dcc_end (); /* IRC display (irc-diplay.c) */