Advertisement
archangel07555

SAD.lua v2

Aug 15th, 2017
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.85 KB | None | 0 0
  1. local SAD = {}
  2. SAD.version = "2.0.0.0"
  3. SAD._queries = {}
  4. SAD._actors = {}
  5. SAD.vars = {}
  6.  
  7. local sides = require("sides")
  8. local event = require("event")
  9. local fs = require("filesystem")
  10. local component = require("component")
  11. local json = require("dkjson")
  12. local modem = false
  13. SAD.sides = sides
  14. SAD.component = component
  15. SAD.json = json
  16.  
  17. if components.isAvailable("modem") then
  18.  modem.open(100)
  19.  modem = component.modem
  20. end
  21.  
  22. --create required folders and files :
  23. if not fs.exists("/home/SAD") then fs.makeDirectory("/home/SAD/") end
  24. if not fs.exists("/home/SAD/Queries") then fs.makeDirectory("/home/SAD/Queries") end
  25.  
  26. function SAD.loadQueries()
  27.   local grabQs = fs.list("/home/SAD/Queries/")
  28.   while true do
  29.     local item = grabQs()
  30.     if not item then break end
  31.     print("found Folder",item)
  32.     local ld = assert( loadfile("/home/SAD/Queries/" .. item .. "_.lua"))
  33.     if ld then
  34.       local itemName = item:sub(1,#item-1);
  35.       SAD._queries[itemName] = {ld=ld,actors={}}
  36.       print("Query [" .. itemName .. "] Loading ...")
  37.       SAD.loadActorsIn(itemName)
  38.       print("Query [" .. itemName .. "] Loaded!")
  39.       print("")
  40.     end
  41.   end
  42. end
  43.  
  44. function SAD.loadActorsIn(query)
  45.   local grabAs = fs.list("/home/SAD/Queries/" .. query .. "/")
  46.   while true do
  47.     local item = grabAs()
  48.     if not item then break end
  49.     if item ~= "_.lua" then
  50.       local itemName = item:sub(1,#item-#".lua")
  51.       SAD._queries[query].actors[itemName] = assert(loadfile("/home/SAD/Queries/" .. query .. "/" .. item))
  52.       print("","Loaded Actor [" .. itemName .. "]")
  53.     end
  54.   end
  55. end
  56.  
  57. --function definitions :
  58.  
  59. function SAD.Query(name,testAt)
  60.   if not fs.exists("/home/SAD/Queries/" .. name .. "/") then
  61.     fs.makeDirectory("/home/SAD/Queries/" .. name .. "/")
  62.     local queryFile = fs.open("/home/SAD/Queries/" .. name .. "/_.lua","w");
  63.     queryFile:write("local function Query(SAD)\n  return 0\nend\nreturn Query;")
  64.     queryFile:close()
  65.   end
  66.   SAD._queries[name] = {ld=assert(loadfile("/home/SAD/Queries/" .. name .. "/_.lua")),actors ={}};
  67.   return SAD._queries[name];
  68. end
  69.  
  70. function SAD.Actor(query,name)
  71.   SAD.Query(query)
  72.   if not fs.exists("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua") then
  73.     local actorFile = fs.open("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua","w");
  74.     actorFile:write("local json = require('dkjson')\nlocal function Act(SAD,result)\n  result = json.decode(result)\n  return true\nend\nreturn Act")
  75.     actorFile:close()
  76.   end
  77.   SAD._queries[query].actors[name] = assert(loadfile("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua"));
  78.   return SAD._queries[query].actors[name];
  79. end
  80.  
  81. function SAD.cycle()
  82.   for name,query in pairs(SAD._queries) do
  83.     local result = {query.ld()(SAD)}
  84.     local packet = json.encode(result)
  85.         if modem then
  86.             modem.broadcast(100,"SAD@" .. name .. ":" .. packet)
  87.         end
  88.     for a_name,actor in pairs(query.actors) do
  89.       actor()(SAD,packet)
  90.     end
  91.   end
  92. end
  93.  
  94. function SAD.onReceive(eventID,localAddress,remoteAddress,port,distance,data)
  95.   if data:sub(1,#"SAD@") == "SAD@" then
  96.     local queryName = data:sub(#"SAD@"+1,data:find(":")-1)
  97.     local packet = data:sub(data:find(":")+1,#data)
  98.     --print(">>SAD Received a signal from query [" .. queryName .. "]")
  99.     if SAD._queries[queryName] then
  100.       for a_name,actor in pairs(SAD.queries[queryName].actors) do
  101.         actor()(SAD,packet)
  102.       end
  103.     end
  104.   end
  105. end
  106.  
  107. function SAD.close()
  108.     if modem then
  109.         event.ignore("modem_message",SAD.onReceive)
  110.         print("-----SAD IS NO LONGER LISTENING!-----")
  111.     else
  112.         print("ERROR:","No modem found!")
  113.     end
  114. end
  115.  
  116. function SAD.listen()
  117.     if ` then
  118.         event.listen("modem_message",SAD.onReceive)
  119.         print("-----SAD IS NOW LISTENING-----")
  120.     else
  121.         print("ERROR:","No modem found!")
  122.     end
  123. end
  124.  
  125. function SAD.initClient()
  126.     if modem then
  127.         SAD.loadQueries()
  128.         SAD.listen()
  129.         print("-----SAD STARTED!-----")
  130.     else
  131.         print("ERROR:","No Modem found!")
  132.     end
  133. end
  134.  
  135. function SAD.initServer()
  136.   SAD.loadQueries()
  137.   local f = fs.open("/home/SAD/sad.timer","w")  
  138.   local t = event.timer(0.1,SAD.cycle,math.huge)
  139.   print("-----SAD STARTED!-----")
  140.   f:write(tostring(t))
  141.   f:close()
  142.     if not modem then
  143.         print("ERROR:","No modem found, SAD Server will be unable to broadcast to external devices.")
  144.     end
  145. end
  146.  
  147. function SAD.stop()
  148.   if fs.exists("/home/SAD/sad.timer") then
  149.     f = fs.open("/home/SAD/sad.timer","r")
  150.     local g = f:read(8)
  151.     if g then
  152.       event.cancel(tonumber(g))
  153.     end
  154.     f:close()
  155.     fs.remove("/home/SAD/sad.timer")
  156.   end
  157.   SAD.close()
  158.   print("-----SAD STOPPED!-----")
  159. end
  160.  
  161. local shell = require("shell")
  162. local args = {...}
  163. local filter = nil
  164. local onlyNames = false
  165.  
  166. for k,v in pairs(args) do
  167.   --print(v:sub(v:find("-stop")+#"-stop",#v))
  168.   if v:find("-stop") and v:sub(v:find("-stop")+#"-stop",#v) == "" then
  169.     SAD.stop()
  170.   end
  171. end
  172.  
  173. for k,v in pairs(args) do
  174.   if v:find("-startServer") and v:sub(#"-startServer"+1,#v) == "" then
  175.     SAD.initServer()
  176.   end
  177. end
  178.  
  179. for k,v in pairs(args) do
  180.   if v:find("-startClient") and v:sub(#"-startClient"+1,#v) == "" then
  181.     SAD.initClient()
  182.   end
  183. end
  184.  
  185. for k,v in pairs(args) do
  186.   if v:find("-query=") then
  187.     print("Make Query command found")
  188.     local queryName = v:sub(#"-query="+1,#v)
  189.     SAD.Query(queryName)
  190.     shell.execute("edit /home/SAD/Queries/" .. queryName .. "/_.lua")
  191.   end
  192. end
  193.  
  194. for k,v in pairs(args) do
  195.   if v:find("-actor=") then
  196.     print("make actor arg found :",v)
  197.     local queryName = v:sub(#"-actor="+1,v:find("&")-1)
  198.     local actorName = v:sub(v:find("&")+1,#v)
  199.     print("Attempting to create the Actor [" .. actorName .. "] for Query [" .. queryName .."]")
  200.     SAD.Query(queryName)
  201.     SAD.Actor(queryName,actorName)
  202.     shell.execute("edit /home/SAD/Queries/" .. queryName .. "/" .. actorName .. ".lua")
  203.   end
  204. end
  205.  
  206.  
  207. return SAD --SHAME!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement