From def3dfb60d03be47b7d1a16f269ac750d1bbdd97 Mon Sep 17 00:00:00 2001 From: HPL-JesusCastro Date: Thu, 7 May 2026 20:53:31 +0800 Subject: [PATCH] first commit --- .gitignore | 144 +++++++++++++++ .vscode/launch.json | 17 ++ .vscode/tasks.json | 19 ++ hpl-toolbox-0.1.0.vsix | Bin 0 -> 65936 bytes media/hpl.png | Bin 0 -> 11028 bytes media/hpl.svg | 23 +++ media/icon.svg | 1 + package-lock.json | 58 ++++++ package.json | 99 ++++++++++ src/extension.ts | 18 ++ src/launcherView.ts | 65 +++++++ src/tools/applovinUpload.ts | 262 +++++++++++++++++++++++++++ src/tools/base64Scanner.ts | 192 ++++++++++++++++++++ src/tools/dailyUpdate.ts | 121 +++++++++++++ src/tools/plecUpload.ts | 347 ++++++++++++++++++++++++++++++++++++ src/tools/shared.ts | 34 ++++ tsconfig.json | 13 ++ 17 files changed, 1413 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json create mode 100644 hpl-toolbox-0.1.0.vsix create mode 100644 media/hpl.png create mode 100644 media/hpl.svg create mode 100644 media/icon.svg create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/extension.ts create mode 100644 src/launcherView.ts create mode 100644 src/tools/applovinUpload.ts create mode 100644 src/tools/base64Scanner.ts create mode 100644 src/tools/dailyUpdate.ts create mode 100644 src/tools/plecUpload.ts create mode 100644 src/tools/shared.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3224a90 --- /dev/null +++ b/.gitignore @@ -0,0 +1,144 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node +# Edit at https://www.toptal.com/developers/gitignore?templates=node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +# End of https://www.toptal.com/developers/gitignore/api/node \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..02621b4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,17 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out/**/*.js" + ], + "preLaunchTask": "npm: compile" + } + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..c12701d --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,19 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "compile", + "group": { "kind": "build", "isDefault": true }, + "problemMatcher": ["$tsc"], + "label": "npm: compile" + }, + { + "type": "npm", + "script": "watch", + "isBackground": true, + "problemMatcher": ["$tsc-watch"], + "label": "npm: watch" + } + ] +} diff --git a/hpl-toolbox-0.1.0.vsix b/hpl-toolbox-0.1.0.vsix new file mode 100644 index 0000000000000000000000000000000000000000..d806e729e9a88f3b78a1f016f4b0ed0313a424ab GIT binary patch literal 65936 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 literal 0 HcmV?d00001 diff --git a/media/hpl.svg b/media/hpl.svg new file mode 100644 index 0000000..8c20dab --- /dev/null +++ b/media/hpl.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/media/icon.svg b/media/icon.svg new file mode 100644 index 0000000..671148a --- /dev/null +++ b/media/icon.svg @@ -0,0 +1 @@ + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cd2fb86 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,58 @@ +{ + "name": "hpl-toolbox", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hpl-toolbox", + "version": "0.1.0", + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "typescript": "^5.4.0" + }, + "engines": { + "vscode": "^1.85.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.118.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.118.0.tgz", + "integrity": "sha512-Ah6eTlqDcwIMELEVwQMO++rJAFBRz/oLluLD/vWdYrH1KuI9kfpaM+7pg0OvvascgcJy+ghLCERAYouM4QbzGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..924220e --- /dev/null +++ b/package.json @@ -0,0 +1,99 @@ +{ + "name": "hpl-toolbox", + "displayName": "HPL Toolbox", + "description": "Bundled tools: PLEC Upload, AppLovin Demo Upload, Base64 Asset Scanner, Daily Update.", + "version": "0.1.0", + "publisher": "hesukastro", + "engines": { + "vscode": "^1.85.0" + }, + "categories": ["Other"], + "icon": "media/hpl.png", + "main": "./out/extension.js", + "activationEvents": [], + "contributes": { + "commands": [ + { + "command": "hplToolbox.openPlecUpload", + "title": "HPL Toolbox: Open PLEC Upload" + }, + { + "command": "hplToolbox.openApplovinUpload", + "title": "HPL Toolbox: Open AppLovin Demo Upload" + }, + { + "command": "hplToolbox.openBase64Scanner", + "title": "HPL Toolbox: Open Base64 Scanner" + }, + { + "command": "hplToolbox.openDailyUpdate", + "title": "HPL Toolbox: Open Daily Update" + } + ], + "viewsContainers": { + "activitybar": [ + { + "id": "hplToolbox", + "title": "HPL Toolbox", + "icon": "media/hpl.png" + } + ] + }, + "views": { + "hplToolbox": [ + { + "type": "webview", + "id": "hplToolbox.launcher", + "name": "Tools" + } + ] + }, + "configuration": [ + { + "title": "HPL Toolbox — PLEC Upload", + "properties": { + "hplToolbox.plec.uploadUrl": { + "type": "string", + "default": "http://167.99.227.249/src/upload_HTML_Experimental.php", + "description": "Endpoint URL for the PLEC HTML upload script." + }, + "hplToolbox.plec.originUrl": { + "type": "string", + "default": "http://167.99.227.249", + "description": "Origin/Referer header sent with upload requests." + }, + "hplToolbox.plec.previewBase": { + "type": "string", + "default": "https://playable.applovindemo.com/phaser/", + "description": "Preview server base URL used to check if a filename already exists." + }, + "hplToolbox.plec.skipExistsCheck": { + "type": "boolean", + "default": false, + "description": "Skip the pre-check that verifies the filename does not already exist on the preview server." + } + } + }, + { + "title": "HPL Toolbox — AppLovin Upload", + "properties": { + "hplToolbox.applovin.cookie": { + "type": "string", + "default": "", + "description": "Value of the __Host-APPLOVINID cookie for p.applov.in (log in at https://p.applov.in/playablePreview?create=1&qr=1 and copy the cookie from DevTools)." + } + } + } + ] + }, + "scripts": { + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", + "vscode:prepublish": "npm run compile" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "@types/vscode": "^1.85.0", + "typescript": "^5.4.0" + } +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..4f05bab --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,18 @@ +import * as vscode from 'vscode'; +import { LauncherViewProvider } from './launcherView'; +import { openPlecUpload } from './tools/plecUpload'; +import { openApplovinUpload } from './tools/applovinUpload'; +import { openBase64Scanner } from './tools/base64Scanner'; +import { openDailyUpdate } from './tools/dailyUpdate'; + +export function activate(context: vscode.ExtensionContext) { + context.subscriptions.push( + vscode.commands.registerCommand('hplToolbox.openPlecUpload', () => openPlecUpload(context)), + vscode.commands.registerCommand('hplToolbox.openApplovinUpload', () => openApplovinUpload(context)), + vscode.commands.registerCommand('hplToolbox.openBase64Scanner', () => openBase64Scanner(context)), + vscode.commands.registerCommand('hplToolbox.openDailyUpdate', () => openDailyUpdate(context)), + vscode.window.registerWebviewViewProvider('hplToolbox.launcher', new LauncherViewProvider()) + ); +} + +export function deactivate() {} diff --git a/src/launcherView.ts b/src/launcherView.ts new file mode 100644 index 0000000..ecfddf1 --- /dev/null +++ b/src/launcherView.ts @@ -0,0 +1,65 @@ +import * as vscode from 'vscode'; + +export class LauncherViewProvider implements vscode.WebviewViewProvider { + resolveWebviewView(view: vscode.WebviewView) { + view.webview.options = { enableScripts: true }; + view.webview.html = getHtml(); + view.webview.onDidReceiveMessage((msg) => { + if (msg?.type === 'open' && typeof msg.command === 'string') { + vscode.commands.executeCommand(msg.command); + } + }); + } +} + +function getHtml(): string { + return ` + + + + + + +

