Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --server client made easy [[SERVER]]
- local serverport=1
- local useStrictClientAddresses=false
- local clientAddresses={}
- local unnessecaryPrints=true
- --/requires/--
- local modem=require"component".modem
- local event=require"event"
- local thread=require"thread"
- --/core variables/--
- local runningThreads={}
- local registeredClients={
- byIP={},
- byIdent={}
- }
- --/core functions/--
- function containsValue(table, value)
- for _, v in pairs(table) do
- if v == value then
- return true
- end
- end
- return false
- end
- local function splitString(input, delimiter)
- local result = {}
- local pattern = string.format("([^%s]+)", delimiter)
- for match in string.gmatch(input, pattern) do
- table.insert(result, match)
- end
- return result
- end
- local function startsWith(str, prefix)
- return string.sub(str, 1, string.len(prefix)) == prefix
- end
- local function encrypt(args)
- local retString=""
- if args then
- if #args>0 then
- for _, arg in ipairs(args) do
- retString=retString..tostring(arg).."�"
- end
- end
- end
- if string.sub(retString,-1)=="�" then
- retString=string.sub(retString,-1)
- end
- return retString
- end
- if unnessecaryPrints then print("server booted") end
- --/core init logic/--
- if not modem.isOpen(serverport) then modem.open(serverport) end -- opens the port on the modem
- thread.create(function() -- registers clients
- if unnessecaryPrints then print("{Client Register Thread}: Booted") end
- while true do
- local _, _, from, port, _, message = event.pull("modem_message")
- if port==serverport and startsWith(message,"/#@-REGISTER") then
- if unnessecaryPrints then print("{Client Register Thread}: Client registered") print("ID: "..splitString(message,"&")[2]) print("Port: "..splitString(message,"&")[3]) end
- registeredClients.byIP[from]=splitString(message,"&")[3]
- registeredClients.byIdent[splitString(message,"&")[2]]=splitString(message,"&")[3]
- end
- end
- end)
- --/api functions/--
- function addRequestHandler(id,callback,detailed)
- if detailed==nil then
- detailed=false
- end
- local newThread=thread.create(function()
- if unnessecaryPrints then print("{Request Handler Thread ["..id.."]}: Booted") end
- while true do
- local _, _, from, port, _, message = event.pull("modem_message")
- if port==serverport and splitString(message,"�")[1]==id then
- valid=true
- if useStrictClientAddresses then
- if not containsValue(clientAddresses,message) then
- valid=false
- end
- end
- if valid then
- if unnessecaryPrints then print("{Request Handler Thread ["..id.."]}: Fired") end
- local args=splitString(message,"�")
- table.remove(args,1)
- local details={from=from,port=port,message=message}
- if detailed then
- callback(details,args)
- else
- callback(args)
- end
- end
- end
- end
- end)
- table.insert(runningThreads,newThread)
- return newThread
- end
- function sendRequest(client,id,args)
- local clientPort=-1
- if registeredClients.byIP[client] then
- clientPort=registeredClients.byIP[client]
- elseif registeredClients.byIdent[client] then
- clientPort=registeredClients.byIdent[client]
- end
- if unnessecaryPrints then print("Send Request Process: Suspected Client Port: "..tostring(clientPort)) end
- if unnessecaryPrints then print("Send Request Process: Packet Data: "..id.."�"..encrypt(args)) end
- if clientPort~=-1 then
- if unnessecaryPrints then print("Modem Broadcast Successful") end
- modem.broadcast(clientPort,tostring(id).."�"..encrypt(args))
- return true
- end
- return false
- end
- --/test code/--
- addRequestHandler("ping",function(details)
- print("pong")
- sendRequest(details.from,"pong")
- end,true)
- while true do os.sleep(.1) end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement