Warning: session_start(): open(/var/lib/php/sessions/sess_o0b0a4n9ubqschs6p0bj0mi57k, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
concept StandardScript {
S scriptID;
}
cmodule Cruddie > DynPrintLogAndEnabled {
!include #1027628 // HTTP+HTTPS servers
transient S salt;
transient WebChatBot chatBot;
transient CRUD standardScriptsCRUD;
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);
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.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(#1102909, width := 24, height := 24, title := "Listening"), style := "display: inline; visibility: hidden; margin-left: 10px", class := "listenStatus")
+ hdiv(hsnippetimg(#1102908, width := 24, height := 24, title := "Voice activity detected"), style := "display: inline; visibility: hidden; margin-left: 10px", class := "vadStatus")
+ 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 sayScript = [[
window.processNewStuff = function(src) {
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">(.*?)]] // took out async
)
+ hbody(hOnBottom(
p(hsnippetimage(#1102905))
+ p("Chat bot is doing basic stuff. Documentation coming up.")
+ stats()
+ hjavascript([[
var srPause;
function say(text) {
console.log("Saying: " + text);
var u = new SpeechSynthesisUtterance(text);
u.onstart = function() { console.log("speech start"); srPause = true; srUpdate(); };
u.onend = function() { srPause = false; srUpdate(); };
window.speechSynthesis.speak(u);
}
]] + sayScript)
+ hSpeechRecognition(jsOnSpeech, true, "en-US", false,
noWebKit := p("Use Chrome if you want speech recognition"),
+speechUI)
+ hjs((S) chatBot.html("/", litmap(), returnJS := true))
+ hVAD(
[[console.log("voice start"); $(".vadStatus").css("visibility", "visible");]],
[[console.log("voice stop"); $(".vadStatus").css("visibility", "hidden");]],
false)
)/*, onLoad := "startAwesomplete()"*/));
}
S cookieToCaseID(S cookie) {
ret md5(cookie + salt);
}
class Request {
S cookie, caseID;
S frontend, backend; // module IDs
*(S *cookie) {
caseID = cookieToCaseID(cookie);
frontend = dm_makeModuleWithParams_systemQ(frontendModuleLibID, +caseID);
backend = dm_makeModuleWithParams_systemQ(backendModuleLibID, +caseID);
dm_call(frontend, 'connectToBackend, backend);
dm_call(frontend, 'importCmdsFromSnippetIfEmpty, cmdsSnippetID);
dm_call(frontend, 'addScripts, collect scriptID(list StandardScript()));
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());
}