| 1 | ------------------------------------------------------------------------ |
| 2 | -- Joseph Weizenbaum's classic Eliza ported to SciTE Version 2 |
| 3 | -- Kein-Hong Man <khman@users.sf.net> 20060905 |
| 4 | -- This program is hereby placed into PUBLIC DOMAIN |
| 5 | |
| 6 | -- Adapted to Riddim plugin by Matthew Wild <mwild1@gmail.com> |
| 7 | |
| 8 | local greetings = { "Hey.", "Howdy.", "Hi.", "Hello, what's up?", "Hey, how are you?" } |
| 9 | |
| 10 | ------------------------------------------------------------------------ |
| 11 | -- Eliza main routine, processes user input |
| 12 | -- * Input is case insensitive. No punctuation except apostrophes, |
| 13 | -- as in: don't you're i'm i've you've. |
| 14 | ------------------------------------------------------------------------ |
| 15 | local function Eliza(text) |
| 16 | local response = "" |
| 17 | local user = string.upper(text) |
| 18 | local userOrig = user |
| 19 | |
| 20 | -- randomly selected replies if no keywords |
| 21 | local randReplies = { |
| 22 | "WHAT DOES THAT SUGGEST TO YOU?", |
| 23 | "I SEE...", |
| 24 | "I'M NOT SURE I UNDERSTAND YOU FULLY.", |
| 25 | "CAN YOU ELABORATE ON THAT?", |
| 26 | "THAT IS QUITE INTERESTING!", |
| 27 | "THAT'S SO... PLEASE CONTINUE...", |
| 28 | "I UNDERSTAND...", |
| 29 | "WELL, WELL... DO GO ON", |
| 30 | "WHY ARE YOU SAYING THAT?", |
| 31 | "PLEASE EXPLAIN THE BACKGROUND TO THAT REMARK...", |
| 32 | "COULD YOU SAY THAT AGAIN, IN A DIFFERENT WAY?", |
| 33 | } |
| 34 | |
| 35 | -- keywords, replies |
| 36 | local replies = { |
| 37 | [" CAN YOU"] = "PERHAPS YOU WOULD LIKE TO BE ABLE TO", |
| 38 | [" DO YOU"] = "YES, I", |
| 39 | [" CAN I"] = "PERHAPS YOU DON'T WANT TO BE ABLE TO", |
| 40 | [" YOU ARE"] = "WHAT MAKES YOU THINK I AM", |
| 41 | [" YOU'RE"] = "WHAT IS YOUR REACTION TO ME BEING", |
| 42 | [" I DON'T"] = "WHY DON'T YOU", |
| 43 | [" I FEEL"] = "TELL ME MORE ABOUT FEELING", |
| 44 | [" WHY DON'T YOU"] = "WHY WOULD YOU WANT ME TO", |
| 45 | [" WHY CAN'T I"] = "WHAT MAKES YOU THINK YOU SHOULD BE ABLE TO", |
| 46 | [" ARE YOU"] = "WHY ARE YOU INTERESTED IN WHETHER OR NOT I AM", |
| 47 | [" I CAN'T"] = "HOW DO YOU KNOW YOU CAN'T", |
| 48 | [" SEX"] = "I FEEL YOU SHOULD DISCUSS THIS WITH A HUMAN.", |
| 49 | [" I AM"] = "HOW LONG HAVE YOU BEEN", |
| 50 | [" I'M"] = "WHY ARE YOU TELLING ME YOU'RE", |
| 51 | [" I WANT"] = "WHY DO YOU WANT", |
| 52 | [" WHAT"] = "WHAT DO YOU THINK?", |
| 53 | [" HOW"] = "WHAT ANSWER WOULD PLEASE YOU THE MOST?", |
| 54 | [" WHO"] = "HOW OFTEN DO YOU THINK OF SUCH QUESTIONS?", |
| 55 | [" WHERE"] = "WHY DID YOU THINK OF THAT?", |
| 56 | [" WHEN"] = "WHAT WOULD YOUR BEST FRIEND SAY TO THAT QUESTION?", |
| 57 | [" WHY"] = "WHAT IS IT THAT YOU REALLY WANT TO KNOW?", |
| 58 | [" PERHAPS"] = "YOU'RE NOT VERY FIRM ON THAT!", |
| 59 | [" DRINK"] = "MODERATION IN ALL THINGS SHOULD BE THE RULE.", |
| 60 | [" SORRY"] = "WHY ARE YOU APOLOGIZING?", |
| 61 | [" DREAMS"] = "WHY DID YOU BRING UP THE SUBJECT OF DREAMS?", |
| 62 | [" I LIKE"] = "IS IT GOOD THAT YOU LIKE", |
| 63 | [" MAYBE"] = "AREN'T YOU BEING A BIT TENTATIVE?", |
| 64 | [" NO"] = "WHY ARE YOU BEING NEGATIVE?", |
| 65 | [" YOUR"] = "WHY ARE YOU CONCERNED ABOUT MY", |
| 66 | [" ALWAYS"] = "CAN YOU THINK OF A SPECIFIC EXAMPLE?", |
| 67 | [" THINK"] = "DO YOU DOUBT", |
| 68 | [" YES"] = "YOU SEEM QUITE CERTAIN. WHY IS THIS SO?", |
| 69 | [" FRIEND"] = "WHY DO YOU BRING UP THE SUBJECT OF FRIENDS?", |
| 70 | [" COMPUTER"] = "WHY DO YOU MENTION COMPUTERS?", |
| 71 | [" AM I"] = "YOU ARE", |
| 72 | [" HELLO"] = greetings; |
| 73 | [" HI"] = greetings; |
| 74 | [" HEY"] = greetings; |
| 75 | } |
| 76 | |
| 77 | -- conjugate |
| 78 | local conjugate = { |
| 79 | [" I "] = "YOU", |
| 80 | [" ARE "] = "AM", |
| 81 | [" WERE "] = "WAS", |
| 82 | [" YOU "] = "ME", |
| 83 | [" YOUR "] = "MY", |
| 84 | [" I'VE "] = "YOU'VE", |
| 85 | [" I'M "] = "YOU'RE", |
| 86 | [" ME "] = "YOU", |
| 87 | [" AM I "] = "YOU ARE", |
| 88 | [" AM "] = "ARE", |
| 89 | } |
| 90 | |
| 91 | -- random replies, no keyword |
| 92 | local function replyRandomly() |
| 93 | response = randReplies[math.random(#randReplies)].."\n" |
| 94 | end |
| 95 | |
| 96 | -- find keyword, phrase |
| 97 | local function processInput() |
| 98 | for keyword, reply in pairs(replies) do |
| 99 | local d = string.find(user, keyword, 1, 1) |
| 100 | if d then |
| 101 | if type(reply) == "table" then |
| 102 | reply = reply[math.random(#reply)] |
| 103 | end |
| 104 | -- process keywords |
| 105 | response = response..reply.." " |
| 106 | if string.byte(string.sub(reply, -1)) < 65 then -- "A" |
| 107 | response = response.."\n"; return |
| 108 | end |
| 109 | local h = string.len(user) - (d + string.len(keyword)) |
| 110 | if h > 0 then |
| 111 | user = string.sub(user, -h) |
| 112 | end |
| 113 | for cFrom, cTo in pairs(conjugate) do |
| 114 | local f = string.find(user, cFrom, 1, 1) |
| 115 | if f then |
| 116 | local j = string.sub(user, 1, f - 1).." "..cTo |
| 117 | local z = string.len(user) - (f - 1) - string.len(cTo) |
| 118 | response = response..j.."\n" |
| 119 | if z > 2 then |
| 120 | local l = string.sub(user, -(z - 2)) |
| 121 | if not string.find(userOrig, l) then return end |
| 122 | end |
| 123 | if z > 2 then response = response..string.sub(user, -(z - 2)).."\n" end |
| 124 | if z < 2 then response = response.."\n" end |
| 125 | return |
| 126 | end--if f |
| 127 | end--for |
| 128 | response = response..user.."\n" |
| 129 | return |
| 130 | end--if d |
| 131 | end--for |
| 132 | replyRandomly() |
| 133 | return |
| 134 | end |
| 135 | |
| 136 | -- main() |
| 137 | -- accept user input |
| 138 | if string.sub(user, 1, 3) == "BYE" then |
| 139 | response = "BYE, BYE FOR NOW.\nSEE YOU AGAIN SOME TIME.\n" |
| 140 | return response |
| 141 | end |
| 142 | if string.sub(user, 1, 7) == "BECAUSE" then |
| 143 | user = string.sub(user, 8) |
| 144 | end |
| 145 | user = " "..user.." " |
| 146 | -- process input, print reply |
| 147 | processInput() |
| 148 | return (response:gsub("%s+$", "")); |
| 149 | end |
| 150 | |
| 151 | function riddim.plugins.eliza(bot) |
| 152 | bot:hook("message", function (event) |
| 153 | local reply = (Eliza(event.body):lower():gsub("^.", string.upper):gsub("[.?!] .", string.upper)); |
| 154 | event:reply(reply); |
| 155 | end, -1); |
| 156 | end |