# -*-coding:Latin-1 -*
"""serveur chat (UDP)"""
import socket
import threading

#### intialisation des variables ####
hote = ''
port = 6660
connectes = {}
serveur_lance = False

#### fils secondaires #### 

class ThreadClient(threading.Thread):
    """fil de connexion client"""
    def __init__(self, cnn):
        """creation du fil"""
        threading.Thread.__init__(self)
        self.cnn = cnn
        
    def run(self):
        """echange avec le client"""
        try:
           nom = self.getName()
           while True:
               #reception du message client
               msgClient = self.cnn.recv(1024)
               msgClient = msgClient.decode()
               
               if msgClient.upper() == "FIN" or msgClient =="":
                   break

               message = "%s> %s" % (nom, msgClient)
               print(message)
               
               try:
                  #fait suivre le message a tous les clients sauf l'emetteur:
                  for cle in connectes:
                      if cle != nom or msgClient[0]=="*":    
                          connectes[cle].send(msgClient.encode())
               except RuntimeError:
                  #pour gérer le changement de taille du dictionnaire 'connectes'
                  #lors de l'arrivee ou du depart d'un client 
                  print("Changement de taille du dictionnaire") 

        except:        
           #fermeture de la connexion avec le client:
           self.cnn.close()
           #on supprime le client de la liste des connectes
           del connectes[self.getName()]
           print("Client %s deconnecte." % self.getName())
           #on avertir tout le monde de la deconnexion
           for cle in connectes:
              connectes[cle].send("Client %s deconnecte.".encode())

           # Le fil se termine ici    


#### fil principal ####

try:
   cnn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   cnn.bind((hote, port))
   cnn.listen(5)
   print("Le serveur ecoute a present sur le port {}".format(port))
   serveur_lance = True
except:
   print("Impossible de demarrer le serveur") 

while serveur_lance:
    #tant que le serveur est lance, il reste disponible a de nouvelles connexions
    cnnClient, adresse = cnn.accept()
    #on cree un nouveau fil pour le nouveau client
    th = ThreadClient(cnnClient)
    th.start()
    #et on ajoute son adresse reseau a la liste des connectes
    it = th.getName()
    connectes[it] = cnnClient
    print("Client %s connecte, adresse IP %s, port %s." %\
           (it, adresse[0], adresse[1]))

