From 64446588c920cae6a3399b956220f3e42719e155 Mon Sep 17 00:00:00 2001 From: oat Date: Fri, 4 Sep 2020 16:47:10 +0300 Subject: [PATCH 1/2] schema updates semi-final schemas, i think --- src/schema.ts | 82 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 5 deletions(-) diff --git a/src/schema.ts b/src/schema.ts index b7ea0d6..6b38590 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,39 +1,111 @@ +/* eslint-disable no-unused-vars */ import * as mongoose from 'mongoose'; const Schema = mongoose.Schema; +export enum SMVersion { + OPENITG, + FUCKEXE, + NOTITG_V1, + NOTITG_V2, + NOTITG_V3, + NOTITG_V3_1, + NOTITG_V4, + NOTITG_V4_0_1, + STEPMANIA_3_95, + STEPMANIA_5_0, + STEPMANIA_5_1, + STEPMANIA_5_2, + STEPMANIA_5_3, +} + const Sample = new Schema({ start: {type: Number, default: 0}, length: {type: Number, default: 0} }); +const UserRating = new Schema({ + rating: {type: Number, default: 0}, + createdAt: Date, + user: {type: String, default: '00000000-0000-4000-a000-000000000000'} +}); + const Chart = new Schema({ type: {type: String, default: 'dance-single'}, name: {type: String, default: ''}, difficulty: {type: String, default: 'Challenge'}, + radarvalues: [Number], + rating: {type: Number, default: 0}, - radarvalues: [Number] + ratingsVote: {type: [UserRating], default: []}, + + spoilered: {type: Boolean, default: false}, + hidden: {type: Boolean, default: false} +}); + +const Comment = new Schema({ + author: {type: String, default: '00000000-0000-4000-a000-000000000000'}, + createdAt: Date, + content: {type: String, default: ''} }); const FileSchema = new Schema({ + id: {type: Number, default: 0}, + title: {type: String, default: 'unknown'}, titleTranslit: String, artist: {type: String, default: 'unknown'}, artistTranslit: String, subtitle: String, subtitleTranslit: String, + credit: String, uploader: {type: String, default: '00000000-0000-4000-a000-000000000000'}, + sample: Sample, bpms: {type: Object, default: {'0': 0}}, - charts: [Chart] + + charts: {type: [Chart], default: []}, + + description: {type: String, default: ''}, + createdAt: Date, + smVersion: {type: Number, default: 0}, // see SMVersion enum + ytLink: String, + customLink: String, + hidden: {type: Boolean, default: false}, + + comments: {type: [Comment], default: []}, }); export const File = mongoose.model('File', FileSchema); const UserSchema = new Schema({ // this is pretty much just a discord user lol - id: String, // cus longass number - approved: Boolean + id: String, // discord id, cus longass number + createdAt: Number, + + // caching + username: {type: String, default: 'User'}, + discriminator: {type: String, default: '0000'}, + avatar: String, + + // used internally + uuid: {type: String, default: '00000000-0000-4000-a000-000000000000'}, + + approvedUpload: {type: Boolean, default: false}, + approvedRate: {type: Boolean, default: false}, + approvedComment: {type: Boolean, default: false}, }); -export const User = mongoose.model('User', UserSchema); \ No newline at end of file +export const User = mongoose.model('User', UserSchema); + +const PackSchema = new Schema({ + author: {type: String, default: '00000000-0000-4000-a000-000000000000'}, + files: {type: [Number], default: []}, // ids + name: {type: String, default: 'Pack'}, + description: {type: String, default: ''}, + createdAt: Date, + + hidden: {type: Boolean, default: false}, +}); + +export const Pack = mongoose.model('Pack', PackSchema); \ No newline at end of file From 1ed6dc6185f3086f03333c16e37a35ade4642a67 Mon Sep 17 00:00:00 2001 From: oat Date: Fri, 4 Sep 2020 18:02:42 +0300 Subject: [PATCH 2/2] add chart data steps, jumps, mines, etc --- public/list.html | 5 +++-- src/lib/smparse.ts | 16 ++++++++++++++-- src/schema.ts | 9 ++++++++- src/upload.ts | 1 - 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/public/list.html b/public/list.html index 55ef341..bef0d8b 100644 --- a/public/list.html +++ b/public/list.html @@ -23,8 +23,9 @@ let charts = document.createElement('ul'); for (const chart of doc.charts) { - let l = document.createElement('li'); - l.innerText = `${chart.difficulty} ${chart.rating} - ${chart.name}` + let l = document.createElement('li'); + l.innerText = `${chart.difficulty} ${chart.rating} - ${chart.name}\n` + + `${chart.steps} steps, ${chart.mines} mines, ${chart.jumps} jumps, ${chart.hands} hands, ${chart.holds} holds, ${chart.rolls} rolls` charts.insertAdjacentElement('beforeend', l); } el.insertAdjacentElement('beforeend', charts); diff --git a/src/lib/smparse.ts b/src/lib/smparse.ts index 6736c6e..6e955ba 100644 --- a/src/lib/smparse.ts +++ b/src/lib/smparse.ts @@ -1,6 +1,4 @@ export function parseSM(data: string) { - data = data.replace(/[\n\r]/g,''); - // steps const difficulties = []; const steps = data.split('#NOTES:'); @@ -18,11 +16,25 @@ export function parseSM(data: string) { diff.rating = Number(stepsSplit[3]); diff.radarvalues = stepsSplit[4].split(',').map(v => Number(v)); + const chart = stepsSplit[5]; + diff.rawChart = chart; + + diff.steps = chart.split(/[124]/g).length - 1; + diff.mines = chart.split('M').length - 1; + diff.jumps = chart.split(/[124]0{0,2}[124]/g).length - 1; + diff.hands = chart.split(/[124]0{0,1}[124]0{0,1}[124]/g).length - 1; + diff.holds = chart.split('2').length - 1; + diff.rolls = chart.split('4').length - 1; + + diff.steps -= diff.jumps; // jumps are counted as 1 step + difficulties.push(diff); } } } + data = data.replace(/[\n\r]/g,''); + // metadata const lines = data.split(';').filter(l => l.startsWith('#')); const obj: any = {}; diff --git a/src/schema.ts b/src/schema.ts index 6b38590..e902248 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -40,7 +40,14 @@ const Chart = new Schema({ ratingsVote: {type: [UserRating], default: []}, spoilered: {type: Boolean, default: false}, - hidden: {type: Boolean, default: false} + hidden: {type: Boolean, default: false}, + + steps: {type: Number, default: 0}, + mines: {type: Number, default: 0}, + jumps: {type: Number, default: 0}, + hands: {type: Number, default: 0}, + holds: {type: Number, default: 0}, + rolls: {type: Number, default: 0}, }); const Comment = new Schema({ diff --git a/src/upload.ts b/src/upload.ts index e916f9f..98006c6 100644 --- a/src/upload.ts +++ b/src/upload.ts @@ -2,7 +2,6 @@ import { tmpdir } from 'os'; import * as fs from 'fs'; const StreamZip = require('node-stream-zip'); -import { returnStatic } from './lib/util'; import { parseSM } from './lib/smparse'; import { File } from './schema';