pingthings 0.5.0 → 0.6.0

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 (513) hide show
  1. package/bin/pingthings.js +11 -0
  2. package/package.json +1 -1
  3. package/packs/0ad-civilizations/manifest.json +56 -56
  4. package/packs/0ad-civilizations/sounds/alarm-alert.ogg +0 -0
  5. package/packs/0ad-civilizations/sounds/alarm-attack.ogg +0 -0
  6. package/packs/0ad-civilizations/sounds/alarm-defeat.ogg +0 -0
  7. package/packs/0ad-civilizations/sounds/alarm-no-resource.ogg +0 -0
  8. package/packs/0ad-civilizations/sounds/alarm-objective.ogg +0 -0
  9. package/packs/0ad-civilizations/sounds/alarm-research-complete.ogg +0 -0
  10. package/packs/0ad-civilizations/sounds/alarm-victory.ogg +0 -0
  11. package/packs/0ad-civilizations/sounds/greek-as-you-wish.ogg +0 -0
  12. package/packs/0ad-civilizations/sounds/greek-attack-1.ogg +0 -0
  13. package/packs/0ad-civilizations/sounds/greek-build-1.ogg +0 -0
  14. package/packs/0ad-civilizations/sounds/greek-heal-1.ogg +0 -0
  15. package/packs/0ad-civilizations/sounds/greek-march-1.ogg +0 -0
  16. package/packs/0ad-civilizations/sounds/greek-my-lord-1.ogg +0 -0
  17. package/packs/0ad-civilizations/sounds/greek-my-lord-2.ogg +0 -0
  18. package/packs/0ad-civilizations/sounds/greek-retreat-1.ogg +0 -0
  19. package/packs/0ad-civilizations/sounds/greek-what-is-it-1.ogg +0 -0
  20. package/packs/0ad-civilizations/sounds/greek-yes.ogg +0 -0
  21. package/packs/0ad-civilizations/sounds/latin-attack-1.ogg +0 -0
  22. package/packs/0ad-civilizations/sounds/latin-build-1.ogg +0 -0
  23. package/packs/0ad-civilizations/sounds/latin-fight-1.ogg +0 -0
  24. package/packs/0ad-civilizations/sounds/latin-heal-1.ogg +0 -0
  25. package/packs/0ad-civilizations/sounds/latin-hello-1.ogg +0 -0
  26. package/packs/0ad-civilizations/sounds/latin-my-lord-1.ogg +0 -0
  27. package/packs/0ad-civilizations/sounds/latin-what-is-it.ogg +0 -0
  28. package/packs/0ad-civilizations/sounds/persian-attack-1.ogg +0 -0
  29. package/packs/0ad-civilizations/sounds/persian-by-your-order.ogg +0 -0
  30. package/packs/0ad-civilizations/sounds/persian-forward-1.ogg +0 -0
  31. package/packs/0ad-civilizations/sounds/persian-i-will-go.ogg +0 -0
  32. package/packs/7kaa-soldiers/manifest.json +90 -90
  33. package/packs/7kaa-soldiers/sounds/00001-CH_A2.ogg +0 -0
  34. package/packs/7kaa-soldiers/sounds/00006-NO_V2.ogg +0 -0
  35. package/packs/7kaa-soldiers/sounds/00007-NO_V3.ogg +0 -0
  36. package/packs/7kaa-soldiers/sounds/00008-MA_V1.ogg +0 -0
  37. package/packs/7kaa-soldiers/sounds/00009-GR_V2.ogg +0 -0
  38. package/packs/7kaa-soldiers/sounds/00010-GR_V3.ogg +0 -0
  39. package/packs/7kaa-soldiers/sounds/00011-VI_V1.ogg +0 -0
  40. package/packs/7kaa-soldiers/sounds/00012-NO_A1.ogg +0 -0
  41. package/packs/7kaa-soldiers/sounds/00012-VI_V2.ogg +0 -0
  42. package/packs/7kaa-soldiers/sounds/00013-GR_V1.ogg +0 -0
  43. package/packs/7kaa-soldiers/sounds/00013-NO_A2.ogg +0 -0
  44. package/packs/7kaa-soldiers/sounds/00014-MA_A1.ogg +0 -0
  45. package/packs/7kaa-soldiers/sounds/00014-PE_V1.ogg +0 -0
  46. package/packs/7kaa-soldiers/sounds/00015-GR_A1.ogg +0 -0
  47. package/packs/7kaa-soldiers/sounds/00015-MA_V2.ogg +0 -0
  48. package/packs/7kaa-soldiers/sounds/00016-MA_V3.ogg +0 -0
  49. package/packs/7kaa-soldiers/sounds/00016-VI_A1.ogg +0 -0
  50. package/packs/7kaa-soldiers/sounds/00017-MA_V4.ogg +0 -0
  51. package/packs/7kaa-soldiers/sounds/00017-VI_A2.ogg +0 -0
  52. package/packs/7kaa-soldiers/sounds/00018-PE_A2.ogg +0 -0
  53. package/packs/7kaa-soldiers/sounds/00018-PE_V2.ogg +0 -0
  54. package/packs/7kaa-soldiers/sounds/00019-PE_V3.ogg +0 -0
  55. package/packs/7kaa-soldiers/sounds/00020-PE_A1.ogg +0 -0
  56. package/packs/7kaa-soldiers/sounds/00020-PE_V4.ogg +0 -0
  57. package/packs/7kaa-soldiers/sounds/00021-CH_A1.ogg +0 -0
  58. package/packs/7kaa-soldiers/sounds/00021-CH_V1.ogg +0 -0
  59. package/packs/7kaa-soldiers/sounds/00022-CH_V2.ogg +0 -0
  60. package/packs/7kaa-soldiers/sounds/00022-JA_A1.ogg +0 -0
  61. package/packs/7kaa-soldiers/sounds/00023-CH_V3.ogg +0 -0
  62. package/packs/7kaa-soldiers/sounds/00023-JA_A2.ogg +0 -0
  63. package/packs/7kaa-soldiers/sounds/00024-CH_V4.ogg +0 -0
  64. package/packs/7kaa-soldiers/sounds/00025-CH_V5.ogg +0 -0
  65. package/packs/7kaa-soldiers/sounds/00026-JA_V1.ogg +0 -0
  66. package/packs/7kaa-soldiers/sounds/00027-JA_V2.ogg +0 -0
  67. package/packs/7kaa-soldiers/sounds/00028-JA_V3.ogg +0 -0
  68. package/packs/7kaa-soldiers/sounds/00029-JA_V4.ogg +0 -0
  69. package/packs/7kaa-soldiers/sounds/00030-JA_V5.ogg +0 -0
  70. package/packs/7kaa-soldiers/sounds/00035-MA_V5.ogg +0 -0
  71. package/packs/7kaa-soldiers/sounds/00083-READY.ogg +0 -0
  72. package/packs/7kaa-soldiers/sounds/00084-NO_V1.ogg +0 -0
  73. package/packs/7kaa-soldiers/sounds/00085-EG_V1.ogg +0 -0
  74. package/packs/7kaa-soldiers/sounds/00086-EG_V2.ogg +0 -0
  75. package/packs/7kaa-soldiers/sounds/00087-EG_V3.ogg +0 -0
  76. package/packs/7kaa-soldiers/sounds/00088-EG_V4.ogg +0 -0
  77. package/packs/7kaa-soldiers/sounds/00089-IN_V1.ogg +0 -0
  78. package/packs/7kaa-soldiers/sounds/00090-IN_V2.ogg +0 -0
  79. package/packs/7kaa-soldiers/sounds/00091-IN_V3.ogg +0 -0
  80. package/packs/7kaa-soldiers/sounds/00092-IN_V4.ogg +0 -0
  81. package/packs/7kaa-soldiers/sounds/00093-ZU_V2.ogg +0 -0
  82. package/packs/7kaa-soldiers/sounds/00094-ZU_V3.ogg +0 -0
  83. package/packs/7kaa-soldiers/sounds/00095-ZU_V5.ogg +0 -0
  84. package/packs/7kaa-soldiers/sounds/00096-ZU_V7.ogg +0 -0
  85. package/packs/7kaa-soldiers/sounds/00097-ZU_V8.ogg +0 -0
  86. package/packs/fighting-announcer/manifest.json +40 -40
  87. package/packs/fighting-announcer/sounds/begin.ogg +0 -0
  88. package/packs/fighting-announcer/sounds/complete.ogg +0 -0
  89. package/packs/fighting-announcer/sounds/congratulations.ogg +0 -0
  90. package/packs/fighting-announcer/sounds/defeat.ogg +0 -0
  91. package/packs/fighting-announcer/sounds/failure.ogg +0 -0
  92. package/packs/fighting-announcer/sounds/fight.ogg +0 -0
  93. package/packs/fighting-announcer/sounds/final-round.ogg +0 -0
  94. package/packs/fighting-announcer/sounds/finish.ogg +0 -0
  95. package/packs/fighting-announcer/sounds/game-over.ogg +0 -0
  96. package/packs/fighting-announcer/sounds/get-set.ogg +0 -0
  97. package/packs/fighting-announcer/sounds/go.ogg +0 -0
  98. package/packs/fighting-announcer/sounds/great.ogg +0 -0
  99. package/packs/fighting-announcer/sounds/high-score.ogg +0 -0
  100. package/packs/fighting-announcer/sounds/new-record.ogg +0 -0
  101. package/packs/fighting-announcer/sounds/no-contest.ogg +0 -0
  102. package/packs/fighting-announcer/sounds/ready.ogg +0 -0
  103. package/packs/fighting-announcer/sounds/sudden-death.ogg +0 -0
  104. package/packs/fighting-announcer/sounds/victory.ogg +0 -0
  105. package/packs/fighting-announcer/sounds/you-lose.ogg +0 -0
  106. package/packs/fighting-announcer/sounds/you-win.ogg +0 -0
  107. package/packs/freedoom-arsenal/manifest.json +36 -36
  108. package/packs/freedoom-arsenal/sounds/dsbarexp.ogg +0 -0
  109. package/packs/freedoom-arsenal/sounds/dsbfg.ogg +0 -0
  110. package/packs/freedoom-arsenal/sounds/dsdoropn.ogg +0 -0
  111. package/packs/freedoom-arsenal/sounds/dsdshtgn.ogg +0 -0
  112. package/packs/freedoom-arsenal/sounds/dsgetpow.ogg +0 -0
  113. package/packs/freedoom-arsenal/sounds/dsitemup.ogg +0 -0
  114. package/packs/freedoom-arsenal/sounds/dsoof.ogg +0 -0
  115. package/packs/freedoom-arsenal/sounds/dspistol.ogg +0 -0
  116. package/packs/freedoom-arsenal/sounds/dsplasma.ogg +0 -0
  117. package/packs/freedoom-arsenal/sounds/dspldeth.ogg +0 -0
  118. package/packs/freedoom-arsenal/sounds/dspunch.ogg +0 -0
  119. package/packs/freedoom-arsenal/sounds/dsrlaunc.ogg +0 -0
  120. package/packs/freedoom-arsenal/sounds/dsrxplod.ogg +0 -0
  121. package/packs/freedoom-arsenal/sounds/dssawup.ogg +0 -0
  122. package/packs/freedoom-arsenal/sounds/dssgcock.ogg +0 -0
  123. package/packs/freedoom-arsenal/sounds/dsshotgn.ogg +0 -0
  124. package/packs/freedoom-arsenal/sounds/dsswtchn.ogg +0 -0
  125. package/packs/freedoom-arsenal/sounds/dstelept.ogg +0 -0
  126. package/packs/freedoom-arsenal/sounds/dswpnup.ogg +0 -0
  127. package/packs/kenney-interface/manifest.json +36 -36
  128. package/packs/kenney-interface/sounds/back-1.ogg +0 -0
  129. package/packs/kenney-interface/sounds/bong.ogg +0 -0
  130. package/packs/kenney-interface/sounds/click-1.ogg +0 -0
  131. package/packs/kenney-interface/sounds/close-1.ogg +0 -0
  132. package/packs/kenney-interface/sounds/confirmation-1.ogg +0 -0
  133. package/packs/kenney-interface/sounds/confirmation-2.ogg +0 -0
  134. package/packs/kenney-interface/sounds/confirmation-3.ogg +0 -0
  135. package/packs/kenney-interface/sounds/error-1.ogg +0 -0
  136. package/packs/kenney-interface/sounds/error-2.ogg +0 -0
  137. package/packs/kenney-interface/sounds/error-3.ogg +0 -0
  138. package/packs/kenney-interface/sounds/glitch-1.ogg +0 -0
  139. package/packs/kenney-interface/sounds/maximize-1.ogg +0 -0
  140. package/packs/kenney-interface/sounds/maximize-2.ogg +0 -0
  141. package/packs/kenney-interface/sounds/open-1.ogg +0 -0
  142. package/packs/kenney-interface/sounds/pluck-1.ogg +0 -0
  143. package/packs/kenney-interface/sounds/question-1.ogg +0 -0
  144. package/packs/kenney-interface/sounds/question-2.ogg +0 -0
  145. package/packs/kenney-interface/sounds/question-3.ogg +0 -0
  146. package/packs/kenney-scifi/manifest.json +36 -36
  147. package/packs/kenney-scifi/sounds/computer-1.ogg +0 -0
  148. package/packs/kenney-scifi/sounds/computer-2.ogg +0 -0
  149. package/packs/kenney-scifi/sounds/computer-3.ogg +0 -0
  150. package/packs/kenney-scifi/sounds/door-close.ogg +0 -0
  151. package/packs/kenney-scifi/sounds/door-open.ogg +0 -0
  152. package/packs/kenney-scifi/sounds/engine-1.ogg +0 -0
  153. package/packs/kenney-scifi/sounds/explosion-1.ogg +0 -0
  154. package/packs/kenney-scifi/sounds/explosion-2.ogg +0 -0
  155. package/packs/kenney-scifi/sounds/forcefield-1.ogg +0 -0
  156. package/packs/kenney-scifi/sounds/forcefield-2.ogg +0 -0
  157. package/packs/kenney-scifi/sounds/impact-1.ogg +0 -0
  158. package/packs/kenney-scifi/sounds/impact-2.ogg +0 -0
  159. package/packs/kenney-scifi/sounds/laser-large.ogg +0 -0
  160. package/packs/kenney-scifi/sounds/laser-retro.ogg +0 -0
  161. package/packs/kenney-scifi/sounds/low-explosion.ogg +0 -0
  162. package/packs/kenney-scifi/sounds/slime.ogg +0 -0
  163. package/packs/kenney-scifi/sounds/thruster-1.ogg +0 -0
  164. package/packs/kenney-scifi/sounds/thruster-2.ogg +0 -0
  165. package/packs/openarena-announcer/manifest.json +33 -33
  166. package/packs/openarena-announcer/sounds/accuracy.ogg +0 -0
  167. package/packs/openarena-announcer/sounds/assist.ogg +0 -0
  168. package/packs/openarena-announcer/sounds/defense.ogg +0 -0
  169. package/packs/openarena-announcer/sounds/denied.ogg +0 -0
  170. package/packs/openarena-announcer/sounds/excellent.ogg +0 -0
  171. package/packs/openarena-announcer/sounds/fight.ogg +0 -0
  172. package/packs/openarena-announcer/sounds/gauntlet.ogg +0 -0
  173. package/packs/openarena-announcer/sounds/humiliation.ogg +0 -0
  174. package/packs/openarena-announcer/sounds/impressive.ogg +0 -0
  175. package/packs/openarena-announcer/sounds/one.ogg +0 -0
  176. package/packs/openarena-announcer/sounds/perfect.ogg +0 -0
  177. package/packs/openarena-announcer/sounds/prepare.ogg +0 -0
  178. package/packs/openarena-announcer/sounds/sudden_death.ogg +0 -0
  179. package/packs/openarena-announcer/sounds/takenlead.ogg +0 -0
  180. package/packs/openarena-announcer/sounds/three.ogg +0 -0
  181. package/packs/openarena-announcer/sounds/two.ogg +0 -0
  182. package/packs/openarena-announcer/sounds/voc_holyshit.ogg +0 -0
  183. package/packs/openarena-announcer/sounds/youwin.ogg +0 -0
  184. package/packs/retro-8bit/manifest.json +36 -36
  185. package/packs/retro-8bit/sounds/button-1.ogg +0 -0
  186. package/packs/retro-8bit/sounds/button-2.ogg +0 -0
  187. package/packs/retro-8bit/sounds/button-3.ogg +0 -0
  188. package/packs/retro-8bit/sounds/coin-1.ogg +0 -0
  189. package/packs/retro-8bit/sounds/coin-2.ogg +0 -0
  190. package/packs/retro-8bit/sounds/coin-cluster.ogg +0 -0
  191. package/packs/retro-8bit/sounds/coin-double.ogg +0 -0
  192. package/packs/retro-8bit/sounds/damage-1.ogg +0 -0
  193. package/packs/retro-8bit/sounds/error-1.ogg +0 -0
  194. package/packs/retro-8bit/sounds/error-2.ogg +0 -0
  195. package/packs/retro-8bit/sounds/error-3.ogg +0 -0
  196. package/packs/retro-8bit/sounds/fanfare-1.ogg +0 -0
  197. package/packs/retro-8bit/sounds/fanfare-2.ogg +0 -0
  198. package/packs/retro-8bit/sounds/fanfare-3.ogg +0 -0
  199. package/packs/retro-8bit/sounds/negative-1.ogg +0 -0
  200. package/packs/retro-8bit/sounds/negative-2.ogg +0 -0
  201. package/packs/retro-8bit/sounds/powerup-1.ogg +0 -0
  202. package/packs/retro-8bit/sounds/powerup-2.ogg +0 -0
  203. package/packs/warzone2100-command/manifest.json +42 -42
  204. package/packs/warzone2100-command/sounds/construction-completed.ogg +0 -0
  205. package/packs/warzone2100-command/sounds/design-completed.ogg +0 -0
  206. package/packs/warzone2100-command/sounds/enemy-detected.ogg +0 -0
  207. package/packs/warzone2100-command/sounds/incoming-enemy-transport.ogg +0 -0
  208. package/packs/warzone2100-command/sounds/incoming-transmission.ogg +0 -0
  209. package/packs/warzone2100-command/sounds/major-research-completed.ogg +0 -0
  210. package/packs/warzone2100-command/sounds/mission-failed.ogg +0 -0
  211. package/packs/warzone2100-command/sounds/mission-objective.ogg +0 -0
  212. package/packs/warzone2100-command/sounds/mission-successful.ogg +0 -0
  213. package/packs/warzone2100-command/sounds/mission-update.ogg +0 -0
  214. package/packs/warzone2100-command/sounds/new-research-available.ogg +0 -0
  215. package/packs/warzone2100-command/sounds/nexus-laugh1.ogg +0 -0
  216. package/packs/warzone2100-command/sounds/nexus-laugh2.ogg +0 -0
  217. package/packs/warzone2100-command/sounds/power-low.ogg +0 -0
  218. package/packs/warzone2100-command/sounds/production-cancelled.ogg +0 -0
  219. package/packs/warzone2100-command/sounds/production-completed.ogg +0 -0
  220. package/packs/warzone2100-command/sounds/reinforcements-available.ogg +0 -0
  221. package/packs/warzone2100-command/sounds/research-completed.ogg +0 -0
  222. package/packs/warzone2100-command/sounds/retreat-heavy-damage.ogg +0 -0
  223. package/packs/warzone2100-command/sounds/structure-under-attack.ogg +0 -0
  224. package/packs/warzone2100-command/sounds/unit-repaired.ogg +0 -0
  225. package/packs/wesnoth-combat/manifest.json +37 -37
  226. package/packs/wesnoth-combat/sounds/axe.ogg +0 -0
  227. package/packs/wesnoth-combat/sounds/bow.ogg +0 -0
  228. package/packs/wesnoth-combat/sounds/crossbow.ogg +0 -0
  229. package/packs/wesnoth-combat/sounds/dwarf-laugh.ogg +0 -0
  230. package/packs/wesnoth-combat/sounds/explosion.ogg +0 -0
  231. package/packs/wesnoth-combat/sounds/fanfare-short.ogg +0 -0
  232. package/packs/wesnoth-combat/sounds/flame-big.ogg +0 -0
  233. package/packs/wesnoth-combat/sounds/gold.ogg +0 -0
  234. package/packs/wesnoth-combat/sounds/gryphon-shriek-1.ogg +0 -0
  235. package/packs/wesnoth-combat/sounds/hatchet.ogg +0 -0
  236. package/packs/wesnoth-combat/sounds/heal.ogg +0 -0
  237. package/packs/wesnoth-combat/sounds/lightning.ogg +0 -0
  238. package/packs/wesnoth-combat/sounds/magic-dark.ogg +0 -0
  239. package/packs/wesnoth-combat/sounds/magic-holy-1.ogg +0 -0
  240. package/packs/wesnoth-combat/sounds/magic-missile-1.ogg +0 -0
  241. package/packs/wesnoth-combat/sounds/open-chest.ogg +0 -0
  242. package/packs/wesnoth-combat/sounds/potion.ogg +0 -0
  243. package/packs/wesnoth-combat/sounds/sword-1.ogg +0 -0
  244. package/packs/wesnoth-combat/sounds/wolf-growl-1.ogg +0 -0
  245. package/packs/xonotic-announcer/manifest.json +30 -30
  246. package/packs/xonotic-announcer/sounds/1fragleft.ogg +0 -0
  247. package/packs/xonotic-announcer/sounds/airshot.ogg +0 -0
  248. package/packs/xonotic-announcer/sounds/amazing.ogg +0 -0
  249. package/packs/xonotic-announcer/sounds/awesome.ogg +0 -0
  250. package/packs/xonotic-announcer/sounds/begin.ogg +0 -0
  251. package/packs/xonotic-announcer/sounds/botlike.ogg +0 -0
  252. package/packs/xonotic-announcer/sounds/electrobitch.ogg +0 -0
  253. package/packs/xonotic-announcer/sounds/headshot.ogg +0 -0
  254. package/packs/xonotic-announcer/sounds/impressive.ogg +0 -0
  255. package/packs/xonotic-announcer/sounds/lastsecond.ogg +0 -0
  256. package/packs/xonotic-announcer/sounds/leadgained.ogg +0 -0
  257. package/packs/xonotic-announcer/sounds/narrowly.ogg +0 -0
  258. package/packs/xonotic-announcer/sounds/prepareforbattle.ogg +0 -0
  259. package/packs/xonotic-announcer/sounds/terminated.ogg +0 -0
  260. package/packs/xonotic-announcer/sounds/yoda.ogg +0 -0
  261. package/src/cli/config.js +6 -6
  262. package/src/cli/first-run.js +59 -0
  263. package/src/cli/play.js +10 -1
  264. package/src/cli/update.js +43 -0
  265. package/src/config.js +5 -0
  266. package/src/notify.js +19 -0
  267. package/packs/0ad-civilizations/sounds/alarm-alert.wav +0 -0
  268. package/packs/0ad-civilizations/sounds/alarm-attack.wav +0 -0
  269. package/packs/0ad-civilizations/sounds/alarm-defeat.wav +0 -0
  270. package/packs/0ad-civilizations/sounds/alarm-no-resource.wav +0 -0
  271. package/packs/0ad-civilizations/sounds/alarm-objective.wav +0 -0
  272. package/packs/0ad-civilizations/sounds/alarm-research-complete.wav +0 -0
  273. package/packs/0ad-civilizations/sounds/alarm-victory.wav +0 -0
  274. package/packs/0ad-civilizations/sounds/greek-as-you-wish.wav +0 -0
  275. package/packs/0ad-civilizations/sounds/greek-attack-1.wav +0 -0
  276. package/packs/0ad-civilizations/sounds/greek-build-1.wav +0 -0
  277. package/packs/0ad-civilizations/sounds/greek-heal-1.wav +0 -0
  278. package/packs/0ad-civilizations/sounds/greek-march-1.wav +0 -0
  279. package/packs/0ad-civilizations/sounds/greek-my-lord-1.wav +0 -0
  280. package/packs/0ad-civilizations/sounds/greek-my-lord-2.wav +0 -0
  281. package/packs/0ad-civilizations/sounds/greek-retreat-1.wav +0 -0
  282. package/packs/0ad-civilizations/sounds/greek-what-is-it-1.wav +0 -0
  283. package/packs/0ad-civilizations/sounds/greek-yes.wav +0 -0
  284. package/packs/0ad-civilizations/sounds/latin-attack-1.wav +0 -0
  285. package/packs/0ad-civilizations/sounds/latin-build-1.wav +0 -0
  286. package/packs/0ad-civilizations/sounds/latin-fight-1.wav +0 -0
  287. package/packs/0ad-civilizations/sounds/latin-heal-1.wav +0 -0
  288. package/packs/0ad-civilizations/sounds/latin-hello-1.wav +0 -0
  289. package/packs/0ad-civilizations/sounds/latin-my-lord-1.wav +0 -0
  290. package/packs/0ad-civilizations/sounds/latin-what-is-it.wav +0 -0
  291. package/packs/0ad-civilizations/sounds/persian-attack-1.wav +0 -0
  292. package/packs/0ad-civilizations/sounds/persian-by-your-order.wav +0 -0
  293. package/packs/0ad-civilizations/sounds/persian-forward-1.wav +0 -0
  294. package/packs/0ad-civilizations/sounds/persian-i-will-go.wav +0 -0
  295. package/packs/7kaa-soldiers/sounds/00001-CH_A2.wav +0 -0
  296. package/packs/7kaa-soldiers/sounds/00006-NO_V2.wav +0 -0
  297. package/packs/7kaa-soldiers/sounds/00007-NO_V3.wav +0 -0
  298. package/packs/7kaa-soldiers/sounds/00008-MA_V1.wav +0 -0
  299. package/packs/7kaa-soldiers/sounds/00009-GR_V2.wav +0 -0
  300. package/packs/7kaa-soldiers/sounds/00010-GR_V3.wav +0 -0
  301. package/packs/7kaa-soldiers/sounds/00011-VI_V1.wav +0 -0
  302. package/packs/7kaa-soldiers/sounds/00012-NO_A1.wav +0 -0
  303. package/packs/7kaa-soldiers/sounds/00012-VI_V2.wav +0 -0
  304. package/packs/7kaa-soldiers/sounds/00013-GR_V1.wav +0 -0
  305. package/packs/7kaa-soldiers/sounds/00013-NO_A2.wav +0 -0
  306. package/packs/7kaa-soldiers/sounds/00014-MA_A1.wav +0 -0
  307. package/packs/7kaa-soldiers/sounds/00014-PE_V1.wav +0 -0
  308. package/packs/7kaa-soldiers/sounds/00015-GR_A1.wav +0 -0
  309. package/packs/7kaa-soldiers/sounds/00015-MA_V2.wav +0 -0
  310. package/packs/7kaa-soldiers/sounds/00016-MA_V3.wav +0 -0
  311. package/packs/7kaa-soldiers/sounds/00016-VI_A1.wav +0 -0
  312. package/packs/7kaa-soldiers/sounds/00017-MA_V4.wav +0 -0
  313. package/packs/7kaa-soldiers/sounds/00017-VI_A2.wav +0 -0
  314. package/packs/7kaa-soldiers/sounds/00018-PE_A2.wav +0 -0
  315. package/packs/7kaa-soldiers/sounds/00018-PE_V2.wav +0 -0
  316. package/packs/7kaa-soldiers/sounds/00019-PE_V3.wav +0 -0
  317. package/packs/7kaa-soldiers/sounds/00020-PE_A1.wav +0 -0
  318. package/packs/7kaa-soldiers/sounds/00020-PE_V4.wav +0 -0
  319. package/packs/7kaa-soldiers/sounds/00021-CH_A1.wav +0 -0
  320. package/packs/7kaa-soldiers/sounds/00021-CH_V1.wav +0 -0
  321. package/packs/7kaa-soldiers/sounds/00022-CH_V2.wav +0 -0
  322. package/packs/7kaa-soldiers/sounds/00022-JA_A1.wav +0 -0
  323. package/packs/7kaa-soldiers/sounds/00023-CH_V3.wav +0 -0
  324. package/packs/7kaa-soldiers/sounds/00023-JA_A2.wav +0 -0
  325. package/packs/7kaa-soldiers/sounds/00024-CH_V4.wav +0 -0
  326. package/packs/7kaa-soldiers/sounds/00025-CH_V5.wav +0 -0
  327. package/packs/7kaa-soldiers/sounds/00026-JA_V1.wav +0 -0
  328. package/packs/7kaa-soldiers/sounds/00027-JA_V2.wav +0 -0
  329. package/packs/7kaa-soldiers/sounds/00028-JA_V3.wav +0 -0
  330. package/packs/7kaa-soldiers/sounds/00029-JA_V4.wav +0 -0
  331. package/packs/7kaa-soldiers/sounds/00030-JA_V5.wav +0 -0
  332. package/packs/7kaa-soldiers/sounds/00035-MA_V5.wav +0 -0
  333. package/packs/7kaa-soldiers/sounds/00083-READY.wav +0 -0
  334. package/packs/7kaa-soldiers/sounds/00084-NO_V1.wav +0 -0
  335. package/packs/7kaa-soldiers/sounds/00085-EG_V1.wav +0 -0
  336. package/packs/7kaa-soldiers/sounds/00086-EG_V2.wav +0 -0
  337. package/packs/7kaa-soldiers/sounds/00087-EG_V3.wav +0 -0
  338. package/packs/7kaa-soldiers/sounds/00088-EG_V4.wav +0 -0
  339. package/packs/7kaa-soldiers/sounds/00089-IN_V1.wav +0 -0
  340. package/packs/7kaa-soldiers/sounds/00090-IN_V2.wav +0 -0
  341. package/packs/7kaa-soldiers/sounds/00091-IN_V3.wav +0 -0
  342. package/packs/7kaa-soldiers/sounds/00092-IN_V4.wav +0 -0
  343. package/packs/7kaa-soldiers/sounds/00093-ZU_V2.wav +0 -0
  344. package/packs/7kaa-soldiers/sounds/00094-ZU_V3.wav +0 -0
  345. package/packs/7kaa-soldiers/sounds/00095-ZU_V5.wav +0 -0
  346. package/packs/7kaa-soldiers/sounds/00096-ZU_V7.wav +0 -0
  347. package/packs/7kaa-soldiers/sounds/00097-ZU_V8.wav +0 -0
  348. package/packs/fighting-announcer/sounds/begin.wav +0 -0
  349. package/packs/fighting-announcer/sounds/complete.wav +0 -0
  350. package/packs/fighting-announcer/sounds/congratulations.wav +0 -0
  351. package/packs/fighting-announcer/sounds/defeat.wav +0 -0
  352. package/packs/fighting-announcer/sounds/failure.wav +0 -0
  353. package/packs/fighting-announcer/sounds/fight.wav +0 -0
  354. package/packs/fighting-announcer/sounds/final-round.wav +0 -0
  355. package/packs/fighting-announcer/sounds/finish.wav +0 -0
  356. package/packs/fighting-announcer/sounds/game-over.wav +0 -0
  357. package/packs/fighting-announcer/sounds/get-set.wav +0 -0
  358. package/packs/fighting-announcer/sounds/go.wav +0 -0
  359. package/packs/fighting-announcer/sounds/great.wav +0 -0
  360. package/packs/fighting-announcer/sounds/high-score.wav +0 -0
  361. package/packs/fighting-announcer/sounds/new-record.wav +0 -0
  362. package/packs/fighting-announcer/sounds/no-contest.wav +0 -0
  363. package/packs/fighting-announcer/sounds/ready.wav +0 -0
  364. package/packs/fighting-announcer/sounds/sudden-death.wav +0 -0
  365. package/packs/fighting-announcer/sounds/victory.wav +0 -0
  366. package/packs/fighting-announcer/sounds/you-lose.wav +0 -0
  367. package/packs/fighting-announcer/sounds/you-win.wav +0 -0
  368. package/packs/freedoom-arsenal/sounds/dsbarexp.wav +0 -0
  369. package/packs/freedoom-arsenal/sounds/dsbfg.wav +0 -0
  370. package/packs/freedoom-arsenal/sounds/dsdoropn.wav +0 -0
  371. package/packs/freedoom-arsenal/sounds/dsdshtgn.wav +0 -0
  372. package/packs/freedoom-arsenal/sounds/dsgetpow.wav +0 -0
  373. package/packs/freedoom-arsenal/sounds/dsitemup.wav +0 -0
  374. package/packs/freedoom-arsenal/sounds/dsoof.wav +0 -0
  375. package/packs/freedoom-arsenal/sounds/dspistol.wav +0 -0
  376. package/packs/freedoom-arsenal/sounds/dsplasma.wav +0 -0
  377. package/packs/freedoom-arsenal/sounds/dspldeth.wav +0 -0
  378. package/packs/freedoom-arsenal/sounds/dspunch.wav +0 -0
  379. package/packs/freedoom-arsenal/sounds/dsrlaunc.wav +0 -0
  380. package/packs/freedoom-arsenal/sounds/dsrxplod.wav +0 -0
  381. package/packs/freedoom-arsenal/sounds/dssawup.wav +0 -0
  382. package/packs/freedoom-arsenal/sounds/dssgcock.wav +0 -0
  383. package/packs/freedoom-arsenal/sounds/dsshotgn.wav +0 -0
  384. package/packs/freedoom-arsenal/sounds/dsswtchn.wav +0 -0
  385. package/packs/freedoom-arsenal/sounds/dstelept.wav +0 -0
  386. package/packs/freedoom-arsenal/sounds/dswpnup.wav +0 -0
  387. package/packs/kenney-interface/sounds/back-1.wav +0 -0
  388. package/packs/kenney-interface/sounds/bong.wav +0 -0
  389. package/packs/kenney-interface/sounds/click-1.wav +0 -0
  390. package/packs/kenney-interface/sounds/close-1.wav +0 -0
  391. package/packs/kenney-interface/sounds/confirmation-1.wav +0 -0
  392. package/packs/kenney-interface/sounds/confirmation-2.wav +0 -0
  393. package/packs/kenney-interface/sounds/confirmation-3.wav +0 -0
  394. package/packs/kenney-interface/sounds/error-1.wav +0 -0
  395. package/packs/kenney-interface/sounds/error-2.wav +0 -0
  396. package/packs/kenney-interface/sounds/error-3.wav +0 -0
  397. package/packs/kenney-interface/sounds/glitch-1.wav +0 -0
  398. package/packs/kenney-interface/sounds/maximize-1.wav +0 -0
  399. package/packs/kenney-interface/sounds/maximize-2.wav +0 -0
  400. package/packs/kenney-interface/sounds/open-1.wav +0 -0
  401. package/packs/kenney-interface/sounds/pluck-1.wav +0 -0
  402. package/packs/kenney-interface/sounds/question-1.wav +0 -0
  403. package/packs/kenney-interface/sounds/question-2.wav +0 -0
  404. package/packs/kenney-interface/sounds/question-3.wav +0 -0
  405. package/packs/kenney-scifi/sounds/computer-1.wav +0 -0
  406. package/packs/kenney-scifi/sounds/computer-2.wav +0 -0
  407. package/packs/kenney-scifi/sounds/computer-3.wav +0 -0
  408. package/packs/kenney-scifi/sounds/door-close.wav +0 -0
  409. package/packs/kenney-scifi/sounds/door-open.wav +0 -0
  410. package/packs/kenney-scifi/sounds/engine-1.wav +0 -0
  411. package/packs/kenney-scifi/sounds/explosion-1.wav +0 -0
  412. package/packs/kenney-scifi/sounds/explosion-2.wav +0 -0
  413. package/packs/kenney-scifi/sounds/forcefield-1.wav +0 -0
  414. package/packs/kenney-scifi/sounds/forcefield-2.wav +0 -0
  415. package/packs/kenney-scifi/sounds/impact-1.wav +0 -0
  416. package/packs/kenney-scifi/sounds/impact-2.wav +0 -0
  417. package/packs/kenney-scifi/sounds/laser-large.wav +0 -0
  418. package/packs/kenney-scifi/sounds/laser-retro.wav +0 -0
  419. package/packs/kenney-scifi/sounds/low-explosion.wav +0 -0
  420. package/packs/kenney-scifi/sounds/slime.wav +0 -0
  421. package/packs/kenney-scifi/sounds/thruster-1.wav +0 -0
  422. package/packs/kenney-scifi/sounds/thruster-2.wav +0 -0
  423. package/packs/openarena-announcer/sounds/accuracy.wav +0 -0
  424. package/packs/openarena-announcer/sounds/assist.wav +0 -0
  425. package/packs/openarena-announcer/sounds/defense.wav +0 -0
  426. package/packs/openarena-announcer/sounds/denied.wav +0 -0
  427. package/packs/openarena-announcer/sounds/excellent.wav +0 -0
  428. package/packs/openarena-announcer/sounds/fight.wav +0 -0
  429. package/packs/openarena-announcer/sounds/gauntlet.wav +0 -0
  430. package/packs/openarena-announcer/sounds/humiliation.wav +0 -0
  431. package/packs/openarena-announcer/sounds/impressive.wav +0 -0
  432. package/packs/openarena-announcer/sounds/one.wav +0 -0
  433. package/packs/openarena-announcer/sounds/perfect.wav +0 -0
  434. package/packs/openarena-announcer/sounds/prepare.wav +0 -0
  435. package/packs/openarena-announcer/sounds/sudden_death.wav +0 -0
  436. package/packs/openarena-announcer/sounds/takenlead.wav +0 -0
  437. package/packs/openarena-announcer/sounds/three.wav +0 -0
  438. package/packs/openarena-announcer/sounds/two.wav +0 -0
  439. package/packs/openarena-announcer/sounds/voc_holyshit.wav +0 -0
  440. package/packs/openarena-announcer/sounds/youwin.wav +0 -0
  441. package/packs/retro-8bit/sounds/button-1.wav +0 -0
  442. package/packs/retro-8bit/sounds/button-2.wav +0 -0
  443. package/packs/retro-8bit/sounds/button-3.wav +0 -0
  444. package/packs/retro-8bit/sounds/coin-1.wav +0 -0
  445. package/packs/retro-8bit/sounds/coin-2.wav +0 -0
  446. package/packs/retro-8bit/sounds/coin-cluster.wav +0 -0
  447. package/packs/retro-8bit/sounds/coin-double.wav +0 -0
  448. package/packs/retro-8bit/sounds/damage-1.wav +0 -0
  449. package/packs/retro-8bit/sounds/error-1.wav +0 -0
  450. package/packs/retro-8bit/sounds/error-2.wav +0 -0
  451. package/packs/retro-8bit/sounds/error-3.wav +0 -0
  452. package/packs/retro-8bit/sounds/fanfare-1.wav +0 -0
  453. package/packs/retro-8bit/sounds/fanfare-2.wav +0 -0
  454. package/packs/retro-8bit/sounds/fanfare-3.wav +0 -0
  455. package/packs/retro-8bit/sounds/negative-1.wav +0 -0
  456. package/packs/retro-8bit/sounds/negative-2.wav +0 -0
  457. package/packs/retro-8bit/sounds/powerup-1.wav +0 -0
  458. package/packs/retro-8bit/sounds/powerup-2.wav +0 -0
  459. package/packs/warzone2100-command/sounds/construction-completed.wav +0 -0
  460. package/packs/warzone2100-command/sounds/design-completed.wav +0 -0
  461. package/packs/warzone2100-command/sounds/enemy-detected.wav +0 -0
  462. package/packs/warzone2100-command/sounds/incoming-enemy-transport.wav +0 -0
  463. package/packs/warzone2100-command/sounds/incoming-transmission.wav +0 -0
  464. package/packs/warzone2100-command/sounds/major-research-completed.wav +0 -0
  465. package/packs/warzone2100-command/sounds/mission-failed.wav +0 -0
  466. package/packs/warzone2100-command/sounds/mission-objective.wav +0 -0
  467. package/packs/warzone2100-command/sounds/mission-successful.wav +0 -0
  468. package/packs/warzone2100-command/sounds/mission-update.wav +0 -0
  469. package/packs/warzone2100-command/sounds/new-research-available.wav +0 -0
  470. package/packs/warzone2100-command/sounds/nexus-laugh1.wav +0 -0
  471. package/packs/warzone2100-command/sounds/nexus-laugh2.wav +0 -0
  472. package/packs/warzone2100-command/sounds/power-low.wav +0 -0
  473. package/packs/warzone2100-command/sounds/production-cancelled.wav +0 -0
  474. package/packs/warzone2100-command/sounds/production-completed.wav +0 -0
  475. package/packs/warzone2100-command/sounds/reinforcements-available.wav +0 -0
  476. package/packs/warzone2100-command/sounds/research-completed.wav +0 -0
  477. package/packs/warzone2100-command/sounds/retreat-heavy-damage.wav +0 -0
  478. package/packs/warzone2100-command/sounds/structure-under-attack.wav +0 -0
  479. package/packs/warzone2100-command/sounds/unit-repaired.wav +0 -0
  480. package/packs/wesnoth-combat/sounds/axe.wav +0 -0
  481. package/packs/wesnoth-combat/sounds/bow.wav +0 -0
  482. package/packs/wesnoth-combat/sounds/crossbow.wav +0 -0
  483. package/packs/wesnoth-combat/sounds/dwarf-laugh.wav +0 -0
  484. package/packs/wesnoth-combat/sounds/explosion.wav +0 -0
  485. package/packs/wesnoth-combat/sounds/fanfare-short.wav +0 -0
  486. package/packs/wesnoth-combat/sounds/flame-big.wav +0 -0
  487. package/packs/wesnoth-combat/sounds/gold.wav +0 -0
  488. package/packs/wesnoth-combat/sounds/gryphon-shriek-1.wav +0 -0
  489. package/packs/wesnoth-combat/sounds/hatchet.wav +0 -0
  490. package/packs/wesnoth-combat/sounds/heal.wav +0 -0
  491. package/packs/wesnoth-combat/sounds/lightning.wav +0 -0
  492. package/packs/wesnoth-combat/sounds/magic-dark.wav +0 -0
  493. package/packs/wesnoth-combat/sounds/magic-holy-1.wav +0 -0
  494. package/packs/wesnoth-combat/sounds/magic-missile-1.wav +0 -0
  495. package/packs/wesnoth-combat/sounds/open-chest.wav +0 -0
  496. package/packs/wesnoth-combat/sounds/potion.wav +0 -0
  497. package/packs/wesnoth-combat/sounds/sword-1.wav +0 -0
  498. package/packs/wesnoth-combat/sounds/wolf-growl-1.wav +0 -0
  499. package/packs/xonotic-announcer/sounds/1fragleft.wav +0 -0
  500. package/packs/xonotic-announcer/sounds/airshot.wav +0 -0
  501. package/packs/xonotic-announcer/sounds/amazing.wav +0 -0
  502. package/packs/xonotic-announcer/sounds/awesome.wav +0 -0
  503. package/packs/xonotic-announcer/sounds/begin.wav +0 -0
  504. package/packs/xonotic-announcer/sounds/botlike.wav +0 -0
  505. package/packs/xonotic-announcer/sounds/electrobitch.wav +0 -0
  506. package/packs/xonotic-announcer/sounds/headshot.wav +0 -0
  507. package/packs/xonotic-announcer/sounds/impressive.wav +0 -0
  508. package/packs/xonotic-announcer/sounds/lastsecond.wav +0 -0
  509. package/packs/xonotic-announcer/sounds/leadgained.wav +0 -0
  510. package/packs/xonotic-announcer/sounds/narrowly.wav +0 -0
  511. package/packs/xonotic-announcer/sounds/prepareforbattle.wav +0 -0
  512. package/packs/xonotic-announcer/sounds/terminated.wav +0 -0
  513. package/packs/xonotic-announcer/sounds/yoda.wav +0 -0
