|
// Variables used by Scriptable. |
|
// These must be at the very top of the file. Do not edit. |
|
// icon-color: purple; icon-glyph: columns; |
|
// =============================== |
|
// Scriptable Widget for Ghost CMS |
|
// by Jannis Hutt |
|
// get the latest version here: https://gist.github.com/hutt/ad644e5a472445029fe383705fa86ad1 |
|
// =============================== |
|
|
|
const crypto = importModule('crypto-min.js'); |
|
|
|
// === Configuration === |
|
let baseUrl = "https://ghost.example.com"; |
|
let adminApiKey = "your admin api key"; |
|
let cacheDuration = 24 * 60 * 60 * 1000; // cache data for 24 hours |
|
|
|
// == Ghost Logos (base64 encoded) == |
|
const logoImgBlack = `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`; |
|
const logoImgWhite = `iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAACXBIWXMAAC4jAAAuIwF4pT92AAADAFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8HPQsIAAAA/3RSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5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`; |
|
|
|
// == crypto.js == |
|
// minimized and reduced version of crypto.js that only includes HmacSHA256, enc.Base64 & enc.Hex |
|
const crypto = !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.crypto=e():t.crypto=e()}(this,(()=>(()=>{var t={237:(t,e,n)=>{const r={HmacSHA256:n(793),enc:{Base64:n(754),Hex:n(956)}};"undefined"!=typeof window&&(window.crypto=r),t.exports=r},21:function(t,e,n){var r;t.exports=(r=r||function(t){var e;if("undefined"!=typeof window&&window.crypto&&(e=window.crypto),"undefined"!=typeof self&&self.crypto&&(e=self.crypto),"undefined"!=typeof globalThis&&globalThis.crypto&&(e=globalThis.crypto),!e&&"undefined"!=typeof window&&window.msCrypto&&(e=window.msCrypto),!e&&void 0!==n.g&&n.g.crypto&&(e=n.g.crypto),!e)try{e=n(477)}catch(t){}var r=function(){if(e){if("function"==typeof e.getRandomValues)try{return e.getRandomValues(new Uint32Array(1))[0]}catch(t){}if("function"==typeof e.randomBytes)try{return e.randomBytes(4).readInt32LE()}catch(t){}}throw new Error("Native crypto module could not be used to get secure random number.")},i=Object.create||function(){function t(){}return function(e){var n;return t.prototype=e,n=new t,t.prototype=null,n}}(),o={},s=o.lib={},a=s.Base={extend:function(t){var e=i(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),e.init.prototype=e,e.$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},c=s.WordArray=a.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||u).stringify(this)},concat:function(t){var e=this.words,n=t.words,r=this.sigBytes,i=t.sigBytes;if(this.clamp(),r%4)for(var o=0;o<i;o++){var s=n[o>>>2]>>>24-o%4*8&255;e[r+o>>>2]|=s<<24-(r+o)%4*8}else for(var a=0;a<i;a+=4)e[r+a>>>2]=n[a>>>2];return this.sigBytes+=i,this},clamp:function(){var e=this.words,n=this.sigBytes;e[n>>>2]&=4294967295<<32-n%4*8,e.length=t.ceil(n/4)},clone:function(){var t=a.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],n=0;n<t;n+=4)e.push(r());return new c.init(e,t)}}),f=o.enc={},u=f.Hex={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i<n;i++){var o=e[i>>>2]>>>24-i%4*8&255;r.push((o>>>4).toString(16)),r.push((15&o).toString(16))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r<e;r+=2)n[r>>>3]|=parseInt(t.substr(r,2),16)<<24-r%8*4;return new c.init(n,e/2)}},h=f.Latin1={stringify:function(t){for(var e=t.words,n=t.sigBytes,r=[],i=0;i<n;i++){var o=e[i>>>2]>>>24-i%4*8&255;r.push(String.fromCharCode(o))}return r.join("")},parse:function(t){for(var e=t.length,n=[],r=0;r<e;r++)n[r>>>2]|=(255&t.charCodeAt(r))<<24-r%4*8;return new c.init(n,e)}},p=f.Utf8={stringify:function(t){try{return decodeURIComponent(escape(h.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return h.parse(unescape(encodeURIComponent(t)))}},d=s.BufferedBlockAlgorithm=a.extend({reset:function(){this._data=new c.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=p.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(e){var n,r=this._data,i=r.words,o=r.sigBytes,s=this.blockSize,a=o/(4*s),f=(a=e?t.ceil(a):t.max((0|a)-this._minBufferSize,0))*s,u=t.min(4*f,o);if(f){for(var h=0;h<f;h+=s)this._doProcessBlock(i,h);n=i.splice(0,f),r.sigBytes-=u}return new c.init(n,u)},clone:function(){var t=a.clone.call(this);return t._data=this._data.clone(),t},_minBufferSize:0}),l=(s.Hasher=d.extend({cfg:a.extend(),init:function(t){this.cfg=this.cfg.extend(t),this.reset()},reset:function(){d.reset.call(this),this._doReset()},update:function(t){return this._append(t),this._process(),this},finalize:function(t){return t&&this._append(t),this._doFinalize()},blockSize:16,_createHelper:function(t){return function(e,n){return new t.init(n).finalize(e)}},_createHmacHelper:function(t){return function(e,n){return new l.HMAC.init(t,n).finalize(e)}}}),o.algo={});return o}(Math),r)},754:function(t,e,n){var r,i,o;t.exports=(r=n(21),o=(i=r).lib.WordArray,i.enc.Base64={stringify:function(t){var e=t.words,n=t.sigBytes,r=this._map;t.clamp();for(var i=[],o=0;o<n;o+=3)for(var s=(e[o>>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,a=0;a<4&&o+.75*a<n;a++)i.push(r.charAt(s>>>6*(3-a)&63));var c=r.charAt(64);if(c)for(;i.length%4;)i.push(c);return i.join("")},parse:function(t){var e=t.length,n=this._map,r=this._reverseMap;if(!r){r=this._reverseMap=[];for(var i=0;i<n.length;i++)r[n.charCodeAt(i)]=i}var s=n.charAt(64);if(s){var a=t.indexOf(s);-1!==a&&(e=a)}return function(t,e,n){for(var r=[],i=0,s=0;s<e;s++)if(s%4){var a=n[t.charCodeAt(s-1)]<<s%4*2|n[t.charCodeAt(s)]>>>6-s%4*2;r[i>>>2]|=a<<24-i%4*8,i++}return o.create(r,i)}(t,e,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},r.enc.Base64)},956:function(t,e,n){t.exports=n(21).enc.Hex},793:function(t,e,n){var r;t.exports=(r=n(21),n(9),n(25),r.HmacSHA256)},25:function(t,e,n){var r,i,o;t.exports=(i=(r=n(21)).lib.Base,o=r.enc.Utf8,void(r.algo.HMAC=i.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=o.parse(e));var n=t.blockSize,r=4*n;e.sigBytes>r&&(e=t.finalize(e)),e.clamp();for(var i=this._oKey=e.clone(),s=this._iKey=e.clone(),a=i.words,c=s.words,f=0;f<n;f++)a[f]^=1549556828,c[f]^=909522486;i.sigBytes=s.sigBytes=r,this.reset()},reset:function(){var t=this._hasher;t.reset(),t.update(this._iKey)},update:function(t){return this._hasher.update(t),this},finalize:function(t){var e=this._hasher,n=e.finalize(t);return e.reset(),e.finalize(this._oKey.clone().concat(n))}})))},9:function(t,e,n){var r;t.exports=(r=n(21),function(t){var e=r,n=e.lib,i=n.WordArray,o=n.Hasher,s=e.algo,a=[],c=[];!function(){function e(e){for(var n=t.sqrt(e),r=2;r<=n;r++)if(!(e%r))return!1;return!0}function n(t){return 4294967296*(t-(0|t))|0}for(var r=2,i=0;i<64;)e(r)&&(i<8&&(a[i]=n(t.pow(r,.5))),c[i]=n(t.pow(r,1/3)),i++),r++}();var f=[],u=s.SHA256=o.extend({_doReset:function(){this._hash=new i.init(a.slice(0))},_doProcessBlock:function(t,e){for(var n=this._hash.words,r=n[0],i=n[1],o=n[2],s=n[3],a=n[4],u=n[5],h=n[6],p=n[7],d=0;d<64;d++){if(d<16)f[d]=0|t[e+d];else{var l=f[d-15],y=(l<<25|l>>>7)^(l<<14|l>>>18)^l>>>3,v=f[d-2],g=(v<<15|v>>>17)^(v<<13|v>>>19)^v>>>10;f[d]=y+f[d-7]+g+f[d-16]}var w=r&i^r&o^i&o,_=(r<<30|r>>>2)^(r<<19|r>>>13)^(r<<10|r>>>22),m=p+((a<<26|a>>>6)^(a<<21|a>>>11)^(a<<7|a>>>25))+(a&u^~a&h)+c[d]+f[d];p=h,h=u,u=a,a=s+m|0,s=o,o=i,i=r,r=m+(_+w)|0}n[0]=n[0]+r|0,n[1]=n[1]+i|0,n[2]=n[2]+o|0,n[3]=n[3]+s|0,n[4]=n[4]+a|0,n[5]=n[5]+u|0,n[6]=n[6]+h|0,n[7]=n[7]+p|0},_doFinalize:function(){var e=this._data,n=e.words,r=8*this._nDataBytes,i=8*e.sigBytes;return n[i>>>5]|=128<<24-i%32,n[14+(i+64>>>9<<4)]=t.floor(r/4294967296),n[15+(i+64>>>9<<4)]=r,e.sigBytes=4*n.length,this._process(),this._hash},clone:function(){var t=o.clone.call(this);return t._hash=this._hash.clone(),t}});e.SHA256=o._createHelper(u),e.HmacSHA256=o._createHmacHelper(u)}(Math),r.SHA256)},477:()=>{}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var o=e[r]={exports:{}};return t[r].call(o.exports,o,o.exports,n),o.exports}return n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n(237)})())); |
|
|
|
// === File Management === |
|
// Get domain name for cache file naming |
|
const domainName = baseUrl.replace(/^https?:\/\//, "").split("/")[0]; |
|
const cacheFileName = `${domainName}.json`; |
|
|
|
// FileManager setup for iCloud and local storage |
|
const fm = FileManager.iCloud(); // Initialize FileManager |
|
const dirPath = fm.joinPath(fm.documentsDirectory(), "ghost-data"); |
|
if (!fm.fileExists(dirPath)) fm.createDirectory(dirPath); |
|
const cachePath = fm.joinPath(dirPath, cacheFileName); |
|
|
|
// === Parameter Parsing === |
|
// Function to parse widget parameters provided by the user |
|
if (args.widgetParameter) { |
|
// Split the parameters by commas and trim any extra whitespace |
|
const paramArray = args.widgetParameter.split(",").map(param => param.trim()); |
|
const paramMap = {}; |
|
|
|
// Iterate through the parameters |
|
paramArray.forEach(param => { |
|
// Split the parameter into key-value pairs if in "key=value" format |
|
const [key, value] = param.includes('=') ? param.split('=') : []; |
|
if (key && value) { |
|
// Add the key-value pair to the paramMap object |
|
paramMap[key.trim()] = value.trim(); |
|
} else { |
|
// If the parameter is not in key=value format, assume it's positional |
|
// Assign to baseUrl, adminApiKey, or cacheDuration in that order |
|
if (!paramMap.baseUrl) paramMap.baseUrl = param; |
|
else if (!paramMap.adminApiKey) paramMap.adminApiKey = param; |
|
else if (!paramMap.cacheDuration) paramMap.cacheDuration = param; |
|
} |
|
}); |
|
|
|
// Ensure that both baseUrl and adminApiKey are provided together, if specified |
|
if ((paramMap.baseUrl && !paramMap.adminApiKey) || (!paramMap.baseUrl && paramMap.adminApiKey)) { |
|
console.error("Both baseUrl and adminApiKey must be provided if one is specified."); |
|
} else { |
|
// If parameters are valid, override the defaults with provided values |
|
if (paramMap.baseUrl) baseUrl = paramMap.baseUrl; |
|
if (paramMap.adminApiKey) adminApiKey = paramMap.adminApiKey; |
|
if (paramMap.cacheDuration) cacheDuration = parseInt(paramMap.cacheDuration) * 60 * 1000; // Convert minutes to milliseconds |
|
} |
|
} |
|
|
|
// === Utility Functions === |
|
// Function to create a JWT token for authenticating API requests to Ghost |
|
// This uses the adminApiKey, which is expected to be in the format of id:secret |
|
function createJwt() { |
|
// Split the adminApiKey into the id and secret components |
|
const [id, secret] = adminApiKey.split(':'); |
|
|
|
// Define the JWT header with algorithm and type information |
|
const header = { |
|
"alg": "HS256", // Specify the algorithm (HMAC SHA-256) |
|
"typ": "JWT", // Type of the token, which is JWT |
|
"kid": id // Key ID (the admin API key ID) |
|
}; |
|
|
|
// Define the payload with issued time (iat), expiration time (exp), and audience (aud) |
|
const payload = { |
|
"iat": Math.floor(Date.now() / 1000), // Issued at current time (in seconds) |
|
"exp": Math.floor(Date.now() / 1000) + (60 * 60), // Expiration time (1 hour from now) |
|
"aud": "/v3/admin/" // Audience: The API endpoint for admin access |
|
}; |
|
|
|
// Function to encode data to Base64 URL-safe format |
|
function base64url(source) { |
|
return btoa(JSON.stringify(source)) |
|
.replace(/=/g, '') // Remove any '=' padding |
|
.replace(/\+/g, '-') // Replace '+' with '-' |
|
.replace(/\//g, '_'); // Replace '/' with '_' |
|
} |
|
|
|
// Create the encoded header and payload |
|
const encodedHeader = base64url(header); |
|
const encodedPayload = base64url(payload); |
|
|
|
// Parse the secret (which is in hexadecimal) using crypto |
|
const key = crypto.enc.Hex.parse(secret); |
|
|
|
// Create the signature by hashing the header and payload with the secret key |
|
const signature = crypto.enc.Base64.stringify(crypto.HmacSHA256(`${encodedHeader}.${encodedPayload}`, key)) |
|
.replace(/=/g, '') // Remove '=' padding |
|
.replace(/\+/g, '-') // Replace '+' with '-' |
|
.replace(/\//g, '_'); // Replace '/' with '_' |
|
|
|
// Return the complete JWT token in the format: header.payload.signature |
|
return `${encodedHeader}.${encodedPayload}.${signature}`; |
|
} |
|
|
|
// Save members data to a local cache file for future use |
|
// This function writes the members data along with the current timestamp to the cache |
|
function saveCache(membersData) { |
|
// Prepare the cache object with the current timestamp and members data |
|
const cacheData = { |
|
lastUpdated: Date.now(), |
|
members: membersData |
|
}; |
|
|
|
// Write the cache object to the cache file as a JSON string |
|
fm.writeString(cachePath, JSON.stringify(cacheData)); |
|
|
|
// Log success message for debugging purposes |
|
console.log("Cache saved successfully."); |
|
} |
|
|
|
// Load cached data from the local file if it exists and is still valid |
|
// This function checks if the cache is valid, and if so, returns the cached members data |
|
function loadCache() { |
|
// Check if the cache file exists |
|
if (fm.fileExists(cachePath)) { |
|
// Read the cache file and parse the JSON data |
|
const cache = JSON.parse(fm.readString(cachePath)); |
|
|
|
// Check if the cache is still valid based on the current time and cache duration |
|
const isCacheValid = (Date.now() - cache.lastUpdated) < cacheDuration; |
|
|
|
if (isCacheValid) { |
|
// If the cache is valid, return the cached members data |
|
console.log("Using cached data."); |
|
return cache.members; |
|
} else { |
|
// Log a message if the cache has expired |
|
console.log("Cache expired."); |
|
} |
|
} else { |
|
// Log a message if no cache file exists |
|
console.log("No cache found."); |
|
} |
|
// Return null if no valid cache is found |
|
return null; |
|
} |
|
|
|
// Function to fetch members' data from the Ghost API using pagination |
|
// Takes in an optional page number, which defaults to 1 |
|
async function fetchMembers(page = 1) { |
|
// Construct the API URL for the specific page of members |
|
const apiUrl = `${baseUrl}/ghost/api/v3/admin/members/?page=${page}`; |
|
|
|
// Create a JWT token for authorization |
|
const token = createJwt(); |
|
|
|
// Set up the request object |
|
let req = new Request(apiUrl); |
|
req.method = "GET"; // Use the GET method to retrieve data |
|
req.headers = { |
|
"Authorization": `Ghost ${token}`, // Include the JWT token in the Authorization header |
|
"Content-Type": "application/json", // Content type is JSON |
|
"Origin": `${baseUrl}/ghost/api/admin/` // Set the correct origin header for the request |
|
}; |
|
|
|
// Try to fetch the JSON data from the API |
|
try { |
|
const jsonData = await req.loadJSON(); // Load the JSON response |
|
return jsonData; // Return the data if successful |
|
} catch (error) { |
|
// Log an error if fetching fails |
|
console.error("Error fetching members:", error); |
|
return null; // Return null in case of failure |
|
} |
|
} |
|
|
|
// Recursive function to fetch all members using pagination |
|
// Combines all pages of member data into one array |
|
async function getAllMembers() { |
|
let allMembers = []; // Initialize an empty array to store all members |
|
let page = 1; // Start from the first page |
|
let hasMorePages = true; // Flag to check if there are more pages to fetch |
|
|
|
// Continue fetching data while there are more pages |
|
while (hasMorePages) { |
|
// Fetch members for the current page |
|
const data = await fetchMembers(page); |
|
|
|
// If data is received and contains members |
|
if (data && data.members) { |
|
allMembers = allMembers.concat(data.members); // Add the members to the array |
|
|
|
// Check if there is a next page in the pagination |
|
hasMorePages = data.meta.pagination.next !== null; |
|
page++; // Move to the next page |
|
} else { |
|
hasMorePages = false; // No more pages to fetch |
|
} |
|
} |
|
|
|
return allMembers; // Return the complete list of members |
|
} |
|
|
|
// Main function to get subscriber data with caching support |
|
async function getSubscriberData() { |
|
// Attempt to load cached data |
|
const cachedData = loadCache(); |
|
|
|
// If valid cached data is found, use it |
|
if (cachedData) { |
|
return cachedData; |
|
} |
|
|
|
// If no valid cache, fetch all members data from the API |
|
const members = await getAllMembers(); |
|
|
|
// If members are found, save them to the cache |
|
if (members.length > 0) { |
|
saveCache(members); |
|
} else { |
|
// Log an error if no members are found |
|
console.error("No members found."); |
|
} |
|
|
|
// Return the members data |
|
return members; |
|
} |
|
|
|
async function getMembersCountData(days = 30) { |
|
// Attempt to load cached data |
|
const members = await getSubscriberData(); |
|
|
|
// Sort the members by their created_at date in ascending order |
|
members.sort((a, b) => new Date(a.created_at) - new Date(b.created_at)); |
|
|
|
// Get today's date and initialize the counts for the last X days |
|
const today = new Date(); |
|
const membersCountData = new Array(days).fill(0); |
|
let memberIndex = 0; |
|
|
|
for (let i = days - 1; i >= 0; i--) { |
|
const date = new Date(today); |
|
date.setDate(today.getDate() - i); |
|
const dayEnd = new Date(date); |
|
dayEnd.setHours(23, 59, 59, 999); |
|
|
|
// Count members created on or before this day |
|
while (memberIndex < members.length && new Date(members[memberIndex].created_at) <= dayEnd) { |
|
membersCountData[days - 1 - i]++; |
|
memberIndex++; |
|
} |
|
} |
|
|
|
// Accumulate member counts progressively |
|
for (let i = 1; i < days; i++) { |
|
membersCountData[i] += membersCountData[i - 1]; |
|
} |
|
|
|
return membersCountData; |
|
} |
|
|
|
// === Error Widget === |
|
// Function to create an error widget in case of failures |
|
// Displays the error title and message with the same styling as the main widget |
|
function createErrorWidget(title, errorMessage) { |
|
const widget = new ListWidget(); // Create a new ListWidget |
|
const isDarkMode = Device.isUsingDarkAppearance(); // Check if dark mode is active |
|
|
|
// Set the background color based on light/dark mode |
|
widget.backgroundColor = isDarkMode ? new Color("#15171a") : new Color("#FFFFFF"); |
|
|
|
// Add title to the widget |
|
const titleText = widget.addText(title); |
|
titleText.font = Font.subheadline(); |
|
titleText.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
|
|
widget.addSpacer(5); // Add some space between the title and the error message |
|
|
|
// Add error message to the widget |
|
const errorText = widget.addText(errorMessage); |
|
errorText.font = Font.body(); |
|
errorText.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
|
|
widget.addSpacer(); // Add remaining space |
|
|
|
// Add the logo to the bottom right corner |
|
const logoStack = widget.addStack(); |
|
logoStack.addSpacer(); // Spacer to push logo to the right |
|
|
|
const logoImg = isDarkMode ? logoImgWhite : logoImgBlack; |
|
|
|
const logo = logoStack.addImage(Image.fromData(Data.fromBase64String(logoImg))); |
|
logo.imageSize = new Size(60, 60); // Set the logo size |
|
logo.rightAlignImage(); // Align the logo to the right |
|
|
|
return widget; // Return the error widget |
|
} |
|
|
|
// === Draw Graph === |
|
// Function to draw a graph with rounded curves and non-transparent top line |
|
function drawGraph(context, data, width, height) { |
|
const minY = Math.min(...data); // Find the minimum value in the data set |
|
const maxY = Math.max(...data); // Find the maximum value in the data set |
|
const scaleX = width / (data.length - 1); // Scale horizontally based on data points |
|
const scaleY = (height * 0.5) / (maxY - minY); // Scale vertically to fit 50% of the widget height |
|
|
|
const path = new Path(); |
|
path.move(new Point(0, height - (data[0] - minY) * scaleY)); // Start path at the first data point |
|
|
|
// Loop through data to create a smooth curve using Bezier curves |
|
for (let i = 1; i < data.length; i++) { |
|
const x = i * scaleX; |
|
const y = height - (data[i] - minY) * scaleY; |
|
const prevX = (i - 1) * scaleX; |
|
const prevY = height - (data[i - 1] - minY) * scaleY; |
|
|
|
const ctrl1X = prevX + scaleX / 3; |
|
const ctrl1Y = prevY; |
|
const ctrl2X = x - scaleX / 3; |
|
const ctrl2Y = y; |
|
|
|
path.addCurve(new Point(x, y), new Point(ctrl1X, ctrl1Y), new Point(ctrl2X, ctrl2Y)); // Add Bezier curve |
|
} |
|
|
|
// Close the path at the bottom and left of the graph |
|
path.addLine(new Point(width, height)); |
|
path.addLine(new Point(0, height)); |
|
path.closeSubpath(); |
|
|
|
// Fill the area under the curve with semi-transparent color |
|
context.setFillColor(new Color("#FF5BFA", 0.3)); // 30% transparency |
|
context.addPath(path); |
|
context.fillPath(); |
|
|
|
// Add the top line of the graph without transparency |
|
const topPath = new Path(); |
|
topPath.move(new Point(0, height - (data[0] - minY) * scaleY)); |
|
|
|
// Loop to draw the non-transparent top line |
|
for (let i = 1; i < data.length; i++) { |
|
const x = i * scaleX; |
|
const y = height - (data[i] - minY) * scaleY; |
|
const prevX = (i - 1) * scaleX; |
|
const prevY = height - (data[i - 1] - minY) * scaleY; |
|
|
|
const ctrl1X = prevX + scaleX / 3; |
|
const ctrl1Y = prevY; |
|
const ctrl2X = x - scaleX / 3; |
|
const ctrl2Y = y; |
|
|
|
topPath.addCurve(new Point(x, y), new Point(ctrl1X, ctrl1Y), new Point(ctrl2X, ctrl2Y)); // Add Bezier curve for top line |
|
} |
|
|
|
// Draw the top line with solid color |
|
context.setStrokeColor(new Color("#FF5BFA")); |
|
context.setLineWidth(2); |
|
context.addPath(topPath); |
|
context.strokePath(); // Draw the stroke path for the top line |
|
} |
|
|
|
// === Small Members Count Widget === |
|
// Function to create the small widget layout with the total members count |
|
function createSmallMembersWidget(currentSubscribers) { |
|
const widget = new ListWidget(); |
|
const isDarkMode = Device.isUsingDarkAppearance(); |
|
widget.backgroundColor = isDarkMode ? new Color("#15171a") : new Color("#FFFFFF"); |
|
|
|
// Create the vertical layout for text and logo |
|
const mainStack = widget.addStack(); |
|
mainStack.layoutVertically(); |
|
mainStack.topAlignContent(); |
|
mainStack.setPadding(2, 2, 0, 0); |
|
|
|
// Title (Total members) |
|
const title = mainStack.addText("Total members"); |
|
title.font = Font.subheadline(); |
|
title.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
title.leftAlignText(); |
|
|
|
mainStack.addSpacer(2); |
|
|
|
// Subscriber Count |
|
const subscriberCount = mainStack.addText(`${currentSubscribers}`); |
|
subscriberCount.font = Font.boldSystemFont(40); |
|
subscriberCount.minimumScaleFactor = 0.5; |
|
subscriberCount.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
subscriberCount.leftAlignText(); |
|
|
|
mainStack.addSpacer(); |
|
|
|
// Logo section in the bottom right |
|
const logoStack = mainStack.addStack(); |
|
logoStack.addSpacer(); // Push the logo to the right |
|
const logo = logoStack.addImage(isDarkMode ? Image.fromData(Data.fromBase64String(logoImgWhite)) : Image.fromData(Data.fromBase64String(logoImgBlack))); |
|
logo.imageSize = new Size(45, 45); |
|
logo.rightAlignImage(); |
|
|
|
return widget; |
|
} |
|
|
|
// === Medium Members Count Widget === |
|
// Function to create the medium widget layout with total members count and graph |
|
function createMediumMembersWidget(currentSubscribers, data) { |
|
const widget = new ListWidget(); |
|
const isDarkMode = Device.isUsingDarkAppearance(); |
|
widget.backgroundColor = isDarkMode ? new Color("#15171a") : new Color("#FFFFFF"); |
|
|
|
// Set widget dimensions and prepare context |
|
const widgetSize = new Size(400, 200); |
|
const context = new DrawContext(); |
|
context.size = widgetSize; |
|
context.opaque = false; |
|
context.respectScreenScale = true; |
|
|
|
// Draw the graph as the background |
|
drawGraph(context, data, widgetSize.width, widgetSize.height); |
|
const img = context.getImage(); |
|
widget.backgroundImage = img; |
|
|
|
// Create the vertical layout for text and logo |
|
const mainStack = widget.addStack(); |
|
mainStack.layoutVertically(); |
|
mainStack.topAlignContent(); |
|
mainStack.setPadding(2, 2, 0, 0); |
|
|
|
// Title |
|
const title = mainStack.addText("Total members"); |
|
title.font = Font.subheadline(); |
|
title.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
title.leftAlignText(); |
|
|
|
mainStack.addSpacer(2); |
|
|
|
// Subscriber Count |
|
const subscriberCount = mainStack.addText(`${currentSubscribers}`); |
|
subscriberCount.font = Font.boldSystemFont(40); |
|
subscriberCount.minimumScaleFactor = 0.5; |
|
subscriberCount.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
subscriberCount.leftAlignText(); |
|
|
|
// Spacer and logo at the bottom right |
|
mainStack.addSpacer(); |
|
|
|
const logoStack = mainStack.addStack(); |
|
logoStack.addSpacer(); // Push the logo to the right |
|
const logo = logoStack.addImage(isDarkMode ? Image.fromData(Data.fromBase64String(logoImgWhite)) : Image.fromData(Data.fromBase64String(logoImgBlack))); |
|
logo.imageSize = new Size(45, 45); |
|
logo.rightAlignImage(); |
|
|
|
return widget; |
|
} |
|
|
|
// === Large Members Count Widget === |
|
// Function to create the large widget layout with total members count and graph |
|
function createLargeMembersWidget(currentSubscribers, data) { |
|
const widget = new ListWidget(); |
|
const isDarkMode = Device.isUsingDarkAppearance(); |
|
widget.backgroundColor = isDarkMode ? new Color("#15171a") : new Color("#FFFFFF"); |
|
|
|
// Set widget dimensions and prepare context |
|
const widgetSize = new Size(400, 400); |
|
const context = new DrawContext(); |
|
context.size = widgetSize; |
|
context.opaque = false; |
|
context.respectScreenScale = true; |
|
|
|
// Draw the graph as the background |
|
drawGraph(context, data, widgetSize.width, widgetSize.height); |
|
const img = context.getImage(); |
|
widget.backgroundImage = img; |
|
|
|
// Create the vertical layout for text and logo |
|
const mainStack = widget.addStack(); |
|
mainStack.layoutVertically(); |
|
mainStack.topAlignContent(); |
|
mainStack.setPadding(2, 2, 0, 0); |
|
|
|
// Title |
|
const title = mainStack.addText("Total members"); |
|
title.font = Font.subheadline(); |
|
title.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
title.leftAlignText(); |
|
|
|
mainStack.addSpacer(2); |
|
|
|
// Subscriber Count |
|
const subscriberCount = mainStack.addText(`${currentSubscribers}`); |
|
subscriberCount.font = Font.boldSystemFont(50); |
|
subscriberCount.minimumScaleFactor = 0.5; |
|
subscriberCount.textColor = isDarkMode ? new Color("#FFFFFF") : new Color("#000000"); |
|
subscriberCount.leftAlignText(); |
|
|
|
// Spacer and logo at the bottom right |
|
mainStack.addSpacer(); |
|
|
|
const logoStack = mainStack.addStack(); |
|
logoStack.addSpacer(); // Push the logo to the right |
|
const logo = logoStack.addImage(isDarkMode ? Image.fromData(Data.fromBase64String(logoImgWhite)) : Image.fromData(Data.fromBase64String(logoImgBlack))); |
|
logo.imageSize = new Size(45, 45); |
|
logo.rightAlignImage(); |
|
|
|
return widget; |
|
} |
|
|
|
// === Widget Display === |
|
// Function to determine widget size and display the appropriate layout |
|
async function createWidget() { |
|
// get number of total members |
|
const subscribers = await getSubscriberData(); |
|
const currentSubscribers = subscribers.length; |
|
|
|
// get members count for the last 30 days |
|
const data = await getMembersCountData(30); |
|
console.log(`Array with members count: ${data}`); |
|
|
|
let widgetSize = config.widgetFamily || "medium"; // Use widget size or default to medium |
|
|
|
console.log(`Widget Size: ${widgetSize}`); // Log for debugging |
|
console.log(`Current Base URL: ${baseUrl}`); // Log the current base URL |
|
|
|
let widget; |
|
try { |
|
// Choose widget layout based on size |
|
switch (widgetSize) { |
|
case 'small': |
|
widget = createSmallMembersWidget(currentSubscribers); |
|
break; |
|
case 'medium': |
|
widget = createMediumMembersWidget(currentSubscribers, data); |
|
break; |
|
case 'large': |
|
widget = createLargeMembersWidget(currentSubscribers, data); |
|
break; |
|
default: |
|
console.error(`Unknown widget size: ${widgetSize}`); |
|
widget = createErrorWidget("Error", "Unsupported widget size."); |
|
} |
|
} catch (error) { |
|
// Catch errors and display an error widget |
|
console.error(`Error creating widget: ${error}`); |
|
widget = createErrorWidget("Error", error.toString()); |
|
} |
|
|
|
return widget; |
|
} |
|
|
|
// === Main === |
|
let widget = await createWidget(); |
|
if (config.runsInWidget) { |
|
Script.setWidget(widget); |
|
} else { |
|
widget.presentMedium(); |
|
} |
|
Script.complete(); |