Add some future logic for getting release files from GitHub
jdarwood007

jdarwood007 commited on 2023-07-11 19:27:56
Showing 1 changed files, with 63 additions and 4 deletions.

... ...
@@ -5,7 +5,7 @@
5 5
 	<title>SMF Package Parser</title>
6 6
 	<meta name="robots" content="noindex, nofollow">
7 7
 	<meta name="googlebot" content="noindex, nofollow">
8
-	<meta http-equiv='Content-Security-Policy' CONTENT="default-src 'self'; script-src 'self' 'unsafe-inline' cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' cdn.jsdelivr.net; img-src 'self' data: *; media-src 'self'; connect-src 'self' custom.simplemachines.org github.com; worker-src 'self' data: blob:;">`
8
+	<meta http-equiv='Content-Security-Policy' CONTENT="default-src 'self'; script-src 'self' 'unsafe-inline' cdn.jsdelivr.net esm.sh; style-src 'self' 'unsafe-inline' cdn.jsdelivr.net; img-src 'self' data: *; media-src 'self'; connect-src 'self' custom.simplemachines.org *.github.com github.com objects.githubusercontent.com; worker-src 'self' data: blob:;">`
9 9
 	<meta name="viewport" content="width=device-width, initial-scale=1">
10 10
 	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KK94CHFLLe+nY2dmCWGMq91rCGa5gtU4mk92HdvYe+M/SXH301p5ILy+dN9+nJOZ" crossorigin="anonymous">
11 11
 	<link rel="modulepreload" crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js">
... ...
@@ -160,7 +160,10 @@
160 160
 		import bbCodeParser from 'https://cdn.jsdelivr.net/npm/js-bbcode-parser@4.0.0/src/simple.min.js';
161 161
 		window.bbcParser = bbCodeParser;
162 162
 	</script>
163
-
163
+	<script type="module">
164
+		import { Octokit } from 'https://cdn.jsdelivr.net/npm/@octokit/core@5.0.0/+esm';
165
+		window.octokit = new Octokit({});
166
+	</script>
164 167
 	<script type="text/javascript" src="./Parser.js"></script>
165 168
 	<script type="text/javascript" src="./languages/en-us.js"></script>
166 169
 	<script type="text/javascript">
... ...
@@ -189,9 +192,65 @@
189 192
 			document.getElementById('myfile').addEventListener('change', uploadFileToJS);
190 193
 		});
191 194
 		
192
-		document.getElementById('file').addEventListener('change', function(){
193
-			FileName = document.getElementById('file').value;
195
+		document.getElementById('file').addEventListener('change', async function(){
196
+			const FileName = document.getElementById('file').value;
197
+			
198
+			const repoMatch = /https:\/\/github.com\/([^/]+)\/([^/$]+)\/?$/i;
199
+			const found = FileName.match(repoMatch);
200
+
201
+			if (typeof found === 'undefined' || found === null || !("1" in found) || !("2" in found))
202
+			{
203
+				console.debug('Unable to match USERNAME and REPO from requested URL');
204
+				
194 205
 				runParser(FileName);
206
+				return;
207
+			}
208
+			const OWNER = found[1];
209
+			const REPO = found[2];
210
+
211
+			const release = await octokit.request('GET /repos/' + OWNER + '/' + REPO + '/releases/latest', {
212
+				owner: OWNER,
213
+				repo: REPO,
214
+			});
215
+
216
+			if (release.data.id === null)
217
+			{
218
+				console.debug('Unable to find a release ID');
219
+				return;
220
+			}
221
+	
222
+			const assets = await octokit.request('GET /repos/' + OWNER + '/' + REPO + '/releases/' + release.data.id + 'latest', {
223
+				owner: OWNER,
224
+				repo: REPO,
225
+				release_id: release.data.id
226
+			});
227
+
228
+			if (assets.data.assets === null || assets.data.assets.length == 0)
229
+			{
230
+				console.debug('Unable to find any assets');
231
+				return;
232
+			}
233
+
234
+			let asset = null;
235
+			assets.data.assets.forEach(function(data, index, theArray) {
236
+				if (asset === null && (data.name.indexOf("tgz") > 0 || data.name.indexOf("tar.gz") > 0 || data.name.indexOf("zip") > 0))
237
+				{
238
+					asset = data;
239
+					return;
240
+				}
241
+			});
242
+
243
+			const fileData = await octokit.request('GET /repos/' + OWNER + '/' + REPO + '/releases/assets/' + asset.id, {
244
+				owner: OWNER,
245
+				repo: REPO,
246
+				asset_id: asset.id,
247
+				headers: {
248
+					'Accept': 'application/octet-stream'
249
+				}
250
+			});
251
+
252
+			console.log(fileData);
253
+			// !! TODO File is a blob, can we just send to runParser?
195 254
 		});
196 255
 	</script>
197 256
 </body>
198 257