"""An NNTP client class based on RFC 977: Network News Transfer Protocol.

Example:

>>> from nntplib import NNTP
>>> s = NNTP('news')
>>> 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 51 articles, range 5770 to 5821
>>> resp, subs = s.xhdr('subject', first + '-' + last)
>>> resp = s.quit()
>>>

Here 'resp' is the server response line.
Error responses are turned into exceptions.

To post an article from a file:
>>> f = open(filename, 'r') # file containing article, including header
>>> resp = s.post(f)
>>>

For descriptions of all methods, read the comments in the code below.
Note that all arguments and return values representing article numbers
are strings, not numbers, since they are rarely used for calculations.
"""

# RFC 977 by Brian Kantor and Phil Lapsley.
# xover, xgtitle, xpath, date methods by Kevan Heydon


# Imports
import re
import socket
import string



# Exceptions raised when an error or invalid response is received
class NNTPError(Exception):
	"""Base class for all nntplib exceptions"""
	def __init__(self, *args):
		apply(Exception.__init__, (self,)+args)
		try:
			self.response = args[0]
		except IndexError:
			self.response = 'No response given'

class NNTPReplyError(NNTPError):
	"""Unexpected [123]xx reply"""
	pass

class NNTPTemporaryError(NNTPError):
	"""4xx errors"""
	pass

class NNTPPermanentError(NNTPError):
	"""5xx errors"""
	pass

class NNTPProtocolError(NNTPError):
	"""Response does not begin with [1-5]"""
	pass

class NNTPDataError(NNTPError):
	"""Error in response data"""
	pass

# for backwards compatibility
error_reply = NNTPReplyError
error_temp = NNTPTemporaryError
error_perm = NNTPPermanentError
error_proto = NNTPProtocolError
error_data = NNTPDataError



# Standard port used by NNTP servers
NNTP_PORT = 119


# Response numbers that are followed by additional text (e.g. article)
LONGRESP = ['100', '215', '220', '221', '222', '224', '230', '231', '282']


# Line terminators (we always output CRLF, but accept any of CRLF, CR, LF)
CRLF = '\r\n'



