Mon, 06 Dec 2021 11:27:36 +0000
rtbl_admin: Add access control around commands
157 | 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() | |
163
999573fb51ab
plugins.eliza: Strip all trailing whitespace from responses
Matthew Wild <mwild1@gmail.com>
parents:
162
diff
changeset
|
148 | return (response:gsub("%s+$", "")); |
157 | 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 |