# This is a module for accessing a vjbox-server.
# It exports a class "vj" which has methods for nearly every possible
# aspect of the vjbox-protocol (current version 0.32)

from socket import *
import string
import time

EXvjerror="Error in vj-class"
VJerrornum=0
VJerrormsg=""
global VJerrornum,VJerrormsg

class vj:
   def __init__(self,host,port,username):
      self.sock=socket(AF_INET,SOCK_STREAM)
      self.property={}
      try:
	self.sock.connect(host,port)
      except error,errno:
	print errno
        return Null
      self.sock_f=self.sock.makefile("rb")
      s=self.sock_f.readline()      
      self.sock.send("login "+username+"\n")
      line=self.sock_f.readline()
      s=string.split(line)
      if string.atoi(s[0]) != 101:
        print "server-access denied:",string.join(s[1:])
        self.sock.close
        return None
      self.boxname=s[1]
      self.servername=s[2]
      line=self.sock_f.readline()
      while line[0] != "." :     
	data=string.split(line)
        key=data[0]
	data=string.strip(string.join(data[1:]))
        self.property[key]=data
	line=self.sock_f.readline()
      self.messages=[]

   def quit(self):
      self.sock.send("quit\n")
    

   def receive_until_dot(self):
     line=self.sock_f.readline()
     data=[]
     while line[0] != ".":
       data.append(string.strip(line))
       line=self.sock_f.readline()
     return data
    
   def _sendcmd(self,cmd,numbers):
#     self.sock.setblocking(0)
#     resp=string.split(self.sock_f.readline())
#     while resp != []:
#       if string.atoi(resp[0])==99:
#         self.messages.append(string.join(resp[1:]))
#         resp=string.split(self.sock_f.readline())
     self.sock.setblocking(1)
     self.sock.send(string.strip(cmd)+"\n")
     resp=string.split(self.sock_f.readline())
     print resp
     if string.atoi(resp[0]) not in numbers:
        VJerrornum=string.atoi(resp[0])
        raise EXvjerror
        return None
     return string.atoi(resp[0])
    
   def newmail(self,since,groups="*",options=""):
     try:
       self._sendcmd("newmail "+str(since)+" "+groups+" "+options,(132,0))
     except EXvjerror:
       raise EXvjerror
       return None
     return self.receive_until_dot()

   def version(self):
     self.sock.send("version\n")
     resp=string.split(self.sock_f.readline())
     if string.atoi(resp[0]) != 121:
       VJerrornum=string.atoi(resp[0])
       raise EXvjerror
       return None
     return self.receive_until_dot()
      
    
   def getmail(self,article):
     self._sendcmd("getmail "+article+"\n",(143,))
     return self.receive_until_dot()
      
   
   def boardlist(self):
      try:
        self._sendcmd("boardlist",(542,))
      except EXvjerror:
        raise EXvjerror
        return None
      return self.receive_until_dot()
        

   def list(self,board,start,end):
      pass

   def putmail(self,sender,target,address,title,data,lifetime=30):
      try:
        self._sendcmd("putmail "+target+ " "+address+" "+str(lifetime),(112,))
      except EXvjerror:
        raise EXvjerror
        return None
      try:
        self._sendcmd(title,(113,))
      except EXvjerror:
        raise EXvjerror
        return None
      for line in data:
        self.sock.send(line)
      time.sleep(1)
      self.sock.send(".\n")
      self.sock.setblocking(1)
      resp=string.split(self.sock_f.readline())
      if string.atoi(resp[0]) != 116:
         VJerrornum=string.atoi(resp[0])
         raise EXvjerror
         return None
   
   def header(self,article):
     try:
       self._sendcmd("header "+article,(153,))
     except EXvjerror:
       raise EXvjerror
       return None
     return self.receive_until_dot()

   def changebox(self,call):
       self._sendcmd("changebox "+call,(214,))

   def listbox(self,start,stop):
      pass
   
   def getinfo(self,call):
     if self._sendcmd("getinfo "+call,(552,553))==552:
       return None
     else:
       return self.receive_until_dot()
       
   def showlogin(self):
     self._sendcmd("showlogins",(571,))
     return self.receive_until_dot()
   
   def read(self,board,nr):
     self._sendcmd("read "+board+" "+str(nr),(305,))
     return self.receive_until_dot()
   
   def list(self,board,start,stop):
     self._sendcmd("list "+board+" "+str(start)+" "+str(stop),(314,))
     return self.receive_until_dot()
   
   def mybbs(self,bbs):
     self._sendcmd("mybbs "+bbs,(512,))
     
   def msg(self,pid,text):
     if self._sendcmd("msg "+str(pid)+" "+text,(534,532))==532: return 0
     else : return 1
     
   def readlock(self,value):
     self._sendcmd("readlock "+str(value),(523,))
   
   def header(self,bid):
     self._sendcmd("header "+bid,(153,))
     return self.receive_until_dot()








