Fossil SCM

chat: added timestamps (browser-local time zone) to the chat messages.

stephan 2020-12-22 14:35 chatroom-dev
Commit 99689132ca06a7019a6620a60adcd7bad262c32bd413885c042ac60573728656
1 file changed +20 -2
+20 -2
--- tools/chat.tcl
+++ tools/chat.tcl
@@ -169,10 +169,12 @@
169169
form.msg.focus();
170170
});
171171
const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim;
172172
const rxAtName = /@\\w+/gmi;
173173
// ^^^ achtung, extra backslashes needed for the outer TCL.
174
+ const textNode = (T)=>document.createTextNode(T);
175
+
174176
// Converts a message string to a message-containing DOM element
175177
// and returns that element, which may contain child elements.
176178
// If 2nd arg is passed, it must be a DOM element to which all
177179
// child elements are appended.
178180
const messageToDOM = function f(str, tgtElem){
@@ -253,10 +255,24 @@
253255
if(f.injectPoint.nextSibling){
254256
f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling);
255257
}else{
256258
f.injectPoint.parentNode.appendChild(e);
257259
}
260
+ };
261
+ /** Returns the local time string of Date object d, defaulting
262
+ to the current time. */
263
+ const localTimeString = function ff(d){
264
+ if(!ff.pad){
265
+ ff.pad = (x)=>(''+x).length>1 ? x : '0'+x;
266
+ }
267
+ d || (d = new Date());
268
+ return [
269
+ d.getFullYear(),'-',ff.pad(d.getMonth()+1/*sigh*/),
270
+ '-',ff.pad(d.getDate()),
271
+ ' ',ff.pad(d.getHours()),':',ff.pad(d.getMinutes()),
272
+ ':',ff.pad(d.getSeconds())
273
+ ].join('');
258274
};
259275
function newcontent(jx){
260276
var i;
261277
for(i=0; i<jx.msgs.length; ++i){
262278
let m = jx.msgs[i];
@@ -269,16 +285,18 @@
269285
row.appendChild(eWho);
270286
eWho.classList.add('message-user');
271287
let whoName;
272288
if( m.xfrom===_me ){
273289
whoName = 'me';
274
- //eWho.classList.add('user-is-me');
275290
row.classList.add('user-is-me');
276291
}else{
277292
whoName = m.xfrom;
278293
}
279
- eWho.append(document.createTextNode(whoName));
294
+ eWho.append(textNode(
295
+ whoName+' @ '+
296
+ localTimeString(new Date(Date.parse(m.mtime+".000Z"))))
297
+ );
280298
let span = document.createElement("div");
281299
span.classList.add('message-content');
282300
row.appendChild(span);
283301
if( m.fsize>0 ){
284302
if( m.fmime && m.fmime.startsWith("image/") ){
285303
--- tools/chat.tcl
+++ tools/chat.tcl
@@ -169,10 +169,12 @@
169 form.msg.focus();
170 });
171 const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim;
172 const rxAtName = /@\\w+/gmi;
173 // ^^^ achtung, extra backslashes needed for the outer TCL.
 
 
174 // Converts a message string to a message-containing DOM element
175 // and returns that element, which may contain child elements.
176 // If 2nd arg is passed, it must be a DOM element to which all
177 // child elements are appended.
178 const messageToDOM = function f(str, tgtElem){
@@ -253,10 +255,24 @@
253 if(f.injectPoint.nextSibling){
254 f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling);
255 }else{
256 f.injectPoint.parentNode.appendChild(e);
257 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258 };
259 function newcontent(jx){
260 var i;
261 for(i=0; i<jx.msgs.length; ++i){
262 let m = jx.msgs[i];
@@ -269,16 +285,18 @@
269 row.appendChild(eWho);
270 eWho.classList.add('message-user');
271 let whoName;
272 if( m.xfrom===_me ){
273 whoName = 'me';
274 //eWho.classList.add('user-is-me');
275 row.classList.add('user-is-me');
276 }else{
277 whoName = m.xfrom;
278 }
279 eWho.append(document.createTextNode(whoName));
 
 
 
280 let span = document.createElement("div");
281 span.classList.add('message-content');
282 row.appendChild(span);
283 if( m.fsize>0 ){
284 if( m.fmime && m.fmime.startsWith("image/") ){
285
--- tools/chat.tcl
+++ tools/chat.tcl
@@ -169,10 +169,12 @@
169 form.msg.focus();
170 });
171 const rxUrl = /\\b(?:https?|ftp):\\/\\/\[a-z0-9-+&@\#\\/%?=~_|!:,.;]*\[a-z0-9-+&@\#\\/%=~_|]/gim;
172 const rxAtName = /@\\w+/gmi;
173 // ^^^ achtung, extra backslashes needed for the outer TCL.
174 const textNode = (T)=>document.createTextNode(T);
175
176 // Converts a message string to a message-containing DOM element
177 // and returns that element, which may contain child elements.
178 // If 2nd arg is passed, it must be a DOM element to which all
179 // child elements are appended.
180 const messageToDOM = function f(str, tgtElem){
@@ -253,10 +255,24 @@
255 if(f.injectPoint.nextSibling){
256 f.injectPoint.parentNode.insertBefore(e, f.injectPoint.nextSibling);
257 }else{
258 f.injectPoint.parentNode.appendChild(e);
259 }
260 };
261 /** Returns the local time string of Date object d, defaulting
262 to the current time. */
263 const localTimeString = function ff(d){
264 if(!ff.pad){
265 ff.pad = (x)=>(''+x).length>1 ? x : '0'+x;
266 }
267 d || (d = new Date());
268 return [
269 d.getFullYear(),'-',ff.pad(d.getMonth()+1/*sigh*/),
270 '-',ff.pad(d.getDate()),
271 ' ',ff.pad(d.getHours()),':',ff.pad(d.getMinutes()),
272 ':',ff.pad(d.getSeconds())
273 ].join('');
274 };
275 function newcontent(jx){
276 var i;
277 for(i=0; i<jx.msgs.length; ++i){
278 let m = jx.msgs[i];
@@ -269,16 +285,18 @@
285 row.appendChild(eWho);
286 eWho.classList.add('message-user');
287 let whoName;
288 if( m.xfrom===_me ){
289 whoName = 'me';
 
290 row.classList.add('user-is-me');
291 }else{
292 whoName = m.xfrom;
293 }
294 eWho.append(textNode(
295 whoName+' @ '+
296 localTimeString(new Date(Date.parse(m.mtime+".000Z"))))
297 );
298 let span = document.createElement("div");
299 span.classList.add('message-content');
300 row.appendChild(span);
301 if( m.fsize>0 ){
302 if( m.fmime && m.fmime.startsWith("image/") ){
303

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button