mirror of
https://github.com/LDDestroier/CC/
synced 2025-01-31 11:19:11 +00:00
Fixed it up real good
This commit is contained in:
parent
9f8df17943
commit
72ec4a3a6b
138
disknet.lua
138
disknet.lua
@ -1,15 +1,35 @@
|
||||
local disknet = {}
|
||||
|
||||
disknet.mainPath = ({...})[1] or "disk/DISKNET"
|
||||
local tArg = {...}
|
||||
|
||||
disknet.mainPath = tArg[1] or "disk/DISKNET"
|
||||
local limitChannelsToModem = false
|
||||
local maximumBufferSize = 32
|
||||
|
||||
local openChannels = {}
|
||||
local yourID = os.getComputerID()
|
||||
local uniqueID = math.random(1, 2^31 - 1) -- prevents receiving your own messages
|
||||
local msgCheckList = {} -- makes sure duplicate messages aren't received
|
||||
|
||||
-- do not think for one second that os.epoch("utc") would be a proper substitute
|
||||
local getTime = function()
|
||||
return os.time() + (-1 + os.day()) * 24
|
||||
end
|
||||
|
||||
local readFile = function(path)
|
||||
local file = fs.open(path, "r")
|
||||
local contents = file.readAll()
|
||||
file.close()
|
||||
return contents
|
||||
end
|
||||
|
||||
local writeFile = function(path, contents)
|
||||
local file = fs.open(path, "w")
|
||||
file.write(contents)
|
||||
file.close()
|
||||
end
|
||||
|
||||
-- if 'limitChannelsToModem', then will make sure that channel is a number between 0 and 65535
|
||||
local checkValidChannel = function(channel)
|
||||
if limitChannelsToModem then
|
||||
if type(channel) == "number" then
|
||||
@ -73,19 +93,35 @@ disknet.closeAll = function()
|
||||
openChannels = {}
|
||||
end
|
||||
|
||||
|
||||
|
||||
disknet.transmit = function(channel, message)
|
||||
disknet.send = function(channel, message)
|
||||
local valid, grr = checkValidChannel(channel)
|
||||
if valid then
|
||||
local contents = textutils.unserialize(readFile(fs.combine(disknet.mainPath, tostring(channel))))
|
||||
if disknet.isOpen(channel) then
|
||||
local file = fs.open(fs.combine(disknet.mainPath, tostring(channel)), "a")
|
||||
file.write(textutils.serialize({
|
||||
time = getTime(),
|
||||
id = yourID,
|
||||
channel = channel,
|
||||
message = message,
|
||||
}))
|
||||
local file = fs.open(fs.combine(disknet.mainPath, tostring(channel)), "w")
|
||||
if contents then
|
||||
contents[#contents + 1] = {
|
||||
time = getTime(),
|
||||
id = yourID,
|
||||
uniqueID = uniqueID,
|
||||
messageID = math.random(1, 2^31 - 1),
|
||||
channel = channel,
|
||||
message = message,
|
||||
}
|
||||
if #contents > maximumBufferSize then
|
||||
table.remove(contents, 1)
|
||||
end
|
||||
file.write(textutils.serialize(contents))
|
||||
else
|
||||
file.write(textutils.serialize({{
|
||||
time = getTime(),
|
||||
id = yourID,
|
||||
uniqueID = uniqueID,
|
||||
messageID = math.random(1, 2^31 - 1),
|
||||
channel = channel,
|
||||
message = message,
|
||||
}}))
|
||||
end
|
||||
file.close()
|
||||
return true
|
||||
else
|
||||
@ -96,50 +132,78 @@ disknet.transmit = function(channel, message)
|
||||
end
|
||||
end
|
||||
|
||||
local fList, pList = {}, {}
|
||||
|
||||
local loadFList = function()
|
||||
fList, pList = {}, {}
|
||||
if channel then
|
||||
fList = {fs.open(fs.combine(disknet.mainPath, tostring(channel)), "r")}
|
||||
pList = {fs.combine(disknet.mainPath, tostring(channel))}
|
||||
else
|
||||
for i = 1, #openChannels do
|
||||
fList[i] = fs.open(fs.combine(disknet.mainPath, tostring(openChannels[i])), "r")
|
||||
pList[i] = fs.combine(disknet.mainPath, tostring(openChannels[i]))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
disknet.receive = function(channel)
|
||||
local valid, grr = checkValidChannel(channel)
|
||||
if valid or not channel then
|
||||
|
||||
local fList, contents = {}
|
||||
local output, contents
|
||||
local doRewrite = false
|
||||
|
||||
-- clear files
|
||||
if channel then
|
||||
if openChannels[channel] then
|
||||
file = fs.open(fs.combine(disknet.mainPath, tostring(channel)), "w")
|
||||
file.close()
|
||||
fList[1] = fs.open(fs.combine(disknet.mainPath, tostring(channel)), "r")
|
||||
end
|
||||
else
|
||||
for i = 1, #openChannels do
|
||||
file = fs.open(fs.combine(disknet.mainPath, tostring(openChannels[i])), "w")
|
||||
file.close()
|
||||
fList[i] = fs.open(fs.combine(disknet.mainPath, tostring(openChannels[i])), "r")
|
||||
end
|
||||
end
|
||||
|
||||
-- constantly check channel files
|
||||
local returnChannel
|
||||
while true do
|
||||
loadFList()
|
||||
for i = 1, #fList do
|
||||
contents = fList[i].readAll()
|
||||
if contents ~= "" then
|
||||
returnChannel = channel or openChannels[i]
|
||||
break
|
||||
contents = textutils.unserialize(contents)
|
||||
if type(contents) == "table" then
|
||||
if contents[1] then
|
||||
if (not output) and (contents[1].uniqueID ~= uniqueID) and (not msgCheckList[contents[1].messageID]) then
|
||||
if getTime() - (contents[1].time or 0) <= 0.01 then
|
||||
msgCheckList[contents[1].messageID] = true
|
||||
output = {}
|
||||
for k,v in pairs(contents[1]) do
|
||||
output[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
doRewrite = false
|
||||
for t = #contents, 1, -1 do
|
||||
if getTime() - (contents[t].time or 0) > 0.01 then
|
||||
table.remove(contents, t)
|
||||
doRewrite = true
|
||||
end
|
||||
end
|
||||
if doRewrite then
|
||||
writeFile(pList[i], textutils.serialize(contents))
|
||||
end
|
||||
if output then
|
||||
for i = 1, #fList do
|
||||
fList[i].close()
|
||||
end
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
if returnChannel then
|
||||
if output then
|
||||
break
|
||||
else
|
||||
for i = 1, #fList do
|
||||
fList[i].close()
|
||||
end
|
||||
os.queueEvent("")
|
||||
os.pullEvent("")
|
||||
end
|
||||
end
|
||||
for i = 1, #fList do
|
||||
fList[i].close()
|
||||
end
|
||||
contents = textutils.unserialize(contents)
|
||||
|
||||
if contents then
|
||||
return contents.message, returnChannel, contents.id, contents.time
|
||||
return output.message, output.channel, output.id, output.time
|
||||
else
|
||||
return nil
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user