Advertisement
1lann

Chat Assistant Node

Aug 17th, 2014
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 2.84 KB | None | 0 0
  1. -- Chat Assistant Node
  2.  
  3. print("1lann's Chat Assistant Node")
  4. print("Please don't touch me :(")
  5.  
  6. local chat = peripheral.wrap("right")
  7. local modem = peripheral.wrap("top")
  8. local operatingChannel = 27158
  9. local successChannel = 27159
  10. local lastMessage = os.clock() - 0.5
  11.  
  12. local standardMessages = {}
  13. local successMessages = {}
  14.  
  15. if not chat then
  16.     print("Warning: Could not find chatbox!")
  17. end
  18.  
  19. if modem then
  20.     modem.closeAll()
  21.     modem.open(operatingChannel)
  22.     modem.open(successChannel)
  23.     print("Modem ready")
  24. else
  25.     error("Could not find modem!")
  26. end
  27.  
  28. local queuedMessages = {}
  29.  
  30. local function receiveLoop()
  31.     while true do
  32.         local event, side, channel, reply, message = os.pullEvent()
  33.         if event == "modem_message" and channel == operatingChannel then
  34.             if type(message) == "table" and message[1] == "chat-assistant-network" then
  35.                 if #tostring(textutils.serialize(message)) < 200 then
  36.                     if type(message[2]) == "string" and type(message[3]) == "string" and type(message[4]) == "string" then
  37.                         if (not standardMessages[message[2]]) or (standardMessages[message[2]] < os.clock()) then
  38.                             standardMessages[message[2]] = os.clock() + 10
  39.                             if chat and (os.clock() - lastMessage) >= 0.5 then
  40.                                 lastMessage = os.clock()
  41.                                 local result = nil
  42.                                 local err, msg = pcall(function() result = chat.tell(message[3], message[4]) end)
  43.                                 if not err then
  44.                                     modem.transmit(operatingChannel, operatingChannel, message)
  45.                                     table.insert(queuedMessages, {message[2], message[3], message[4]})
  46.                                 elseif not result then
  47.                                     modem.transmit(operatingChannel, operatingChannel, message)
  48.                                 elseif result then
  49.                                     modem.transmit(successChannel, successChannel, message[2])
  50.                                 end
  51.                             elseif chat then
  52.                                 modem.transmit(operatingChannel, operatingChannel, message)
  53.                                 table.insert(queuedMessages, {message[2], message[3], message[4]})
  54.                             else
  55.                                 modem.transmit(operatingChannel, operatingChannel, message)
  56.                             end
  57.                         end
  58.                     end
  59.                 end
  60.             end
  61.         elseif event == "modem_message" and channel == successChannel then
  62.             if type(message) == "string" and #message < 50 then
  63.                 if (not successMessages[message]) or (successMessages[message] < os.clock()) then
  64.                     successMessages[message] = os.clock() + 10
  65.                     modem.transmit(successChannel, successChannel, message)
  66.                 end
  67.             end
  68.         end
  69.     end
  70. end
  71.  
  72. local function chatLoop()
  73.     while true do
  74.         sleep(0.3)
  75.         if #queuedMessages > 0 and ((os.clock() - lastMessage) > 0.5) then
  76.             local result = nil
  77.             while not pcall(function() result = chat.tell(queuedMessages[1][2], queuedMessages[1][3]) end) do
  78.                 sleep(0.2)
  79.             end
  80.             if result then
  81.                 modem.transmit(successChannel, successChannel, queuedMessages[1][1])
  82.             end
  83.             table.remove(queuedMessages, 1)
  84.         end
  85.     end
  86. end
  87.  
  88. parallel.waitForAny(receiveLoop, chatLoop)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement