Guest User

Pokémon

a guest
Jul 18th, 2024
25
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.81 KB | None | 0 0
  1. var lang = Device.language();
  2. var widgetArgs;
  3.  
  4. if (config.runsInApp) {
  5.  
  6. let alert = new Alert();
  7. alert.title = "Choose an action";
  8. alert.addAction("Customize widget");
  9. alert.addAction("View example");
  10. alert.addCancelAction("Cancel");
  11. let option = await alert.presentAlert();
  12.  
  13. if (option == 0){
  14. let imageAlert = new Alert();
  15. imageAlert.title = (lang == "es") ? "Imagen de fondo" : "Background image";
  16. imageAlert.message = (lang == "es") ? "Si no se provee una imagen se utilizarán los fondos default (deben descargarse primero y colocarse en la carpeta de Scriptable)." : "If no image is provided, default backgrounds will be used (must be downloaded first and placed inside the Scriptable folder).";
  17. imageAlert.addAction((lang == "es") ? "Seleccionar de la galería" : "Choose from gallery");
  18. imageAlert.addAction((lang == "es") ? "Utilizar fondos default" : "Use default backgrounds");
  19. imageAlert.addAction((lang == "es") ? "Descargar fondos default" : "Download default backgrounds");
  20. imageAlert.addCancelAction((lang == "es") ? "Cancelar" : "Cancel");
  21. let imageOption = await imageAlert.presentAlert();
  22.  
  23. switch (imageOption){
  24. case 0:
  25. let imageSelected = await Photos.fromLibrary();
  26. let dp = await DocumentPicker.exportImage(imageSelected);
  27. var pathElements = dp[0].split("/");
  28. break;
  29. case 1:
  30. break;
  31. case 2:
  32. Safari.open("https://mega.nz/folder/tZJXxSDR#gHBnSzCfSdpOR0jdMfhQAA");
  33. break;
  34. default:
  35. return;
  36. }
  37.  
  38. let paramsAlert = new Alert();
  39. paramsAlert.title = (lang == "es") ? "Escribe tus preferencias" : "Write down your preferences";
  40. paramsAlert.message = (lang == "es") ? "El contenido entre paréntesis representa ejemplos de posibles valores para ese parámetro." : "The content between parenthesis represent possible values for that parameter.";
  41. paramsAlert.addTextField(((lang == "es") ? "Margen superior" : "Top margin") + " (20)");
  42. paramsAlert.addTextField(((lang == "es") ? "Color del texto" : "Text color") + " (white, black, etc.)");
  43. paramsAlert.addTextField(((lang == "es") ? "Tamaño del texto" : "Text size") + " (small, medium, big)");
  44. paramsAlert.addTextField(((lang == "es") ? "Listado de Pokemon" : "Pokemon list") + " (1-151)");
  45. paramsAlert.addTextField(((lang == "es") ? "Probabilidad Shiny" : "Shiny chance") + " (496)");
  46. paramsAlert.addTextField(((lang == "es") ? "Tamaño del widget" : "Widget size") + " (small, medium)");
  47. paramsAlert.addAction((lang == "es") ? "Listo" : "Done");
  48. paramsAlert.addCancelAction((lang == "es") ? "Cancelar" : "Cancel");
  49. let params = await paramsAlert.presentAlert();
  50.  
  51. if (params == -1)
  52. return;
  53.  
  54. for (i=0; i<6; i++) {
  55. if (paramsAlert.textFieldValue(i) == "")
  56. throw Error("All parameters are required.");
  57. }
  58.  
  59. widgetArgs = paramsAlert.textFieldValue(0) + "|" +
  60. paramsAlert.textFieldValue(1) + "|" +
  61. paramsAlert.textFieldValue(2) + "|" +
  62. paramsAlert.textFieldValue(3) + "|" +
  63. paramsAlert.textFieldValue(4) + "|" +
  64. paramsAlert.textFieldValue(5);
  65.  
  66. if (pathElements !== undefined){
  67. widgetArgs = widgetArgs + "|" + pathElements[pathElements.length - 1];
  68. }
  69.  
  70. let finalAlert = new Alert();
  71. finalAlert.title = (lang == "es") ? "Estos son tus parámetros" : "These are your parameters";
  72. finalAlert.message = (lang == "es") ? "Agrega un widget de Scriptable en tu pantalla de inicio. En las opciones, agrega el nombre de tu script y pega estos parámetros." : "Add a Scriptable widget to your homescreen. On settings, add the name of your script and paste these parameters.";
  73. finalAlert.addTextField("", widgetArgs);
  74. finalAlert.addAction((lang == "es") ? "Ver resultado" : "View result");
  75. finalAlert.addCancelAction((lang == "es") ? "Salir" : "Exit");
  76. let final = await finalAlert.presentAlert();
  77.  
  78. if (final == 1)
  79. return;
  80. }
  81. else if (option == -1){
  82. return;
  83. }
  84. }
  85.  
  86.  
  87. if (config.runsInWidget)
  88. widgetArgs = args.widgetParameter;
  89.  
  90. log(widgetArgs)
  91. //Default parameters for testing
  92. if (widgetArgs === undefined)
  93. widgetArgs = "45|black|medium|1-650|496|medium";
  94. log(widgetArgs)
  95. var argsArray = widgetArgs.split("|");
  96. var argsCount = argsArray.length;
  97.  
  98. if (argsCount < 6 || argsCount > 7)
  99. throw new Error("Number of parameters must be beween 6 and 7. " + argsCount + " given.");
  100.  
  101. /* --------------- */
  102. /* Text settings */
  103. /* --------------- */
  104.  
  105. // Set text color
  106. var textColor = argsArray[1];
  107.  
  108. switch (textColor) {
  109. case "black":
  110. textColor = Color.black();
  111. break;
  112. case "blue":
  113. textColor = Color.blue();
  114. break;
  115. case "brown":
  116. textColor = Color.brown();
  117. break;
  118. case "cyan":
  119. textColor = Color.cyan();
  120. break;
  121. case "green":
  122. textColor = Color.green();
  123. break;
  124. case "orange":
  125. textColor = Color.orange();
  126. break;
  127. case "purple":
  128. textColor = Color.purple();
  129. break;
  130. case "red":
  131. textColor = Color.red();
  132. break;
  133. case "white":
  134. textColor = Color.white();
  135. break;
  136. case "yellow":
  137. textColor = Color.yellow();
  138. break;
  139. default:
  140. throw new Error("Invalid color.");
  141. }
  142.  
  143. //Set date
  144. var today = new Date();
  145. var days, months = [];
  146.  
  147. if (lang == "es") {
  148. days = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'];
  149. months = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
  150. }
  151. else if (lang == "de"){
  152. days = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
  153. months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'July', 'August', 'September', 'Oktober', 'November', 'Dezember'];
  154. }
  155. else {
  156. days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  157. months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  158. }
  159.  
  160. var currentWeekday = days[today.getDay()];
  161. var currentMonth = months[today.getMonth()];
  162. var currentDay = today.getDate();
  163. var hour = today.getHours();
  164.  
  165. var fullDate = currentMonth + " " + currentDay;
  166.  
  167. /* --------------- */
  168. /* Pokemon code */
  169. /* --------------- */
  170.  
  171. var pokemonLimits = argsArray[3].split("-");
  172. var randomPoke = Math.floor(Math.random() * (parseInt(pokemonLimits[1]) - parseInt(pokemonLimits[0]))) + parseInt(pokemonLimits[0]);
  173. var shinyChance = argsArray[4];
  174. var shinyResult = Math.floor(Math.random() * shinyChance);
  175. var isShiny = false;
  176.  
  177. if (shinyResult == 0)
  178. isShiny = true;
  179.  
  180. const r = new Request("https://pokeapi.co/api/v2/pokemon/" + randomPoke);
  181. var apiResult = await r.loadJSON();
  182.  
  183. var pokemon = [];
  184.  
  185. pokemon.name = apiResult.name.charAt(0).toUpperCase() + apiResult.name.slice(1);
  186. pokemon.sprite = (apiResult.sprites.versions["generation-v"]["black-white"].front_default != null)
  187. ? apiResult.sprites.versions["generation-v"]["black-white"].front_default
  188. : apiResult.sprites.versions["generation-vii"]["ultra-sun-ultra-moon"].front_default;
  189. pokemon.type = apiResult.types[0].type.name;
  190.  
  191. if (isShiny)
  192. pokemon.sprite = apiResult.sprites.front_shiny;
  193.  
  194. var sprRequest = new Request(pokemon.sprite);
  195. pokemon.sprite = await sprRequest.loadImage();
  196.  
  197. /* ---------------- */
  198. /* Background image */
  199. /* ---------------- */
  200.  
  201. var scriptablePath = "/var/mobile/Library/Mobile Documents/iCloud~dk~simonbs~Scriptable/Documents/";
  202. var imageName, imageFullPath;
  203. var widgetSize = argsArray[5];
  204.  
  205. if (argsCount == 7)
  206. imageName = argsArray[6];
  207. else {
  208. if (widgetSize == "small") {
  209. if (hour >= 6 && hour < 18)
  210. imageName = "poke_small_day.JPG";
  211. else
  212. imageName = "poke_small_night.JPG";
  213. } else {
  214. if (hour >= 6 && hour < 18) {
  215. switch(pokemon.type) {
  216. case "rock":
  217. imageName = "rock_day.JPG";
  218. break;
  219. case "ground":
  220. imageName = "rock_day.JPG";
  221. break;
  222. case "bug":
  223. imageName = "bug_day.JPG";
  224. break;
  225. case "ice":
  226. imageName = "ice_day.JPG";
  227. break;
  228. case "water":
  229. imageName = "water_day.JPG";
  230. break;
  231. case "ghost":
  232. imageName = "ghost_day.JPG";
  233. break;
  234. case "dark":
  235. imageName = "ghost_day.JPG";
  236. break;
  237. case "steel":
  238. imageName = "rock_day.JPG";
  239. break;
  240. default:
  241. imageName = "poke_day.JPG";
  242. break;
  243. }
  244. }
  245. else {
  246. switch(pokemon.type) {
  247. case "rock":
  248. imageName = "rock_night.JPG";
  249. break;
  250. case "ground":
  251. imageName = "rock_night.JPG";
  252. break;
  253. case "bug":
  254. imageName = "bug_night.JPG";
  255. break;
  256. case "ice":
  257. imageName = "ice_night.JPG";
  258. break;
  259. case "water":
  260. imageName = "water_night.JPG";
  261. break;
  262. case "ghost":
  263. imageName = "ghost_night.JPG";
  264. break;
  265. case "dark":
  266. imageName = "ghost_night.JPG";
  267. break;
  268. case "steel":
  269. imageName = "rock_night.JPG";
  270. break;
  271. default:
  272. imageName = "poke_night.JPG";
  273. break;
  274. }
  275. }
  276. }
  277. }
  278.  
  279. imagePath = scriptablePath + imageName;
  280.  
  281. var fm = FileManager.iCloud();
  282. if (fm.fileExists(imagePath)) {
  283. //Download image from iCloud if it exists but it's not downloaded
  284. if (!fm.isFileDownloaded(imagePath)) {
  285. fm.downloadFileFromiCloud(imagePath);
  286. }
  287. } else {
  288. throw new Error("Image not found. Remember that file name AND format are case-sensitive.");
  289. }
  290.  
  291. /* --------------- */
  292. /* Widget Creation */
  293. /* --------------- */
  294.  
  295. var pokemonWidget = new ListWidget();
  296. pokemonWidget.setPadding(Number(argsArray[0]), 25, 10, 10);
  297. log(Number(argsArray[0]))
  298. //pokemonWidget.setPadding(top, leading, bottom, trailing)
  299. pokemonWidget.url = "https://pokemondb.net/pokedex/" + pokemon.name;
  300.  
  301. //Top margin
  302. if (fontSize == "medium")
  303. fontSizeValues = [12, 16];
  304. else if (fontSize == "big")
  305. fontSizesValues = [14, 24];
  306.  
  307. var fontSize = argsArray[2];
  308. var fontSizeValues = [10,14];
  309.  
  310.  
  311. // Add shiny icon to text
  312. if (isShiny)
  313. fullDate = fullDate + " \u2728";
  314.  
  315. let mainStack = pokemonWidget.addStack()
  316. let textStack = mainStack.addStack()
  317. let imageStack = mainStack.addStack()
  318. mainStack.layoutHorizontally()
  319. textStack.layoutVertically()
  320. //pokemonWidget.addSpacer(71);
  321. // Weekday label
  322. //var weekdayLabel = pokemonWidget.addText(currentWeekday);
  323. var weekdayLabel = textStack.addText(currentWeekday);
  324. weekdayLabel.font = Font.systemFont(fontSizeValues[0]);
  325. weekdayLabel.textColor = textColor;
  326.  
  327. // Date label
  328. //var dateLabel = pokemonWidget.addText(fullDate);
  329. var dateLabel = textStack.addText(fullDate);
  330. dateLabel.font = Font.boldSystemFont(fontSizeValues[1]);
  331. dateLabel.textColor = textColor;
  332.  
  333. //var pokenumber = pokemonWidget.addText(pokemon.name+" #: "+ randomPoke.toString());
  334. var pokenumber = textStack.addText(pokemon.name+" #: "+ randomPoke.toString());
  335. pokenumber.font = Font.boldSystemFont(fontSizeValues[0]);
  336. pokenumber.textColor = textColor;
  337.  
  338. // Background image
  339. pokemonWidget.backgroundImage = Image.fromFile(imagePath);
  340.  
  341. // Pokemon sprite
  342. //var widgetImg = pokemonWidget.addImage(pokemon.sprite);
  343. imageStack.addSpacer()
  344. var widgetImg = imageStack.addImage(pokemon.sprite);
  345. widgetImg.rightAlignImage();
  346. widgetImg.imageSize = new Size(150, 150);
  347.  
  348.  
  349. if (widgetSize == "small"){
  350. pokemonWidget.presentSmall();
  351. }else{
  352. pokemonWidget.presentMedium();
  353. }
  354. Script.setWidget(pokemonWidget);
Add Comment
Please, Sign In to add comment