@@ -12,6 +12,12 @@ import (
12
12
"time"
13
13
)
14
14
15
+ type CTFTimeInfo struct {
16
+ Title string
17
+ Start time.Time
18
+ Finish time.Time
19
+ }
20
+
15
21
func init () {
16
22
Commands = append (Commands , Command {
17
23
Name : "ctftime" ,
@@ -37,7 +43,20 @@ func CtfTimeHelp() string {
37
43
"the ctftime urls will be used to aid in the generation of writeups with the " + theme .ColorGreen + "`writeup`" + theme .ColorReset + " command\n \n "
38
44
}
39
45
40
- func showStats (ctfTimeUrl string ) {
46
+ func ctftimeSpinner () {
47
+ emojis := []string {
48
+ "🕛" , "⏳" , "🕧" , "🕐" , "⏰" , "🕞" , "⏲️" , "🚩" ,
49
+ }
50
+
51
+ for {
52
+ for _ , e := range emojis {
53
+ fmt .Printf ("\r %s" , e )
54
+ time .Sleep (200 * time .Millisecond )
55
+ }
56
+ }
57
+ }
58
+
59
+ func fetchInfo (ctfTimeUrl string , info * CTFTimeInfo ) {
41
60
splits := strings .Split (ctfTimeUrl , "/" )
42
61
eventId := splits [len (splits )- 1 ]
43
62
@@ -68,36 +87,41 @@ func showStats(ctfTimeUrl string) {
68
87
log .Fatalf ("💥 " + theme .ColorRed + " error" + theme .ColorReset + ": %v\n " , err )
69
88
}
70
89
71
- title := result ["title" ]
72
- fmt .Printf (theme .ColorGray + "title: " + theme .ColorBlue + "%s" + theme .ColorReset + "\n " , title )
73
-
74
- now := time .Now ()
90
+ info .Title = fmt .Sprintf ("%s" , result ["title" ])
75
91
76
92
start := fmt .Sprintf ("%s" , result ["start" ])
77
- startTime , err := time .Parse (time .RFC3339 , start )
93
+ info .Start , err = time .Parse (time .RFC3339 , start )
94
+
78
95
if err != nil {
79
96
log .Fatalf ("💥 " + theme .ColorRed + " error" + theme .ColorReset + ": %v\n " , err )
80
97
}
81
98
82
99
finish := fmt .Sprintf ("%s" , result ["finish" ])
83
- finishTime , err := time .Parse (time .RFC3339 , finish )
100
+ info .Finish , err = time .Parse (time .RFC3339 , finish )
101
+
84
102
if err != nil {
85
103
log .Fatalf ("💥 " + theme .ColorRed + " error" + theme .ColorReset + ": %v\n " , err )
86
104
}
105
+ }
106
+
107
+ func showInfo (info * CTFTimeInfo ) {
108
+ fmt .Printf (theme .ColorGray + "title: " + theme .ColorBlue + "%s" + theme .ColorReset + "\n " , info .Title )
109
+
110
+ now := time .Now ()
87
111
88
- fmt .Printf (theme .ColorGray + "start: " + theme .ColorGreen + "%v " + theme .ColorGray + "finish: " + theme .ColorRed + "%v" + theme .ColorReset + "\n " , startTime , finishTime )
112
+ fmt .Printf (theme .ColorGray + "start: " + theme .ColorGreen + "%v " + theme .ColorGray + "finish: " + theme .ColorRed + "%v" + theme .ColorReset + "\n " , info . Start , info . Finish )
89
113
90
- started := startTime .Before (now )
91
- finished := finishTime .Before (now )
114
+ started := info . Start .Before (now )
115
+ finished := info . Finish .Before (now )
92
116
ongoing := started && ! finished
93
117
94
118
if ongoing {
95
- fmt .Printf (theme .ColorGray + "time remaining: " + theme .ColorReset + "%v\n " , finishTime .Sub (now ))
119
+ fmt .Printf (theme .ColorGray + "time remaining: " + theme .ColorReset + "%v\n " , info . Finish .Sub (now ))
96
120
} else if finished {
97
- fmt .Printf (theme .ColorGray + "time since finish: " + theme .ColorReset + "%v\n " , finishTime .Sub (now ))
121
+ fmt .Printf (theme .ColorGray + "time since finish: " + theme .ColorReset + "%v\n " , info . Finish .Sub (now ))
98
122
} else {
99
- fmt .Printf (theme .ColorGray + "time to start: " + theme .ColorReset + "%v\n " , startTime .Sub (now ))
100
- fmt .Printf (theme .ColorGray + "time to finish: " + theme .ColorReset + "%v\n " , finishTime .Sub (now ))
123
+ fmt .Printf (theme .ColorGray + "time to start: " + theme .ColorReset + "%v\n " , info . Start .Sub (now ))
124
+ fmt .Printf (theme .ColorGray + "time to finish: " + theme .ColorReset + "%v\n " , info . Finish .Sub (now ))
101
125
}
102
126
}
103
127
@@ -120,11 +144,23 @@ func CtfTime(args []string) {
120
144
return
121
145
}
122
146
147
+ go ctftimeSpinner ()
148
+
149
+ infos := make ([]CTFTimeInfo , len (config .CtfTimeUrls ))
150
+
151
+ for idx , ctfTimeUrl := range config .CtfTimeUrls {
152
+ if strings .Contains (ctfTimeUrl , "ctftime.org" ) {
153
+ fetchInfo (ctfTimeUrl , & infos [idx ])
154
+ }
155
+ }
156
+
157
+ fmt .Printf ("\r " )
158
+
123
159
for idx , ctfTimeUrl := range config .CtfTimeUrls {
124
160
fmt .Printf (theme .ColorGray + "url: " + theme .ColorReset + "%v" + theme .ColorReset + "\n " , ctfTimeUrl )
125
161
126
162
if strings .Contains (ctfTimeUrl , "ctftime.org" ) {
127
- showStats ( ctfTimeUrl )
163
+ showInfo ( & infos [ idx ] )
128
164
if idx + 1 < len (config .CtfTimeUrls ) {
129
165
fmt .Printf ("\n " )
130
166
}
0 commit comments