HPL Toolbox

+ + + + + + +`; +} diff --git a/src/tools/applovinUpload.ts b/src/tools/applovinUpload.ts new file mode 100644 index 0000000..6c9ba3d --- /dev/null +++ b/src/tools/applovinUpload.ts @@ -0,0 +1,262 @@ +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; +import { File } from 'node:buffer'; +import { handleClipboardAndOpen, singletonPanel } from './shared'; + +const store: { panel: vscode.WebviewPanel | null } = { panel: null }; + +export function openApplovinUpload(_context: vscode.ExtensionContext) { + const { panel, isNew } = singletonPanel(store, 'hplToolbox.applovinUpload', 'AppLovin Demo Upload'); + if (!isNew) return; + + panel.webview.html = getHtml(); + panel.webview.onDidReceiveMessage(async (msg) => { + try { + if (handleClipboardAndOpen(msg)) return; + + if (msg.type === 'pickFiles') { + const picked = await vscode.window.showOpenDialog({ + canSelectMany: true, + filters: { HTML: ['html', 'htm'] }, + openLabel: 'Select', + }); + if (picked && picked.length) { + panel.webview.postMessage({ + type: 'filesSelected', + files: picked.map(u => ({ path: u.fsPath, name: path.basename(u.fsPath) })), + }); + } + return; + } + + if (msg.type === 'upload') { + await handleUpload(panel, msg.paths); + return; + } + } catch (err: any) { + panel.webview.postMessage({ type: 'error', message: err?.message || String(err) }); + } + }); +} + +async function handleUpload(panel: vscode.WebviewPanel, filePaths: string[]) { + const cfg = vscode.workspace.getConfiguration('hplToolbox.applovin'); + const cookie = (cfg.get('cookie') || '').trim(); + + const paths = Array.isArray(filePaths) ? filePaths : [filePaths]; + if (!paths.length) { + panel.webview.postMessage({ type: 'error', message: 'No files selected.' }); + return; + } + + const headers: Record = { + 'Accept': 'application/json, text/javascript, */*; q=0.01', + 'Origin': 'https://p.applov.in', + 'Referer': 'https://p.applov.in/playablePreview?create=1&qr=1', + 'X-Requested-With': 'XMLHttpRequest', + 'User-Agent': 'Mozilla/5.0 (HPL-Toolbox-VSCode)', + }; + if (cookie) headers['Cookie'] = `__Host-APPLOVINID=${cookie}`; + + const buildForm = (filePath: string): FormData => { + const buf = fs.readFileSync(filePath); + const file = new File([buf], path.basename(filePath), { type: 'text/html' }); + const form = new FormData(); + form.append('file', file as any); + return form; + }; + + panel.webview.postMessage({ type: 'start', total: paths.length }); + + for (let i = 0; i < paths.length; i++) { + const filePath = paths[i]; + const fileName = path.basename(filePath); + const idx = i + 1; + const reportError = (message: string) => { + panel.webview.postMessage({ type: 'fileError', name: fileName, message }); + }; + + if (!filePath || !fs.existsSync(filePath)) { reportError('File missing'); continue; } + if (!/\.html?$/i.test(filePath)) { reportError('Must be .html'); continue; } + + panel.webview.postMessage({ type: 'status', message: `[${idx}/${paths.length}] Validating ${fileName}...` }); + + let res: Response; + try { + res = await fetch('https://p.applov.in/validateHTMLContent', { + method: 'POST', body: buildForm(filePath), headers, + }); + } catch (err: any) { reportError('Network error (validate): ' + (err?.message || err)); continue; } + const validateText = await res.text(); + if (!res.ok) { reportError(`Validate HTTP ${res.status}: ${validateText.slice(0, 300)}`); continue; } + let validateJson: any; + try { validateJson = JSON.parse(validateText); } catch { validateJson = null; } + if (validateJson && validateJson.code && validateJson.code !== 200) { + reportError(`Validation failed: ${validateText.slice(0, 300)}`); continue; + } + + panel.webview.postMessage({ type: 'status', message: `[${idx}/${paths.length}] Uploading ${fileName}...` }); + + try { + res = await fetch('https://p.applov.in/getCachedAdURL', { + method: 'POST', body: buildForm(filePath), headers, + }); + } catch (err: any) { reportError('Network error (cache): ' + (err?.message || err)); continue; } + const cacheText = await res.text(); + if (!res.ok) { reportError(`Cache HTTP ${res.status}: ${cacheText.slice(0, 300)}`); continue; } + let cacheJson: any; + try { cacheJson = JSON.parse(cacheText); } + catch { reportError(`Non-JSON response: ${cacheText.slice(0, 300)}`); continue; } + const hash = cacheJson.results; + if (!hash) { reportError(`No hash in response: ${cacheText.slice(0, 300)}`); continue; } + + panel.webview.postMessage({ + type: 'fileResult', + name: fileName, + hash, + previewUrl: `https://p.applov.in/getPreviewHTML?preview=${hash}`, + pageUrl: `https://p.applov.in/playablePreview?preview=${hash}&qr=1`, + qrImg: `https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=${encodeURIComponent(hash)}`, + }); + } + + panel.webview.postMessage({ type: 'done' }); +} + +function getHtml(): string { + return ` + + + + + + +

AppLovin Playable Preview (QR)

+

Upload HTML files to p.applov.in and get QR codes to scan with the AppLovin Playable Preview app (iOS/Android). Requires the __Host-APPLOVINID cookie set in HPL Toolbox — AppLovin Upload settings.

+ +
+ + (no files) +
+
+ +
+
+
+ + + +`; +} diff --git a/src/tools/base64Scanner.ts b/src/tools/base64Scanner.ts new file mode 100644 index 0000000..66959ee --- /dev/null +++ b/src/tools/base64Scanner.ts @@ -0,0 +1,192 @@ +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; +import { singletonPanel } from './shared'; + +const store: { panel: vscode.WebviewPanel | null } = { panel: null }; + +export function openBase64Scanner(_context: vscode.ExtensionContext) { + const { panel, isNew } = singletonPanel(store, 'hplToolbox.base64Scanner', 'Base64 Asset Scanner'); + if (!isNew) return; + + panel.webview.html = getHtml(); + panel.webview.onDidReceiveMessage(async (msg) => { + if (msg.type === 'ready') { + const ws = vscode.workspace.workspaceFolders?.[0]; + if (ws) { + const distPath = path.join(ws.uri.fsPath, 'dist'); + if (fs.existsSync(distPath) && fs.statSync(distPath).isDirectory()) { + panel.webview.postMessage({ type: 'folderPicked', path: distPath }); + } + } + } else if (msg.type === 'pickFolder') { + const picked = await vscode.window.showOpenDialog({ + canSelectFolders: true, + canSelectFiles: false, + canSelectMany: false, + openLabel: 'Select Folder', + }); + if (picked && picked[0]) { + panel.webview.postMessage({ type: 'folderPicked', path: picked[0].fsPath }); + } + } else if (msg.type === 'scan') { + const folder: string = msg.folder; + if (!folder || !fs.existsSync(folder)) { + panel.webview.postMessage({ type: 'results', results: [], error: 'Invalid folder' }); + return; + } + const htmlFiles = await collectHtmlFiles(folder); + const results: { file: string; ok: boolean; assets: string[] }[] = []; + for (const file of htmlFiles) { + try { + const content = fs.readFileSync(file, 'utf8'); + const offenders = findNonBase64Assets(content); + results.push({ file: path.relative(folder, file), ok: offenders.length === 0, assets: offenders }); + } catch { + // skip unreadable + } + } + panel.webview.postMessage({ type: 'results', results }); + } + }); +} + +async function collectHtmlFiles(root: string): Promise { + const out: string[] = []; + const stack: string[] = [root]; + while (stack.length) { + const dir = stack.pop()!; + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + continue; + } + for (const e of entries) { + const full = path.join(dir, e.name); + if (e.isDirectory()) { + if (e.name === 'node_modules' || e.name === '.git') continue; + stack.push(full); + } else if (e.isFile() && /\.html?$/i.test(e.name)) { + out.push(full); + } + } + } + return out; +} + +function findNonBase64Assets(html: string): string[] { + const markup = html.replace(/]*>[\s\S]*?<\/script>/gi, ''); + const offenders = new Set(); + const attrRegex = /\b(?:src|href|poster|data-src)\s*=\s*("([^"]*)"|'([^']*)')/gi; + let m: RegExpExecArray | null; + while ((m = attrRegex.exec(markup)) !== null) { + const url = (m[2] ?? m[3] ?? '').trim(); + if (!url) continue; + if (isAssetReference(url) && !isBase64DataUri(url)) { + offenders.add(url); + } + } + const cssUrlRegex = /url\(\s*(?:"([^"]*)"|'([^']*)'|([^)]*))\s*\)/gi; + while ((m = cssUrlRegex.exec(markup)) !== null) { + const url = (m[1] ?? m[2] ?? m[3] ?? '').trim(); + if (!url) continue; + if (!isBase64DataUri(url)) { + offenders.add(url); + } + } + return [...offenders]; +} + +function isBase64DataUri(url: string): boolean { + return /^data:[^;,]*;base64,/i.test(url); +} + +function isAssetReference(url: string): boolean { + if (url.startsWith('#') || url.toLowerCase().startsWith('javascript:')) return false; + if (/^(mailto:|tel:)/i.test(url)) return false; + return true; +} + +function getHtml(): string { + return ` + + + + + + +

