Advertisement
1lann

cc-bot

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