Browse Source

initial commit

RenonDis 7 months ago
commit
d688bcc7d1
14 changed files with 688 additions and 0 deletions
  1. 14 0
      README.md
  2. BIN
      front-desk-bell.mp3
  3. 2 0
      history.css
  4. 34 0
      history.php
  5. 129 0
      history/2018-11-12
  6. 34 0
      history/2018-11-13
  7. 193 0
      index.php
  8. 4 0
      jquery.min.js
  9. 81 0
      post.php
  10. 47 0
      server.php
  11. 9 0
      setup.ini
  12. 93 0
      style.css
  13. 1 0
      tmp/users/flo
  14. 47 0
      users.php

+ 14 - 0
README.md

@@ -0,0 +1,14 @@
1
+## Overview
2
+
3
+It is based on the solution of Gabriel Nava on webside <http://code.tutsplus.com/tutorials/how-to-create-a-simple-web-based-chat-application--net-5931>.
4
+I add a new solution of writing data to files.
5
+
6
+## Features
7
+
8
+1. Free
9
+2. Very simple and performance solution
10
+3. Very simple installation
11
+
12
+## Installation
13
+
14
+1. Copy the repository anywhere on your server

BIN
front-desk-bell.mp3


+ 2 - 0
history.css

@@ -0,0 +1,2 @@
1
+body {padding: 0 2ex;}
2
+table,th,td {border-collapse: collapse; border: 1px solid silver; padding: 0.5em 1ex;}

+ 34 - 0
history.php

@@ -0,0 +1,34 @@
1
+<!DOCTYPE html>
2
+<html lang="pl">
3
+
4
+    <head>
5
+        <title></title>
6
+        <link rel="stylesheet" href="history.css" />
7
+        <meta charset="UTF-8" />
8
+    </head>
9
+
10
+    <body>
11
+
12
+<?php
13
+
14
+foreach (glob('./history/*') as $f) {
15
+    
16
+    echo '<h1>'.basename($f).'</h1>';
17
+    
18
+    $data = file($f, FILE_IGNORE_NEW_LINES);
19
+    echo '<table>';
20
+    foreach ($data as $e) {
21
+        $d = explode('&', $e);
22
+        echo '<tr>'
23
+                .'<td>'.date('H:i:s', (int)$d[0]).'</td>'
24
+                .'<td>'.$d[1].'</td>'
25
+                .'<td>'.$d[2].'</td>'
26
+            .'</tr>';
27
+    }
28
+    echo '</table>';
29
+}
30
+
31
+?>
32
+    
33
+    </body>
34
+</html>

+ 129 - 0
history/2018-11-12

