diff --git a/computer/swass/bin/swass.lua b/computer/swass/bin/swass.lua new file mode 100644 index 0000000..bd91793 --- /dev/null +++ b/computer/swass/bin/swass.lua @@ -0,0 +1,154 @@ +local OUTPUT_NAME = "minecraft:barrel_15" +local LESS_COUNT = 20 + +local output = peripheral.wrap(OUTPUT_NAME) + +local containers = { peripheral.find("minecraft:barrel") } + +local args = {...} + +function searchInv(inv, targetName) + for slot, item in pairs(inv.list()) do + if item.name == targetName then + return slot + end + end +end + +function findItem(targetName, count) + if count == nil then count = 64 end + + for _, container in pairs(containers) do + if peripheral.getName(container) ~= OUTPUT_NAME then + local slot = searchInv(container ,targetName) + if slot ~= nil then + local moveCount = output.pullItems(peripheral.getName(container), slot, count) + count = count - moveCount + print("Took " .. moveCount .. " from " .. peripheral.getName(container)) + if count <= 0 then return end + end + end + end + + print("Could not find the remaining " .. count) +end + +function store() + for slot, item in pairs(output.list()) do + print("Storing " .. item.name) + for _, container in pairs(containers) do + if peripheral.getName(container) ~= OUTPUT_NAME then + output.pushItems(peripheral.getName(container), slot) + end + end + end +end + +function listStorage() + local lineCount = 0 + + for _, storage in pairs(containers) do + print(peripheral.getName(storage)) + lineCount = lineCount + 1 + + if lineCount >= LESS_COUNT then + print("Press ENTER to continue...") + read() + lineCount = 0 + end + end +end + +function listItems() + local lineCount = 0 + + for _, container in pairs(containers) do + + for _, item in pairs(container.list()) do + print(item.name .. " x " .. item.count) + lineCount = lineCount + 1 + end + + if lineCount >= LESS_COUNT then + print("Press ENTER to continue...") + read() + lineCount = 0 + end + end +end + +function listFull() + for _, container in pairs(containers) do + print(peripheral.getName(container)) + print("---------------------------------------------") + local lineCount = 0 + for _, item in pairs(container.list()) do + print("\t" .. item.name .. " x " .. item.count) + lineCount = lineCount + 1 + if lineCount >= LESS_COUNT then + print("Press ENTER to continue...") + read() + lineCount = 0 + end + end + print("Press ENTER to continue...") + read() + end +end + +function list(args) + local target = args[2] + + if target == nil then + listFull() + return + end + + local targets = { + storage = function() + listStorage() + end, + + items = function() + listItems() + end + } + + targets[target]() +end + +-- HANDLERS +local handlers = { + get = function(args) + local targetName = args[2] + local count = tonumber(args[3]) + findItem(targetName, count) + end, + + store = function(args) + store(args) + end, + + list = function(args) + list(args) + end +} + +function argParser(args) + local op = args[1] + local handler = handlers[op] + + if handler == nil then + print("Invalid operation.") + return + end + + handler(args) + +end + +function main() + argParser(args) +end + +main() \ No newline at end of file diff --git a/computer/swass/packageinfo.ccpt b/computer/swass/packageinfo.ccpt new file mode 100644 index 0000000..7b5acce --- /dev/null +++ b/computer/swass/packageinfo.ccpt @@ -0,0 +1,12 @@ +{ + name = "SWASS", + comment = "Self Whitewashing Advanced Storage System", + author = "Hion-V", + website = "https://git.subsonics.nl/pootercraft/programs/computer/swass/", + newestversion = "1.0", + install = { + scripturl = "https://git.subsonics.nl/pootercraft/programs/raw/branch/master/computer/swass/packageinstall.lua", + type = "script", + }, + dependencies = {}, +} \ No newline at end of file diff --git a/computer/swass/packageinstall.lua b/computer/swass/packageinstall.lua new file mode 100644 index 0000000..1458bef --- /dev/null +++ b/computer/swass/packageinstall.lua @@ -0,0 +1,143 @@ +--[[ + LumberJack Program Installer + Author: Hion-V + Version: 1.0 + Lines of Code: 161; Characters: 5541 +]] + +-- INSTALL PACKAGE INFO +packageName = "SWASS" +packageURL = "https://git.subsonics.nl/pootercraft/programs/raw/branch/master/computer/swass/bin/swass" +packageFilename = "swass" +packageBinPath = "/bin/" + +-- Read arguments +args = {...} + +-- FILE MANIPULATION FUNCTIONS -- +--[[ Checks if file exists + @param String filepath: Filepath to check + @return boolean: Does the file exist? +--]] +function file_exists(filepath) + local f=io.open(filepath,"r") + if f~=nil then + io.close(f) + return true + else + return false + end +end + +--[[ Stores a file in a desired location + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param String content: Content to store in file +--]] +function storeFile(filepath,content) + writefile = fs.open(filepath,"w") + writefile.write(content) + writefile.close() +end + +--[[ Reads a file from a desired location + @param String filepath: Filepath to the file to read + @param String createnew: (Optional) Content to store in new file and return if file does not exist. Can be nil. + @return String|boolean content|error: Content of the file; If createnew is nil and file doesn't exist boolean false is returned +--]] +function readFile(filepath,createnew) + readfile = fs.open(filepath,"r") + if readfile == nil then + if not (createnew==nil) then + storeFile(filepath,createnew) + return createnew + else + return false + end + end + content = readfile.readAll() + readfile.close() + return content +end + +--[[ Stores a table in a file + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param Table data: Table to store in file +--]] +function storeData(filepath,data) + storeFile(filepath,textutils.serialize(data):gsub("\n","")) +end + +--[[ Reads a table from a file in a desired location + @param String filepath: Filepath to the file to read + @param boolean createnew: If true, an empty table is stored in new file and returned if file does not exist. + @return Table|boolean content|error: Table thats stored in the file; If createnew is false and file doesn't exist boolean false is returned +--]] +function readData(filepath,createnew) + if createnew then + return textutils.unserialize(readFile(filepath,textutils.serialize({}):gsub("\n",""))) + else + return textutils.unserialize(readFile(filepath,nil)) + end +end + +-- HTTP FETCH FUNCTIONS -- +--[[ Gets result of HTTP URL + @param String url: The desired URL + @return Table|boolean result|error: The result of the request; If the URL is not reachable, an error is printed in the terminal and boolean false is returned +--]] +function gethttpresult(url) + if not http.checkURL(url) then + print("ERROR: Url '" .. url .. "' is blocked in config. Unable to fetch data.") + return false + end + result = http.get(url) + if result == nil then + print("ERROR: Unable to reach '" .. url .. "'") + return false + end + return result +end + +--[[ Download file HTTP URL + @param String filepath: Filepath where to create file (if file already exists, it gets overwritten) + @param String url: The desired URL + @return nil|boolean nil|error: nil; If the URL is not reachable, an error is printed in the terminal and boolean false is returned +--]] +function downloadfile(filepath,url) + result = gethttpresult(url) + if result == false then + return false + end + storeFile(filepath,result.readAll()) +end + +-- MISC HELPER FUNCTIONS -- +--[[ Checks wether a String starts with another one + @param String haystack: String to check wether is starts with another one + @param String needle: String to check wether another one starts with it + @return boolean result: Wether the firest String starts with the second one +]]-- +function startsWith(haystack,needle) + return string.sub(haystack,1,string.len(needle))==needle +end + +-- MAIN PROGRAMM -- +if (args[1]=="install") or (args[1]==nil) then + print("[Installer] Installing",packageName) + if downloadfile(packageBinPath..packageFilename,packageURL)==false then + return false + end + print("[Installer] Successfully installed '"..packageName.."'!") +elseif args[1]=="update" then + print("[Installer] Updating "..packageName.."...") + if downloadfile("bin/dig",packageURL)==false then + fs.move() + return false + end +elseif args[1]=="remove" then + print("[Installer] Uninstalling '"..packageName.."'...") + fs.delete("/bin/dig") + print("[Installer] So long, and thanks for all the fish!") +else + print("[Installer] Invalid argument: " .. args[1]) +end \ No newline at end of file