├── .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 | stars   6 | REPO SIZE   7 | Releases   8 | LICENSE   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 | "