Messagerie privée en travaux
Salut à tous,
Ce soir je poste ma messagerie privée afin de trouver un peu d'aide pour la faire évoluer un peu... Je suis parti de la version de la messagerie qui se trouve dans le livre Demonstration_IHM.liv dans les tutoriels de l'atelier...
Merci d'avance pour votre aide...
Code:
/*
Client graphique d'un salon de discution virtuel
Vous pouvez créer votre propre serveur avec tutoriels/j_expert/TCPServeur.liv
version avec Émoticônes
Version XP Rico 0.7
Amélioration
- L'implantation d'une sonnerie pour l'arrivée d'un nouveau message
*/
espèces
nom est un texte
message est un texte
horodatage est un texte
commande est un texte
espèce packet contient nom, message, commande, horodatage
globale
client est un tcpclient
configuration est un configuration, domaine vaut "tcpclient"
// IHM de la messagerie
form est un formulaire, titre vaut "Messager Linotte V.0.7", largeur vaut 800, hauteur vaut 500
planche est une grille, largeur prend 1, hauteur prend 1 // Pour adapter la boiteRiche à la fenetre
planche2 est une grille, largeur prend 1, hauteur prend 2
// variante : panneau est un panneau, couleurfond vaut "menthe à l'eau"
panneau1 est un panneau, couleurfond vaut "bleu persan"
// Boite de dialogue
info est un étiquette, texte vaut "Votre identifiant : ", x vaut 5, y vaut 8, couleurfond vaut "azurin"
indentifiant est un champ, x vaut 95, y vaut 5, texte vaut ""
boite_titre est un étiquette, texte vaut "Votre message : ", x vaut 5, y vaut 40, visible vaut "non", couleurtexte vaut "azurin"
boite est un boite,x vaut 5, y vaut 60, largeur vaut 600, hauteur vaut 160, visible vaut "non", infobulle vaut "[Contrôle]+[Entrée] pour envoyer le message"
b1 est un bouton, texte vaut "<html><b><font color=blue>Envoyer le message</font></b></html>", x vaut 150, y vaut 230, visible vaut "non"//
// Console pour les messages d'erreurs
tableau est un xtableau, x vaut 5, y vaut 280, largeur vaut 785, hauteur vaut 140
// Info serveur
e_ip est un étiquette, texte vaut "Serveur : ", x vaut 114, y vaut 234, visible vaut "oui"
c_ip est un champ, x vaut 162, y vaut 233, texte vaut "", visible vaut "oui"
e_port est un étiquette, texte vaut "Port : ", x vaut 332, y vaut 234, visible vaut "oui"
c_port est un champ, x vaut 362, y vaut 233, texte vaut "7780", taille vaut 5, visible vaut "oui"
connecter est un bouton, texte vaut "<html><b><font color=blue>Connecter</font></b></html>", x vaut 10, y vaut 230
deconnecter est un bouton, texte vaut "<html><b><font color=red>Déconnecter</font></b></html>", x vaut 10, y vaut 230, visible vaut "non"
// Listes des présents sur la messagerie
amis est un bouton, texte vaut "<html><b><font color=blue>Amis présents</font></b></html>", x vaut 651, y vaut 5, visible vaut "non", icône vaut "icones_groupe_1.png", couleurtexte vaut ""
scrolleur est un scrolleur, largeur vaut 140, hauteur vaut 200, x vaut 650, y vaut 37, visible vaut "non"
liste est un liste, valeurs vaut "", x vaut 20, y vaut 40, visible vaut "non"
// Émoticones intégrés
Coeur est un bouton, couleurfond vaut "", couleurtexte vaut "rouge", icône vaut "", infobulle vaut "♡", texte vaut "<html><font size=4><b>♡</b></font></html>", visible vaut "oui", x vaut 240, y vaut 5
Coeurplein est un bouton, couleurfond vaut "", couleurtexte vaut "rouge", icône vaut "coeur_battant.gif", infobulle vaut "", texte vaut "<html><font size=4><b></b></font></html>", visible vaut "oui", x vaut 280, y vaut 5
lettre est un bouton, couleurfond vaut "", couleurtexte vaut "bleu", icône vaut "", infobulle vaut "lettre", texte vaut "<html><font size=4><b></b></font></html>", visible vaut "oui", x vaut 333, y vaut 5
téléphone est un bouton, couleurfond vaut "", couleurtexte vaut "bleu", icône vaut "", infobulle vaut "téléphone", texte vaut "<html><font size=4><b></b></font></html>", visible vaut "oui", x vaut 376, y vaut 5
fleur est un bouton, couleurfond vaut "", couleurtexte vaut "bleu", icône vaut "", infobulle vaut "fleur", texte vaut "<html><font size=4><b>❀</b></font></html>", visible vaut "oui", x vaut 421, y vaut 5
content est un bouton, couleurfond vaut "", couleurtexte vaut "orange brûlée", icône vaut "", infobulle vaut "content", texte vaut "<html><font size=4><b></b></font></html>", visible vaut "oui", x vaut 464, y vaut 5
content1 est un bouton, couleurfond vaut "", couleurtexte vaut "orange brûlée", icône vaut "", infobulle vaut "content", texte vaut "<html><font size=4><b>☻</b></font></html>", visible vaut "oui", x vaut 509, y vaut 5
débousolé est un bouton, couleurfond vaut "", couleurtexte vaut "orange brûlée", icône vaut "débousolé.png", infobulle vaut "content", texte vaut "<html><img scr=></html>", visible vaut "oui", x vaut 554, y vaut 5
démarrage :
ajoute planche dans form
ajoute panneau1 dans planche
ajoute planche2 dans planche // pour que la planche2 soit en-dessous de la planche1
ajoute tableau dans planche2 // Pour adapter le tableau à la fenetre
ajoute amis & boite_titre & Coeur & Coeurplein & lettre & téléphone & fleur & content & content1 & débousolé & b1 & info & indentifiant & e_ip & c_ip & e_port & c_port & connecter & deconnecter & boite & scrolleur dans panneau1
ajoute liste dans scrolleur
form.changementdimension(vrai)
fais réagir Coeur à "clic souris" pour Émoticônes
fais réagir Coeurplein à "clic souris" pour Émoticônes
fais réagir lettre à "clic souris" pour Émoticônes
fais réagir téléphone à "clic souris" pour Émoticônes
fais réagir fleur à "clic souris" pour Émoticônes
fais réagir content à "clic souris" pour Émoticônes
fais réagir content1 à "clic souris" pour Émoticônes
fais réagir débousolé à "clic souris" pour Émoticônes
fais réagir amis à "clic souris" pour actualisation liste amis
fais réagir boite à "clic souris" pour envoyer message
fais réagir b1 à "clic souris" pour envoyer message
fais réagir connecter à "clic souris" pour connexion
fais réagir deconnecter à "clic souris" pour déconnexion
fais réagir form à "clic souris" pour quitter
texte@indentifiant vaut client.nommachine()
// Chargement des données sauvegardées :
si configuration.vérifier("login") lis
texte@indentifiant vaut configuration.récupérer("login")
texte@c_ip vaut configuration.récupérer("serveur")
texte@c_port vaut configuration.récupérer("port")
ferme
appelle liste amis
tant que vrai temporise
attendre message :
message est un packet // packet reçu
début
tant que vrai lis
essaie lis
// On attend un message du serveur :
message vaut client.recevoir()
// Commande PING
si (commande@message) = "ping" parcours pong
// Commande VERSION
sinon si (commande@message) = "version" affiche "version du serveur : " + message@message
// Commande LISTE AMIS
sinon si (commande@message) = "liste amis", valeurs@liste vaut message@message
// Autres commandes, on affiche le message ...
sinon lis
joue "page_tourné.wav"
affiche nom@message + "(" + horodatage@message + ") > " + message@message + "
________________________________________________________________________________________"
form.clignoter()
ferme
ferme
sinon lis
affiche "Connexion perdue avec le serveur"
parcours changer affichage avec "oui", "non"
visible@deconnecter vaut "non"
attends 0.500 seconde
visible@connecter vaut "oui"
reviens
ferme
ferme
envoyer message :
message est un packet // packet à envoyer
début
message@message vaut texte@boite
commande@message vaut "parler"
nom@message vaut texte@indentifiant
parcours horodater avec message
client.envoyer(message) // Envoi du packet au serveur
texte@boite vaut ""
reviens
connexion :
port est un nombre
début
configuration.stocker("serveur",texte@c_ip)
configuration.stocker("port",texte@c_port)
configuration.stocker("login",texte@indentifiant)
essaie lis
visible@connecter vaut "non"
convertis texte@c_port en port
client.connexion(texte@c_ip, port) // établis la connexion
//affiche "nous sommes connecté au serveur ..."
parcours version
parcours historique
appelle attendre message
parcours changer affichage avec "non", "oui"
visible@deconnecter vaut "oui"
ferme
sinon lis
affiche "impossible de se connecter ..."
visible@deconnecter vaut "non"
attends 0.200 seconde
visible@connecter vaut "oui"
ferme
reviens
quitter :
message est un packet // packet à envoyer
début
nom@message vaut texte@indentifiant
commande@message vaut "quitter"
affiche "nous quittons le serveur ..."
essaie client.envoyer(message) // envoie un message pour quitter le serveur
termine
déconnexion :
message est un packet // packet à envoyer
début
nom@message vaut texte@indentifiant
commande@message vaut "quitter"
affiche "nous quittons le serveur ..."
client.envoyer(message) // Envoi un message pour quitter le serveur
parcours changer affichage avec "oui", "non"
visible@connecter vaut "oui"
visible@deconnecter vaut "non"
reviens
changer affichage : état 1 , état 2
visible@e_ip vaut état 1
visible@c_ip vaut état 1
visible@e_port vaut état 1
visible@c_port vaut état 1
// Retire de l'affichage ce qui suit, ou inversement
visible@boite vaut état 2
visible@boite_titre vaut état 2
visible@b1 vaut état 2
visible@scrolleur vaut état 2
visible@amis vaut état 2
visible@liste vaut état 2
reviens
liste amis :
message est un packet // packet à envoyer
début
commande@message vaut "liste amis"
tant que vrai lis
nom@message vaut texte@indentifiant
essaie client.envoyer(message)
sinon valeurs@liste vaut ""
attends 3 secondes
ferme
actualisation liste amis :
message est un packet // packet à envoyer
début
nom@message vaut texte@indentifiant
commande@message vaut "actualisation liste amis"
valeurs@liste vaut ""
essaie client.envoyer(message)
reviens
horodater :
* message est un packet
début
horodatage@message vaut heure + "h" + minute + " le {jour}/{mois}/{année}"
reviens
version :
message est un packet // packet à envoyer
début
commande@message vaut "version"
nom@message vaut texte@indentifiant
essaie client.envoyer(message)
reviens
historique :
message est un packet // packet à envoyer
début
commande@message vaut "historique"
nom@message vaut texte@indentifiant
affiche (nom@message)
essaie client.envoyer(message)
reviens
pong :
message est un packet // packet à envoyer
début
commande@message vaut "pong"
nom@message vaut texte@indentifiant
essaie client.envoyer(message)
reviens
Émoticônes : b3
début
si b3 = Coeur, lis
texte@boite prend texte@boite + "♡"
ferme
si b3 = Coeurplein, lis
texte@boite prend texte@boite + ""
ferme
si b3 = lettre, lis
texte@boite prend texte@boite + ""
ferme
si b3 = téléphone, lis
texte@boite prend texte@boite + ""
ferme
si b3 = fleur, lis
texte@boite prend texte@boite + "❀"
ferme
si b3 = content, lis
texte@boite prend texte@boite + ""
ferme
si b3 = content1, lis
texte@boite prend texte@boite + "☻"
ferme
si b3 = débousolé, lis
texte@boite prend texte@boite + icône@débousolé
ferme
fermer la fenêtre :
début
// Si connecté
essaie parcours déconnexion
termine
I/ Problèmes d'image :
1) Le dernier icône :
J'arrive à faire apparaître parfaitement différents types d'icônes à partir de l'attribut "icône". Mais je n'arrive pas à faire apparaître le dernier icône, à partir du de l'attribut "texte" du bouton, qui montre une Carré avec une croix au milieu...
2) Quid pour insérer d'image dans une boite ou un xtableau :
Je n'ai pour l'instant pas réussi à insérer une image que cela soit dans une "boite" ou un "xtableau". J'ai essayé d'utiliser "boiteriche", mais cela ne fonctionne pas du tout.
II/ Problème de coloration de texte :
Je n'ai pas réussi, malgré de nombreuses tentatives de colorer le texte@indentifiant sur le "xtableau"... C'est bien dommage parce qu'on arrive très bien à colorier le texte des boutons ou des étiquettes...
Voilà j'ai besoin d'aide pour tout cela_______
En P.J.: Important vous devez placer les images et le son, dans le même dossier que la messagerie :
1) Pour les images :
2) Pour le son : vous devez le télécharger puis le renommer "page_tourné.wav"
page_tourné.wav
3) Pour le serveur : avec dans le même dossier :
- Le livre TCPCommun.liv :
Code:
espèces
nom est un texte
message est un texte
horodatage est un texte
commande est un texte
espèce packet contient nom, message, commande, horodatage
principale :
début
affiche "rien à faire..."
horodater :
* message est un packet
début
horodatage@message vaut heure + "h" + minute + "m le {jour}/{mois}/{année}"
reviens
- Et le livre TCPServeur.liv :
Code:
/*
Serveur d'un salon de discution virtuel
*/
greffons tcpclient, configuration
bibliothèque
commun référence TCPCommun.liv
espèces
nom est un texte
socket est un nombre
espèce messager contient nom, socket
globale
VERSION_SERVEUR est un nombre valant 0.2
PORT est un nombre valant 7780
HISTORIQUE_MAX est un nombre valant 20
serveur est un tcpserveur
clients est un casier de messager
bavard est un drapeau valant faux
form est un formulaire, titre vaut "Le serveur de messagers Linotte", largeur vaut 470, hauteur vaut 400
tableau est un xtableau, x vaut 10, y vaut 10, largeur vaut 420, hauteur vaut 280
bienvenue est un champ, taille vaut 50, x vaut 10, y vaut 300, texte vaut "Bienvenue sur la messagerie Linotte sur le serveur " + serveur.ip()
deconnecter est un bouton, texte vaut "Arrêter le serveur", x vaut 10, y vaut 350
historique est un casier de packet
démarrage :
début
ajoute tableau & deconnecter & bienvenue dans form
fais réagir deconnecter à "clic souris" pour déconnexion
fais réagir form à "clic souris" pour déconnexion
form.changementdimension(faux)
// On démarre le serveur :
serveur.démarrer(PORT)
affiche "Serveur démarré"
affiche "IP de la machine " + serveur.ip()
affiche "PORT du serveur " + PORT
essaie lis
tant que vrai lis
client est un messager
si bavard, affiche "! on attend l'ouverture d'une nouvelle socket..."
socket@client vaut serveur.attendreconnexion()
//affiche "! un client sur la socket " + socket@client + " vient de se connecter !"
ajoute client dans clients
appelle gestion client avec client
ferme
ferme
affiche "! le serveur est arrêté..."
attends 2 secondes
gestion client :
* client est un messager
début
// On va effectuer une commande ping pour obtenir son identifiant.
parcours ping avec client
essaie lis
tant que vrai lis
message est un packet
message vaut serveur.recevoir(socket@client)
si bavard, affiche "< le client " + nom@message + " a dit : " + message@message
nom@client vaut nom@message
si bavard, affiche "< commande reçue : " + commande@message
// *******************
// Commande HISTORIQUE
// *******************
si (commande@message) == "historique" lis
si bavard, affiche "Historique demandé"
pour chaque historique lis
essaie serveur.envoyer(socket@client, joker)
ferme
ferme
// ****************
// Commande VERSION
// ****************
sinon si (commande@message) == "version" lis
message2 est un packet
si bavard, affiche "Version demandée"
commande@message2 vaut "version"
message@message2 vaut "version " + VERSION_SERVEUR + ", il est " + heure + "h " + minute + "m " + seconde + "s, Linotte " + version + "
" + texte@bienvenue
essaie serveur.envoyer(socket@client, message2)
sinon lis
affiche "! impossible d'envoyer la version à " + nom@joker
ferme
ferme
// *******************
// Commande LISTE AMIS
// *******************
sinon si (commande@message) == "liste amis" lis
amis est un texte
message2 est un packet
pour chaque clients, amis vaut amis + nom@joker + "|"
si bavard, affiche "Liste d'amis : " + amis
commande@message2 vaut "liste amis"
message@message2 vaut amis
essaie serveur.envoyer(socket@client, message2)
sinon lis
affiche "! impossible d'envoyer la liste d'amis à " + nom@joker
ferme
ferme
// ****************
// Commande PONG
// ****************
sinon si (commande@message) == "pong" lis
affiche "Ping pong avec " + nom@client + " sur la socket n°" + socket@client
ferme
// ****************
// Commande QUITTER
// ****************
sinon si (commande@message) == "quitter" lis
ôte client de clients
serveur.fermer(socket@client)
affiche "! Le client " + nom@client + " a quitter le serveur sur la socket n°" + socket@client
reviens
ferme
// ***************
// Commande PARLER
// ***************
sinon si (commande@message) == "parler" lis
parcours historiser avec message
// Propagation de la discution...
appelle propager message avec message
ferme
sinon lis
affiche "! je ne sais pas quoi faire de cette commande " + commande@message
ferme
ferme
ferme
sinon lis
affiche "! Le client " + nom@client + " a perdu la connexion sur la socket n°" + socket@client
ôte client de clients
ferme
propager message :
* message est un packet
début
pour chaque clients lis
si bavard, affiche "> envoyer le message '" + message@message + "' de " + nom@message + " à " + nom@joker
essaie serveur.envoyer(socket@joker, message)
sinon lis
affiche "! impossible d'envoyer le message à " + nom@joker
ferme
ferme
historiser :
*message est un packet
taille est un nombre
début
// On veut garder les dix dernières messages en mémoire
ajoute message dans historique
mesure historique dans taille
tant que taille > HISTORIQUE_MAX lis
ôte historique{0} de historique
mesure historique dans taille
ferme
reviens
déconnexion :
début
affiche "! on ferme toutes les sockets ouvertes avec le serveur"
pour chaque clients lis
affiche "! on termine la connexion avec " + nom@joker
essaie serveur.fermer(socket@joker)
ferme
affiche "! bye bye !"
serveur.arrêter()
reviens
ping :
*client est un messager
message est un packet
début
commande@message vaut "ping"
essaie serveur.envoyer(socket@client, message)
sinon lis
affiche "! impossible d'envoyer un ping sur le socket " + socket@client
ferme
reviens
Le serveur sert de relais entre les différentes messageries possibles. Vous pouvez le démarrer directement sans passer par l'atelier, et ensuite ouvrir votre messagerie qui se connectera au serveur...
ATTENTION : vérifier bien que le "Port" est identique pour le Serveur et la messagerie. Si un problème intervient, changer de "Port" sur les deux livres, en prenant par exemple "7782".