# The class itself
class NNTP:
	def __init__(self, host, port=NNTP_PORT, user=None, password=None,
		     readermode=None):
		"""Initialize an instance.  Arguments:
		- host: hostname to connect to
		- port: port to connect to (default the standard NNTP port)
		- user: username to authenticate with
		- password: password to use with username
		- readermode: if true, send 'mode reader' command after
		              connecting.

	        readermode is sometimes necessary if you are connecting to an
	        NNTP server on the local machine and intend to call
	        reader-specific comamnds, such as `group'.  If you get
	        unexpected NNTPPermanentErrors, you might need to set
	        readermode.
		"""
		self.host = host
		self.port = port
		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
		self.sock.connect((self.host, self.port))
		self.file = self.sock.makefile('rb')
		self.debugging = 0
		self.welcome = self.getresp()
		if readermode:
			try:
				self.welcome = self.shortcmd('mode reader')
			except NNTPPermanentError:
				# error 500, probably 'not implemented'
				pass
		if user:
			resp = self.shortcmd('authinfo user '+user)
			if resp[:3] == '381':
				if not password:
					raise NNTPReplyError(resp)
				else:
					resp = self.shortcmd(
						'authinfo pass '+password)
					if resp[:3] != '281':
						raise NNTPPermanentError(resp)

	# Get the welcome message from the server
	# (this is read and squirreled away by __init__()).
	# If the response code is 200, posting is allowed;
	# if it 201, posting is not allowed

	def getwelcome(self):
		"""Get the welcome message from the server
		(this is read and squirreled away by __init__()).
		If the response code is 200, posting is allowed;
		if it 201, posting is not allowed."""

		if self.debugging: print '*welcome*', `self.welcome`
		return self.welcome

	def set_debuglevel(self, level):
		"""Set the debugging level.  Argument 'level' means:
		0: no debugging output (default)
		1: print commands and responses but not body text etc.
		2: also print raw lines read and sent before stripping CR/LF"""

		self.debugging = level
	debug = set_debuglevel

	def putline(self, line):
		"""Internal: send one line to the server, appending CRLF."""
		line = line + CRLF
		if self.debugging > 1: print '*put*', `line`
		self.sock.send(line)

	def putcmd(self, line):
		"""Internal: send one command to the server (through putline())."""
		if self.debugging: print '*cmd*', `line`
		self.putline(line)

	def getline(self):
		"""Internal: return one line from the server, stripping CRLF.
		Raise EOFError if the connection is closed."""
		line = self.file.readline()
		if self.debugging > 1:
			print '*get*', `line`
		if not line: raise EOFError
		if line[-2:] == CRLF: line = line[:-2]
		elif line[-1:] in CRLF: line = line[:-1]
		return line

	def getresp(self):
		"""Internal: get a response from the server.
		Raise various errors if the response indicates an error."""
		resp = self.getline()
		if self.debugging: print '*resp*', `resp`
		c = resp[:1]
		if c == '4':
			raise NNTPTemporaryError(resp)
		if c == '5':
			raise NNTPPermanentError(resp)
		if c not in '123':
			raise NNTPProtocolError(resp)
		return resp

	def getlongresp(self):
		"""Internal: get a response plus following text from the server.
		Raise various errors if the response indicates an error."""
		resp = self.getresp()
		if resp[:3] not in LONGRESP:
			raise NNTPReplyError(resp)
		list = []
		while 1:
			line = self.getline()
			if line == '.':
				break
			if line[:2] == '..':
				line = line[1:]
			list.append(line)
		return resp, list

	def shortcmd(self, line):
		"""Internal: send a command and get the response."""
		self.putcmd(line)
		return self.getresp()

	def longcmd(self, line):
		"""Internal: send a command and get the response plus following text."""
		self.putcmd(line)
		return self.getlongresp()

	def newgroups(self, date, time):
		"""Process a NEWGROUPS command.  Arguments:
		- date: string 'yymmdd' indicating the date
		- time: string 'hhmmss' indicating the time
		Return:
		- resp: server response if successful
		- list: list of newsgroup names"""

		return self.longcmd('NEWGROUPS ' + date + ' ' + time)

	def newnews(self, group, date, time):
		"""Process a NEWNEWS command.  Arguments:
		- group: group name or '*'
		- date: string 'yymmdd' indicating the date
		- time: string 'hhmmss' indicating the time
		Return:
		- resp: server response if successful
		- list: list of article ids"""

		cmd = 'NEWNEWS ' + group + ' ' + date + ' ' + time
		return self.longcmd(cmd)

	def list(self):
		"""Process a LIST command.  Return:
		- resp: server response if successful
		- list: list of (group, last, first, flag) (strings)"""

		resp, list = self.longcmd('LIST')
		for i in range(len(list)):
			# Parse lines into "group last first flag"
			list[i] = tuple(string.split(list[i]))
		return resp, list

	def group(self, name):
		"""Process a GROUP command.  Argument:
		- group: the group name
		Returns:
		- resp: server response if successful
		- count: number of articles (string)
		- first: first article number (string)
		- last: last article number (string)
		- name: the group name"""

		resp = self.shortcmd('GROUP ' + name)
		if resp[:3] <> '211':
			raise NNTPReplyError(resp)
		words = string.split(resp)
		count = first = last = 0
		n = len(words)
		if n > 1:
			count = words[1]
			if n > 2:
				first = words[2]
				if n > 3:
					last = words[3]
					if n > 4:
						name = string.lower(words[4])
		return resp, count, first, last, name

	def help(self):
		"""Process a HELP command.  Returns:
		- resp: server response if successful
		- list: list of strings"""

		return self.longcmd('HELP')

	def statparse(self, resp):
		"""Internal: parse the response of a STAT, NEXT or LAST command."""
		if resp[:2] <> '22':
			raise NNTPReplyError(resp)
		words = string.split(resp)
		nr = 0
		id = ''
		n = len(words)
		if n > 1:
			nr = words[1]
			if n > 2:
				id = words[2]
		return resp, nr, id

	def statcmd(self, line):
		"""Internal: process a STAT, NEXT or LAST command."""
		resp = self.shortcmd(line)
		return self.statparse(resp)

	def stat(self, id):
		"""Process a STAT command.  Argument:
		- id: article number or message id
		Returns:
		- resp: server response if successful
		- nr:   the article number
		- id:   the article id"""

		return self.statcmd('STAT ' + id)

	def next(self):
		"""Process a NEXT command.  No arguments.  Return as for STAT."""
		return self.statcmd('NEXT')

	def last(self):
		"""Process a LAST command.  No arguments.  Return as for STAT."""
		return self.statcmd('LAST')

	def artcmd(self, line):
		"""Internal: process a HEAD, BODY or ARTICLE command."""
		resp, list = self.longcmd(line)
		resp, nr, id = self.statparse(resp)
		return resp, nr, id, list

	def head(self, id):
		"""Process a HEAD command.  Argument:
		- id: article number or message id
		Returns:
		- resp: server response if successful
		- nr: article number
		- id: message id
		- list: the lines of the article's header"""

		return self.artcmd('HEAD ' + id)

	def body(self, id):
		"""Process a BODY command.  Argument:
		- id: article number or message id
		Returns:
		- resp: server response if successful
		- nr: article number
		- id: message id
		- list: the lines of the article's body"""

		return self.artcmd('BODY ' + id)

	def article(self, id):
		"""Process an ARTICLE command.  Argument:
		- id: article number or message id
		Returns:
		- resp: server response if successful
		- nr: article number
		- id: message id
		- list: the lines of the article"""

		return self.artcmd('ARTICLE ' + id)

	def slave(self):
		"""Process a SLAVE command.  Returns:
		- resp: server response if successful"""

		return self.shortcmd('SLAVE')

	def xhdr(self, hdr, str):
		"""Process an XHDR command (optional server extension).  Arguments:
		- hdr: the header type (e.g. 'subject')
		- str: an article nr, a message id, or a range nr1-nr2
		Returns:
		- resp: server response if successful
		- list: list of (nr, value) strings"""

		pat = re.compile('^([0-9]+) ?(.*)\n?')
		resp, lines = self.longcmd('XHDR ' + hdr + ' ' + str)
		for i in range(len(lines)):
			line = lines[i]
			m = pat.match(line)
			if m:
				lines[i] = m.group(1, 2)
		return resp, lines

	def xover(self,start,end):
		"""Process an XOVER command (optional server extension) Arguments:
		- start: start of range
		- end: end of range
		Returns:
		- resp: server response if successful
		- list: list of (art-nr, subject, poster, date,
		                 id, references, size, lines)"""

		resp, lines = self.longcmd('XOVER ' + start + '-' + end)
		xover_lines = []
		for line in lines:
			elem = string.splitfields(line,"\t")
			try:
				xover_lines.append((elem[0],
						    elem[1],
						    elem[2],
						    elem[3],
						    elem[4],
						    string.split(elem[5]),
						    elem[6],
						    elem[7]))
			except IndexError:
				raise NNTPDataError(line)
		return resp,xover_lines

	def xgtitle(self, group):
		"""Process an XGTITLE command (optional server extension) Arguments:
		- group: group name wildcard (i.e. news.*)
		Returns:
		- resp: server response if successful
		- list: list of (name,title) strings"""

		line_pat = re.compile("^([^ \t]+)[ \t]+(.*)$")
		resp, raw_lines = self.longcmd('XGTITLE ' + group)
		lines = []
		for raw_line in raw_lines:
			match = line_pat.search(string.strip(raw_line))
			if match:
				lines.append(match.group(1, 2))
		return resp, lines

	def xpath(self,id):
		"""Process an XPATH command (optional server extension) Arguments:
		- id: Message id of article
		Returns:
		resp: server response if successful
		path: directory path to article"""

		resp = self.shortcmd("XPATH " + id)
		if resp[:3] <> '223':
			raise NNTPReplyError(resp)
		try:
			[resp_num, path] = string.split(resp)
		except ValueError:
			raise NNTPReplyError(resp)
		else:
			return resp, path

	def date (self):
		"""Process the DATE command. Arguments:
		None
		Returns:
		resp: server response if successful
		date: Date suitable for newnews/newgroups commands etc.
		time: Time suitable for newnews/newgroups commands etc."""

		resp = self.shortcmd("DATE")
		if resp[:3] <> '111':
			raise NNTPReplyError(resp)
		elem = string.split(resp)
		if len(elem) != 2:
			raise NNTPDataError(resp)
		date = elem[1][2:8]
		time = elem[1][-6:]
		if len(date) != 6 or len(time) != 6:
			raise NNTPDataError(resp)
		return resp, date, time


	def post(self, f):
		"""Process a POST command.  Arguments:
		- f: file containing the article
		Returns:
		- resp: server response if successful"""

		resp = self.shortcmd('POST')
		# Raises error_??? if posting is not allowed
		if resp[0] <> '3':
			raise NNTPReplyError(resp)
		while 1:
			line = f.readline()
			if not line:
				break
			if line[-1] == '\n':
				line = line[:-1]
			if line[:1] == '.':
				line = '.' + line
			self.putline(line)
		self.putline('.')
		return self.getresp()

	def ihave(self, id, f):
		"""Process an IHAVE command.  Arguments:
		- id: message-id of the article
		- f:  file containing the article
		Returns:
		- resp: server response if successful
		Note that if the server refuses the article an exception is raised."""

		resp = self.shortcmd('IHAVE ' + id)
		# Raises error_??? if the server already has it
		if resp[0] <> '3':
			raise NNTPReplyError(resp)
		while 1:
			line = f.readline()
			if not line:
				break
			if line[-1] == '\n':
				line = line[:-1]
			if line[:1] == '.':
				line = '.' + line
			self.putline(line)
		self.putline('.')
		return self.getresp()

	def quit(self):
		"""Process a QUIT command and close the socket.  Returns:
		- resp: server response if successful"""

		resp = self.shortcmd('QUIT')
		self.file.close()
		self.sock.close()
		del self.file, self.sock
		return resp


def _test():
	"""Minimal test function."""
	s = NNTP('news', readermode='reader')
	resp, count, first, last, name = s.group('comp.lang.python')
	print resp
	print 'Group', name, 'has', count, 'articles, range', first, 'to', last
	resp, subs = s.xhdr('subject', first + '-' + last)
	print resp
	for item in subs:
		print "%7s %s" % item
	resp = s.quit()
	print resp


# Run the test when run as a script
if __name__ == '__main__':
	_test()
