From 097bfd49be7199fc9762d067898c212e6b2aaacd Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Fri, 17 Jul 2020 11:47:11 -0500 Subject: [PATCH] Implement profile page structure. Fix many bugs related to promise errors and improved submission rating system. Added remove song capability. --- frontend/package-lock.json | 96 +++++ frontend/package.json | 1 + frontend/src/App.css | 9 + frontend/src/App.js | 190 +++++++++- server/app.js | 164 +++++++-- server/updateallscore.js | 7 + songData.sql | 736 +++++++++++++++++++++++++++++++++++++ 7 files changed, 1149 insertions(+), 54 deletions(-) create mode 100644 server/updateallscore.js create mode 100644 songData.sql diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 932010b..4033785 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -6290,6 +6290,19 @@ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -6300,6 +6313,14 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -8198,6 +8219,15 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" }, + "mini-create-react-context": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz", + "integrity": "sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==", + "requires": { + "@babel/runtime": "^7.5.5", + "tiny-warning": "^1.0.3" + } + }, "mini-css-extract-plugin": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", @@ -10597,6 +10627,52 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "react-router": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.0.tgz", + "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-dom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.2.0.tgz", + "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==", + "requires": { + "@babel/runtime": "^7.1.2", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, "react-scripts": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-3.4.1.tgz", @@ -10959,6 +11035,11 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, "resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -12393,6 +12474,16 @@ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -12764,6 +12855,11 @@ "spdx-expression-parse": "^3.0.0" } }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index e02362c..399216f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,6 +9,7 @@ "axios": "^0.19.2", "react": "^16.13.1", "react-dom": "^16.13.1", + "react-router-dom": "^5.2.0", "react-scripts": "3.4.1" }, "scripts": { diff --git a/frontend/src/App.css b/frontend/src/App.css index dfc4f4a..3b2c12b 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -24,6 +24,15 @@ background: linear-gradient(180deg, rgba(251,251,251,1) 0%, rgba(240,255,255,1) cursor:pointer; } +.loading{ + opacity:0.4; +} + +.header{ + font-weight:bold; + text-decoration:underline; +} + .topbar{ background: rgb(251,251,251); background: radial-gradient(circle, rgba(251,251,251,1) 0%, rgba(240,240,255,1) 100%); diff --git a/frontend/src/App.js b/frontend/src/App.js index cd4ada1..676b630 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -1,6 +1,14 @@ import React, {useState,useEffect} from 'react'; import logo from './logo.svg'; import './App.css'; +import { + BrowserRouter as Router, + Switch, + Route, + Link, + useRouteMatch, + useParams +} from "react-router-dom"; const REMOTE_ADDR = "http://45.33.13.215:4502"; @@ -133,29 +141,177 @@ function Logo(){ ); } -function App() { - return
-
-
-
- +function Sort(p){ + let { sort,sortOrder } = useParams(); + return ( + <> + {p.setIsLoading(true);p.setUpdateUsers(!p.updateUsers)}}>{p.label}{(sort===p.order?<>{(sortOrder==="desc")?<>▼:<>▲}:<>)} + + ) +} + +function ProfileDataContainer(p){ + return ( +
+
+
+ {p.label} +
+
+
+
+ {p.data}
-
-
-

Sidebar Contents

- Item 1
- Item 2
- Item 3
- Item 4
+ ); +} + +function StatisticsPanel(p) { + return ( + <> +
+ + + + +
+ + ) +} + +function Panel() { + return ( + <> + [Placeholder Panel] + + ); +} + +const CalculateAccuracy=(cool,fine,safe,sad,worst)=>{ + var noteCount = cool+fine+safe+sad+worst; + var sum = cool+(fine*0.5)+(safe*0.1)+(sad*0.05); + return sum/noteCount; +} + +function Profile(){ + let { username } = useParams(); + let match = useRouteMatch(); + var [updateProfile,setProfile] = useState(false); + var [playcount,setPlayCount] = useState(0); + var [fccount,setFCCount] = useState(0); + var [cleared,setClear] = useState(""); + var [accuracy,setAccuracy] = useState("-%"); + var [rating,setRating] = useState(0); + var [lastPlayed,setLastPlayed] = useState(new Date()); + var [update,setUpdate] = useState(false); + var [diffs,setDiffs] = useState({}); + var [user,setUserData] = useState({}); + + function CalculateClear(easy,normal,hard,ex,exex) { + return "E:"+easy+"/"+diffs.E+" N:"+normal+"/"+diffs.N+" H:"+hard+"/"+diffs.H+" EX:"+ex+"/"+diffs.EX+" EXEX:"+exex+"/"+diffs.EXEX; + } + + useEffect(()=>{ + axios.get("http://projectdivar.com:4501/userdata/"+username) + .then((data)=>{setUserData(data.data);setPlayCount(data.data.playcount);setFCCount(data.data.fccount);setRating(data.data.rating);setLastPlayed(data.data.last_played);setAccuracy(CalculateAccuracy(data.data.cool,data.data.fine,data.data.safe,data.data.sad,data.data.worst)); + return axios.get("http://projectdivar.com:4501/songdiffs")}) + .then((data)=>{setDiffs(data.data)}) + },[update]) + + useEffect(()=>{ + setClear(CalculateClear(user.eclear,user.nclear,user.hclear,user.exclear,user.exexclear)) + },[diffs,user]) + + return ( + <> +

{username+"'s Profile"}

+ + + + + + ); +} + +function Rankings(){ + let { sort,sortOrder } = useParams(); + let match = useRouteMatch(); + var [users,setUsers] = useState([]); + var [updateUsers,setUpdateUsers] = useState(false); + var [isLoading,setIsLoading] = useState(true); + + useEffect(()=>{ + axios.get("http://projectdivar.com:4501/users/"+sort+"/"+sortOrder+"?limit=100&offset=0") + .then((data)=>{setUsers(data.data) + setIsLoading(false);}) + //.then(()=>{console.log(users)}) + },[updateUsers]) + + return ( + <> + + + + + + + + + + + {users.map((user)=><> + + + + + + + + + )} +
{user.username}{user.last_played}{user.rating}{user.playcount}{user.fccount}
+ + ); +} + +function App() { + return ( +
+
+
+
+ + + +
+
-
-

Project DivaR

- Under construction! +
+
+

Sidebar Contents

+ Rankings
+ Item 2
+ Item 3
+ Item 4
+
+
+ + + + + + + + +

Project DivaR

+ Under construction! +
+
+
-
; +
); } export default App; diff --git a/server/app.js b/server/app.js index 15cebe4..8338061 100644 --- a/server/app.js +++ b/server/app.js @@ -31,7 +31,7 @@ new Pool({ }) app.get('/song/:songname', (req, res) => { - db.query('select * from songs where name=$1 or romanized_name=$1 or english_name=$1', [req.params.songname] , (error, results) => { + db.query('select * from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1', [req.params.songname] , (error, results) => { if (error) { res.status(500).json(error.message) } else { @@ -45,7 +45,7 @@ app.post('/register', (req, res) => { if (req.body && req.body.username && req.body.username.length>2 && req.body.email) { var duplicateFound=false; - db.query('select * from users where username=$1',[req.body.username]) + db.query('select * from users where username=$1 limit 1',[req.body.username]) .then((data)=>{ if (data.rows.length>0) { throw new Error("User "+data.rows[0].username+" already exists!"); @@ -60,6 +60,22 @@ req.body.username.length>2 && req.body.email) { } }) +app.delete('/remove',(req,res)=>{ + if (req.body && + req.body.username!==undefined && req.body.authentication_token!==undefined && req.body.playid!==undefined) { + var userObj={},songObj={},rating=0,isFirstClear=false; + db.query("select id,authentication_token,playcount,fccount,cool,fine,safe,sad,worst,eclear,nclear,hclear,exclear,exexclear from users where username=$1 limit 1",[req.body.username]) + .then((data)=>{if(data && data.rows.length>0){userObj=data.rows[0];if (req.body.authentication_token===userObj.authentication_token){return db.query("delete from plays where id=$1 and userid=$2 returning *",[req.body.playid,userObj.id])}else{throw new Error("Could not authenticate user!")}}else{throw new Error("Cannot find user!")}}) + .then((data)=>{if(data && data.rows.length>0){songObj=data.rows[0];return CalculateRating(req.body.username)}else{throw new Error("Could not find play!")}}) + .then((data)=>{rating=data;return db.query("select * from plays where songid=$1 and userid=$2 and difficulty=$3 limit 1",[songObj.songid,userObj.id,songObj.difficulty])}) + .then((data)=>{if(data && data.rows.length===0){isFirstClear=true;}/*console.log([data,userObj.playcount-1,(songObj.safe==0&&songObj.sad==0&&songObj.worst==0)?userObj.fccount-1:userObj.fccount,userObj.cool-songObj.cool,userObj.fine-songObj.fine,userObj.safe-songObj.safe,userObj.sad-songObj.sad,userObj.worst-songObj.worst,(songObj.difficulty=="E")?userObj.ecount-1:userObj.ecount,(songObj.difficulty=="N")?userObj.ncount-1:userObj.ncount,(songObj.difficulty=="H")?userObj.hcount-1:userObj.hcount,(songObj.difficulty=="EX")?userObj.excount-1:userObj.excount,(songObj.difficulty=="EXEX")?userObj.exexcount-1:userObj.exexcount]);*/return db.query("update users set rating=$1,playcount=$2,fccount=$3,cool=$4,fine=$5,safe=$6,sad=$7,worst=$8,eclear=$9,nclear=$10,hclear=$11,exclear=$12,exexclear=$13 where id=$14 returning rating,playcount,fccount,cool,fine,safe,sad,worst,eclear,nclear,hclear,exclear,exexclear",[rating,userObj.playcount-1,(songObj.safe==0&&songObj.sad==0&&songObj.worst==0)?userObj.fccount-1:userObj.fccount,userObj.cool-songObj.cool,userObj.fine-songObj.fine,userObj.safe-songObj.safe,userObj.sad-songObj.sad,userObj.worst-songObj.worst,(songObj.difficulty=="E" && isFirstClear)?userObj.eclear-1:userObj.eclear,(songObj.difficulty=="N" && isFirstClear)?userObj.nclear-1:userObj.nclear,(songObj.difficulty=="H" && isFirstClear)?userObj.hclear-1:userObj.hclear,(songObj.difficulty=="EX" && isFirstClear)?userObj.exclear-1:userObj.exclear,(songObj.difficulty=="EXEX" && isFirstClear)?userObj.exexclear-1:userObj.exexclear,userObj.id])}) + .then((data)=>{if(data && data.rows.length>0){res.status(200).json({user:data.rows[0],song:songObj})}else{throw new Error("Could not update user information, but song is deleted!")}}) + .catch((err)=>{res.status(500).json(err.message)}) + } else { + res.status(400).json("Missing required parameters!"); + } +}) + app.post('/submit', (req, res) => { if (req.body && req.body.username!==undefined && req.body.authentication_token!==undefined && req.body.song!==undefined && req.body.difficulty!==undefined && req.body.cool!==undefined && req.body.fine!==undefined && req.body.safe!==undefined && req.body.sad!==undefined && req.body.worst!==undefined && req.body.percent!==undefined) { @@ -71,18 +87,29 @@ app.post('/submit', (req, res) => { if (!(req.body.difficulty==="H"||req.body.difficulty==="N"||req.body.difficulty==="E"||req.body.difficulty==="EX"||req.body.difficulty==="EXEX")) {throw new Error("Invalid difficulty!")} - var userId = -1,songId=-1; - db.query("select id,authentication_token from users where username=$1",[req.body.username]) - .then((data)=>{if(data.rows.length>0){if (data.rows[0].authentication_token===req.body.authentication_token){userId=data.rows[0].id;return db.query("select id from songs where name=$1 or romanized_name=$1 or english_name=$1",[req.body.song])}else{throw new Error("Could not authenticate!")}}else{throw new Error("Could not find user.")} + var songsubmitdata={},isFC=false,songRating=-1,userId = -1,songId=-1,playcount=-1,fccount=-1,cool=-1,fine=-1,safe=-1,sad=-1,worst=-1,alreadyPassed=false,eclear=-1,nclear=-1,hclear=-1,exclear=-1,exexclear=-1; + db.query("select id,authentication_token,playcount,fccount,cool,fine,safe,sad,worst,eclear,nclear,hclear,exclear,exexclear from users where username=$1 limit 1",[req.body.username]) + .then((data)=>{if(data && data.rows.length>0){if (data.rows[0].authentication_token===req.body.authentication_token){ + var obj = data.rows[0]; + eclear=obj.eclear;nclear=obj.nclear;hclear=obj.hclear;exclear=obj.exclear;exexclear=obj.exexclear; + cool=data.rows[0].cool;fine=data.rows[0].fine;safe=data.rows[0].safe;sad=data.rows[0].sad;worst=data.rows[0].worst; + fccount=data.rows[0].fccount;playcount=data.rows[0].playcount;userId=data.rows[0].id;return db.query("select id from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1",[req.body.song])}else{throw new Error("Could not authenticate!")}}else{throw new Error("Could not find user.")} }) - .then((data)=>{if(data.rows.length>0){songId=data.rows[0].id;var score=CalculateSongScore({cool:req.body.cool,fine:req.body.fine,safe:req.body.safe,sad:req.body.sad,worst:req.body.worst,percent:req.body.percent,difficulty:req.body.difficulty,fail:fail});return db.query("insert into plays(songId,userId,difficulty,cool,fine,safe,sad,worst,percent,date,score,fail) values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) returning *",[songId,userId,req.body.difficulty,req.body.cool,req.body.fine,req.body.safe,req.body.sad,req.body.worst,req.body.percent,new Date(),score,fail])}else{throw new Error("Could not find song.")}}) - .then((data)=>{if(data.rows.length>0){ - var songsubmitdata = data.rows[0]; - return CalculateRating(req.body.username).then((data)=>{db.query("update users set rating=$1 where username=$2",[data,req.body.username])}) - .then(()=>{return songsubmitdata;})}else{throw new Error("Could not submit song.")}}) + .then((data)=>{if(data && data.rows.length>0){songId=data.rows[0].id; return db.query('select rating from songdata where songid=$1 and difficulty=$2 limit 1',[songId,req.body.difficulty])}else{throw new Error("Could not find song.")}}) + .then((data)=>{songRating=data.rows[0].rating;return db.query("select id from plays where userid=$1 and score>0 and difficulty=$2 and songid=$3 limit 1",[userId,req.body.difficulty,songId])}) + .then((data)=>{if(data && data.rows.length>0){alreadyPassed=true;/*console.log(data);*/};var score=CalculateSongScore({rating:songRating,cool:req.body.cool,fine:req.body.fine,safe:req.body.safe,sad:req.body.sad,worst:req.body.worst,percent:req.body.percent,difficulty:req.body.difficulty,fail:fail});return db.query("insert into plays(songId,userId,difficulty,cool,fine,safe,sad,worst,percent,date,score,fail) values($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12) returning *",[songId,userId,req.body.difficulty,req.body.cool,req.body.fine,req.body.safe,req.body.sad,req.body.worst,req.body.percent,new Date(),score,fail])}) + .then((data)=>{if(data && data.rows.length>0){ + songsubmitdata = data.rows[0]; + //console.log(alreadyPassed+" / "+typeof(alreadyPassed)) + if(alreadyPassed===false){switch(req.body.difficulty){case"E":{eclear++}break;case"N":{nclear++}break;case"H":{hclear++}break;case"EX":{exclear++}break;case"EXEX":{exexclear++}break;}} + isFC = songsubmitdata.safe===0 && songsubmitdata.sad===0 && songsubmitdata.worst===0; + return CalculateRating(req.body.username)}else{throw new Error("Could not submit song.")}}) + .then((data)=>{return db.query("update users set rating=$1,last_played=$3,playcount=$4,fccount=$5,cool=$6,fine=$7,safe=$8,sad=$9,worst=$10,eclear=$11,nclear=$12,hclear=$13,exclear=$14,exexclear=$15 where username=$2",[data,req.body.username,new Date(),++playcount,fccount+((isFC)?1:0),cool+Number(req.body.cool),fine+Number(req.body.fine),safe+Number(req.body.safe),sad+Number(req.body.sad),worst+Number(req.body.worst),eclear,nclear,hclear,exclear,exexclear])}) + .then((data)=>{return songsubmitdata;}) .then((data)=>{res.status(200).json(data);}) .catch((err)=>{ - console.log(req.body); + //console.log(req.body); + //console.log(err); res.status(500).json(err.message);}) } else { console.log(req.body); @@ -95,18 +122,28 @@ CalculateSongScore=(song)=>{ var noteCount=song.cool+song.fine+song.safe+song.sad+song.worst; var comboBreaks=song.safe+song.sad+song.worst; var scoreMult=1; + if(comboBreaks===0){scoreMult=2}else if(song.percent>=95){scoreMult=1.2}else{scoreMult=1} switch (song.difficulty){ - case "H":{if(song.percent<60){scoreMult=0}else{if(comboBreaks===0){scoreMult=5}else if(song.percent>=90){scoreMult=3}else{scoreMult=1.5}}}break; + case "E":{if(song.percent<30){scoreMult=0}}break; + case "N":{if(song.percent<50){scoreMult=0}}break; + case "H":{if(song.percent<60){scoreMult=0}}break; case "EX": - case "EXEX":{if(song.percent<70){scoreMult=0}else{if(comboBreaks===0){scoreMult=10}else if(song.percent>=95){scoreMult=6}else{scoreMult=5}}}break; + case "EXEX":{if(song.percent<70){scoreMult=0}}break; default:{ - if(song.percent<60){scoreMult=0}else{if(comboBreaks===0){scoreMult=3}else if(song.percent>=90){scoreMult=2}else{scoreMult=1}} + if(song.percent<60){scoreMult=0} } } var score = ((song.cool*100+song.fine*50+song.safe*10+song.sad*5)/((noteCount)/(noteCount/1000)))*scoreMult + score += Math.pow(song.rating,3)/5 return Number(score); } +CalculateAccuracy=(cool,fine,safe,sad,worst)=>{ + var noteCount = cool+fine+safe+sad+worst; + var sum = cool+(fine*0.5)+(safe*0.1)+(sad*0.05); + return sum/noteCount; +} + CalculateRating=(username)=>{ var songs = []; var debugScoreList = ""; @@ -117,67 +154,120 @@ CalculateRating=(username)=>{ .then((data)=>{if(data.rows.length>0){return data.rows.reduce((sum,song,i)=>{ return sum+Number(CalculateSongScore(song)*(Math.pow(0.8,i)))},0)}else{return 0}}) .catch((err)=>{throw new Error(err.message)})*/ - return db.query('select id from users where username=$1',[username]) - .then((data)=>{if(data.rows.length>0){userId=data.rows[0].id;return db.query('select * from songs order by id asc;')}else{return 0}}) + return db.query('select id from users where username=$1 limit 1',[username]) + .then((data)=>{if(data.rows.length>0){userId=data.rows[0].id;return db.query('select * from songs order by id asc')}else{return 0}}) .then((data)=>{if(data.rows.length>0){songs=data.rows;return Promise.all(data.rows.map((song)=>{return db.query('select * from plays where userId=$1 and songId=$2 order by score desc limit 100',[userId,song.id]).then((data)=>{if (data.rows.length>0){debugScoreList+=song.name+"\n"; songs[song.id-1].score=data.rows.reduce((sum,play,i)=>{debugScoreList+=" "+(play.score)+" -> "+(play.score*Math.pow(0.8,i))+"\n";/*console.log("Play score:"+play.score+". Sum:"+sum);*/return sum+play.score*Math.pow(0.8,i);},0);debugScoreList+=" "+songs[song.id-1].score+"\n";}})}))}}) .then(()=>{return songs.sort((a,b)=>{var scorea=(a.score)?a.score:0;var scoreb=(b.score)?b.score:0;return (scorea>scoreb)?-1:1;}).reduce((sum,song,i)=>{if(song.score){debugScoreList+=song.name+": "+song.score+" -> "+(song.score*Math.pow(0.8,i))+"\n";return sum+song.score*Math.pow(0.8,i)}else{return sum}},0);}) .then((data)=>{/*console.log(debugScoreList);*/return data}) } +app.get('/songdiffs',(req,res)=>{ + var diffObj={} + db.query("select COUNT(*) from songdata where difficulty='E'") + .then((data)=>{diffObj.E=data.rows[0].count;return db.query("select COUNT(*) from songdata where difficulty='N'")}) + .then((data)=>{diffObj.N=data.rows[0].count;return db.query("select COUNT(*) from songdata where difficulty='H'")}) + .then((data)=>{diffObj.H=data.rows[0].count;return db.query("select COUNT(*) from songdata where difficulty='EX'")}) + .then((data)=>{diffObj.EX=data.rows[0].count;return db.query("select COUNT(*) from songdata where difficulty='EXEX'")}) + .then((data)=>{diffObj.EXEX=data.rows[0].count;res.status(200).json(diffObj)}) + .catch((err)=>{res.status(500).json(err.message)}) +}) + +app.get('/accuracy/:username',(req,res)=>{ + db.query('select cool,fine,safe,sad,worst from users where username=$1',[req.params.username]) + .then((data)=>{if (data.rows.length>0){return CalculateAccuracy(data.rows[0].cool,data.rows[0].fine,data.rows[0].safe,data.rows[0].sad,data.rows[0].worst)}else{throw new Error("User does not exist!")}}) + .then((data)=>{res.status(200).json({accuracy:data})}) + .catch((err)=>{res.status(500).json(err.message)}) +}) + app.get('/recalculatescore/:playid',(req,res)=>{ var userId=-1; var username=null; - db.query('select * from plays where id=$1',[req.params.playid]) - .then((data)=>{if (data.rows.length>0){var song=data.rows[0];userId=song.userid;console.log(song);var score=CalculateSongScore({cool:song.cool,fine:song.fine,safe:song.safe,sad:song.sad,worst:song.worst,percent:song.percent,difficulty:song.difficulty,fail:song.fail});return db.query('update plays set score=$1 where id=$2 returning *',[score,req.params.playid]);}else{throw new Error("This play does not exist!")}}) - .then((data)=>{if (data.rows.length>0){ - var scoreData=data.rows[0]; - return db.query('select username from users where id=$1',[userId]).then((data)=>{username=data.rows[0].username; return CalculateRating(username)}).then((data)=>{db.query("update users set rating=$1 where username=$2",[data,username])}) - .then(()=>{return scoreData;}) - }else{throw new Error("Failed to update score!")}}) - .then((data)=>res.status(200).json(data)).catch((err)=>{res.status(500).json(err.message);}) + var songRating=-1; + var song; + + db.query('select * from plays where id=$1 limit 1',[req.params.playid]) + .then((data)=>{if (data.rows.length>0){song=data.rows[0];userId=song.userid;/*console.log(song);*/ + return db.query('select rating from songdata where songid=$1 and difficulty=$2 limit 1',[song.songid,song.difficulty]) + }else{throw new Error("This play does not exist!")}}) + .then((data)=>{if (data.rows.length>0){songRating=data.rows[0].rating;var score=CalculateSongScore({rating:songRating,cool:song.cool,fine:song.fine,safe:song.safe,sad:song.sad,worst:song.worst,percent:song.percent,difficulty:song.difficulty,fail:song.fail});return db.query('update plays set score=$1 where id=$2 returning *',[score,req.params.playid]);}else{throw new Error("Failed to retrieve song data!")}}) + .then((data)=>{console.log(data);if (data.rows.length>0){ + var scoreData=data.rows[0]; + return db.query('select username from users where id=$1',[userId]).then((data)=>{username=data.rows[0].username; return CalculateRating(username)}).then((data)=>{db.query("update users set rating=$1 where username=$2",[data,username])}) + .then(()=>{return scoreData;}) + }else{throw new Error("Failed to update score!")}}) + .then((data)=>res.status(200).json(data)).catch((err)=>{console.log(err);res.status(500).json(err.message);}) }); +/*app.get('/playdata',(req,res)=>{ + db.query('select * from plays') + .then((data)=>{res.status(200).json(data.rows)}) + .catch((err)=>res.status(500).json(err.message)) +})*/ + app.get('/bestplay/:username/:songname/:difficulty',(req,res)=>{ var songId=-1,userId=-1; - db.query('select id from users where username=$1',[req.params.username]) - .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;if(req.params.songname){return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1', [req.params.songname])}else{return db.query('select * from plays where userid=$1 order by score desc',[userId])}}else{throw new Error("Cannot find user!")}}) - .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;if(req.params.difficulty){return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 order by score desc,percent desc limit 1',[userId,songId,req.params.difficulty])}else{return db.query('select * from plays where userid=$1 and songid=$2 order by score desc,percent desc limit 1',[userId,songId])}}else{res.status(400).json("Could not find song!")}}) + db.query('select id from users where username=$1 limit 1',[req.params.username]) + .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;if(req.params.songname){return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1', [req.params.songname])}else{return db.query('select * from plays where userid=$1 order by score desc',[userId])}}else{throw new Error("Cannot find user!")}}) + .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 order by score desc,percent desc limit 1',[userId,songId,req.params.difficulty])}else{res.status(400).json("Could not find song!")}}) .then((data)=>{if(data && data.rows.length>0){res.status(200).json(data.rows[0])}else{res.status(400).json("No data found!")}}) .catch((err)=>{res.status(500).json(err.message+JSON.stringify(req.body))}) }) +app.get('/userdata/:username',(req,res)=>{ + var songId=-1,userId=-1; + db.query('select playcount,fccount,rating,last_played,cool,fine,safe,sad,worst,eclear,nclear,hclear,exclear,exexclear from users where username=$1 limit 1',[req.params.username]) + .then((data)=>{if(data && data.rows.length>0){res.status(200).json(data.rows[0])}}) + .catch((err)=>{res.status(500).json(err.message)}) +}) + app.get('/playcount/:username/:songname/:difficulty',(req,res)=>{ var songId=-1,userId=-1; - db.query('select id from users where username=$1',[req.params.username]) - .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;if(req.params.songname){return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1', [req.params.songname])}else{return db.query('select * from plays where userid=$1',[userId])}}else{throw new Error("Cannot find user!")}}) - .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;if(req.params.difficulty){return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 order by score desc',[userId,songId,req.params.difficulty])}else{return db.query('select * from plays where userid=$1 and songid=$2',[userId,songId])}}else{res.status(400).json("Could not find song!")}}) + db.query('select id from users where username=$1 limit 1',[req.params.username]) + .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1', [req.params.songname])}else{throw new Error("Cannot find user!")}}) + .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 order by score desc',[userId,songId,req.params.difficulty])}else{res.status(400).json("Could not find song!")}}) .then((data)=>{if(data && data.rows.length>0){res.status(200).json({playcount:data.rows.length})}else{res.status(200).json({playcount:0})}}) .catch((err)=>{res.status(500).json(err.message)}) }) app.get('/songpasscount/:username/:songname/:difficulty',(req,res)=>{ var songId=-1,userId=-1; - db.query('select id from users where username=$1',[req.params.username]) - .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;if(req.params.songname){return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1', [req.params.songname])}else{return db.query('select * from plays where userid=$1 and score>0',[userId])}}else{throw new Error("Cannot find user!")}}) - .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;if(req.params.difficulty){return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 and score>0',[userId,songId,req.params.difficulty])}else{return db.query('select * from plays where userid=$1 and songid=$2 and score>0',[userId,songId])}}else{res.status(400).json("Could not find song!")}}) + db.query('select id from users where username=$1 limit 1',[req.params.username]) + .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1', [req.params.songname])}else{throw new Error("Cannot find user!")}}) + .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 and score>0',[userId,songId,req.params.difficulty])}else{res.status(400).json("Could not find song!")}}) .then((data)=>{if(data && data.rows.length>0){res.status(200).json({passcount:data.rows.length})}else{res.status(200).json({passcount:0})}}) .catch((err)=>{res.status(500).json(err.message)}) }) app.get('/songfccount/:username/:songname/:difficulty',(req,res)=>{ var songId=-1,userId=-1; - db.query('select id from users where username=$1',[req.params.username]) - .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;if(req.params.songname){return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1', [req.params.songname])}else{return db.query('select * from plays where userid=$1 and safe=0 and sad=0 and worst=0',[userId])}}else{throw new Error("Cannot find user!")}}) - .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;if(req.params.difficulty){return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 and safe=0 and sad=0 and worst=0',[userId,songId,req.params.difficulty])}else{return db.query('select * from plays where userid=$1 and songid=$2 and safe=0 and sad=0 and worst=0',[userId,songId])}}else{res.status(400).json("Could not find song!")}}) + db.query('select id from users where username=$1 limit 1',[req.params.username]) + .then((data)=>{if (data.rows.length>0){userId=data.rows[0].id;return db.query('select id from songs where name=$1 or romanized_name=$1 or english_name=$1 limit 1', [req.params.songname])}else{throw new Error("Cannot find user!")}}) + .then((data)=>{if(req.params.songname &&data.rows.length>0){songId=data.rows[0].id;return db.query('select * from plays where userid=$1 and songid=$2 and difficulty=$3 and safe=0 and sad=0 and worst=0',[userId,songId,req.params.difficulty])}else{res.status(400).json("Could not find song!")}}) .then((data)=>{if(data && data.rows.length>0){res.status(200).json({fccount:data.rows.length})}else{res.status(200).json({fccount:0})}}) .catch((err)=>{res.status(500).json(err.message)}) }) app.get('/rating/:username',(req,res)=>{ if (req.params.username) { - db.query('select rating from users where username=$1',[req.params.username]) + db.query('select rating from users where username=$1 limit 1',[req.params.username]) .then((data)=>{if(data.rows.length>0){res.status(200).json(data.rows[0])}else{res.status(200).json({rating:0})}}) } else { res.status(400).json("Invalid username!") } +}) + +app.get('/users/:orderby/:sortorder',(req,res)=>{ + if (req.params.orderby && req.params.sortorder && req.query.limit && req.query.offset) { + var valid = ["rating","last_played","playcount","username","fccount"]; + var validsort = ["desc","asc"]; + if (valid.includes(req.params.orderby) && validsort.includes(req.params.sortorder)) { + db.query('select username,rating,last_played,playcount,fccount from users order by '+req.params.orderby+' '+req.params.sortorder+",rating desc limit $1 offset $2",[req.query.limit,req.query.offset]) + .then((data)=>{return res.status(200).json(data.rows)}) + .catch((err)=>{res.status(500).json(err.message)}) + } else { + res.status(400).json("Not a valid sort option!"); + } + } else { + res.status(400).json("Invalid query!") + } }) \ No newline at end of file diff --git a/server/updateallscore.js b/server/updateallscore.js new file mode 100644 index 0000000..0d36cad --- /dev/null +++ b/server/updateallscore.js @@ -0,0 +1,7 @@ +const axios = require('axios') + +axios.get("http://projectdivar.com:4501/playdata") +.then((data)=>{data.data.forEach((song)=>{return axios.get("http://projectdivar.com:4501/recalculatescore/"+song.id) +.then((data)=>{console.log(data.data)}) +.catch((err)=>{console.log(err.message)})})}) +.catch((err)=>{console.log(err.message)}) \ No newline at end of file diff --git a/songData.sql b/songData.sql new file mode 100644 index 0000000..e445fda --- /dev/null +++ b/songData.sql @@ -0,0 +1,736 @@ +insert into songdata(songid,difficulty,rating) values(1,'E',1.5); +insert into songdata(songid,difficulty,rating) values(1,'N',3); +insert into songdata(songid,difficulty,rating) values(1,'H',5.5); +insert into songdata(songid,difficulty,rating) values(1,'EX',8); + +insert into songdata(songid,difficulty,rating) values(2,'E',1.5); +insert into songdata(songid,difficulty,rating) values(2,'N',4); +insert into songdata(songid,difficulty,rating) values(2,'H',7); +insert into songdata(songid,difficulty,rating) values(2,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(3,'E',1.5); +insert into songdata(songid,difficulty,rating) values(3,'N',4); +insert into songdata(songid,difficulty,rating) values(3,'H',6); +insert into songdata(songid,difficulty,rating) values(3,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(4,'E',3.5); +insert into songdata(songid,difficulty,rating) values(4,'N',5); +insert into songdata(songid,difficulty,rating) values(4,'H',6.5); +insert into songdata(songid,difficulty,rating) values(4,'EX',8); + +insert into songdata(songid,difficulty,rating) values(5,'E',2); +insert into songdata(songid,difficulty,rating) values(5,'N',5); +insert into songdata(songid,difficulty,rating) values(5,'H',7.5); +insert into songdata(songid,difficulty,rating) values(5,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(6,'E',1.5); +insert into songdata(songid,difficulty,rating) values(6,'N',4); +insert into songdata(songid,difficulty,rating) values(6,'H',7.5); +insert into songdata(songid,difficulty,rating) values(6,'EX',9); + +insert into songdata(songid,difficulty,rating) values(7,'E',2); +insert into songdata(songid,difficulty,rating) values(7,'N',5); +insert into songdata(songid,difficulty,rating) values(7,'H',7.5); +insert into songdata(songid,difficulty,rating) values(7,'EX',9); + +insert into songdata(songid,difficulty,rating) values(8,'E',1.5); +insert into songdata(songid,difficulty,rating) values(8,'N',4); +insert into songdata(songid,difficulty,rating) values(8,'H',8); +insert into songdata(songid,difficulty,rating) values(8,'EX',9); + +insert into songdata(songid,difficulty,rating) values(9,'E',2); +insert into songdata(songid,difficulty,rating) values(9,'N',4.5); +insert into songdata(songid,difficulty,rating) values(9,'H',7.5); +insert into songdata(songid,difficulty,rating) values(9,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(10,'E',2); +insert into songdata(songid,difficulty,rating) values(10,'N',4.5); +insert into songdata(songid,difficulty,rating) values(10,'H',7); +insert into songdata(songid,difficulty,rating) values(10,'EX',9); + +insert into songdata(songid,difficulty,rating) values(11,'E',4); +insert into songdata(songid,difficulty,rating) values(11,'N',5.5); +insert into songdata(songid,difficulty,rating) values(11,'H',6); +insert into songdata(songid,difficulty,rating) values(11,'EX',7.5); +insert into songdata(songid,difficulty,rating) values(11,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(12,'E',3); +insert into songdata(songid,difficulty,rating) values(12,'N',5); +insert into songdata(songid,difficulty,rating) values(12,'H',6); +insert into songdata(songid,difficulty,rating) values(12,'EX',7); +insert into songdata(songid,difficulty,rating) values(12,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(13,'N',4.5); +insert into songdata(songid,difficulty,rating) values(13,'H',6.5); +insert into songdata(songid,difficulty,rating) values(13,'EX',8.5); +insert into songdata(songid,difficulty,rating) values(13,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(14,'E',2); +insert into songdata(songid,difficulty,rating) values(14,'N',3.5); +insert into songdata(songid,difficulty,rating) values(14,'H',5); +insert into songdata(songid,difficulty,rating) values(14,'EX',7); + +insert into songdata(songid,difficulty,rating) values(15,'E',1.5); +insert into songdata(songid,difficulty,rating) values(15,'N',3.5); +insert into songdata(songid,difficulty,rating) values(15,'H',5.5); +insert into songdata(songid,difficulty,rating) values(15,'EX',7); +insert into songdata(songid,difficulty,rating) values(15,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(16,'N',6.5); +insert into songdata(songid,difficulty,rating) values(16,'H',7); +insert into songdata(songid,difficulty,rating) values(16,'EX',9); +insert into songdata(songid,difficulty,rating) values(16,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(17,'E',3); +insert into songdata(songid,difficulty,rating) values(17,'N',5); +insert into songdata(songid,difficulty,rating) values(17,'H',6); +insert into songdata(songid,difficulty,rating) values(17,'EX',7); +insert into songdata(songid,difficulty,rating) values(17,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(18,'E',4); +insert into songdata(songid,difficulty,rating) values(18,'N',5); +insert into songdata(songid,difficulty,rating) values(18,'H',6); +insert into songdata(songid,difficulty,rating) values(18,'EX',9); +insert into songdata(songid,difficulty,rating) values(18,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(19,'E',4.5); +insert into songdata(songid,difficulty,rating) values(19,'N',5.5); +insert into songdata(songid,difficulty,rating) values(19,'H',6.5); +insert into songdata(songid,difficulty,rating) values(19,'EX',8); +insert into songdata(songid,difficulty,rating) values(19,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(20,'E',1); +insert into songdata(songid,difficulty,rating) values(20,'N',3); +insert into songdata(songid,difficulty,rating) values(20,'H',5); +insert into songdata(songid,difficulty,rating) values(20,'EX',7); +insert into songdata(songid,difficulty,rating) values(20,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(21,'E',2); +insert into songdata(songid,difficulty,rating) values(21,'N',5); +insert into songdata(songid,difficulty,rating) values(21,'H',6); +insert into songdata(songid,difficulty,rating) values(21,'EX',8); +insert into songdata(songid,difficulty,rating) values(21,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(22,'E',3); +insert into songdata(songid,difficulty,rating) values(22,'N',4); +insert into songdata(songid,difficulty,rating) values(22,'H',5.5); +insert into songdata(songid,difficulty,rating) values(22,'EX',7); +insert into songdata(songid,difficulty,rating) values(22,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(23,'E',2); +insert into songdata(songid,difficulty,rating) values(23,'N',5.5); +insert into songdata(songid,difficulty,rating) values(23,'H',7.5); +insert into songdata(songid,difficulty,rating) values(23,'EX',9.5); +insert into songdata(songid,difficulty,rating) values(23,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(24,'E',3); +insert into songdata(songid,difficulty,rating) values(24,'N',4); +insert into songdata(songid,difficulty,rating) values(24,'H',5.5); +insert into songdata(songid,difficulty,rating) values(24,'EX',7); +insert into songdata(songid,difficulty,rating) values(24,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(25,'E',3); +insert into songdata(songid,difficulty,rating) values(25,'N',4.5); +insert into songdata(songid,difficulty,rating) values(25,'H',5.5); +insert into songdata(songid,difficulty,rating) values(25,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(26,'E',3); +insert into songdata(songid,difficulty,rating) values(26,'N',4); +insert into songdata(songid,difficulty,rating) values(26,'H',5); +insert into songdata(songid,difficulty,rating) values(26,'EX',7); +insert into songdata(songid,difficulty,rating) values(26,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(27,'E',2); +insert into songdata(songid,difficulty,rating) values(27,'N',4); +insert into songdata(songid,difficulty,rating) values(27,'H',6); +insert into songdata(songid,difficulty,rating) values(27,'EX',9.5); +insert into songdata(songid,difficulty,rating) values(27,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(28,'E',3.5); +insert into songdata(songid,difficulty,rating) values(28,'N',5); +insert into songdata(songid,difficulty,rating) values(28,'H',6); +insert into songdata(songid,difficulty,rating) values(28,'EX',8); +insert into songdata(songid,difficulty,rating) values(28,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(29,'E',3); +insert into songdata(songid,difficulty,rating) values(29,'N',6); +insert into songdata(songid,difficulty,rating) values(29,'H',8); +insert into songdata(songid,difficulty,rating) values(29,'EX',10); +insert into songdata(songid,difficulty,rating) values(29,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(30,'N',5); +insert into songdata(songid,difficulty,rating) values(30,'H',6); +insert into songdata(songid,difficulty,rating) values(30,'EX',7); +insert into songdata(songid,difficulty,rating) values(30,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(31,'E',3.5); +insert into songdata(songid,difficulty,rating) values(31,'N',5); +insert into songdata(songid,difficulty,rating) values(31,'H',6.5); +insert into songdata(songid,difficulty,rating) values(31,'EX',8); + +insert into songdata(songid,difficulty,rating) values(32,'E',2); +insert into songdata(songid,difficulty,rating) values(32,'N',4); +insert into songdata(songid,difficulty,rating) values(32,'H',5); +insert into songdata(songid,difficulty,rating) values(32,'EX',8); +insert into songdata(songid,difficulty,rating) values(32,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(33,'E',3.5); +insert into songdata(songid,difficulty,rating) values(33,'N',4.5); +insert into songdata(songid,difficulty,rating) values(33,'H',6.5); +insert into songdata(songid,difficulty,rating) values(33,'EX',8); +insert into songdata(songid,difficulty,rating) values(33,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(34,'E',3); +insert into songdata(songid,difficulty,rating) values(34,'N',4); +insert into songdata(songid,difficulty,rating) values(34,'H',6.5); +insert into songdata(songid,difficulty,rating) values(34,'EX',8); + +insert into songdata(songid,difficulty,rating) values(35,'N',4); +insert into songdata(songid,difficulty,rating) values(35,'H',7); +insert into songdata(songid,difficulty,rating) values(35,'EX',10); +insert into songdata(songid,difficulty,rating) values(35,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(36,'N',5); +insert into songdata(songid,difficulty,rating) values(36,'H',6); +insert into songdata(songid,difficulty,rating) values(36,'EX',9); +insert into songdata(songid,difficulty,rating) values(36,'EXEX',9.5); + +insert into songdata(songid,difficulty,rating) values(37,'N',4.5); +insert into songdata(songid,difficulty,rating) values(37,'H',6); +insert into songdata(songid,difficulty,rating) values(37,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(38,'N',5); +insert into songdata(songid,difficulty,rating) values(38,'H',6); +insert into songdata(songid,difficulty,rating) values(38,'EX',8); +insert into songdata(songid,difficulty,rating) values(38,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(39,'E',2); +insert into songdata(songid,difficulty,rating) values(39,'N',4); +insert into songdata(songid,difficulty,rating) values(39,'H',5); +insert into songdata(songid,difficulty,rating) values(39,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(40,'E',2); +insert into songdata(songid,difficulty,rating) values(40,'N',4); +insert into songdata(songid,difficulty,rating) values(40,'H',5); +insert into songdata(songid,difficulty,rating) values(40,'EX',7); +insert into songdata(songid,difficulty,rating) values(40,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(41,'E',3); +insert into songdata(songid,difficulty,rating) values(41,'N',4.5); +insert into songdata(songid,difficulty,rating) values(41,'H',6.4); +insert into songdata(songid,difficulty,rating) values(41,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(42,'E',2.5); +insert into songdata(songid,difficulty,rating) values(42,'N',4.5); +insert into songdata(songid,difficulty,rating) values(42,'H',6); +insert into songdata(songid,difficulty,rating) values(42,'EX',8); +insert into songdata(songid,difficulty,rating) values(42,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(43,'N',5.5); +insert into songdata(songid,difficulty,rating) values(43,'H',6.5); +insert into songdata(songid,difficulty,rating) values(43,'EX',9); + +insert into songdata(songid,difficulty,rating) values(44,'E',3); +insert into songdata(songid,difficulty,rating) values(44,'N',4); +insert into songdata(songid,difficulty,rating) values(44,'H',5.5); +insert into songdata(songid,difficulty,rating) values(44,'EX',8); +insert into songdata(songid,difficulty,rating) values(44,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(45,'E',2); +insert into songdata(songid,difficulty,rating) values(45,'N',3.5); +insert into songdata(songid,difficulty,rating) values(45,'H',5); +insert into songdata(songid,difficulty,rating) values(45,'EX',7); + +insert into songdata(songid,difficulty,rating) values(46,'E',1); +insert into songdata(songid,difficulty,rating) values(46,'N',3); +insert into songdata(songid,difficulty,rating) values(46,'H',5); +insert into songdata(songid,difficulty,rating) values(46,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(47,'N',4); +insert into songdata(songid,difficulty,rating) values(47,'H',6); +insert into songdata(songid,difficulty,rating) values(47,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(48,'E',3); +insert into songdata(songid,difficulty,rating) values(48,'N',4.5); +insert into songdata(songid,difficulty,rating) values(48,'H',6); +insert into songdata(songid,difficulty,rating) values(48,'EX',7.5); +insert into songdata(songid,difficulty,rating) values(48,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(49,'E',3.5); +insert into songdata(songid,difficulty,rating) values(49,'N',4.5); +insert into songdata(songid,difficulty,rating) values(49,'H',6); +insert into songdata(songid,difficulty,rating) values(49,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(50,'E',2); +insert into songdata(songid,difficulty,rating) values(50,'N',4.5); +insert into songdata(songid,difficulty,rating) values(50,'H',6); +insert into songdata(songid,difficulty,rating) values(50,'EX',8); + +insert into songdata(songid,difficulty,rating) values(51,'E',3.5); +insert into songdata(songid,difficulty,rating) values(51,'N',5); +insert into songdata(songid,difficulty,rating) values(51,'H',6); +insert into songdata(songid,difficulty,rating) values(51,'EX',8); + +insert into songdata(songid,difficulty,rating) values(52,'E',3); +insert into songdata(songid,difficulty,rating) values(52,'N',5); +insert into songdata(songid,difficulty,rating) values(52,'H',6); +insert into songdata(songid,difficulty,rating) values(52,'EX',7); + +insert into songdata(songid,difficulty,rating) values(53,'E',3); +insert into songdata(songid,difficulty,rating) values(53,'N',4); +insert into songdata(songid,difficulty,rating) values(53,'H',5); +insert into songdata(songid,difficulty,rating) values(53,'EX',7); + +insert into songdata(songid,difficulty,rating) values(54,'E',3); +insert into songdata(songid,difficulty,rating) values(54,'N',5); +insert into songdata(songid,difficulty,rating) values(54,'H',7); +insert into songdata(songid,difficulty,rating) values(54,'EX',10); +insert into songdata(songid,difficulty,rating) values(54,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(55,'N',5); +insert into songdata(songid,difficulty,rating) values(55,'H',6); +insert into songdata(songid,difficulty,rating) values(55,'EX',8); +insert into songdata(songid,difficulty,rating) values(55,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(56,'N',4.5); +insert into songdata(songid,difficulty,rating) values(56,'H',6); +insert into songdata(songid,difficulty,rating) values(56,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(57,'E',3); +insert into songdata(songid,difficulty,rating) values(57,'N',5.5); +insert into songdata(songid,difficulty,rating) values(57,'H',7); +insert into songdata(songid,difficulty,rating) values(57,'EX',9); +insert into songdata(songid,difficulty,rating) values(57,'EXEX',9.5); + +insert into songdata(songid,difficulty,rating) values(58,'N',5.5); +insert into songdata(songid,difficulty,rating) values(58,'H',6.5); +insert into songdata(songid,difficulty,rating) values(58,'EX',8.5); +insert into songdata(songid,difficulty,rating) values(58,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(59,'N',4); +insert into songdata(songid,difficulty,rating) values(59,'H',6); +insert into songdata(songid,difficulty,rating) values(59,'EX',8); + +insert into songdata(songid,difficulty,rating) values(60,'E',2); +insert into songdata(songid,difficulty,rating) values(60,'N',4); +insert into songdata(songid,difficulty,rating) values(60,'H',6); +insert into songdata(songid,difficulty,rating) values(60,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(61,'E',3); +insert into songdata(songid,difficulty,rating) values(61,'N',4.5); +insert into songdata(songid,difficulty,rating) values(61,'H',7.5); +insert into songdata(songid,difficulty,rating) values(61,'EX',10); + +insert into songdata(songid,difficulty,rating) values(62,'E',1); +insert into songdata(songid,difficulty,rating) values(62,'N',3); +insert into songdata(songid,difficulty,rating) values(62,'H',5); +insert into songdata(songid,difficulty,rating) values(62,'EX',6.5); +insert into songdata(songid,difficulty,rating) values(62,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(63,'E',0); +insert into songdata(songid,difficulty,rating) values(63,'N',0); +insert into songdata(songid,difficulty,rating) values(63,'H',0); +insert into songdata(songid,difficulty,rating) values(63,'EX',0); +insert into songdata(songid,difficulty,rating) values(63,'EXEX',0); + +insert into songdata(songid,difficulty,rating) values(64,'N',5); +insert into songdata(songid,difficulty,rating) values(64,'H',6.5); +insert into songdata(songid,difficulty,rating) values(64,'EX',8); +insert into songdata(songid,difficulty,rating) values(64,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(65,'E',2.5); +insert into songdata(songid,difficulty,rating) values(65,'N',4.5); +insert into songdata(songid,difficulty,rating) values(65,'H',7.5); +insert into songdata(songid,difficulty,rating) values(65,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(66,'E',1); +insert into songdata(songid,difficulty,rating) values(66,'N',3.5); +insert into songdata(songid,difficulty,rating) values(66,'H',6); +insert into songdata(songid,difficulty,rating) values(66,'EX',8); + +insert into songdata(songid,difficulty,rating) values(67,'N',4.5); +insert into songdata(songid,difficulty,rating) values(67,'H',6); +insert into songdata(songid,difficulty,rating) values(67,'EX',8); + +insert into songdata(songid,difficulty,rating) values(68,'E',2.5); +insert into songdata(songid,difficulty,rating) values(68,'N',3.5); +insert into songdata(songid,difficulty,rating) values(68,'H',5.5); +insert into songdata(songid,difficulty,rating) values(68,'EX',8); + +insert into songdata(songid,difficulty,rating) values(69,'E',2); +insert into songdata(songid,difficulty,rating) values(69,'N',4.5); +insert into songdata(songid,difficulty,rating) values(69,'H',6.5); +insert into songdata(songid,difficulty,rating) values(69,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(70,'E',2); +insert into songdata(songid,difficulty,rating) values(70,'N',4); +insert into songdata(songid,difficulty,rating) values(70,'H',5); +insert into songdata(songid,difficulty,rating) values(70,'EX',7); + +insert into songdata(songid,difficulty,rating) values(71,'E',2); +insert into songdata(songid,difficulty,rating) values(71,'N',4.5); +insert into songdata(songid,difficulty,rating) values(71,'H',6.5); +insert into songdata(songid,difficulty,rating) values(71,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(72,'E',1.5); +insert into songdata(songid,difficulty,rating) values(72,'N',4); +insert into songdata(songid,difficulty,rating) values(72,'H',5.5); +insert into songdata(songid,difficulty,rating) values(72,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(73,'E',1.5); +insert into songdata(songid,difficulty,rating) values(73,'N',4); +insert into songdata(songid,difficulty,rating) values(73,'H',6.5); +insert into songdata(songid,difficulty,rating) values(73,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(74,'E',3.5); +insert into songdata(songid,difficulty,rating) values(74,'N',6); +insert into songdata(songid,difficulty,rating) values(74,'H',8); +insert into songdata(songid,difficulty,rating) values(74,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(75,'E',1.5); +insert into songdata(songid,difficulty,rating) values(75,'N',3.5); +insert into songdata(songid,difficulty,rating) values(75,'H',6.5); +insert into songdata(songid,difficulty,rating) values(75,'EX',9); + +insert into songdata(songid,difficulty,rating) values(76,'E',2); +insert into songdata(songid,difficulty,rating) values(76,'N',4.5); +insert into songdata(songid,difficulty,rating) values(76,'H',6); +insert into songdata(songid,difficulty,rating) values(76,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(77,'E',4); +insert into songdata(songid,difficulty,rating) values(77,'N',5.5); +insert into songdata(songid,difficulty,rating) values(77,'H',6.5); +insert into songdata(songid,difficulty,rating) values(77,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(78,'E',2.5); +insert into songdata(songid,difficulty,rating) values(78,'N',4.5); +insert into songdata(songid,difficulty,rating) values(78,'H',6); +insert into songdata(songid,difficulty,rating) values(78,'EX',8); + +insert into songdata(songid,difficulty,rating) values(79,'E',3); +insert into songdata(songid,difficulty,rating) values(79,'N',5.5); +insert into songdata(songid,difficulty,rating) values(79,'H',6.5); +insert into songdata(songid,difficulty,rating) values(79,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(80,'E',2.5); +insert into songdata(songid,difficulty,rating) values(80,'N',4); +insert into songdata(songid,difficulty,rating) values(80,'H',6); +insert into songdata(songid,difficulty,rating) values(80,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(81,'E',2); +insert into songdata(songid,difficulty,rating) values(81,'N',4); +insert into songdata(songid,difficulty,rating) values(81,'H',5.5); +insert into songdata(songid,difficulty,rating) values(81,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(82,'E',1.5); +insert into songdata(songid,difficulty,rating) values(82,'N',4); +insert into songdata(songid,difficulty,rating) values(82,'H',6); +insert into songdata(songid,difficulty,rating) values(82,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(83,'N',4.5); +insert into songdata(songid,difficulty,rating) values(83,'H',7.5); +insert into songdata(songid,difficulty,rating) values(83,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(84,'E',2.5); +insert into songdata(songid,difficulty,rating) values(84,'N',4.5); +insert into songdata(songid,difficulty,rating) values(84,'H',6.5); +insert into songdata(songid,difficulty,rating) values(84,'EX',8); + +insert into songdata(songid,difficulty,rating) values(85,'E',4); +insert into songdata(songid,difficulty,rating) values(85,'N',5.5); +insert into songdata(songid,difficulty,rating) values(85,'H',7); +insert into songdata(songid,difficulty,rating) values(85,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(86,'E',3.5); +insert into songdata(songid,difficulty,rating) values(86,'N',5); +insert into songdata(songid,difficulty,rating) values(86,'H',7); +insert into songdata(songid,difficulty,rating) values(86,'EX',9); + +insert into songdata(songid,difficulty,rating) values(87,'E',3.5); +insert into songdata(songid,difficulty,rating) values(87,'N',4); +insert into songdata(songid,difficulty,rating) values(87,'H',6); +insert into songdata(songid,difficulty,rating) values(87,'EX',8); +insert into songdata(songid,difficulty,rating) values(87,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(88,'E',1); +insert into songdata(songid,difficulty,rating) values(88,'N',3); +insert into songdata(songid,difficulty,rating) values(88,'H',5.5); +insert into songdata(songid,difficulty,rating) values(88,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(89,'E',2.5); +insert into songdata(songid,difficulty,rating) values(89,'N',5); +insert into songdata(songid,difficulty,rating) values(89,'H',6); +insert into songdata(songid,difficulty,rating) values(89,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(90,'E',2); +insert into songdata(songid,difficulty,rating) values(90,'N',4); +insert into songdata(songid,difficulty,rating) values(90,'H',6); +insert into songdata(songid,difficulty,rating) values(90,'EX',8); + +insert into songdata(songid,difficulty,rating) values(91,'E',4); +insert into songdata(songid,difficulty,rating) values(91,'N',6); +insert into songdata(songid,difficulty,rating) values(91,'H',7.5); +insert into songdata(songid,difficulty,rating) values(91,'EX',9.5); + +insert into songdata(songid,difficulty,rating) values(92,'E',3.5); +insert into songdata(songid,difficulty,rating) values(92,'N',4); +insert into songdata(songid,difficulty,rating) values(92,'H',5.5); +insert into songdata(songid,difficulty,rating) values(92,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(93,'E',4); +insert into songdata(songid,difficulty,rating) values(93,'N',6); +insert into songdata(songid,difficulty,rating) values(93,'H',7.5); +insert into songdata(songid,difficulty,rating) values(93,'EX',10); + +insert into songdata(songid,difficulty,rating) values(94,'E',3); +insert into songdata(songid,difficulty,rating) values(94,'N',4.5); +insert into songdata(songid,difficulty,rating) values(94,'H',6.5); +insert into songdata(songid,difficulty,rating) values(94,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(95,'E',1); +insert into songdata(songid,difficulty,rating) values(95,'N',3); +insert into songdata(songid,difficulty,rating) values(95,'H',5); +insert into songdata(songid,difficulty,rating) values(95,'EX',7.5); + +insert into songdata(songid,difficulty,rating) values(96,'N',5.5); +insert into songdata(songid,difficulty,rating) values(96,'H',6.5); +insert into songdata(songid,difficulty,rating) values(96,'EX',7.5); +insert into songdata(songid,difficulty,rating) values(96,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(97,'E',4); +insert into songdata(songid,difficulty,rating) values(97,'N',5); +insert into songdata(songid,difficulty,rating) values(97,'H',6); +insert into songdata(songid,difficulty,rating) values(97,'EX',7); +insert into songdata(songid,difficulty,rating) values(97,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(98,'N',5.5); +insert into songdata(songid,difficulty,rating) values(98,'H',7.5); +insert into songdata(songid,difficulty,rating) values(98,'EX',8.5); +insert into songdata(songid,difficulty,rating) values(98,'EXEX',9.5); + +insert into songdata(songid,difficulty,rating) values(99,'E',2); +insert into songdata(songid,difficulty,rating) values(99,'N',4); +insert into songdata(songid,difficulty,rating) values(99,'H',6); +insert into songdata(songid,difficulty,rating) values(99,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(100,'E',3.5); +insert into songdata(songid,difficulty,rating) values(100,'N',5.5); +insert into songdata(songid,difficulty,rating) values(100,'H',7.5); +insert into songdata(songid,difficulty,rating) values(100,'EX',9); + +insert into songdata(songid,difficulty,rating) values(101,'E',3); +insert into songdata(songid,difficulty,rating) values(101,'N',5.5); +insert into songdata(songid,difficulty,rating) values(101,'H',7); +insert into songdata(songid,difficulty,rating) values(101,'EX',9); + +insert into songdata(songid,difficulty,rating) values(102,'E',2); +insert into songdata(songid,difficulty,rating) values(102,'N',4); +insert into songdata(songid,difficulty,rating) values(102,'H',5); +insert into songdata(songid,difficulty,rating) values(102,'EX',6); + +insert into songdata(songid,difficulty,rating) values(103,'E',4); +insert into songdata(songid,difficulty,rating) values(103,'N',5.5); +insert into songdata(songid,difficulty,rating) values(103,'H',6); +insert into songdata(songid,difficulty,rating) values(103,'EX',8.5); +insert into songdata(songid,difficulty,rating) values(103,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(104,'E',3); +insert into songdata(songid,difficulty,rating) values(104,'N',4); +insert into songdata(songid,difficulty,rating) values(104,'H',5); +insert into songdata(songid,difficulty,rating) values(104,'EX',7); +insert into songdata(songid,difficulty,rating) values(104,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(105,'E',3); +insert into songdata(songid,difficulty,rating) values(105,'N',5); +insert into songdata(songid,difficulty,rating) values(105,'H',6); +insert into songdata(songid,difficulty,rating) values(105,'EX',7); +insert into songdata(songid,difficulty,rating) values(105,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(106,'N',4); +insert into songdata(songid,difficulty,rating) values(106,'H',6.5); +insert into songdata(songid,difficulty,rating) values(106,'EX',8); +insert into songdata(songid,difficulty,rating) values(106,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(107,'E',3); +insert into songdata(songid,difficulty,rating) values(107,'N',4); +insert into songdata(songid,difficulty,rating) values(107,'H',6.5); +insert into songdata(songid,difficulty,rating) values(107,'EX',8); + +insert into songdata(songid,difficulty,rating) values(108,'E',3); +insert into songdata(songid,difficulty,rating) values(108,'N',4); +insert into songdata(songid,difficulty,rating) values(108,'H',5); +insert into songdata(songid,difficulty,rating) values(108,'EX',8); +insert into songdata(songid,difficulty,rating) values(108,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(109,'E',3); +insert into songdata(songid,difficulty,rating) values(109,'N',4.5); +insert into songdata(songid,difficulty,rating) values(109,'H',6); +insert into songdata(songid,difficulty,rating) values(109,'EX',7); +insert into songdata(songid,difficulty,rating) values(109,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(110,'E',1); +insert into songdata(songid,difficulty,rating) values(110,'N',3); +insert into songdata(songid,difficulty,rating) values(110,'H',5); +insert into songdata(songid,difficulty,rating) values(110,'EX',8); +insert into songdata(songid,difficulty,rating) values(110,'EXEX',9); + +insert into songdata(songid,difficulty,rating) values(111,'E',2.5); +insert into songdata(songid,difficulty,rating) values(111,'N',4); +insert into songdata(songid,difficulty,rating) values(111,'H',6.5); +insert into songdata(songid,difficulty,rating) values(111,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(112,'E',4); +insert into songdata(songid,difficulty,rating) values(112,'N',5); +insert into songdata(songid,difficulty,rating) values(112,'H',6); +insert into songdata(songid,difficulty,rating) values(112,'EX',7); +insert into songdata(songid,difficulty,rating) values(112,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(113,'N',4); +insert into songdata(songid,difficulty,rating) values(113,'H',6); +insert into songdata(songid,difficulty,rating) values(113,'EX',9); +insert into songdata(songid,difficulty,rating) values(113,'EXEX',9.5); + +insert into songdata(songid,difficulty,rating) values(114,'N',5.5); +insert into songdata(songid,difficulty,rating) values(114,'H',8); +insert into songdata(songid,difficulty,rating) values(114,'EX',10); +insert into songdata(songid,difficulty,rating) values(114,'EXEX',10); + +insert into songdata(songid,difficulty,rating) values(115,'N',5); +insert into songdata(songid,difficulty,rating) values(115,'H',6); +insert into songdata(songid,difficulty,rating) values(115,'EX',9); +insert into songdata(songid,difficulty,rating) values(115,'EXEX',9.5); + +insert into songdata(songid,difficulty,rating) values(116,'E',2.5); +insert into songdata(songid,difficulty,rating) values(116,'N',4.5); +insert into songdata(songid,difficulty,rating) values(116,'H',6.5); +insert into songdata(songid,difficulty,rating) values(116,'EX',8); + +insert into songdata(songid,difficulty,rating) values(117,'N',4.5); +insert into songdata(songid,difficulty,rating) values(117,'H',6.5); +insert into songdata(songid,difficulty,rating) values(117,'EX',8); + +insert into songdata(songid,difficulty,rating) values(118,'E',3.5); +insert into songdata(songid,difficulty,rating) values(118,'N',5); +insert into songdata(songid,difficulty,rating) values(118,'H',7); +insert into songdata(songid,difficulty,rating) values(118,'EX',8.5); +insert into songdata(songid,difficulty,rating) values(118,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(119,'E',2); +insert into songdata(songid,difficulty,rating) values(119,'H',4.5); +insert into songdata(songid,difficulty,rating) values(119,'EX',7); +insert into songdata(songid,difficulty,rating) values(119,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(120,'E',3); +insert into songdata(songid,difficulty,rating) values(120,'N',4); +insert into songdata(songid,difficulty,rating) values(120,'H',5); +insert into songdata(songid,difficulty,rating) values(120,'EX',7); +insert into songdata(songid,difficulty,rating) values(120,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(121,'E',2.5); +insert into songdata(songid,difficulty,rating) values(121,'N',3.5); +insert into songdata(songid,difficulty,rating) values(121,'H',6); +insert into songdata(songid,difficulty,rating) values(121,'EX',8); + +insert into songdata(songid,difficulty,rating) values(122,'E',2); +insert into songdata(songid,difficulty,rating) values(122,'N',4); +insert into songdata(songid,difficulty,rating) values(122,'H',5); +insert into songdata(songid,difficulty,rating) values(122,'EX',7); +insert into songdata(songid,difficulty,rating) values(122,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(123,'N',4); +insert into songdata(songid,difficulty,rating) values(123,'H',6); +insert into songdata(songid,difficulty,rating) values(123,'EX',8); +insert into songdata(songid,difficulty,rating) values(123,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(124,'E',2); +insert into songdata(songid,difficulty,rating) values(124,'N',4); +insert into songdata(songid,difficulty,rating) values(124,'H',6); +insert into songdata(songid,difficulty,rating) values(124,'EX',8); + +insert into songdata(songid,difficulty,rating) values(125,'E',2.5); +insert into songdata(songid,difficulty,rating) values(125,'H',5); +insert into songdata(songid,difficulty,rating) values(125,'EX',7); +insert into songdata(songid,difficulty,rating) values(125,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(126,'E',2.5); +insert into songdata(songid,difficulty,rating) values(126,'N',4); +insert into songdata(songid,difficulty,rating) values(126,'H',5); +insert into songdata(songid,difficulty,rating) values(126,'EX',7); + +insert into songdata(songid,difficulty,rating) values(127,'E',2); +insert into songdata(songid,difficulty,rating) values(127,'N',4); +insert into songdata(songid,difficulty,rating) values(127,'H',5); +insert into songdata(songid,difficulty,rating) values(127,'EX',6); +insert into songdata(songid,difficulty,rating) values(127,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(128,'N',6); +insert into songdata(songid,difficulty,rating) values(128,'H',8); +insert into songdata(songid,difficulty,rating) values(128,'EX',10); + +insert into songdata(songid,difficulty,rating) values(129,'N',4); +insert into songdata(songid,difficulty,rating) values(129,'H',6.5); +insert into songdata(songid,difficulty,rating) values(129,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(130,'E',3); +insert into songdata(songid,difficulty,rating) values(130,'N',4); +insert into songdata(songid,difficulty,rating) values(130,'H',5); +insert into songdata(songid,difficulty,rating) values(130,'EX',7); +insert into songdata(songid,difficulty,rating) values(130,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(131,'E',3.5); +insert into songdata(songid,difficulty,rating) values(131,'N',4.5); +insert into songdata(songid,difficulty,rating) values(131,'H',5.5); +insert into songdata(songid,difficulty,rating) values(131,'EX',7.5); +insert into songdata(songid,difficulty,rating) values(131,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(132,'E',3); +insert into songdata(songid,difficulty,rating) values(132,'N',4); +insert into songdata(songid,difficulty,rating) values(132,'H',6.5); +insert into songdata(songid,difficulty,rating) values(132,'EX',8); + +insert into songdata(songid,difficulty,rating) values(133,'E',2); +insert into songdata(songid,difficulty,rating) values(133,'N',4); +insert into songdata(songid,difficulty,rating) values(133,'H',5); +insert into songdata(songid,difficulty,rating) values(133,'EX',7); +insert into songdata(songid,difficulty,rating) values(133,'EXEX',7.5); + +insert into songdata(songid,difficulty,rating) values(134,'E',2); +insert into songdata(songid,difficulty,rating) values(134,'N',4.5); +insert into songdata(songid,difficulty,rating) values(134,'H',6.5); +insert into songdata(songid,difficulty,rating) values(134,'EX',9); + +insert into songdata(songid,difficulty,rating) values(135,'E',3); +insert into songdata(songid,difficulty,rating) values(135,'N',4); +insert into songdata(songid,difficulty,rating) values(135,'H',5); +insert into songdata(songid,difficulty,rating) values(135,'EX',7); +insert into songdata(songid,difficulty,rating) values(135,'EXEX',8.5); + +insert into songdata(songid,difficulty,rating) values(136,'E',3); +insert into songdata(songid,difficulty,rating) values(136,'N',4.5); +insert into songdata(songid,difficulty,rating) values(136,'H',6.5); +insert into songdata(songid,difficulty,rating) values(136,'EX',8); + +insert into songdata(songid,difficulty,rating) values(137,'E',3); +insert into songdata(songid,difficulty,rating) values(137,'N',4.5); +insert into songdata(songid,difficulty,rating) values(137,'H',6.5); +insert into songdata(songid,difficulty,rating) values(137,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(138,'N',4.5); +insert into songdata(songid,difficulty,rating) values(138,'H',6.5); +insert into songdata(songid,difficulty,rating) values(138,'EX',8.5); + +insert into songdata(songid,difficulty,rating) values(139,'E',2); +insert into songdata(songid,difficulty,rating) values(139,'N',3); +insert into songdata(songid,difficulty,rating) values(139,'H',4); +insert into songdata(songid,difficulty,rating) values(139,'EX',7); +insert into songdata(songid,difficulty,rating) values(139,'EXEX',8); + +insert into songdata(songid,difficulty,rating) values(140,'E',2); +insert into songdata(songid,difficulty,rating) values(140,'N',4); +insert into songdata(songid,difficulty,rating) values(140,'H',6.5); +insert into songdata(songid,difficulty,rating) values(140,'EX',8); + +insert into songdata(songid,difficulty,rating) values(141,'E',1.5); +insert into songdata(songid,difficulty,rating) values(141,'N',4.5); +insert into songdata(songid,difficulty,rating) values(141,'H',7); +insert into songdata(songid,difficulty,rating) values(141,'EX',8.5); \ No newline at end of file