Advertisement
demondownload

Wildsea Import

May 23rd, 2024 (edited)
607
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const parseFile = async (html) => {
  2.   const file = html.find('#file')[0].files[0]
  3.   const packId = html.find('#packId')[0].value
  4.  
  5.   var reader = new FileReader()
  6.   const pack = game.packs.get(packId)
  7.   const nameRegex = /([A-Za-z \!\"\'\-]+)\s\[([A-Za-z ]+)\]/
  8.   reader.onload = async (e) => {
  9.     const contents = parseCSV(e.target.result)
  10.     for (const row of contents) {
  11.       try {
  12.         const [category, label, nameTag, track, details] = row
  13.         if (nameTag === '') continue
  14.  
  15.         let categoryFolder = pack.folders.contents.filter(
  16.           (f) => f.name === category.trim(),
  17.         )[0]
  18.         if (!categoryFolder) {
  19.           categoryFolder = await Folder.create(
  20.             { name: category.trim(), type: 'Item' },
  21.             { pack: packId },
  22.           )
  23.         }
  24.  
  25.         let labelFolder = pack.folders.contents.filter(
  26.           (f) => f.name === label.trim(),
  27.         )[0]
  28.         if (!labelFolder) {
  29.           labelFolder = await Folder.create(
  30.             { name: label.trim(), type: 'Item', folder: categoryFolder },
  31.             { pack: packId },
  32.           )
  33.         }
  34.  
  35.         const [_match, name, tag] = nameTag.match(nameRegex)
  36.  
  37.         itemData = {
  38.           name: name.trim(),
  39.           type: 'aspect',
  40.           system: {
  41.             track: { max: track },
  42.             details,
  43.             type: tag,
  44.           },
  45.           folder: labelFolder._id,
  46.         }
  47.         await Item.create(itemData, { pack: packId, keepId: true })
  48.       } catch (e) {
  49.         ui.notifications.warn(`Import failed for ${row.join(',')}`)
  50.         console.log(e, row)
  51.         continue
  52.       }
  53.     }
  54.     ui.notifications.info('Complete')
  55.   }
  56.   reader.readAsText(file)
  57. }
  58.  
  59. function parseCSV(str) {
  60.   const arr = []
  61.   let quote = false
  62.   for (let row = 0, col = 0, c = 0; c < str.length; c++) {
  63.     let cc = str[c],
  64.       nc = str[c + 1]
  65.     arr[row] = arr[row] || []
  66.     arr[row][col] = arr[row][col] || ''
  67.     if (cc == '"' && quote && nc == '"') {
  68.       arr[row][col] += cc
  69.       ++c
  70.       continue
  71.     }
  72.     if (cc == '"') {
  73.       quote = !quote
  74.       continue
  75.     }
  76.     if (cc == ',' && !quote) {
  77.       ++col
  78.       continue
  79.     }
  80.     if (cc == '\r' && nc == '\n' && !quote) {
  81.       ++row
  82.       col = 0
  83.       ++c
  84.       continue
  85.     }
  86.     if (cc == '\n' && !quote) {
  87.       ++row
  88.       col = 0
  89.       continue
  90.     }
  91.     if (cc == '\r' && !quote) {
  92.       ++row
  93.       col = 0
  94.       continue
  95.     }
  96.     arr[row][col] += cc
  97.   }
  98.   return arr
  99. }
  100.  
  101. await new Promise((resolve) => {
  102.   new Dialog({
  103.     title: 'Import CSV File to RollTable',
  104.     content: `<form>
  105.         <div class="form-group">
  106.           <label style="max-width:100px">File</label>
  107.           <div class="form-fields">
  108.             <input id="file" type="file"/>
  109.           </div>
  110.         </div>
  111.         <div class="form-group">
  112.           <label style="max-width: 100px">Pack ID</label>
  113.           <div class="form-fields">
  114.             <input id="packId" type="text" placeholder="world.wildsea" />
  115.           </div>
  116.         </div>
  117.       </form>`,
  118.     buttons: {
  119.       roll: {
  120.         icon: '<i class="fas fa-file-import"></i>',
  121.         label: 'Import',
  122.         callback: (html) => resolve(parseFile(html)),
  123.       },
  124.     },
  125.     close: () => resolve(null),
  126.   }).render(true)
  127. })
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement