// Includes
const http = require('../util/http.js').func
const getGeneralToken = require('../util/getGeneralToken').func
// Args
exports.required = ['data']
exports.optional = ['itemOptions', 'assetId', 'jar']
// Docs
/**
* 🔐 Upload a model.
* @category Asset
* @alias uploadModel
* @param {string | Stream} data - The model data.
* @param {object=} itemOptions - The options for the upload.
* @param {string=} itemOptions.name - The name of the model.
* @param {string=} itemOptions.description - The description for the model.
* @param {boolean=} itemOptions.copyLocked - If the model is copy-locked.
* @param {boolean=} itemOptions.allowComments - If comments are allowed.
* @param {number=} itemOptions.groupId - The group to upload the model to.
* @param {number=} assetId - An existing assetId to overwrite.
* @returns {Promise<UploadModelResponse>}
* @example const noblox = require("noblox.js")
* const fs = require("fs")
* // Login using your cookie
* noblox.uploadModel(fs.readFileSync("./model.rbxm"), {
* name: "A cool model",
* description: "This is a very cool model",
* copyLocked: false, //The asset is allowed to be copied.
* allowComments: false,
* groupId: 1
* }, 1117747196)
**/
// Define
function upload (data, itemOptions, assetId, jar, token) {
const httpOpt = {
url: '//data.roblox.com/Data/Upload.ashx?json=1&assetid=' + (assetId || 0),
options: {
resolveWithFullResponse: true,
method: 'POST',
jar,
body: data,
headers: {
'X-CSRF-TOKEN': token,
'Content-Type': 'application/xml'
}
}
}
if (itemOptions) {
const copyLocked = itemOptions.copyLocked
const allowComments = itemOptions.allowComments
httpOpt.url += '&type=Model&genreTypeId=1&name=' +
itemOptions.name +
'&description=' +
(itemOptions.description || '') +
'&ispublic=' +
(copyLocked != null ? !copyLocked : false) +
'&allowComments=' +
(allowComments != null ? allowComments : true) +
'&groupId=' +
(itemOptions.groupId || '')
} else if (!assetId) {
throw new Error('ItemOptions is required for new assets.')
}
return http(httpOpt)
.then(function (res) {
if (res.statusCode === 200) {
const body = res.body
let parsed
try {
parsed = JSON.parse(body)
} catch (e) {
throw new Error('Could not parse JSON, returned body:' + body)
}
return parsed
} else {
throw new Error('Upload failed, confirm that all item options, asset options, and upload data are valid.')
}
})
}
exports.func = function (args) {
const jar = args.jar
return getGeneralToken({
jar
}).then(function (token) {
return upload(args.data, args.itemOptions, args.assetId, args.jar, token)
})
}
Source