Programmer avec le langage Linotte
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Programmer avec le langage LinotteConnexion

Besoin d'un conseil sur la programmation en Linotte ?

Le deal à ne pas rater :
Xiaomi Mi Smart Camera 2K Standard Edition (design compact / support ...
11.39 €
Voir le deal

descriptionMessagerie privée en travaux  EmptyMessagerie privée en travaux

more_horiz
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... Smile

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... Question

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... Sad
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 :

Messagerie privée en travaux  Icones11
Messagerie privée en travaux  Dybous11
Messagerie privée en travaux  Coeur_11

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... Smile

ATTENTION Exclamation : 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".

descriptionMessagerie privée en travaux  EmptyRe: Messagerie privée en travaux

more_horiz
Voici ce que cela donne en image :

1) Au lancement du programme :

Messagerie privée en travaux  Messag10

2) Après connection au serveur :

Messagerie privée en travaux  Messag11


P.S.: Le numéro "XXX.XXX.X.XX" correspond à l'adresse ip de votre serveur. Vous pouvez modifier le livre TCPServeur.liv pour que votre adresse ip apparaisse ou pas, à vous de voir. Mais, dans cette exemple je n'ai pas souhaité donner l'adresse ip de ma messagerie privé... Wink
privacy_tip Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
power_settings_newSe connecter pour répondre