riotskillissue 0.1.3__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/CHANGELOG.md +7 -0
  2. riotskillissue-0.1.4/LICENSE +21 -0
  3. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/PKG-INFO +6 -4
  4. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/cli.md +44 -0
  5. riotskillissue-0.1.4/docs/live-game-tui.md +238 -0
  6. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/mkdocs.yml +1 -0
  7. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/pyproject.toml +6 -4
  8. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/cli.py +57 -1
  9. riotskillissue-0.1.4/src/riotskillissue/tui.py +733 -0
  10. riotskillissue-0.1.3/LICENSE +0 -676
  11. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/.github/workflows/publish.yml +0 -0
  12. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/.github/workflows/test.yml +0 -0
  13. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/.github/workflows/update_sdk.yml +0 -0
  14. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/.gitignore +0 -0
  15. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/README.md +0 -0
  16. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/CONTRIBUTING.md +0 -0
  17. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/api-reference.md +0 -0
  18. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/configuration.md +0 -0
  19. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/examples/index.md +0 -0
  20. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/examples/league-of-legends.md +0 -0
  21. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/examples/teamfight-tactics.md +0 -0
  22. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/examples/valorant.md +0 -0
  23. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/getting-started.md +0 -0
  24. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/index.md +0 -0
  25. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/docs/stylesheets/extra.css +0 -0
  26. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/examples/basic_usage.py +0 -0
  27. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/examples/champion_mastery.py +0 -0
  28. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/examples/match_history.py +0 -0
  29. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/404.html +0 -0
  30. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/CONTRIBUTING/index.html +0 -0
  31. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/api-reference/index.html +0 -0
  32. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/images/favicon.png +0 -0
  33. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/bundle.79ae519e.min.js +0 -0
  34. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/bundle.79ae519e.min.js.map +0 -0
  35. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ar.min.js +0 -0
  36. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.da.min.js +0 -0
  37. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.de.min.js +0 -0
  38. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.du.min.js +0 -0
  39. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.el.min.js +0 -0
  40. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.es.min.js +0 -0
  41. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.fi.min.js +0 -0
  42. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.fr.min.js +0 -0
  43. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.he.min.js +0 -0
  44. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.hi.min.js +0 -0
  45. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.hu.min.js +0 -0
  46. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.hy.min.js +0 -0
  47. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.it.min.js +0 -0
  48. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ja.min.js +0 -0
  49. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.jp.min.js +0 -0
  50. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.kn.min.js +0 -0
  51. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ko.min.js +0 -0
  52. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.multi.min.js +0 -0
  53. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.nl.min.js +0 -0
  54. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.no.min.js +0 -0
  55. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.pt.min.js +0 -0
  56. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ro.min.js +0 -0
  57. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ru.min.js +0 -0
  58. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.sa.min.js +0 -0
  59. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -0
  60. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.sv.min.js +0 -0
  61. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.ta.min.js +0 -0
  62. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.te.min.js +0 -0
  63. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.th.min.js +0 -0
  64. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.tr.min.js +0 -0
  65. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.vi.min.js +0 -0
  66. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/min/lunr.zh.min.js +0 -0
  67. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/tinyseg.js +0 -0
  68. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/lunr/wordcut.js +0 -0
  69. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/workers/search.2c215733.min.js +0 -0
  70. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/javascripts/workers/search.2c215733.min.js.map +0 -0
  71. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/stylesheets/main.484c7ddc.min.css +0 -0
  72. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/stylesheets/main.484c7ddc.min.css.map +0 -0
  73. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/stylesheets/palette.ab4e12ef.min.css +0 -0
  74. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -0
  75. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/cli/index.html +0 -0
  76. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/configuration/index.html +0 -0
  77. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/examples/index.html +0 -0
  78. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/examples/league-of-legends/index.html +0 -0
  79. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/examples/teamfight-tactics/index.html +0 -0
  80. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/examples/valorant/index.html +0 -0
  81. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/getting-started/index.html +0 -0
  82. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/index.html +0 -0
  83. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/search/search_index.json +0 -0
  84. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/sitemap.xml +0 -0
  85. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/sitemap.xml.gz +0 -0
  86. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/site/stylesheets/extra.css +0 -0
  87. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/__init__.py +0 -0
  88. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/__init__.py +0 -0
  89. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/client_mixin.py +0 -0
  90. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/account.py +0 -0
  91. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/champion-mastery.py +0 -0
  92. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/champion.py +0 -0
  93. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/champion_mastery.py +0 -0
  94. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/clash.py +0 -0
  95. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/league-exp.py +0 -0
  96. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/league.py +0 -0
  97. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/league_exp.py +0 -0
  98. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol-challenges.py +0 -0
  99. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol-rso-match.py +0 -0
  100. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol-status.py +0 -0
  101. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol_challenges.py +0 -0
  102. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol_rso_match.py +0 -0
  103. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lol_status.py +0 -0
  104. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor-deck.py +0 -0
  105. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor-inventory.py +0 -0
  106. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor-match.py +0 -0
  107. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor-ranked.py +0 -0
  108. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor-status.py +0 -0
  109. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor_deck.py +0 -0
  110. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor_inventory.py +0 -0
  111. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor_match.py +0 -0
  112. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor_ranked.py +0 -0
  113. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/lor_status.py +0 -0
  114. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/match.py +0 -0
  115. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/riftbound-content.py +0 -0
  116. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/riftbound_content.py +0 -0
  117. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/spectator-tft.py +0 -0
  118. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/spectator.py +0 -0
  119. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/spectator_tft.py +0 -0
  120. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/summoner.py +0 -0
  121. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft-league.py +0 -0
  122. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft-match.py +0 -0
  123. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft-status.py +0 -0
  124. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft-summoner.py +0 -0
  125. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft_league.py +0 -0
  126. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft_match.py +0 -0
  127. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft_status.py +0 -0
  128. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tft_summoner.py +0 -0
  129. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tournament-stub.py +0 -0
  130. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tournament.py +0 -0
  131. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/tournament_stub.py +0 -0
  132. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-console-match.py +0 -0
  133. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-console-ranked.py +0 -0
  134. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-content.py +0 -0
  135. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-match.py +0 -0
  136. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-ranked.py +0 -0
  137. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val-status.py +0 -0
  138. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_console_match.py +0 -0
  139. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_console_ranked.py +0 -0
  140. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_content.py +0 -0
  141. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_match.py +0 -0
  142. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_ranked.py +0 -0
  143. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/endpoints/val_status.py +0 -0
  144. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/api/models.py +0 -0
  145. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/auth.py +0 -0
  146. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/cache.py +0 -0
  147. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/client.py +0 -0
  148. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/config.py +0 -0
  149. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/http.py +0 -0
  150. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/pagination.py +0 -0
  151. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/ratelimit.py +0 -0
  152. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/types.py +0 -0
  153. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/core/utils.py +0 -0
  154. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/static.py +0 -0
  155. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/src/riotskillissue/testing.py +0 -0
  156. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/conftest.py +0 -0
  157. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/manual_test.py +0 -0
  158. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/test_advanced.py +0 -0
  159. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/test_bindings.py +0 -0
  160. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/test_cache.py +0 -0
  161. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/test_core.py +0 -0
  162. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tests/test_resiliency.py +0 -0
  163. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/bump_version.py +0 -0
  164. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/diff_engine.py +0 -0
  165. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/generator/core.py +0 -0
  166. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/generator/parser.py +0 -0
  167. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/manager.py +0 -0
  168. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/templates/client_mixin.py.j2 +0 -0
  169. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/templates/endpoints.py.j2 +0 -0
  170. {riotskillissue-0.1.3 → riotskillissue-0.1.4}/tools/templates/models.py.j2 +0 -0
