IdlePixel Kaat Client

Kaat account interaction panel

  1. // ==UserScript==
  2. // @name IdlePixel Kaat Client
  3. // @namespace lbtechnology.info
  4. // @version 1.1.1
  5. // @description Kaat account interaction panel
  6. // @author Lux-Ferre
  7. // @license MIT
  8. // @match *://idle-pixel.com/login/play*
  9. // @grant none
  10. // @require https://greasyfork.org/scripts/441206-idlepixel/code/IdlePixel+.js?anticache=20220905
  11. // @require https://greasyfork.org/scripts/491983-idlepixel-plugin-paneller/code/IdlePixel%2B%20Plugin%20Paneller.js?anticache=20240410
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. class KaatClientPlugin extends IdlePixelPlusPlugin {
  18. constructor() {
  19. super("kaat-client", {
  20. about: {
  21. name: GM_info.script.name,
  22. version: GM_info.script.version,
  23. author: GM_info.script.author,
  24. description: GM_info.script.description
  25. },
  26. config: [
  27. {
  28. id: "kaatAccount",
  29. label: "Account name to running the v-pet.",
  30. type: "string",
  31. max: 20,
  32. default: "ᓚᘏᗢ"
  33. }
  34. ]
  35. });
  36. this.previous = "";
  37. }
  38.  
  39. onLogin() {
  40. this.createPanel()
  41. this.acquireKaatStats()
  42. this.addStyles()
  43.  
  44. if (!("kaat-host" in IdlePixelPlus.plugins)){
  45. $("#controlTabButton").hide()
  46. }
  47. Paneller.registerPanel("kaat-client", "Kaat Client")
  48. }
  49.  
  50. onCustomMessageReceived(player, content, callbackId) {
  51. const customData = this.parseCustom(player, content, callbackId)
  52. if (!(customData.plugin === "kaatpet" || customData.anwinFormatted)){
  53. return
  54. }
  55. if (customData.player === this.getConfig("kaatAccount")){
  56. if (customData.command === "kaatData"){
  57. this.refreshKaatStats(customData.payload)
  58. }
  59. }
  60. }
  61.  
  62. addStyles(){
  63. let borderColour
  64. if ("ui-tweaks" in IdlePixelPlus.plugins){
  65. borderColour = IdlePixelPlus.plugins["ui-tweaks"].config["font-color-panels"]
  66. } else {
  67. borderColour = "black"
  68. }
  69.  
  70. $("head").append(`
  71. <style id="styles-kaat-client">
  72. :root {
  73. --border-colour: ${borderColour}
  74. }
  75. </style>
  76. `)
  77. }
  78.  
  79. parseCustom(player, content, callbackId){
  80. const customData = {
  81. player: player,
  82. callbackId: callbackId,
  83. anwinFormatted: false
  84. }
  85. const splitPayload = content.split(":")
  86. if(splitPayload.length >= 3){
  87. customData.anwinFormatted = true
  88. customData.plugin = splitPayload[0]
  89. customData.command = splitPayload[1]
  90. customData.payload = splitPayload.slice(2).join(":")
  91. } else {
  92. customData.anwinFormatted = false
  93. customData.plugin = "unknown"
  94. customData.command = "unknown"
  95. customData.payload = content
  96. }
  97. return customData
  98. }
  99. createPanel(){
  100. IdlePixelPlus.addPanel("kaat-client", "Nya~", function() {
  101. const content = `
  102. <div class="container" style="width: 100%;">
  103. <header>
  104. <h1>Kaat Client</h1>
  105. </header>
  106. <div>
  107. <ul class="nav nav-tabs" role="tablist">
  108. <li class="nav-item" role="presentation"><a class="nav-link active" role="tab" data-bs-toggle="tab" href="#tab-1">Status</a></li>
  109. <li id="controlTabButton" class="nav-item" role="presentation"><a class="nav-link" role="tab" data-bs-toggle="tab" href="#tab-2">Control</a></li>
  110. </ul>
  111. <div class="tab-content">
  112. <div id="tab-1" class="tab-pane active" role="tabpanel">
  113. <h2>Kaat Status</h2>
  114. <div class="vstack">
  115. <div style="border: 2px solid var(--border-colour);">
  116. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  117. <h3 style="border: 0px solid var(--border-colour);">Overall Mood</h3>
  118. </div>
  119. <div class="row" style="margin: 0px;">
  120. <div class="col-xl-9 d-flex flex-column justify-content-between align-self-center">
  121. <div class="progress" style="height: 24px;">
  122. <div id="mood" class="progress-bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 50%;">50%</div>
  123. </div>
  124. <div class="row">
  125. <div class="col">
  126. <div class="row">
  127. <div class="col-xl-2"><label class="col-form-label fw-bold">Is alive?</label></div>
  128. <div class="col-xl-1"><label id="isAliveLbl" class="col-form-label fw-bold"></label></div>
  129. <div class="col"><label class="col-form-label"></label></div>
  130. </div>
  131. <div class="row">
  132. <div class="col-xl-2"><label class="col-form-label fw-bold">Is asleep?</label></div>
  133. <div class="col-xl-1"><label id="isAsleepLbl" class="col-form-label fw-bold"></label></div>
  134. <div class="col"><label class="col-form-label"></label></div>
  135. </div>
  136. </div>
  137. </div>
  138. </div>
  139. <div class="col flex-shrink-1" style="text-align: center;"><img class="img-fluid flex-shrink-1" src="https://cdn.discordapp.com/attachments/1170262289803390997/1177053355240075314/DALLE_2023-11-22_12.57.21_-_Create_a_black_and_white_pixelated_image_of_a_cat_sleeping_with_black_coloration_around_its_ears_on_its_head._The_cat_should_be_depicted_in_a_peaceful.png" style="max-width: 10vw;" /></div>
  140. </div>
  141. </div>
  142. <div style="border: 2px solid var(--border-colour);">
  143. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  144. <h3>Individual Stats</h3>
  145. </div>
  146. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  147. <div class="col-xl-1"><label class="col-form-label" for="hunger">Hunger</label></div>
  148. <div class="col align-self-center">
  149. <div class="progress" style="height: 24px;">
  150. <div id="hunger" class="progress-bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 50%;">50%</div>
  151. </div>
  152. </div>
  153. </div>
  154. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  155. <div class="col-xl-1"><label class="col-form-label" for="tiredness">Tiredness</label></div>
  156. <div class="col align-self-center">
  157. <div class="progress" style="height: 24px;">
  158. <div id="tiredness" class="progress-bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 50%;">50%</div>
  159. </div>
  160. </div>
  161. </div>
  162. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  163. <div class="col-xl-1"><label class="col-form-label" for="social">Social</label></div>
  164. <div class="col align-self-center">
  165. <div class="progress" style="height: 24px;">
  166. <div id="social" class="progress-bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 50%;">50%</div>
  167. </div>
  168. </div>
  169. </div>
  170. <div class="row" style="margin: 0px;">
  171. <div class="col-xl-1"><label class="col-form-label" for="energy">Energy</label></div>
  172. <div class="col align-self-center">
  173. <div class="progress" style="height: 24px;">
  174. <div id="energy" class="progress-bar" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100" style="width: 50%;">50%</div>
  175. </div>
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. <div id="tab-2" class="tab-pane" role="tabpanel">
  182. <h2>Kaat Configs</h2>
  183. <div class="vstack">
  184. <div style="border: 2px solid var(--border-colour);">
  185. <div class="row d-flex flex-wrap" style="margin: 0px;border-bottom: 1px dotted var(--border-colour);">
  186. <div class="col-xl-1"><label class="col-form-label"></label></div>
  187. <div class="col-2 col-xl-2 text-center"><button class="btn btn-secondary" type="button" onclick="IdlePixelPlus.plugins[&#39;kaat-client&#39;].populateConfigs()">Load Configs</button></div>
  188. <div class="col-2 col-xl-2 text-center"><label class="col-form-label"></label></div>
  189. <div class="col-2 col-xl-2 text-center"><button class="btn btn-success" type="button" onclick="IdlePixelPlus.plugins[&#39;kaat-host&#39;].revive()">Revive ᓚᘏᗢ</button><label class="form-label"></label></div>
  190. <div class="col-2 col-xl-2 text-center"><label class="col-form-label"></label></div>
  191. <div class="col-4 col-xl-2 text-center" style="text-align: center;"><button class="btn btn-secondary" type="button" onclick="IdlePixelPlus.plugins[&#39;kaat-client&#39;].saveConfigs()">Save Configs</button></div>
  192. <div class="col-xl-1"><label class="col-form-label"></label></div>
  193. </div>
  194. </div>
  195. <div style="border: 2px solid var(--border-colour);">
  196. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  197. <h3 style="border: 0px solid var(--border-colour);">Controls</h3>
  198. </div>
  199. <div class="row d-flex flex-wrap" style="margin: 0px;border-bottom: 1px dotted var(--border-colour);">
  200. <div class="col-2 col-xl-2 text-center justify-content-center align-self-center">
  201. <p>Tick Length (ms)</p>
  202. </div>
  203. <div class="col" style="text-align: center;border-right: 1px dotted var(--border-colour);"><input id="tickLengthInput" type="number" min="1000" max="300000" style="width: 100%;" /></div>
  204. <div class="col-2 col-xl-2 text-center" style="text-align: center;">
  205. <p>Cooldown Length (ms)</p>
  206. </div>
  207. <div class="col-4 col-xl-4" style="text-align: center;"><input id="cooldownLengthInput" type="number" min="1000" max="300000" style="width: 100%;" /></div>
  208. </div>
  209. <div class="row" style="margin: 0px;border-bottom: 1px dotted var(--border-colour);">
  210. <div class="col-2 col-xl-2 text-center justify-content-center align-self-center">
  211. <p>Hunger removed by !feed</p>
  212. </div>
  213. <div class="col-4 col-xl-4 align-self-center" style="text-align: center;border-right: 1px dotted var(--border-colour);"><label id="feedHungerSliderLbl" class="form-label" for="feedHungerSlider">0</label><input id="feedHungerSlider" class="form-range" type="range" min="1" max="100" step="1" value="50" oninput="$(&#39;#feedHungerSliderLbl&#39;).html(this.value)" /></div>
  214. <div class="col-2 col-xl-2 text-center align-self-center" style="text-align: center;">
  215. <p>Social restored by !pet</p>
  216. </div>
  217. <div class="col-4 col-xl-4 align-self-center" style="text-align: center;"><label id="petSocialSliderLbl" class="form-label" for="petSocialSlider">0</label><input id="petSocialSlider" class="form-range" type="range" min="1" max="100" step="1" value="50" oninput="$(&#39;#petSocialSliderLbl&#39;).html(this.value)" /></div>
  218. </div>
  219. <div class="row" style="margin: 0px;">
  220. <div class="col-2 col-xl-2 text-center justify-content-center">
  221. <p>Energy used by !play</p>
  222. </div>
  223. <div class="col-4 col-xl-4 align-self-center" style="text-align: center;border-right: 1px dotted var(--border-colour);"><label id="playEnergySliderLbl" class="form-label" for="playEnergySlider">0</label><input id="playEnergySlider" class="form-range" type="range" min="1" max="100" step="1" value="50" oninput="$(&#39;#playEnergySliderLbl&#39;).html(this.value)" /></div>
  224. <div class="col-2 col-xl-2 text-center flex-shrink-1 align-self-center" style="text-align: center;">
  225. <p>Social restored by !play</p>
  226. </div>
  227. <div class="col-4 col-xl-4 align-self-center" style="text-align: center;"><label id="playSocialSliderLbl" class="form-label" for="playSocialSlider">0</label><input id="playSocialSlider" class="form-range" type="range" min="1" max="100" step="1" value="50" oninput="$(&#39;#playSocialSliderLbl&#39;).html(this.value)" /></div>
  228. </div>
  229. <div class="row" style="margin: 0px;">
  230. <div class="col-2 col-xl-2 justify-content-center"></div>
  231. <div class="col-4 col-xl-4 flex-shrink-1" style="text-align: center;"></div>
  232. <div class="col-2 col-xl-2 flex-shrink-1" style="text-align: center;"></div>
  233. <div class="col-4 col-xl-4 flex-shrink-1" style="text-align: center;"></div>
  234. </div>
  235. </div>
  236. <div style="border: 2px solid var(--border-colour);">
  237. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  238. <h3>Reply Strings</h3>
  239. </div>
  240. <div class="row" style="margin: 0px;border-top: 2px solid var(--border-colour);border-bottom: 1px solid var(--border-colour);">
  241. <h4>Hunger</h4>
  242. </div>
  243. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  244. <h5>!feed</h5>
  245. </div>
  246. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  247. <div class="col-xl-2"><label class="col-form-label">Not hungry</label></div>
  248. <div class="col align-self-center"><input id="notHungryInput" type="text" style="width: 100%;" /></div>
  249. </div>
  250. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  251. <div class="col-xl-2"><label class="col-form-label">Part one</label></div>
  252. <div class="col align-self-center"><input id="beenFedInput" type="text" style="width: 100%;" /></div>
  253. </div>
  254. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  255. <div class="col-xl-2"><label class="col-form-label">Part two - high hunger</label></div>
  256. <div class="col align-self-center"><input id="stillHungryInput" type="text" style="width: 100%;" /></div>
  257. </div>
  258. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  259. <div class="col-xl-2"><label class="col-form-label">Part two - low hunger</label></div>
  260. <div class="col align-self-center"><input id="wellFedInput" type="text" style="width: 100%;" /></div>
  261. </div>
  262. <div class="row" style="margin: 0px;border-top: 2px solid var(--border-colour);border-bottom: 1px solid var(--border-colour);">
  263. <h4>Tiredness</h4>
  264. </div>
  265. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  266. <div class="col-xl-2"><label class="col-form-label">Wake up</label></div>
  267. <div class="col align-self-center"><input id="wakeUpInput" type="text" style="width: 100%;" /></div>
  268. </div>
  269. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  270. <div class="col-xl-2"><label class="col-form-label">Is sleeping</label></div>
  271. <div class="col align-self-center"><input id="isSleepingInput" type="text" style="width: 100%;" /></div>
  272. </div>
  273. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  274. <h5>!sleep</h5>
  275. </div>
  276. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  277. <div class="col-xl-2"><label class="col-form-label">Not tired</label></div>
  278. <div class="col align-self-center"><input id="notTiredInput" type="text" style="width: 100%;" /></div>
  279. </div>
  280. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  281. <div class="col-xl-2"><label class="col-form-label">Start sleep</label></div>
  282. <div class="col align-self-center"><input id="startSleepInput" type="text" style="width: 100%;" /></div>
  283. </div>
  284. <div class="row" style="margin: 0px;border-top: 2px solid var(--border-colour);border-bottom: 1px solid var(--border-colour);">
  285. <h4>Social</h4>
  286. </div>
  287. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  288. <h5>!play</h5>
  289. </div>
  290. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  291. <div class="col-xl-2"><label class="col-form-label">No play</label></div>
  292. <div class="col align-self-center"><input id="noPlayInput" type="text" style="width: 100%;" /></div>
  293. </div>
  294. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  295. <div class="col-xl-2"><label class="col-form-label">No energy to play</label></div>
  296. <div class="col align-self-center"><input id="noEnergyForPlayInput" type="text" style="width: 100%;" /></div>
  297. </div>
  298. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  299. <div class="col-xl-2"><label class="col-form-label">Part one</label></div>
  300. <div class="col align-self-center"><input id="hadPlayInput" type="text" style="width: 100%;" /></div>
  301. </div>
  302. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  303. <div class="col-xl-2"><label class="col-form-label">Part two - high social</label></div>
  304. <div class="col align-self-center"><input id="donePlayInput" type="text" style="width: 100%;" /></div>
  305. </div>
  306. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  307. <div class="col-xl-2"><label class="col-form-label">Part two - low social</label></div>
  308. <div class="col align-self-center"><input id="morePlayInput" type="text" style="width: 100%;" /></div>
  309. </div>
  310. <div class="row" style="border-bottom: 1px solid var(--border-colour);margin: 0px;">
  311. <h5>!pet</h5>
  312. </div>
  313. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  314. <div class="col-xl-2"><label class="col-form-label">No pets</label></div>
  315. <div class="col align-self-center"><input id="noPetsInput" type="text" style="width: 100%;" /></div>
  316. </div>
  317. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  318. <div class="col-xl-2"><label class="col-form-label">Had pets</label></div>
  319. <div class="col align-self-center"><input id="hadPetsInput" type="text" style="width: 100%;" /></div>
  320. </div>
  321. <div class="row" style="margin: 0px;border-top: 2px solid var(--border-colour);border-bottom: 1px solid var(--border-colour);">
  322. <h4>Status</h4>
  323. </div>
  324. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  325. <div class="col-xl-2"><label class="col-form-label">Very high hunger</label></div>
  326. <div class="col align-self-center"><input id="starvingInput" type="text" style="width: 100%;" /></div>
  327. </div>
  328. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  329. <div class="col-xl-2"><label class="col-form-label">High hunger</label></div>
  330. <div class="col align-self-center"><input id="hungryInput" type="text" style="width: 100%;" /></div>
  331. </div>
  332. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  333. <div class="col-xl-2"><label class="col-form-label">Very high tiredness</label></div>
  334. <div class="col align-self-center"><input id="exhaustedInput" type="text" style="width: 100%;" /></div>
  335. </div>
  336. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  337. <div class="col-xl-2"><label class="col-form-label">High tiredness</label></div>
  338. <div class="col align-self-center"><input id="sleepyInput" type="text" style="width: 100%;" /></div>
  339. </div>
  340. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  341. <div class="col-xl-2"><label class="col-form-label">Very low social</label></div>
  342. <div class="col align-self-center"><input id="lonelyInput" type="text" style="width: 100%;" /></div>
  343. </div>
  344. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  345. <div class="col-xl-2"><label class="col-form-label">Low social</label></div>
  346. <div class="col align-self-center"><input id="needsAttentionInput" type="text" style="width: 100%;" /></div>
  347. </div>
  348. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  349. <div class="col-xl-2"><label class="col-form-label">All stats high</label></div>
  350. <div class="col align-self-center"><input id="feelGreatInput" type="text" style="width: 100%;" /></div>
  351. </div>
  352. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  353. <div class="col-xl-2"><label class="col-form-label">All stats mid</label></div>
  354. <div class="col align-self-center"><input id="feelOkayInput" type="text" style="width: 100%;" /></div>
  355. </div>
  356. <div class="row" style="border-bottom: 1px outset var(--border-colour);margin: 0px;">
  357. <div class="col-xl-2"><label class="col-form-label">Has died</label></div>
  358. <div class="col align-self-center"><input id="hasDiedInput" type="text" style="width: 100%;" /></div>
  359. </div>
  360. </div>
  361. </div>
  362. </div>
  363. </div>
  364. </div>
  365. </div>
  366. `
  367. return content
  368. });
  369. }
  370. acquireKaatStats(){
  371. const kaatAccount = this.getConfig("kaatAccount")
  372. const command = "kaatDataRequest"
  373. const data = "None"
  374. this.sendCustom(kaatAccount, command, data)
  375. }
  376. refreshKaatStats(rawData){
  377. const data = JSON.parse(rawData)
  378. const dataPointMap = {
  379. hunger: {value: data.hunger, negative: true},
  380. tiredness: {value: data.tiredness, negative: true},
  381. energy: {value: data.energy, negative: false},
  382. social: {value: data.social, negative: false},
  383. }
  384.  
  385. dataPointMap.mood = {
  386. value: Math.floor(( (100-dataPointMap.hunger.value) + (100-dataPointMap.tiredness.value) + dataPointMap.social.value) / 3),
  387. negative: false
  388. }
  389. for (const [key, data] of Object.entries(dataPointMap)) {
  390. const value = data.value
  391. const isNegative = data.negative
  392. let hue = Math.floor(value * 1.2)
  393. if (isNegative){
  394. hue = 120 - hue
  395. }
  396. $(`#${key}`)
  397. .attr({
  398. "aria-valuenow": value,
  399. "style": `width: ${value}%; background-color: hsl(${hue}, 70%, 50%) !important;`
  400. })
  401. .html(value+'%')
  402. }
  403. $("#isAliveLbl").html(data.alive? "Yes" : "No")
  404. $("#isAsleepLbl").html(data.sleeping? "Yes" : "No")
  405. }
  406. sendCustom(recipient, command, data){
  407. const pluginValue = "kaatpet"
  408. const content = `${pluginValue}:${command}:${data}`
  409. const payload = {
  410. content: content,
  411. onResponse: function(player, content, callbackId) {
  412. return true;
  413. },
  414. onOffline: function(player, content) {
  415. console.log(content)
  416. },
  417. timeout: 2000 // callback expires after 2 seconds
  418. }
  419. IdlePixelPlus.sendCustomMessage(recipient, payload)
  420. }
  421. populateConfigs(){
  422. const storedReplyStrings = localStorage.getItem("kaatReplies")
  423. if (storedReplyStrings){
  424. this.replyStrings = JSON.parse(storedReplyStrings)
  425. } else {
  426. this.replyStrings = {
  427. notHungry: "",
  428. beenFed: "",
  429. stillHungry: "",
  430. wellFed: "",
  431. wakeUp: "",
  432. notTired: "",
  433. startSleep: "",
  434. isSleeping: "",
  435. noPlay: "",
  436. noEnergyForPlay: "",
  437. hadPlay: "",
  438. donePlay: "",
  439. morePlay: "",
  440. noPets: "",
  441. hadPets: "",
  442. starving: "",
  443. hungry: "",
  444. exhausted: "",
  445. sleepy: "",
  446. lonely: "",
  447. needsAttention: "",
  448. feelGreat: "",
  449. feelOkay: "",
  450. hasDied: "",
  451. }
  452. }
  453.  
  454. for (const [key, value] of Object.entries(this.replyStrings)) {
  455. $(`#${key}Input`).val(value)
  456. }
  457.  
  458. const storedConfigs = localStorage.getItem("kaatConfigs")
  459. if (storedConfigs){
  460. this.configValues = JSON.parse(storedConfigs)
  461. } else {
  462. this.configValues = {
  463. tickLength: {
  464. value: 0,
  465. element: "tickLengthInput"
  466. },
  467. cooldownLength: {
  468. value: 0,
  469. element: "cooldownLengthInput"
  470. },
  471. feedHungerDif: {
  472. value: 0,
  473. element: "feedHungerSlider"
  474. },
  475. playEnergyDif: {
  476. value: 0,
  477. element: "playEnergySlider"
  478. },
  479. playSocialDif: {
  480. value: 0,
  481. element: "playSocialSlider"
  482. },
  483. petSocialDif: {
  484. value: 0,
  485. element: "petSocialSlider"
  486. },
  487. }
  488. }
  489.  
  490. for (const [key, value] of Object.entries(this.configValues)) {
  491. $(`#${value.element}`).val(value.value)
  492. if (value.element.endsWith("Slider")){
  493. $(`#${value.element}Lbl`).html(value.value)
  494. }
  495. }
  496. }
  497.  
  498. saveConfigs(){
  499. const newConfigValues = {
  500. tickLength: {
  501. value: 0,
  502. element: "tickLengthInput"
  503. },
  504. cooldownLength: {
  505. value: 0,
  506. element: "cooldownLengthInput"
  507. },
  508. feedHungerDif: {
  509. value: 0,
  510. element: "feedHungerSlider"
  511. },
  512. playEnergyDif: {
  513. value: 0,
  514. element: "playEnergySlider"
  515. },
  516. playSocialDif: {
  517. value: 0,
  518. element: "playSocialSlider"
  519. },
  520. petSocialDif: {
  521. value: 0,
  522. element: "petSocialSlider"
  523. },
  524. }
  525.  
  526. const newReplyStrings = {
  527. notHungry: "",
  528. beenFed: "",
  529. stillHungry: "",
  530. wellFed: "",
  531. wakeUp: "",
  532. notTired: "",
  533. startSleep: "",
  534. isSleeping: "",
  535. noPlay: "",
  536. noEnergyForPlay: "",
  537. hadPlay: "",
  538. donePlay: "",
  539. morePlay: "",
  540. noPets: "",
  541. hadPets: "",
  542. starving: "",
  543. hungry: "",
  544. exhausted: "",
  545. sleepy: "",
  546. lonely: "",
  547. needsAttention: "",
  548. feelGreat: "",
  549. feelOkay: "",
  550. hasDied: "",
  551. }
  552.  
  553. for (const [key, value] of Object.entries(newReplyStrings)) {
  554. newReplyStrings[key] = $(`#${key}Input`).val()
  555. }
  556.  
  557. for (const [key, value] of Object.entries(newConfigValues)) {
  558. newConfigValues[key].value = parseInt($(`#${value.element}`).val())
  559. }
  560.  
  561. const configString = JSON.stringify(newConfigValues)
  562. const replyStringsString = JSON.stringify(newReplyStrings)
  563.  
  564. localStorage.setItem("kaatConfigs", configString)
  565. localStorage.setItem("kaatReplies", replyStringsString)
  566. }
  567. }
  568.  
  569. const plugin = new KaatClientPlugin();
  570. IdlePixelPlus.registerPlugin(plugin);
  571. })();