SHOW:
|
|
- or go back to the newest paste.
| 1 | if clearEventLog then | |
| 2 | print("Already initialised!")
| |
| 3 | return false | |
| 4 | end | |
| 5 | - | local function overwrite(original, fake) |
| 5 | + | local KeyToClearLog = 59 |
| 6 | - | original = function(sFilter) |
| 6 | + | |
| 7 | ||
| 8 | local stepsTaken = 0 | |
| 9 | local isRestoring = fs.exists(".events")
| |
| 10 | local fileInstance | |
| 11 | local waitingFor | |
| 12 | - | if stepsTaken > TasksBetweenSleeps then |
| 12 | + | |
| 13 | local function overwrite(originaltable,originalname, fake, funcType) | |
| 14 | originaltable[originalname] = function(...) | |
| 15 | if isRestoring then | |
| 16 | if not fileInstance then | |
| 17 | fileInstance = fs.open(".events","r")
| |
| 18 | end | |
| 19 | stepsTaken = stepsTaken + 1 | |
| 20 | if funcType == 1 and stepsTaken > TasksBetweenSleeps then | |
| 21 | stepsTaken = 0 | |
| 22 | - | return original(sFilter) --recursive pull |
| 22 | + | |
| 23 | fake("isomnia")
| |
| 24 | - | return textutils.unserialize(fakeEvent) |
| 24 | + | |
| 25 | local fakeEvent = fileInstance.readLine() | |
| 26 | if not fakeEvent or #fakeEvent == 0 then | |
| 27 | isRestoring = false | |
| 28 | fileInstance.close() | |
| 29 | - | local event = {fake(sFilter)}
|
| 29 | + | |
| 30 | - | fileInstance.write(textutils.serialize(event)) |
| 30 | + | if waitingFor then |
| 31 | - | fileInstance.write("\n")
|
| 31 | + | if waitingFor[1] == "timer" then |
| 32 | - | if event and #event==2 and event[1] == "key" and event[2] == 59 then |
| 32 | + | fileInstance.write(textutils.serialize(waitingFor)) |
| 33 | fileInstance.write("\n")
| |
| 34 | - | fs.delete(".events")
|
| 34 | + | return unpack(waitingFor) |
| 35 | - | print("History deleted!")
|
| 35 | + | end |
| 36 | end | |
| 37 | return originaltable[originalname](...) --recursive pull | |
| 38 | end | |
| 39 | local fakeTable = textutils.unserialize(fakeEvent) | |
| 40 | if fakeTable and fakeTable[1] then | |
| 41 | if fakeTable[1] == "terminate" then | |
| 42 | - | overwrite(os.pullEventRaw,pull) |
| 42 | + | error( "Terminated", 0 ) |
| 43 | end | |
| 44 | - | overwrite(math.random,rand) |
| 44 | + | if fakeTable[2] and fakeTable[2] == "timerStart" then |
| 45 | waitingFor = {"timer",fakeTable[1]}
| |
| 46 | return fakeTable[1] | |
| 47 | end | |
| 48 | if fakeTable[1] == "timer" then | |
| 49 | waitingFor = nil | |
| 50 | end | |
| 51 | end | |
| 52 | return unpack(fakeTable) | |
| 53 | else | |
| 54 | if not fileInstance then | |
| 55 | fileInstance = fs.open(".events","w")
| |
| 56 | end | |
| 57 | local event = {fake(...)}
| |
| 58 | if event ~= nil and event[1] ~= nil then | |
| 59 | if funcType == 2 and tonumber(event[1]) then | |
| 60 | event[2] = "timerStart" | |
| 61 | end | |
| 62 | fileInstance.write(textutils.serialize(event)) | |
| 63 | fileInstance.write("\n")
| |
| 64 | if #event==2 and event[1] == "key" and event[2] == KeyToClearLog then | |
| 65 | clearEventLog() | |
| 66 | end | |
| 67 | if event[1] == "terminate" then | |
| 68 | error( "Terminated", 0 ) | |
| 69 | end | |
| 70 | end | |
| 71 | return unpack(event) | |
| 72 | end | |
| 73 | end | |
| 74 | end | |
| 75 | function clearEventLog(noOutput) | |
| 76 | fileInstance.close() | |
| 77 | fileInstance = nil | |
| 78 | fs.delete(".events")
| |
| 79 | if not noOutput then | |
| 80 | local x,y = term.getCursorPos() | |
| 81 | write("Event Log deleted!")
| |
| 82 | term.setCursorPos(x,y) | |
| 83 | end | |
| 84 | return true | |
| 85 | end | |
| 86 | local pull = os.pullEventRaw | |
| 87 | overwrite(os,"pullEvent",pull,1) | |
| 88 | local rand = math.random | |
| 89 | overwrite(math,"random",rand,0) | |
| 90 | local timer = os.startTimer | |
| 91 | overwrite(os,"startTimer",timer,2) | |
| 92 | local peri = peripheral.call | |
| 93 | overwrite(peripheral,"call",peri,0) | |
| 94 | local shutdown = os.shutdown | |
| 95 | os.shutdown = function() | |
| 96 | clearEventLog(true) | |
| 97 | shutdown() | |
| 98 | end | |
| 99 | local reboot = os.reboot | |
| 100 | os.reboot = function() | |
| 101 | clearEventLog(true) | |
| 102 | reboot() | |
| 103 | end | |
| 104 | if turtle then | |
| 105 | for name,func in pairs(turtle.native) do | |
| 106 | local privateFunc = func | |
| 107 | overwrite(turtle,name,privateFunc,3) | |
| 108 | end | |
| 109 | end |