summaryrefslogtreecommitdiffstats
path: root/pkg/gui/recording.go
blob: 5e0914303e8721479deb26a1c948199f7c88d7d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package gui

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"os"
	"time"
)

func recordingEvents() bool {
	return os.Getenv("RECORD_EVENTS") == "true"
}

func (gui *Gui) timeSinceStart() int64 {
	return time.Since(gui.StartTime).Milliseconds()
}

func (gui *Gui) replayRecordedEvents() {
	if os.Getenv("REPLAY_EVENTS_FROM") == "" {
		return
	}

	events, err := gui.loadRecordedEvents()
	if err != nil {
		log.Fatal(err)
	}

	ticker := time.NewTicker(time.Millisecond)
	defer ticker.Stop()

	var leeway int64 = 1000

	for _, event := range events {
		for range ticker.C {
			now := gui.timeSinceStart() - leeway
			if gui.g != nil && now >= event.Timestamp {
				gui.g.ReplayedEvents <- *event.Event
				break
			}
		}
	}
}

func (gui *Gui) loadRecordedEvents() ([]RecordedEvent, error) {
	path := os.Getenv("REPLAY_EVENTS_FROM")

	data, err := ioutil.ReadFile(path)
	if err != nil {
		return nil, err
	}

	events := []RecordedEvent{}

	err = json.Unmarshal(data, &events)
	if err != nil {
		return nil, err
	}

	return events, nil
}

func (gui *Gui) saveRecordedEvents() error {
	if !recordingEvents() {
		return nil
	}

	jsonEvents, err := json.Marshal(gui.RecordedEvents)
	if err != nil {
		return err
	}

	return ioutil.WriteFile("recorded_events.json", jsonEvents, 0600)
}

func (gui *Gui) recordEvents() {
	for event := range gui.g.RecordedEvents {
		recordedEvent := RecordedEvent{
			Timestamp: gui.timeSinceStart(),
			Event:     event,
		}

		gui.RecordedEvents = append(gui.RecordedEvents, recordedEvent)
	}
}