|
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 |