\section{\module{nntplib} ---
         NNTP protocol client}

\declaremodule{standard}{nntplib}
\modulesynopsis{NNTP protocol client (requires sockets).}

\indexii{NNTP}{protocol}
\index{Network News Transfer Protocol}

This module defines the class \class{NNTP} which implements the client
side of the NNTP protocol.  It can be used to implement a news reader
or poster, or automated news processors.  For more information on NNTP
(Network News Transfer Protocol), see Internet \rfc{977}.

Here are two small examples of how it can be used.  To list some
statistics about a newsgroup and print the subjects of the last 10
articles:

\begin{verbatim}
>>> s = NNTP('news.cwi.nl')
>>> resp, count, first, last, name = s.group('comp.lang.python')
>>> print 'Group', name, 'has', count, 'articles, range', first, 'to', last
Group comp.lang.python has 59 articles, range 3742 to 3803
>>> resp, subs = s.xhdr('subject', first + '-' + last)
>>> for id, sub in subs[-10:]: print id, sub
... 
3792 Re: Removing elements from a list while iterating...
3793 Re: Who likes Info files?
3794 Emacs and doc strings
3795 a few questions about the Mac implementation
3796 Re: executable python scripts
3797 Re: executable python scripts
3798 Re: a few questions about the Mac implementation 
3799 Re: PROPOSAL: A Generic Python Object Interface for Python C Modules
3802 Re: executable python scripts 
3803 Re: \POSIX{} wait and SIGCHLD
>>> s.quit()
'205 news.cwi.nl closing connection.  Goodbye.'
\end{verbatim}

To post an article from a file (this assumes that the article has
valid headers):

\begin{verbatim}
>>> s = NNTP('news.cwi.nl')
>>> f = open('/tmp/article')
>>> s.post(f)
'240 Article posted successfully.'
>>> s.quit()
'205 news.cwi.nl closing connection.  Goodbye.'
\end{verbatim}

The module itself defines the following items:

\begin{classdesc}{NNTP}{host\optional{, port
                        \optional{, user\optional{, password
			\optional{, readermode}}}}}
Return a new instance of the \class{NNTP} class, representing a
connection to the NNTP server running on host \var{host}, listening at
port \var{port}.  The default \var{port} is 119.  If the optional
\var{user} and \var{password} are provided, the
\samp{AUTHINFO USER} and \samp{AUTHINFO PASS} commands are used to
identify and authenticate the user to the server.  If the optional
flag \var{readermode} is true, then a \samp{mode reader} command is
sent before authentication is performed.  Reader mode is sometimes
necessary if you are connecting to an NNTP server on the local machine
and intend to call reader-specific commands, such as \samp{group}.  If
you get unexpected \code{NNTPPermanentError}s, you might need to set
\var{readermode}.  \var{readermode} defaults to \code{None}.
\end{classdesc}

\begin{classdesc}{NNTPError}{}
Derived from the standard exception \code{Exception}, this is the base
class for all exceptions raised by the \code{nntplib} module.
\end{classdesc}

\begin{classdesc}{NNTPReplyError}{}
Exception raised when an unexpected reply is received from the
server.  For backwards compatibility, the exception \code{error_reply}
is equivalent to this class.
\end{classdesc}

\begin{classdesc}{NNTPTemporaryError}{}
Exception raised when an error code in the range 400--499 is
received.  For backwards compatibility, the exception
\code{error_temp} is equivalent to this class.
\end{classdesc}

\begin{classdesc}{NNTPPermanentError}{}
Exception raised when an error code in the range 500--599 is
received.  For backwards compatibility, the exception
\code{error_perm} is equivalent to this class.
\end{classdesc}

\begin{classdesc}{NNTPProtocolError}{}
Exception raised when a reply is received from the server that does
not begin with a digit in the range 1--5.  For backwards
compatibility, the exception \code{error_proto} is equivalent to this
class.
\end{classdesc}

