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].album_art.replace("album_art","album_art/small")}/)
+
+
+
{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 {