@@ -5,6 +5,13 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.4] - 2026-02-06
9
+ ### Added
10
+ - **TUI**: Initial Terminal User Interface functionality for monitoring and interaction.
11
+
12
+ ### Changed
13
+ - **License**: Switched project license to MIT License.
14
+
8
15
  ## [0.1.3] - 2026-02-03
9
16
  ### Added
10
17
  - **Documentation**: Complete MkDocs Material documentation site with LoL-inspired theme.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Demoen
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.
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: riotskillissue
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Production-ready, auto-updating Riot API wrapper.
5
5
  Author: Demoen
6
6
  License-File: LICENSE
7
7
  Classifier: Development Status :: 4 - Beta
8
8
  Classifier: Intended Audience :: Developers
9
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
9
+ Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python :: 3.8
11
11
  Classifier: Programming Language :: Python :: 3.9
12
12
  Classifier: Programming Language :: Python :: 3.10
@@ -20,7 +20,10 @@ Requires-Dist: jinja2>=3.1.0
20
20
  Requires-Dist: msgspec>=0.18.0
21
21
  Requires-Dist: pydantic>=2.7.0
22
22
  Requires-Dist: redis>=5.0.0
23
+ Requires-Dist: rich>=13.7.0
23
24
  Requires-Dist: tenacity>=8.2.0