\begin{classdesc}{NNTPDataError}{}
Exception raised when there is some error in the response data.  For
backwards compatibility, the exception \code{error_data} is
equivalent to this class.
\end{classdesc}


\subsection{NNTP Objects \label{nntp-objects}}

NNTP instances have the following methods.  The \var{response} that is
returned as the first item in the return tuple of almost all methods
is the server's response: a string beginning with a three-digit code.
If the server's response indicates an error, the method raises one of
the above exceptions.


\begin{methoddesc}{getwelcome}{}
Return the welcome message sent by the server in reply to the initial
connection.  (This message sometimes contains disclaimers or help
information that may be relevant to the user.)
\end{methoddesc}

\begin{methoddesc}{set_debuglevel}{level}
Set the instance's debugging level.  This controls the amount of
debugging output printed.  The default, \code{0}, produces no debugging
output.  A value of \code{1} produces a moderate amount of debugging
output, generally a single line per request or response.  A value of
\code{2} or higher produces the maximum amount of debugging output,
logging each line sent and received on the connection (including
message text).
\end{methoddesc}

\begin{methoddesc}{newgroups}{date, time}
Send a \samp{NEWGROUPS} command.  The \var{date} argument should be a
string of the form \code{'\var{yy}\var{mm}\var{dd}'} indicating the
date, and \var{time} should be a string of the form
\code{'\var{hh}\var{mm}\var{ss}'} indicating the time.  Return a pair
\code{(\var{response}, \var{groups})} where \var{groups} is a list of
group names that are new since the given date and time.
\end{methoddesc}

\begin{methoddesc}{newnews}{group, date, time}
Send a \samp{NEWNEWS} command.  Here, \var{group} is a group name or
\code{'*'}, and \var{date} and \var{time} have the same meaning as for
\method{newgroups()}.  Return a pair \code{(\var{response},
\var{articles})} where \var{articles} is a list of article ids.
\end{methoddesc}

\begin{methoddesc}{list}{}
Send a \samp{LIST} command.  Return a pair \code{(\var{response},
\var{list})} where \var{list} is a list of tuples.  Each tuple has the
form \code{(\var{group}, \var{last}, \var{first}, \var{flag})}, where
\var{group} is a group name, \var{last} and \var{first} are the last
and first article numbers (as strings), and \var{flag} is
\code{'y'} if posting is allowed, \code{'n'} if not, and \code{'m'} if
the newsgroup is moderated.  (Note the ordering: \var{last},
\var{first}.)
\end{methoddesc}

\begin{methoddesc}{group}{name}
Send a \samp{GROUP} command, where \var{name} is the group name.
Return a tuple \code{(\var{response}, \var{count}, \var{first},
\var{last}, \var{name})} where \var{count} is the (estimated) number
of articles in the group, \var{first} is the first article number in
the group, \var{last} is the last article number in the group, and
\var{name} is the group name.  The numbers are returned as strings.
\end{methoddesc}

\begin{methoddesc}{help}{}
Send a \samp{HELP} command.  Return a pair \code{(\var{response},
\var{list})} where \var{list} is a list of help strings.
\end{methoddesc}

\begin{methoddesc}{stat}{id}
Send a \samp{STAT} command, where \var{id} is the message id (enclosed
in \character{<} and \character{>}) or an article number (as a string).
Return a triple \code{(\var{response}, \var{number}, \var{id})} where
\var{number} is the article number (as a string) and \var{id} is the
article id  (enclosed in \character{<} and \character{>}).
\end{methoddesc}

\begin{methoddesc}{next}{}
Send a \samp{NEXT} command.  Return as for \method{stat()}.
\end{methoddesc}

\begin{methoddesc}{last}{}
Send a \samp{LAST} command.  Return as for \method{stat()}.
\end{methoddesc}

