# HG changeset patch # User Matthew Wild # Date 1596802593 -3600 # Node ID 6fb39f738dd2f217186e624c0e47029868d92540 # Parent 619b1b9c16bc6f4122c281df8a105855254b84cd Add eliza plugin diff -r 619b1b9c16bc -r 6fb39f738dd2 plugins/eliza.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/eliza.lua Fri Aug 07 13:16:33 2020 +0100 @@ -0,0 +1,157 @@ +------------------------------------------------------------------------ +-- Joseph Weizenbaum's classic Eliza ported to SciTE Version 2 +-- Kein-Hong Man 20060905 +-- This program is hereby placed into PUBLIC DOMAIN + +-- Adapted to Riddim plugin by Matthew Wild + +local greetings = { "Hey.", "Howdy.", "Hi.", "Hello, what's up?", "Hey, how are you?" } + +------------------------------------------------------------------------ +-- Eliza main routine, processes user input +-- * Input is case insensitive. No punctuation except apostrophes, +-- as in: don't you're i'm i've you've. +------------------------------------------------------------------------ +local function Eliza(text) + local response = "" + local user = string.upper(text) + local userOrig = user + + -- randomly selected replies if no keywords + local randReplies = { + "WHAT DOES THAT SUGGEST TO YOU?", + "I SEE...", + "I'M NOT SURE I UNDERSTAND YOU FULLY.", + "CAN YOU ELABORATE ON THAT?", + "THAT IS QUITE INTERESTING!", + "THAT'S SO... PLEASE CONTINUE...", + "I UNDERSTAND...", + "WELL, WELL... DO GO ON", + "WHY ARE YOU SAYING THAT?", + "PLEASE EXPLAIN THE BACKGROUND TO THAT REMARK...", + "COULD YOU SAY THAT AGAIN, IN A DIFFERENT WAY?", + } + + -- keywords, replies + local replies = { + [" CAN YOU"] = "PERHAPS YOU WOULD LIKE TO BE ABLE TO", + [" DO YOU"] = "YES, I", + [" CAN I"] = "PERHAPS YOU DON'T WANT TO BE ABLE TO", + [" YOU ARE"] = "WHAT MAKES YOU THINK I AM", + [" YOU'RE"] = "WHAT IS YOUR REACTION TO ME BEING", + [" I DON'T"] = "WHY DON'T YOU", + [" I FEEL"] = "TELL ME MORE ABOUT FEELING", + [" WHY DON'T YOU"] = "WHY WOULD YOU WANT ME TO", + [" WHY CAN'T I"] = "WHAT MAKES YOU THINK YOU SHOULD BE ABLE TO", + [" ARE YOU"] = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM", + [" I CAN'T"] = "HOW DO YOU KNOW YOU CAN'T", + [" SEX"] = "I FEEL YOU SHOULD DISCUSS THIS WITH A HUMAN.", + [" I AM"] = "HOW LONG HAVE YOU BEEN", + [" I'M"] = "WHY ARE YOU TELLING ME YOU'RE", + [" I WANT"] = "WHY DO YOU WANT", + [" WHAT"] = "WHAT DO YOU THINK?", + [" HOW"] = "WHAT ANSWER WOULD PLEASE YOU THE MOST?", + [" WHO"] = "HOW OFTEN DO YOU THINK OF SUCH QUESTIONS?", + [" WHERE"] = "WHY DID YOU THINK OF THAT?", + [" WHEN"] = "WHAT WOULD YOUR BEST FRIEND SAY TO THAT QUESTION?", + [" WHY"] = "WHAT IS IT THAT YOU REALLY WANT TO KNOW?", + [" PERHAPS"] = "YOU'RE NOT VERY FIRM ON THAT!", + [" DRINK"] = "MODERATION IN ALL THINGS SHOULD BE THE RULE.", + [" SORRY"] = "WHY ARE YOU APOLOGIZING?", + [" DREAMS"] = "WHY DID YOU BRING UP THE SUBJECT OF DREAMS?", + [" I LIKE"] = "IS IT GOOD THAT YOU LIKE", + [" MAYBE"] = "AREN'T YOU BEING A BIT TENTATIVE?", + [" NO"] = "WHY ARE YOU BEING NEGATIVE?", + [" YOUR"] = "WHY ARE YOU CONCERNED ABOUT MY", + [" ALWAYS"] = "CAN YOU THINK OF A SPECIFIC EXAMPLE?", + [" THINK"] = "DO YOU DOUBT", + [" YES"] = "YOU SEEM QUITE CERTAIN. WHY IS THIS SO?", + [" FRIEND"] = "WHY DO YOU BRING UP THE SUBJECT OF FRIENDS?", + [" COMPUTER"] = "WHY DO YOU MENTION COMPUTERS?", + [" AM I"] = "YOU ARE", + [" HELLO"] = greetings; + [" HI"] = greetings; + [" HEY"] = greetings; + } + + -- conjugate + local conjugate = { + [" I "] = "YOU", + [" ARE "] = "AM", + [" WERE "] = "WAS", + [" YOU "] = "ME", + [" YOUR "] = "MY", + [" I'VE "] = "YOU'VE", + [" I'M "] = "YOU'RE", + [" ME "] = "YOU", + [" AM I "] = "YOU ARE", + [" AM "] = "ARE", + } + + -- random replies, no keyword + local function replyRandomly() + response = randReplies[math.random(#randReplies)].."\n" + end + + -- find keyword, phrase + local function processInput() + for keyword, reply in pairs(replies) do + local d = string.find(user, keyword, 1, 1) + if d then + if type(reply) == "table" then + reply = reply[math.random(#reply)] + end + -- process keywords + response = response..reply.." " + if string.byte(string.sub(reply, -1)) < 65 then -- "A" + response = response.."\n"; return + end + local h = string.len(user) - (d + string.len(keyword)) + if h > 0 then + user = string.sub(user, -h) + end + for cFrom, cTo in pairs(conjugate) do + local f = string.find(user, cFrom, 1, 1) + if f then + local j = string.sub(user, 1, f - 1).." "..cTo + local z = string.len(user) - (f - 1) - string.len(cTo) + response = response..j.."\n" + if z > 2 then + local l = string.sub(user, -(z - 2)) + if not string.find(userOrig, l) then return end + end + if z > 2 then response = response..string.sub(user, -(z - 2)).."\n" end + if z < 2 then response = response.."\n" end + return + end--if f + end--for + response = response..user.."\n" + return + end--if d + end--for + replyRandomly() + return + end + + -- main() + -- accept user input + if string.sub(user, 1, 3) == "BYE" then + response = "BYE, BYE FOR NOW.\nSEE YOU AGAIN SOME TIME.\n" + return response + end + if string.sub(user, 1, 7) == "BECAUSE" then + user = string.sub(user, 8) + end + user = " "..user.." " + -- process input, print reply + processInput() + response = response.."\n" + return response +end + +function riddim.plugins.eliza(bot) + bot:hook("message", function (event) + local reply = (Eliza(event.body):lower():gsub("^.", string.upper):gsub("[.?!] .", string.upper)); + event:reply(reply); + end, -1); +end diff -r 619b1b9c16bc -r 6fb39f738dd2 squishy --- a/squishy Fri Aug 07 12:26:15 2020 +0100 +++ b/squishy Fri Aug 07 13:16:33 2020 +0100 @@ -11,6 +11,7 @@ "bookmarks", "bugzilla", "disco", + "eliza", "factoids", "ietf", "invited",