25
+ Requires-Dist: textual>=0.85.0
26
+ Requires-Dist: typer>=0.12.0
24
27
  Provides-Extra: dev
25
28
  Requires-Dist: deepdiff>=6.0.0; extra == 'dev'
26
29
  Requires-Dist: mypy>=1.10.0; extra == 'dev'
@@ -28,9 +31,8 @@ Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
28
31
  Requires-Dist: pytest-cov>=5.0.0; extra == 'dev'
29
32
  Requires-Dist: pytest>=8.0.0; extra == 'dev'
30
33
  Requires-Dist: respx>=0.21.0; extra == 'dev'
31
- Requires-Dist: rich>=13.7.0; extra == 'dev'
32
34
  Requires-Dist: ruff>=0.4.0; extra == 'dev'
33
- Requires-Dist: typer>=0.12.0; extra == 'dev'
35
+ Requires-Dist: textual-dev>=1.0.0; extra == 'dev'
34
36
  Requires-Dist: types-redis; extra == 'dev'
35
37
  Requires-Dist: types-requests; extra == 'dev'
36
38
  Provides-Extra: docs
@@ -88,6 +88,49 @@ Game Mode: CLASSIC
88
88
  Duration: 1847s
89
89
  ```
90
90
 
91
+ ### live
92
+
93
+ 🎮 Launch an interactive Live Game TUI (Terminal User Interface) that shows real-time information about an ongoing League of Legends match.
94
+
95
+ ```bash
96
+ riotskillissue-cli live "GameName#TagLine" --region euw1
97
+ ```
98
+
99
+ This is the fastest way to spectate a match from your terminal — **one command, instant dashboard**.
100
+
101
+ **Arguments:**
102
+
103
+ | Argument | Description |
104
+ |----------|-------------|
105
+ | `name` | Riot ID in format `GameName#TagLine` |
106
+ | `--region` | Regional server (default: `euw1`) |
107
+ | `--api-key` | API key (or use `RIOT_API_KEY` env var) |
108
+ | `--refresh` | Auto-refresh interval in seconds (default: `30`) |
109
+
110
+ **Example:**
111
+
112
+ ```bash
113
+ $ riotskillissue-cli live "Agurin#EUW" --region euw1
114
+ ```
115
+
116
+ This opens a full-screen terminal dashboard showing:
117
+
118
+ - **Game info** — queue type, game duration, platform
119
+ - **Blue Team** — champions, player names, ranks, win rates, summoner spells
120
+ - **Red Team** — champions, player names, ranks, win rates, summoner spells
121
+ - **Bans** — all banned champions
122
+
123
+ The TUI auto-refreshes every 30 seconds (configurable with `--refresh`). If the player isn't in a game yet, it will keep checking until one starts.
124
+
125
+ **Keyboard shortcuts:**
126
+
127
+ | Key | Action |
128
+ |-----|--------|
129
+ | `R` | Manual refresh |
130
+ | `Q` / `Esc` | Quit |
131
+
132
+ See the [Live Game TUI](live-game-tui.md) page for more details and screenshots.
133
+
91
134
  ## Error Handling
92
135
 
93
136
  The CLI displays user-friendly error messages:
@@ -103,3 +146,4 @@ $ riotskillissue-cli summoner "NonExistent#USER" --region euw1
103
146
 
104
147
  Error: 404 - Data not found
