plugins/eliza.lua

changeset 157
6fb39f738dd2
child 162
dcb103aca564
equal deleted inserted replaced
156:619b1b9c16bc 157:6fb39f738dd2
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 response = response.."\n"
149 return response
150 end
151
152 function riddim.plugins.eliza(bot)
153 bot:hook("message", function (event)
154 local reply = (Eliza(event.body):lower():gsub("^.", string.upper):gsub("[.?!] .", string.upper));
155 event:reply(reply);
156 end, -1);
157 end

mercurial