lsp-yggdrasil/src/models/player.js

131 lines
3.6 KiB
JavaScript

import mongoose from 'mongoose'
import { uuidToNoSymboUUID } from '../generator.js'
import { ImageSecurity } from '../secure.js'
import { s3Instance } from '../index.js'
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
import { GetObjectCommand } from '@aws-sdk/client-s3'
import { config } from '../config.js'
export const Player = mongoose.model("Player", new mongoose.Schema({
username: String, // 有符号 UUID
password: String,
email: String,
uuid: String,
textures: {
skin: String,
cape: String,
},
registerDate: Number,
permissions: [{
type: String
}],
binding: {
username: String,
platform: String,
verified: Boolean,
}
}))
export const PlayerSeriliazationSchema = {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"properties": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
},
"signature": {
"type": "string"
}
}
}
}
}
}
export const PlayerAccountSerializationSchema = {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"properties": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
}
}
}
}
export async function getPlayerSerialization(player) {
const textures = {
timestamp: 0,
profileId: uuidToNoSymboUUID(player.uuid),
profileName: player.username,
textures: { }
}
if(player.textures.skin && player.textures.skin != 0) { // Must be '!=' if this change to '!==' will never works
if(player.textures.skin.indexOf("http") === -1) {
textures.textures.SKIN = {
url: await getSignedUrl(s3Instance, new GetObjectCommand({
Bucket: config.storage.bucket,
Key: player.textures.skin
}), { expiresIn: 3 * 24 * 60 * 60 }) // 3 days
}
} else {
textures.textures.SKIN = {
url: player.textures.skin
}
}
}
if(player.textures.cape && player.textures.cape != 0) { // Must be '!=' if this change to '!==' will never works
if(player.textures.cape.indexOf("http") === -1) {
textures.textures.CAPE = {
url: await getSignedUrl(s3Instance, new GetObjectCommand({
Bucket: config.storage.bucket,
Key: player.textures.cape
}), { expiresIn: 3 * 24 * 60 * 60 }) // 3 days
}
} else {
textures.textures.CAPE = {
url: player.textures.cape
}
}
}
const val = Buffer.from(JSON.stringify(textures)).toString('base64')
return {
id: uuidToNoSymboUUID(player.uuid),
name: player.username,
properties: [
{
name: "texturs",
value: val,
signature: ImageSecurity.sign(val),
}
]
}
}