!7 set flag NoAI. sS imagesPath = "http://web-woody-lab.de/Botbilder/"; sS botURL = "http://www.web-woody-lab.de/bot.php"; sS defaultEmotion = "01", loadingEmotion = "14"; static long conversationTimeOutMS = 1000*60*30; sbool enableDynamic = false, alwaysIframe = false; static NewWoody bot; static volatile bool loaded; static new ThreadLocal conversation; static new LS imageNames; static LS suggestions = tlft([[ Fragen Sie zum Beispiel, wie ein Chatbot installiert wird. Fragen Sie zum Beispiel, ob Ihr Logo als Chatbot taugt. Fragen Sie zum Beispiel, nach welchem Prinzip ein Chatbot agiert. Fragen Sie zum Beispiel, wie ein Bot auf hre Website kommt. Fragen Sie zum Beispiel, welche Ausbildung ein Chatbot braucht. Fragen Sie zum Beispiel, was das hier soll. Fragen Sie zum Beispiel, welchen Nutzen ein Chatbot bringt. Fragen Sie zum Beispiel, ob ein Chatbot mehr Erfolg verspricht. Fragen Sie zum Beispiel, wie wir es mit der Moral halten. Fragen Sie zum Beispiel, was ein virtueller Mitarbeiter bringt. Fragen Sie zum Beispiel, ob wir überhaupt Ahnung haben. Fragen Sie zum Beispiel, wer hier die Chefs sind. ]]); sclass Msg semiauto { long time bool fromUser S text S newURL *() {} *(bool *fromUser, S *text) { time = now(); } } concept Conversation semiauto { S cookie new LL oldDialogs new L msgs void add(Msg m) { msgs.add(m); change(); } //SS vars = new HashMap; NewWoody woody; } p { db(); thread { loadMe(); } loadImages(); } svoid loadImages { imageNames.clear(); for (S file : toLinesFullTrim(loadPage(imagesPath + "list.php"))) if (ewic(file, ".jpg")) { print("Found image: " + file); imageNames.add(file); } } static CtxContext newContext(S cookie) { setConversation(cookie); Msg m = last(conversation->msgs); if (m != null && now() > m.time+conversationTimeOutMS) { NEU(); ret ctxContext(); } CtxContext ctx = woodyNewContext(bot); copyFields(conversation!, ctx, 'activeRule, 'activeAnalyzer, 'vars); ctx.conversationLength = l(conversation->msgs); ret ctx; } svoid doneContext { copyFields(ctxContext(), conversation!, 'activeRule, 'activeAnalyzer); //conversation->vars = dropKeysStartingWith("MATCH", ctxContext().vars); ctxContext(null); } sbool newUser; sS answer(S s) { if (!isMainProgram()) null; time { newContext('default); if (eq(trim(s), "NEU")) { NEU(); s = ""; newUser = true; } if (newUser) { ctxNewUser(); newUser = false; } else { print("Input: " + s); ctxProcessInput(s); } ctxDefaultOnEmptyOutput(); for (S url : unnull(ctxContext().urlsToOpen)) print(">> " + url); S out = ctxGetOutput(); print("Emotion: " + ctxGetLastEmotion(out)); doneContext(); ret out; } } svoid selfTest {} svoid loadMe autosemi { bot = new NewWoody; // Bot is loaded now. if (isMainProgram()) selfTest() // Done loading. Make console bot if main program loaded = true if (isMainProgram()) makeBot( } svoid setConversation(S cookie) { conversation.set(uniq_sync(Conversation, +cookie)); } svoid clearConversation(S cookie) { deleteConcepts(Conversation, +cookie); } svoid processActiveRule() { ctxProcessRule(ctxContext().activeRule); } // for webChatBotLogsHTML static S formatDateAndTime(long time) { ret formatGermanDateAndTime(time); } html { registerVisitor(); lock dbLock(); if (eq(uri, "/logs")) ret webChatBotLogsHTML2(relativeRawBotLink(programID(), "logs"), params); S referer = subBot_referer(); S message = trim(params.get('message)); S text = "Programm lädt,\nbin gleich wieder da."; S page = params.get("uri"); bool _loaded = loaded; Msg msg = null, msgMade = null; if (_loaded) { S cookie = params.get("session"); if (empty(cookie)) cookie = cookieSent(); if (empty(page)) page = referer; newContext(cookie); Conversation conv = conversation!; print("Conv ID: " + conv.id + ", cookie: " + conv.cookie + ", msgs: " + structForUser(conv.msgs)); if (eq(message, "NEU")) { NEU(); message = null; } if (empty(conv.msgs)) { ctxNewUser(); conv.add(msgMade = botAnswerMsg()); } // empty user input if (eq(message, "")) message = "-"; if (nempty(message) && !lastUserMessageWas(conv, message)) conv.add(new Msg(true, message)); if (nempty(conv.msgs) && last(conv.msgs).fromUser) { L buttons = null; pcall { ctxProcessInput(last(conv.msgs).text); } conv.add(msgMade = botAnswerMsg()); } doneContext(); msg = last(conv.msgs); text = msg.text; } S ping = params.get('ping); bool dynamic = eq(ping, 'dynamic); if (!dynamic && nempty(ping)) ret ""; S textHtml = htmlEncode_nlToBr(dropAllTags(ctxDropEmotions(text))); bool include = nempty(params.get('include)); S scrollCmd = "setTimeout(function() { document.body.scrollTop = 167; }, 200);"; // "document.getElementById('theinput').scrollIntoView(false);" //S inner = himg("http://www.web-woody-lab.de/IMG_1460%20herz.jpg", width := 180, onload := scrollCmd); S emo; if (!_loaded) emo = loadingEmotion; else emo = or2(ctxGetLastEmotion(text), defaultEmotion); S imageName = firstStartingWith(imageNames, emo); //print("emo=" + emo + ", imageName=" + imageName); S inner = ""; if (imageName != null) { S img = imagesPath + imageName; inner = himg(img, width := 180, height := 225/*, onload := scrollCmd*/); } if (!_loaded) inner += p(textHtml, style := "text-align: center"); else { // loaded S suggestion = ""; if (l(conversation->msgs) <= 1) suggestion = random(suggestions); /*else suggestion = sfu(collect(conversation->msgs, text));*/ bool redirect = msg != null && nempty(msg.newURL) && msg == msgMade; inner += p(textHtml); inner += redirect ? hjs_redirectWindowOrParent(msg.newURL.replaceAll("\\.html$", ".php")) // no redirect : (!enableDynamic ? "" : loadJQuery2() + jsJoinHack() + hjavascript([[ function submitDynamic() { var url = #BOTURL# + "?ping=dynamic&message=" + encodeURIComponent(document.getElementById('theinput').value); alert(url); /*$.get(url, function(src) { alert(src); $("#botdiv").html(src); }).fail(function() { alert("error"); });*/ $.ajax({ type: "GET", url: url, success: function (response) { $('#botdiv').html(response.responseText); }, error: function (jqXHR, exception, error) { var msg = ''; if (jqXHR.status === 0) { msg = '0 ' + jqXHR.join(); } else if (jqXHR.status == 404) { msg = 'Requested page not found. [404]'; } else if (jqXHR.status == 500) { msg = 'Internal Server Error [500].'; } else if (exception === 'parsererror') { msg = 'Requested JSON parse failed.'; } else if (exception === 'timeout') { msg = 'Time out error.'; } else if (exception === 'abort') { msg = 'Ajax request aborted.'; } else { msg = 'Uncaught Error.\n' + jqXHR.responseText; } $('#botdiv').html(msg); } }); } ]].replace("#BOTURL#", jsQuote(botURL)))) + hformPOST( htextinput("message", style := "width: 180px", autofocus := 1, id := "theinput", onkeydown := enableDynamic ? "if (event.keyCode != 13) return true; submitDynamic(); return false;" : null) + (!_loaded ? "" : p(nempty(suggestion) ? htmlencode(suggestion) : ahref("#", htmlencode("Neues Gespräch ") + " " + b("X"), style := "font-size: 14px; color: #299397", onClick := "theinput.value = 'NEU'; document.getElementById('theform').submit(); return false;") , style := "color: #299397; font-style: italic" + (nempty(suggestion) ? "" : "; text-align: right"))) , "accept-charset" := "UTF-8", id := "theform"); } S loadingRefresher = _loaded ? "" : //hrefresh(5, include ? "" : fullSelfLink(params)); hjs_reloadWindowIn(5); if (dynamic) ret loadingRefresher + inner; if (include) if (alwaysIframe) ret tag("iframe", "", src := rawBotLink_newServer(), width := 180, height := 600, frameBorder := 0); else ret loadingRefresher + div(inner, id := 'botdiv); // deliver iframe contents ret hhtml(hhead( loadingRefresher + hcss([[ body { background-color:white; } p { font:normal 14px Arial, Helvetica; color:black; line-height:18px; } ]])) + hbody(inner, style := "margin: 0px", onload := "document.getElementById('theinput').focus();"); } static bool lastUserMessageWas(Conversation conv, S message) { Msg m = last(conv.msgs); ret m != null && m.fromUser && eq(m.text, message); } static Msg botAnswerMsg() { // S reply = "Ich habe Sie leider nicht verstanden"; ctxDefaultOnEmptyOutput(); S output = ctxGetOutput(); S reply = output; Msg _msg = new Msg(false, reply); _msg.newURL = last(ctxContext().urlsToOpen); ret _msg; } svoid NEU { Conversation conv = conversation!; conv.oldDialogs.add(conv.msgs); cset(conv, msgs := new L); cset(conv, woody := new NewWoody); newContext(conv.cookie); }