An open API service indexing awesome lists of open source software.

https://github.com/tmck-code/pokesay

Print pokemon in the CLI! An adaptation of the classic "cowsay"
https://github.com/tmck-code/pokesay

bashrc cli cowsay dotfiles golang krabby pokemon pokemon-colorscripts pokemonsay pokemonshow pokeshell poketerm

Last synced: 7 days ago
JSON representation

Print pokemon in the CLI! An adaptation of the classic "cowsay"

Awesome Lists containing this project

README

          

# pokesay

![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/tmck-code/pokesay/main.yml)
![AUR](https://img.shields.io/aur/version/pokesay-bin)
![GitHub Downloads (all assets, all releases)](https://img.shields.io/github/downloads/tmck-code/pokesay/total?color=red)
![GitHub Downloads (all assets, latest release)](https://img.shields.io/github/downloads/tmck-code/pokesay/latest/total?color=orange)

Print pokemon in the CLI! An adaptation of the classic 'cowsay'

464197914-4c145f23-8837-41df-835c-aeaa49afd13d 2

- 🏃 _Pokesay is a single binary with **zero dependencies** that can run on any popular OS and architecture._
- ⚙️ _It is **flexible**, offering far more features than its ancestor `cowsay`._
- 🚀 _It is the **fastest** to run compared to similar projects_
- 🕶️ _It is **modern**, fully supporting unicode borders, japanese names & colourful ANSI text_

## Installation

- Via homebrew (MacOS/Linux/Windows)
```shell
brew install tmck-code/tap/pokesay
```
- Via the AUR (Arch Linux)
```shell
yay -S pokesay-bin
```

For installation without a package manager, see the options below.

Via the install script (Others)

_(These commands can also be used to update your existing pokesay)_

OS/arch command

OSX / darwin

```shell
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" \
bash darwin amd64
```

OSX / darwin (M1)

```shell
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" \
bash darwin arm64
```

Linux / x64

```shell
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" \
bash linux amd64
```

Android / arm64 (termux)

```shell
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" \
bash android arm64
```

Windows / x64 (.exe)

```shell
bash -c "$(curl https://raw.githubusercontent.com/tmck-code/pokesay/master/build/scripts/install.sh)" \
bash windows amd64
```

---

## Usage

Just pipe some text! e.g.

```shell
echo yolo | pokesay
```

> _Note: The pokesay tool is intended to only be used with piped text input from STDIN, entering text by typing (or other methods) might not work as expected!_

### Examples

Default output
p_00_fortune
Set bubble width -w
p_01_set_width
Unicode borders -u
p_02_unicode

Info border -b
p_03_info_border
Choose by name -n
p_04_name
No category info -C
p_05_no_category

Show Japanese name -j
p_06_japanese
Show ID -I
p_07_id
Small size -c small
p_08_small_size

Medium size -c medium
p_09_medium_size
Big size -c big
p_10_big_size
Shiny -c shiny
p_10_shiny

Size and name -c small -n ...
p_11_size_and_name
Size and name -c big -n ...
p_12_size_and_name_2

Select by ID -i
p_13_select_by_id
Flip -F
p_14_flip
Figlet + lolcat
p_15_figlet_lolcat

To see it every time you open a terminal, add it to your `.bashrc` file!
_(This requires that you have `fortune` installed)_

```shell
echo 'fortune | pokesay' >> $HOME/.bashrc
```

### Full Usage

> Run pokesay with `-h` or `--help` to see the full usage

```shell
Usage: pokesay [-bBCfFhIjLsuvW] [-c value] [-i value] [-l value] [-n value] [-t value] [-w value] [parameters ...]
-b, --info-border draw a border around the info box
-B, --no-bubble do not draw the speech bubble
-c, --category=value
choose a pokemon from a specific category
-C, --no-category-info
do not print pokemon category information in the info box
-f, --fastest run with the fastest possible configuration (--nowrap &
--notabspaces)
-F, --flip flip the pokemon horizontally (face right instead of left)
-h, --help display this help message
-i, --id=value choose a pokemon from a specific ID (see `pokesay -l` for
IDs)
-I, --id-info print the pokemon ID in the info box
-j, --japanese-name
print the japanese name in the info box
-L, --list-categories
list all available categories
-l, --list-names[=value]
list all available names
-n, --name=value choose a pokemon from a specific name
-s, --no-tab-spaces
do not replace tab characters (fastest)
-t, --tab-width=value
replace any tab characters with N spaces [4]
-u, --unicode-borders
use unicode characters to draw the border around the speech
box (and info box if --info-border is enabled)
-v, --verbose print verbose output
-W, --no-wrap disable text wrapping (fastest)
-w, --width=value the max speech bubble width [80]
```

---

## How it works

This project extends on the original `fortune | cowsay`, a simple command combo that can be added to
your .bashrc to give you a random message spoken by a cow every time you open a new shell.

```
☯ ~ fortune | cowsay
______________________________________
/ Hollywood is where if you don't have \
| happiness you send out for it. |
| |
\ -- Rex Reed /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
```

As a personal project, this has been lovingly over-engineered with a focus on the lowest latency possible, so that it doesn't slow down your terminal experience.

1. These pokemon sprites used here are sourced from the awesome repo
[msikma/pokesprite](https://github.com/msikma/pokesprite)

![sprits](https://github.com/msikma/pokesprite/raw/master/resources/images/banner_gen8_2x.png)

2. All of these sprites are converted into a form that can be rendered in a terminal (unicode
characters and colour control sequences) by the `img2xterm` tool, found at
[rossy/img2xterm](https://github.com/rossy/img2xterm)

3. Use some go tools (`encoding/gob` and `go:embed`) to generate a go source code file
that encodes all of the converted unicode sprites as gzipped text and some search-optimised data structures.

4. Finally, this is built with the main CLI logic in `pokesay.go` into an single executable that can be
easily popped into a directory in the user's `$PATH`

If all you are after is installing the program to use, then there are no dependencies required!
Navigate to the Releases and download the latest binary.

## Similar projects

There are many other projects that bring pokemon to the terminal!
Check them out via the links.

Inspired by the [pokeshell](https://github.com/acxz/pokeshell) project, I've included a comparison table

| project | language | speed | jp | size | name | category | flip | id | tab completion |
|---------------------------------------------------------------------------------------------|---------------|------------|------|------|------|-----------|------|----|----------------|
| [`tmck-code/pokesay`](https://github.com/tmck-code/pokesay) | go | 1.7ms | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| [`yannjor/krabby`](https://github.com/yannjor/krabby) | rust | 5.2ms | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| [`Altair-39/kingler`](https://github.com/Altair-39/kingler) | rust | 39.2ms | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ |
| [`xiota/pokemon-colorscripts`](https://gitlab.com/xiota/pokemon-colorscripts) | bash | 26.7ms | ❌ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
| [`rubiin/pokego`](https://github.com/rubiin/pokego) | go | 2.0ms | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ |
| [`talwat/pokeget-rs`](https://github.com/talwat/pokeget-rs) | rust | 1.5ms | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| [`possatti/pokemonsay`](https://github.com/possatti/pokemonsay) | cowsay (perl) | 26.3ms | ❌ | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ |
| [`HRKings/pokemonsay-newgenerations`](https://github.com/HRKings/pokemonsay-newgenerations) | cowsay (perl) | 26.9ms | ❌ | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| [`dfrankland/pokemonsay`](https://github.com/dfrankland/pokemonsay) | nodejs | 180.2ms | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ |

---

## TODO

- **In progress**
- **Short-term**
- [ ] requesting mew returns mewtwo also
- [ ] create "vertical" friendly display mode, place the Pokemon standing beside the text box, on the left or right
- [ ] shell completion scripts (bash, zsh, fish)
- [ ] non-say mode (only print the pokemon, no speech bubble)
- **Longer-term**
- [ ] make the process async.
- (Currently the searching/pokemon fetching is done _before_ any printing begins. There's an opportunity to start printing the speech bubble while also fetching the pokemon to print below it)
- [ ] implement native lolcat/rainbow HR/colour
- **In Beta**
- [x] optionally print ID assigned to each pokemon, support deterministic selection via the same ID
- **Completed**
- [x] add option to flip Pokemon to face right or left, remove all "right" facing cowfiles
- [x] create Debian package
- [x] create Arch package
- [x] support long and short cli args (e.g. --name/-n)
- [x] Make the category struct faster to load - currently takes up to 80% of the execution time
- [x] Store metadata and names in a more storage-efficient manner
- [x] Import japanese names from data/pokemon.json
- [x] Fix bad whitespace stripping when building assets
- [x] List all names
- [x] Make data structure to hold categories, names and pokemon
- [x] Increase speed
- [x] Improve categories to be more specific than shiny/regular
- [x] Filter by both name and category

## Other docs

- [Building binaries](./docs/build.md)
- [Developing/Deploying](./docs/development.md)