@@ -354,12 +354,28 @@
354 354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
set: (k,v)=>F.storage.set(k,v),
355 355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
defaults:{
356 356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"images-inline": !!F.config.chat.imagesInline,
357 357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"edit-multiline": false,
358 358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"monospace-messages": false,
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "chat-only-mode": false
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "chat-only-mode": false,
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "audio-notification": true,
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /** Plays a new-message notification sound IF the audio-notification
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ setting is true, else this is a no-op. Returns this.
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ playNewMessageSound: function f(){
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(this.settings.getBool('audio-notification',false)){
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ try{
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!f.audio) f.audio = new Audio(F.rootPath+"chat-audio-received");
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.audio.currentTime = 0;
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ f.audio.play();
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }catch(e){
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ console.error("Audio playblack failed.",e);
374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
360 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return this;
361 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
362 378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
363 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.e.inputCurrent = cs.e.inputSingle;
364 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Install default settings... */
365 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Object.keys(cs.settings.defaults).forEach(function(k){
@@ -405,17 +421,16 @@
405 421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const args = argsToArray(arguments);
406 422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
console.error("chat error:",args);
407 423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date().toISOString(),
408 424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
msg = {
409 425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isError: true,
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- xfrom: "chat.js",
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ xfrom: null,
411 427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
msgid: -1,
412 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mtime: d,
413 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lmtime: d,
414 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xmsg: args
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }, mw = new this.MessageWidget();
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mw.setMessage(msg);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }, mw = new this.MessageWidget(msg);
417 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.injectMessageElem(mw.e.body);
418 433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mw.scrollIntoView();
419 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
420 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
421 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cs.getMessageElemById = function(id){
@@ -528,18 +543,30 @@
528 543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
features of the FIELDSET/LEGEND combination, e.g. inability to
529 544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
align legends via CSS in Firefox and clicking-related
530 545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
deficiencies in Safari.
531 546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
532 547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.MessageWidget = (function(){
548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /**
549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Constructor. If passed an argument, it is passed to
550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.setMessage() after initialization.
551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
533 552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const cf = function(){
534 553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e = {
535 554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
body: D.addClass(D.div(), 'message-widget'),
536 555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
tab: D.addClass(D.span(), 'message-widget-tab'),
537 556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
content: D.addClass(D.div(), 'message-widget-content')
538 557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
539 558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(this.e.body, this.e.tab, this.e.content);
540 559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
this.e.tab.setAttribute('role', 'button');
560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(arguments.length){
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.setMessage(arguments[0]);
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const theTime = function(d){
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [d.getHours(),":",
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (d.getMinutes()+100).toString().slice(1,3)
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ].join('');
541 568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
542 569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cf.prototype = {
543 570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setLabel: function(label){
544 571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return this;
545 572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},
@@ -549,28 +576,37 @@
549 576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
setMessage: function(m){
550 577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const ds = this.e.body.dataset;
551 578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.timestamp = m.mtime;
552 579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.lmtime = m.lmtime;
553 580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ds.msgid = m.msgid;
554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ds.xfrom = m.xfrom;
581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ds.xfrom = m.xfrom || '';
555 582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(m.xfrom === Chat.me){
556 583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.addClass(this.e.body, 'mine');
557 584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.e.content.style.backgroundColor = m.uclr;
559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- this.e.tab.style.backgroundColor = m.uclr;
585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.uclr){
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.content.style.backgroundColor = m.uclr;
587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.tab.style.backgroundColor = m.uclr;
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
560 589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date(m.mtime);
561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.append(
562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.clearElement(this.e.tab),
563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.text(
564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- m.xfrom," #",(m.msgid||'???'),' @ ',d.getHours(),":",
565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (d.getMinutes()+100).toString().slice(1,3)
566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- )
567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.clearElement(this.e.tab);
568 591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
var contentTarget = this.e.content;
569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(m.isError){
570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- D.addClass([contentTarget, this.e.tab], 'error');
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( m.fsize>0 ){
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.xfrom){
593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(
594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.tab,
595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.text(m.xfrom," #",(m.msgid||'???'),' @ ',theTime(d))
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{/*notification*/
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass(this.e.body, 'notification');
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(m.isError){
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.addClass([contentTarget, this.e.tab], 'error');
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.append(
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ this.e.tab,
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ D.text('notification @ ',theTime(d))
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( m.xfrom && m.fsize>0 ){
572 608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.fmime
573 609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& m.fmime.startsWith("image/")
574 610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& Chat.settings.getBool('images-inline',true)
575 611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
576 612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
contentTarget.appendChild(D.img("chat-download/" + m.msgid));
@@ -624,11 +660,11 @@
624 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(!eMsg) return;
625 661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.clearElement(this.e);
626 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const d = new Date(eMsg.dataset.timestamp);
627 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(d.getMinutes().toString()!=="NaN"){
628 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
// Date works, render informative timestamps
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const xfrom = eMsg.dataset.xfrom;
665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const xfrom = eMsg.dataset.xfrom || 'server';
630 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(this.e,
631 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(D.span(), localTimeString(d)," ",Chat.me," time"),
632 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(D.span(), iso8601ish(d)));
633 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(eMsg.dataset.lmtime && xfrom!==Chat.me){
634 670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
D.append(this.e,
@@ -892,16 +928,23 @@
892 928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>!Chat.e.btnMsgHome.classList.contains('hidden'),
893 929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: ()=>Chat.toggleNavButtons()
894 930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
},{
895 931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
label: "Images inline",
896 932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
boolValue: ()=>Chat.settings.getBool('images-inline'),
897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- persistentSetting: 'images-inline',
898 933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
callback: function(){
899 934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const v = Chat.settings.getBool('images-inline',true);
900 935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.settings.set('images-inline', !v);
901 936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
F.toast.message("Image mode set to "+(v ? "hyperlink" : "inline")+".");
902 937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ },{
939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ label: "Audio notifications",
940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ boolValue: ()=>Chat.settings.getBool('audio-notification'),
941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ callback: function(){
942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const v = Chat.settings.getBool('audio-notification');
943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.settings.set('audio-notification', !v);
944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ F.toast.message("Audio notifications "+(v ? "disabled" : "enabled")+".");
945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
903 946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}];
904 947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
905 948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**
906 949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Rebuild the menu each time it's shown so that the toggles can
907 950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
show their current values.
@@ -989,12 +1032,14 @@
989 1032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( m.mdel ){
990 1033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* A record deletion notice. */
991 1034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.deleteMessageElem(m.mdel);
992 1035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
993 1036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const row = new Chat.MessageWidget()
995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- row.setMessage(m);
1037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!Chat._isBatchLoading && Chat.me!==m.xfrom && Chat.playNewMessageSound){
1038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Chat.playNewMessageSound();
1039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const row = new Chat.MessageWidget(m);
996 1041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat.injectMessageElem(row.e.body,atEnd);
997 1042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(m.isError){
998 1043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Chat._gotServerError = m;
999 1044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1000 1045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}/*processPost()*/;
1001 1046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!