├── .github
└── workflows
│ └── release.yml
├── .gitignore
├── .goreleaser.yaml
├── LICENSE
├── README.md
├── assets
└── example.gif
├── cmd
├── root.go
└── start.go
├── go.mod
├── go.sum
├── internal
├── game
│ ├── data
│ │ ├── bash.json
│ │ ├── c++.json
│ │ ├── c.json
│ │ ├── crystal.json
│ │ ├── csharp.json
│ │ ├── css.json
│ │ ├── emacs.json
│ │ ├── en.json
│ │ ├── erlang.json
│ │ ├── go.json
│ │ ├── haskell.json
│ │ ├── html.json
│ │ ├── java.json
│ │ ├── javascript.json
│ │ ├── json.json
│ │ ├── julia.json
│ │ ├── lisp.json
│ │ ├── lua.json
│ │ ├── ocaml.json
│ │ ├── perl.json
│ │ ├── php.json
│ │ ├── powershell.json
│ │ ├── python.json
│ │ ├── r.json
│ │ ├── ruby.json
│ │ ├── rust.json
│ │ ├── scss.json
│ │ ├── sql.json
│ │ ├── swift.json
│ │ ├── tex.json
│ │ ├── typescript.json
│ │ ├── vala.json
│ │ ├── vim.json
│ │ ├── wolfram.json
│ │ ├── yaml.json
│ │ └── zig.json
│ ├── languages.go
│ ├── typing.go
│ └── words.go
└── tui
│ ├── model.go
│ ├── styles.go
│ ├── update.go
│ └── view.go
└── main.go
/.github/workflows/release.yml:
--------------------------------------------------------------------------------
1 | # .github/workflows/release.yml
2 | name: Release
3 |
4 | on:
5 | push:
6 | tags:
7 | - 'v*'
8 |
9 | permissions:
10 | contents: write
11 |
12 | jobs:
13 | goreleaser:
14 | runs-on: ubuntu-latest
15 | steps:
16 | - name: Checkout
17 | uses: actions/checkout@v4
18 | with:
19 | fetch-depth: 0
20 |
21 | - name: Set up Go
22 | uses: actions/setup-go@v5
23 | with:
24 | go-version: '1.23.2'
25 |
26 | - name: Run GoReleaser
27 | uses: goreleaser/goreleaser-action@v6
28 | with:
29 | version: '~>v2'
30 | args: release --clean
31 | env:
32 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | dist/
2 |
3 | # bin
4 | typtea
--------------------------------------------------------------------------------
/.goreleaser.yaml:
--------------------------------------------------------------------------------
1 | # .goreleaser.yaml
2 | version: 1
3 |
4 | project_name: typtea
5 |
6 | before:
7 | hooks:
8 | - go mod tidy
9 | - go mod download
10 |
11 | builds:
12 | - id: typtea
13 | main: ./main.go
14 | binary: typtea
15 | env:
16 | - CGO_ENABLED=0
17 | goos:
18 | - linux
19 | - windows
20 | - darwin
21 | goarch:
22 | - amd64
23 | - arm64
24 | ldflags:
25 | - -s -w -X github.com/ashish0kumar/typtea/cmd.version={{.Version}}
26 |
27 | archives:
28 | - id: default
29 | format: tar.gz
30 | format_overrides:
31 | - goos: windows
32 | format: zip
33 | name_template: >-
34 | {{ .ProjectName }}_
35 | {{- .Os }}_
36 | {{- if eq .Arch "amd64" }}x86_64
37 | {{- else }}{{ .Arch }}{{ end }}
38 | {{- if .Arm }}v{{ .Arm }}{{ end }}
39 | files:
40 | - README.md
41 | - LICENSE
42 |
43 | checksum:
44 | name_template: 'checksums.txt'
45 |
46 | changelog:
47 | sort: asc
48 | filters:
49 | exclude:
50 | - '^docs:'
51 | - '^test:'
52 | - '^chore:'
53 | - '^ci:'
54 | - '^build:'
55 |
56 | release:
57 | draft: false
58 | prerelease: auto
59 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Ashish
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
typtea
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | Minimal terminal-based typing speed test with support for dozens of programming languages
13 |
14 |
15 |
16 |

