# -*-coding:Latin-1 -*
"""client chat (TCP)"""
import socket
import threading
import time

#modules persos
import lancer

#### initialisation des variables ####
pseudo = raw_input("Pseudo > ")
if not pseudo:
    pseudo = "client"
    
hote = raw_input("Ip > ")
if not hote:
    hote = "localhost"

port = 6660
connecte = False

#### fils secondaires ####

class ThreadReception(threading.Thread):
    """fil de reception"""
    def __init__(self, cnn):
        """initialisation du fil"""
        threading.Thread.__init__(self)
        self.cnn = cnn
        self.connecte = True
        
    def run(self):
        """reception et d'affichage des messages"""
        while self.connecte:
           try:
               message_recu = self.cnn.recv(1024)
               print(message_recu.decode())
               if message_recu =='' or message_recu.upper() == "FIN":
                   break

           except:
              print("Reception interrompue.")
              self.connecte = False
              self.connexion.close()
            
class ThreadEmission(threading.Thread):
    """fil d'emission"""
    def __init__(self, cnn):
        """initialisation du fil"""
        threading.Thread.__init__(self)
        self.cnn = cnn
        self.connecte = True
        
    def run(self):
       """traitement et emission des messages""" 
       while self.connecte:
           try:
               envoi = raw_input("\n")
               
               estLancer = ((envoi[0] == "!") or (envoi[0] == "&"))
               estPublic = (envoi[0] != "&")
               
               if estLancer:
                   #on lance le/les de(s)
                   try:
                      resultat = lancer.jet(envoi[1:])
                      envoi = "{} ({})  [{}]".format(resultat[0], resultat[1], envoi[1:])
                   except:
                       envoi = "Carton rouge! saisie incorrecte"
                       
               if estPublic:
                   #on renvoie le resultat au serveur si c'est un jet public
                   envoi = "{}: {}".format(pseudo, envoi)
                   if estLancer:
                       envoi = "*{}".format(envoi)
                   self.cnn.send(envoi.encode())
               else:
                   #on l'affiche sinon
                   print("jet secret: {}".format(envoi))
                   
           except:
               print("Emission interrompue.")
               self.connecte = False
               self.cnn.close()


#### fil principal ####
           
print("En attente du serveur...")

while connecte==False:
#en attente de la connexion    
    try:
       cnn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
       cnn.connect((hote, port))
       connecte = True
       print("Connexion etablie avec le serveur sur le port {}".format(port))
       msg = "{} s'est connecte".format(pseudo)
       msg = msg.encode()
       cnn.send(msg)       
    except:
       pass

thE = ThreadEmission(cnn)
thR = ThreadReception(cnn)
thE.start()
thR.start()
   
