pasta
This commit is contained in:
		
							parent
							
								
									5e0c7153b9
								
							
						
					
					
						commit
						0a9b76f9c7
					
				
					 5 changed files with 143 additions and 3589 deletions
				
			
		|  | @ -9,8 +9,11 @@ export const getBorderById = async (id) => { | ||||||
|   }); |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const getAllBorders = async () => { | export const getAllBorders = async (limit = undefined, cursor = undefined) => { | ||||||
|   return await prisma.borderImage.findMany(); |   return await prisma.borderImage.findMany({ | ||||||
|  |     take: limit, | ||||||
|  |     cursor: cursor, | ||||||
|  |   }); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| export const getUserBorders = async (req) => { | export const getUserBorders = async (req) => { | ||||||
|  |  | ||||||
|  | @ -7,7 +7,8 @@ | ||||||
|     "build": "next build", |     "build": "next build", | ||||||
|     "start": "next start", |     "start": "next start", | ||||||
|     "lint": "next lint", |     "lint": "next lint", | ||||||
|     "ingest": "node util/ingest.js" |     "ingest": "node util/ingest.js", | ||||||
|  |     "get_data": "node util/get_data.js" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|     "@next-auth/prisma-adapter": "^1.0.3", |     "@next-auth/prisma-adapter": "^1.0.3", | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										114
									
								
								util/get_data.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								util/get_data.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,114 @@ | ||||||
|  | const dotenv = require("dotenv"); | ||||||
|  | dotenv.config(); | ||||||
|  | const { URL, URLSearchParams } = require("url"); | ||||||
|  | const fs = require("fs"); | ||||||
|  | const path = require("path"); | ||||||
|  | 
 | ||||||
|  | const key = process.env.STEAM_API_KEY; | ||||||
|  | 
 | ||||||
|  | let appIds = {}; | ||||||
|  | 
 | ||||||
|  | async function makeReq(cursor) { | ||||||
|  |   const fetch = await import("node-fetch"); | ||||||
|  |   const url = new URL( | ||||||
|  |     "https://api.steampowered.com/ILoyaltyRewardsService/QueryRewardItems/v1/" | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   const searchParams = new URLSearchParams({ | ||||||
|  |     key, | ||||||
|  |     "community_item_classes[0]": 14, | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  |   if (cursor !== null) searchParams.set("cursor", cursor); // pagination
 | ||||||
|  |   url.search = searchParams; | ||||||
|  | 
 | ||||||
|  |   const req = await fetch.default(url); | ||||||
|  |   const json = await req.json(); | ||||||
|  |   return json.response; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function getAppInfo(appid) { | ||||||
|  |   if (appIds[appid]) { | ||||||
|  |     return appIds[appid]; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const fetch = await import("node-fetch"); | ||||||
|  |   const url = new URL( | ||||||
|  |     "https://api.steampowered.com/IStoreService/GetAppList/v1/" | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   // what the fuck this is a hack
 | ||||||
|  |   // todo: paginate all app info and store it instead of querying the api 447 times
 | ||||||
|  |   const searchParams = new URLSearchParams({ | ||||||
|  |     key, | ||||||
|  |     last_appid: parseInt(appid) - 1, | ||||||
|  |     max_results: 1, | ||||||
|  |   }); | ||||||
|  |   url.search = searchParams; | ||||||
|  | 
 | ||||||
|  |   const req = await fetch.default(url); | ||||||
|  |   const json = await req.json(); | ||||||
|  |   appIds[appid] = json.response.apps[0]; | ||||||
|  |   return json.response.apps[0]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function main() { | ||||||
|  |   const borders = []; | ||||||
|  |   let cursor = null; | ||||||
|  | 
 | ||||||
|  |   let total = 0; | ||||||
|  |   let done = 0; | ||||||
|  | 
 | ||||||
|  |   while (true) { | ||||||
|  |     const json = await makeReq(cursor); | ||||||
|  | 
 | ||||||
|  |     cursor = json.next_cursor; | ||||||
|  |     total = json.total_count; | ||||||
|  |     if (json.count === 0) break; // found all borders
 | ||||||
|  | 
 | ||||||
|  |     for (const border of json.definitions) { | ||||||
|  |       const appid = border.appid; | ||||||
|  |       const name = border.community_item_data.item_name; | ||||||
|  | 
 | ||||||
|  |       const filename_large = border.community_item_data.item_image_large; | ||||||
|  |       if (filename_large == "c05c0155855b74c28e0f6e9417d4afa3c99d76ef.png") { | ||||||
|  |         console.log(border); | ||||||
|  |       } | ||||||
|  |       const filename_small = border.community_item_data.item_image_small; | ||||||
|  | 
 | ||||||
|  |       const appInfo = await getAppInfo(appid); | ||||||
|  | 
 | ||||||
|  |       const borderURL = `https://cdn.akamai.steamstatic.com/steamcommunity/public/images/items/${appid}`; | ||||||
|  | 
 | ||||||
|  |       if (filename_large != undefined) { | ||||||
|  |         borders.push({ | ||||||
|  |           name: `${name}-LARGE`, | ||||||
|  |           borderURL: `${borderURL}/${filename_large}`, | ||||||
|  |           appInfo, | ||||||
|  |         }); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       if (filename_small != undefined) { | ||||||
|  |         borders.push({ | ||||||
|  |           name: `${name}-SMALL`, | ||||||
|  |           borderURL: `${borderURL}/${filename_small}`, | ||||||
|  |           appInfo, | ||||||
|  |         }); | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       done++; | ||||||
|  |       console.log(`${done}/${total}`); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   const cwd = process.cwd(); | ||||||
|  |   const filePath = path.join( | ||||||
|  |     cwd, | ||||||
|  |     cwd.includes("util") ? ".." : "", | ||||||
|  |     "util/border_data.json" | ||||||
|  |   ); | ||||||
|  | 
 | ||||||
|  |   fs.writeFileSync(filePath, JSON.stringify(borders)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | main(); | ||||||
|  | @ -40,6 +40,7 @@ let catalogue = async () => { | ||||||
|       const added = await prisma.borderImage.create({ |       const added = await prisma.borderImage.create({ | ||||||
|         data: { |         data: { | ||||||
|           imageName: item, |           imageName: item, | ||||||
|  |           appName: "Manually added", | ||||||
|         }, |         }, | ||||||
|       }); |       }); | ||||||
|       numAdded++; |       numAdded++; | ||||||
|  | @ -58,16 +59,23 @@ let download = async () => { | ||||||
|   ); |   ); | ||||||
|   const json_data = JSON.parse(fs.readFileSync(filePath)); |   const json_data = JSON.parse(fs.readFileSync(filePath)); | ||||||
|   let numAdded = 0; |   let numAdded = 0; | ||||||
|   for (let value of json_data) { |   for (let key in json_data) { | ||||||
|  |     let value = json_data[key]; | ||||||
|     if (!value) continue; |     if (!value) continue; | ||||||
|     const filename_regex = |     const filename_regex = | ||||||
|       /https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/items\/\d+\/(.+\.png)/gi; |       /https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/items\/\d+\/\/?(.+\.(a?png|gif))/gi; | ||||||
|     const filename = filename_regex.exec(value.borderURL)[1]; |     const file_match = filename_regex.exec(value.borderURL); | ||||||
|  |     if (!file_match || file_match == null) { | ||||||
|  |       console.error("MATCH ERROR", value.borderURL); | ||||||
|  |     } | ||||||
|  |     const filename = file_match[1].replace("apng", "png"); | ||||||
| 
 | 
 | ||||||
|     if (!list.includes(filename)) { |     if (!list.includes(filename)) { | ||||||
|       console.log("N", filename); |       console.log("N", filename); | ||||||
|  |       setTimeout(async () => { | ||||||
|         let data = await fetch.default(value.borderURL); |         let data = await fetch.default(value.borderURL); | ||||||
|         data.body.pipe(fs.createWriteStream(path.join(folder, filename))); |         data.body.pipe(fs.createWriteStream(path.join(folder, filename))); | ||||||
|  |       }, key * 100); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const result = await prisma.borderImage.findFirst({ |     const result = await prisma.borderImage.findFirst({ | ||||||
|  | @ -76,7 +84,11 @@ let download = async () => { | ||||||
|       }, |       }, | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     if (!result.appId || !result.appName || !result.borderName) { |     if ( | ||||||
|  |       result?.appId != value.appInfo.appid || | ||||||
|  |       result?.appName != value.appInfo.name || | ||||||
|  |       result?.borderName != value.name | ||||||
|  |     ) { | ||||||
|       const added = await prisma.borderImage.upsert({ |       const added = await prisma.borderImage.upsert({ | ||||||
|         create: { |         create: { | ||||||
|           imageName: filename, |           imageName: filename, | ||||||
|  | @ -94,7 +106,7 @@ let download = async () => { | ||||||
|           imageName: filename, |           imageName: filename, | ||||||
|         }, |         }, | ||||||
|       }); |       }); | ||||||
|       console.log(added); |       // console.log(added);
 | ||||||
|       numAdded++; |       numAdded++; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | @ -104,5 +116,6 @@ let download = async () => { | ||||||
| download().then(() => { | download().then(() => { | ||||||
|   catalogue().then(() => { |   catalogue().then(() => { | ||||||
|     console.log("done."); |     console.log("done."); | ||||||
|  |     console.log("waiting for image catch up to finish..."); | ||||||
|   }); |   }); | ||||||
| }); | }); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue