Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local SAD = {}
- SAD.version = "2.0.0.0"
- SAD._queries = {}
- SAD._actors = {}
- SAD.vars = {}
- local sides = require("sides")
- local event = require("event")
- local fs = require("filesystem")
- local component = require("component")
- local json = require("dkjson")
- local modem = false
- SAD.sides = sides
- SAD.component = component
- SAD.json = json
- if components.isAvailable("modem") then
- modem.open(100)
- modem = component.modem
- end
- --create required folders and files :
- if not fs.exists("/home/SAD") then fs.makeDirectory("/home/SAD/") end
- if not fs.exists("/home/SAD/Queries") then fs.makeDirectory("/home/SAD/Queries") end
- function SAD.loadQueries()
- local grabQs = fs.list("/home/SAD/Queries/")
- while true do
- local item = grabQs()
- if not item then break end
- print("found Folder",item)
- local ld = assert( loadfile("/home/SAD/Queries/" .. item .. "_.lua"))
- if ld then
- local itemName = item:sub(1,#item-1);
- SAD._queries[itemName] = {ld=ld,actors={}}
- print("Query [" .. itemName .. "] Loading ...")
- SAD.loadActorsIn(itemName)
- print("Query [" .. itemName .. "] Loaded!")
- print("")
- end
- end
- end
- function SAD.loadActorsIn(query)
- local grabAs = fs.list("/home/SAD/Queries/" .. query .. "/")
- while true do
- local item = grabAs()
- if not item then break end
- if item ~= "_.lua" then
- local itemName = item:sub(1,#item-#".lua")
- SAD._queries[query].actors[itemName] = assert(loadfile("/home/SAD/Queries/" .. query .. "/" .. item))
- print("","Loaded Actor [" .. itemName .. "]")
- end
- end
- end
- --function definitions :
- function SAD.Query(name,testAt)
- if not fs.exists("/home/SAD/Queries/" .. name .. "/") then
- fs.makeDirectory("/home/SAD/Queries/" .. name .. "/")
- local queryFile = fs.open("/home/SAD/Queries/" .. name .. "/_.lua","w");
- queryFile:write("local function Query(SAD)\n return 0\nend\nreturn Query;")
- queryFile:close()
- end
- SAD._queries[name] = {ld=assert(loadfile("/home/SAD/Queries/" .. name .. "/_.lua")),actors ={}};
- return SAD._queries[name];
- end
- function SAD.Actor(query,name)
- SAD.Query(query)
- if not fs.exists("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua") then
- local actorFile = fs.open("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua","w");
- actorFile:write("local json = require('dkjson')\nlocal function Act(SAD,result)\n result = json.decode(result)\n return true\nend\nreturn Act")
- actorFile:close()
- end
- SAD._queries[query].actors[name] = assert(loadfile("/home/SAD/Queries/" .. query .. "/" .. name .. ".lua"));
- return SAD._queries[query].actors[name];
- end
- function SAD.cycle()
- for name,query in pairs(SAD._queries) do
- local result = {query.ld()(SAD)}
- local packet = json.encode(result)
- if modem then
- modem.broadcast(100,"SAD@" .. name .. ":" .. packet)
- end
- for a_name,actor in pairs(query.actors) do
- actor()(SAD,packet)
- end
- end
- end
- function SAD.onReceive(eventID,localAddress,remoteAddress,port,distance,data)
- if data:sub(1,#"SAD@") == "SAD@" then
- local queryName = data:sub(#"SAD@"+1,data:find(":")-1)
- local packet = data:sub(data:find(":")+1,#data)
- --print(">>SAD Received a signal from query [" .. queryName .. "]")
- if SAD._queries[queryName] then
- for a_name,actor in pairs(SAD.queries[queryName].actors) do
- actor()(SAD,packet)
- end
- end
- end
- end
- function SAD.close()
- if modem then
- event.ignore("modem_message",SAD.onReceive)
- print("-----SAD IS NO LONGER LISTENING!-----")
- else
- print("ERROR:","No modem found!")
- end
- end
- function SAD.listen()
- if ` then
- event.listen("modem_message",SAD.onReceive)
- print("-----SAD IS NOW LISTENING-----")
- else
- print("ERROR:","No modem found!")
- end
- end
- function SAD.initClient()
- if modem then
- SAD.loadQueries()
- SAD.listen()
- print("-----SAD STARTED!-----")
- else
- print("ERROR:","No Modem found!")
- end
- end
- function SAD.initServer()
- SAD.loadQueries()
- local f = fs.open("/home/SAD/sad.timer","w")
- local t = event.timer(0.1,SAD.cycle,math.huge)
- print("-----SAD STARTED!-----")
- f:write(tostring(t))
- f:close()
- if not modem then
- print("ERROR:","No modem found, SAD Server will be unable to broadcast to external devices.")
- end
- end
- function SAD.stop()
- if fs.exists("/home/SAD/sad.timer") then
- f = fs.open("/home/SAD/sad.timer","r")
- local g = f:read(8)
- if g then
- event.cancel(tonumber(g))
- end
- f:close()
- fs.remove("/home/SAD/sad.timer")
- end
- SAD.close()
- print("-----SAD STOPPED!-----")
- end
- local shell = require("shell")
- local args = {...}
- local filter = nil
- local onlyNames = false
- for k,v in pairs(args) do
- --print(v:sub(v:find("-stop")+#"-stop",#v))
- if v:find("-stop") and v:sub(v:find("-stop")+#"-stop",#v) == "" then
- SAD.stop()
- end
- end
- for k,v in pairs(args) do
- if v:find("-startServer") and v:sub(#"-startServer"+1,#v) == "" then
- SAD.initServer()
- end
- end
- for k,v in pairs(args) do
- if v:find("-startClient") and v:sub(#"-startClient"+1,#v) == "" then
- SAD.initClient()
- end
- end
- for k,v in pairs(args) do
- if v:find("-query=") then
- print("Make Query command found")
- local queryName = v:sub(#"-query="+1,#v)
- SAD.Query(queryName)
- shell.execute("edit /home/SAD/Queries/" .. queryName .. "/_.lua")
- end
- end
- for k,v in pairs(args) do
- if v:find("-actor=") then
- print("make actor arg found :",v)
- local queryName = v:sub(#"-actor="+1,v:find("&")-1)
- local actorName = v:sub(v:find("&")+1,#v)
- print("Attempting to create the Actor [" .. actorName .. "] for Query [" .. queryName .."]")
- SAD.Query(queryName)
- SAD.Actor(queryName,actorName)
- shell.execute("edit /home/SAD/Queries/" .. queryName .. "/" .. actorName .. ".lua")
- end
- end
- return SAD --SHAME!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement