· 6 months ago · Mar 26, 2025, 10:45 PM
1version = 20230824.1330
2--[[
3 https://pastebin.com/8qbeZevX
4 Last edited: see version YYYYMMDD.HHMM
5 use ' pastebin run 8qbeZevX ' in turtle terminal
6 This will load useful tools and utilities
7]]
8
9local libDir = "lib" -- set library directory name
10local tmpDir = "tmp" -- set temp folder name to 'tmp'
11local root = "."
12local files = {} -- table of main files
13local libFiles = {} -- table of lib files (clsTurtle.lua and menu.lua)
14local fileSizes = {} -- table of current file sizes
15local libFileSizes = {} -- table of current library file sizes
16
17local function clear()
18 term.clear()
19 term.setCursorPos(1, 1)
20end
21
22local function log(text)
23 print(text)
24 local h = fs.open("update.log", "a")
25 h.writeLine(text)
26 h.close()
27end
28
29local function checkLabel()
30 if os.getComputerLabel() == nil then
31 local noname = true
32 while noname do
33 clear()
34 log("Give this turtle a name (no spaces)_")
35 name = read()
36 if name == '' then
37 print("Just pressing Enter does not work")
38 elseif string.find(name, ' ') ~= nil then
39 print("NO SPACES!")
40 else
41 noname = false
42 end
43 if noname then
44 sleep(2)
45 end
46 end
47
48 os.setComputerLabel(name)
49 log("Computer label set to "..os.getComputerLabel())
50 end
51end
52
53local function checkFileExists(fileName, isLib)
54 --[[ check in ./ or ./lib/ only (existing files) ]]
55 if isLib then -- checking a library file
56 if fs.exists(fs.combine(libDir, fileName)) or fs.exists(fs.combine(libDir, fileName..".lua")) then
57 return true
58 end
59 else
60 if fs.exists(fileName) or fs.exists(fileName..".lua") then
61 return true
62 end
63 end
64 return false
65end
66
67local function createTempDir()
68 if fs.exists(tmpDir) then
69 log("./"..tmpDir.." already exists")
70 else
71 log("./"..tmpDir.." created")
72 fs.makeDir(tmpDir)
73 end
74end
75
76local function getFile(pastebin, fileName)
77 --[[eg "UFvjc1bw", "tmp", "tk"
78 use pastebin get to download file to tmp]]
79 log("Fetching "..pastebin.." from Pastebin...")
80 status, retval = pcall(shell.run, "pastebin", "get", pastebin, fs.combine(tmpDir, fileName))
81 --if shell.run("pastebin", "get", pastebin, fs.combine(tmpDir, fileName)) then
82 if status then
83 log("Fetch error message "..tostring(retVal))
84 log("Fetch success: "..tostring(status))
85 log(fileName.." copied to ./"..tmpDir)
86 return true
87 else
88 log(retval)
89 log("failed to copy "..fileName.." from Pastebin")
90 return false
91 end
92end
93
94local function moveFile(isLib, fileName) -- movgee tmp copy to /lib/
95 if isLib then
96 fs.delete(fs.combine(libDir, fileName))
97 sleep(1)
98 fs.move(fs.combine(tmpDir, fileName), fs.combine(libDir, fileName)) -- move to lib/
99 log("Moved: "..fileName.." from ./"..tmpDir.." to ./"..libDir.."/")
100 else
101 fs.delete(fileName)
102 sleep(1)
103 fs.move(fs.combine(tmpDir, fileName), fs.combine(root, fileName)) --move to root
104 log("Moved: "..fileName.." from ./"..tmpDir.." to ./")
105 end
106end
107
108local function getVersion(line, fileName)
109 --[[ version = 20201223.1104 ]]
110 local version = 0
111 if line == nil then
112 log("Error reading "..fileName)
113 else
114 line = line:gsub(" ", "") -- remove spaces
115 local start = line:find("=")
116
117 if start ~= nil then -- found
118 version = tonumber(line:sub(start + 1))
119 end
120 end
121
122 return version
123end
124
125local function isNewer(isLib, fileName)
126 --[[ open files in tmp and .. or ../tmp to read file version ]]
127 local old = nil -- declare old file handle
128 local new = nil -- declare new file handle
129 local move = true -- set move flag to true
130 local oldOpen, newOpen = false, false
131
132 if isLib then -- file is in lib/
133 if checkFileExists(fileName, true) then
134 old = fs.open(fs.combine(libDir, fileName), "r")
135 move = false
136 oldOpen = true
137 end
138 else -- not a library file
139 if checkFileExists(fileName, false) then
140 old = fs.open(fileName, "r")
141 move = false
142 oldOpen = true
143 end
144 end
145
146 if not move then -- previous version of file exists
147 if fs.exists(fs.combine(tmpDir, fileName)) then -- should exist in tmp folder
148 new = fs.open(fs.combine(tmpDir, fileName), "r")
149 newOpen = true
150 local oldVer = getVersion(old.readLine(),fileName)
151 log("Existing "..fileName.." version: "..oldVer)
152 local newVer = getVersion(new.readLine(), fileName)
153 log("Downloaded "..fileName.." version: "..newVer)
154 if oldVer > 0 and newVer > 0 then
155 if newVer > oldVer then
156 move = true
157 end
158 elseif oldVer == 0 and newVer > 0 then
159 move = true
160 end
161 end
162 end
163
164 if newOpen then
165 new.close()
166 end
167 if oldOpen then
168 old.close()
169 end
170 return move
171end
172
173local function process(key, value, isLib)
174 local fileName = key..".lua"
175 local count = 0
176 local fileSize = 0
177 local freeSpace = fs.getFreeSpace("./")
178 log("\nAvailable space: "..freeSpace)
179 log("Checking: "..fileName)
180 if isLib then
181 fileSize = libFileSizes[key]
182 else
183 fileSize = fileSizes[key]
184 end
185 log(fileName.." size:"..fileSize)
186 log("Available space after fetch: "..freeSpace - fileSize)
187 if freeSpace - fileSize < 0 then
188 clear()
189 local message =
190[[Insufficient disk space for update.
1911. Save your game
1922. Edit the file:
193serverconfig/computercraft-server.toml
194(in your game save folder)
1953. Change line 2:
196computer_space_limit = 1000000 to
197computer_space_limit = 2000000 or more
1984. Re-start the game
1995. Run the updater again
200]]
201 log(message)
202 return -1
203 else
204 if getFile(value, fileName) then -- download file to /tmp
205 if isNewer(isLib, fileName) then
206 moveFile(isLib, fileName) -- move tmp copy to /lib
207 count = count + 1
208 else
209 log(fileName.." is newer or unchanged")
210 end
211 sleep(1)
212 log("Removing "..tmpDir.."/"..fileName)
213 fs.delete(fs.combine(tmpDir, fileName))
214 sleep(2)
215 end
216 end
217
218 return count
219end
220
221local function addFileSize(isLib, tblName, key)
222 local fileName = key..".lua"
223 if checkFileExists(fileName, isLib) then
224 if isLib then
225 tblName[key] = fs.getSize(fs.combine(libDir, fileName))
226 log("File size "..libDir.."/"..fileName..": "..tblName[key])
227 else
228 tblName[key] = fs.getSize(fileName)
229 log("File size "..fileName..": "..tblName[key])
230 end
231 else
232 tblName[key] = 0
233 log("File size "..fileName.."\t: "..tblName[key].." (file not present)")
234 end
235
236end
237
238function main()
239 local doContinue = true -- set continue flag
240 clear()
241 checkLabel() -- make sure turtle label is set
242 createTempDir() -- create /tmp/
243 local tk = "UFvjc1bw"
244
245 libFiles['clsTurtle'] = "tvfj90gK"
246 libFiles['menu'] = "BhjbYsw4"
247
248 --files["tk"] = "UFvjc1bw"
249 files['go'] = "xQqK3VcK"
250 files['lavaRefuel'] = "kFZsXu99"
251 files['d'] = "i2MRYcsZ"
252 files['u'] = "idtySGKX"
253 files['b'] = "g7DjxRbr"
254 files['f'] = "KXCakmNn"
255 files['r'] = "DH6smTHb"
256 files['l'] = "yWDKZpvj"
257 files['p'] = "D25pg0QQ"
258 files['x'] = 'Z9GBSM8e'
259 files['flint'] = "dBJ0frzj"
260 files['data'] = "fCKDc9Vi"
261
262 local updated = 0
263 local libUpdated = 0
264 local h = fs.open("update.log", "w")
265 h.writeLine('Update Log:')
266 h.close()
267
268 log("Checking file sizes:\n")
269
270 for key, _ in pairs(libFiles) do
271 addFileSize(true, libFileSizes, key)
272 end
273 addFileSize(false, fileSizes, "tk")
274 for key, _ in pairs(files) do
275 addFileSize(false, fileSizes, key)
276 end
277 local freeSpace = fs.getFreeSpace("./")
278 log("Free space: "..freeSpace.."\n")
279 clear()
280 local updated, libUpdated = 0, 0
281 updated = updated + process("tk", tk, false) -- start with tk as may cause out of space error
282 if updated >= 0 then
283 for key,value in pairs(libFiles) do
284 libUpdated = libUpdated + process(key, value, true) -- download lib files from pastebin to tmp/
285 end
286 for key,value in pairs(files) do
287 updated = updated + process(key, value, false) -- download root files from pastebin to tmp/
288 end
289 sleep(1)
290 log("Attempting deletion of ./"..tmpDir)
291 status, retval = pcall(fs.delete, tmpDir)
292 if status then
293 log("./"..tmpDir.." deleted")
294 else
295 log("Directory delete error message:\n "..tostring(retVal))
296 end
297 log("\nOperation Complete ")
298 log(libUpdated.." library files updated")
299 log(updated.." root files updated")
300 end
301 print("See update.log for details")
302end
303
304main()