@@ -0,0 +1,129 @@
1
+1542016520-5be94e0841538&bill&dazd
2
+1542016526-5be94e0ebe412&nath&kuku bb
3
+1542016527-5be94e0f83bec&bill&salut bb
4
+1542016535-5be94e1789a2a&bill&r
5
+1542016537-5be94e19176c3&bill&e
6
+1542016537-5be94e1981b7e&bill&m
7
+1542016538-5be94e1a4d660&bill&p
8
+1542016538-5be94e1acd4e9&bill&l
9
+1542016540-5be94e1c160f6&bill&i
10
+1542016542-5be94e1e8c2df&bill&/help
11
+1542017786-5be952fa68fc6&jake&zddzd
12
+1542020566-5be95dd6180d3&Flo&Salutations
13
+1542021249-5be960814a768&Flo&bla bla bla blap
14
+1542021453-5be9614d8e370&Flo&chat chat chatt
15
+1542021461-5be9615536cbb&Flo&ceci est un caht
16
+1542021512-5be96188df083&Flo&ého
17
+1542021534-5be9619ee394e&nath&oui
18
+1542021543-5be961a7c2a4b&Flo&ceci est un débat
19
+1542021560-5be961b860155&Anthony&Bonjour
20
+1542021571-5be961c32ac43&Flo&salut !
21
+1542021595-5be961db1794c&nath&hello
22
+1542021658-5be9621a38c6e&simon&salut tout le monde
23
+1542021677-5be9622d1bde4&Flo&heeeello
24
+1542021683-5be96233b87a0&Flo&quelle activité ici
25
+1542021746-5be96272ef660&simon&l'est pas à l'heure la pendule
26
+1542021756-5be9627c47e9a&simon&:)
27
+1542021762-5be962820b668&Flo&en effet
28
+1542021785-5be96299ce447&simon&allez A+
29
+1542021791-5be9629fcf174&Flo&fuseau horaire de la fame
30
+1542021793-5be962a1b08d3&Flo&ciao
31
+1542022097-5be963d172412&Sami&Pouët world!
32
+1542022132-5be963f4c4c33&Sami&Oui, carrément pas à l'heure!
33
+1542022190-5be9642ed6c65&Anthony&c'est agréable une page comme ça toute simple
34
+1542022210-5be96442d5bca&Anthony&il manque quand même une référence à l'auteur
35
+1542022222-5be9644e3c6d6&Flo&càd ?
36
+1542022245-5be9646566566&Flo&salut sami!
37
+1542022249-5be96469088fa&Anthony&ben qui a créé ce chat
38
+1542022263-5be9647769be8&Flo&ah ok, oui en effet
39
+1542022728-5be966483a728&Flo&d
40
+1542023448-5be96918f2fd4&Hugo&putain, on dit l'IRC de pong !^^
41
+1542023457-5be969213b835&Flo&lol
42
+1542023458-5be9692214355&Hugo&on dirait*
43
+1542023480-5be96938cb74f&Flo&on a hésité avec irc en plus
44
+1542023516-5be9695c39b26&Hugo&ok je mets dans mes favoris, (ce qui n'est pas le cas de la solution Marcel, je dois l'admettre^^)
45
+1542023529-5be9696937664&Flo&oh yeah
46
+1542023532-5be9696ce4e22&Hugo&Merci Flo, c'est cool ! 
47
+1542023538-5be969729e505&Claude MIRODATOS&on dirait que même un papy (69 ce jour) arrive à chatemitter. Bravo au concepteur
48
+1542023562-5be9698a5dcc0&Flo&joyeux anniversaire claude!!!
49
+1542040400-5be9ab5099805&Flo&tes
50
+1542040424-5be9ab689d22d&Flo&c'est bon pour l'heure
51
+1542040448-5be9ab8095722&Claude&Merci, ça change un peu du mémorio-itinérant-compulsif qui est censé nous gouverner!
52
+1542040499-5be9abb3c68fc&Flo&le débat est ouvert
53
+1542040719-5be9ac8f87850&Tof (tp)&Yeaaaa Magnifique Flo !
54
+1542040800-5be9ace081d77&Flo&le chat high tech
55
+1542041098-5be9ae0a444e7&Flo&en français maintenant
56
+1542041518-5be9afae03ca0&Flo&testtsts
57
+1542042096-5be9b1f0ad054&Flo&test
58
+1542042394-5be9b31ae9d75&Flo&restettest
59
+1542045279-5be9be5f9c9b4&Flo&adz
60
+1542046513-5be9c3312433a&Flo&plop
61
+1542047905-5be9c8a1bdc3b&Flo&as
62
+1542049178-5be9cd9a64f64&Flo&zd
63
+1542049226-5be9cdca926dd&Flo&plo
64
+1542052974-5be9dc6e3e262&gaelle souba&wesh ç'est cool, mais ça veut dire qu'il faut avoir la démarche d'aller sur cette interface pour parler de choses et d'autre.
65
+1542053053-5be9dcbdbc694&gaelle souba&je reste une inconditionnelle du mail, afin de limiter, aux trois boites que j'ai déjà, le nombre d'interfaces de discussion.....
66
+1542053104-5be9dcf096872&Flo&héééééélo
67
+1542053145-5be9dd197da9e&Flo&ce qu'on peut faire, c'est quand on voit qu'une conv mail s'éternise, on file le lien d'ici, et on continue la discussion
68
+1542053159-5be9dd2754ec8&Flo&quitte à donner un rdv virtuel
69
+1542059485-5be9f5dd550e5&Flo&az
70
+1542060652-5be9fa6c0f829&marie&Miaou
71
+1542060666-5be9fa7a91fb4&Flo&hello !!
72
+1542060746-5be9facabdce9&marie&Oh, mais il y a du monde dans ce rectangle blanc !
73
+1542060751-5be9facfbf54f&marie&bon anniversaire Claude !
74
+1542060769-5be9fae12eb65&Flo&c'est la méga teuf
75
+1542060779-5be9faeb4be9b&marie&confetti confetti
76
+1542060787-5be9faf371220&marie&tu peux ajouter des émoticones confettis stp ?
77
+1542060795-5be9fafb85f07&Flo&:confetti:
78
+1542060797-5be9fafdc7e36&Flo&voilà
79
+1542060801-5be9fb01a9a00&marie&c'est important pour le teazm building les confettis
80
+1542060820-5be9fb147a878&marie&ahah
81
+1542060830-5be9fb1ed08b4&marie&je comprend pas du tout à quoi sert ce chat
82
+1542060840-5be9fb28a0e59&marie&mais tu nous expliqueras tout la prochaine fois qu'on se voit ?
83
+1542060858-5be9fb3a26993&Flo&ne pas encombrer les mails je crois
84
+1542060871-5be9fb479a5ab&marie&et tu peux faire un chat différent par sujet ?
85
+1542060878-5be9fb4ee5ff8&marie&ou bien on appelle ça un FORUM ?
86
+1542060895-5be9fb5f3ccf9&Flo&il peut y avoir plusieurs salons de discussions oui
87
+1542060896-5be9fb6049928&marie&(dans ma tête je suis bien plus âgée que Claude) :-P
88
+1542060912-5be9fb70e87e4&marie&il est confortable celui-là tu me diras
89
+1542060924-5be9fb7c85201&Flo&pas de compte au moins
90
+1542060939-5be9fb8be75bb&Flo&mais faut quand même avoir la folle idée d'y aller
91
+1542060998-5be9fbc6b3a62&marie&On peut par exemple envoyer un mail qui dit &quot;salut il y a un plan super avec des majorettes qui font la fête à Macron ce weekend, dites si vous voulez participer et si vous voulez acheter des costumes sur ce lien&quot;
92
+1542061014-5be9fbd602032&Flo&oui je pensais à ça
93
+1542061021-5be9fbdd5ce90&marie&mmm ok
94
+1542061040-5be9fbf07a436&Flo&ou genre on en discute vers telle heure à cette url
95
+1542061056-5be9fc00a17fc&marie&autant se donner rdv dans un café à ce compte-là :)
96
+1542061057-5be9fc01225b7&Flo&on verra dans la pratique
97
+1542061082-5be9fc1af3b1a&marie&ok. Après plusieurs bières et avec un schéma sur une nappe en papier, il y a moyen que tu réussise à me convaincre
98
+1542061170-5be9fc723dcdc&marie&en attendant merci déjà 
99
+1542061193-5be9fc89ad459&Flo&merci nath aussi :)
100
+1542061209-5be9fc99e74c1&marie&mais oui elle est où nath ? y a pas son nom dans le rectangle :-)
101
+1542061211-5be9fc9bac193&Flo&pour le ptit bout d'internet
102
+1542061216-5be9fca07640d&marie&merci nath si tu passes par là
103
+1542061233-5be9fcb1414d7&Flo&tu vois un autre rectangle ici ?
104
+1542061272-5be9fcd80ef8c&marie&en tout cas ça me fait remonter un paquet de souvenir d'arrière salle de CDI du collège ce chat. Donc vraiment merci Nath et Flo, juste pour ça !
105
+1542061275-5be9fcdbe98f9&marie&non je vois un z
106
+1542061279-5be9fcdfc49a9&marie&et beaucoup de a
107
+1542061290-5be9fceac645b&Flo&ah en effet
108
+1542061298-5be9fcf2acd5f&marie&j'ai l'impression d'être chez le dentiste. Va falloir arrêter de dire a
109
+1542061328-5be9fd10c317a&Flo&le design du chat est confié à des professionnels
110
+1542061377-5be9fd41101c9&Flo&je pense que ça serait pas mal d'afficher les personnes connectés à droite
111
+1542061380-5be9fd4475de6&marie&très pro
112
+1542061384-5be9fd485df44&Flo&histoire de pas parler dans le vent
113
+1542061603-5be9fe23a4b6e&marie&bonne idée. Dis le mail que j'ai reçu dans ma boîte de mychart@altru.org / c'est lié au chat ou rien à voir ?
114
+1542061618-5be9fe32eb7d4&Flo&rien à voir
115
+1542061635-5be9fe4329e8f&Flo&si tu regardes bien : chart != chat
116
+1542061786-5be9fedada76a&Flo&pas de taupe ni de trackers ici
117
+1542061917-5be9ff5d15518&Flo&test test
118
+1542062274-5bea00c2e6779&marie&Entre ton chat et le slack de marcel je me sens comme tiraillée. 
119
+1542062290-5bea00d27f1a6&Flo&ahah
120
+1542062298-5bea00da62432&Flo&ya du monde sur le slack ?
121
+1542062323-5bea00f33637d&marie&on dirait qu'on est 10
122
+1542062361-5bea011931528&Flo&méééééga teuf
123
+1542062377-5bea0129b3470&marie&mais il n'y a pas d'émoticone confetti là-bas non plus
124
+1542062430-5bea015e1225a&Flo&:sad_face:
125
+1542062470-5bea0186cbfe2&marie&par contre ça frime sévere dans un esprti de brain content (cf : https://www.youtube.com/watch?v=fId7HK_qyOg)
126
+1542062542-5bea01ce7014d&Flo&mince
127
+1542062579-5bea01f317560&Flo&ce chat est complètement improductif à l'inverse
128
+1542062951-5bea03674eb26&Trl&Tessst
129
+1542063024-5bea03b0e880e&Flo&ok @ + jvais freeglaner

+ 34 - 0
history/2018-11-13

@@ -0,0 +1,34 @@
1
+1542068300-5bea184cb2bc7&flo&a
2
+1542068301-5bea184d1c75a&flo&a
3
+1542068301-5bea184d59e0b&flo&a
4
+1542068301-5bea184d9e674&flo&a
5
+1542068301-5bea184ddb351&flo&a
6
+1542068302-5bea184e21579&flo&a
7
+1542068302-5bea184e5d4eb&flo&a
8
+1542068302-5bea184e9e54c&flo&a
9
+1542068302-5bea184ed9c24&flo&a
10
+1542068303-5bea184f24f86&flo&a
11
+1542068303-5bea184f6ba5f&flo&a
12
+1542068303-5bea184fa661c&flo&a
13
+1542068303-5bea184ff28b8&flo&a
14
+1542068304-5bea18503735b&flo&a
15
+1542068304-5bea18507c794&flo&a
16
+1542068304-5bea1850c2db8&flo&a
17
+1542068305-5bea185114b15&flo&a
18
+1542068305-5bea185160ddd&flo&a
19
+1542068305-5bea1851a63c6&flo&a
20
+1542068305-5bea1851f3f85&flo&a
21
+1542068306-5bea1852457f7&flo&a
22
+1542068306-5bea18528c5b6&flo&a
23
+1542068306-5bea1852dc819&flo&a
24
+1542068307-5bea185334372&flo&a
25
+1542068307-5bea18537c6ab&flo&a
26
+1542068307-5bea1853c9fe6&flo&a
27
+1542068424-5bea18c8149ea&flo&a
28
+1542068746-5bea1a0a292fe&flo&sha v2
29
+1542070223-5bea1fcf5e990&narf&bonsoir
30
+1542070253-5bea1fed34523&flo&ll
31
+1542098202-5bea8d1aa6061&olivier (tuba)&Premier test du chat FAME
32
+1542098267-5bea8d5b31e37&Hervé&Ah ouais, c'est rudimentaire ! Mais ça peut être utile, pour se filer des rendez-vous de discussion sur un sujet, genre donner un rendez-vous à tout le monde par la mailing list pour discuter des affiches...
33
+1542101361-5bea99718271f&louis&je ne me rappelle plus du nom de mon premier chat. Un gros matou tigré qui s'est volatilisé la veille d'un déménagement. Si j'avais su où ce déménagement et les suivants allaient me mener,j'aurais certainement agi comme lui. Comment se fait-il que lui le savait ?
34
+1542111141-5beabfa55576f&flo&merci Louis pour le partage

+ 193 - 0
index.php

@@ -0,0 +1,193 @@
1
+<?php
2
+
3
+function loginForm() {
4
+	echo'
5
+	<div id="loginform">
6
+	<form action="." method="post">
7
+		<p>Please enter your name to continue:</p>
8
+		<label for="name">Name:</label>
9
+		<input type="text" name="name" id="name" autofocus />
10
+		<input type="submit" name="enter" id="enter" value="Enter" />
11
+	</form>
12
+	</div>
13
+	';
14
+}
15
+
16
+function getSetup($key = null) {
17
+	$arr = parse_ini_file('setup.ini');
18
+	return isset($key) ? $arr[$key] : $arr;
19
+}
20
+
21
+function deleteOldHistory() {
22
+	$expireHistory = getSetup('expire_history');
23
+	$expireDate = date('Y-m-d', strtotime("-$expireHistory day"));
24
+	foreach (glob('./history/*') as $f) {
25
+		if (basename($f) < $expireDate) {
26
+			unlink($f);
27
+		}
28
+	}
29
+}
30
+
31
+
32
+
33
+//-------------------------
34
+
35
+session_start();
36
+
37
+if (isset($_GET['logout'])) {
38
+	session_destroy();
39
+	header("Location: ./"); //Redirect the user
40
+}
41
+
42
+if (isset($_POST['enter'])) {
43
+	if ($_POST['name'] != "") {
44
+		$_SESSION['name'] = stripslashes(htmlspecialchars($_POST['name']));
45
+	} else {
46
+		echo '<span class="error">Please type in a name</span>';
47
+	}
48
+}
49
+?>
50
+<!DOCTYPE html>
51
+<html lang="en">
52
+    <head>
53
+	<title>Chat FAME</title>
54
+	<meta charset="UTF-8" />
55
+	<link type="text/css" rel="stylesheet" href="style.css" />
56
+    </head>
57
+
58
+<?php
59
+if (!isset($_SESSION['name'])) {
60
+	loginForm();
61
+	deleteOldHistory();
62
+} else {
63
+?>
64
+	<div id="wrapper">
65
+	    <div id="menu">
66
+		<p class="welcome">Ceci est le chat de la FAME. Bienvenue à toi <b><?php echo $_SESSION['name']; ?></b> !</p>
67
+		<p class="logout"><a id="exit" href="#">Quitter</a></p>
68
+		<p class="logout" style="margin-right: 1em;"><a target="_blank" href="history.php">Historique</a></p>
69
+		<div style="clear:both"></div>
70
+	    </div>	
71
+	    <div id="datbox">
72
+	    	<div id="chatbox"></div>
73
+		<div id="usrlist"><b>Fameux connectés :</b><br><br><div id="usrs"></div></div>
74
+	    </div>
75
+
76
+	    <form name="message" action=".">
77
+		<input name="usermsg" type="text" id="usermsg" size="63" autocomplete="off" autofocus />
78
+		<input name="submitmsg" type="submit"  id="submitmsg" value="Envoyer" />
79
+	    </form>
80
+
81
+	    <br><input id="mute" name="mode muet" type="checkbox"/> mode muet
82
+	</div>
83
+	<script type="text/javascript" src="jquery.min.js"></script>
84
+	<script type="text/javascript">
85
+	// jQuery Document
86
+	$(document).ready(function() {
87
+		var id = 'undefined';
88
+		var oldId = null;
89
+		var isRunLoadLog = false;
90
+		var audio = new Audio('./front-desk-bell.mp3');
91
+		audio.volume = 0.05;
92
+		//If user submits the form
93
+		$("#submitmsg").click(function() {
94
+			var clientmsg = $("#usermsg").val();
95
+			$("#usermsg").val('');
96
+			$("#usermsg").focus();
97
+			$.ajax({
98
+			type: 'POST',
99
+				url: 'post.php',
100
+				data: {text: clientmsg},
101
+				//cache: false,
102
+				async: true,
103
+				success: function(data) {
104
+					if (!isRunLoadLog) {
105
+						loadLog();
106
+					}
107
+				},
108
+				error: function(request, status, error) {
109
+					$("#usermsg").val(clientmsg);
110
+				},
111
+			});
112
+			return false;
113
+		});
114
+
115
+		function beacon() {
116
+			$.ajax({
117
+			type: 'POST',
118
+				url: 'users.php',
119
+				data: {},
120
+				dataType: 'json',
121
+				//cache: false,
122
+				async: true,
123
+				success: function(data) {
124
+					var html = '';
125
+					for (var usr in data.data) {
126
+						html = html+"<div class='msgln'><em>"+data.data[usr]+"</em></div>";
127
+						$("#usrs").html(html);
128
+					}
129
+				},
130
+			});
131
+		}
132
+
133
+		//Load the file containing the chat log
134
+		function loadLog() {
135
+			isRunLoadLog = true;
136
+			var oldscrollHeight = $("#chatbox")[0].scrollHeight;
137
+			$.ajax({
138
+			type: 'POST',
139
+				url: 'server.php',
140
+				data: {id: id},
141
+				dataType: 'json',
142
+				//cache: false,
143
+				async: true,
144
+				success: function(data) {
145
+					id = data.id;
146
+					$(window).focus(function() {
147
+						document.title = "Chat FAME";
148
+					});
149
+					if (oldId !== id) {
150
+						oldId = id;
151
+						var html = '';
152
+						var date;
153
+						for (var k in data.data.reverse()) {
154
+							date = new Date(parseInt(data.data[k][0])*1000);
155
+							date = date.toLocaleTimeString('en-GB');
156
+							date = date.replace(/([\d]+\D+[\d]{2})\D+[\d]{2}(.*)/, '$1$2');
157
+							html = html
158
+								+"<div class='msgln'>("+date+") <b>"
159
+								+data.data[k][1]+"</b>: "+data.data[k][2]+"<br></div>";
160
+						}
161
+						$("#chatbox").append(html); //Insert chat messages into the #chatbox div
162
+						var newscrollHeight = $("#chatbox")[0].scrollHeight;
163
+						if (newscrollHeight > oldscrollHeight) {
164
+							$("#chatbox").scrollTop($("#chatbox")[0].scrollHeight);
165
+						}    
166
+						document.title = "(1) Chat FAME";
167
+						if (!$("#mute").prop('checked')) {
168
+							audio.play();
169
+						}
170
+					}
171
+					isRunLoadLog = false;
172
+				},
173
+			});
174
+		}
175
+		loadLog();
176
+		beacon();
177
+		setInterval(loadLog, <?php echo getSetup('interval') ?>);	//Reload file every 2.5 seconds
178
+		setInterval(beacon, <?php echo getSetup('interval') ?>);	//Reload file every 2.5 seconds
179
+
180
+		//If user wants to end session
181
+		$("#exit").click(function() {
182
+			var exit = confirm("Voulez-vous vraiment quitter la session ?");
183
+			if (exit == true) {
184
+				window.location = 'index.php?logout=true';
185
+			}
186
+		});
187
+	});
188
+	</script>
189
+<?php
190
+}
191
+?>
192
+</body>
193
+</html>

File diff suppressed because it is too large
+ 4 - 0
jquery.min.js


+ 81 - 0
post.php

@@ -0,0 +1,81 @@
1
+<?php
2
+
3
+function getSetup($key = null) {
4
+    $arr = parse_ini_file('setup.ini');
5
+    return isset($key) ? $arr[$key] : $arr;
6
+}
7
+
8
+
9
+
10
+//$_POST['text'] = 'abc';
11
+session_start();
12
+if (!isset($_SESSION['name'])) return;
13
+$text = isset($_POST['text']) ? $_POST['text'] : '';
14
+if ($text === '') return;
15
+
16
+$isApc = extension_loaded('apc');
17
+
18
+$setup = getSetup();
19
+$time = time();
20
+$date = date('Y-m-d', $time);
21
+$uniqid = uniqid();
22
+$id = $time.'-'.$uniqid;
23
+
24
+$tmpDir = './tmp/';
25
+$historyDir = './history/';
26
+
27
+$tmpFile = $tmpDir.'cache';
28
+$historyFile = $historyDir.$date;
29
+
30
+$fh = @fopen($historyFile, 'a');
31
+if ($fh === false) {
32
+    mkdir($historyDir);
33
+    if (!is_dir($tmpDir)) mkdir($tmpDir);
34
+    $fh = @fopen($historyFile, 'a');
35
+}
36
+
37
+/* start semafore */
38
+flock($fh, LOCK_EX);
39
+
40
+// data
41
+$data = array($id, $_SESSION['name'], stripslashes(htmlspecialchars($text)));
42
+
43
+// write history
44
+fwrite($fh, implode('&', $data)."\n");
45
+
46
+// cache
47
+if ($isApc) {
48
+    $cache = apc_fetch('chat');
49
+    if ($cache === false) {
50
+        $cache = array();
51
+    }
52
+} else {
53
+    $cache = @file_get_contents($tmpFile);
54
+    if ($cache === false) {
55
+        $cache = array();
56
+    } else {
57
+        $cache = unserialize($cache);
58
+    }    
59
+}
60
+
61
+array_unshift($cache, $data);
62
+
63
+// delete expired cache
64
+$expireTime = floor($time - $setup['interval']/1000 - $setup['expire_cache']);
65
+foreach (array_reverse($cache,true) as $k => $e) {
66
+    if ($e[0] < $expireTime) {
67
+        unset($cache[$k]);
68
+    } else {
69
+        break;
70
+    }
71
+}
72
+
73
+if ($isApc) {
74
+    apc_store('chat', $cache);
75
+} else {
76
+    file_put_contents($tmpFile, serialize($cache));
77
+}
78
+
79
+/* end semafore */
80
+flock($fh, LOCK_UN);
81
+fclose($fh);

+ 47 - 0
server.php

@@ -0,0 +1,47 @@
1
+<?php
2
+
3
+//$_POST['id'] = '1305177620-53c14f147c456';
4
+if (!isset($_POST['id'])) return;
5
+$isApc = extension_loaded('apc');
6
+$id = $_POST['id'];
7
+$cache = $isApc ? apc_fetch('chat') : @unserialize(file_get_contents('./tmp/cache'));
8
+$data = array();
9
+if ($id === 'undefined') {
10
+    $id = empty($cache) ? 0 : $cache[0][0];
11
+} elseif ($id === '0') {
12
+    if (!empty($cache)) {
13
+        $id = $cache[0][0];
14
+        $data = $cache;
15
+    }
16
+} else {
17
+    $end = end($cache);
18
+    // read data from cache
19
+    if ($id >= $end[0]) {
20
+        foreach ($cache as $k => $c) {
21
+            if ($c[0] === $id) break;
22
+        }
23
+        $data = array_slice($cache, 0, $k);
24
+    }
25
+    // read data from history (any problem witch Internet and are delays)
26
+    else {
27
+        $date = date('Y-m-d');
28
+        $history = array();
29
+        while (($history = array_merge(file('./history/'.$date, FILE_IGNORE_NEW_LINES), $history)) && $history[0] > $id) {
30
+            $date = date('Y-m-d', strtotime('-1 day', strtotime($date)));
31
+            if (!file_exists('./history/'.$date)) break;
32
+        }
33
+        // prepare history
34
+        $history = array_reverse($history);
35
+        foreach ($history as & $ref) {
36
+            $ref = explode('&', $ref);
37
+        }
38
+        // get data
39
+        foreach ($history as $k => $h) {
40
+            if ($h[0] === $id) break;
41
+        }
42
+        $data = array_slice($history, 0, $k);
43
+    }
44
+    $id = $cache[0][0];
45
+}
46
+
47
+echo json_encode(array('id' => $id, 'data' => $data));

+ 9 - 0
setup.ini

@@ -0,0 +1,9 @@
1
+
2
+; how often get data from serwer
3
+interval = 2500 ; in milliseconds
4
+
5
+; extra time for cache when is problem with Internet
6
+expire_cache = 60 ; in seconds
7
+
8
+; time for history
9
+expire_history = 30 ; in days

+ 93 - 0
style.css

@@ -0,0 +1,93 @@
1
+ 
2
+/* CSS Document */
3
+html {
4
+    height: 100%;
5
+    margin: 0;
6
+    padding: 0; }
7
+
8
+body {
9
+    height: 96%;
10
+    font: 95% arial;
11
+    color: #222;
12
+    background: #FEFFF4;
13
+    text-align: center;
14
+    margin: 0;
15
+    padding: 0; }
16
+
17
+form, p, span {
18
+    margin: 0;
19
+    padding: 0; }
20
+
21
+input {
22
+    background: #FEFFF4;
23
+    font: 110% arial; }
24
+
25
+input[type=submit] {
26
+    font-size: 100%;
27
+}
28
+
29
+a {
30
+    color: #0000FF;
31
+    text-decoration: none; }
32
+
33
+a:hover { text-decoration: underline; }
34
+
35
+#wrapper, #loginform {
36
+    margin: 2% auto;
37
+    background: #D8D8D8;
38
+    width: 95%;
39
+    height: 95%;
40
+    border: 1px #C7C7C7 solid; }
41
+
42
+#loginform { padding-top: 18px; width: 50%; height: auto; padding-top: 1.5em; padding-bottom: 2.5em; }
43
+
44
+#loginform p { margin: 5px; }
45
+
46
+#datbox {
47
+    display: flex;
48
+    min-height: 75%;
49
+    max-height: 75%;
50
+    }
51
+
52
+#chatbox {
53
+    text-align: left;
54
+    margin: 0 auto;
55
+    margin-bottom: 25px;
56
+    padding: 0.5em 1ex 0.1em;
57
+    background: #FEFFF4;
58
+    min-height: 90%;
59
+    max-height: 90%;
60
+    width: 70%;
61
+    border: 1px solid #C7C7C7;
62
+    overflow: auto; }
63
+
64
+#usrlist {
65
+    text-align: left;
66
+    margin: 0 auto;
67
+    margin-bottom: 25px;
68
+    padding: 0.5em 1ex 0.1em;
69
+    background: #FEFFF4;
70
+    min-height: 90%;
71
+    max-height: 90%;
72
+    width: 15%;
73
+    border: 1px solid #C7C7C7;
74
+    overflow: auto; }
75
+
76
+#usermsg {
77
+    text-align: left;
78
+    width: 87%;
79
+    margin: 0 auto;
80
+    padding: 0.5ex;
81
+    border: 1px solid #C7C7C7; }
82
+
83
+#submit { width: 60px; }
84
+
85
+.error { color: #ff0000; }
86
+
87
+#menu { padding: 12.5px 25px 12.5px 25px; }
88
+
89
+.welcome { float: left; }
90
+
91
+.logout { float: right; }
92
+
93
+.msgln { margin:0 0 2px 0; }

+ 1 - 0
tmp/users/flo

@@ -0,0 +1 @@
1
+connected

+ 47 - 0
users.php

@@ -0,0 +1,47 @@
1
+<?php
2
+
3
+function getSetup($key = null) {
4
+    $arr = parse_ini_file('setup.ini');
5
+    return isset($key) ? $arr[$key] : $arr;
6
+}
7
+
8
+session_start();
9
+if (!isset($_SESSION['name'])) return;
10
+
11
+$isApc = extension_loaded('apc');
12
+
13
+$setup = getSetup();
14
+$time = time();
15
+$date = date('Y-m-d', $time);
16
+$uniqid = uniqid();
17
+$id = $time.'-'.$uniqid;
18
+$name = $_SESSION['name'];
19
+$escaped = preg_replace('/[^A-Za-z0-9_\-]/', '_', $name);
20
+
21
+$tmpDir = './tmp/';
22
+$historyDir = './history/';
23
+
24
+$tmpFile = $tmpDir.'cache';
25
+$tmpUsers = $tmpDir.'users/';
26
+$historyFile = $historyDir.$date;
27
+
28
+$fh = fopen($tmpUsers.$escaped, 'w') or die("Can't create file");
29
+fwrite($fh, "connected");
30
+fclose($fh);
31
+
32
+$res = array();
33
+
34
+$users = array_diff(scandir($tmpUsers), array('.', '..'));
35
+
36
+foreach ( $users as $user )
37
+{
38
+	if (time()-filemtime($tmpUsers.$user) > 10) {
39
+		// file/user older than 10 sec
40
+		unlink($tmpUsers.$user);
41
+	} else {
42
+		// file younger than 2 hours
43
+		array_push($res, $user);
44
+	}
45
+}
46
+
47
+echo json_encode(array('data' => $res));