@@ -127,10 +127,23 @@
127 127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SETTING: chat-alert-sound width=10
128 128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
129 129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the name of the builtin sound file to use for the alert tone.
130 130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The value must be the name of a builtin WAV file.
131 131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SETTING: chat-timeline-user width=10
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If this setting is defined and is not an empty string and its value is
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the name of a user that hash chat privilege (privilege letter "C"), then
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** timeline events are posted to the chat as they arrive. The synthesized
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** chat messages appear to come from the user identified by this setting,
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** not the user on the timeline event.
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All chat messages that come from the chat-timeline-user are interpreted
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as text/x-fossil-wiki instead of as text/markdown. For this reason,
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the chat-timeline-user name should probably not be a real user.
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
132 145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
133 146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** WEBPAGE: chat loadavg-exempt
134 147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
135 148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Start up a browser-based chat session.
136 149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -415,14 +428,22 @@
415 428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** zMsg to HTML.
416 429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
417 430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Space to hold the returned string is obtained from fossil_malloc()
418 431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and must be freed by the caller.
419 432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static char *chat_format_to_html(const char *zMsg){
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static char *chat_format_to_html(const char *zMsg, int isWiki){
421 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob out;
422 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&out, "", 0);
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if(*zMsg){
436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zMsg==0 || zMsg[0]==0 ){
437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* No-op */
438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( isWiki ){
439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Used for chat-timeline-user. The zMsg is text/x-fossil-wiki. */
440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob bIn;
441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_init(&bIn, zMsg, (int)strlen(zMsg));
442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wiki_convert(&bIn, &out, WIKI_INLINE);
443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The common case: zMsg is text/markdown */
424 445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob bIn;
425 446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_init(&bIn, zMsg, (int)strlen(zMsg));
426 447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
markdown_to_html(&bIn, NULL, &out);
427 448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
428 449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return blob_str(&out);
@@ -442,11 +463,11 @@
442 463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
443 464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zOut;
444 465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(0,0);
445 466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
g.perm.Hyperlink = 1;
446 467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<g.argc; i++){
447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zOut = chat_format_to_html(g.argv[i]);
468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOut = chat_format_to_html(g.argv[i], 0);
448 469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_print("[%d]: %s\n", i, zOut);
449 470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zOut);
450 471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
451 472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
452 473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -545,22 +566,26 @@
545 566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void chat_poll_webpage(void){
546 567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob json; /* The json to be constructed and returned */
547 568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 dataVersion; /* Data version. Used for polling. */
548 569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int iDelay = 1000; /* Delay until next poll (milliseconds) */
549 570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDelay; /* Maximum delay.*/
571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zChatUser; /* chat-timeline-user */
572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWiki = 0; /* True if chat message is x-fossil-wiki */
550 573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int msgid = atoi(PD("name","0"));
551 574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int msgBefore = atoi(PD("before","0"));
552 575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLimit = msgBefore>0 ? atoi(PD("n","0")) : 0;
553 576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int bRaw = P("raw")!=0;
577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
554 578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob sql = empty_blob;
555 579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q1;
556 580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDelay = db_get_int("chat-poll-timeout",420); /* Default about 7 minutes */
557 581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
558 582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.Chat ) {
559 583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chat_emit_permissions_error(1);
560 584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
561 585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zChatUser = db_get("chat-timeline-user",0);
562 587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chat_create_tables();
563 588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_content_type("application/json");
564 589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dataVersion = db_int64(0, "PRAGMA data_version");
565 590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append_sql(&sql,
566 591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT msgid, datetime(mtime), xfrom, xmsg, length(file),"
@@ -619,21 +644,23 @@
619 644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"lmtime\":%!j,", zLMtime);
620 645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
621 646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&json, "\"xfrom\":", -1);
622 647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(zFrom){
623 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "%!j,", zFrom);
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isWiki = fossil_strcmp(zFrom,zChatUser)==0;
624 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
625 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* see https://fossil-scm.org/forum/forumpost/e0be0eeb4c */
626 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "null,");
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isWiki = 0;
627 654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
628 655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"uclr\":%!j,",
629 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user_color(zFrom ? zFrom : "nobody"));
630 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
631 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(bRaw){
632 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"xmsg\":%!j,", zRawMsg);
633 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zMsg = chat_format_to_html(zRawMsg ? zRawMsg : "");
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zMsg = chat_format_to_html(zRawMsg ? zRawMsg : "", isWiki);
635 662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"xmsg\":%!j,", zMsg);
636 663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zMsg);
637 664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
638 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
639 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nByte==0 ){
@@ -686,16 +713,19 @@
686 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
687 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void chat_fetch_one(void){
688 715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob json = empty_blob; /* The json to be constructed and returned */
689 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int fRaw = PD("raw",0)!=0;
690 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const int msgid = atoi(PD("name","0"));
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zChatUser;
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isWiki;
691 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt q;
692 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
login_check_credentials();
693 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !g.perm.Chat ) {
694 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chat_emit_permissions_error(0);
695 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
696 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zChatUser = db_get("chat-timeline-user",0);
697 727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chat_create_tables();
698 728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cgi_set_content_type("application/json");
699 729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_prepare(&q,
700 730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"SELECT datetime(mtime), xfrom, xmsg, length(file),"
701 731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" fname, fmime, lmtime"
@@ -716,21 +746,23 @@
716 746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"lmtime\":%!j,", zLMtime);
717 747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
718 748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&json, "\"xfrom\":", -1);
719 749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(zFrom){
720 750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "%!j,", zFrom);
751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isWiki = fossil_strcmp(zFrom, zChatUser);
721 752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
722 753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* see https://fossil-scm.org/forum/forumpost/e0be0eeb4c */
723 754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "null,");
755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isWiki = 0;
724 756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
725 757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"uclr\":%!j,",
726 758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
user_color(zFrom ? zFrom : "nobody"));
727 759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_append(&json,"\"xmsg\":", 7);
728 760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if(fRaw){
729 761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "%!j,", zRawMsg);
730 762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char * zMsg = chat_format_to_html(zRawMsg ? zRawMsg : "");
763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char * zMsg = chat_format_to_html(zRawMsg ? zRawMsg : "", isWiki);
732 764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "%!j,", zMsg);
733 765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fossil_free(zMsg);
734 766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
735 767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nByte==0 ){
736 768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_appendf(&json, "\"fsize\":0");
737 769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!