View difference between Paste ID: HJ0YKjwR and Leyi4Xi1
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