Guest User

Scriptable Pokémon widget

a guest
Jul 17th, 2024
23
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 11.23 KB | Source Code | 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. //Default parameters for testing
  91. if (widgetArgs === undefined)
  92.   widgetArgs = "25|black|medium|1-650|496|medium";
  93.  
  94. var argsArray = widgetArgs.split("|");
  95. var argsCount = argsArray.length;
  96.  
  97. if (argsCount < 6 || argsCount > 7)
  98.   throw new Error("Number of parameters must be beween 6 and 7. " + argsCount + " given.");
  99.  
  100. /* --------------- */
  101. /*  Text settings  */
  102. /* --------------- */
  103.  
  104. // Set text color
  105. var textColor = argsArray[1];
  106.  
  107. switch (textColor) {
  108.   case "black":
  109.     textColor = Color.black();
  110.     break;
  111.   case "blue":
  112.     textColor = Color.blue();
  113.     break;
  114.   case "brown":
  115.     textColor = Color.brown();
  116.     break;
  117.   case "cyan":
  118.     textColor = Color.cyan();
  119.     break;
  120.   case "green":
  121.     textColor = Color.green();
  122.     break;
  123.   case "orange":
  124.     textColor = Color.orange();
  125.     break;
  126.   case "purple":
  127.     textColor = Color.purple();
  128.     break;
  129.   case "red":
  130.     textColor = Color.red();
  131.     break;
  132.   case "white":
  133.     textColor = Color.white();
  134.     break;
  135.   case "yellow":
  136.     textColor = Color.yellow();
  137.     break;
  138.   default:
  139.   throw new Error("Invalid color.");  
  140. }
  141.  
  142. //Set date
  143. var today = new Date();
  144. var days, months = [];
  145.  
  146. if (lang == "es") {
  147.   days = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'];
  148.   months = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre',   'Noviembre', 'Diciembre'];
  149. }
  150. else if (lang == "de"){
  151.   days = ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'];
  152.   months = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'July', 'August', 'September', 'Oktober', 'November', 'Dezember'];
  153. }
  154. else {
  155.   days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
  156.   months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  157. }
  158.  
  159. var currentWeekday = days[today.getDay()];
  160. var currentMonth = months[today.getMonth()];
  161. var currentDay = today.getDate();
  162. var hour = today.getHours();
  163.  
  164. var fullDate = currentMonth + " " + currentDay;
  165.  
  166. /* --------------- */
  167. /*  Pokemon code   */
  168. /* --------------- */
  169.  
  170. var pokemonLimits = argsArray[3].split("-");
  171. var randomPoke = Math.floor(Math.random() * (parseInt(pokemonLimits[1]) - parseInt(pokemonLimits[0]))) + parseInt(pokemonLimits[0]);
  172. var shinyChance = argsArray[4];
  173. var shinyResult = Math.floor(Math.random() * shinyChance);
  174. var isShiny = false;
  175.  
  176. if (shinyResult == 0)
  177.   isShiny = true;
  178.  
  179. const r = new Request("https://pokeapi.co/api/v2/pokemon/" + randomPoke);
  180. var apiResult = await r.loadJSON();
  181.  
  182. var pokemon = [];
  183.  
  184. pokemon.name = apiResult.name.charAt(0).toUpperCase() + apiResult.name.slice(1);
  185. pokemon.sprite = (apiResult.sprites.versions["generation-v"]["black-white"].front_default != null)
  186.                ? apiResult.sprites.versions["generation-v"]["black-white"].front_default
  187.                : apiResult.sprites.versions["generation-vii"]["ultra-sun-ultra-moon"].front_default;
  188. pokemon.type = apiResult.types[0].type.name;
  189.  
  190. if (isShiny)
  191.   pokemon.sprite = apiResult.sprites.front_shiny;
  192.  
  193. var sprRequest = new Request(pokemon.sprite);
  194. pokemon.sprite = await sprRequest.loadImage();
  195.  
  196. /* ---------------- */
  197. /* Background image */
  198. /* ---------------- */
  199.  
  200. var scriptablePath = "/var/mobile/Library/Mobile Documents/iCloud~dk~simonbs~Scriptable/Documents/";
  201. var imageName, imageFullPath;
  202. var widgetSize = argsArray[5];
  203.  
  204. if (argsCount == 7)
  205.   imageName = argsArray[6];
  206. else {
  207.   if (widgetSize == "small") {
  208.     if (hour >= 6 && hour < 18)
  209.       imageName = "poke_small_day.JPG";
  210.     else
  211.       imageName = "poke_small_night.JPG";
  212.   } else {
  213.       if (hour >= 6 && hour < 18) {
  214.       switch(pokemon.type) {
  215.         case "rock":
  216.           imageName = "rock_day.JPG";
  217.           break;
  218.         case "ground":
  219.           imageName = "rock_day.JPG";
  220.           break;
  221.         case "bug":
  222.           imageName = "bug_day.JPG";
  223.           break;
  224.         case "ice":
  225.           imageName = "ice_day.JPG";
  226.           break;
  227.         case "water":
  228.           imageName = "water_day.JPG";
  229.           break;
  230.         case "ghost":
  231.           imageName = "ghost_day.JPG";
  232.           break;
  233.         case "dark":
  234.           imageName = "ghost_day.JPG";
  235.           break;
  236.         case "steel":
  237.           imageName = "rock_day.JPG";
  238.           break;
  239.         default:
  240.           imageName = "poke_day.JPG";
  241.           break;
  242.       }      
  243.     }
  244.     else {
  245.       switch(pokemon.type) {
  246.         case "rock":
  247.           imageName = "rock_night.JPG";
  248.           break;
  249.         case "ground":
  250.           imageName = "rock_night.JPG";
  251.           break;
  252.         case "bug":
  253.           imageName = "bug_night.JPG";
  254.           break;
  255.         case "ice":
  256.           imageName = "ice_night.JPG";
  257.           break;
  258.         case "water":
  259.           imageName = "water_night.JPG";
  260.           break;
  261.         case "ghost":
  262.           imageName = "ghost_night.JPG";
  263.           break;
  264.         case "dark":
  265.           imageName = "ghost_night.JPG";
  266.           break;
  267.         case "steel":
  268.           imageName = "rock_night.JPG";
  269.           break;
  270.         default:
  271.           imageName = "poke_night.JPG";
  272.           break;
  273.       }    
  274.     }
  275.   }
  276. }
  277.  
  278. imagePath = scriptablePath + imageName;
  279.  
  280. var fm = FileManager.iCloud();
  281. if (fm.fileExists(imagePath)) {
  282.   //Download image from iCloud if it exists but it's not downloaded
  283.   if (!fm.isFileDownloaded(imagePath)) {
  284.     fm.downloadFileFromiCloud(imagePath);
  285.   }
  286. } else {
  287.   throw new Error("Image not found. Remember that file name AND format are case-sensitive.");
  288. }  
  289.  
  290. /* --------------- */
  291. /* Widget Creation */
  292. /* --------------- */
  293.  
  294. var pokemonWidget = new ListWidget();
  295.  
  296. //Top margin
  297. if (fontSize == "medium")
  298.   fontSizeValues = [12, 16];
  299. else if (fontSize == "big")
  300.   fontSizesValues = [14, 24];
  301.  
  302. var fontSize = argsArray[2];
  303. var fontSizeValues = [10,14];
  304.  
  305.  
  306. // Add shiny icon to text
  307. if (isShiny)
  308.   fullDate = fullDate + " \u2728";
  309.  
  310. pokemonWidget.addSpacer(71);
  311. // Weekday label
  312. var weekdayLabel = pokemonWidget.addText(currentWeekday);
  313. weekdayLabel.font = Font.systemFont(fontSizeValues[0]);
  314. weekdayLabel.textColor = textColor;
  315.  
  316. // Date label
  317. var dateLabel = pokemonWidget.addText(fullDate);  
  318. dateLabel.font = Font.boldSystemFont(fontSizeValues[1]);
  319. dateLabel.textColor = textColor;
  320.  
  321. var pokenumber = pokemonWidget.addText(pokemon.name+" #: "+ randomPoke.toString());
  322. pokenumber.font = Font.boldSystemFont(fontSizeValues[0]);
  323. pokenumber.textColor = textColor;
  324. // Background image
  325. pokemonWidget.backgroundImage = Image.fromFile(imagePath);
  326.  
  327. // Pokemon sprite
  328.  
  329. var widgetImg = pokemonWidget.addImage(pokemon.sprite);
  330. widgetImg.rightAlignImage();
  331. pokemonWidget.setPadding(0, 25, 0, 10);
  332.  
  333. widgetImg.imageSize = new Size(150, 150);
  334. pokemonWidget.url = "https://pokemondb.net/pokedex/" + pokemon.name;
  335.  
  336.  
  337. if (widgetSize == "small")
  338.   pokemonWidget.presentSmall();
  339. else
  340.   pokemonWidget.presentMedium();
  341.  
  342. Script.setWidget(pokemonWidget);
Add Comment
Please, Sign In to add comment