!7 concept StandardScript { S scriptID; } cmodule Cruddie > DynPrintLogAndEnabled { !include #1027628 // HTTP+HTTPS servers transient S salt; transient WebChatBot chatBot; transient CRUD standardScriptsCRUD; transient CRUD conversationsCRUD; S myLink() { ret "https://cruddie.site/"; } S botLink() { ret "bot"; /*ret appendWithSlash(myLink(), "bot");*/ } switchable S frontendModuleLibID = "#1027675/ChatBotFrontend"; switchable S backendModuleLibID = "#1027591/DynamicClassesMultiCRUD"; transient S cmdsSnippetID = #1027616; start { standardScriptsCRUD = new CRUD(StandardScript); conversationsCRUD = new CRUD(Conversation); thread { File saltFile = secretProgramFile("salt.txt"); S salt = trimLoadTextFile(saltFile); if (empty(salt)) { saveTextFile(saltFile, salt = randomID()); print("Made salt"); } dm_restartOnFieldChange enabled(); if (!enabled) ret; chatBot = new WebChatBot; chatBot.preprocess = s -> { S s2 = googleDecensor(s); print("Preprocessing: " + s + " => " + s2); ret s2; }; chatBot.templateID = #1027690; chatBot.baseLink = botLink(); chatBot.thoughtBot = new ThoughtBot; chatBot.jsOnMsgHTML = "window.processNewStuff(src);"; chatBot.onBotShown = [[ { var input = $("#status_message")[0]; console.log("input: " + input); if (input) new Awesomplete(input, { minChars: 1, list: [ "I call you Fido", "What is your name?", 'add script "#1027704/SomeCruddieScripts/RepeatAfterMe"', 'add script "#1027704/SomeCruddieScripts/GoPublic"', 'clear scripts' ] }); } ]]; chatBot.afterHeading = "` + ('webkitSpeechRecognition' in window ? `   " + tag("button", "...", onclick := "startOrStop(); if (bigOn) startVAD(); else stopVAD();", type := 'button, class := 'speechOnBtn, disabled := 'disabled, display := 'inline) /*+ hjs([[console.log("Updating"); window.srUpdate();]])*/ + "` : ``) + `" + hdiv(hsnippetimg(#1102908, width := 24, height := 24, title := "Someone is speaking (either me or you)"), style := "display: inline; visibility: hidden; margin-left: 10px", class := "vadStatus") + hdiv(hsnippetimg(#1102909, width := 24, height := 24, title := "Listening"), style := "display: inline; visibility: hidden; margin-left: 10px", class := "listenStatus") + hdiv(small("Note: All conversations are public rn " + targetBlank("https://www.youtube.com/watch?v=StxQerL0D-o", "(why)"))); chatBot.moreStuff = "window.srUpdate();"; chatBot.start(); set redirectHttpToHttps; start_webServers(javaxSecretDir("cruddie.site/keystore.p12"), "botcompany"); } } O webServe(S uri, SS params) { printVars("webServe", +uri); //S cookie = serveHttp_cookieHandling(); new Matches m; S uri2 = appendSlash(uri); if (startsWith(uri2, "/bot/", m)) ret chatBot.html("/" + m.rest(), params); if (eq(uri, "/awesomplete.css")) ret serveWithContentType(loadSnippet(#2000595), "text/css"); if (eq(uri, "/awesomplete.js")) ret serveText(loadSnippet(#2000594)); S jsOnSpeech = "if (transcript != 'stop listening') window.submitAMsg(transcript);"; S sayBotMsgsScript = [[ window.processNewStuff = function(src) { ]] + (eq(params.get('quiet), "1") ? "" : [[ if ($("#speechResults") == null) return; // no speech // we assume that webkit speech synthesis is present // when there is webkit speech recognition if (!bigOn) return; // not enabled console.log("Got speech"); var match = src.match(/\d+/); if (match == null) return; if (src.match(/NEW DIALOG -->/)) return; console.log("Got incremental"); var re = /bot-utterance">(.*?) LS { map(m -> m.text, filter(conv.allMsgs(), m -> m.fromUser)) }, 'get); printVars(+caseID, +backend); } } class ThoughtBot { new ThreadLocal request; void setSession(S cookie, SS params) { //session.set(uniq_sync(Session, +cookie)); request.set(new Request(cookie)); } S initialMessage() { //ret "Hello from module " + request->backend; ret (S) dm_call(request->backend, 'answer, "stats"); } S answer(S s) { ret (S) dm_call(request->frontend, 'answer, s); } } S stats() { ret p(joinWithBR( "Server temperature is " + dm_cpuTemperature(), n2(numberOfCruddies(), "cruddie") + ", " + n2(vmBus_countResponses chatBotFrontend()) + " loaded", )); } int numberOfCruddies() { ret countDirsInDir(getProgramDir(beforeSlash(frontendModuleLibID))); } visual jtabs("Main", super, "Standard Scripts", standardScriptsCRUD.visualize(), "Conversations", conversationsCRUD.visualize()); }