@@ -6,47 +6,47 @@
6
6
  "credits": "Xonotic Project (https://github.com/xonotic/xonotic-data.pk3dir)",
7
7
  "category": "arena",
8
8
  "sounds": [
9
- "sounds/1fragleft.wav",
10
- "sounds/airshot.wav",
11
- "sounds/amazing.wav",
12
- "sounds/awesome.wav",
13
- "sounds/begin.wav",
14
- "sounds/botlike.wav",
15
- "sounds/electrobitch.wav",
16
- "sounds/headshot.wav",
17
- "sounds/impressive.wav",
18
- "sounds/lastsecond.wav",
19
- "sounds/leadgained.wav",
20
- "sounds/narrowly.wav",
21
- "sounds/prepareforbattle.wav",
22
- "sounds/terminated.wav",
23
- "sounds/yoda.wav"
9
+ "sounds/1fragleft.ogg",
10
+ "sounds/airshot.ogg",
11
+ "sounds/amazing.ogg",
12
+ "sounds/awesome.ogg",
13
+ "sounds/begin.ogg",
14
+ "sounds/botlike.ogg",
15
+ "sounds/electrobitch.ogg",
16
+ "sounds/headshot.ogg",
17
+ "sounds/impressive.ogg",
18
+ "sounds/lastsecond.ogg",
19
+ "sounds/leadgained.ogg",
20
+ "sounds/narrowly.ogg",
21
+ "sounds/prepareforbattle.ogg",
22
+ "sounds/terminated.ogg",
23
+ "sounds/yoda.ogg"
24
24
  ],