Base64 Asset Scanner

+
+ + + +
+
+
+ + +`; +} diff --git a/src/tools/dailyUpdate.ts b/src/tools/dailyUpdate.ts new file mode 100644 index 0000000..e678384 --- /dev/null +++ b/src/tools/dailyUpdate.ts @@ -0,0 +1,121 @@ +import * as vscode from 'vscode'; +import { singletonPanel } from './shared'; + +const PROJECT_KEY = 'hplToolbox.dailyUpdate.lastProject'; +const store: { panel: vscode.WebviewPanel | null } = { panel: null }; + +export function openDailyUpdate(context: vscode.ExtensionContext) { + const { panel, isNew } = singletonPanel(store, 'hplToolbox.dailyUpdate', 'Daily Update'); + if (!isNew) return; + + const lastProject = context.globalState.get(PROJECT_KEY, ''); + panel.webview.html = getHtml(lastProject); + + panel.webview.onDidReceiveMessage(async (msg) => { + if (msg.type === 'submit') { + const text = formatMessage(msg.payload); + await vscode.env.clipboard.writeText(text); + await context.globalState.update(PROJECT_KEY, msg.payload.project); + vscode.window.showInformationMessage('Daily update copied to clipboard.'); + panel.dispose(); + } + }); +} + +function formatMessage(p: { date: string; status: string; project: string; remarks: string }): string { + const bullets = p.remarks + .split(/\r?\n/) + .map((l) => l.replace(/^\s*[-*]\s*/, '').trim()) + .filter((l) => l.length > 0) + .map((l) => `- ${l}`) + .join('\n'); + + const lines = [ + `Date: ${formatDate(p.date)}`, + `Status: ${p.status}`, + `Project: ${p.project}`, + `Remarks:`, + bullets, + ]; + + if (p.status === 'For OT') { + lines.push('@Joyce Lanot , @Reland Pigte, @Anthony Castor, @Angela Grace'); + } + + return lines.join('\n'); +} + +function formatDate(iso: string): string { + const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(iso); + if (!m) return iso; + return `${m[2]}/${m[3]}/${m[1]}`; +} + +function escapeAttr(s: string): string { + return s.replace(/&/g, '&').replace(/"/g, '"').replace(//g, '>'); +} + +function getHtml(lastProject: string): string { + const today = new Date().toISOString().slice(0, 10); + return ` + + + + + + + +

