From ae08020ded689321652622b0ea97e345f6fa5ec6 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Fri, 16 Sep 2011 13:11:10 +0200 Subject: [PATCH] ncdc 1.0 released + replaced user guide with man page --- dat/ncdc-changelog | 14 + dat/ncdc-man | 660 +++++++++++++++++++++++++++++++++++++++++++++ img/ncdcstart.png | Bin 17397 -> 0 bytes index.cgi | 193 ++----------- 4 files changed, 689 insertions(+), 178 deletions(-) create mode 100644 dat/ncdc-man delete mode 100644 img/ncdcstart.png diff --git a/dat/ncdc-changelog b/dat/ncdc-changelog index f97fda7..9dd53b2 100644 --- a/dat/ncdc-changelog +++ b/dat/ncdc-changelog @@ -1,3 +1,17 @@ +1.0 - 2011-09-16 + - Added ncdc(1) and ncdc-gen-cert(1) manual pages + - Documented settings (/help set ) + - Documented key bindings (/help keys) + - Improved line wrapping algorithm for the log window + - Added support for client-to-client TLS on NMDC + - Added support for the CGFI command on ADC + - Throttle GET requests on the same file + offset + - Fixed glib assertion failure when disabling active mode + - Fixed downloading from clients using $ADCSND with -1 bytes + - Fixed race condition in file uploading code + - Fixed idle time calculation while connecting to another client + - Properly include unistd.h in dl.c + 0.9 - 2011-09-03 - Added TLS support (adcs://, nmdcs://, and ADC client-to-client) - Added tls_policy setting diff --git a/dat/ncdc-man b/dat/ncdc-man new file mode 100644 index 0000000..21263d6 --- /dev/null +++ b/dat/ncdc-man @@ -0,0 +1,660 @@ +ncdc(1) ncdc(1) + + + +NAME + ncdc - Ncurses Direct Connect Client + + +SYNOPSIS + ncdc [option...] + + +DESCRIPTION + Ncdc is a modern and lightweight direct connect client with a friendly ncurses + interface. + + +GETTING STARTED + This is a basic introduction for those who are new to ncdc. See the chapters + below for a more detailed description of the available functionality. + + What you see when starting up ncdc is an input line where you can input commands + and a log window where the results are displayed, much like a regular terminal. + Commands within ncdc start with a slash (e.g. `/help') and have tab completion + to help you. + + The first thing you will want to do after starting ncdc for the first time is to + setup some basic information and settings: + /set nick MyNick + /set description ncdc is awesome! + /set connection 10 + /share "My Awesome Files" /path/to/files + + And if you have a direct connection to the internet or if your router allows + port forwarding, you may also want to enable active mode: + /set active_ip 13.33.33.7 + /set active_port 34194 + /set active true + + See the help text for each of the commands and settings for more information. + Of course, all of the above settings are saved to the configuration file and + will be used again on the next run. + + To connect to a hub, use /open: + /open ncdc adc://dc.blicky.net:2780/ + Here `ncdc' is the personal name you give to the hub, and the second argument + the URL. This URL will be saved in the config file, so the next time you want to + connect to this hub, you can simply do: + /open ncdc + See the help text for '/open' and '/connect' for more information. If you want + to automatically connect to a hub when ncdc starts up, use the `autoconnect' + setting. + + Ncdc uses a tabbed interface: every hub opens in a new tab, and there are sev‐ + eral other kinds of tabs available as well. The type of tab is indicated in the + tab list on the bottom of the screen with a character prefix. Hubs, for example, + are prefixed with a `#'. If a tab needs your attention, a colored exclamation + mark is displayed before the tab name, different colors are used for different + types of activity. + + Everything else should be fairly self-explanatory: To search for files, use the + `/search' command. To browse through the user list of a hub, use `/userlist' or + hit Alt+u. To browse someone's file list, use `/browse' or hit the 'b' key in + the user list. And to monitor your upload and download connections, use `/con‐ + nections' or hit Alt+n. + + +OPTIONS + -c, --session-dir= + Use a different session directory. Defaults to the contents of the envi‐ + ronment variable `$NCDC_DIR' or if this is unset to `$HOME/.ncdc'. + + -h, --help + Display summary of options. + + -n, --no-autoconnect + Don't automatically connect to hubs with the `autoconnect' option set. + + -v, --version + Display ncdc version. + + +INTERACTIVE COMMANDS + The following is the list of commands that can be used within ncdc. The /help + command can also be used get a list of available commands and to access this + documentation. + + /accept + Use this command to accept the TLS certificate of a hub. This command is + used only in the case the keyprint of the TLS certificate of a hub does + not match the keyprint stored in the configuration file. + + /browse [[-f] ] + Without arguments, this opens a new tab where you can browse your own + file list. Note that changes to your list are not immediately visible in + the browser. You need to re-open the tab to get the latest version of + your list. + + With arguments, the file list of the specified user will be downloaded + (if it has not been downloaded already) and the browse tab will open once + it's complete. The `-f' flag can be used to force the file list to be + (re-)downloaded. + + /clear + Clears the log displayed on the screen. Does not affect the log files in + any way. Ctrl+l is a shortcut for this command. + + /close + Close the current tab. When closing a hub tab, you will be disconnected + from the hub and all related userlist and PM tabs will also be closed. + Alt+c is a shortcut for this command. + + /connect [
] + Initiate a connection with a hub. If no address is specified, will con‐ + nect to the hub you last used on the current tab. The address should be + in the form of `protocol://host:port/' or `host:port'. The `:port' part + is in both cases optional and defaults to :411. The following protocols + are recognized: dchub, nmdc, nmdcs, adc, adcs. When connecting to an + nmdcs or adcs hub and the SHA256 keyprint is known, you can attach this + to the url as `?kp=SHA256/' + + Note that this command can only be used on hub tabs. If you want to open + a new connection to a hub, you need to use /open first. For example: + /open testhub + /connect dchub://dc.some-test-hub.com/ + See the /open command for more information. + + /connections + Open the connections tab. + + /disconnect + Disconnect from a hub. + + /gc + Cleans up unused data and reorganizes existing data to allow more effi‐ + cient storage and usage. Currently, this commands cleans up hashdata.dat + and dl.dat, removes unused files in inc/ and old files in fl/. + + This command may take some time to complete, and will fully block ncdc + while it is running. You won't have to perform this command very often. + + /grant [] + Grant someone a slot. This allows the user to download from you even if + you have no free slots. The slot will be granted for as long as ncdc + stays open. If you restart ncdc, the user will have to wait for a regular + slot. Unless, of course, you /grant a slot again. + + Note that a granted slot is specific to a single hub. If the same user is + also on other hubs, he/she will not be granted a slot on those hubs. + + /help [|set |keys [
]] + To get a list of available commands, use /help without arguments. + To get information on a particular command, use /help . + To get information on a configuration setting, use /help set . + To get help on key bindings, use /help keys. + + + /kick + Kick a user from the hub. This command only works on NMDC hubs, and you + need to be an OP to be able to use it. + + /me + This allows you to talk in third person. Most clients will display your + message as something like: + ** Nick is doing something + + Note that this command only works correctly on ADC hubs. The NMDC proto‐ + col does not have this feature, and your message will be sent as-is, + including the /me. + + /msg [] + Send a private message to a user on the currently opened hub. If no mes‐ + sage is given, the tab will be opened but no message will be sent. + + /nick [] + Alias for `/set nick'. + + /open [-n] [
] + Opens a new tab to use for a hub. The name is a (short) personal name you + use to identify the hub, and will be used for storing hub-specific con‐ + figuration. + + If you have specified an address or have previously connected to a hub + from a tab with the same name, /open will automatically connect to the + hub. Use the `-n' flag to disable this behaviour. + + See /connect for more information on connecting to a hub. + + /password + This command can be used to send a password to the hub without saving it + to the config file. If you wish to login automatically without having to + type /password every time, use '/set password '. Be warned, + however, that your password will be saved unencrypted in that case. + + /pm [] + Alias for /msg + + /queue + Open the download queue. + + /quit + Quit ncdc. You can also just hit ctrl+c, which is equivalent. + + /reconnect + Reconnect to the hub. When your nick or the hub encoding have been + changed, the new settings will be used after the reconnect. + + /refresh [] + Initiates a refresh. If no argument is given, the complete list will be + refreshed. Otherwise only the specified directory will be refreshed. The + path argument can be either an absolute filesystem path or a virtual path + within your share. + + /say + Sends a chat message to the current hub or user. You normally don't have + to use the /say command explicitly, any command not staring with '/' will + automatically imply `/say '. For example, typing `hello.' in the + command line is equivalent to `/say hello.'. Using the /say command + explicitly may be useful to send message starting with '/' to the chat, + for example `/say /help is what you are looking for'. + + /search [options] + Performs a file search, opening a new tab with the results. + + Available options: + -hub Search the current hub only. (default) + -all Search all connected hubs. + -le Size of the file must be less than . + -ge Size of the file must be larger than . + -t File must be of type . (see below) + -tth TTH root of this file must match . + + File sizes ( above) accept the following suffixes: G (GiB), M (MiB) + and K (KiB). + + The following file types can be used with the -t option: + 1 any Any file or directory. (default) + 2 audio Audio files. + 3 archive (Compressed) archives. + 4 doc Text documents. + 5 exe Windows executables. + 6 img Image files. + 7 video Video files. + 8 dir Directories. + Note that file type matching is done using file extensions, and is not + very reliable. + + /set [ []] + Get or set configuration variables. Use without arguments to get a list + of all settings and their current value. Changes to the settings are + automatically saved to the config file, and will not be lost after + restarting ncdc. + + To get information on a particular setting, use `/help set '. + + /share [ ] + Use /share without arguments to get a list of shared directories. + When called with a name and a path, the path will be added to your share. + Note that shell escaping may be used in the name. For example, to add a + directory with the name `Fun Stuff', you could do the following: + /share "Fun Stuff" /path/to/fun/stuff + Or: + /share Fun\ Stuff /path/to/fun/stuff + + The full path to the directory will not be visible to others, only the + name you give it will be public. An initial `/refresh' is done automati‐ + cally on the added directory. + + /unset [] + This command can be used to reset a configuration variable back to its + default value. + + /unshare [] + To remove a single directory from your share, use `/unshare ', to + remove all directories from your share, use `/unshare /'. + + Note that all hash data for the removed directories will be thrown away. + All files will have to be re-hashed again when the directory is later re- + added. + + /userlist + Opens the user list of the currently selected hub. Can also be accessed + using Alt+u. + + /version + Display version information. + + /whois + This will open the user list and select the given user. + + + +SETTINGS + The following is a list of configuration settings. These settings can be changed + and queried using the `/set' command, and are stored in the config.ini file in + the session directory. + + active + Enables or disables active mode. Make sure to set `active_ip' and + `active_port' before enabling active mode. + + active_ip + Your public IP address for use in active mode. It is important that other + clients can reach you using this IP address. If you connect to a hub on + the internet, this should be your internet (WAN) IP. Likewise, if you + connect to a hub on your LAN, this should be your LAN IP. + + Note that this setting is global for ncdc: it is currently not possible + to use a single instance of ncdc to connect to both internet and LAN + hubs, if you are not reachable on the same IP with both networks. In that + case you can either use passive mode or run two separate instances of + ncdc. + + active_port + The listen port for incoming connections in active mode. Set to `0' to + automatically assign a random port. If TLS support is available, another + TCP port will be opened on the configured port + 1. Ncdc will tell you + exactly on which ports it is listening for incoming packets. If you are + behind a router or firewall, make sure that you have configured it to + forward and allow these ports. + + autoconnect + Set to true to automatically connect to the current hub when ncdc starts + up. + + autorefresh + The time between automatic file refreshes, in minutes. Set to 0 to dis‐ + able automatically refreshing the file list. This setting also determines + whether ncdc will perform a refresh on startup. See the `/refresh' com‐ + mand to manually refresh your file list. + + backlog + When opening a hub or PM tab, ncdc can load a certain amount of lines + from the log file into the log window. Setting this to a positive value + enables this feature and configures the number of lines to load. Note + that, while this setting can be set on a per-hub basis, PM windows will + use the global value (global.backlog). + + color_* + The settings starting with the `color_' prefix allow you to change the + interface colors. The following is a list of available color settings: + log_default - default log color + log_time - the time prefix in log messages + log_nick - default nick color + log_highlight - nick color of a highlighted line + log_ownnick - color of your own nick + log_join - color of join messages + log_quit - color of quit messages + tabprio_low - low priority tab notification color + tabprio_med - medium priority tab notification color + tabprio_high - high priority tab notification color + + The actual color value can be set with a comma-separated list of color + names and/or attributes. The first color in the list is the foreground + color, the second color is used for the background. When the fore- or + background color is not specified, the default colors of your terminal + will be used. + The following color names can be used: black, blue, cyan, default, green, + magenta, red, white and yellow. + The following attributes can be used: bold, reverse and underline. + The actual color values displayed by your terminal may vary. Adding the + `bold' attribute usually makes the foreground color appear brighter as + well. + + connection + Set your upload speed. The actual format you can use here may vary, but + in general you can set it to either a plain number for Mbit/s (e.g. `50' + for 50 mbit) or a number with a `KiB/s' indicator (e.g. `2300 KiB/s'). + This is only used when connecting to NMDC hubs, and is just an indication + for other users in the hub so that they know what speed they can expect + when downloading from you. + + description + A short public description that will be displayed in the user list of a + hub. + + download_dir + The directory where finished downloads are moved to. Finished downloads + are by default stored in /dl/. It is possible to set + this to a location that is on a different filesystem than the session + directory, but doing so is not recommended: ncdc will block when moving + the completed files to their final destination. + + download_slots + Maximum number of simultaneous downloads. + + email + Your email address. This will be displayed in the user list of the hub, + so only set this if you want it to be public. + + encoding + The character set/encoding to use for hub and PM messages. This setting + is only used on NMDC hubs, ADC always uses UTF-8. Some common values are: + CP1250 (Central Europe) + CP1251 (Cyrillic) + CP1252 (Western Europe) + ISO-8859-7 (Greek) + KOI8-R (Cyrillic) + UTF-8 (International) + + hubname + The name of the currently opened hub tab. This is a user-assigned name, + and is only used within ncdc itself. This is the same name as given to + the `/open' command. + + log_debug + Log debug messages to stderr.log in the session directory. It is highly + recommended to enable this setting if you wish to debug or hack ncdc. Be + warned, however, that this may generate a lot of data if you're connected + to a large hub. + + log_downloads + Log downloaded files to transfers.log. + + log_uploads + Log file uploads to transfers.log. + + minislots + Set the number of available minislots. A `minislot' is a special slot + that is used when all regular upload slots are in use and someone is + requesting your filelist or a small file. In this case, the other client + automatically applies for a minislot, and can still download from you as + long as not all minislots are in use. What constitutes a `small' file can + be changed with the `minislot_size' setting. Also see the `slots' config‐ + uration setting and the `/grant' command. + + minislot_size + The maximum size of a file that may be downloaded using a `minislot', in + KiB. See the `minislots' setting for more information. + + nick + Your nick. Nick changes are only visible on newly connected hubs, use the + `/reconnect' command to use your new nick immediately. Note that it is + highly discouraged to change your nick on NMDC hubs. This is because + clients downloading from you have no way of knowing that you changed your + nick, and therefore can't immediately continue to download from you. + + password + Sets your password for the current hub and enables auto-login on connect. + If you just want to login to a hub without saving your password, use the + `/password' command instead. Passwords are saved unencrypted in the con‐ + fig file. + + share_hidden + Whether to share hidden files and directories. A `hidden' file or direc‐ + tory is one of which the file name starts with a dot. (e.g. `.bashrc'). A + file list refresh is required for this setting to be effective. + + show_joinquit + Whether to display join/quit messages in the hub chat. + + slots + The number of upload slots. This determines for the most part how many + people can download from you simultaneously. It is possible that this + limit is exceeded in certain circumstances, see the `minislots' setting + and the `/grant' command. + + tls_policy + Set the policy for secure client-to-client connections. Setting this to + `disabled' disables TLS support for client connections, but still allows + you to connect to TLS-enabled hubs. `allow' will allow the use of TLS if + the other client requests this, but ncdc itself will not request TLS when + connecting to others. Setting this to `prefer' tells ncdc to also request + TLS when connecting to others. + + The use of TLS for client connections usually results in less optimal + performance when uploading and downloading, but is quite effective at + avoiding protocol-specific traffic shaping that some ISPs may do. Also + note that, even if you set this to `prefer', TLS will only be used if the + connecting party also supports it. + + + +KEY BINDINGS + On any tab without the text input line, you can press `?' to get the key bind‐ + ings for that tab. The list of key bindings is available through the `/help + keys' command, and is reproduced below. + + Global key bindings + Alt+j Open previous tab. + Alt+k Open next tab. + Alt+h Move current tab left. + Alt+l Move current tab right. + Alt+ Open tab with number . + Alt+c Close current tab. + Alt+n Open the connections tab. + Alt+q Open the download queue tab. + Alt+o Open own file list. + Alt+r Refresh file list. + Ctrl+c Quit ncdc. + + Keys for tabs with a log window: + Ctrl+l Clear current log window. + PgUp Scroll the log backward. + PgDown Scroll the log forward. + + Keys for tabs with a text input line: + Left/Right Move cursor one character left or right. + End/Home Move cursor to the end / start of the line. + Up/Down Scroll through the command history. + Tab Auto-complete current command, nick or argument. + Alt+b Move cursor one word backward. + Alt+f Move cursor one word forward. + Backspace Delete character before cursor. + Delete Delete character under cursor. + Ctrl+w Delete to previous space. + Alt+d Delete to next space. + Ctrl+k Delete everything after cursor. + Ctrl+u Delete entire line. + + File browser + Up/Down Select one item up/down. + k/j Select one item up/down. + PgUp/PgDown Select one page of items up/down. + End/Home Select last/first item in the list. + Right/l Open selected directory. + Left/h Open parent directory. + d Add selected file/directory to the download queue. + + Connection list + Up/Down Select one item up/down. + k/j Select one item up/down. + PgUp/PgDown Select one page of items up/down. + End/Home Select last/first item in the list. + d Disconnect selected connection. + i/Return Toggle information box. + f Find user in user list. + q Find file in download queue. + + Download queue + Up/Down Select one item up/down. + k/j Select one item up/down. + PgUp/PgDown Select one page of items up/down. + End/Home Select last/first item in the list. + f Find user in user list. + c Find connection in the connection list. + d Remove selected file from the queue. + +/- Increase/decrease priority. + + Note: when an item in the queue has `ERR' indicated in the priority col‐ + umn, you have two choices: You can remove the item from the queue using + `d', or attempt to continue the download by increasing its priority using + `+'. + + Search results tab + Up/Down Select one item up/down. + k/j Select one item up/down. + PgUp/PgDown Select one page of items up/down. + End/Home Select last/first item in the list. + f Find user in user list. + b/B Browse the selected users' list, B to force a redownload. + h Toggle hub column visibility. + u Order by username. + s Order by file size. + l Order by free slots. + n Order by file name. + + User list tab + Up/Down Select one item up/down. + k/j Select one item up/down. + PgUp/PgDown Select one page of items up/down. + End/Home Select last/first item in the list. + s Order by share size. + u Order by username. + o Toggle sorting OPs before others. + t Toggle tag column visibility. + e Toggle email column visibility. + c Toggle connection column visibility. + i/Return Toggle information box. + m Send a PM to the selected user. + g Grant a slot to the selected user. + b/B Browse the selected users' list, B to force a redownload. + + + +ENVIRONMENT + $NCDC_DIR is used to determine the session dir, it is only honoured if -c is not + set on the command line. + + +FILES + $NCDC_DIR corresponds to the session dir set via -c, environment variable + $NCDC_DIR or $HOME/.ncdc. + + $NCDC_DIR/cert/ + Directory where the client certificates are stored. Must contain a pri‐ + vate key file (client.key) and public certificate (client.crt). These + should be generated automatically when ncdc starts up the first time, but + can be generated manually using ncdc-gen-cert(1). + + $NCDC_DIR/config.ini + Main configuration file. It is recommended to use commands within ncdc + instead of editing this file manually. In particular, do not edit this + file while ncdc is running, otherwise you will lose your changes. + + $NCDC_DIR/dl/ + Directory where completed downloads are moved to by default. Can be + changed with the `download_dir' configuration option. + + $NCDC_DIR/dl.dat + Stores information about the download queue. + + $NCDC_DIR/files.xml.bz2 + Filelist containing a listing of all shared files. + + $NCDC_DIR/fl/ + Directory where downloaded file lists from other users are stored. The + names of the files are hex-encoded user IDs that are used internally by + ncdc. Old file lists are deleted automatically after one week. + + $NCDC_DIR/hashdata.dat + File information and hash data for shared files. + + $NCDC_DIR/history + Command history. + + $NCDC_DIR/inc/ + Location for incomplete downloads. File names are the base32-encoded TTH + root of the completed file. + + $NCDC_DIR/logs/ + Directory where all the log files are stored. File names starting with + `#' are hub logs and `~' are user (PM) logs. Special log files are trans‐ + fers.log and main.log. + ncdc does not have built-in functionality to rotate or compress log files + automatically. When rotating log files manually (e.g. via a cron job), + make sure to send the SIGUSR1 signal afterwards to force ncdc to flush + the old logs and create or open the new log files. + + $NCDC_DIR/stderr.log + Error/debug log. This file is cleared every time ncdc starts up. + + $NCDC_DIR/version + Version of the data directory. This file locked while an ncdc instance is + running, making sure that no two ncdc instances work with the same ses‐ + sion directory at the same time. + + +LICENSE + Copyright (C) 2011 Yoran Heling + ncdc is distributed under the MIT license, please read the COPYING file for more + information. + + +BUGS + Please report bugs or feature requests to projects@yorhel.nl or connect to the + development hub at adc://dc.blicky.net:2780/. + + +AUTHOR + ncdc is written by Yoran Heling + Web: http://dev.yorhel.nl/ncdc + + +SEE ALSO + ncdc-gen-cert(1). + + + +ncdc-1.0 September 2011 ncdc(1) diff --git a/img/ncdcstart.png b/img/ncdcstart.png deleted file mode 100644 index 6ce87a24dfbaebe88f507cb5c6b074445f8fcb1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17397 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%0DwDd+ymF#dYgbU4+ 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 KKdzKD4gNn)Cg|w^ diff --git a/index.cgi b/index.cgi index 1e1b3e4..02df50d 100755 --- a/index.cgi +++ b/index.cgi @@ -17,7 +17,7 @@ TUWF::register( qr{ncdu/scr} => \&ncduscr, qr{ncdc} => \&ncdc, qr{ncdc/faq} => \&ncdcfaq, - qr{ncdc/guide} => \&ncdcguide, + qr{ncdc/man} => \&ncdcmanual, qr{ncdc/changes} => \&ncdcchangelog, qr{tuwf} => \&tuwf, qr{tuwf/man(?:/(db|misc|request|response|xml))?} @@ -53,6 +53,7 @@ sub home { E; end; h2 'Updates'; + b '2011-09-16'; txt ' ncdc 1.0 released!'; br; b '2011-09-15'; txt ' Added some screenshots for ncdu.'; br; b '2011-09-03'; txt ' ncdc 0.9 released!'; br; b '2011-08-26'; txt ' ncdc 0.8 released!'; br; @@ -225,8 +226,8 @@ sub ncdc { h2 'Get ncdc!'; p; - b 'Latest version:'; txt ' 0.9 ('; - a href => '/download/ncdc-0.9.tar.gz', 'download'; + b 'Latest version:'; txt ' 1.0 ('; + a href => '/download/ncdc-1.0.tar.gz', 'download'; txt ' - '; a href => '/ncdc/changes', 'changes'; txt ' - '; a href => '/download/ncdc.md5', 'md5'; txt ' - '; a href => '/download/ncdc.sha1', 'sha1'; @@ -234,13 +235,14 @@ sub ncdc { txt 'You can also get the latest development version from '; a href => 'http://g.blicky.net/ncdc.git/', 'this git repository'; txt '. The README includes instructions to build ncdc. Check out the '; - a href => '/ncdc/guide', 'user guide'; txt ' to get started.'; + a href => '/ncdc/man', 'manual'; txt ' to get started.'; end; h2 'Features'; p 'Common features that all modern DC clients (should) have:'; ul; li 'Connecting to multiple hubs at the same time,'; + li 'Support for both ADC and NMDC protocols,'; li 'Chatting and private messaging,'; li 'Browsing the user list of a connected hub,'; li 'Share management and file uploading,'; @@ -248,7 +250,7 @@ sub ncdc { li 'File list browsing,'; li 'Single-source and TTH-checked file downloading,'; li 'Searching for files,'; - li 'Secure hub (adcs:// and nmdcs://) and client (ADCS) connections.'; + li 'Secure hub (adcs:// and nmdcs://) and client connections on both protocols.'; end; br; p 'Special features not commonly found in other clients:'; @@ -387,180 +389,14 @@ sub ncdcfaq { } -sub ncdcguide { +sub ncdcmanual { my $s = shift; - $s->htmlHeader(title => 'Ncdc User Guide', page => 'ncdc', tab => 'guide'); - p 'Since the built-in documentation of ncdc is not really complete yet, it - may be a bit hard to use for first-timers. This is a short guide to help - you get started with ncdc and to make up for the lack of proper - documentation. I\'m assuming that you already managed to install a recent - version of ncdc.'; - - h2 'Starting up'; - p 'Simply run `ncdc\', and you should see something like the following screenshot:'; - img src => '/img/ncdcstart.png', style => 'margin: 5px 0 0 10px; border: 1px solid #999', alt => 'Ncdc start-up screen.'; - - h2 'Basic settings'; - p 'When you just started ncdc, the first thing you want to do is to change some basic settings:'; - pre class => 'code'; - txt '/set nick '; b 'MyNick'; - end; - p 'And optionally, you may also want to change these:'; - pre class => 'code'; - txt '/set description '; b 'ncdc is awesome!'; br; - txt '/set connection '; b '10'; br; - txt '/set email '; b 'user@example.com'; - end; - p 'What you can use with the \'connection\' setting is a bit vague, but - you\'re safe if you just set it to your upload speed, in MBit/s. On public - hubs, you probably don\'t want to set an email address.'; - p 'Note: these settings can also be changed on a per-hub basis. More on that below.'; - - h2 'Sharing'; - p 'You can skip this section if you don\'t intent to share any files. To add a directory to your share, use the following command:'; - pre class => 'code'; - txt '/share '; b 'Virtual_name /path/to/actual/dir'; - end; - p "And '/path/to/actual/dir' will be shared under the virtual directory - 'Virtual_name', for which you are free to choose a name. Ncdc will - automatically index and hash the files in this directory. You can use - '/unshare' to remove a directory from your share and '/refresh' to - manually keep the index updated on changes. A refresh is automatically done - every hour by default, but can be changed using '/set autorefresh'."; - - h2 'Active vs. passive'; - p 'By default ncdc will use passive mode. If you are connected directly to - the internet or are behind a router that allows port forwarding, you will - probably want to enable active mode. To do so, issue the following - commands:'; - pre class => 'code'; - txt '/set active_ip '; b $s->reqIP; br; - txt '/set active_port '; b '34194'; br; - txt '/set active '; b 'true'; - end; - p "And make sure the port you specified is properly forwarded for both TCP and UDP."; - - h2 'Connecting to hubs'; - p "This is where ncdc differs a bit from other DC or even IRC clients. To - connect to a hub, you first need to name and open a 'hub tab', after which - you can use '/connect' to actually connect to the hub:"; - pre class => 'code'; - txt '/open '; b 'ncdc'; br; - txt '/connect '; b 'adc://dc.blicky.net:2780/'; - end; - p "The name you specify with '/open' will be used by ncdc to refer to this - hub. After this, you can always reconnect to this hub simply by typing '/open - ncdc', without having to use the '/connect' again."; - p "Some settings can be changed on a per-hub basis, for example your nick. - Using the '/set' command on a hub tab will change the setting only for that - hub. You can use '/unset' to change a setting back to its global value."; - - h2 'Global keybindings and commands'; - p "You have probably noticed that '/open' created a new tab, and are probably - wondering how to switch between multiple tabs and do other funky stuff. The - following ASCII table lists some of the global keybindings you can use:"; - pre class => 'code'; - b 'Alt+j'; txt ' open previous tab.'; br; - b 'Alt+k'; txt ' open next tab.'; br; - b 'Alt+h'; txt ' move current tab left.'; br; - b 'Alt+l'; txt ' move current tab right.'; br; - b 'Alt+'; txt ' open tab with number .'; br; - b 'Alt+c'; txt ' close current tab.'; br; - b 'Alt+n'; txt ' open the connections tab.'; br; - b 'Alt+q'; txt ' open the download queue.'; br; - b 'Alt+o'; txt ' open own file list.'; br; - b 'Ctrl+c'; txt ' quit ncdc.'; br; - end; - p "Lots of functionality is hidden behind commands and settings, use '/help' - to get a list of the commands and '/help ' for information about a - specific commands. '/set' can be used to get the list of available - settings, but these are not documented yet."; - - h2 'User list'; - p "To open the user list of a hub, use the '/userlist' command or hit Alt+u. - Here's a list of the keys you can use:"; - pre class => 'code'; - b 'j'; txt ' scroll down.'; br; - b 'k'; txt ' scroll up.'; br; - b 's'; txt ' order by share size.'; br; - b 'u'; txt ' order by username.'; br; - b 'o'; txt ' toggle sort OPs before others.'; br; - b 'd'; txt ' toggle description column.'; br; - b 'e'; txt ' toggle email column.'; br; - b 'c'; txt ' toggle connection column.'; br; - b 'i'; txt ' toggle information box.'; br; - b 'm'; txt ' PM the selected user.'; br; - b 'b'; txt ' browse the selected users\' list.'; br; - end; - - h2 'Searching'; - p "To search for files to download, use the '/search' command:"; - pre class => 'code'; - lit '/search gentoo'; - end; - p style => 'font-size: 9px; padding-left: 25px; padding-bottom: 3px', - "My apologies for using such a generic search term as example. It just - happens to be one that doesn't advocate piracy yet gives some results on - most hubs."; - p "See '/help search' for more options. A new tab will be opened with the - search results, where the following keys can be used:"; - pre class => 'code'; - b 'j/k'; txt ' the usual down/up keys.'; br; - b 'b'; txt ' browse users\' file list.'; br; - b 'd'; txt ' add selected file to download queue.'; br; - b 'f'; txt ' find user in the user list.'; br; - b 'h'; txt ' show/hide hub column.'; br; - b 'u'; txt ' order by username.'; br; - b 's'; txt ' order by file size.'; br; - b 'l'; txt ' order by available slots.'; br; - b 'n'; txt ' order by file name.'; br; - end; - - h2 'Browsing file lists'; - p "If you were paying attention to the previous sections, you would have - noticed that three ways to open a file list have been mentioned: The global - Alt+o key to open your own, the 'b' key in the user list to browse a users' - list, and a similar 'b' key for the search results. There is a fourth - method, and that is the '/browse' command, see '/help browse' for details - on that one. Regardless of how you open a file list, the following keys - are available while browsing one:"; - pre class => 'code'; - b 'j/k'; txt ' the usual down/up keys. (this is getting boring)'; br; - b 'l'; txt ' open selected directory.'; br; - b 'h'; txt ' open parent directory.'; br; - b 'd'; txt ' add selected file to download queue.'; br; - end; - - h2 'Download queue management'; - p "Both the the search results and the file list browser have a 'd' key to - add a file to the download queue. Any queud files will be downloaded - automatically and this process will usually not require any further input. - Nonetheless, there is a download queue manager which can be accessed with - the global Alt+q key. The following keys can be used on this tab:"; - pre class => 'code'; - b 'j/k'; txt ' again, the down/up keys.'; br; - b 'f'; txt ' find user in the user list.'; br; - b 'd'; txt ' remove selected file from the queue.'; br; - b 'c'; txt ' find the related download connection in the connection list.'; br; - b '+'; txt ' increase download priority.'; br; - b '-'; txt ' decrease download priority.'; br; - end; - p "A little note on the download priorities: if you see that an item has - 'ERR' as priority, this means that something went wrong while downloading. - In these cases you have two choices: remove the item from the queue ('d' - key), or tell ncdc to try it again by clearing the error status (that is, - by increasing the priority. That is, the '+' key.)."; - - h2 'Connection management'; - p 'Last but not least, you can also monitor your currently active uploads and - downloads with the connections tab, which can be accessed with Alt+n. Keys:'; - pre class => 'code'; - b 'j/k'; txt ' guess.'; br; - b 'd'; txt ' disconnect selected connection.'; br; - b 'i'; txt ' toggle information box.'; br; - b 'f'; txt ' find user in the user list.'; br; - b 'q'; txt ' find item in the download queue.'; br; + $s->htmlHeader(title => 'Manual page', page => 'ncdc', tab => 'man'); + open my $F, '<', "$ROOT/dat/ncdc-man" or die $!; + pre; + txt $_ while(<$F>); end; + close $F; $s->htmlFooter; } @@ -1015,6 +851,7 @@ sub notfound { my $u = lc $s->reqPath; ($_->[0] eq $u || $_->[0] eq "$u/") && return $s->resRedirect($_->[1], 'perm') for ( [ 'bluecubes', '/demo' ], + [ 'ncdc/guide', '/ncdc/man' ], [ 'dump', '/dump' ], [ 'dump/index2', '/dump' ], [ 'dump/pmdc2-parse', '/dump' ], @@ -1070,7 +907,7 @@ sub htmlHeader { div id => 'mtabs'; a href => '/ncdc', !$o{tab} ? (class => 'sel') : (), 'main'; txt ' '; a href => '/ncdc/faq', $o{tab} eq 'faq' ? (class => 'sel') : (), 'Q&A'; txt ' '; - a href => '/ncdc/guide', $o{tab} eq 'guide' ? (class => 'sel') : (), 'user guide'; txt ' '; + a href => '/ncdc/man', $o{tab} eq 'man' ? (class => 'sel') : (), 'manual'; txt ' '; a href => '/ncdc/changes', $o{tab} eq 'changes' ? (class => 'sel') : (), 'changelog'; txt ' '; end; }