trivial-nntp
2016-12-07
Simple tools for interfacing to NNTP servers
:trivial-nntp (:tnntp)
Common lisp tools for connecting to and crawling around NNTP servers. It uses usocket and cl+ssl, and therefore handles simple or SSL-encrypted NNTP connections.
This is a minimalistic effort; however watch this:
CL-USER> (in-package :tnntp)
TNNTP> (command "HELP")
"100 Legal commands^M"
1
TNNTP> (rlist)
" ARTICLE [message-ID|number]^M"
" AUTHINFO USER name|PASS password|GENERIC program [argument ...]^M"
" BODY [message-ID|number]^M" " CAPABILITIES [keyword]^M"
" COMPRESS DEFLATE^M" " DATE^M" " GROUP newsgroup^M"
"..."
"Report problems to <usenet@fleegle.mixmin.net>.^M"
TNNTP> (disconnect)
"205 Bye!^M"
2
CL-USER>
This simple test connect to news.mixmin.net (see tnntp.lisp). To connect to your server, create a server just like this (with your own info, of course):
(defparameter *server* ;; or keep this in some other place... (make-server :name "news.mixmin.net" :port 119 :user nil :password nil :ssl nil ) (defparameter *conn* ;; or create an array of connections or whatever (make-conn :server *server* :group "alt.whatever")
At the core, the server structure (see 'tnntp.lisp') contains information about the URL, port, authentication. A connection keeps track of the socket/stream state. The system will transparently reconnect and restore current group on a connection should the server close the connection.
Commands are sent with something like (command connection "commandstring" :expecting 2 ) The expecting parameter, if specified, makes sure that the response in in 200-299 range (only first digit is checked). For commands with an additional parameter such as "GROUP groupname" the :also parameter avoids building command strings: (send-command "GROUP" :also groupname)
Responses are read with
- (rline) - read one line
- (rlist) - read lines terminated by ".^M" into a list; optionally process with :proc.
Lines are returned unprocessed, with control-M character. Rationale: you will probably parse the lines anyway, so there is little reason to worry about that.
WORKFLOW
- Create a server structure with your server url, port and authentication info.
- Create a connection structure with the server.
- (command ...) "MODE READER" is a good start. If you send commands that return data, make sure to read everything up to and including the termination line containing a single dot. See (rlist) for details. If you don't you will get out of sync and send-command will not get a good response line.
- (disconnect) when done -- it sends "QUIT" and kills the sockets
- Write a news transport, a reader, a downloader, or anything that you are discouraged to do in this article
A SIMPLE EXAMPLE
(load-groups)
(search-groups "book")
Search the grouplist for anything containing the word 'book'; regex expressions allowed!
References: *