25
25
  "events": {
26
26
  "done": [
27
- "sounds/awesome.wav",
28
- "sounds/amazing.wav",
29
- "sounds/impressive.wav",
30
- "sounds/airshot.wav"
27
+ "sounds/awesome.ogg",
28
+ "sounds/amazing.ogg",
29
+ "sounds/impressive.ogg",
30
+ "sounds/airshot.ogg"
31
31
  ],
32
32
  "permission": [
33
- "sounds/prepareforbattle.wav",
34
- "sounds/begin.wav",
35
- "sounds/1fragleft.wav"
33
+ "sounds/prepareforbattle.ogg",
34
+ "sounds/begin.ogg",
35
+ "sounds/1fragleft.ogg"
36
36
  ],
37
37
  "complete": [
38
- "sounds/yoda.wav",
39
- "sounds/botlike.wav",
40
- "sounds/leadgained.wav"
38
+ "sounds/yoda.ogg",
39
+ "sounds/botlike.ogg",
40
+ "sounds/leadgained.ogg"
41
41
  ],
42
42
  "error": [
43
- "sounds/terminated.wav",
44
- "sounds/headshot.wav",
45
- "sounds/electrobitch.wav"
43
+ "sounds/terminated.ogg",
44
+ "sounds/headshot.ogg",
45
+ "sounds/electrobitch.ogg"
46
46
  ],
47
47
  "blocked": [
48
- "sounds/lastsecond.wav",
49
- "sounds/narrowly.wav"
48
+ "sounds/lastsecond.ogg",
49
+ "sounds/narrowly.ogg"
50
50
  ]
51
51
  }
