cubash-archive/routes/avatar.js

137 lines
7.9 KiB
JavaScript

let express = require('express')
let router = express.Router()
const auth = require('../lib/auth')
var fs = require("fs");
const rateLimit = require("express-rate-limit");
const { exec } = require('child_process');
const cryptoRandomString = require("crypto-random-string")
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 3,
message: "You are being rate limited"
});
let { User, Sequelize, Item } = require('../models')
const Errors = require('../lib/errors')
var randomString = (Math.random().toString(36).substring(2))
router.post("/refresh", limiter, auth, async(req, res, next) => {
let user = await User.findOne({ where: {
id: req.userData.UserId
}
})
if(!user) {
throw Errors.unknown
}
if(user.pantsId) {
var pantsModel = await Item.findOne({
where: {
id: user.pantsId
}
})
}
if(user.hatId) {
var hatModel = await Item.findOne({
where: {
id: user.hatId
}
})
}
if(user.faceId) {
var faceModel = await Item.findOne({
where: {
id: user.faceId
}
})
}
if(user.shirtId) {
var shirtModel = await Item.findOne({
where: {
id: user.shirtId
}
})
}
console.log(user)
let rootPathRender = "C:/Users/matth/Documents/GitHub/website/";
let img2 = cryptoRandomString({length: 32})
let img = img2
var blendFilePath = rootPathRender + "rendering/avatar.blend";
var imageSavePath = "C:/xampp21/htdocs/user/avatars/full/" + img + ".png";
var pythonFilePath = "rendering/usercontent/"+req.userData.UserId+".py";
if(user.faceId) {
var faceFilePath = rootPathRender + "rendering/global/" + faceModel.sourceFile + ".png";
} else {
var faceFilePath = rootPathRender + "rendering/global/defaultFace.png";
}
if(user.shirtId) {
var shirtFilePath = rootPathRender + "rendering/global/" + shirtModel.sourceFile + ".png"; // should be set to 0 by default, 0.png will just be a transparent image
} else {
var shirtFilePath = rootPathRender + "rendering/global/0.png"; // should be set to 0 by default, 0.png will just be a transparent image
}
if(user.pantsId) {
var pantsFilePath = rootPathRender + "rendering/global/" + pantsModel.sourceFile + ".png"; // should be set to 0 by default, 0.png will just be a transparent image
} else {
var pantsFilePath = rootPathRender + "rendering/global/0.png"; // should be set to 0 by default, 0.png will just be a transparent image
}
if(user.hatId) {
var hatFilePath = rootPathRender + "rendering/hats/" + hatModel.sourceFile + ".obj"
var hat = "hat_import = bpy.ops.import_scene.obj(filepath='"+hatFilePath+"')\nhat = bpy.context.selected_objects[0]\nbpy.context.selected_objects[0].data.name = 'hat'\nbpy.context.selected_objects[0].name = 'hat'\nhat_material = bpy.data.materials.new('hat')\nhat_material.diffuse_shader = 'LAMBERT'\nhat.active_material = hat_material\nhat_image = bpy.data.images.load(filepath = '" + rootPathRender + "rendering/hats/"+hatModel.sourceFile+".png')\nhat_texture = bpy.data.textures.new('ColorTex', type = 'IMAGE')\nhat_texture.image = hat_image\nhat_add = bpy.data.objects['hat'].active_material.texture_slots.add()\nhat_add.texture = hat_texture";
} else {
var hat = ''
}
var imports = "import bpy";
var functions = "def hex_to_rgb(value):\n gamma = 2.05\n value = value.lstrip('#')\n lv = len(value)\n fin = list(int(value[i:i + lv // 3], 16) for i in range(0, lv, lv // 3))\n r = pow(fin[0] / 255, gamma)\n g = pow(fin[1] / 255, gamma)\n b = pow(fin[2] / 255, gamma)\n fin.clear()\n fin.append(r)\n fin.append(g)\n fin.append(b)\n return tuple(fin)";
var blenderImport = "bpy.ops.wm.open_mainfile(filepath='"+blendFilePath+"')";
var headColor = "bpy.data.objects['Head'].select = True\nbpy.data.materials['Head'].diffuse_color = hex_to_rgb('"+user.headColor+"')\nbpy.data.materials['Face'].diffuse_color = hex_to_rgb('"+user.headColor+"')";
var leftArmColor = "bpy.data.objects['Left Arm'].select = True\nbpy.data.objects['Left Arm'].active_material.diffuse_color = hex_to_rgb('"+user.leftArmColor+"')";
var rightArmColor = "bpy.data.objects['Right Arm'].select = True\nbpy.data.objects['Right Arm'].active_material.diffuse_color = hex_to_rgb('"+user.rightArmColor+"')";
var bodyColor = "bpy.data.objects['Torso'].select = True\nbpy.data.objects['Torso'].active_material.diffuse_color = hex_to_rgb('"+user.color+"')";
var leftLegColor = "bpy.data.objects['Left Leg'].select = True\nbpy.data.objects['Left Leg'].active_material.diffuse_color = hex_to_rgb('"+user.leftLegColor+"')";
var rightLegColor = "bpy.data.objects['Right Leg'].select = True\nbpy.data.objects['Right Leg'].active_material.diffuse_color = hex_to_rgb('"+user.rightLegColor+"')";
var colors = headColor+"\n"+leftArmColor+"\n"+bodyColor+"\n"+rightArmColor+"\n"+leftLegColor+"\n"+rightLegColor;
if(user.hatId) {
var hat = "hat_import = bpy.ops.import_scene.obj(filepath='"+hatFilePath+"')\nhat = bpy.context.selected_objects[0]\nbpy.context.selected_objects[0].data.name = 'hat'\nbpy.context.selected_objects[0].name = 'hat'\nhat_material = bpy.data.materials.new('hat')\nhat_material.diffuse_shader = 'LAMBERT'\nhat.active_material = hat_material\nhat_image = bpy.data.images.load(filepath = '" + rootPathRender + "rendering/hats/"+user.hatID+".png')\nhat_texture = bpy.data.textures.new('ColorTex', type = 'IMAGE')\nhat_texture.image = hat_image\nhat_add = bpy.data.objects['hat'].active_material.texture_slots.add()\nhat_add.texture = hat_texture";
} else {
var hat = ''
}
var face = "face_Image = bpy.data.images.load(filepath = '"+faceFilePath+"')\nbpy.data.textures['Face'].image = face_Image";
var shirt = "shirt_Image = bpy.data.images.load(filepath = '"+shirtFilePath+"')\nbpy.data.textures['Shirt'].image = shirt_Image\nbpy.data.textures['ShirtR'].image = shirt_Image\nbpy.data.textures['ShirtL'].image = shirt_Image";
var pants = "pants_Image = bpy.data.images.load(filepath = '"+pantsFilePath+"')\nbpy.data.textures['PantsR'].image = pants_Image\nbpy.data.textures['PantsL'].image = pants_Image";
var render = "for obj in bpy.data.objects:\n obj.select = False\n bpy.ops.object.select_all(action='SELECT')\nbpy.ops.view3d.camera_to_view_selected()\nscene = bpy.context.scene\nscene.render.image_settings.file_format = 'PNG'\nscene.render.filepath = '"+imageSavePath+"'\nbpy.ops.render.render(write_still = 1)";
var python = imports+"\n"+functions+"\n"+blenderImport+"\n"+colors+"\n"+hat+"\n"+face+"\n"+shirt+"\n"+pants+"\n"+render;
fs.writeFile("rendering/usercontent/"+req.userData.UserId+".py", python, function(err,data){
if(err) { console.log(err) }
})
exec("blender -b -P rendering/usercontent/"+req.userData.UserId+".py", (err, stdout, stderr) => {
if(err) { console.log(err) }
console.log("stdout: " + stdout);
console.log("stderr: " + stderr);
res.status(200)
res.json({success: true})
});
user.update({picture: img})
});
router.put('/colors', auth, async (req, res, next) => {
try {
let user = await User.findOne({
where: {id: req.userData.UserId}
})
if(user) {
user.update({
color: req.body.color,
headColor: req.body.headColor,
leftArmColor: req.body.leftArmColor,
rightArmColor: req.body.rightArmColor,
leftLegColor: req.body.leftLegColor,
rightLegColor: req.body.rightLegColor,
})
res.json({success: true})
} else {
throw Errors.unknown
}
} catch (e) { next(e) }
})
module.exports = router;