Labo

Sign in or create your account | Project List | Help

Labo Commit Details

Date:2008-11-26 16:50:59 (1 year 9 months ago)
Author:naps
Commit:0dd7737d33d4aa91a59cd31ad6bef7918707c8ba
Message:Import of ajaxchat (old svn-revisions lost)

Files: ajaxchat/addmessage.py (1 diff)
ajaxchat/ajaxchat.js (1 diff)
ajaxchat/chat.html (1 diff)
ajaxchat/chat.py (1 diff)
ajaxchat/messages.db (0 diffs)
ajaxchat/messages.id (1 diff)
ajaxchat/messages.xml (1 diff)
ajaxchat/sendmessage.gif (0 diffs)
ajaxchat/style.css (1 diff)
ajaxchat/updating.gif (0 diffs)

Change Details

ajaxchat/addmessage.py
1#!/usr/bin/env python
2# -*- coding: utf8 -*-
3
4print "Content-Type: text/html"
5print
6
7import cgi
8import fcntl
9from xml.dom import minidom
10from md5 import md5
11
12# Récupération du message de l'utilisateur :
13replace_map_nick = {
14    '\n':'',
15    '\r':'',
16    ' ':'',
17    ':':'',
18}
19replace_map_message = {
20    '\n':'',
21    '\r':'',
22}
23contenu_formulaire = cgi.FieldStorage()
24message = contenu_formulaire.getvalue('message','')
25for to, by in replace_map_message.items(): message = message.replace(to, by)
26nick = contenu_formulaire.getvalue('nick','Anonyme')
27for to, by in replace_map_nick.items(): nick = nick.replace(to, by)
28if not(nick): nick = 'Anonyme'
29
30# Ouverture de l'ancien fichier dans un arbre dom :
31
32document = minidom.parse('messages.xml')
33root = document.getElementsByTagName('chat')[0]
34index = root.getAttributeNode('index').nodeValue
35
36xml_miaou = document.createElement('miaou')
37xml_id = document.createElement('id')
38xml_id.appendChild(document.createTextNode(index))
39xml_nick = document.createElement('nick')
40xml_nick.setAttribute('color', str(int(md5(nick).hexdigest()[0], 16)))
41xml_nick.appendChild(document.createTextNode(nick))
42xml_message = document.createElement('message')
43xml_message.appendChild(document.createTextNode(message))
44
45xml_miaou.appendChild(xml_id)
46xml_miaou.appendChild(xml_nick)
47xml_miaou.appendChild(xml_message)
48root.appendChild(xml_miaou)
49
50index = str(int(index) + 1)
51root.setAttribute('index', index)
52
53messages_xml = open('messages.xml', 'w')
54fcntl.flock(messages_xml.fileno(), fcntl.LOCK_EX) # Gestion des accès concurrents
55
56messages_xml.write(document.toprettyxml())
ajaxchat/ajaxchat.js
1function ajax_updatechat() {
2    /* Mettre à jour les messages du chat */
3    document.getElementById("updating").style.visibility = 'visible';
4    var xhr = null;
5    if (window.XMLHttpRequest) {
6        xhr = new XMLHttpRequest();
7    }
8    else if (window.ActiveXObject) {
9        xhr = new ActiveXObject("Microsoft.XMLHTTP");
10    }
11    else {
12        alert("Votre navigateur n'est pas supporté par cette application");
13    }
14
15    xhr.onreadystatechange = function() {
16        if (xhr.readyState == 4) { // Quand c'est tout prêt
17            var chatXML = xhr.responseXML.documentElement;
18            var miaous = chatXML.getElementsByTagName('miaou');
19            for (i = 0; i < miaous.length; i++) {
20                var id = miaous[i].getElementsByTagName('id')[0].firstChild.data
21                var nick = miaous[i].getElementsByTagName('nick')[0].firstChild.data;
22                var nickcolor = miaous[i].getElementsByTagName('nick')[0].attributes.getNamedItem('color').nodeValue;
23                var msg = miaous[i].getElementsByTagName('message')[0].firstChild.data;
24                if (parseInt(id) > window.last_id) {
25                    // Création du li
26                    var li = document.createElement('li');
27                    var nickspan = document.createElement('span');
28                    var nickspancolor = document.createAttribute('class');
29                    nickspancolor.value = 'nick'+nickcolor;
30                    nickspan.setAttributeNode(nickspancolor);
31                    nickspan.appendChild(document.createTextNode('<'+nick+'> '));
32                    li.appendChild(nickspan);
33                    li.appendChild(document.createTextNode(msg));
34                    // Et ajout dans l'ul
35                    document.getElementById("chat").appendChild(li);
36                    // Autoscroll de la liste :
37                    var scroll = document.getElementById("chat").scrollHeight - document.getElementById("chat").offsetHeight
38                    document.getElementById("chat").scrollTop = scroll+100 // +100 pour éviter les dépassements :)
39                    window.last_id = parseInt(id);
40                }
41
42            }
43            document.getElementById("updating").style.visibility = 'hidden';
44        }
45    };
46
47    xhr.open('GET', 'http://lab.inaps.org/ajax-chat/chat.py?lastid='+encodeURIComponent(window.last_id), true);
48    xhr.send(null);
49
50}
51
52function ajax_sendmessage(event) {
53    /* Envoyer un message sur le chat */
54    document.getElementById("sendmessage").style.display = 'none';
55    document.getElementById("sending").style.display = 'inline';
56    var xhr = null;
57    if (window.XMLHttpRequest) {
58        xhr = new XMLHttpRequest();
59    }
60    else if (window.ActiveXObject) {
61        xhr = new ActiveXObject("Microsoft.XMLHTTP");
62    }
63    else {
64        alert("Votre navigateur n'est pas supporté par cette application");
65    }
66
67    xhr.onreadystatechange=function() {
68        if(xhr.readyState == 4) {
69                document.getElementById("message").value = '';
70                document.getElementById("sending").style.display = 'none';
71                document.getElementById("sendmessage").style.display = 'inline';
72                ajax_updatechat();
73        }
74    };
75    xhr.open("POST", "addmessage.py", true);
76    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
77    xhr.send('message=' + encodeURIComponent(document.getElementById("message").value) + '&amp;nick=' + encodeURIComponent(document.getElementById("nick").value));
78    event.preventDefault(); // Annuler l'envois du formulaire
79}
80
81function onUpdateChat(event) {
82    ajax_updatechat();
83    event.preventDefault();
84}
85
86function addEvent(element, event, func) {
87    /* Ajouter un évènement sur un élément */
88    if (element.addEventListener)
89        element.addEventListener(event, func, false);
90    else if (element.attachEvent)
91        element.attachEvent("on" + event, func);
92}
93
94function onSwitchAutorefresh(event) {
95    if (window.autoresfresh == 1) {
96        // autorefresh off !!
97        document.getElementById("autoupdate").src = 'autoupdate_off.png';
98        document.getElementById("manualupdate").src = 'manual_update.png';
99        window.clearInterval(window.autorefreshinterval);
100        window.autoresfresh = 0;
101    }
102    else {
103        // autorefresh on !!
104        document.getElementById("autoupdate").src = 'autoupdate_on.png';
105        document.getElementById("manualupdate").src = 'manual_update_disabled.png';
106        window.autorefreshinterval = window.setInterval(ajax_updatechat, 2000);
107        window.autoresfresh = 1;
108    }
109    event.preventDefault();
110}
111
112function onLoadEvent(event) {
113    /* Evenement exécuté à la fin du chargement de la page */
114    ajax_updatechat();
115    document.getElementById("nick").value = 'Chatteur' + Math.floor(Math.random() * 100);
116    addEvent(document.getElementById("formmsg"), 'submit', ajax_sendmessage);
117    addEvent(document.getElementById("manualupdateevent"), 'click', onUpdateChat);
118    // Par défaut : lancer le mode autorefresh
119    document.getElementById("manualupdate").src = 'manual_update_disabled.png'
120    window.autorefreshinterval = window.setInterval(ajax_updatechat, 2000);
121    window.autoresfresh = 1;
122    addEvent(document.getElementById("autoupdateevent"), 'click', onSwitchAutorefresh);
123}
124
125var last_id = 0;
126var autorefresh;
127var autorefreshinterval;
128addEvent(window, 'load', onLoadEvent);
ajaxchat/chat.html
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
4    <head>
5        <title>Chat ajax</title>
6        <script type="text/javascript" src="ajaxchat.js"></script>
7        <link rel="stylesheet" type="text/css" href="style.css" media="screen" />
8    </head>
9    <body>
10
11        <div id="chatbox">
12            <ul id="panel">
13                <li><img src="updating.gif" id="updating" name="updating" style="visibility: hidden;" alt="Mise à jour..." /></li>
14                <li><a href="" id="autoupdateevent" title="Activer/désactiver la mise à jour automatique"><img src="autoupdate_on.png" id="autoupdate" name="autoupdate" alt="Activer/desactiver la mise à jour automatique" /></a></li>
15                <li><a href="" id="manualupdateevent" title="Mise à jour manuelle"><img src="manual_update.png" id="manualupdate" name="manualupdate" alt="Mise à jour manuelle" /></a></li>
16            </ul>
17
18            <ul id="chat"></ul>
19
20            <form id="formmsg" action="" method="post">
21                <input type="text" title="Votre pseudo" name="nick" id="nick" value="" />
22                <input type="text" name="message" id="message" value="" />
23                <input type="submit" id="sendmessage" name="sendmessage" value="Ok" />
24                <img src="sendmessage.gif" id="sending" name="sending" style="display: none;" alt="Envois en cours..." />
25            </form>
26        </div>
27    </body>
28</html>
ajaxchat/chat.py
1#!/usr/bin/env python
2
3print 'Content-Type: text/xml\n'
4
5import cgi
6from md5 import md5
7from xml.dom.minidom import Document
8from xml.dom import minidom
9
10get = cgi.FieldStorage()
11lastid = int(get.getvalue('lastid','0'))
12document = Document()
13root = document.createElement('chat')
14document.appendChild(root)
15
16real_document = minidom.parse('messages.xml')
17real_root = real_document.getElementsByTagName('chat')[0]
18
19real_miaous = real_root.getElementsByTagName('miaou')
20for real_miaou in real_miaous:
21    real_id = int(real_miaou.getElementsByTagName('id')[0].firstChild.data)
22    if real_id > lastid:
23        root.appendChild(real_miaou)
24
25print document.toxml()
ajaxchat/messages.db
ajaxchat/messages.id
11
ajaxchat/messages.xml
1<?xml version="1.0"?>
2<chat index="2">
3    <miaou>
4        <id>1</id>
5        <nick color="6">NaPs</nick>
6        <message>Message par defaut :)</message>
7    </miaou>
8</chat>
ajaxchat/sendmessage.gif
ajaxchat/style.css
1#chatbox {
2    margin: 0 auto 0 auto;
3    border: solid 1px black;
4    width: 55em;
5}
6
7#formmsg {
8    position: relative;
9    padding: 1em;
10    background: #DDD;
11}
12
13#panel {
14    float: right;
15    margin: 0;
16    padding: 0.3em;
17    display: inline;
18}
19
20#panel li {
21    list-style: none;
22}
23
24#panel li img {
25    border: 0;
26}
27
28#nick {
29    width: 7.8em;
30}
31
32#message {
33    width: 35em;
34}
35
36#chat {
37    margin: 0.5em;
38    padding: 0;
39    height: 30em;
40    overflow: auto;
41}
42
43#chat li {
44    list-style: none;
45}
46
47#chat li span {
48    font-weight: bold;
49}
50
51
52.nick0 {
53    color: #000000;
54}
55.nick1 {
56    color: #A020F0;
57}
58.nick2 {
59    color: #FFA500;
60}
61.nick3 {
62    color: #4D4D4D;
63}
64.nick4 {
65    color: #1E90FF;
66}
67.nick5 {
68    color: #ADD8E6;
69}
70.nick6 {
71    color: #FF0000;
72}
73.nick7 {
74    color: #FFFF00;
75}
76.nick8 {
77    color: #00FF00;
78}
79.nick9 {
80    color: #FFC0CB;
81}
82.nick10 {
83    color: #8B6914;
84}
85.nick11 {
86    color: #A52A2A;
87}
88.nick12 {
89    color: #4D4D4D;
90}
91.nick13 {
92    color: #A60092;
93}
94.nick14 {
95    color: #706E18;
96}
97.nick15 {
98    color: #42B4B3;
99}
ajaxchat/updating.gif

Archive Download the corresponding diff file

Branches:
master