52
52
  }
package/src/cli/config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { readConfig, writeConfig, VALID_MODES, VALID_EVENTS } from '../config.js';
2
2
 
3
- const VALID_KEYS = ['activePack', 'mode', 'specificSound', 'volume', 'eventPacks', 'cooldown', 'quietHours'];
3
+ const VALID_KEYS = ['activePack', 'mode', 'specificSound', 'volume', 'eventPacks', 'cooldown', 'quietHours', 'notifications'];
4
4
 
5
5
  function showHelp() {
6
6
  console.log(`
@@ -112,16 +112,16 @@ export default function config(args) {
112
112
  return;
113
113
  }
114
114
 
115
- // Validate cooldown
116
- if (key === 'cooldown') {
115
+ // Validate boolean keys
116
+ if (key === 'notifications' || key === 'cooldown') {
117
117
  if (value !== 'true' && value !== 'false') {
118
- console.error('Cooldown must be true or false.');
118
+ console.error(`${key} must be true or false.`);
119
119
  process.exit(1);
120
120
  }
121
121
  const cfg = readConfig();
122
- cfg.cooldown = value === 'true';
122
+ cfg[key] = value === 'true';
123
123
  writeConfig(cfg);
124
- console.log(`cooldown set to: ${cfg.cooldown}`);
124
+ console.log(`${key} set to: ${cfg[key]}`);
125
125
  return;
126
126
  }
127
127
 
@@ -0,0 +1,59 @@
1
+ import { createInterface } from 'node:readline';
2
+ import { writeConfig, getDefaults } from '../config.js';
3
+ import { listPacks, getPackSounds, pickRandom } from '../packs.js';
4
+ import { playSound } from '../player.js';
5
+ import { basename } from 'node:path';
6
+
7
+ export async function runFirstTimeSetup() {
8
+ const packs = listPacks();
9
+
10
+ console.log('\n ================================================');
11
+ console.log(' WELCOME TO PINGTHINGS!');
12
+ console.log(' Your terminal is about to get a LOT cooler.');
13
+ console.log(' ================================================\n');
14
+ console.log(' Let\'s pick your first sound pack.\n');
15
+
16
+ for (let i = 0; i < packs.length; i++) {
17
+ console.log(` ${i + 1}. ${packs[i].name} (${packs[i].category})`);
18
+ console.log(` ${packs[i].description}`);
19
+ }
20
+
21
+ console.log('\n Enter a number to preview, then press enter to confirm.\n');
22
+
23
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
24
+
25
+ const chosen = await new Promise((resolve) => {
26
+ const ask = () => {
27
+ rl.question(' Pick a pack (1-' + packs.length + '): ', (answer) => {
28
+ const num = parseInt(answer.trim(), 10);
29
+ if (isNaN(num) || num < 1 || num > packs.length) {
30
+ console.log(` Enter a number between 1 and ${packs.length}.`);
31
+ ask();
32
+ return;
33
+ }
34
+
35
+ const pack = packs[num - 1];
36
+ const sounds = getPackSounds(pack.name);
37
+ if (sounds.length > 0) {
38
+ const sample = pickRandom(sounds);
39
+ console.log(`\n Preview: ${basename(sample)}`);
40
+ playSound(sample);
41
+ }
42
+
43
+ resolve(pack);
44
+ });
45
+ };
46
+ ask();
47
+ });
48
+
49
+ // Save config
50
+ const config = getDefaults();
51
+ config.activePack = chosen.name;
52
+ writeConfig(config);
53
+
54
+ console.log(`\n Active pack set to: ${chosen.name}`);
55
+ console.log('\n Quick tip: Run "pingthings init" to set up Claude Code hooks.');
56
+ console.log(' Or just run "pingthings play" anytime to hear a sound.\n');
57
+
58
+ rl.close();
59
+ }
package/src/cli/play.js CHANGED
@@ -1,15 +1,18 @@
1
1
  import { readConfig, VALID_EVENTS, getLastPlayed, setLastPlayed, isQuietHours } from '../config.js';
2
2
  import { getPackSounds, getEventSounds, pickRandom, resolvePack } from '../packs.js';
3
3
  import { playSound } from '../player.js';
4
+ import { sendNotification } from '../notify.js';
4
5
  import { basename } from 'node:path';
5
6
 
6
7
  function parseArgs(args) {
7
- const result = { sound: null, event: null };
8
+ const result = { sound: null, event: null, notify: false };
8
9
 
9
10
  for (let i = 0; i < args.length; i++) {
10
11
  if ((args[i] === '--event' || args[i] === '-e') && args[i + 1]) {
11
12
  result.event = args[i + 1];
12
13
  i++;
14
+ } else if (args[i] === '--notify' || args[i] === '-n') {
15
+ result.notify = true;
13
16
  } else if (args[i] === '--help' || args[i] === '-h') {
14
17
  showHelp();
15
18
  process.exit(0);
@@ -155,4 +158,10 @@ export default function play(args) {
155
158
 
156
159
  setLastPlayed(soundFile);
157
160
  playSound(soundFile, config.volume);
161
+
162
+ // Desktop notification
163
+ if (parsed.notify || config.notifications) {
164
+ const event = parsed.event || 'notification';
165
+ sendNotification('pingthings', `${event}: ${basename(soundFile)}`);
166
+ }
158
167
  }
@@ -0,0 +1,43 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+
8
+ function showHelp() {
9
+ console.log(`
10
+ Usage: pingthings update
11
+
12
+ Check for new versions of pingthings on npm.
13
+ `);
14
+ }
15
+
16
+ export default function update(args) {
17
+ if (args.includes('--help') || args.includes('-h')) {
18
+ showHelp();
19
+ return;
20
+ }
21
+
22
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', '..', 'package.json'), 'utf8'));
23
+ const current = pkg.version;
24
+
25
+ console.log(`\nCurrent version: ${current}`);
26
+ console.log('Checking npm for updates...\n');
27
+
28
+ try {
29
+ const latest = execFileSync('npm', ['view', 'pingthings', 'version'], {
30
+ encoding: 'utf8',
31
+ timeout: 10000,
32
+ }).trim();
33
+
34
+ if (latest === current) {
35
+ console.log('You are on the latest version.');
36
+ } else {
37
+ console.log(`New version available: ${latest}`);
38
+ console.log(`\nRun: npm install -g pingthings@${latest}`);
39
+ }
40
+ } catch {
41
+ console.error('Could not check for updates. Are you online?');
42
+ }
43
+ }
package/src/config.js CHANGED
@@ -10,6 +10,7 @@ const DEFAULTS = {
10
10
  eventPacks: {},
11
11
  cooldown: true,
12
12
  quietHours: null,
13
+ notifications: false,
13
14
  };
14
15
 
15
16
  export function getConfigDir() {
@@ -23,6 +24,10 @@ export function getConfigPath() {
23
24
  return join(getConfigDir(), 'config.json');
24
25
  }
25
26
 
27
+ export function isFirstRun() {
28
+ return !existsSync(getConfigPath());
29
+ }
30
+
26
31
  export function readConfig() {
27
32
  const configPath = getConfigPath();
28
33
  if (!existsSync(configPath)) {
package/src/notify.js ADDED
@@ -0,0 +1,19 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { platform } from 'node:os';
3
+
4
+ export function sendNotification(title, message) {
5
+ const os = platform();
6
+
7
+ if (os === 'darwin') {
8
+ spawn('osascript', [
9
+ '-e',
10
+ `display notification "${message}" with title "${title}"`,
11
+ ], { detached: true, stdio: 'ignore' }).unref();
12
+ } else if (os === 'linux') {
13
+ spawn('notify-send', [title, message], {
14
+ detached: true,
15
+ stdio: 'ignore',
16
+ }).on('error', () => {}).unref();
17
+ }
18
+ // Windows: no native CLI notification without dependencies, skip for now
19
+ }