\begin{methoddesc}{head}{id}
Send a \samp{HEAD} command, where \var{id} has the same meaning as for
\method{stat()}.  Return a tuple
\code{(\var{response}, \var{number}, \var{id}, \var{list})}
where the first three are the same as for \method{stat()},
and \var{list} is a list of the article's headers (an uninterpreted
list of lines, without trailing newlines).
\end{methoddesc}

\begin{methoddesc}{body}{id,\optional{file}}
Send a \samp{BODY} command, where \var{id} has the same meaning as for
\method{stat()}.  If the \var{file} parameter is supplied, then
the body is stored in a file.  If \var{file} is a string, then
the method will open a file object with that name, write to it then close it.
If \var{file} is a file object, then it will start calling
\method{write()} on it to store the lines of the body.
Return as for \method{head()}.  If \var{file} is supplied. Then
the returned \var{list} is an empty list.
\end{methoddesc}

\begin{methoddesc}{article}{id}
Send an \samp{ARTICLE} command, where \var{id} has the same meaning as
for \method{stat()}.  Return as for \method{head()}.
\end{methoddesc}

\begin{methoddesc}{slave}{}
Send a \samp{SLAVE} command.  Return the server's \var{response}.
\end{methoddesc}

\begin{methoddesc}{xhdr}{header, string}
Send an \samp{XHDR} command.  This command is not defined in the RFC
but is a common extension.  The \var{header} argument is a header
keyword, e.g. \code{'subject'}.  The \var{string} argument should have
the form \code{'\var{first}-\var{last}'} where \var{first} and
\var{last} are the first and last article numbers to search.  Return a
pair \code{(\var{response}, \var{list})}, where \var{list} is a list of
pairs \code{(\var{id}, \var{text})}, where \var{id} is an article id
(as a string) and \var{text} is the text of the requested header for
that article.
\end{methoddesc}

\begin{methoddesc}{post}{file}
Post an article using the \samp{POST} command.  The \var{file}
argument is an open file object which is read until EOF using its
\method{readline()} method.  It should be a well-formed news article,
including the required headers.  The \method{post()} method
automatically escapes lines beginning with \samp{.}.
\end{methoddesc}

\begin{methoddesc}{ihave}{id, file}
Send an \samp{IHAVE} command.  If the response is not an error, treat
\var{file} exactly as for the \method{post()} method.
\end{methoddesc}

\begin{methoddesc}{date}{}
Return a triple \code{(\var{response}, \var{date}, \var{time})},
containing the current date and time in a form suitable for the
\method{newnews()} and \method{newgroups()} methods.
This is an optional NNTP extension, and may not be supported by all
servers.
\end{methoddesc}

\begin{methoddesc}{xgtitle}{name}
Process an \samp{XGTITLE} command, returning a pair \code{(\var{response},
\var{list})}, where \var{list} is a list of tuples containing
\code{(\var{name}, \var{title})}.
% XXX huh?  Should that be name, description?
This is an optional NNTP extension, and may not be supported by all
servers.
\end{methoddesc}

\begin{methoddesc}{xover}{start, end}
Return a pair \code{(\var{resp}, \var{list})}.  \var{list} is a list
of tuples, one for each article in the range delimited by the \var{start}
and \var{end} article numbers.  Each tuple is of the form
\code{(\var{article number}, \var{subject}, \var{poster}, \var{date},
\var{id}, \var{references}, \var{size}, \var{lines})}.
This is an optional NNTP extension, and may not be supported by all
servers.
\end{methoddesc}

\begin{methoddesc}{xpath}{id}
Return a pair \code{(\var{resp}, \var{path})}, where \var{path} is the
directory path to the article with message ID \var{id}.  This is an
optional NNTP extension, and may not be supported by all servers.
\end{methoddesc}

\begin{methoddesc}{quit}{}
Send a \samp{QUIT} command and close the connection.  Once this method
has been called, no other methods of the NNTP object should be called.
\end{methoddesc}