Daily Update

+
Submit copies the formatted text to your clipboard.
+ + + + + + + + + + + + + + + + + +`; +} diff --git a/src/tools/plecUpload.ts b/src/tools/plecUpload.ts new file mode 100644 index 0000000..6cc6df8 --- /dev/null +++ b/src/tools/plecUpload.ts @@ -0,0 +1,347 @@ +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; +import { File } from 'node:buffer'; +import { handleClipboardAndOpen, singletonPanel } from './shared'; + +const store: { panel: vscode.WebviewPanel | null } = { panel: null }; + +export function openPlecUpload(_context: vscode.ExtensionContext) { + const { panel, isNew } = singletonPanel(store, 'hplToolbox.plecUpload', 'PLEC Upload'); + if (!isNew) return; + + panel.webview.html = getHtml(); + panel.webview.onDidReceiveMessage(async (msg) => { + try { + if (handleClipboardAndOpen(msg)) return; + + if (msg.type === 'pickFile') { + const picked = await vscode.window.showOpenDialog({ + canSelectMany: false, + filters: { HTML: ['html', 'htm'] }, + openLabel: 'Select', + }); + if (picked && picked[0]) { + const fp = picked[0].fsPath; + panel.webview.postMessage({ + type: 'fileSelected', + rowId: msg.rowId, + path: fp, + name: path.basename(fp), + }); + } + return; + } + + if (msg.type === 'upload') { + await handleUpload(panel, msg.rows); + return; + } + } catch (err: any) { + panel.webview.postMessage({ type: 'error', message: err?.message || String(err) }); + } + }); +} + +interface UploadRow { + id: string; + path: string; + iteration: string; +} + +async function handleUpload(panel: vscode.WebviewPanel, rows: UploadRow[]) { + const cfg = vscode.workspace.getConfiguration('hplToolbox.plec'); + const uploadUrl = cfg.get('uploadUrl')!; + const originUrl = cfg.get('originUrl')!; + const previewBase = cfg.get('previewBase')!; + const skipExistsCheck = cfg.get('skipExistsCheck')!; + + const valid: UploadRow[] = []; + for (const r of rows) { + if (!r.path || !fs.existsSync(r.path)) { + panel.webview.postMessage({ type: 'rowError', rowId: r.id, message: 'File missing' }); + return; + } + if (!r.iteration || !r.iteration.trim()) { + panel.webview.postMessage({ type: 'rowError', rowId: r.id, message: 'Iteration name required' }); + return; + } + if (!/\.html?$/i.test(r.path)) { + panel.webview.postMessage({ type: 'rowError', rowId: r.id, message: 'Must be .html' }); + return; + } + valid.push(r); + } + if (valid.length === 0) { + panel.webview.postMessage({ type: 'error', message: 'Nothing to upload.' }); + return; + } + + panel.webview.postMessage({ type: 'status', message: 'Checking filename availability...' }); + + if (!skipExistsCheck) { + for (const r of valid) { + const fname = path.basename(r.path); + const exists = await checkFileExists(previewBase + encodeURIComponent(fname)); + if (exists === true) { + panel.webview.postMessage({ + type: 'rowError', + rowId: r.id, + message: `Filename "${fname}" already exists on preview server. Rename and retry.`, + }); + return; + } + } + } + + panel.webview.postMessage({ type: 'status', message: 'Uploading...' }); + + const form = new FormData(); + for (let i = 0; i < valid.length; i++) { + const r = valid[i]; + const idx = i + 1; + const buf = fs.readFileSync(r.path); + const file = new File([buf], path.basename(r.path), { type: 'text/html' }); + form.append(`fileUpload_${idx}`, file as any); + form.append(`iterationNameUpload_${idx}`, encodeURI(r.iteration.replace(/\s+/g, ''))); + } + + let res: Response; + try { + res = await fetch(uploadUrl, { + method: 'POST', + body: form, + headers: { + 'Origin': originUrl, + 'Referer': originUrl + '/', + 'User-Agent': 'Mozilla/5.0 (HPL-Toolbox-VSCode)', + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': '*/*', + }, + }); + } catch (err: any) { + panel.webview.postMessage({ type: 'error', message: 'Network error: ' + (err?.message || err) }); + return; + } + + const text = await res.text(); + if (!res.ok) { + panel.webview.postMessage({ + type: 'error', + message: `HTTP ${res.status}\n${text.slice(0, 800)}`, + }); + return; + } + + let json: any; + try { json = JSON.parse(text); } + catch { + panel.webview.postMessage({ + type: 'error', + message: `Server returned non-JSON:\n${text.slice(0, 800)}`, + }); + return; + } + + const preview = json.preview || json.previewURL || null; + panel.webview.postMessage({ type: 'result', preview, raw: json, rawText: text }); +} + +async function checkFileExists(url: string): Promise { + try { + const res = await fetch(url, { method: 'HEAD' }); + if (res.status === 200) return true; + if (res.status === 404) return false; + return null; + } catch { + return null; + } +} + +function getHtml(): string { + return ` + + + + + + +

