plugins/eliza.lua

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