123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531 |
- #!/usr/bin/env python
- # License: GPLv3 Copyright: 2021, Kovid Goyal <kovid at kovidgoyal.net>
- from typing import Dict, Sequence
- from kitty.fast_data_types import monotonic
- from kitty.typing import TypedDict
- class SpinnerDef(TypedDict):
- interval: int
- frames: Sequence[str]
- # Spinner definitions are from
- # https://raw.githubusercontent.com/sindresorhus/cli-spinners/main/spinners.json
- spinners: Dict[str, SpinnerDef] = { # {{{
- "dots": {
- "interval": 80,
- "frames": ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]
- },
- "dots2": {
- "interval": 80,
- "frames": ["⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷"]
- },
- "dots3": {
- "interval": 80,
- "frames": ["⠋", "⠙", "⠚", "⠞", "⠖", "⠦", "⠴", "⠲", "⠳", "⠓"]
- },
- "dots4": {
- "interval":
- 80,
- "frames":
- ["⠄", "⠆", "⠇", "⠋", "⠙", "⠸", "⠰", "⠠", "⠰", "⠸", "⠙", "⠋", "⠇", "⠆"]
- },
- "dots5": {
- "interval":
- 80,
- "frames": [
- "⠋", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠦", "⠖", "⠒", "⠐",
- "⠐", "⠒", "⠓", "⠋"
- ]
- },
- "dots6": {
- "interval":
- 80,
- "frames": [
- "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄",
- "⠤", "⠴", "⠲", "⠒", "⠂", "⠂", "⠒", "⠚", "⠙", "⠉", "⠁"
- ]
- },
- "dots7": {
- "interval":
- 80,
- "frames": [
- "⠈", "⠉", "⠋", "⠓", "⠒", "⠐", "⠐", "⠒", "⠖", "⠦", "⠤", "⠠", "⠠",
- "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈"
- ]
- },
- "dots8": {
- "interval":
- 80,
- "frames": [
- "⠁", "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄",
- "⠄", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋",
- "⠉", "⠈", "⠈"
- ]
- },
- "dots9": {
- "interval": 80,
- "frames": ["⢹", "⢺", "⢼", "⣸", "⣇", "⡧", "⡗", "⡏"]
- },
- "dots10": {
- "interval": 80,
- "frames": ["⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠"]
- },
- "dots11": {
- "interval": 100,
- "frames": ["⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈"]
- },
- "dots12": {
- "interval":
- 80,
- "frames": [
- "⢀⠀", "⡀⠀", "⠄⠀", "⢂⠀", "⡂⠀", "⠅⠀", "⢃⠀", "⡃⠀", "⠍⠀", "⢋⠀", "⡋⠀",
- "⠍⠁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙",
- "⢈⠩", "⡀⢙", "⠄⡙", "⢂⠩", "⡂⢘", "⠅⡘", "⢃⠨", "⡃⢐", "⠍⡐", "⢋⠠", "⡋⢀",
- "⠍⡁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙",
- "⠈⠩", "⠀⢙", "⠀⡙", "⠀⠩", "⠀⢘", "⠀⡘", "⠀⠨", "⠀⢐", "⠀⡐", "⠀⠠", "⠀⢀",
- "⠀⡀"
- ]
- },
- "dots8Bit": {
- "interval":
- 80,
- "frames": [
- "⠀", "⠁", "⠂", "⠃", "⠄", "⠅", "⠆", "⠇", "⡀", "⡁", "⡂", "⡃", "⡄",
- "⡅", "⡆", "⡇", "⠈", "⠉", "⠊", "⠋", "⠌", "⠍", "⠎", "⠏", "⡈", "⡉",
- "⡊", "⡋", "⡌", "⡍", "⡎", "⡏", "⠐", "⠑", "⠒", "⠓", "⠔", "⠕", "⠖",
- "⠗", "⡐", "⡑", "⡒", "⡓", "⡔", "⡕", "⡖", "⡗", "⠘", "⠙", "⠚", "⠛",
- "⠜", "⠝", "⠞", "⠟", "⡘", "⡙", "⡚", "⡛", "⡜", "⡝", "⡞", "⡟", "⠠",
- "⠡", "⠢", "⠣", "⠤", "⠥", "⠦", "⠧", "⡠", "⡡", "⡢", "⡣", "⡤", "⡥",
- "⡦", "⡧", "⠨", "⠩", "⠪", "⠫", "⠬", "⠭", "⠮", "⠯", "⡨", "⡩", "⡪",
- "⡫", "⡬", "⡭", "⡮", "⡯", "⠰", "⠱", "⠲", "⠳", "⠴", "⠵", "⠶", "⠷",
- "⡰", "⡱", "⡲", "⡳", "⡴", "⡵", "⡶", "⡷", "⠸", "⠹", "⠺", "⠻", "⠼",
- "⠽", "⠾", "⠿", "⡸", "⡹", "⡺", "⡻", "⡼", "⡽", "⡾", "⡿", "⢀", "⢁",
- "⢂", "⢃", "⢄", "⢅", "⢆", "⢇", "⣀", "⣁", "⣂", "⣃", "⣄", "⣅", "⣆",
- "⣇", "⢈", "⢉", "⢊", "⢋", "⢌", "⢍", "⢎", "⢏", "⣈", "⣉", "⣊", "⣋",
- "⣌", "⣍", "⣎", "⣏", "⢐", "⢑", "⢒", "⢓", "⢔", "⢕", "⢖", "⢗", "⣐",
- "⣑", "⣒", "⣓", "⣔", "⣕", "⣖", "⣗", "⢘", "⢙", "⢚", "⢛", "⢜", "⢝",
- "⢞", "⢟", "⣘", "⣙", "⣚", "⣛", "⣜", "⣝", "⣞", "⣟", "⢠", "⢡", "⢢",
- "⢣", "⢤", "⢥", "⢦", "⢧", "⣠", "⣡", "⣢", "⣣", "⣤", "⣥", "⣦", "⣧",
- "⢨", "⢩", "⢪", "⢫", "⢬", "⢭", "⢮", "⢯", "⣨", "⣩", "⣪", "⣫", "⣬",
- "⣭", "⣮", "⣯", "⢰", "⢱", "⢲", "⢳", "⢴", "⢵", "⢶", "⢷", "⣰", "⣱",
- "⣲", "⣳", "⣴", "⣵", "⣶", "⣷", "⢸", "⢹", "⢺", "⢻", "⢼", "⢽", "⢾",
- "⢿", "⣸", "⣹", "⣺", "⣻", "⣼", "⣽", "⣾", "⣿"
- ]
- },
- "line": {
- "interval": 130,
- "frames": ["-", "\\", "|", "/"]
- },
- "line2": {
- "interval": 100,
- "frames": ["⠂", "-", "–", "—", "–", "-"]
- },
- "pipe": {
- "interval": 100,
- "frames": ["┤", "┘", "┴", "└", "├", "┌", "┬", "┐"]
- },
- "simpleDots": {
- "interval": 400,
- "frames": [". ", ".. ", "...", " "]
- },
- "simpleDotsScrolling": {
- "interval": 200,
- "frames": [". ", ".. ", "...", " ..", " .", " "]
- },
- "star": {
- "interval": 70,
- "frames": ["✶", "✸", "✹", "✺", "✹", "✷"]
- },
- "star2": {
- "interval": 80,
- "frames": ["+", "x", "*"]
- },
- "flip": {
- "interval": 70,
- "frames": ["_", "_", "_", "-", "`", "`", "'", "´", "-", "_", "_", "_"]
- },
- "hamburger": {
- "interval": 100,
- "frames": ["☱", "☲", "☴"]
- },
- "growVertical": {
- "interval": 120,
- "frames": ["▁", "▃", "▄", "▅", "▆", "▇", "▆", "▅", "▄", "▃"]
- },
- "growHorizontal": {
- "interval": 120,
- "frames": ["▏", "▎", "▍", "▌", "▋", "▊", "▉", "▊", "▋", "▌", "▍", "▎"]
- },
- "balloon": {
- "interval": 140,
- "frames": [" ", ".", "o", "O", "@", "*", " "]
- },
- "balloon2": {
- "interval": 120,
- "frames": [".", "o", "O", "°", "O", "o", "."]
- },
- "noise": {
- "interval": 100,
- "frames": ["▓", "▒", "░"]
- },
- "bounce": {
- "interval": 120,
- "frames": ["⠁", "⠂", "⠄", "⠂"]
- },
- "boxBounce": {
- "interval": 120,
- "frames": ["▖", "▘", "▝", "▗"]
- },
- "boxBounce2": {
- "interval": 100,
- "frames": ["▌", "▀", "▐", "▄"]
- },
- "triangle": {
- "interval": 50,
- "frames": ["◢", "◣", "◤", "◥"]
- },
- "arc": {
- "interval": 100,
- "frames": ["◜", "◠", "◝", "◞", "◡", "◟"]
- },
- "circle": {
- "interval": 120,
- "frames": ["◡", "⊙", "◠"]
- },
- "squareCorners": {
- "interval": 180,
- "frames": ["◰", "◳", "◲", "◱"]
- },
- "circleQuarters": {
- "interval": 120,
- "frames": ["◴", "◷", "◶", "◵"]
- },
- "circleHalves": {
- "interval": 50,
- "frames": ["◐", "◓", "◑", "◒"]
- },
- "squish": {
- "interval": 100,
- "frames": ["╫", "╪"]
- },
- "toggle": {
- "interval": 250,
- "frames": ["⊶", "⊷"]
- },
- "toggle2": {
- "interval": 80,
- "frames": ["▫", "▪"]
- },
- "toggle3": {
- "interval": 120,
- "frames": ["□", "■"]
- },
- "toggle4": {
- "interval": 100,
- "frames": ["■", "□", "▪", "▫"]
- },
- "toggle5": {
- "interval": 100,
- "frames": ["▮", "▯"]
- },
- "toggle6": {
- "interval": 300,
- "frames": ["ဝ", "၀"]
- },
- "toggle7": {
- "interval": 80,
- "frames": ["⦾", "⦿"]
- },
- "toggle8": {
- "interval": 100,
- "frames": ["◍", "◌"]
- },
- "toggle9": {
- "interval": 100,
- "frames": ["◉", "◎"]
- },
- "toggle10": {
- "interval": 100,
- "frames": ["㊂", "㊀", "㊁"]
- },
- "toggle11": {
- "interval": 50,
- "frames": ["⧇", "⧆"]
- },
- "toggle12": {
- "interval": 120,
- "frames": ["☗", "☖"]
- },
- "toggle13": {
- "interval": 80,
- "frames": ["=", "*", "-"]
- },
- "arrow": {
- "interval": 100,
- "frames": ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"]
- },
- "arrow2": {
- "interval": 80,
- "frames": ["⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ "]
- },
- "arrow3": {
- "interval": 120,
- "frames": ["▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸"]
- },
- "bouncingBar": {
- "interval":
- 80,
- "frames": [
- "[ ]", "[= ]", "[== ]", "[=== ]", "[ ===]", "[ ==]",
- "[ =]", "[ ]", "[ =]", "[ ==]", "[ ===]", "[====]",
- "[=== ]", "[== ]", "[= ]"
- ]
- },
- "bouncingBall": {
- "interval":
- 80,
- "frames": [
- "( ● )", "( ● )", "( ● )", "( ● )", "( ●)",
- "( ● )", "( ● )", "( ● )", "( ● )", "(● )"
- ]
- },
- "smiley": {
- "interval": 200,
- "frames": ["😄 ", "😝 "]
- },
- "monkey": {
- "interval": 300,
- "frames": ["🙈 ", "🙈 ", "🙉 ", "🙊 "]
- },
- "hearts": {
- "interval": 100,
- "frames": ["💛 ", "💙 ", "💜 ", "💚 ", "❤️ "]
- },
- "clock": {
- "interval":
- 100,
- "frames": [
- "🕛 ", "🕐 ", "🕑 ", "🕒 ", "🕓 ", "🕔 ", "🕕 ", "🕖 ", "🕗 ", "🕘 ", "🕙 ",
- "🕚 "
- ]
- },
- "earth": {
- "interval": 180,
- "frames": ["🌍 ", "🌎 ", "🌏 "]
- },
- "material": {
- "interval":
- 17,
- "frames": [
- "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
- "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
- "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
- "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", "████████▁▁▁▁▁▁▁▁▁▁▁▁",
- "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁",
- "██████████▁▁▁▁▁▁▁▁▁▁", "███████████▁▁▁▁▁▁▁▁▁",
- "█████████████▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁",
- "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁",
- "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁",
- "▁▁██████████████▁▁▁▁", "▁▁▁██████████████▁▁▁",
- "▁▁▁▁█████████████▁▁▁", "▁▁▁▁██████████████▁▁",
- "▁▁▁▁██████████████▁▁", "▁▁▁▁▁██████████████▁",
- "▁▁▁▁▁██████████████▁", "▁▁▁▁▁██████████████▁",
- "▁▁▁▁▁▁██████████████", "▁▁▁▁▁▁██████████████",
- "▁▁▁▁▁▁▁█████████████", "▁▁▁▁▁▁▁█████████████",
- "▁▁▁▁▁▁▁▁████████████", "▁▁▁▁▁▁▁▁████████████",
- "▁▁▁▁▁▁▁▁▁███████████", "▁▁▁▁▁▁▁▁▁███████████",
- "▁▁▁▁▁▁▁▁▁▁██████████", "▁▁▁▁▁▁▁▁▁▁██████████",
- "▁▁▁▁▁▁▁▁▁▁▁▁████████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
- "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
- "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
- "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
- "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", "████████▁▁▁▁▁▁▁▁▁▁▁▁",
- "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁",
- "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁",
- "███████████▁▁▁▁▁▁▁▁▁", "████████████▁▁▁▁▁▁▁▁",
- "████████████▁▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁",
- "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁",
- "▁██████████████▁▁▁▁▁", "▁▁▁█████████████▁▁▁▁",
- "▁▁▁▁▁████████████▁▁▁", "▁▁▁▁▁████████████▁▁▁",
- "▁▁▁▁▁▁███████████▁▁▁", "▁▁▁▁▁▁▁▁█████████▁▁▁",
- "▁▁▁▁▁▁▁▁█████████▁▁▁", "▁▁▁▁▁▁▁▁▁█████████▁▁",
- "▁▁▁▁▁▁▁▁▁█████████▁▁", "▁▁▁▁▁▁▁▁▁▁█████████▁",
- "▁▁▁▁▁▁▁▁▁▁▁████████▁", "▁▁▁▁▁▁▁▁▁▁▁████████▁",
- "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", "▁▁▁▁▁▁▁▁▁▁▁▁███████▁",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁",
- "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁"
- ]
- },
- "moon": {
- "interval": 80,
- "frames": ["🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 "]
- },
- "runner": {
- "interval": 140,
- "frames": ["🚶 ", "🏃 "]
- },
- "pong": {
- "interval":
- 80,
- "frames": [
- "▐⠂ ▌", "▐⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌",
- "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌",
- "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌",
- "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂▌", "▐ ⠠▌",
- "▐ ⡀▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌",
- "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌",
- "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌",
- "▐ ⡀ ▌", "▐⠠ ▌"
- ]
- },
- "shark": {
- "interval":
- 120,
- "frames": [
- "▐|\\____________▌", "▐_|\\___________▌", "▐__|\\__________▌",
- "▐___|\\_________▌", "▐____|\\________▌", "▐_____|\\_______▌",
- "▐______|\\______▌", "▐_______|\\_____▌", "▐________|\\____▌",
- "▐_________|\\___▌", "▐__________|\\__▌", "▐___________|\\_▌",
- "▐____________|\\▌", "▐____________/|▌", "▐___________/|_▌",
- "▐__________/|__▌", "▐_________/|___▌", "▐________/|____▌",
- "▐_______/|_____▌", "▐______/|______▌", "▐_____/|_______▌",
- "▐____/|________▌", "▐___/|_________▌", "▐__/|__________▌",
- "▐_/|___________▌", "▐/|____________▌"
- ]
- },
- "dqpb": {
- "interval": 100,
- "frames": ["d", "q", "p", "b"]
- },
- "weather": {
- "interval":
- 100,
- "frames": [
- "☀️ ", "☀️ ", "☀️ ", "🌤 ", "⛅️ ", "🌥 ", "☁️ ", "🌧 ", "🌨 ", "🌧 ",
- "🌨 ", "🌧 ", "🌨 ", "⛈ ", "🌨 ", "🌧 ", "🌨 ", "☁️ ", "🌥 ", "⛅️ ", "🌤 ",
- "☀️ ", "☀️ "
- ]
- },
- "christmas": {
- "interval": 400,
- "frames": ["🌲", "🎄"]
- },
- "grenade": {
- "interval":
- 80,
- "frames": [
- "، ", "′ ", " ´ ", " ‾ ", " ⸌", " ⸊", " |", " ⁎", " ⁕",
- " ෴ ", " ⁓", " ", " ", " "
- ]
- },
- "point": {
- "interval": 125,
- "frames": ["∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙"]
- },
- "layer": {
- "interval": 150,
- "frames": ["-", "=", "≡"]
- },
- "betaWave": {
- "interval":
- 80,
- "frames": [
- "ρββββββ", "βρβββββ", "ββρββββ", "βββρβββ", "ββββρββ", "βββββρβ",
- "ββββββρ"
- ]
- },
- "fingerDance": {
- "interval": 160,
- "frames": ["🤘 ", "🤟 ", "🖖 ", "✋ ", "🤚 ", "👆 "]
- },
- "fistBump": {
- "interval":
- 80,
- "frames": [
- "🤜\u3000\u3000\u3000\u3000🤛 ", "🤜\u3000\u3000\u3000\u3000🤛 ",
- "🤜\u3000\u3000\u3000\u3000🤛 ", "\u3000🤜\u3000\u3000🤛\u3000 ",
- "\u3000\u3000🤜🤛\u3000\u3000 ", "\u3000🤜✨🤛\u3000\u3000 ",
- "🤜\u3000✨\u3000🤛\u3000 "
- ]
- },
- "soccerHeader": {
- "interval":
- 80,
- "frames": [
- " 🧑⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ",
- "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️🧑 ", "🧑 ⚽️ 🧑 ",
- "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 "
- ]
- },
- "mindblown": {
- "interval":
- 160,
- "frames": [
- "😐 ", "😐 ", "😮 ", "😮 ", "😦 ", "😦 ", "😧 ", "😧 ", "🤯 ", "💥 ", "✨ ",
- "\u3000 ", "\u3000 ", "\u3000 "
- ]
- },
- "speaker": {
- "interval": 160,
- "frames": ["🔈 ", "🔉 ", "🔊 ", "🔉 "]
- },
- "orangePulse": {
- "interval": 100,
- "frames": ["🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 "]
- },
- "bluePulse": {
- "interval": 100,
- "frames": ["🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 "]
- },
- "orangeBluePulse": {
- "interval": 100,
- "frames": ["🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 ", "🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 "]
- },
- "timeTravel": {
- "interval":
- 100,
- "frames": [
- "🕛 ", "🕚 ", "🕙 ", "🕘 ", "🕗 ", "🕖 ", "🕕 ", "🕔 ", "🕓 ", "🕒 ", "🕑 ",
- "🕐 "
- ]
- },
- "aesthetic": {
- "interval":
- 80,
- "frames": [
- "▰▱▱▱▱▱▱", "▰▰▱▱▱▱▱", "▰▰▰▱▱▱▱", "▰▰▰▰▱▱▱", "▰▰▰▰▰▱▱", "▰▰▰▰▰▰▱",
- "▰▰▰▰▰▰▰", "▰▱▱▱▱▱▱"
- ]
- }
- } # }}}
- class Spinner:
- def __init__(self, name: str = 'dots'):
- definition = spinners[name]
- self.interval = definition['interval'] / 1000
- self.frames = definition['frames']
- self.current_frame = -1
- self.last_change_at = -self.interval
- def __call__(self) -> str:
- now = monotonic()
- if now - self.last_change_at >= self.interval:
- self.last_change_at = now
- self.current_frame = (self.current_frame + 1) % len(self.frames)
- return self.frames[self.current_frame]
|