Reformat + add prefix selection for config

This commit is contained in:
Soph :3 2025-11-14 22:43:49 +02:00
parent 88f4173c8e
commit 262c0b5408
13 changed files with 1191 additions and 1141 deletions

View file

@ -21,6 +21,52 @@
- Chatbox support for withdrawing and depositing items
- Remote access via enderstorages
## How to use
1. First, in your /config.lua file, add the following:
```lua
return {
["inventories"] = { -- REQUIRED!! Please set at least one inventory pattern.
".*barrel.*" -- Lua patterns to match all barrels
},
["import"] = { -- Not required, just don't set!
"ender_storage_156" -- A inventory I want to move all items from into our storage
},
["chatbox"] = { -- Not required, just don't set!
["prefix"] = "home",
["players"] = {
["hartbreix"] = "manipulator_42" -- Chatbox support
}
},
["remote"] = { -- Access your items via modem, not required, just don't set!
["ender_storage"] = "ender_storage_493", -- Enderstorage that will be changed (set this to owner-only and computer-chanagable!)
["modem"] = "modem_1277", -- Modem to recieve messages
["remotes"] = { -- Remote access
["red/green/green"] = {
["port"] = 42420,
["password"] = "test123" -- Required!
}
}
}
}
```
2. Run the following command:
```
wget run https://git.sad.ovh/sophie/storage-solution/raw/branch/main/src/.main-installer.lua
```
This will install storage-solution to /storage-solution.
To make it start every time you turn on the computer, add
```
shell.run("wget run https://git.sad.ovh/sophie/storage-solution/raw/branch/main/src/.main-installer.lua")
```
to startup.lua
### [EXTRA!]
You can also run `wget run https://files.sad.ovh/public/storage-solution/.beta-installer.lua`, which is quite unstable. You may experience issues while running the beta version, but also new juicy features :)
## RA
SiSS has a remote access system that allows you to access your items via modem.
To use it, first set up your config.lua correctly. After that you need to implement the tiny_ra_library into your program.
@ -57,44 +103,3 @@ sleep(2)
print("deposits 16 items from the first slot")
ra.depositBySlots({1}, 16)
```
## How to use
1. First, in your /config.lua file, add the following:
```lua
return {
["inventories"] = { -- REQUIRED!! Please set at least one inventory pattern.
".*barrel.*" -- Lua patterns to match all barrels
},
["import"] = { -- Not required, just don't set!
"ender_storage_156" -- A inventory I want to move all items from into our storage
},
["chatbox"] = { -- Not required, just don't set!
["hartbreix"] = "manipulator_42" -- Chatbox support
},
["remote"] = { -- Access your items via modem, not required, just don't set!
["ender_storage"] = "ender_storage_493", -- Enderstorage that will be changed (set this to owner-only and computer-chanagable!)
["modem"] = "modem_1277", -- Modem to recieve messages
["remotes"] = { -- Remote access
["red/green/green"] = {
["port"] = 42420,
["password"] = "test123" -- Required!
}
}
}
}
```
2. Run the following command:
```
wget run https://git.sad.ovh/sophie/storage-solution/raw/branch/main/src/.main-installer.lua
```
This will install storage-solution to /storage-solution.
To make it start every time you turn on the computer, add
```
shell.run("wget run https://git.sad.ovh/sophie/storage-solution/raw/branch/main/src/.main-installer.lua")
```
to startup.lua
### [EXTRA!]
You can also run `wget run https://files.sad.ovh/public/storage-solution/.beta-installer.lua`, which is quite unstable. You may experience issues while running the beta version, but also new juicy features :)

View file

@ -40,7 +40,8 @@ local function traverse_and_download(folder_data, prefix)
for _, dir in ipairs(folder_data.dirs or {}) do
fs.makeDir(download_root .. "/" .. prefix .. dir.href)
local new_prefix = (prefix ~= "" and (prefix .. "/") or "") .. dir.href
local subdir_url = base_url .. "/" .. new_prefix .. "?ls" local response = http.get(subdir_url)
local subdir_url = base_url .. "/" .. new_prefix .. "?ls"
local response = http.get(subdir_url)
if response then
local body = response.readAll()
if not body then return end
@ -59,7 +60,8 @@ if fs.exists(download_root) then
local currentVersion = http.get(base_url .. "/version").readAll();
if previousVersion == currentVersion then
print("Previous version " .. previousVersion .. " is already installed, we're on " .. currentVersion .. " aswell, so skipping installation.")
print("Previous version " ..
previousVersion .. " is already installed, we're on " .. currentVersion .. " aswell, so skipping installation.")
shell.run("storage-solution/main.lua")
return
else

