From fd7d95b00b248098111141ae2e963f1f40140e4c Mon Sep 17 00:00:00 2001 From: Akinari Date: Wed, 26 May 2021 13:57:01 +0200 Subject: [PATCH] May Update --- CHANGELOG.md | 48 ++-- frontend/app.js | 133 ++++++---- frontend/assets/odometer-theme-minimal.css | 81 ++++++ frontend/assets/odometer.min.js | 2 + frontend/assets/scoremodification.js | 49 +++- frontend/assets/style.css | 218 ++++++++++++++++ frontend/assets/tourneys.json | 224 ++++++++++++++++ frontend/index.html | 290 +++++++++++++++++++++ frontend/visualizer/style.css | 30 ++- frontend/visualizer/visualizer.html | 4 +- index.js | 96 ++++++- package-lock.json | 37 ++- package.json | 2 +- 13 files changed, 1138 insertions(+), 76 deletions(-) create mode 100644 frontend/assets/odometer-theme-minimal.css create mode 100644 frontend/assets/odometer.min.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 122e996..ae5c68e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,28 +1,30 @@ -## v1.6.0 +## v1.7.0 ### Displayer -- New background 👀. -- Changed the default colors to Red/Blue according to osu!Lazer. Requested by [@Big Brayn](https://osu.ppy.sh/users/3344333). -- The small displayer will use the tournament acronym if the tournament name is too long. -- New mods icons for qualifiers. +- New animation for scores. +
+- Fixed the transparent background for displayer styles. +- Now Score Reverse changes based on the **Old Colors** setting you have. + + Old Colors not active = Use Score Reverse if the first team is not red + + Old Colors active = Use Score Reverse if the first team is not blue +- Team Section added. +- To add a team click on the "Open Teams Folder" button and put here the image of the team. After this you can switch to match section and return to Teams section and you will see your new team. +- Now Teams can be edited with players and team name. +
+- After editing the name of the team it will reload the app. (There's a bug that I'll fix, but for now this is a method to prevent the bug. Still WIP) +- The team name should be the same as the team name in the lobby name! (Ex. (Little Pug) vs (Polished) / image name = Little Pug.png / Team name in the team edit should be the same too!) ### App -- New button in **Displayer Settings** to revert the colors to Blue/Red. -- New button in **Displayer Settings** to enable the small displayer. -- MatchID will not be saved anymore after closing the app. -- Now you can see the new changes in the Changelog Tab. -- Selecting 1v1 Match Type will disable score reverse. -- Now clicking the "Save" button will automatically copy the URL to paste into OBS/SLOBS. -- New page while opening the app for the first time. -- The settings now will be stored in your appdata folder. (This fixes the settings reset while updating the app). Requested by [@Poke714](https://osu.ppy.sh/users/8084370) -- New bar to see the download progress for the update. -- Everything outside the Match Section will be saved automatically on change. +- Performance improvement, now the app should use less memory! + +### Known Issues +- While editing and removing players from the team, sometimes the userid will appear wrong but it'll be saved correctly! ### Tournaments -- Added [3 digit world cup 2021](https://osu.ppy.sh/community/forums/topics/1256770) -- Added [Gary's Spring Hidden Tournament](https://osu.ppy.sh/community/forums/topics/1266715) -- Added [Azu's Tourneys: Summer vs Winter](https://osu.ppy.sh/community/forums/topics/1272759) -- Added [Bamboo Cup](https://osu.ppy.sh/community/forums/topics/1274066) -- Added [5 Digit Draft Cup](https://osu.ppy.sh/community/forums/topics/1279137) -- Added [The Perennial](https://osu.ppy.sh/community/forums/topics/1268244) -- Added [Neko's Club Tournament](https://osu.ppy.sh/community/forums/topics/1250915) -- Added [osu! European Tournament 4](https://osu.ppy.sh/community/forums/topics/1286344) \ No newline at end of file +- Added [Seal Cup](https://osu.ppy.sh/community/forums/topics/1306857) +- Added [Corsace Closed 2021](https://osu.ppy.sh/community/forums/topics/1324620) +- Added [Cursed Tourney #2](https://osu.ppy.sh/community/forums/topics/1306163) +- Added [Finnish Duo Cup](https://osu.ppy.sh/community/forums/topics/1313956) +- Added [Great Singapore Tournament 3](https://osu.ppy.sh/community/forums/topics/1323720) +- Added [Centaurea Open 2021](https://osu.ppy.sh/community/forums/topics/1323736) +- Added [Baku's Summer Trios](https://osu.ppy.sh/community/forums/topics/1331732) +- Added [Endless Mirage Tournament](https://discord.com/invite/RT9MBs6) \ No newline at end of file diff --git a/frontend/app.js b/frontend/app.js index 5174acb..9c1a1fa 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -214,11 +214,11 @@ function matchdata(api, mpid, warmups, interval, reverse, bestof, country, tourn } } // CHECK FOR TEAMS IMAGE - data.forEach(image => { - if(image.includes(team1nospace.toLowerCase())){ + data.images.forEach(image => { + if(image.includes(team1nameNoSpan)){ team1imgstring = `
`; } - if(image.includes(team2nospace.toLowerCase())){ + if(image.includes(team2nameNoSpan)){ team2imgstring = `
`; } }); @@ -242,49 +242,94 @@ function matchdata(api, mpid, warmups, interval, reverse, bestof, country, tourn tourneyfootertext.textContent = tournament_info_name; } - - - if(reverse == 'true' || reverse == true){ - team1Element.textContent = team2; - team2Element.textContent = team1; - if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ - clearInterval(interval); - team1img.innerHTML = ''; - team2img.innerHTML = ''; - tourneyheadertext.textContent = ''; - tourneyfootertext.textContent = ''; - if(team1 == (bestof/2)+0.5){ - textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; - visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); - } else { - textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; - visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); - } - } else { - team1Element.textContent = team2; - team2Element.textContent = team1; - } - } else { - team1Element.textContent = team1; - team2Element.textContent = team2; - if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ - clearInterval(interval); - team1img.innerHTML = ''; - team2img.innerHTML = ''; - tourneyheadertext.textContent = ''; - tourneyfootertext.textContent = ''; - if(team1 == (bestof/2)+0.5){ - textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; - visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); - } else { - textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; - visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); - } + + + if(oldcolors == true){ + if(reverse == 'true' || reverse == true){ + team1Element.textContent = team2; + team2Element.textContent = team1; + if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ + clearInterval(interval); + team1img.innerHTML = ''; + team2img.innerHTML = ''; + tourneyheadertext.textContent = ''; + tourneyfootertext.textContent = ''; + if(team1 == (bestof/2)+0.5){ + textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); + } else { + textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); + } + } else { + team1Element.textContent = team2; + team2Element.textContent = team1; + } + } else { + team1Element.textContent = team1; + team2Element.textContent = team2; + if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ + clearInterval(interval); + team1img.innerHTML = ''; + team2img.innerHTML = ''; + tourneyheadertext.textContent = ''; + tourneyfootertext.textContent = ''; + if(team1 == (bestof/2)+0.5){ + textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); + } else { + textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); + } + } else { + team1Element.textContent = team1; + team2Element.textContent = team2; + } + } } else { - team1Element.textContent = team1; - team2Element.textContent = team2; + if(reverse == 'false' || reverse == false){ + team1Element.textContent = team2; + team2Element.textContent = team1; + if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ + clearInterval(interval); + team1img.innerHTML = ''; + team2img.innerHTML = ''; + tourneyheadertext.textContent = ''; + tourneyfootertext.textContent = ''; + if(team1 == (bestof/2)+0.5){ + textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); + } else { + textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); + } + } else { + team1Element.textContent = team2; + team2Element.textContent = team1; + } + } else { + team1Element.textContent = team1; + team2Element.textContent = team2; + if(team1 == (bestof/2)+0.5 || team2 == (bestof/2)+0.5){ + clearInterval(interval); + team1img.innerHTML = ''; + team2img.innerHTML = ''; + tourneyheadertext.textContent = ''; + tourneyfootertext.textContent = ''; + if(team1 == (bestof/2)+0.5){ + textzone.innerHTML = `${team1imgstring} ${team1name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerRed.png')"); + } else { + textzone.innerHTML = `${team2imgstring} ${team2name} wins!`; + visualizer.style.setProperty('--visualizer-background', "url('/assets/images/winnerBlue.png')"); + } + } else { + team1Element.textContent = team1; + team2Element.textContent = team2; + } + } } - } + diff --git a/frontend/assets/odometer-theme-minimal.css b/frontend/assets/odometer-theme-minimal.css new file mode 100644 index 0000000..f0c3ad6 --- /dev/null +++ b/frontend/assets/odometer-theme-minimal.css @@ -0,0 +1,81 @@ +.odometer.odometer-auto-theme, .odometer.odometer-theme-minimal { + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + *zoom: 1; + *display: inline; + position: relative; +} +.odometer.odometer-auto-theme .odometer-digit, .odometer.odometer-theme-minimal .odometer-digit { + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + *zoom: 1; + *display: inline; + position: relative; +} +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-spacer, .odometer.odometer-theme-minimal .odometer-digit .odometer-digit-spacer { + display: inline-block; + vertical-align: middle; + *vertical-align: auto; + *zoom: 1; + *display: inline; + visibility: hidden; +} +.odometer.odometer-auto-theme .odometer-digit .odometer-digit-inner, .odometer.odometer-theme-minimal .odometer-digit .odometer-digit-inner { + text-align: left; + display: block; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; +} +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon, .odometer.odometer-theme-minimal .odometer-digit .odometer-ribbon { + display: block; +} +.odometer.odometer-auto-theme .odometer-digit .odometer-ribbon-inner, .odometer.odometer-theme-minimal .odometer-digit .odometer-ribbon-inner { + display: block; + -webkit-backface-visibility: hidden; +} +.odometer.odometer-auto-theme .odometer-digit .odometer-value, .odometer.odometer-theme-minimal .odometer-digit .odometer-value { + display: block; + -webkit-transform: translateZ(0); +} +.odometer.odometer-auto-theme .odometer-digit .odometer-value.odometer-last-value, .odometer.odometer-theme-minimal .odometer-digit .odometer-value.odometer-last-value { + position: absolute; +} +.odometer.odometer-auto-theme.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-theme-minimal.odometer-animating-up .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; +} +.odometer.odometer-auto-theme.odometer-animating-up.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-minimal.odometer-animating-up.odometer-animating .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +.odometer.odometer-auto-theme.odometer-animating-down .odometer-ribbon-inner, .odometer.odometer-theme-minimal.odometer-animating-down .odometer-ribbon-inner { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); +} +.odometer.odometer-auto-theme.odometer-animating-down.odometer-animating .odometer-ribbon-inner, .odometer.odometer-theme-minimal.odometer-animating-down.odometer-animating .odometer-ribbon-inner { + -webkit-transition: -webkit-transform 2s; + -moz-transition: -moz-transform 2s; + -ms-transition: -ms-transform 2s; + -o-transition: -o-transform 2s; + transition: transform 2s; + -webkit-transform: translateY(0); + -moz-transform: translateY(0); + -ms-transform: translateY(0); + -o-transform: translateY(0); + transform: translateY(0); +} diff --git a/frontend/assets/odometer.min.js b/frontend/assets/odometer.min.js new file mode 100644 index 0000000..3de9772 --- /dev/null +++ b/frontend/assets/odometer.min.js @@ -0,0 +1,2 @@ +/*! odometer 0.4.6 */ +(function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G=[].slice;q='',n=''+q+"",d='8'+n+"",g='',c="(,ddd).dd",h=/^\(?([^)]*)\)?(?:(.)(d+))?$/,i=30,f=2e3,a=20,j=2,e=.5,k=1e3/i,b=1e3/a,o="transitionend webkitTransitionEnd oTransitionEnd otransitionend MSTransitionEnd",y=document.createElement("div").style,p=null!=y.transition||null!=y.webkitTransition||null!=y.mozTransition||null!=y.oTransition,w=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,l=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,s=function(a){var b;return b=document.createElement("div"),b.innerHTML=a,b.children[0]},v=function(a,b){return a.className=a.className.replace(new RegExp("(^| )"+b.split(" ").join("|")+"( |$)","gi")," ")},r=function(a,b){return v(a,b),a.className+=" "+b},z=function(a,b){var c;return null!=document.createEvent?(c=document.createEvent("HTMLEvents"),c.initEvent(b,!0,!0),a.dispatchEvent(c)):void 0},u=function(){var a,b;return null!=(a=null!=(b=window.performance)?"function"==typeof b.now?b.now():void 0:void 0)?a:+new Date},x=function(a,b){return null==b&&(b=0),b?(a*=Math.pow(10,b),a+=.5,a=Math.floor(a),a/=Math.pow(10,b)):Math.round(a)},A=function(a){return 0>a?Math.ceil(a):Math.floor(a)},t=function(a){return a-x(a)},C=!1,(B=function(){var a,b,c,d,e;if(!C&&null!=window.jQuery){for(C=!0,d=["html","text"],e=[],b=0,c=d.length;c>b;b++)a=d[b],e.push(function(a){var b;return b=window.jQuery.fn[a],window.jQuery.fn[a]=function(a){var c;return null==a||null==(null!=(c=this[0])?c.odometer:void 0)?b.apply(this,arguments):this[0].odometer.update(a)}}(a));return e}})(),setTimeout(B,0),m=function(){function a(b){var c,d,e,g,h,i,l,m,n,o,p=this;if(this.options=b,this.el=this.options.el,null!=this.el.odometer)return this.el.odometer;this.el.odometer=this,m=a.options;for(d in m)g=m[d],null==this.options[d]&&(this.options[d]=g);null==(h=this.options).duration&&(h.duration=f),this.MAX_VALUES=this.options.duration/k/j|0,this.resetFormat(),this.value=this.cleanValue(null!=(n=this.options.value)?n:""),this.renderInside(),this.render();try{for(o=["innerHTML","innerText","textContent"],i=0,l=o.length;l>i;i++)e=o[i],null!=this.el[e]&&!function(a){return Object.defineProperty(p.el,a,{get:function(){var b;return"innerHTML"===a?p.inside.outerHTML:null!=(b=p.inside.innerText)?b:p.inside.textContent},set:function(a){return p.update(a)}})}(e)}catch(q){c=q,this.watchForMutations()}}return a.prototype.renderInside=function(){return this.inside=document.createElement("div"),this.inside.className="odometer-inside",this.el.innerHTML="",this.el.appendChild(this.inside)},a.prototype.watchForMutations=function(){var a,b=this;if(null!=l)try{return null==this.observer&&(this.observer=new l(function(){var a;return a=b.el.innerText,b.renderInside(),b.render(b.value),b.update(a)})),this.watchMutations=!0,this.startWatchingMutations()}catch(c){a=c}},a.prototype.startWatchingMutations=function(){return this.watchMutations?this.observer.observe(this.el,{childList:!0}):void 0},a.prototype.stopWatchingMutations=function(){var a;return null!=(a=this.observer)?a.disconnect():void 0},a.prototype.cleanValue=function(a){var b;return"string"==typeof a&&(a=a.replace(null!=(b=this.format.radix)?b:".",""),a=a.replace(/[.,]/g,""),a=a.replace("","."),a=parseFloat(a,10)||0),x(a,this.format.precision)},a.prototype.bindTransitionEnd=function(){var a,b,c,d,e,f,g=this;if(!this.transitionEndBound){for(this.transitionEndBound=!0,b=!1,e=o.split(" "),f=[],c=0,d=e.length;d>c;c++)a=e[c],f.push(this.el.addEventListener(a,function(){return b?!0:(b=!0,setTimeout(function(){return g.render(),b=!1,z(g.el,"odometerdone")},0),!0)},!1));return f}},a.prototype.resetFormat=function(){var a,b,d,e,f,g,i,j;if(a=null!=(i=this.options.format)?i:c,a||(a="d"),d=h.exec(a),!d)throw new Error("Odometer: Unparsable digit format");return j=d.slice(1,4),g=j[0],f=j[1],b=j[2],e=(null!=b?b.length:void 0)||0,this.format={repeating:g,radix:f,precision:e}},a.prototype.render=function(a){var b,c,d,e,f,g,h,i,j,k,l,m;for(null==a&&(a=this.value),this.stopWatchingMutations(),this.resetFormat(),this.inside.innerHTML="",g=this.options.theme,b=this.el.className.split(" "),f=[],i=0,k=b.length;k>i;i++)c=b[i],c.length&&((e=/^odometer-theme-(.+)$/.exec(c))?g=e[1]:/^odometer(-|$)/.test(c)||f.push(c));for(f.push("odometer"),p||f.push("odometer-no-transitions"),f.push(g?"odometer-theme-"+g:"odometer-auto-theme"),this.el.className=f.join(" "),this.ribbons={},this.digits=[],h=!this.format.precision||!t(a)||!1,m=a.toString().split("").reverse(),j=0,l=m.length;l>j;j++)d=m[j],"."===d&&(h=!0),this.addDigit(d,h);return this.startWatchingMutations()},a.prototype.update=function(a){var b,c=this;return a=this.cleanValue(a),(b=a-this.value)?(v(this.el,"odometer-animating-up odometer-animating-down odometer-animating"),b>0?r(this.el,"odometer-animating-up"):r(this.el,"odometer-animating-down"),this.stopWatchingMutations(),this.animate(a),this.startWatchingMutations(),setTimeout(function(){return c.el.offsetHeight,r(c.el,"odometer-animating")},0),this.value=a):void 0},a.prototype.renderDigit=function(){return s(d)},a.prototype.insertDigit=function(a,b){return null!=b?this.inside.insertBefore(a,b):this.inside.children.length?this.inside.insertBefore(a,this.inside.children[0]):this.inside.appendChild(a)},a.prototype.addSpacer=function(a,b,c){var d;return d=s(g),d.innerHTML=a,c&&r(d,c),this.insertDigit(d,b)},a.prototype.addDigit=function(a,b){var c,d,e,f;if(null==b&&(b=!0),"-"===a)return this.addSpacer(a,null,"odometer-negation-mark");if("."===a)return this.addSpacer(null!=(f=this.format.radix)?f:".",null,"odometer-radix-mark");if(b)for(e=!1;;){if(!this.format.repeating.length){if(e)throw new Error("Bad odometer format without digits");this.resetFormat(),e=!0}if(c=this.format.repeating[this.format.repeating.length-1],this.format.repeating=this.format.repeating.substring(0,this.format.repeating.length-1),"d"===c)break;this.addSpacer(c)}return d=this.renderDigit(),d.querySelector(".odometer-value").innerHTML=a,this.digits.push(d),this.insertDigit(d)},a.prototype.animate=function(a){return p&&"count"!==this.options.animation?this.animateSlide(a):this.animateCount(a)},a.prototype.animateCount=function(a){var c,d,e,f,g,h=this;if(d=+a-this.value)return f=e=u(),c=this.value,(g=function(){var i,j,k;return u()-f>h.options.duration?(h.value=a,h.render(),void z(h.el,"odometerdone")):(i=u()-e,i>b&&(e=u(),k=i/h.options.duration,j=d*k,c+=j,h.render(Math.round(c))),null!=w?w(g):setTimeout(g,b))})()},a.prototype.getDigitCount=function(){var a,b,c,d,e,f;for(d=1<=arguments.length?G.call(arguments,0):[],a=e=0,f=d.length;f>e;a=++e)c=d[a],d[a]=Math.abs(c);return b=Math.max.apply(Math,d),Math.ceil(Math.log(b+1)/Math.log(10))},a.prototype.getFractionalDigitCount=function(){var a,b,c,d,e,f,g;for(e=1<=arguments.length?G.call(arguments,0):[],b=/^\-?\d*\.(\d*?)0*$/,a=f=0,g=e.length;g>f;a=++f)d=e[a],e[a]=d.toString(),c=b.exec(e[a]),e[a]=null==c?0:c[1].length;return Math.max.apply(Math,e)},a.prototype.resetDigits=function(){return this.digits=[],this.ribbons=[],this.inside.innerHTML="",this.resetFormat()},a.prototype.animateSlide=function(a){var b,c,d,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y,z,B,C,D,E;if(s=this.value,j=this.getFractionalDigitCount(s,a),j&&(a*=Math.pow(10,j),s*=Math.pow(10,j)),d=a-s){for(this.bindTransitionEnd(),f=this.getDigitCount(s,a),g=[],b=0,m=v=0;f>=0?f>v:v>f;m=f>=0?++v:--v){if(t=A(s/Math.pow(10,f-m-1)),i=A(a/Math.pow(10,f-m-1)),h=i-t,Math.abs(h)>this.MAX_VALUES){for(l=[],n=h/(this.MAX_VALUES+this.MAX_VALUES*b*e),c=t;h>0&&i>c||0>h&&c>i;)l.push(Math.round(c)),c+=n;l[l.length-1]!==i&&l.push(i),b++}else l=function(){E=[];for(var a=t;i>=t?i>=a:a>=i;i>=t?a++:a--)E.push(a);return E}.apply(this);for(m=w=0,y=l.length;y>w;m=++w)k=l[m],l[m]=Math.abs(k%10);g.push(l)}for(this.resetDigits(),D=g.reverse(),m=x=0,z=D.length;z>x;m=++x)for(l=D[m],this.digits[m]||this.addDigit(" ",m>=j),null==(u=this.ribbons)[m]&&(u[m]=this.digits[m].querySelector(".odometer-ribbon-inner")),this.ribbons[m].innerHTML="",0>d&&(l=l.reverse()),o=C=0,B=l.length;B>C;o=++C)k=l[o],q=document.createElement("div"),q.className="odometer-value",q.innerHTML=k,this.ribbons[m].appendChild(q),o===l.length-1&&r(q,"odometer-last-value"),0===o&&r(q,"odometer-first-value");return 0>t&&this.addDigit("-"),p=this.inside.querySelector(".odometer-radix-mark"),null!=p&&p.parent.removeChild(p),j?this.addSpacer(this.format.radix,this.digits[j-1],"odometer-radix-mark"):void 0}},a}(),m.options=null!=(E=window.odometerOptions)?E:{},setTimeout(function(){var a,b,c,d,e;if(window.odometerOptions){d=window.odometerOptions,e=[];for(a in d)b=d[a],e.push(null!=(c=m.options)[a]?(c=m.options)[a]:c[a]=b);return e}},0),m.init=function(){var a,b,c,d,e,f;if(null!=document.querySelectorAll){for(b=document.querySelectorAll(m.options.selector||".odometer"),f=[],c=0,d=b.length;d>c;c++)a=b[c],f.push(a.odometer=new m({el:a,value:null!=(e=a.innerText)?e:a.textContent}));return f}},null!=(null!=(F=document.documentElement)?F.doScroll:void 0)&&null!=document.createEventObject?(D=document.onreadystatechange,document.onreadystatechange=function(){return"complete"===document.readyState&&m.options.auto!==!1&&m.init(),null!=D?D.apply(this,arguments):void 0}):document.addEventListener("DOMContentLoaded",function(){return m.options.auto!==!1?m.init():void 0},!1),"function"==typeof define&&define.amd?define(["jquery"],function(){return m}):typeof exports===!1?module.exports=m:window.Odometer=m}).call(this); \ No newline at end of file diff --git a/frontend/assets/scoremodification.js b/frontend/assets/scoremodification.js index b737831..e782433 100644 --- a/frontend/assets/scoremodification.js +++ b/frontend/assets/scoremodification.js @@ -54,7 +54,54 @@ function modsModifiers(mods, score, modifier){ let scoremod = score; - + if(modarr.includes('NM') == true){ + if(modifier.NM.type == '*'){ + scoremod = score * parseFloat(modifier.NM.value); + } else if (modifier.NM.type == '/'){ + scoremod = score / parseFloat(modifier.NM.value); + } + //scoremod = score * parseFloat(modifier.FL); + } + if(modarr.includes('HR') == true){ + if(modifier.HR.type == '*'){ + scoremod = score * parseFloat(modifier.HR.value); + } else if (modifier.HR.type == '/'){ + scoremod = score / parseFloat(modifier.HR.value); + } + //scoremod = score * parseFloat(modifier.FL); + } + if(modarr.includes('HD') == true){ + if(modifier.HD.type == '*'){ + scoremod = score * parseFloat(modifier.HD.value); + } else if (modifier.HD.type == '/'){ + scoremod = score / parseFloat(modifier.HD.value); + } + //scoremod = score * parseFloat(modifier.FL); + } + if(modarr.includes('HDHR') == true){ + if(modifier.HDHR.type == '*'){ + scoremod = score * parseFloat(modifier.HDHR.value); + } else if (modifier.HDHR.type == '/'){ + scoremod = score / parseFloat(modifier.HDHR.value); + } + //scoremod = score * parseFloat(modifier.FL); + } + if(modarr.includes('HDEZ') == true){ + if(modifier.HDEZ.type == '*'){ + scoremod = score * parseFloat(modifier.HDEZ.value); + } else if (modifier.HDEZ.type == '/'){ + scoremod = score / parseFloat(modifier.HDEZ.value); + } + //scoremod = score * parseFloat(modifier.FL); + } + if(modarr.includes('EZFL') == true){ + if(modifier.EZFL.type == '*'){ + scoremod = score * parseFloat(modifier.EZFL.value); + } else if (modifier.EZFL.type == '/'){ + scoremod = score / parseFloat(modifier.EZFL.value); + } + //scoremod = score * parseFloat(modifier.FL); + } if(modarr.includes('EZ') == true){ if(modifier.EZ.type == '*'){ scoremod = score * parseFloat(modifier.EZ.value); diff --git a/frontend/assets/style.css b/frontend/assets/style.css index 3eb368c..30ac78b 100644 --- a/frontend/assets/style.css +++ b/frontend/assets/style.css @@ -598,6 +598,224 @@ input::selection, textarea::selection { font-weight: 800; } + +/*----------------------------------------------------------- Teams List -------------------------------------------*/ + +#openfolderteams { + margin: 0px 0px 10px 0px; + padding: 10px; + align-items: center; + display: flex; + fill: #222; +} + +#teams_tab { + margin: 15px 15px !important; +} + +.ui.card>.button, .ui.card>.buttons, .ui.cards>.card>.button, .ui.cards>.card>.buttons { + margin: 0; + width: calc(100%); + position: absolute; + bottom: -34px; +} + +.ui.card, .ui.cards>.card { + max-width: 150px; + font-size: 12px; + background: #181818; + box-shadow: 0 1px 3px 0 #2b2b2b, 0 0 0 1px #222223; + -webkit-box-shadow: 0 1px 3px 0 #2b2b2b, 0 0 0 1px #222223; + margin-bottom: 35px; +} + +.ui.card, .ui.cards>.card>.content { + flex-grow: 0; +} + +.ui.cards>.card div.header { + color: #DDD !important; +} + +.ui.cards>.card .meta { + display: flex; + flex-direction: column; + position: relative; +} + +.team_player_list { + display: flex; + flex-direction: row; + margin: auto !important; + width: 140px; + padding: 0px; + flex-wrap: wrap; +} + +.listeditteam { + background: #181818; + box-shadow: 0 1px 3px 0 #2b2b2b, 0 0 0 1px #222223; + -webkit-box-shadow: 0 1px 3px 0 #2b2b2b, 0 0 0 1px #222223; +} + +.listeditteam_players { + margin-top: 2px; + margin-bottom: 2px; + margin-right: 3px !important; +} + +.team_player_list_noplayers { + color: rgb(252, 82, 82); + text-align: center; + width: 140px; + padding-bottom: 16px; +} + +.team_player_list .list { + display: flex; + flex-direction: row; + margin: auto !important; + width: auto; + padding: 0px; + flex-wrap: wrap; + justify-content: center; +} + +.team_player_list_edit { + display: block; + position: absolute; + z-index: 333; + background: #181818; + width: 150px; + left: 0px; + bottom: -18px; +} + +.team_player_list_edit .list { + display: flex; + flex-direction: column; + margin: auto !important; + width: auto; + padding: 0px; + flex-wrap: wrap; + justify-content: center; +} + +.team_player_list_edit .list .item { + display: flex; + flex-direction: row; + align-items: center; + margin-right: 5px !important; + margin-top: 0px !important; + margin-bottom: 3px !important; + height: 26px; +} + +#teamname_input { + margin-left: 8px; + width: 134px; + font-size: 11px; +} + +input.errPlayer { + border: 1px rgb(224, 83, 83) solid !important; +} + +.buttoneditlist { + height: 20px; + font-size: 11px !important; + padding: 3px 20px !important; + border-radius: 15px !important; + margin: auto !important; + margin-top: 2px !important; + background-color: transparent !important; +} + +.buttoneditlist.add { + border: 1px solid rgb(79, 79, 225); + color: rgb(79, 79, 225); + margin-top: 0px !important; +} + +.buttoneditlist.add:hover { + border: 1px solid rgb(79, 79, 225); + color: rgb(65, 65, 225); +} + +.buttoneditlist.save { + border: 1px solid rgb(95, 224, 83); + color: rgb(95, 224, 83); + width: 65px; + margin: 0px !important; + margin-right: 3.5px !important; +} + +.buttoneditlist.save:hover { + border: 1px solid rgb(95, 224, 83); + color: rgb(80, 221, 83); +} + +.buttoneditlist.cancel { + border: 1px solid rgb(224, 83, 83); + color: rgb(224, 83, 83); + width: 65px; + margin: 0px !important; + margin-left: 3.5px !important; + padding: 3px 12px !important +} + +.buttoneditlist.cancel:hover { + border: 1px solid rgb(224, 83, 83); + color: rgb(223, 68, 83); +} + +.buttonremplayer { + width: 25px; + height: 25px; + padding: 0px !important; + border-radius: 50% !important; + background-color: transparent !important; + border: 1px solid rgb(224, 83, 83) !important; + fill: rgb(224, 83, 83) !important; + margin-left: 2px !important; +} + +.list_buttons { + flex-direction: row; + display: flex; + align-self: center; + margin: 1px 0px 5px 0px; +} + +.team_player_list_edit .list .item div.field { + display: flex; + height: 25px; + align-content: center; + vertical-align: middle; +} + +.team_player_list_edit .list .item div.field input { + padding: 4px; + font-size: 10px; + width: 76px; +} + +.team_player_list .list img, .team_player_list_edit .list img { + width: 25px; + height: 25px; + border-radius: 50%; + margin-left: 5px; + margin-right: 5px !important; + margin-bottom: 10px; +} + +.team_player_list_edit { + display: none; + position: absolute; + top: -35px; + background: #181818; +} + @supports (font-variation-settings: normal) { @font-face { font-family: 'QSVF'; diff --git a/frontend/assets/tourneys.json b/frontend/assets/tourneys.json index 4c19d17..d7d96cf 100644 --- a/frontend/assets/tourneys.json +++ b/frontend/assets/tourneys.json @@ -1040,6 +1040,230 @@ "end": "06/26/2021" } }, + "SEAL": { + "name": "Seal Cup", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.80" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "1306857", + "date": { + "start": "05/21/2021", + "end": "07/04/2021" + } + }, + "CC": { + "name": "Corsace Closed 2021", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.00" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "1324620", + "date": { + "start": "05/22/2021", + "end": "07/04/2021" + } + }, + "CT2": { + "name": "Cursed Tourney #2", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.75" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "1306163", + "date": { + "start": "05/22/2021", + "end": "07/11/2021" + } + }, + "FDC": { + "name": "Finnish Duo Cup", + "modifiers": { + "NM": { + "type": "*", + "value": "0.75" + }, + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.06" + }, + "EZ": { + "type": "*", + "value": "1.75" + }, + "FL": { + "type": "*", + "value": "1.00" + }, + "HDHR": { + "type": "*", + "value": "1.03" + }, + "HDEZ": { + "type": "*", + "value": "1.85" + } + }, + "forumID": "1313956", + "date": { + "start": "05/28/2021", + "end": "07/11/2021" + } + }, + "GST3": { + "name": "Great Singapore Tournament 3", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.00" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "1323720", + "date": { + "start": "06/19/2021", + "end": "08/01/2021" + } + }, + "CO21": { + "name": "Centaurea Open 2021", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.10" + }, + "EZ": { + "type": "*", + "value": "1.80" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "1323736", + "date": { + "start": "06/19/2021", + "end": "08/01/2021" + } + }, + "BST": { + "name": "Baku's Summer Trios", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.75" + }, + "FL": { + "type": "*", + "value": "2.00" + }, + "EZFL": { + "type": "*", + "value": "2.50" + } + }, + "forumID": "1331732", + "date": { + "start": "06/25/2021", + "end": "08/01/2021" + } + }, + "EMT": { + "name": "Endless Mirage Tournament", + "modifiers": { + "HD": { + "type": "*", + "value": "1.00" + }, + "HR": { + "type": "*", + "value": "1.00" + }, + "EZ": { + "type": "*", + "value": "1.00" + }, + "FL": { + "type": "*", + "value": "1.00" + } + }, + "forumID": "https://discord.com/invite/RT9MBs6", + "date": { + "start": "06/05/2021", + "end": "07/20/2021" + } + }, "": { "name": "", "modifiers": { diff --git a/frontend/index.html b/frontend/index.html index 204bb4b..0dab103 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -12,6 +12,8 @@ + + @@ -86,6 +88,12 @@ Displayer Settings + + + + Teams + + @@ -324,6 +332,16 @@

+
+ +
+ +
+
@@ -361,6 +379,8 @@

+ +
@@ -449,11 +469,21 @@

document.querySelector('.buttonField').style.display = 'block' }) + document.querySelector('#teams_button').addEventListener('click', e => { + e.preventDefault(); + document.querySelector('.buttonField').style.display = 'none' + }) + + + + + + diff --git a/frontend/visualizer/style.css b/frontend/visualizer/style.css index 0ceb2d6..2b30a9a 100644 --- a/frontend/visualizer/style.css +++ b/frontend/visualizer/style.css @@ -16,10 +16,11 @@ body, html { background: rgba(40,38,40,1.05); font-weight: 600; overflow: hidden; + background-color: transparent; } .settings { - background: rgba(40,38,40,1.05) !important; + background: transparent !important; } body { @@ -111,7 +112,7 @@ input[type='number'] { justify-content: center; height: 100%; width: 100%; - background-color: magenta; + background-color: transparent; } .selectmatchtype { @@ -216,6 +217,10 @@ input[type='number'] { padding: 2px 3px !important; } +.paddingfix .odometer, .paddingfix .odometer-inside, .paddingfix .odometer-digit, .paddingfix .odometer-digit-spacer, .paddingfix .odometer-digit-inner, .paddingfix .odometer-ribbon, .paddingfix .odometer-ribbon-inner, .paddingfix .odometer-value { + padding: 0px 0px !important; +} + .teaminner1 { display: table; font-size: 1.1em; @@ -320,6 +325,27 @@ input[type='number'] { + + + + + + + + + + + + +.odometer.odometer-animating-up .odometer-ribbon-inner, .odometer.odometer-animating-down.odometer-animating .odometer-ribbon-inner { + -webkit-transition-duration: 300ms !important; + -moz-transition-duration: 300ms !important; + -ms-transition-duration: 300ms !important; + -o-transition-duration: 300ms !important; + transition-duration: 300ms !important +} + + @supports (font-variation-settings: normal) { @font-face { font-family: 'QSVF'; diff --git a/frontend/visualizer/visualizer.html b/frontend/visualizer/visualizer.html index da08912..19e026a 100644 --- a/frontend/visualizer/visualizer.html +++ b/frontend/visualizer/visualizer.html @@ -5,6 +5,7 @@ osu! Match OBS Displayer +
@@ -54,7 +55,7 @@
- 0 - 0 + 0 - 0
@@ -63,6 +64,7 @@ }) + diff --git a/index.js b/index.js index 4dbc897..d325a08 100644 --- a/index.js +++ b/index.js @@ -4,6 +4,9 @@ const fs = require('fs') const open = require('open') const path = require('path') const fetch = require('node-fetch') +const os = require('os') + +os.setPriority(-20) const socket = require('socket.io') const appexp = express() @@ -82,6 +85,14 @@ appexp.get('/assets/style.css', (req, res) => { res.sendFile(path.join(__dirname, 'frontend/assets/style.css')) }) +appexp.get('/assets/odometer.min.js', (req, res) => { + res.sendFile(path.join(__dirname, 'frontend/assets/odometer.min.js')) +}) + +appexp.get('/assets/odometer-theme-minimal.css', (req, res) => { + res.sendFile(path.join(__dirname, 'frontend/assets/odometer-theme-minimal.css')) +}) + appexp.get('/assets/semantic.min.css', (req, res) => { res.sendFile(path.join(__dirname, 'frontend/assets/semantic.min.css')) }) @@ -163,7 +174,7 @@ appexp.get('/settings', (req, res) => { }) appexp.get('/teams', (req, res) => { - fs.readdir(documentsFolder + '/otmd/teams', async (err, data) => { + fs.readdir(documentsFolder + `/otmd/teams`, async (err, data) => { if(err){ res.json(['nodata']); return @@ -172,7 +183,21 @@ appexp.get('/teams', (req, res) => { if(data == ''){ res.json(['nodata']); } else { - res.json(data) + let teamimages = []; + let teamsettings = []; + data.forEach((file) => { + if(file.search('.*\.(jpeg|jpg|png)$') === 0){ + teamimages.push(file) + } else { + teamsettings.push(file.replace(/\.[^/.]+$/, "")) + appexp.get(`/teams/${file.replace(/\.[^/.]+$/, "")}`, (req, res) => { + let datafile = fs.readFileSync(documentsFolder + `/otmd/teams/${file}`, 'utf8'); + res.json(JSON.parse(datafile)) + }) + } + }) + let finalData = { images: teamimages, settings: teamsettings} + res.json(finalData) } }) @@ -198,6 +223,7 @@ appexp.get('/version', (req, res) => { // ----------------------------------------------------------------------------- app.setAppUserModelId('osu! Tourney Match Displayer') +app.disableHardwareAcceleration() app.on('ready', function() { @@ -205,7 +231,7 @@ app.on('ready', function() { console.log(`Running on http://localhost:${server.address().port}`) }) - //globalShortcut.unregister('Control+Shift+I') + globalShortcut.unregister('Control+Shift+I') /*let loading = new BrowserWindow({show: false, width: 1000, height: 600, frame: false}) var mainWindow = null;*/ @@ -230,6 +256,7 @@ app.on('ready', function() { mainWindow.webContents.on('dom-ready', () => { mainWindow.show(); }) + mainWindow.webContents.setFrameRate(60) function showNotification(title, body) { const notification = { @@ -412,6 +439,69 @@ app.on('ready', function() { fs.writeFileSync(documentsFolder+'/otmd/settings.json', JSON.stringify(data)) io.emit('new_settings') }) + + socket.on('open_team_folder', (data) => { + require('electron').shell.openPath(documentsFolder + '/otmd/teams') + }) + + + socket.on('edit_teamname', (datatoSave) => { + let datafile = JSON.parse(fs.readFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, 'utf8')) + const { img, file, team_name, players } = datafile + let newData = { + "img": img, + "file": `${datatoSave.name}.json`, + "team_name": datatoSave.name, + "players": players + } + fs.writeFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, JSON.stringify(newData)) + let nameforimage = datatoSave.file.split('.').slice(0, -1).join('.'); + fs.renameSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, documentsFolder + `/otmd/teams/${datatoSave.name}.json`) + fs.renameSync(documentsFolder + `/otmd/teams/${nameforimage}.${img}`, documentsFolder + `/otmd/teams/${datatoSave.name}.${img}`) + }) + + socket.on('remove_player', (datatoSave) => { + let datafile = JSON.parse(fs.readFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, 'utf8')) + const { img, file, team_name, players } = datafile + players.splice(datatoSave.position - 1, 1); + let newData = { + "img": img, + "file": file, + "team_name": team_name, + "players": players + } + fs.writeFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, JSON.stringify(newData)) + }) + + socket.on('save_team', (datatoSave) => { + + let folder = fs.readdirSync(documentsFolder + '/otmd/teams') + if(!folder.includes(datatoSave.file)){ + folder.forEach((file) => { + if(file.search(`${datatoSave.team}.*\.(jpeg|jpg|png)$`) === 0){ + var re = /(?:\.([^.]+))?$/; + var ext = re.exec(file)[1]; + let dataFirst = { + "img": ext, + "file": datatoSave.file, + "team_name": datatoSave.team, + "players": [] + } + fs.writeFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, JSON.stringify(dataFirst)) + } + }) + } + let datafile = JSON.parse(fs.readFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, 'utf8')) + const { img, file, team_name, players } = datafile + players[datatoSave.position - 1] = { "name": datatoSave.playername, "id": datatoSave.playerid } + let newData = { + "img": img, + "file": file, + "team_name": team_name, + "players": players + } + fs.writeFileSync(documentsFolder + `/otmd/teams/${datatoSave.file}`, JSON.stringify(newData)) + }) }) diff --git a/package-lock.json b/package-lock.json index 3aa0251..c38bc89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "osu-tourney-match-displayer", - "version": "1.5.2", + "version": "1.5.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1706,6 +1706,11 @@ "base64-arraybuffer": "0.1.4" } }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==" + }, "env-paths": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", @@ -2568,6 +2573,14 @@ "type-check": "~0.3.2" } }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "requires": { + "uc.micro": "^1.0.1" + } + }, "lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -2603,6 +2616,18 @@ "semver": "^6.0.0" } }, + "markdown-it": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz", + "integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==", + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -2613,6 +2638,11 @@ "escape-string-regexp": "^4.0.0" } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -3799,6 +3829,11 @@ "is-typedarray": "^1.0.0" } }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "uid2": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", diff --git a/package.json b/package.json index 7fa6eee..1d3338a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osu-tourney-match-displayer", - "version": "1.6.0", + "version": "1.7.0", "description": "Displayer for osu! Tournament Matches", "main": "index.js", "repository": {