local data local file = "./p2p.tbl" local function save() local f = fs.open(file, "w") f.write(textutils.serialise(data)) f.close() end local function load() if fs.exists(file) then local f = fs.open(file, "r") local x = textutils.unserialise(f.readAll()) f.close() return x end end local function split(str) local t = {} for w in str:gmatch("%S+") do table.insert(t, w) end return t end data = load() or {} local case_insensitive = { __index = function( table, key ) local value = rawget( table, key ) if value ~= nil then return value end if type(key) == "string" then local value = rawget( table, string.lower(key) ) if value ~= nil then return value end end return nil end } setmetatable(data, case_insensitive) local function tunnel_info(name) local d = data[name] return ("%s: %d %s"):format(name, d.channels, d.description) end local commands = { list = function() for t in pairs(data) do print(tunnel_info(t)) end end, info = function(name) print(tunnel_info(name)) end, describe = function(name) local t = data[name] print("Description:", t.description) write "New description: " t.description = read() end, add = function(name) data[name] = { channels = 0, description = "None set." } end, channels = function(name, by) local by = tonumber(by) if not by then error "Invalid number!" end local t = data[name] print("Channels:", t.channels) print("Increasing by:", by) t.channels = t.channels + by print("New channels:", t.channels) end, delete = function(name) data[name] = nil end } setmetatable(commands, case_insensitive) local hist = {} while true do write "> " local text = read(nil, hist) table.insert(hist, text) local tokens = split(text) local command = table.remove(tokens, 1) local ok, err = pcall(commands[command], unpack(tokens)) save() if not ok then printError(err) end end