PLEC Upload

+

Pick HTML files, give each an iteration name, then upload. The preview link is returned by the server.

+ + + + + + + + + + +
HTML FileIteration Name
+ +
+ + +
+ +
+
+ + + +`; +} diff --git a/src/tools/shared.ts b/src/tools/shared.ts new file mode 100644 index 0000000..6e1a374 --- /dev/null +++ b/src/tools/shared.ts @@ -0,0 +1,34 @@ +import * as vscode from 'vscode'; + +export function handleClipboardAndOpen(msg: any): boolean { + if (msg?.type === 'copy' && typeof msg.text === 'string') { + vscode.env.clipboard.writeText(msg.text); + vscode.window.showInformationMessage('Copied to clipboard.'); + return true; + } + if (msg?.type === 'open' && typeof msg.text === 'string') { + vscode.env.openExternal(vscode.Uri.parse(msg.text)); + return true; + } + return false; +} + +export function singletonPanel( + store: { panel: vscode.WebviewPanel | null }, + viewType: string, + title: string +): { panel: vscode.WebviewPanel; isNew: boolean } { + if (store.panel) { + store.panel.reveal(); + return { panel: store.panel, isNew: false }; + } + const panel = vscode.window.createWebviewPanel( + viewType, + title, + vscode.ViewColumn.Active, + { enableScripts: true, retainContextWhenHidden: true } + ); + store.panel = panel; + panel.onDidDispose(() => { store.panel = null; }); + return { panel, isNew: true }; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..312f630 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "ES2020", + "outDir": "out", + "lib": ["ES2020", "DOM"], + "sourceMap": true, + "rootDir": "src", + "strict": true, + "esModuleInterop": true + }, + "exclude": ["node_modules", ".vscode-test"] +}