17 |
18 |
19 | ---
20 |
21 | ## Features
22 |
23 | - **Terminal-based typing** with WPM and accuracy tracking
24 | - **Multi-language support** including English and 30+ programming languages
25 | - **Infinite word generation** with smooth 3-line scrolling display
26 | - **Minimalist TUI** built with Bubble Tea and Lipgloss
27 | - **Embedded language data** for easy distribution
28 | - **Accurate metrics** following standard typing test calculations
29 |
30 | ### Supported Languages
31 |
32 | | | | | |
33 | |-----------|-----------|-----------|-----------|
34 | | Bash | C | C++ | C# |
35 | | Crystal | CSS | Emacs | English 1k|
36 | | Erlang | Go | Haskell | HTML |
37 | | Java | JavaScript| JSON | Julia |
38 | | Lisp | Lua | OCaml | Perl |
39 | | PHP | PowerShell| Python | R |
40 | | Ruby | Rust | SCSS | SQL |
41 | | Swift | TeX | TypeScript| Vala |
42 | | Vimscript | Wolfram | YAML | Zig |
43 | | | | | |
44 |
45 | ---
46 |
47 | ## Installation
48 |
49 | ### Arch Linux (AUR)
50 |
51 | ```bash
52 | yay -S typtea
53 | ```
54 |
55 | ### Via `go install`
56 |
57 | ```bash
58 | go install github.com/ashish0kumar/typtea@latest
59 | ```
60 |
61 | ### Build from Source
62 |
63 | ```bash
64 | git clone --depth=1 https://github.com/ashish0kumar/typtea
65 | cd typtea/
66 | go build
67 | sudo mv typtea /usr/local/bin/
68 | typtea -h
69 | ```
70 |
71 | ---
72 |
73 | ## Usage
74 |
75 | ### Basic Commands
76 |
77 | ```yaml
78 | # Start a 30-second English typing test (default)
79 | typtea start
80 |
81 | # Start a 60-second typing test
82 | typtea start --duration 60
83 |
84 | # Start a Rust keywords typing test
85 | typtea start --lang rust
86 |
87 | # Combine duration and language
88 | typtea start --duration 45 --lang javascript
89 |
90 | # List all available languages
91 | typtea start --list-langs
92 |
93 | # Get help
94 | typtea --help
95 | typtea start --help
96 | ```
97 |
98 | ### During the Test
99 |
100 | - **The test starts** when you begin typing
101 | - **Backspace** to correct mistakes
102 | - **Enter** to restart after completion
103 | - **Esc** to quit the application
104 |
105 | ---
106 |
107 | ## Development
108 |
109 | ### Prerequisites
110 |
111 | [Go 1.19+](https://go.dev/doc/install)
112 |
113 | ### Setup
114 |
115 | ```bash
116 | git clone https://github.com/ashish0kumar/typtea.git
117 | cd typtea
118 | go mod tidy
119 | go build
120 | ./typtea start
121 | ```
122 |
123 | ### Adding New Languages
124 |
125 | 1. Create a `JSON` file in `internal/game/data/` with the format:
126 |
127 | ```json
128 | {
129 | "name": "Language Name",
130 | "words": ["word1", "word2", "word3", ...]
131 | }
132 | ```
133 |
134 | 2. Rebuild the application to embed the new language data
135 |
136 | ---
137 |
138 | ## Community Extensions
139 |
140 | Looking for persistent stats or a database-backed version of typtea?
141 |
142 | Check out [PR #1: Database for storing stats](https://github.com/ashish0kumar/typtea/pull/1), which adds SQLite-based session tracking and best-score display.
143 | This feature is not in the main branch to keep typtea minimal, but you can use it if you want to track your typing history.
144 |
145 | ## Contributing
146 |
147 | Contributions are always welcome! If you have ideas, bug reports, or want to submit code, please feel free to open an issue or a pull request.
148 |
149 | ## Dependencies
150 |
151 | - [**Bubble Tea**](https://github.com/charmbracelet/bubbletea) - TUI framework
152 | - [**Lipgloss**](https://github.com/charmbracelet/lipgloss) - Styling and layout
153 | - [**Cobra**](https://github.com/spf13/cobra) - CLI framework
154 |
155 | ## License
156 |
157 | [MIT License](LICENSE)
158 |
159 |
160 |
161 |
162 |
163 |
164 |
--------------------------------------------------------------------------------
/assets/example.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ashish0kumar/typtea/e0eb77b666f9d7b796308da1bb8ed753823f13f6/assets/example.gif
--------------------------------------------------------------------------------
/cmd/root.go:
--------------------------------------------------------------------------------
1 | package cmd
2 |
3 | import (
4 | "fmt"
5 | "os"
6 |
7 | "github.com/spf13/cobra"
8 | )
9 |
10 | var (
11 | version = "dev" // fallback to dev
12 | showVersion bool
13 | )
14 |
15 | // rootCmd represents the base command when called without any subcommands
16 | var rootCmd = &cobra.Command{
17 | Use: "typtea",
18 | Short: "A minimal typing speed test in your terminal",
19 | Long: `A terminal-based typing speed test application.
20 | Supports multiple programming languages like Python, JavaScript, Go, and more.`,
21 | Example: ` typtea start --lang python
22 | typtea start --duration 30 --lang javascript
23 | typtea start --list-langs`,
24 | Run: func(cmd *cobra.Command, args []string) {
25 | // Show help if no subcommands or flags are provided
26 | cmd.Help()
27 | },
28 | }
29 |
30 | // versionCmd prints the current version of typtea
31 | var versionCmd = &cobra.Command{
32 | Use: "version",
33 | Short: "Show the version of typtea",
34 | Run: func(cmd *cobra.Command, args []string) {
35 | fmt.Println("typtea version", version)
36 | },
37 | }
38 |
39 | // Execute adds all child commands to the root command and sets flags appropriately
40 | func Execute() {
41 | if err := rootCmd.Execute(); err != nil {
42 | fmt.Println(err)
43 | os.Exit(1)
44 | }
45 | }
46 |
47 | // init function initializes the root command and adds subcommands and flags
48 | func init() {
49 | rootCmd.CompletionOptions.DisableDefaultCmd = true // Disable default completion command
50 |
51 | // Add --version flag with shorthand -v
52 | rootCmd.PersistentFlags().BoolVarP(&showVersion, "version", "v", false, "Show the version and exit")
53 |
54 | // Add your subcommands
55 | rootCmd.AddCommand(startCmd)
56 | rootCmd.AddCommand(versionCmd)
57 |
58 | // Check for version flag early and exit if set
59 | cobra.OnInitialize(func() {
60 | if showVersion {
61 | fmt.Println("typtea version", version)
62 | os.Exit(0)
63 | }
64 | })
65 | }
66 |
--------------------------------------------------------------------------------
/cmd/start.go:
--------------------------------------------------------------------------------
1 | package cmd
2 |
3 | import (
4 | "fmt"
5 | "strings"
6 |
7 | "github.com/ashish0kumar/typtea/internal/game"
8 | "github.com/ashish0kumar/typtea/internal/tui"
9 |
10 | tea "github.com/charmbracelet/bubbletea"
11 | "github.com/spf13/cobra"
12 | )
13 |
14 | var (
15 | duration int // Duration of the typing test in seconds
16 | language string // Language for the typing test, default is "en"
17 | listLangs bool // Flag to list all available languages
18 | )
19 |
20 | // startCmd represents the start command for the typing test
21 | var startCmd = &cobra.Command{
22 | Use: "start",
23 | Short: "Start a typing test",
24 | Long: "Start a new typing test session with customizable duration and language",
25 | Example: ` typtea start --duration 60 --lang python
26 | typtea start -d 30 -l javascript
27 | typtea start --lang go
28 | typtea start --list-langs`,
29 | RunE: runTypingTest,
30 | }
31 |
32 | func init() {
33 | startCmd.Flags().IntVarP(&duration, "duration", "d", 30, "Test duration in seconds (10-300)")
34 | startCmd.Flags().StringVarP(&language, "lang", "l", "en", "Language for typing test")
35 | startCmd.Flags().BoolVar(&listLangs, "list-langs", false, "List all available languages")
36 | }
37 |
38 | // runTypingTest runs the typing test or lists languages if requested
39 | func runTypingTest(cmd *cobra.Command, args []string) error {
40 | // Initialize the language manager
41 | langManager := game.NewLanguageManager()
42 |
43 | // If --list-langs flag is set, print available languages and exit
44 | if listLangs {
45 | cmd.Println("Available languages:")
46 | for _, lang := range langManager.GetAvailableLanguages() {
47 | cmd.Printf(" %s\n", lang)
48 | }
49 | return nil
50 | }
51 |
52 | // Validate duration
53 | if duration < 10 || duration > 300 {
54 | return fmt.Errorf("duration must be between 10 and 300 seconds (e.g., --duration 60)")
55 | }
56 |
57 | // Validate language availability
58 | if !langManager.IsLanguageAvailable(language) {
59 | available := langManager.GetAvailableLanguages()
60 | cmd.PrintErrf("Error: Language '%s' not available.\n", language)
61 | cmd.PrintErrf("Available languages: %s\n", strings.Join(available, ", "))
62 | return fmt.Errorf("invalid language: %s", language)
63 | }
64 |
65 | // Create a new typing test model
66 | model, err := tui.NewModel(duration, language)
67 | if err != nil {
68 | return fmt.Errorf("error creating typing test: %w", err)
69 | }
70 |
71 | // Start the TUI program with alternate screen
72 | p := tea.NewProgram(model, tea.WithAltScreen())
73 | if _, err := p.Run(); err != nil {
74 | return fmt.Errorf("error running TUI program: %w", err)
75 | }
76 |
77 | return nil
78 | }
79 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/ashish0kumar/typtea
2 |
3 | go 1.23.2
4 |
5 | require (
6 | github.com/charmbracelet/bubbletea v1.3.5
7 | github.com/charmbracelet/lipgloss v1.1.0
8 | github.com/spf13/cobra v1.9.1
9 | )
10 |
11 | require (
12 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
13 | github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
14 | github.com/charmbracelet/x/ansi v0.8.0 // indirect
15 | github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
16 | github.com/charmbracelet/x/term v0.2.1 // indirect
17 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect
18 | github.com/inconshreveable/mousetrap v1.1.0 // indirect
19 | github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
20 | github.com/mattn/go-isatty v0.0.20 // indirect
21 | github.com/mattn/go-localereader v0.0.1 // indirect
22 | github.com/mattn/go-runewidth v0.0.16 // indirect
23 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
24 | github.com/muesli/cancelreader v0.2.2 // indirect
25 | github.com/muesli/termenv v0.16.0 // indirect
26 | github.com/rivo/uniseg v0.4.7 // indirect
27 | github.com/spf13/pflag v1.0.6 // indirect
28 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
29 | golang.org/x/sync v0.13.0 // indirect
30 | golang.org/x/sys v0.32.0 // indirect
31 | golang.org/x/text v0.3.8 // indirect
32 | )
33 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
2 | github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
3 | github.com/charmbracelet/bubbletea v1.3.5 h1:JAMNLTbqMOhSwoELIr0qyP4VidFq72/6E9j7HHmRKQc=
4 | github.com/charmbracelet/bubbletea v1.3.5/go.mod h1:TkCnmH+aBd4LrXhXcqrKiYwRs7qyQx5rBgH5fVY3v54=
5 | github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
6 | github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
7 | github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
8 | github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
9 | github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
10 | github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
11 | github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
12 | github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
13 | github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
14 | github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
15 | github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
16 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
17 | github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
18 | github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
19 | github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
20 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
21 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
22 | github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
23 | github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
24 | github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
25 | github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
26 | github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
27 | github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
28 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
29 | github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
30 | github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
31 | github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo=
32 | github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
33 | github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
34 | github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
35 | github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
36 | github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
37 | github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
38 | github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
39 | github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
40 | github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
41 | github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
42 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
43 | github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
44 | golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
45 | golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
46 | golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
47 | golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
48 | golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
49 | golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
50 | golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
51 | golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
52 | golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY=
53 | golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
54 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
55 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
56 |
--------------------------------------------------------------------------------
/internal/game/data/bash.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "bash",
3 | "words": [
4 | "ls",
5 | "cd",
6 | "mv",
7 | "cp",
8 | "pwd",
9 | "man",
10 | "help",
11 | "head",
12 | "tail",
13 | "cat",
14 | "less",
15 | "nano",
16 | "ed",
17 | "vi",
18 | "vim",
19 | "emacs",
20 | "more",
21 | "touch",
22 | "rm",
23 | "rmdir",
24 | "mkdir",
25 | "ln",
26 | "tree",
27 | "df",
28 | "du",
29 | "dd",
30 | "ps",
31 | "top",
32 | "htop",
33 | "passwd",
34 | "logout",
35 | "exit",
36 | "adduser",
37 | "useradd",
38 | "bash",
39 | "sh",
40 | "ksh",
41 | "csh",
42 | "mksh",
43 | "cc",
44 | "gcc",
45 | "clang",
46 | "cmake",
47 | "make",
48 | "gmake",
49 | "ar",
50 | "as",
51 | "nasm",
52 | "chmod",
53 | "chown",
54 | "ld",
55 | "lld",
56 | "gold",
57 | "rpm",
58 | "apt",
59 | "zypper",
60 | "dnf",
61 | "yum",
62 | "pacman",
63 | "yay",
64 | "dpkg",
65 | "init",
66 | "systemctl",
67 | "rc",
68 | "service",
69 | "reboot",
70 | "halt",
71 | "shutdown",
72 | "if",
73 | "then",
74 | "fi",
75 | "else",
76 | "elif",
77 | "case",
78 | "esac",
79 | "for",
80 | "select",
81 | "while",
82 | "until",
83 | "do",
84 | "done",
85 | "in",
86 | "function",
87 | "time",
88 | "{",
89 | "}",
90 | "!",
91 | "[",
92 | "[[",
93 | "]]",
94 | "coproc",
95 | ".",
96 | ":",
97 | "source",
98 | "alias",
99 | "bg",
100 | "fg",
101 | "bind",
102 | "break",
103 | "builtin",
104 | "caller",
105 | "command",
106 | "compgen",
107 | "complete",
108 | "compopt",
109 | "continue",
110 | "declare",
111 | "export",
112 | "disown",
113 | "echo",
114 | "enable",
115 | "eval",
116 | "exec",
117 | "false",
118 | "true",
119 | "fc",
120 | "getopts",
121 | "hash",
122 | "history",
123 | "let",
124 | "jobs",
125 | "kill",
126 | "local",
127 | "popd",
128 | "pushd",
129 | "print",
130 | "printf",
131 | "read",
132 | "readarray",
133 | "readonly",
134 | "return",
135 | "set",
136 | "shopt",
137 | "chsh",
138 | "trap",
139 | "type",
140 | "ulimit",
141 | "umask",
142 | "unalias",
143 | "unset",
144 | "variables",
145 | "wait",
146 | "btrfsck",
147 | "dosfsck",
148 | "e2fsck",
149 | "finger",
150 | "grep",
151 | "find",
152 | "fsck",
153 | "fsck.btrfs",
154 | "fsck.cramfs",
155 | "fsck.exfat",
156 | "fsck.ext2",
157 | "fsck.ext3",
158 | "fsck.ext4",
159 | "fsck.fat",
160 | "fsck.jfs",
161 | "fsck.minix",
162 | "fsck.msdos",
163 | "fsck.reiserfs",
164 | "reiserfsck",
165 | "fsck.vfat",
166 | "fsck.xfs",
167 | "python",
168 | "python3",
169 | "pip",
170 | "pip3",
171 | "ruby",
172 | "irb",
173 | "elixir",
174 | "iex",
175 | "curl",
176 | "wget",
177 | "ssh",
178 | "scp",
179 | "neofetch",
180 | "pfetch",
181 | "ufetch",
182 | "telnet",
183 | "nc",
184 | "ffmpeg",
185 | "mpv",
186 | "vlc",
187 | "ffproble",
188 | "mplayer",
189 | "ip",
190 | "ifconfig",
191 | "strings",
192 | "perl",
193 | "sudo",
194 | "su",
195 | "lsusb",
196 | "lsblk",
197 | "dmesg",
198 | "fdisk",
199 | "cfdisk",
200 | "date",
201 | "cal",
202 | "dkms",
203 | "arch",
204 | "cnf",
205 | "killall",
206 | "pgrep",
207 | "git",
208 | "wc",
209 | "gpg",
210 | "locate",
211 | "updatedb",
212 | "tar",
213 | "pactl",
214 | "aplay",
215 | "arecord",
216 | "alsamixer",
217 | "gzip",
218 | "gunzip",
219 | "bzip2",
220 | "bunzip2",
221 | "xz",
222 | "unxz",
223 | "zstd",
224 | "mkinitrd",
225 | "mkinitcpio",
226 | "pacmd",
227 | "free",
228 | "node",
229 | "chgrp",
230 | "install",
231 | "mkfifo",
232 | "mktemp",
233 | "mknod",
234 | "cut",
235 | "sed",
236 | "awk",
237 | "comm",
238 | "diff",
239 | "patch",
240 | "sort",
241 | "tr",
242 | "env",
243 | "readlink",
244 | "which",
245 | "stat",
246 | "unlink",
247 | "uname",
248 | "whoami",
249 | "hostname",
250 | "uptime",
251 | "test",
252 | "basename",
253 | "paste",
254 | "join",
255 | "uniq",
256 | "yes",
257 | "mount",
258 | "lscpu",
259 | "eject",
260 | "findmnt",
261 | "umount",
262 | "rfkill",
263 | "poweroff",
264 | "xxd",
265 | "addgroup",
266 | "blkid",
267 | "chattr",
268 | "chpasswd",
269 | "expr",
270 | "nice",
271 | "modprobe",
272 | "printenv",
273 | "realpath",
274 | "seq",
275 | "unzip",
276 | "sysctl",
277 | "egrep",
278 | "svn",
279 | "zip"
280 | ]
281 | }
--------------------------------------------------------------------------------
/internal/game/data/c++.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "c++",
3 | "words": [
4 | "alignas",
5 | "alignof",
6 | "and",
7 | "and_eq",
8 | "asm",
9 | "atomic_cancel",
10 | "atomic_commit",
11 | "atomic_noexcept",
12 | "auto",
13 | "bitand",
14 | "bitor",
15 | "bool",
16 | "break",
17 | "case",
18 | "catch",
19 | "char",
20 | "char8_t",
21 | "char16_t",
22 | "char32_t",
23 | "class",
24 | "compl",
25 | "concept",
26 | "const",
27 | "consteval",
28 | "constexpr",
29 | "constinit",
30 | "const_cast",
31 | "continue",
32 | "co_await",
33 | "co_return",
34 | "co_yield",
35 | "decltype",
36 | "default",
37 | "delete",
38 | "do",
39 | "double",
40 | "dynamic_cast",
41 | "else",
42 | "enum",
43 | "explicit",
44 | "export",
45 | "extern",
46 | "false",
47 | "float",
48 | "for",
49 | "friend",
50 | "goto",
51 | "if",
52 | "inline",
53 | "int",
54 | "long",
55 | "mutable",
56 | "namespace",
57 | "new",
58 | "noexcept",
59 | "not",
60 | "not_eq",
61 | "nullptr",
62 | "operator",
63 | "or",
64 | "or_eq",
65 | "private",
66 | "protected",
67 | "public",
68 | "reflexpr",
69 | "register",
70 | "reinterpret_cast",
71 | "requires",
72 | "return",
73 | "short",
74 | "signed",
75 | "sizeof",
76 | "static",
77 | "static_assert",
78 | "static_cast",
79 | "struct",
80 | "switch",
81 | "synchronized",
82 | "template",
83 | "this",
84 | "thread_local",
85 | "throw",
86 | "true",
87 | "try",
88 | "typedef",
89 | "typeid",
90 | "typename",
91 | "union",
92 | "unsigned",
93 | "using",
94 | "virtual",
95 | "void",
96 | "volatile",
97 | "wchar_t",
98 | "while",
99 | "xor",
100 | "xor_eq",
101 | "cout",
102 | "vector",
103 | "set",
104 | "multiset",
105 | "unordered_set",
106 | "map",
107 | "unordered_map",
108 | "stack",
109 | "queue",
110 | "deque",
111 | "priority_queue",
112 | "array",
113 | "pair",
114 | "tuple"
115 | ]
116 | }
--------------------------------------------------------------------------------
/internal/game/data/c.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "c",
3 | "words": [
4 | "auto",
5 | "break",
6 | "case",
7 | "char",
8 | "const",
9 | "continue",
10 | "default",
11 | "do",
12 | "double",
13 | "else",
14 | "enum",
15 | "extern",
16 | "float",
17 | "for",
18 | "goto",
19 | "if",
20 | "inline",
21 | "int",
22 | "long",
23 | "register",
24 | "restrict",
25 | "return",
26 | "short",
27 | "signed",
28 | "sizeof",
29 | "static",
30 | "struct",
31 | "switch",
32 | "typedef",
33 | "union",
34 | "unsigned",
35 | "void",
36 | "volatile",
37 | "while",
38 | "_Decimal128",
39 | "_Decimal32",
40 | "_Decimal64",
41 | "_Generic",
42 | "#if",
43 | "#elif",
44 | "#else",
45 | "#endif",
46 | "#ifdef",
47 | "#ifndef",
48 | "#elifdef",
49 | "#elifndef",
50 | "#define",
51 | "#undef",
52 | "#include",
53 | "#line",
54 | "#error",
55 | "#warning",
56 | "#pragma",
57 | "defined",
58 | "__has_c_attribute",
59 | "_Pragma",
60 | "asm",
61 | "fortran",
62 | "",
63 | "EDOM",
64 | "EILSEQ",
65 | "ERANGE",
66 | "errno",
67 | "assert",
68 | "static_assert",
69 | "",
70 | "imaginary",
71 | "complex",
72 | "",
73 | "int8_t",
74 | "int16_t",
75 | "int32_t",
76 | "int64_t",
77 | "int_fast8_t",
78 | "int_fast16_t",
79 | "int_fast32_t",
80 | "int_fast64_t",
81 | "int_least8_t",
82 | "int_least16_t",
83 | "int_least32_t",
84 | "int_least64_t",
85 | "intmax_t",
86 | "intptr_t",
87 | "uint8_t",
88 | "uint16_t",
89 | "uint32_t",
90 | "uint64_t",
91 | "uint_fast8_t",
92 | "uint_fast16_t",
93 | "uint_fast32_t",
94 | "uint_fast64_t",
95 | "uint_least8_t",
96 | "uint_least16_t",
97 | "uint_least32_t",
98 | "uint_least64_t",
99 | "uintmax_t",
100 | "uintptr_t",
101 | "",
102 | "FILE",
103 | "stdin",
104 | "stdout",
105 | "stderr",
106 | "fopen",
107 | "fopen_s",
108 | "freopen",
109 | "freopen_s",
110 | "fclose",
111 | "fflush",
112 | "setbuf",
113 | "setvbuf",
114 | "fgetc",
115 | "getc",
116 | "fputc",
117 | "putc",
118 | "scanf",
119 | "fscanf",
120 | "sscanf",
121 | "printf",
122 | "fprintf",
123 | "sprintf",
124 | "EOF",
125 | "NULL",
126 | "",
127 | "malloc",
128 | "calloc",
129 | "realloc",
130 | "free",
131 | "aligned_alloc",
132 | "abort",
133 | "exit",
134 | "quick_exit",
135 | "unreachable",
136 | "system",
137 | "getenv",
138 | "signal",
139 | "raise",
140 | "setjmp",
141 | "longjmp",
142 | "rand",
143 | "srand",
144 | "qsort",
145 | "bsearch",
146 | "",
147 | "tolower",
148 | "toupper",
149 | "atof",
150 | "atoi",
151 | "atol",
152 | "atoll",
153 | "strtol",
154 | "strtoll",
155 | "strtoul",
156 | "strtoull",
157 | "strtof",
158 | "strtod",
159 | "strtold",
160 | "strcpy",
161 | "strncpy",
162 | "strcat",
163 | "strncat",
164 | "strlen",
165 | "strcmp",
166 | "strncmp",
167 | "strcoll",
168 | "strchr",
169 | "strrchr",
170 | "strspn",
171 | "strcspn",
172 | "strpbrk",
173 | "strstr",
174 | "strtok",
175 | "memchr",
176 | "memcmp",
177 | "memset",
178 | "memcpy",
179 | "memmove",
180 | "",
181 | "abs",
182 | "div",
183 | "exp",
184 | "log",
185 | "pow",
186 | "sqrt",
187 | "sin",
188 | "cos",
189 | "tan",
190 | "asin",
191 | "acos",
192 | "atan",
193 | "sinh",
194 | "cosh",
195 | "tanh",
196 | "asinh",
197 | "acosh",
198 | "atanh",
199 | "ceil",
200 | "floor",
201 | "round",
202 | "INFINITY",
203 | "NAN"
204 | ]
205 | }
--------------------------------------------------------------------------------
/internal/game/data/crystal.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Crystal",
3 | "words": [
4 | "abstract",
5 | "alias",
6 | "annotation",
7 | "as",
8 | "asm",
9 | "begin",
10 | "break",
11 | "case",
12 | "class",
13 | "def",
14 | "do",
15 | "else",
16 | "elsif",
17 | "end",
18 | "ensure",
19 | "enum",
20 | "extend",
21 | "false",
22 | "for",
23 | "fun",
24 | "if",
25 | "include",
26 | "instance_sizeof",
27 | "is_a?",
28 | "lib",
29 | "macro",
30 | "module",
31 | "next",
32 | "nil",
33 | "of",
34 | "out",
35 | "pointerof",
36 | "private",
37 | "protected",
38 | "rescue",
39 | "return",
40 | "require",
41 | "select",
42 | "self",
43 | "sizeof",
44 | "struct",
45 | "super",
46 | "then",
47 | "true",
48 | "type",
49 | "typeof",
50 | "union",
51 | "unless",
52 | "until",
53 | "when",
54 | "while",
55 | "with",
56 | "yield"
57 | ]
58 | }
59 |
--------------------------------------------------------------------------------
/internal/game/data/csharp.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "csharp",
3 | "words": [
4 | "abstract",
5 | "Action",
6 | "add",
7 | "alias",
8 | "and",
9 | "Array",
10 | "as",
11 | "ascending",
12 | "async",
13 | "await",
14 | "base",
15 | "bool",
16 | "break",
17 | "by",
18 | "byte",
19 | "case",
20 | "catch",
21 | "char",
22 | "checked",
23 | "class",
24 | "const",
25 | "continue",
26 | "decimal",
27 | "default",
28 | "delegate",
29 | "descending",
30 | "do",
31 | "double",
32 | "dynamic",
33 | "else",
34 | "enum",
35 | "equals",
36 | "event",
37 | "Exception",
38 | "explicit",
39 | "Expression",
40 | "extern",
41 | "false",
42 | "file",
43 | "finally",
44 | "fixed",
45 | "float",
46 | "for",
47 | "foreach",
48 | "from",
49 | "Func",
50 | "get",
51 | "global",
52 | "goto",
53 | "group",
54 | "Guid",
55 | "ICollection",
56 | "IEnumerable",
57 | "if",
58 | "implicit",
59 | "in",
60 | "init",
61 | "int",
62 | "interface",
63 | "internal",
64 | "into",
65 | "is",
66 | "join",
67 | "let",
68 | "List",
69 | "lock",
70 | "long",
71 | "nameof",
72 | "namespace",
73 | "new",
74 | "nint",
75 | "not",
76 | "notnull",
77 | "nuint",
78 | "null",
79 | "object",
80 | "on",
81 | "operator",
82 | "or",
83 | "orderby",
84 | "out",
85 | "override",
86 | "params",
87 | "partial",
88 | "private",
89 | "protected",
90 | "public",
91 | "readonly",
92 | "record",
93 | "ref",
94 | "remove",
95 | "required",
96 | "return",
97 | "sbyte",
98 | "scoped",
99 | "sealed",
100 | "select",
101 | "set",
102 | "short",
103 | "sizeof",
104 | "Span",
105 | "stackalloc",
106 | "static",
107 | "string",
108 | "struct",
109 | "switch",
110 | "Task",
111 | "this",
112 | "throw",
113 | "true",
114 | "try",
115 | "Type",
116 | "typeof",
117 | "uint",
118 | "ulong",
119 | "unchecked",
120 | "unmanaged",
121 | "unsafe",
122 | "ushort",
123 | "using",
124 | "value",
125 | "var",
126 | "virtual",
127 | "void",
128 | "volatile",
129 | "when",
130 | "where",
131 | "while",
132 | "with",
133 | "yield"
134 | ]
135 | }
--------------------------------------------------------------------------------
/internal/game/data/css.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "css",
3 | "words": [
4 | "background-color",
5 | "color",
6 | "center",
7 | "font",
8 | "font-size",
9 | "font-family",
10 | "font-weight",
11 | "text-align",
12 | "text-decoration",
13 | "cursor",
14 | "float",
15 | "align",
16 | "width",
17 | "height",
18 | "max-width",
19 | "max-height",
20 | "padding",
21 | "margin",
22 | "margin-left",
23 | "margin-top",
24 | "margin-right",
25 | "margin-bottom",
26 | "solid",
27 | "border",
28 | "border-radius",
29 | "outline",
30 | "display",
31 | "visibility",
32 | "inline",
33 | "inline-block",
34 | "block",
35 | "auto",
36 | "flex",
37 | "flex-wrap",
38 | "flex-direction",
39 | "justify-content",
40 | "justify-self",
41 | "justify-items",
42 | "align-items",
43 | "align-self",
44 | "grid",
45 | "grid-template-columns",
46 | "grid-template-rows",
47 | "position",
48 | "static",
49 | "absolute",
50 | "fixed",
51 | "relative",
52 | "srcset",
53 | "z-index",
54 | "left",
55 | "top",
56 | "right",
57 | "bottom",
58 | "overflow",
59 | "border-image",
60 | "background-image",
61 | "background-clip",
62 | "background-size",
63 | "background-origin",
64 | "transform",
65 | "translate",
66 | "scale",
67 | "rotate",
68 | "transition",
69 | "animation",
70 | "filter",
71 | "box-shadow",
72 | "text-shadow",
73 | "opacity",
74 | "@media",
75 | "@keyframes"
76 | ]
77 | }
--------------------------------------------------------------------------------
/internal/game/data/emacs.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Emacs Lisp",
3 | "words": [
4 | "defun",
5 | "setq",
6 | "let",
7 | "let*",
8 | "if",
9 | "cond",
10 | "when",
11 | "unless",
12 | "lambda",
13 | "quote",
14 | "car",
15 | "cdr",
16 | "cons",
17 | "list",
18 | "append",
19 | "mapcar",
20 | "apply",
21 | "funcall",
22 | "defvar",
23 | "defcustom",
24 | "provide",
25 | "require",
26 | "interactive",
27 | "message",
28 | "equal",
29 | "not",
30 | "and",
31 | "or",
32 | "while",
33 | "catch",
34 | "throw",
35 | "condition-case",
36 | "error",
37 | "ignore-errors",
38 | "format",
39 | "insert",
40 | "buffer-file-name",
41 | "current-buffer",
42 | "point",
43 | "buffer-substring",
44 | "save-excursion",
45 | "save-restriction",
46 | "nconc",
47 | "eval",
48 | "read",
49 | "print",
50 | "setq-default",
51 | "symbol-function",
52 | "boundp",
53 | "symbolp",
54 | "stringp",
55 | "numberp",
56 | "vectorp",
57 | "length",
58 | "substring",
59 | "replace-regexp-in-string",
60 | "defmacro",
61 | "macroexpand",
62 | "backquote",
63 | "unquote",
64 | "unquote-splicing",
65 | "add-hook",
66 | "remove-hook",
67 | "run-hooks",
68 | "defadvice",
69 | "advice-add",
70 | "advice-remove",
71 | "funcall-interactively",
72 | "interactive-p",
73 | "buffer-list",
74 | "point-min",
75 | "point-max",
76 | "goto-char",
77 | "forward-char",
78 | "backward-char",
79 | "forward-line",
80 | "beginning-of-line",
81 | "end-of-line",
82 | "kill-line",
83 | "kill-region",
84 | "yank",
85 | "insert-buffer-substring",
86 | "substring-no-properties",
87 | "set-text-properties",
88 | "get-text-property",
89 | "put-text-property"
90 | ]
91 | }
92 |
--------------------------------------------------------------------------------
/internal/game/data/en.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "english",
3 | "words": [
4 | "the",
5 | "of",
6 | "to",
7 | "and",
8 | "a",
9 | "in",
10 | "is",
11 | "it",
12 | "you",
13 | "that",
14 | "he",
15 | "was",
16 | "for",
17 | "on",
18 | "are",
19 | "with",
20 | "as",
21 | "I",
22 | "his",
23 | "they",
24 | "be",
25 | "at",
26 | "one",
27 | "have",
28 | "this",
29 | "from",
30 | "or",
31 | "had",
32 | "by",
33 | "not",
34 | "word",
35 | "but",
36 | "what",
37 | "some",
38 | "we",
39 | "can",
40 | "out",
41 | "other",
42 | "were",
43 | "all",
44 | "there",
45 | "when",
46 | "up",
47 | "use",
48 | "your",
49 | "how",
50 | "said",
51 | "an",
52 | "each",
53 | "she",
54 | "which",
55 | "do",
56 | "their",
57 | "time",
58 | "if",
59 | "will",
60 | "way",
61 | "about",
62 | "many",
63 | "then",
64 | "them",
65 | "write",
66 | "would",
67 | "like",
68 | "so",
69 | "these",
70 | "her",
71 | "long",
72 | "make",
73 | "thing",
74 | "see",
75 | "him",
76 | "two",
77 | "has",
78 | "look",
79 | "more",
80 | "day",
81 | "could",
82 | "go",
83 | "come",
84 | "did",
85 | "number",
86 | "sound",
87 | "no",
88 | "most",
89 | "people",
90 | "my",
91 | "over",
92 | "know",
93 | "water",
94 | "than",
95 | "call",
96 | "first",
97 | "who",
98 | "may",
99 | "down",
100 | "side",
101 | "been",
102 | "now",
103 | "find",
104 | "any",
105 | "new",
106 | "work",
107 | "part",
108 | "take",
109 | "get",
110 | "place",
111 | "made",
112 | "live",
113 | "where",
114 | "after",
115 | "back",
116 | "little",
117 | "only",
118 | "round",
119 | "man",
120 | "year",
121 | "came",
122 | "show",
123 | "every",
124 | "good",
125 | "me",
126 | "give",
127 | "our",
128 | "under",
129 | "name",
130 | "very",
131 | "through",
132 | "just",
133 | "form",
134 | "sentence",
135 | "great",
136 | "think",
137 | "say",
138 | "help",
139 | "low",
140 | "line",
141 | "differ",
142 | "turn",
143 | "cause",
144 | "much",
145 | "mean",
146 | "before",
147 | "move",
148 | "right",
149 | "boy",
150 | "old",
151 | "too",
152 | "same",
153 | "tell",
154 | "does",
155 | "set",
156 | "three",
157 | "want",
158 | "air",
159 | "well",
160 | "also",
161 | "play",
162 | "small",
163 | "end",
164 | "put",
165 | "home",
166 | "read",
167 | "hand",
168 | "port",
169 | "large",
170 | "spell",
171 | "add",
172 | "even",
173 | "land",
174 | "here",
175 | "must",
176 | "big",
177 | "high",
178 | "such",
179 | "follow",
180 | "act",
181 | "why",
182 | "ask",
183 | "men",
184 | "change",
185 | "went",
186 | "light",
187 | "kind",
188 | "off",
189 | "need",
190 | "house",
191 | "picture",
192 | "try",
193 | "us",
194 | "again",
195 | "animal",
196 | "point",
197 | "mother",
198 | "world",
199 | "near",
200 | "build",
201 | "self",
202 | "earth",
203 | "father",
204 | "head",
205 | "stand",
206 | "own",
207 | "page",
208 | "should",
209 | "country",
210 | "found",
211 | "answer",
212 | "school",
213 | "grow",
214 | "study",
215 | "still",
216 | "learn",
217 | "plant",
218 | "cover",
219 | "food",
220 | "sun",
221 | "four",
222 | "between",
223 | "state",
224 | "keep",
225 | "eye",
226 | "never",
227 | "last",
228 | "let",
229 | "thought",
230 | "city",
231 | "tree",
232 | "cross",
233 | "farm",
234 | "hard",
235 | "start",
236 | "might",
237 | "story",
238 | "saw",
239 | "far",
240 | "sea",
241 | "draw",
242 | "left",
243 | "late",
244 | "run",
245 | "don't",
246 | "while",
247 | "press",
248 | "close",
249 | "night",
250 | "real",
251 | "life",
252 | "few",
253 | "north",
254 | "open",
255 | "seem",
256 | "together",
257 | "next",
258 | "white",
259 | "children",
260 | "begin",
261 | "got",
262 | "walk",
263 | "example",
264 | "ease",
265 | "paper",
266 | "group",
267 | "always",
268 | "music",
269 | "those",
270 | "both",
271 | "mark",
272 | "often",
273 | "letter",
274 | "until",
275 | "mile",
276 | "river",
277 | "car",
278 | "feet",
279 | "care",
280 | "second",
281 | "book",
282 | "carry",
283 | "took",
284 | "science",
285 | "eat",
286 | "room",
287 | "friend",
288 | "began",
289 | "idea",
290 | "fish",
291 | "mountain",
292 | "stop",
293 | "once",
294 | "base",
295 | "hear",
296 | "horse",
297 | "cut",
298 | "sure",
299 | "watch",
300 | "color",
301 | "face",
302 | "wood",
303 | "main",
304 | "enough",
305 | "plain",
306 | "girl",
307 | "usual",
308 | "young",
309 | "ready",
310 | "above",
311 | "ever",
312 | "red",
313 | "list",
314 | "though",
315 | "feel",
316 | "talk",
317 | "bird",
318 | "soon",
319 | "body",
320 | "dog",
321 | "family",
322 | "direct",
323 | "pose",
324 | "leave",
325 | "song",
326 | "measure",
327 | "door",
328 | "product",
329 | "black",
330 | "short",
331 | "numeral",
332 | "class",
333 | "wind",
334 | "question",
335 | "happen",
336 | "complete",
337 | "ship",
338 | "area",
339 | "half",
340 | "rock",
341 | "order",
342 | "fire",
343 | "south",
344 | "problem",
345 | "piece",
346 | "told",
347 | "knew",
348 | "pass",
349 | "since",
350 | "top",
351 | "whole",
352 | "king",
353 | "space",
354 | "heard",
355 | "best",
356 | "hour",
357 | "better",
358 | "true",
359 | "during",
360 | "hundred",
361 | "five",
362 | "remember",
363 | "step",
364 | "early",
365 | "hold",
366 | "west",
367 | "ground",
368 | "interest",
369 | "reach",
370 | "fast",
371 | "verb",
372 | "sing",
373 | "listen",
374 | "six",
375 | "table",
376 | "travel",
377 | "less",
378 | "morning",
379 | "ten",
380 | "simple",
381 | "several",
382 | "vowel",
383 | "toward",
384 | "war",
385 | "lay",
386 | "against",
387 | "pattern",
388 | "slow",
389 | "center",
390 | "love",
391 | "person",
392 | "money",
393 | "serve",
394 | "appear",
395 | "road",
396 | "map",
397 | "rain",
398 | "rule",
399 | "govern",
400 | "pull",
401 | "cold",
402 | "notice",
403 | "voice",
404 | "unit",
405 | "power",
406 | "town",
407 | "fine",
408 | "certain",
409 | "fly",
410 | "fall",
411 | "lead",
412 | "cry",
413 | "dark",
414 | "machine",
415 | "note",
416 | "wait",
417 | "plan",
418 | "figure",
419 | "star",
420 | "box",
421 | "noun",
422 | "field",
423 | "rest",
424 | "correct",
425 | "able",
426 | "pound",
427 | "done",
428 | "beauty",
429 | "drive",
430 | "stood",
431 | "contain",
432 | "front",
433 | "teach",
434 | "week",
435 | "final",
436 | "gave",
437 | "green",
438 | "oh",
439 | "quick",
440 | "develop",
441 | "ocean",
442 | "warm",
443 | "free",
444 | "minute",
445 | "strong",
446 | "special",
447 | "mind",
448 | "behind",
449 | "clear",
450 | "tail",
451 | "produce",
452 | "fact",
453 | "street",
454 | "inch",
455 | "multiply",
456 | "nothing",
457 | "course",
458 | "stay",
459 | "wheel",
460 | "full",
461 | "force",
462 | "blue",
463 | "object",
464 | "decide",
465 | "surface",
466 | "deep",
467 | "moon",
468 | "island",
469 | "foot",
470 | "system",
471 | "busy",
472 | "test",
473 | "record",
474 | "boat",
475 | "common",
476 | "gold",
477 | "possible",
478 | "plane",
479 | "stead",
480 | "dry",
481 | "wonder",
482 | "laugh",
483 | "thousand",
484 | "ago",
485 | "ran",
486 | "check",
487 | "game",
488 | "shape",
489 | "equate",
490 | "hot",
491 | "miss",
492 | "brought",
493 | "heat",
494 | "snow",
495 | "tire",
496 | "bring",
497 | "yes",
498 | "distant",
499 | "fill",
500 | "east",
501 | "paint",
502 | "language",
503 | "among",
504 | "grand",
505 | "ball",
506 | "yet",
507 | "wave",
508 | "drop",
509 | "heart",
510 | "am",
511 | "present",
512 | "heavy",
513 | "dance",
514 | "engine",
515 | "position",
516 | "arm",
517 | "wide",
518 | "sail",
519 | "material",
520 | "size",
521 | "vary",
522 | "settle",
523 | "speak",
524 | "weight",
525 | "general",
526 | "ice",
527 | "matter",
528 | "circle",
529 | "pair",
530 | "include",
531 | "divide",
532 | "syllable",
533 | "felt",
534 | "perhaps",
535 | "pick",
536 | "sudden",
537 | "count",
538 | "square",
539 | "reason",
540 | "length",
541 | "represent",
542 | "art",
543 | "subject",
544 | "region",
545 | "energy",
546 | "hunt",
547 | "probable",
548 | "bed",
549 | "brother",
550 | "egg",
551 | "ride",
552 | "cell",
553 | "believe",
554 | "fraction",
555 | "forest",
556 | "sit",
557 | "race",
558 | "window",
559 | "store",
560 | "summer",
561 | "train",
562 | "sleep",
563 | "prove",
564 | "lone",
565 | "leg",
566 | "exercise",
567 | "wall",
568 | "catch",
569 | "mount",
570 | "wish",
571 | "sky",
572 | "board",
573 | "joy",
574 | "winter",
575 | "sat",
576 | "written",
577 | "wild",
578 | "instrument",
579 | "kept",
580 | "glass",
581 | "grass",
582 | "cow",
583 | "job",
584 | "edge",
585 | "sign",
586 | "visit",
587 | "past",
588 | "soft",
589 | "fun",
590 | "bright",
591 | "gas",
592 | "weather",
593 | "month",
594 | "million",
595 | "bear",
596 | "finish",
597 | "happy",
598 | "hope",
599 | "flower",
600 | "clothe",
601 | "strange",
602 | "gone",
603 | "jump",
604 | "baby",
605 | "eight",
606 | "village",
607 | "meet",
608 | "root",
609 | "buy",
610 | "raise",
611 | "solve",
612 | "metal",
613 | "whether",
614 | "push",
615 | "seven",
616 | "paragraph",
617 | "third",
618 | "shall",
619 | "held",
620 | "hair",
621 | "describe",
622 | "cook",
623 | "floor",
624 | "either",
625 | "result",
626 | "burn",
627 | "hill",
628 | "safe",
629 | "cat",
630 | "century",
631 | "consider",
632 | "type",
633 | "law",
634 | "bit",
635 | "coast",
636 | "copy",
637 | "phrase",
638 | "silent",
639 | "tall",
640 | "sand",
641 | "soil",
642 | "roll",
643 | "temperature",
644 | "finger",
645 | "industry",
646 | "value",
647 | "fight",
648 | "lie",
649 | "beat",
650 | "excite",
651 | "natural",
652 | "view",
653 | "sense",
654 | "ear",
655 | "else",
656 | "quite",
657 | "broke",
658 | "case",
659 | "middle",
660 | "kill",
661 | "son",
662 | "lake",
663 | "moment",
664 | "scale",
665 | "loud",
666 | "spring",
667 | "observe",
668 | "child",
669 | "straight",
670 | "consonant",
671 | "nation",
672 | "dictionary",
673 | "milk",
674 | "speed",
675 | "method",
676 | "organ",
677 | "pay",
678 | "age",
679 | "section",
680 | "dress",
681 | "cloud",
682 | "surprise",
683 | "quiet",
684 | "stone",
685 | "tiny",
686 | "climb",
687 | "cool",
688 | "design",
689 | "poor",
690 | "lot",
691 | "experiment",
692 | "bottom",
693 | "key",
694 | "iron",
695 | "single",
696 | "stick",
697 | "flat",
698 | "twenty",
699 | "skin",
700 | "smile",
701 | "crease",
702 | "hole",
703 | "trade",
704 | "melody",
705 | "trip",
706 | "office",
707 | "receive",
708 | "row",
709 | "mouth",
710 | "exact",
711 | "symbol",
712 | "die",
713 | "least",
714 | "trouble",
715 | "shout",
716 | "except",
717 | "wrote",
718 | "seed",
719 | "tone",
720 | "join",
721 | "suggest",
722 | "clean",
723 | "break",
724 | "lady",
725 | "yard",
726 | "rise",
727 | "bad",
728 | "blow",
729 | "oil",
730 | "blood",
731 | "touch",
732 | "grew",
733 | "cent",
734 | "mix",
735 | "team",
736 | "wire",
737 | "cost",
738 | "lost",
739 | "brown",
740 | "wear",
741 | "garden",
742 | "equal",
743 | "sent",
744 | "choose",
745 | "fell",
746 | "fit",
747 | "flow",
748 | "fair",
749 | "bank",
750 | "collect",
751 | "save",
752 | "control",
753 | "decimal",
754 | "gentle",
755 | "woman",
756 | "captain",
757 | "practice",
758 | "separate",
759 | "difficult",
760 | "doctor",
761 | "please",
762 | "protect",
763 | "noon",
764 | "whose",
765 | "locate",
766 | "ring",
767 | "character",
768 | "insect",
769 | "caught",
770 | "period",
771 | "indicate",
772 | "radio",
773 | "spoke",
774 | "atom",
775 | "human",
776 | "history",
777 | "effect",
778 | "electric",
779 | "expect",
780 | "crop",
781 | "modern",
782 | "element",
783 | "hit",
784 | "student",
785 | "corner",
786 | "party",
787 | "supply",
788 | "bone",
789 | "rail",
790 | "imagine",
791 | "provide",
792 | "agree",
793 | "thus",
794 | "capital",
795 | "won't",
796 | "chair",
797 | "danger",
798 | "fruit",
799 | "rich",
800 | "thick",
801 | "soldier",
802 | "process",
803 | "operate",
804 | "guess",
805 | "necessary",
806 | "sharp",
807 | "wing",
808 | "create",
809 | "neighbor",
810 | "wash",
811 | "bat",
812 | "rather",
813 | "crowd",
814 | "corn",
815 | "compare",
816 | "poem",
817 | "string",
818 | "bell",
819 | "depend",
820 | "meat",
821 | "rub",
822 | "tube",
823 | "famous",
824 | "dollar",
825 | "stream",
826 | "fear",
827 | "sight",
828 | "thin",
829 | "triangle",
830 | "planet",
831 | "hurry",
832 | "chief",
833 | "colony",
834 | "clock",
835 | "mine",
836 | "tie",
837 | "enter",
838 | "major",
839 | "fresh",
840 | "search",
841 | "send",
842 | "yellow",
843 | "gun",
844 | "allow",
845 | "print",
846 | "dead",
847 | "spot",
848 | "desert",
849 | "suit",
850 | "current",
851 | "lift",
852 | "rose",
853 | "continue",
854 | "block",
855 | "chart",
856 | "hat",
857 | "sell",
858 | "success",
859 | "company",
860 | "subtract",
861 | "event",
862 | "particular",
863 | "deal",
864 | "swim",
865 | "term",
866 | "opposite",
867 | "wife",
868 | "shoe",
869 | "shoulder",
870 | "spread",
871 | "arrange",
872 | "camp",
873 | "invent",
874 | "cotton",
875 | "born",
876 | "determine",
877 | "quart",
878 | "nine",
879 | "truck",
880 | "noise",
881 | "level",
882 | "chance",
883 | "gather",
884 | "shop",
885 | "stretch",
886 | "throw",
887 | "shine",
888 | "property",
889 | "column",
890 | "molecule",
891 | "select",
892 | "wrong",
893 | "gray",
894 | "repeat",
895 | "require",
896 | "broad",
897 | "prepare",
898 | "salt",
899 | "nose",
900 | "plural",
901 | "anger",
902 | "claim",
903 | "continent",
904 | "oxygen",
905 | "sugar",
906 | "death",
907 | "pretty",
908 | "skill",
909 | "women",
910 | "season",
911 | "solution",
912 | "magnet",
913 | "silver",
914 | "thank",
915 | "branch",
916 | "match",
917 | "suffix",
918 | "especially",
919 | "fig",
920 | "afraid",
921 | "huge",
922 | "sister",
923 | "steel",
924 | "discuss",
925 | "forward",
926 | "similar",
927 | "guide",
928 | "experience",
929 | "score",
930 | "apple",
931 | "bought",
932 | "led",
933 | "pitch",
934 | "coat",
935 | "mass",
936 | "card",
937 | "band",
938 | "rope",
939 | "slip",
940 | "win",
941 | "dream",
942 | "evening",
943 | "condition",
944 | "feed",
945 | "tool",
946 | "total",
947 | "basic",
948 | "smell",
949 | "valley",
950 | "nor",
951 | "double",
952 | "seat",
953 | "arrive",
954 | "master",
955 | "track",
956 | "parent",
957 | "shore",
958 | "division",
959 | "sheet",
960 | "substance",
961 | "favor",
962 | "connect",
963 | "post",
964 | "spend",
965 | "chord",
966 | "fat",
967 | "glad",
968 | "original",
969 | "share",
970 | "station",
971 | "dad",
972 | "bread",
973 | "charge",
974 | "proper",
975 | "bar",
976 | "offer",
977 | "segment",
978 | "slave",
979 | "duck",
980 | "instant",
981 | "market",
982 | "degree",
983 | "populate",
984 | "chick",
985 | "dear",
986 | "enemy",
987 | "reply",
988 | "drink",
989 | "occur",
990 | "support",
991 | "speech",
992 | "nature",
993 | "range",
994 | "steam",
995 | "motion",
996 | "path",
997 | "liquid",
998 | "log",
999 | "meant",
1000 | "quotient",
1001 | "teeth",
1002 | "shell",
1003 | "neck"
1004 | ]
1005 | }
--------------------------------------------------------------------------------
/internal/game/data/erlang.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Erlang",
3 | "words": [
4 | "after",
5 | "begin",
6 | "case",
7 | "catch",
8 | "cond",
9 | "end",
10 | "fun",
11 | "if",
12 | "let",
13 | "of",
14 | "receive",
15 | "try",
16 | "when",
17 | "and",
18 | "or",
19 | "not",
20 | "div",
21 | "rem",
22 | "band",
23 | "bor",
24 | "bxor",
25 | "bnot",
26 | "bsl",
27 | "bsr"
28 | ]
29 | }
30 |
--------------------------------------------------------------------------------
/internal/game/data/go.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "go",
3 | "words": [
4 | "bool",
5 | "break",
6 | "byte",
7 | "case",
8 | "chan",
9 | "complex64",
10 | "complex128",
11 | "const",
12 | "continue",
13 | "default",
14 | "defer",
15 | "else",
16 | "error",
17 | "fallthrough",
18 | "false",
19 | "float32",
20 | "float64",
21 | "for",
22 | "func",
23 | "go",
24 | "goto",
25 | "if",
26 | "import",
27 | "int8",
28 | "int16",
29 | "int32",
30 | "int64",
31 | "int",
32 | "interface",
33 | "map",
34 | "nil",
35 | "package",
36 | "range",
37 | "return",
38 | "rune",
39 | "select",
40 | "string",
41 | "struct",
42 | "switch",
43 | "true",
44 | "type",
45 | "uint8",
46 | "uint16",
47 | "uint32",
48 | "uint64",
49 | "uint",
50 | "uintptr",
51 | "var"
52 | ]
53 | }
--------------------------------------------------------------------------------
/internal/game/data/haskell.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Haskell",
3 | "words": [
4 | "case",
5 | "class",
6 | "data",
7 | "default",
8 | "deriving",
9 | "do",
10 | "else",
11 | "foreign",
12 | "if",
13 | "import",
14 | "in",
15 | "infix",
16 | "infixl",
17 | "infixr",
18 | "instance",
19 | "let",
20 | "module",
21 | "newtype",
22 | "of",
23 | "then",
24 | "type",
25 | "where",
26 | "forall",
27 | "mdo",
28 | "family",
29 | "role",
30 | "pattern",
31 | "static",
32 | "group",
33 | "by",
34 | "using",
35 | "qualified",
36 | "as",
37 | "hiding"
38 | ]
39 | }
40 |
--------------------------------------------------------------------------------
/internal/game/data/html.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "html",
3 | "words": [
4 | "-->",
5 | "