diff --git a/frontend/src/App.css b/frontend/src/App.css index d98ea98..1872ea1 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -4,12 +4,21 @@ badge-success {hard} badge-warning {ex} badge-danger {exex}*/ +.centered{ +} + .link{ color:#66e; } .highest{ + position:relative; z-index:1000001; + background: #eef; +} + +.below{ + z-index:-1; } .display-tooltip{ @@ -85,18 +94,16 @@ body { background: #eef; } -table th { +.scrollingHeader{ position: -webkit-sticky; /* this is for all Safari (Desktop & iOS), not for Chrome*/ position: sticky; top: 0; - z-index: 100000; background: #fff; } -#footer{ +.scrollingFooter{ position: -webkit-sticky; /* this is for all Safari (Desktop & iOS), not for Chrome*/ position: sticky; bottom: 0; - z-index: 100000; } .background-songs{ diff --git a/frontend/src/App.js b/frontend/src/App.js index 297962d..b3d34e9 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -336,7 +336,7 @@ function Play(p) { if (p.mini) { return ( <> -
+
{Math.floor(p.play.score)} pts
{((p.play.fine==0&&p.play.safe==0&&p.play.sad==0&&p.play.worst==0)?✪PFC:(p.play.safe==0&&p.play.sad==0&&p.play.worst==0)?★FC:<>)}
@@ -656,7 +656,7 @@ function PlayData(p) { return ( <> -
+
Individual Plays for {p.song.name} from {p.username}
{data.map((play,i)=>)} @@ -674,19 +674,21 @@ function HoverSongName(p) { return ( <> { - if (!toggle) { - setExpand( - - ) - setToggle(true) - } else { - setExpand(<>) - setToggle(false) + if ((p.song.report.ecount+p.song.report.ncount+p.song.report.hcount+p.song.report.excount+p.song.report.exexcount>0)) { + if (!toggle) { + setExpand( + + ) + setToggle(true) + } else { + setExpand(<>) + setToggle(false) + } } } }> - - {(toggle)?<>⯆:<>⯈} {name} {(p.song.romanized_name.length>0)?<>{(p.song.romanized_name!==p.song.name)?<>{p.song.romanized_name}:<>}:<>{(p.song.english_name!==p.song.name)?<>{p.song.english_name}:<>}} + + {(p.song.report.ecount+p.song.report.ncount+p.song.report.hcount+p.song.report.excount+p.song.report.exexcount>0)?((toggle)?<>⯆:<>⯈):<>} {name} {(p.song.romanized_name.length>0)?<>{(p.song.romanized_name!==p.song.name)?<>{p.song.romanized_name}:<>}:<>{(p.song.english_name!==p.song.name)?<>{p.song.english_name}:<>}} @@ -697,6 +699,9 @@ function HoverSongName(p) { function CompletionPanel(p) { const [report,setReport] = useState([]) + const [song,setSong] = useState("") + const [filter,setFilter] = useState({}) + const [style,setStyle] = useState(true) const [update,setUpdate] = useState(false) useEffect(()=>{ axios.get("http://projectdivar.com/completionreport/"+p.username) @@ -706,35 +711,36 @@ function CompletionPanel(p) { return ( <> + - - - - - - - {report.map((song,i)=>{return + {report.filter((report)=>Object.keys(filter).length==0||report.id in filter).map((song,i)=>{return })} - @@ -947,22 +953,53 @@ function ImageUpload(p) { } function SongSearch(p) { - //Requires: p.song / p.setSong + //Requires: p.songs / p.song / p.setSong / p.filteredSongs / p.setFilteredSongs const [song,setSong] = useState("") const [focused,setFocused] = useState(false) + useEffect(()=>{ + if (p.setStyle) { + if (focused) { + p.setStyle(false) + } else { + p.setStyle(true) + } + } + },[focused]) + return ( <> - {setFocused(true)}} onChange={(e)=>{ + {if (e.key==="Enter") {setFocused(false);e.target.blur()}}} onFocus={()=>{setFocused(true)}} onChange={(e)=>{ + if (p.setFilteredSongs){p.setFilteredSongs({})} setSong(e.target.value) } + } onBlur={()=>{ + setTimeout(()=>{setFocused(false)},250) + } }/> {(focused)? -
{Object.keys(p.songs).filter((key)=> +
{ + Object.keys(p.songs).filter((key)=> { var s = p.songs[key] return s.name.toLowerCase().includes(song.toLowerCase())||s.romanized_name.toLowerCase().includes(song.toLowerCase())||s.english_name.toLowerCase().includes(song.toLowerCase())||s.artist.toLowerCase().includes(song.toLowerCase())||s.vocaloid.toLowerCase().includes(song.toLowerCase()) - }).map((key)=>
{setSong(p.songs[key].name);setFocused(false)}}>

{p.songs[key].name}

{(p.songs[key].romanized_name)?p.songs[key].romanized_name:p.songs[key].english_name}
)}
:<>} + }).map((key)=>{ + if (p.setFilteredSongs&&p.filteredSongs) { + var obj = p.filteredSongs; + obj[key]=true + //console.log(obj) + p.setFilteredSongs(obj) + } + return
{setSong(p.songs[key].name);p.setSong(p.songs[key].name);setFocused(false);if(p.setFilteredSongs&&p.filteredSongs){var obj={};obj[key]=true;p.setFilteredSongs(obj)}}}> +
+
+ +
+
+

{p.songs[key].name}

{(p.songs[key].romanized_name)?p.songs[key].romanized_name:p.songs[key].english_name} +
+
+
})}
:<>} More stuff goes here. @@ -1001,19 +1038,9 @@ function Submit(p) {
-
Simple Submit
+
Manual Submit

Submit your plays by entering the clear % of a song

-

The simplest way to submit plays, it won't be entirely accurate, but it lets you submit plays very quickly.

-
- -
-
-
- -
-
Detailed Submit
-

Submit your plays by entering all the information about a play

-

You can submit as many songs as you like, but you will have to provide details for each play.

+

The simplest way to submit plays, type in a %, tweak the other values quickly, then submit your play! Optionally include a screenshot.

diff --git a/server/app.js b/server/app.js index 8159c97..08958d0 100644 --- a/server/app.js +++ b/server/app.js @@ -370,7 +370,7 @@ app.get('/completionreport/:username',(req,res)=>{ .then ((data)=>{ if (data.rows.length>0) { userId=data.rows[0].id; - return db.query('select * from songs') + return db.query('select * from songs order by id asc') } else { throw new Error("Cannot find user!") } @@ -709,8 +709,9 @@ var process_images = [] var processPromises = [] var largestId = 0 var filterId = 0 +var MAX_INDEX = 12 //To prevent being rate-limited. -function Process(data){ +function Process(data,ind){ for (var i in data.data.statuses) { var tweet = data.data.statuses[i] if (tweet.source && tweet.source.includes("Nintendo Switch Share")) { @@ -724,17 +725,21 @@ function Process(data){ } } //console.log(process_images) - if (data.data.search_metadata.next_results) { + if (data.data.search_metadata.next_results && ind{return Process(data)}) + .then((data)=>{ + //console.log("Going to next: "+(ind+1)) + return Process(data,ind+1)}) } return "Done!"; } -app.use('/files',express.static('files')) +app.use('/files',express.static('files',{ + maxAge: 86400000 * 30 +})) /* axios.get('https://api.twitter.com/1.1/search/tweets.json?q=@divarbot', { @@ -778,11 +783,12 @@ setInterval( } ,5000) + setInterval(()=>{db.query("select * from twitter_bot limit 1") .then((data)=>{ largestId=filterId=data.rows[0].lastpost; //console.log("Filter Id: "+filterId); - return axios.get('https://api.twitter.com/1.1/search/tweets.json?q=@divarbot', { + return axios.get('https://api.twitter.com/1.1/search/tweets.json?q=%23mega39s', { headers: { Authorization: 'Bearer '+process.env.TWITTER_BEARER //the token is a variable which holds the token } @@ -792,7 +798,8 @@ setInterval(()=>{db.query("select * from twitter_bot limit 1") //console.log(data.data.statuses) //console.log(data.data) //data.data.s - return Process(data); + //console.log("Reading Twitter Data...") + return Process(data,0); }) .then((data)=>{ //console.log(process_images) @@ -805,6 +812,7 @@ setInterval(()=>{db.query("select * from twitter_bot limit 1") return db.query("select id from users where twitter=$1",[obj.user]) .then((data)=>{ if (data.rows.length>0) { + console.log("Process new play for User id "+data.rows[0].id+"...") return db.query("insert into uploadedplays values($1,$2,$3)",[obj.image,data.rows[0].id,new Date()]) .then(()=>{resolve("Done!")}) } else {
+ Song Name + Ranking + Score + % + Play Count + Mods