105
148
  ```
149
+
@@ -0,0 +1,238 @@
1
+ # Live Game TUI
2
+
3
+ RiotSkillIssue includes a built-in **Terminal User Interface** (TUI) for spectating live League of Legends matches directly from your terminal. One command gives you a full dashboard with teams, champions, ranks, and more.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ riotskillissue-cli live "Agurin#EUW" --region euw1
9
+ ```
10
+
11
+ That's it. This single command opens an interactive, auto-refreshing dashboard.
12
+
13
+ ## Features
14
+
15
+ - **Real-time game data** — see the current match as it happens
16
+ - **Both teams at a glance** — champions, summoner spells, ranks, win rates
17
+ - **Auto-refresh** — data updates every 30 seconds (configurable)
18
+ - **Rank colors** — each player's rank is color-coded (Iron → Challenger)
19
+ - **Win rate highlighting** — green for >55%, red for <45%
20
+ - **Ban display** — all banned champions listed
21
+ - **Waiting mode** — if the player isn't in a game, the TUI waits and checks periodically
22
+ - **Keyboard controls** — refresh manually or quit with a single keypress
23
+
24
+ ## Installation
25
+
26
+ The TUI is included with the standard package installation:
27
+
28
+ ```bash
29
+ pip install riotskillissue
30
+ ```
31
+
32
+ !!! note "Dependencies"
33
+ The TUI uses [Textual](https://textual.textualize.io/) and [Rich](https://rich.readthedocs.io/),
34
+ which are installed automatically as dependencies.
35
+
36
+ ## Usage
37
+
38
+ ### Basic
39
+
40
+ ```bash
41
+ export RIOT_API_KEY="RGAPI-your-key-here"
42
+ riotskillissue-cli live "GameName#TagLine"
43
+ ```
44
+
45
+ ### With Options
46
+
47
+ ```bash
48
+ riotskillissue-cli live "Faker#KR1" --region kr --refresh 15
49
+ ```
50
+
51
+ ### All Options
52
+
53
+ | Option | Default | Description |
54
+ |--------|---------|-------------|
55
+ | `name` | *(required)* | Riot ID in `GameName#TagLine` format |
56
+ | `--region` | `euw1` | Regional server (`euw1`, `na1`, `kr`, `eun1`, etc.) |
57
+ | `--api-key` | `$RIOT_API_KEY` | Riot API key |
58
+ | `--refresh` | `30` | Auto-refresh interval in seconds |
59
+
60
+ ### Regions
61
+
62
+ All standard League of Legends regions are supported:
63
+
64
+ | Region | Code |
65
+ |--------|------|
66
+ | North America | `na1` |
67
+ | Europe West | `euw1` |
68
+ | Europe Nordic & East | `eun1` |
69
+ | Korea | `kr` |
70
+ | Japan | `jp1` |
71
+ | Brazil | `br1` |
72
+ | Latin America North | `la1` |
73
+ | Latin America South | `la2` |
74
+ | Oceania | `oc1` |
75
+ | Turkey | `tr1` |
76
+ | Russia | `ru` |
77
+ | Philippines | `ph2` |
78
+ | Singapore | `sg2` |
79
+ | Thailand | `th2` |
80
+ | Taiwan | `tw2` |
81
+ | Vietnam | `vn2` |
82
+
83
+ ## Keyboard Shortcuts
84
+
85
+ | Key | Action |
86
+ |-----|--------|
87
+ | ++r++ | Refresh game data immediately |
88
+ | ++q++ | Quit the TUI |
89
+ | ++escape++ | Quit the TUI |
90
+
91
+ ## What You See
92
+
93
+ ### When a Game is Active
94
+
95
+ The TUI displays a full-screen dashboard with:
96
+
97
+ ```
98
+ ┌─────────────────────────────────────────────────────────────┐
99
+ │ 🎮 LIVE GAME — Ranked Solo/Duo │
100
+ │ ⏱ 12:34 📍 EUW1 │
101
+ ├─────────────────────────────────────────────────────────────┤
102
+ │ 🔵 BLUE TEAM │
103
+ │ Champion │ Player │ Rank │ Spells │
104
+ │──────────────┼──────────────┼────────────────┼──────────────│
105
+ │ Ahri │ Player1#EUW │ Diamond II │ Flash / Ign │
106
+ │ Lee Sin │ Player2#EUW │ Emerald I │ Flash / Smt │
107
+ │ Orianna │ Player3#EUW │ Master 234 LP │ Flash / TP │
108
+ │ Jinx │ Player4#EUW │ Diamond IV │ Flash / Heal │
109
+ │ Thresh │ Player5#EUW │ Platinum I │ Flash / Ign │
110
+ ├─────────────────────────────────────────────────────────────┤
111
+ │ 🚫 Bans: Yasuo · Yone · Zed · Lux · Blitzcrank │
112
+ ├─────────────────────────────────────────────────────────────┤
113
+ │ 🔴 RED TEAM │
114
+ │ Champion │ Player │ Rank │ Spells │
115
+ │──────────────┼──────────────┼────────────────┼──────────────│
116
+ │ Zed │ Player6#EUW │ Diamond I │ Flash / Ign │
117
+ │ Graves │ Player7#EUW │ Emerald III │ Flash / Smt │
118
+ │ Syndra │ Player8#EUW │ Diamond III │ Flash / TP │
119
+ │ Kai'Sa │ Player9#EUW │ Platinum II │ Flash / Heal │
120
+ │ Nautilus │ Player10#EUW │ Diamond IV │ Flash / Ign │
121
+ └─────────────────────────────────────────────────────────────┘
122
+ Q Quit │ R Refresh │ Auto-refresh: 24s
123
+ ```
124
+
125
+ ### When Not in a Game
126
+
127
+ If the player isn't currently in a match, the TUI shows a waiting screen and keeps checking:
128
+
129
+ ```
130
+ ┌───────────────────────────────────────┐
131
+ │ │
132
+ │ 🎮 Agurin#EUW │
133
+ │ │
134
+ │ Not currently in a game. │
135
+ │ │
136
+ │ The TUI will auto-refresh and │
137
+ │ show the game once it starts. │
138
+ │ │
139
+ │ Next refresh in 24s │
140
+ │ Press [R] to refresh now │
141
+ │ │
142
+ └───────────────────────────────────────┘
143
+ ```
144
+
145
+ ## Rank Colors
146
+
147
+ Each player's rank is displayed with a color matching their tier:
148
+
149
+ | Tier | Color |
150
+ |------|-------|
151
+ | Iron | Gray |
152
+ | Bronze | Bronze |
153
+ | Silver | Silver |
154
+ | Gold | Gold |
155
+ | Platinum | Teal |
156
+ | Emerald | Green |
157
+ | Diamond | Light Blue |
158
+ | Master | Purple |
159
+ | Grandmaster | Red |
160
+ | Challenger | Orange |
161
+
162
+ ## Programmatic Usage
163
+
164
+ You can also launch the TUI from Python code:
165
+
166
+ ```python
167
+ from riotskillissue.tui import run_tui
168
+
169
+ run_tui(
170
+ api_key="RGAPI-your-key",
171
+ game_name="Agurin",
172
+ tag_line="EUW",
173
+ region="euw1",
174
+ auto_refresh=30,
175
+ )
176
+ ```
177
+
178
+ Or use the lower-level app class for more control:
179
+
180
+ ```python
181
+ from riotskillissue.tui import LiveGameApp
182
+
183
+ app = LiveGameApp(
184
+ api_key="RGAPI-your-key",
185
+ game_name="Agurin",
186
+ tag_line="EUW",
187
+ region="euw1",
188
+ auto_refresh=15,
189
+ )
190
+ app.run()
191
+ ```
192
+
193
+ ## API Key
194
+
195
+ The TUI requires a valid Riot API key. You can get one from the [Riot Developer Portal](https://developer.riotgames.com/).
196
+
197
+ Set it as an environment variable for convenience:
198
+
199
+ === "Linux / macOS"
200
+
201
+ ```bash
202
+ export RIOT_API_KEY="RGAPI-your-key-here"
203
+ ```
204
+
205
+ === "Windows (PowerShell)"
206
+
207
+ ```powershell
208
+ $env:RIOT_API_KEY = "RGAPI-your-key-here"
209
+ ```
210
+
211
+ === "Windows (CMD)"
212
+
213
+ ```cmd
214
+ set RIOT_API_KEY=RGAPI-your-key-here
215
+ ```
216
+
217
+ !!! tip "Development Keys"
218
+ Riot development API keys expire every 24 hours. For persistent usage,
219
+ apply for a personal or production key through the Developer Portal.
220
+
221
+ ## Troubleshooting
222
+
223
+ ### "Not currently in a game"
224
+
225
+ The player must be in an **active** League of Legends match (loading screen or in-game).
226
+ Champion select does not count — the Spectator API only reports data once the game has started.
227
+
228
+ ### "404 - Data not found"
229
+
230
+ - Double-check the Riot ID spelling and tag line
231
+ - Make sure you're using the correct `--region` for the player's server
232
+ - Verify your API key is valid and not expired
233
+
234
+ ### Rate Limiting
235
+
236
+ The TUI makes multiple API calls per refresh (spectator + ranks for all 10 players).
237
+ With a development key (20 requests/second, 100 requests/2 minutes), the default
238
+ 30-second refresh interval stays well within limits. Lower the interval with caution.
@@ -71,6 +71,7 @@ nav:
71
71
  - VALORANT: examples/valorant.md
72
72
  - API Reference: api-reference.md
73
73
  - CLI: cli.md
74
+ - Live Game TUI: live-game-tui.md
74
75
  - Contributing: CONTRIBUTING.md
75
76
 
76
77
  extra:
@@ -7,7 +7,7 @@ riotskillissue-cli = "riotskillissue.cli:main"
7
7
 
8
8
  [project]
9
9
  name = "riotskillissue"
10
- version = "0.1.3"
10
+ version = "0.1.4"
11
11
  description = "Production-ready, auto-updating Riot API wrapper."
12
12
  readme = "README.md"
13
13
  authors = [{ name = "Demoen" }]
@@ -20,11 +20,14 @@ dependencies = [
20
20
  "jinja2>=3.1.0",
21
21
  "frozendict>=2.4.0", # For immutable specs
22
22
  "msgspec>=0.18.0", # Fast JSON parsing for large specs
23
+ "typer>=0.12.0", # CLI framework
24
+ "rich>=13.7.0", # Rich text formatting
25
+ "textual>=0.85.0", # Terminal User Interface
23
26
  ]
24
27
  classifiers = [
25
28
  "Development Status :: 4 - Beta",
26
29
  "Intended Audience :: Developers",
27
- "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
30
+ "License :: OSI Approved :: MIT License",
28
31
  "Programming Language :: Python :: 3.8",
29
32
  "Programming Language :: Python :: 3.9",
30
33
  "Programming Language :: Python :: 3.10",
@@ -41,11 +44,10 @@ dev = [
41
44
  "respx>=0.21.0",
42
45
  "ruff>=0.4.0",
43
46
  "mypy>=1.10.0",
44
- "typer>=0.12.0", # For CLI tools
45
- "rich>=13.7.0", # For pretty CLI output
46
47
  "types-redis",
47
48
  "types-requests",
48
49
  "deepdiff>=6.0.0",
50
+ "textual-dev>=1.0.0", # TUI development tools
49
51
  ]
50
52
 
51
53
  docs = [
@@ -6,7 +6,10 @@ from rich import print as rprint
6
6
  from .core.client import RiotClient, RiotClientConfig
7
7
  from .core.types import Region
8
8
 
9
- app = typer.Typer(help="RiotSkillIssue API Wrapper CLI")
9
+ app = typer.Typer(
10
+ help="RiotSkillIssue API Wrapper CLI",
11
+ rich_markup_mode="rich",
12
+ )
10
13
  console = Console()
11
14
 
12
15
  @app.command()
@@ -80,5 +83,58 @@ def match(match_id: str, region: str = "americas", api_key: str = typer.Option(N
80
83
 
81
84
  asyncio.run(_run())
82
85
 
86
+
87
+ @app.command()
88
+ def live(
89
+ name: str = typer.Argument(
90
+ ...,
91
+ help='Riot ID in format "GameName#TagLine" (e.g. "Agurin#EUW")',
92
+ ),
93
+ region: str = typer.Option(
94
+ "euw1",
95
+ help="Regional server (e.g. euw1, na1, kr)",
96
+ ),
97
+ api_key: str = typer.Option(
98
+ None,
99
+ envvar="RIOT_API_KEY",
100
+ help="Riot API key (or set RIOT_API_KEY env var)",
101
+ ),
102
+ refresh: int = typer.Option(
103
+ 30,
104
+ help="Auto-refresh interval in seconds",
105
+ ),
106
+ ):
107
+ """🎮 Launch the Live Game TUI for a League of Legends match.
108
+
109
+ Shows a real-time terminal dashboard with both teams, champion picks,
110
+ summoner spells, ranks, and win rates. Auto-refreshes periodically.
111
+
112
+ \b
113
+ Examples:
114
+ riotskillissue-cli live "Agurin#EUW" --region euw1
115
+ riotskillissue-cli live "Faker#KR1" --region kr
116
+ riotskillissue-cli live "Player#NA1" --region na1 --refresh 15
117
+ """
118
+ if not api_key:
119
+ rprint("[red]Error: API key required. Set RIOT_API_KEY env var or use --api-key.[/red]")
120
+ raise typer.Exit(code=1)
121
+
122
+ if "#" not in name:
123
+ rprint('[red]Error: Name must be in format "GameName#TagLine" (e.g. "Agurin#EUW").[/red]')
124
+ raise typer.Exit(code=1)
125
+
126
+ game_name, tag_line = name.split("#", 1)
127
+
128
+ from .tui import run_tui
129
+
130
+ run_tui(
131
+ api_key=api_key,
132
+ game_name=game_name,
133
+ tag_line=tag_line,
134
+ region=region,
135
+ auto_refresh=refresh,
136
+ )
137
+
138
+
83
139
  def main():
84
140
  app()