Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image | Upload data

145
LINES

< > BotCompany Repo | #1027689 // Cruddie [backup before awesomplete]

JavaX source code (Dynamic Module) [tags: use-pretranspiled] - run with: Stefan's OS

Uses 911K of libraries. Click here for Pure Java version (16823L/97K).

!7

cmodule Cruddie > DynPrintLogAndEnabled {
  !include #1027628 // HTTP+HTTPS servers
  
  transient S salt;
  transient WebChatBot chatBot;
  
  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-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.baseLink = botLink();
    chatBot.thoughtBot = new ThoughtBot;
    
    chatBot.jsOnMsgHTML = "window.processNewStuff(src);";
    
    chatBot.afterHeading = "` + ('webkitSpeechRecognition' in window ? ` &nbsp; " + tag("button", "...", onclick := "startOrStop()", type := 'button, class := 'speechOnBtn, disabled := 'disabled, display := 'inline)
      /*+ hjs([[console.log("Updating"); window.srUpdate();]])*/ + "` : ``) + `";
      
    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;
    if (startsWith(appendSlash(uri), "/bot/", m))
      ret chatBot.html("/" + m.rest(), params);
      
    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">(.*?)</g;
        var match = re.exec(src);
        var lastUtterance = null;
        while (match != null) {
          lastUtterance = match[1];
          match = re.exec(src);
        }
        // TODO: properly drop HTML tags/HTML-decode
        if (lastUtterance)
          say(lastUtterance);
      };
    ]];
    
    S speechUI =
      hdiv(
        "&lt; Talk to me &gt;",
        id := 'speechResults,
        style := "margin: 10px")
      /*+ p(tag("button", "...", onclick := "startOrStop()", type := 'button, id := 'speechOnBtn, disabled := 'disabled))*/;
      
    ret hhtml(hmobilefix() + hhead(
        htitle("CRUDDIE - I manage your anything")
      + hLoadJQuery2()
      + hJsMakeCookie())
      + hbody(hfullcenter(
        p(hsnippetimage(#1102905))
      + p("Chat bot is doing basic stuff. Documentation coming up.")
      + stats()
      + hWebKitSayFunction()
      + hjavascript(sayScript)
      + hSpeechRecognition(jsOnSpeech, true, "en-US", false,
        noWebKit := p("Use Chrome if you want speech recognition"),
        +speechUI)
      + hjs((S) chatBot.html("/", litmap(), returnJS := true))
      )));
  }
  
  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);
      printVars(+caseID, +backend);
    }
  }
  
  class ThoughtBot {
    new ThreadLocal<Request> 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)));
  }
}

Author comment

Began life as a copy of #1027610

download  show line numbers  debug dex  old transpilations   

Travelled to 7 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tvejysmllsmz, vouqrxazstgt, xrpafgyirdlv

No comments. add comment

Snippet ID: #1027689
Snippet name: Cruddie [backup before awesomplete]
Eternal ID of this version: #1027689/1
Text MD5: 17a7e98ad824c1a5084dd37f7a163e91
Transpilation MD5: aa38553a8feee7a5647fb0012f592e42
Author: stefan
Category:
Type: JavaX source code (Dynamic Module)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2020-03-30 20:00:03
Source code size: 4818 bytes / 145 lines
Pitched / IR pitched: No / No
Views / Downloads: 194 / 267
Referenced in: [show references]