View file

@ -1,6 +1,16 @@
local g = string.gsub
sha256 = loadstring(g(g(g(g(g(g(g(g('Sa=XbandSb=XbxWSc=XlshiftSd=unpackSe=2^32SYf(g,h)Si=g/2^hSj=i%1Ui-j+j*eVSYk(l,m)Sn=l/2^mUn-n%1VSo={0x6a09e667Tbb67ae85T3c6ef372Ta54ff53aT510e527fT9b05688cT1f83d9abT5be0cd19}Sp={0x428a2f98T71374491Tb5c0fbcfTe9b5dba5T3956c25bT59f111f1T923f82a4Tab1c5ed5Td807aa98T12835b01T243185beT550c7dc3T72be5d74T80deb1feT9bdc06a7Tc19bf174Te49b69c1Tefbe4786T0fc19dc6T240ca1ccT2de92c6fT4a7484aaT5cb0a9dcT76f988daT983e5152Ta831c66dTb00327c8Tbf597fc7Tc6e00bf3Td5a79147T06ca6351T14292967T27b70a85T2e1b2138T4d2c6dfcT53380d13T650a7354T766a0abbT81c2c92eT92722c85Ta2bfe8a1Ta81a664bTc24b8b70Tc76c51a3Td192e819Td6990624Tf40e3585T106aa070T19a4c116T1e376c08T2748774cT34b0bcb5T391c0cb3T4ed8aa4aT5b9cca4fT682e6ff3T748f82eeT78a5636fT84c87814T8cc70208T90befffaTa4506cebTbef9a3f7Tc67178f2}SYq(r,q)if e-1-r[1]<q then r[2]=r[2]+1;r[1]=q-(e-1-r[1])-1 else r[1]=r[1]+qVUrVSYs(t)Su=#t;t[#t+1]=0x80;while#t%64~=56Zt[#t+1]=0VSv=q({0,0},u*8)fWw=2,1,-1Zt[#t+1]=a(k(a(v[w]TFF000000),24)TFF)t[#t+1]=a(k(a(v[w]TFF0000),16)TFF)t[#t+1]=a(k(a(v[w]TFF00),8)TFF)t[#t+1]=a(v[w]TFF)VUtVSYx(y,w)Uc(y[w]W0,24)+c(y[w+1]W0,16)+c(y[w+2]W0,8)+(y[w+3]W0)VSYz(t,w,A)SB={}fWC=1,16ZB[C]=x(t,w+(C-1)*4)VfWC=17,64ZSD=B[C-15]SE=b(b(f(B[C-15],7),f(B[C-15],18)),k(B[C-15],3))SF=b(b(f(B[C-2],17),f(B[C-2],19)),k(B[C-2],10))B[C]=(B[C-16]+E+B[C-7]+F)%eVSG,h,H,I,J,j,K,L=d(A)fWC=1,64ZSM=b(b(f(J,6),f(J,11)),f(J,25))SN=b(a(J,j),a(Xbnot(J),K))SO=(L+M+N+p[C]+B[C])%eSP=b(b(f(G,2),f(G,13)),f(G,22))SQ=b(b(a(G,h),a(G,H)),a(h,H))SR=(P+Q)%e;L,K,j,J,I,H,h,G=K,j,J,(I+O)%e,H,h,G,(O+R)%eVA[1]=(A[1]+G)%e;A[2]=(A[2]+h)%e;A[3]=(A[3]+H)%e;A[4]=(A[4]+I)%e;A[5]=(A[5]+J)%e;A[6]=(A[6]+j)%e;A[7]=(A[7]+K)%e;A[8]=(A[8]+L)%eUAVUY(t)t=t W""t=type(t)=="string"and{t:byte(1,-1)}Wt;t=s(t)SA={d(o)}fWw=1,#t,64ZA=z(t,w,A)VU("%08x"):rep(8):format(d(A))V',"S"," local "),"T",",0x"),"U"," return "),"V"," end "),"W","or "),"X","bit32."),"Y","function "),"Z"," do "))()
sha256 = loadstring(g(
g(
g(
g(
g(
g(
g(
g(
'Sa=XbandSb=XbxWSc=XlshiftSd=unpackSe=2^32SYf(g,h)Si=g/2^hSj=i%1Ui-j+j*eVSYk(l,m)Sn=l/2^mUn-n%1VSo={0x6a09e667Tbb67ae85T3c6ef372Ta54ff53aT510e527fT9b05688cT1f83d9abT5be0cd19}Sp={0x428a2f98T71374491Tb5c0fbcfTe9b5dba5T3956c25bT59f111f1T923f82a4Tab1c5ed5Td807aa98T12835b01T243185beT550c7dc3T72be5d74T80deb1feT9bdc06a7Tc19bf174Te49b69c1Tefbe4786T0fc19dc6T240ca1ccT2de92c6fT4a7484aaT5cb0a9dcT76f988daT983e5152Ta831c66dTb00327c8Tbf597fc7Tc6e00bf3Td5a79147T06ca6351T14292967T27b70a85T2e1b2138T4d2c6dfcT53380d13T650a7354T766a0abbT81c2c92eT92722c85Ta2bfe8a1Ta81a664bTc24b8b70Tc76c51a3Td192e819Td6990624Tf40e3585T106aa070T19a4c116T1e376c08T2748774cT34b0bcb5T391c0cb3T4ed8aa4aT5b9cca4fT682e6ff3T748f82eeT78a5636fT84c87814T8cc70208T90befffaTa4506cebTbef9a3f7Tc67178f2}SYq(r,q)if e-1-r[1]<q then r[2]=r[2]+1;r[1]=q-(e-1-r[1])-1 else r[1]=r[1]+qVUrVSYs(t)Su=#t;t[#t+1]=0x80;while#t%64~=56Zt[#t+1]=0VSv=q({0,0},u*8)fWw=2,1,-1Zt[#t+1]=a(k(a(v[w]TFF000000),24)TFF)t[#t+1]=a(k(a(v[w]TFF0000),16)TFF)t[#t+1]=a(k(a(v[w]TFF00),8)TFF)t[#t+1]=a(v[w]TFF)VUtVSYx(y,w)Uc(y[w]W0,24)+c(y[w+1]W0,16)+c(y[w+2]W0,8)+(y[w+3]W0)VSYz(t,w,A)SB={}fWC=1,16ZB[C]=x(t,w+(C-1)*4)VfWC=17,64ZSD=B[C-15]SE=b(b(f(B[C-15],7),f(B[C-15],18)),k(B[C-15],3))SF=b(b(f(B[C-2],17),f(B[C-2],19)),k(B[C-2],10))B[C]=(B[C-16]+E+B[C-7]+F)%eVSG,h,H,I,J,j,K,L=d(A)fWC=1,64ZSM=b(b(f(J,6),f(J,11)),f(J,25))SN=b(a(J,j),a(Xbnot(J),K))SO=(L+M+N+p[C]+B[C])%eSP=b(b(f(G,2),f(G,13)),f(G,22))SQ=b(b(a(G,h),a(G,H)),a(h,H))SR=(P+Q)%e;L,K,j,J,I,H,h,G=K,j,J,(I+O)%e,H,h,G,(O+R)%eVA[1]=(A[1]+G)%e;A[2]=(A[2]+h)%e;A[3]=(A[3]+H)%e;A[4]=(A[4]+I)%e;A[5]=(A[5]+J)%e;A[6]=(A[6]+j)%e;A[7]=(A[7]+K)%e;A[8]=(A[8]+L)%eUAVUY(t)t=t W""t=type(t)=="string"and{t:byte(1,-1)}Wt;t=s(t)SA={d(o)}fWw=1,#t,64ZA=z(t,w,A)VU("%08x"):rep(8):format(d(A))V',
"S", " local "), "T", ",0x"), "U", " return "), "V", " end "), "W", "or "), "X", "bit32."), "Y", "function "), "Z",
" do "))()
local aead = require("lib.plc.aead_chacha_poly")
@ -16,8 +26,10 @@ local function b64u_encode(bin)
local triple = a * 65536 + b * 256 + c
out[#out + 1] = b64abc:sub(bit32.band(bit32.rshift(triple, 18), 63) + 1, bit32.band(bit32.rshift(triple, 18), 63) + 1)
out[#out + 1] = b64abc:sub(bit32.band(bit32.rshift(triple, 12), 63) + 1, bit32.band(bit32.rshift(triple, 12), 63) + 1)
out[#out+1]= i+1<=n and b64abc:sub(bit32.band(bit32.rshift(triple,6), 63)+1,bit32.band(bit32.rshift(triple,6), 63)+1) or ''
out[#out+1]= i+2<=n and b64abc:sub(bit32.band(bit32.rshift(triple,0), 63)+1,bit32.band(bit32.rshift(triple,0), 63)+1) or ''
out[#out + 1] = i + 1 <= n and
b64abc:sub(bit32.band(bit32.rshift(triple, 6), 63) + 1, bit32.band(bit32.rshift(triple, 6), 63) + 1) or ''
out[#out + 1] = i + 2 <= n and
b64abc:sub(bit32.band(bit32.rshift(triple, 0), 63) + 1, bit32.band(bit32.rshift(triple, 0), 63) + 1) or ''
i = i + 3
end
return table.concat(out)
@ -55,7 +67,8 @@ local function hmac_sha256(key, msg)
end
local function int_be(n) -- 32-bit BE
return string.char(bit32.band(bit32.rshift(n,24), 255), bit32.band(bit32.rshift(n,16), 255), bit32.band(bit32.rshift(n,8), 255), bit32.band(n, 255))
return string.char(bit32.band(bit32.rshift(n, 24), 255), bit32.band(bit32.rshift(n, 16), 255),
bit32.band(bit32.rshift(n, 8), 255), bit32.band(n, 255))
end
local function pbkdf2_sha256(password, salt, iterations, dkLen)
@ -138,7 +151,8 @@ local VERSION = "\1"
local KDF_ID = "\1"
local AAD = "SiSS RA rev1|chacha20poly1305"
local function u32be(n) return string.char(bit32.band(bit32.rshift(n,24),255), bit32.band(bit32.rshift(n,16),255), bit32.band(bit32.rshift(n,8),255), bit32.band(n,255)) end
local function u32be(n) return string.char(bit32.band(bit32.rshift(n, 24), 255), bit32.band(bit32.rshift(n, 16), 255),
bit32.band(bit32.rshift(n, 8), 255), bit32.band(n, 255)) end
local function u16be(n) return string.char(bit32.band(bit32.rshift(n, 8), 255), bit32.band(n, 255)) end
local function pack_params(iter)
return u32be(iter) .. u16be(32)

View file

@ -102,7 +102,8 @@ end
---@param replacement string|nil A character to replace typed characters with
---@param history string[]|nil A list of previous entries to provide
---@param completion function|nil A function to call to provide completion
function PrimeUI.inputBox(win, x, y, width, action, placeholder, fgColor, bgColor, placeholderFg, replacement, history, completion, default)
function PrimeUI.inputBox(win, x, y, width, action, placeholder, fgColor, bgColor, placeholderFg, replacement, history,
completion, default)
expect(1, win, "table")
expect(2, x, "number")
expect(3, y, "number")
@ -273,8 +274,11 @@ function PrimeUI.scrollBox(win, x, y, width, height, innerHeight, allowArrowKeys
-- Check for scroll events and set direction.
local dir
if ev[1] == "key" and allowArrowKeys then
if ev[2] == keys.up then dir = -1
elseif ev[2] == keys.down then dir = 1 end
if ev[2] == keys.up then
dir = -1
elseif ev[2] == keys.down then
dir = 1
end
elseif ev[1] == "mouse_scroll" and ev[3] >= x and ev[3] < x + width and ev[4] >= y and ev[4] < y + height then
dir = ev[2]
end
@ -315,7 +319,6 @@ function PrimeUI.scrollBox(win, x, y, width, height, innerHeight, allowArrowKeys
return inner, scroll
end
--- Creates a list of entries that can each be selected.
---@param win window The window to draw on
---@param x number The X coordinate of the inside of the box
@ -387,8 +390,11 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection + 1
if selection > scroll + height - 1 then scroll = scroll + 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
elseif key == keys.up and selection > 1 then
@ -396,14 +402,20 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection - 1
if selection < scroll then scroll = scroll - 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
elseif key == keys.enter then
-- Select the entry: send the action.
if type(action) == "string" then PrimeUI.resolve("selectionBox", action, entries()[selection])
else action(entries()[selection]) end
if type(action) == "string" then
PrimeUI.resolve("selectionBox", action, entries()[selection])
else
action(entries()[selection])
end
end
elseif event == "mouse_click" and key == 1 then
-- Handle clicking the scroll arrows.
@ -414,8 +426,11 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection - 1
if selection < scroll then scroll = scroll - 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
elseif cy == wy + height - 1 and selection < #entries() then
@ -423,8 +438,11 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection + 1
if selection > scroll + height - 1 then scroll = scroll + 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
end
@ -432,13 +450,19 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
local sel = scroll + (cy - wy)
if sel == selection then
-- Select the entry: send the action.
if type(action) == "string" then PrimeUI.resolve("selectionBox", action, entries()[selection])
else action(entries()[selection]) end
if type(action) == "string" then
PrimeUI.resolve("selectionBox", action, entries()[selection])
else
action(entries()[selection])
end
else
selection = sel
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
end
@ -452,8 +476,11 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection - 1
if selection < scroll then scroll = scroll - 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
elseif key > 0 and selection < #entries() then
@ -461,8 +488,11 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
selection = selection + 1
if selection > scroll + height - 1 then scroll = scroll + 1 end
-- Send action if necessary.
if type(selectChangeAction) == "string" then PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then selectChangeAction(selection) end
if type(selectChangeAction) == "string" then
PrimeUI.resolve("selectionBox", selectChangeAction, selection)
elseif selectChangeAction then
selectChangeAction(selection)
end
-- Redraw screen.
drawEntries()
end
@ -473,7 +503,6 @@ function PrimeUI.selectionBox(win, x, y, width, height, entries, action, selectC
return drawEntries
end
return {
PrimeUI = PrimeUI
}

View file

@ -1,4 +1,3 @@
---@class InnerRemote
---@field port number
---@field password string
@ -8,11 +7,15 @@
---@field ender_storage string
---@field modem string
---@field remotes table<string, InnerRemote>
---
---@class Chatbox
---@field players table<string, string>
---@field prefix string|nil
---@class Config
---@field inventories string[]
---@field import string[]|nil
---@field chatbox table<string, string>|nil
---@field chatbox Chatbox|nil
---@field remote Remote
local inv = require("modules.inv")

View file

@ -50,7 +50,6 @@ local function levDist(s, t)
end
local function findBest(data, item)
local sorted_data = {}
for _, z in ipairs(data) do
@ -84,7 +83,7 @@ end
local BOT_NAME = "&cS &eI&an&3c &5S&cI&6S"
function auth(user)
local manip = config.chatbox[user]
local manip = config.chatbox.players[user]
if manip then
return true
else
@ -99,9 +98,9 @@ function run()
while true do
local _, user, command, args = os.pullEvent("command")
if command == "sis" then
if command == (config.chatbox.prefix or "sis") then
if args[1] == "whoami" then
local manip = config.chatbox[user]
local manip = config.chatbox.players[user]
if manip then
chatbox.tell(user, "You are " .. user .. ", linked with `" .. manip .. "`.", BOT_NAME)
else
@ -116,7 +115,7 @@ function run()
end
local perip = peripheral.wrap(config.chatbox[user])
local perip = peripheral.wrap(config.chatbox.players[user])
---@type ccTweaked.peripheral.Inventory
local peripInventory = perip.getInventory()
@ -172,7 +171,7 @@ function run()
goto continue
end
local perip = peripheral.wrap(config.chatbox[user])
local perip = peripheral.wrap(config.chatbox.players[user])
---@type ccTweaked.peripheral.Inventory
local peripInventory = perip.getInventory()

View file

@ -89,7 +89,6 @@ local function sendItemToSelf(itemName, perip, maxAmount)
end
end
end
-- sleep(0.1)
turtleMoveAllowed = true
return total

View file

@ -30,7 +30,6 @@ local function run()
for color, remote in pairs(config.remote.remotes) do
if remote.port == channel then
local err, data = pcall(function()
return hmac.decrypt_with_password(remote.password, message)
end)
@ -38,7 +37,6 @@ local function run()
if not data then return end
if err == true then
---@type RemoteAccess
local json, errj = textutils.unserialiseJSON(data)
if json or errj ~= nil then

View file

@ -24,7 +24,8 @@ local function run()
local refiltered = {}
for i, filter in ipairs(filtered) do
refiltered[i] = filter.name .. string.rep(" ", w-(2+#filter.name+#tostring(filter.count))) .. tostring(filter.count)
refiltered[i] = filter.name ..
string.rep(" ", w - (2 + #filter.name + #tostring(filter.count))) .. tostring(filter.count)
end
return refiltered
end