Add eliza plugin

Fri, 07 Aug 2020 13:16:33 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Fri, 07 Aug 2020 13:16:33 +0100
changeset 157
6fb39f738dd2
parent 156
619b1b9c16bc
child 158
57ee70718ecc

Add eliza plugin

plugins/eliza.lua file | annotate | diff | comparison | revisions
squishy file | annotate | diff | comparison | revisions
--- /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 <khman@users.sf.net> 20060905
+-- This program is hereby placed into PUBLIC DOMAIN
+
+-- Adapted to Riddim plugin by Matthew Wild <mwild1@gmail.com>
+
+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
--- 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",

mercurial