· 6 years ago · Dec 18, 2019, 08:08 AM
1--
2-- CCleverBot
3-- Made by 1lann and GravityScore
4--
5
6
7-- Variables
8
9local version = "1.1"
10
11local responseURL = "http://firewolfcc.com/ccleverbot/response.php"
12local event_updateChat = "ccleverbot_updateChatEvent"
13local event_continue = "ccleverbot_continueEvent"
14local event_exit = "ccleverbot_exitEvent"
15
16local chatHistory = {}
17local chatLog = {}
18local w, h = term.getSize()
19
20-- Drawing
21
22local function centerPrint(text, y)
23 if type(text) == "table" then for _, v in pairs(text) do centerPrint(v) end
24 else
25 local x, y = term.getCursorPos()
26 term.setCursorPos((w + 2)/2 - text:len()/2, ny or y)
27 print(text)
28 end
29end
30
31local function drawChat(chatData, offset, thinking, scrolled)
32 local a, b = false, false
33 for i = 1, 10 do
34 term.setCursorPos(3, 16 - i)
35 term.clearLine()
36 end
37
38 for i = 1, 10 do
39 local c = chatData[#chatData + 1 - i + offset]
40
41 if #chatData + 1 - i + offset < 1 then break end
42 term.setCursorPos(3, 16 - i)
43
44 if thinking and i == 1 then
45 term.setTextColor(colors.lightGray)
46 write("...")
47 offset = offset + 1
48 else
49 if c[2] == "user" then
50 term.setTextColor(colors.black)
51 write(c[1])
52 else
53 term.setTextColor(colors.lightBlue)
54 if i == 1 and scrolled ~= true then
55 a = true
56 elseif i == 2 and scrolled ~= true then
57 b = true
58 else
59 write(c[1])
60 end
61 end
62 end
63 end
64
65 if a then
66 term.setTextColor(colors.lightBlue)
67 if b then
68 term.setCursorPos(3, 14)
69 textutils.slowWrite(chatData[#chatData - 1][1])
70 end
71
72 term.setCursorPos(3, 15)
73 textutils.slowWrite(chatData[#chatData][1])
74 end
75
76 os.queueEvent(event_continue)
77end
78
79
80-- Interface
81
82local function interface()
83 local scrollPos = 0
84 local updateChatLog = nil
85 while true do
86 local e, p1, p2 = os.pullEvent()
87 if e == event_updateChat then
88 updateChatLog = textutils.unserialize(p1)
89 scrollPos = 0
90 drawChat(updateChatLog, 0, p2)
91 elseif e == event_exit then
92 return
93 elseif e == "mouse_scroll" then
94 if scrollPos + p1 <= 0 and updateChatLog then
95 if #updateChatLog > 10 and #updateChatLog >= (scrollPos+p1)*-1+10 then
96 scrollPos = scrollPos+p1
97 local scrollChat = {}
98 for i = 10, 1, -1 do
99 scrollChat[i] = updateChatLog[#updateChatLog-(10-i)+scrollPos]
100 end
101 local x, y = term.getCursorPos()
102 drawChat(scrollChat, 0, nil, true)
103 term.setCursorPos(x, y)
104 term.setTextColor(colors.gray)
105 end
106 end
107 end
108 end
109end
110
111
112-- Input
113
114local function input()
115 while true do
116 -- Read
117 term.setCursorPos(3, 17)
118 term.setTextColor(colors.gray)
119 term.clearLine()
120 write("> ")
121 local inputData = read(nil, chatHistory):gsub("^%s*(.-)%s*$", "%1")
122 table.insert(chatHistory, inputData)
123 if inputData == "/exit" then
124 os.queueEvent(event_exit)
125 return
126 end
127
128 -- Parse input
129 if inputData == "" then inputData = "Hello." end
130 inputData = inputData:sub(1, 1):upper() .. inputData:sub(2, -1)
131 if not inputData:sub(-1, -1):find("[\.\?!,]") then inputData = inputData .. "." end
132 if inputData:len() > 45 and not inputData:sub(1, 45):find(" ") then
133 inputData = inputData:sub(1, 45) .. " " .. inputData:sub(46, -1)
134 end
135
136 -- Clear
137 term.setCursorPos(3, 17)
138 term.clearLine()
139 write("> ")
140
141 if inputData:len() > 46 then
142 local spaceData = {}
143 local loopNum = 0
144 while true do
145 loopNum = inputData:find(" ", loopNum + 1, 1, true)
146 table.insert(spaceData, loopNum)
147 if type(loopNum) ~= "number" then
148 table.insert(spaceData, 47)
149 break
150 end
151 end
152
153 for k, v in ipairs(spaceData) do
154 if v > 46 then
155 chatLog[#chatLog + 1] = {inputData:sub(1, spaceData[k - 1] - 1), "user"}
156 chatLog[#chatLog + 1] = {inputData:sub(spaceData[k - 1] + 1, -1), "user"}
157 break
158 end
159 end
160 else
161 chatLog[#chatLog + 1] = {inputData, "user"}
162 end
163
164 os.queueEvent(event_updateChat, textutils.serialize(chatLog), true)
165
166 -- Get response
167 local response = http.post(responseURL, "input=" .. textutils.urlEncode(inputData))
168 if response then
169 local responseData = response.readAll()
170 if responseData:len() > 46 then
171 local spaceData = {}
172 local loopNum = 0
173 while true do
174 loopNum = responseData:find(" ", loopNum + 1, 1, true)
175 table.insert(spaceData, loopNum)
176 if type(loopNum) ~= "number" then
177 table.insert(spaceData, 47)
178 break
179 end
180 end
181
182 for k, v in ipairs(spaceData) do
183 if v > 46 then
184 chatLog[#chatLog + 1] = {responseData:sub(1, spaceData[k - 1] - 1), "bot"}
185 chatLog[#chatLog + 1] = {responseData:sub(spaceData[k - 1]+1, -1), "bot"}
186 break
187 end
188 end
189 else
190 chatLog[#chatLog + 1] = {responseData, "bot"}
191 end
192 else
193 chatLog[#chatLog + 1] = {"CCBot: An error has ocurred!", "bot"}
194 end
195
196 os.queueEvent(event_updateChat, textutils.serialize(chatLog))
197 os.pullEvent(event_continue)
198 end
199end
200
201
202-- Main
203
204local function main()
205 -- Top logo
206 term.setBackgroundColor(colors.white)
207 term.clear()
208 term.setCursorPos(19, 2)
209
210 term.setTextColor(colors.lightBlue)
211 write("Eviebot")
212 term.setTextColor(colors.lime)
213 write("B")
214 term.setTextColor(colors.yellow)
215 write("o")
216 term.setTextColor(colors.red)
217 write("t ")
218 term.setTextColor(colors.lightGray)
219 write(version)
220 term.setTextColor(colors.gray)
221 term.setCursorPos(1, 3)
222 centerPrint("- www.cleverbot.com -")
223
224 -- Run
225 parallel.waitForAll(input, interface)
226end
227
228-- Check
229if not http then
230 print("HTTP API Needs to be Enabled!")
231 print("EvieBot heavily orties on it!")
232 error()
233end
234
235-- Run
236local _, err = pcall(main)
237if err then
238 term.setTextColor(colors.white)
239 term.setBackgroundColor(colors.black)
240 term.clear()
241 term.setCursorPos(1, 1)
242 print("Error!")
243 print(err)
244 print("\nPress any key to exit...")
245 os.pullEvent("key")
246end
247
248-- Exit
249term.setTextColor(colors.white)
250term.setBackgroundColor(colors.black)
251term.clear()
252term.setCursorPos(1, 1)
253centerPrint("Thank You for Using EvieBot " .. version)
254centerPrint("Made by 1lann and GravityScore")