From bed7de6bd4da823d272d7393c5b83285a777a3b0 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 11:42:09 -0500 Subject: [PATCH 01/24] Add favicon --- .../Pages/Layouts/BaseLayout.cshtml | 9 + .../StaticFiles/android-chrome-192x192.png | Bin 0 -> 38655 bytes .../StaticFiles/android-chrome-512x512.png | Bin 0 -> 145211 bytes .../StaticFiles/apple-touch-icon.png | Bin 0 -> 8948 bytes .../StaticFiles/browserconfig.xml | 9 + .../StaticFiles/favicon-16x16.png | Bin 0 -> 1206 bytes .../StaticFiles/favicon-32x32.png | Bin 0 -> 2648 bytes ProjectLighthouse/StaticFiles/favicon.ico | Bin 0 -> 15086 bytes .../StaticFiles/mstile-150x150.png | Bin 0 -> 12348 bytes .../StaticFiles/safari-pinned-tab.svg | 223 ++++++++++++++++++ .../StaticFiles/site.webmanifest | 19 ++ 11 files changed, 260 insertions(+) create mode 100644 ProjectLighthouse/StaticFiles/android-chrome-192x192.png create mode 100644 ProjectLighthouse/StaticFiles/android-chrome-512x512.png create mode 100644 ProjectLighthouse/StaticFiles/apple-touch-icon.png create mode 100644 ProjectLighthouse/StaticFiles/browserconfig.xml create mode 100644 ProjectLighthouse/StaticFiles/favicon-16x16.png create mode 100644 ProjectLighthouse/StaticFiles/favicon-32x32.png create mode 100644 ProjectLighthouse/StaticFiles/favicon.ico create mode 100644 ProjectLighthouse/StaticFiles/mstile-150x150.png create mode 100644 ProjectLighthouse/StaticFiles/safari-pinned-tab.svg create mode 100644 ProjectLighthouse/StaticFiles/site.webmanifest diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml index 2e5ee465..b33b3e30 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml @@ -35,6 +35,15 @@ Project Lighthouse + + @* Favicon *@ + + + + + + +
diff --git a/ProjectLighthouse/StaticFiles/android-chrome-192x192.png b/ProjectLighthouse/StaticFiles/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..9b3eab523787e53bc9ce56cf256908f654cc0c02 GIT binary patch literal 38655 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 literal 0 HcmV?d00001 diff --git a/ProjectLighthouse/StaticFiles/android-chrome-512x512.png b/ProjectLighthouse/StaticFiles/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..09f9e579713c5fa8245275231db57deaf01c37ce GIT binary patch literal 145211 zcmeAS@N?(olHy`uVBq!ia0y~yU}6Aa4mJh`hA$OYelajGu%tWsIx;Y9?C1WI$jZRL zppfhlEaktaqG?B@+m6eRq`Em<~2*cM^1ej z8@~1Xy#3!IwFQ!u%tD>%MPh;5E76z)S*h z;JoUE^Sc;%O+JJk<*)y7SpVwp?~CRCdi;*uzOa!^YK46KD$W&+Z2LSam>A>V|F0K& z|2C@iyD;Z(HqVR&jrx32EDIXh<}tkz`Ifnj-7)X{)mzbRY=#*N8r7Xa${YBy1%70UzWOQ` z{yS&e`YU$ESA;f2$^Nd|AANe?twP(kajk5c84DV3We7B|?Yp!>=|lF~XVk zRyNyJ_h7!wzb*G2dy^lRr@dWOmh){V4{y)~2j-_>^+hX!UtHIIp`9Bs^?cfKiNgjK z*;^kiyk@rg`18#-W&O01H%4U4O7rYW@|?6qKqd2F;hbXybB-DG95I-4%)mvdrGTM@ zkwJk)V!_ko3l3LJd|5Au_+Ae2y)5F(92y+z85$ZGDjFCl;usnd7$_1rE!A<7OPtWr zCJl}~0U8`K)1U8*@#|=t{%NC!ivSm^>$FtSFz&zpyBV*j@m~FQEP3u9lXa4r4JQow<)qIx+u0xaJK7b-`q6c<9yzT3K;{Q|9P+OL|VaG)Z9@>%s||A8Oj3?~JjVemXU1WsQx{$>qVC zfkLdVfg)Q2G&DA;tYlcA&YQ-vNG^ymK;E-~>;BBzILBrIlMkUz%?u_Vmb$Pm{GZ8E z=gPSLzQi=uKL-^a7wnRVS9noSbw{uL@XM{1b9C1nz2tK-WP*Z+zN3H~&+%A^wnzad z5gqPgCI*9$sJ-=t_s)wtMyc>+bs97*)0E1Xv}#plXyE3qMJb}LCp9+BnWmzt*yS|m zeDTE^JMrhAf99A?KDlgiXN=io!B0Eq%~!=LN3(Jl zOD>zLvXa43ppNJGU5U1f3=SgUZ;qAK&P-6@R$c4l7&v9isuP-#VUsrLsHz6`h*j8~ zdHPvUZ@zz;@yiganP<{2W$KA>e*WkYG9lHo@p#jJPY))C)JX~3+PUUSrz~jHm)*B! zasYF@;1$g;tJi+g=B$?Cak`(iIZ)PiZ{N3b>l(}jGRiFG=B_z<%g@+H+H;aGizk}_ z&t}Dz7mu>`HEL-HF?(J%aSWZ(vq;0!b(-)d9d#B*4sKSvGfzJ~%u$o|K9<~hBFI9v zyKU!(Lr#ox!c4ZDE8KX_n6NW!?QHy5!OH7&;lO!oP{yBceMR8c)sWxELiZJFbJosL z@Vt|>HE8Wy*>CgyHC}TF4&HwD;fo~QYk6IZqPn%K*_}EvIestaTkFBsl6tvmQlN;c zs&`O`Nb6Ci^ZL(gd+L@vgb>jKwNjjcfQzkcOu`GR`*c*Eqfi4}Kjk{G;V)*3wx{y4TL#ySFSLJ9_=)x9>Jb#H$FyUv**sA8QJ4{=w^yi+=(TZlURci z+yv&e2$-C3V7A|$;giB!voKNV$7;^MS!Fdb+mACcq)SZ8dHrhB*3yz+v!bG{ZQ|nh zpM7}ah=Gs3p8zAz;WbCE{uTdZd(p&~nZY+SH1x7b=}(8yF88ig8eNMtCWZZJuIm?Q z6VSRV&cx#^(e}`yEfIvO_8d28F}N$IZ>6c!GNDeUZdwFien@Cs;MFZkrws!I(k%4s zC!S7O7TkHHrlQbLCNk=b&Y82%KHXfy(%-s&qKw2=*0d)K3${&TV2}bO6tjIC`uWVf zQxe7lOCpIa0PSWUHq~WKYp28Y~(b8X9`kV2#QFMh1rCg)PD?egZ6Q!Ypl%E&MK<9NeIDbc2qoF^{jYj_+j? z-yjj!Koj2}6;}Zj*9j`FlT>SBC3j~i$X+>-efxOn;P_TV@5@0QCU_| z;fsHJQx*nHNHCSW@O|~nX$u_Lq<-uK)qx+3k4lC7DP8@IbCOC-9{=U-b$j=(&X1jM zFL5Vt^G)+Wle@jbE&PWK#OxNQ$6q$#HSrA&37w|uIq7NY&vV5x^Upv19AkG}Kfh9O z{%O&on`;g{Enaj$T*XmC!^v@iYhXZ%r&iWC)5RCAtzH`1GNDT#NWiIUS>~oyt5hGR zibOaFuyAeNZXN0xDE{o3(W*r&)V4QxOga)P$A9|so;jyeTvogZhEc-qe_V_gqA7*|BFEqSu)1zM8c)QrB#CZ<@sEO=gWtI#P>1 zM9z{n@xAO48fdgh>A0%noQD>9CR023_0FC3?dk8)(LHze*{7XrGG1KXn#IAOHKCDB zFyldbCmUnNgJSo&T6M+;^GhCR-<}nHdrj=#+I{Ed&AXRSoU#3C-hH>rCH@zq=Ql0? zvM2j=Kxk;FXyh~%Pa&5;fgd&VPN#0V>0>qZ^peXzeY8$44c4@q?a9qLZ@Oz>NQ!5W zXk?t(vDH~iPsSfM;CaZ>D9F-S&~!kf>zG8_!IzJYMd`F0%~Fl*W=+=>o1~!G;eKdh zwzxizXvIDT1|uErRicU_S=pQS|NI;OlhspX=l-9Y|NkqiNK|Bh%EZaY@QJaGg^!#xn&exZpiv+pEc-F>GYT=s&YCgbN$LytK|JZS05>K5m0dp z5^*!;N!%FaIsJHY;jX)4yANk>w4Q6W`|!gJH{X=aN?oJkd6C62K%!50#yRxv)qgocsDq{erHOa+-`>q^# z-e$V)TlTsyj12|Vd(X7#MmNja?%n$@puL)C0261PfF_JC7ET8zf6y>OHHp%zwQ<}O(akxwedM?-(wcN>Do_l|Ck_FphQ}6*B-qj=rWNdn*>e5) z=AAZivoAm0baSp=``N_po7Wt5yJ+G(Nu^nsr8QAv;pt^N#1vWtdLLW#KHky2>}B2V z!ylbCSWb!9p7_|}{8M?=q>a_wn>QyvKJ46mSy(tSQcsyVO>KtPt;S8qeg4;(bT}~2 z7Y9{?=VeS;>eo))7xzM#p&>fAY*+nbwfDPtrLVEhnzj9=OkXa~;V+L_9{xA+t2sJ# zuaf7afCoEdrk{UabkoOds!!Uaj}c~q-A{!!M%Yb1+hKG3q|-u$aBEpd0SV7QiNl+g z+rIK(XWeeU;p@JdwmD)=*tEpRX>n#tj75C)tuKr2{a`4w{`0LxkpFE5d!CJav&#waK<9JrEtn!$aN%Hxl}1sP@t zG6V&N-h5hiyJ_JCHlD*CweqXF7KzA8rg~0d@f2YV6k!Pz;IcXXF~;uv)8a_I`DZ`= zjM+BfbQPz>#ax-8Ko@(>FZ2(h6mk&ub7-Xi4O0OjK-AaTZ(swc++- z->s!(zPUGdz7DjSx@W(I`S%wW_wF{nEG#T3E2;5y_e{-YK~9UNK40d@BK2d>1qBA) z8nuYSS^IF*=-9FyM)v867dXFFZ6OBsBEuj+(fKpDI=5dOrm}PS#{#kU8GCHG*UHT|cWi zddJ>=jIyztfB5zH-E;H$kEd<7j$D1zRY;{dQGzl1gRTR|Lkq`>$fgfQI=j!lEZZ-Y zl{@?XhSb*yMuPh-Ev>4)KfHUp_~KFn_0yB?i7$>j>kw)F^8P|L$&3e^9Y7t5kdK<- zzn?nISK;hGpB}kCHM`h9{=ZnfLcxKgt$B(bMlFdmM6WHor!VzZbY+0XlcJeEMuPoE z4|9LMxU{u3L`m%Nrk7g|6j!=Nt&7=ysf_2afNP+HU zx#v=XPUcumJ*EEmV~vs6V=mUXNk>xGI_k}yT6}YjNL<7N28BL>rbXvj9)7BbSg)VJ z-R3mUA-MR$%d$${u-V;gt^54u`s$-=GG{4yPg3A;vYUQZDU9#)0-|o8)6C$oTT{Q6)U}>Gk z{A%NQ!zpLKgta;;ZZ)x&Z%$pP|I$n};bubq)|+!01SY9ys&cS0GK9z+4=nc9);>MS z$kJ*O3xmpOt`nOkF}4`YzMH4486?KlwMN>0YlY8|Ll1W-h)m)+{cHZUvpVilk0kmY zt9UXQ@a%TdGw}`fmSTyVG|iXGX8P%6msh6P%=0<+_+^UHJa1K@pD|@SA1w&b&~VLd zl<9WiN;a5sps;3In#7%#-!2?{mgZjUy?Xh|rAtpf{rGFG+3fB`8ruIXxE6+07s?#B zwK!ds(RTC2r;2^ouH7`<_4~lW)!y8n&5yOWACtSgU;Om*qN<=UeMyG}-3l23jcoJO zq*xX-`nPg5?VmR5{)>bD3=9`<-hO>!Q*yY!clB?x>Bl!uPt~1W*u=3$_4>Y5t2PB_ zqtS<*fp;}lkSH#6RSkqLl(yXp3}Ev^`_h3kYVz@91=OrWuroY&H3k_cIKE(^-&YP=wT$*x#ZEt z485ryA9nh<1&Az7aXO)Y?(DPo_jc^_2)eRBUtmkity?i?b=U55C@wzm^xKcMX0vB6 z%A9>~P2kd6mcGYw-B))_-x^U?@#o*tcl%2D%j9iJa`UQwox3Z2{aCu1`sNQaI3$$0 z&iJrY2{BwyVB)n=HQ{hz_Gf8+V7~eN?3>@hIcwVzSM=U4|6!hUbC>FkJ2eNAHosq> zv8tF?tIl^~>crvjT^aSkllN+h z6#Z=WmFqwMywD<6?^@PYW1i%nb0%M|$yzaM*^);emnQAmW#{Re>8#g3T}AWM+RRxR zB0qdS{x^|1KJjYW=B_4%Df@y&T!mQ`mos{p9InW0a||$171^k?#%N`T;#{v*=Cg{d zza_<8oj4LzJPlPm4a0Wdeay|WAog-d&=-mP8sKtwhH+!6pLQ5_O5VNHun#vg9|Rd@(a2{$(thiBja#aq4C?!RDLs`*2fhpUfw z@1No6|De)tYKPnN=jrLs($$U~?*9DwW{8ra$D|#bP8~0lN!Jy-^!RhM^V-~Z0oBz9 zP?@Xs=IB{-has&*u_hkPg-Ko zmYVB!yS(xF=UK}++~x{ZXI3SFJJgid|flaK3}25VA3LqNsAE~H~%)KpG z#Mgi4w6m<=zP)?ruwv`pqp!cW>x8XlSLfK(wvr)HA}u+hjQgy?>$!Q~yL0Exb>96= zevgTvRngCLTUQHre=e@9ShIEIQc-ZO=h|1GpTivQb4Bw<@3+63uG%?HNO^ytq5AK% zwR_*j#xovtlEHQvt#eoD_s|!??};+nmKpwoH>&6l5t%+de4e)`keHZ*S__^ zv;Fc>mRYl8-rlwKJ*%thD>vUhVPljmi|3{J)06K_PO$uZ->81&_TEJSCv?x9b?rXK zvuw5N?865iSv(9h^*xcg>1R;Auu9`(kyOnz))-0eg#iyteMJlB6x@{cTXkj6qq?V7 zt5#(_JleWKg)6d2VV;WAW*yzANXLDJjuzUJTAR+}BX;;H29yZibTP6oVvQ!`7=+vxn~7$eY# zgRlSj9$x#X8T03zEciJmsOX+EM`GCQ-fyhU+XAw8FJHTPvE>Dstg>Bq?Aj97Nc2sP z7inCdsa?s^y|pgIbJ{d-CJxrPCzgH!u7Mv}ndIs>oD4s2`FUrIja+Zaf+Ajqf?Y9Y zJjdU5>8KmM6bYBno*JRYkP_&zDMjlb1H(rd^{iED2^M*uS)2G6I$q~HZ(q5wz+&$C zr;pbhjk+utaM{FH$kp?*iKu!<(2^sQRo+%=X|(A+l5pLq;<~YH`DOX6?D*}4ugw(a zpI<6;@x`S}fBsy$bEd>(&yERx#~#lK(9oD!;&pCG@XC`LFNz%AwD|1Wwcqaj`+9cm z+_`J*>K7bM+FHdiDP?sAn?PG)*sR2B!6tW~msH2Sdi8p@WNeg`^{0#v*WRuU7yGm` zMssnp>hXhKi7mWJ7aU?igE2lIMOf@Tjd`|a|35hGYxK4^Us;*lb;MqmHL1*guu*xY zW|wEK(8-FNy2P@ww492Jy0jvtslLlqeJ_Wt%intQ#k6l_;nC^k3zn|kdsCXjbIhfaDHik3iY{pSz|QcbV5bd-qF3OP9J}e0y&i|JVaN#Oa8lFkn&1-1 z%+PcCIcsQWMUx7%-}c*_t8*`EU-wdb6r(q}v+{4<+OX=-(9q-U?aP*{9h;t0#-6$P zcIN7{$0F8*wJnm|HRa<370*=>lYSJdvrDu+6!DGLn6+((?Y#hZ|MfejJ~nz;q9xbe za=5#=_~Ff!CvRN(Q`7d`qVx3gs~;aeyz=8i!KJkFo-JFpTSHR%i>&Xz{_2X&KHL4+ zBKBd?iWk}!9+m8LHk>L@{y+v;i{oI(O^=#`5_At4lY=RjJq(Dss zqmYlU)~o*Ly!5PK*NwTqzi;Qwxm9!G@n_joi85h70l5{MZe2I=ovLCu-Am=USX#Q8 zy1VOef`R{n>Sy5WuMg*cPqzMG1^~P)luJj zl8OkI%=u!O`OiP?j4_*jKCSqskJ|n@Z}m>6Z;qUI{(0-uk{x?gxSC?td|v$CUx>k@ zEj6-hS)lEq_=%~CQ$1WN<_RB&kx*b@Sbg@LBge!|I?s2+`02&@>$W|PE@+y-(R4&L zFocmI)%a!8B8|$fMY>_L&qf$->|x=s(N}x4ap|^odXmRKuCkNiU|1S_^3BxZ^y8|5 zA{w)(|y>R=alD*u`s~HR#h)V`>p@xt_J%{&1A8bC%XAj|m*1*x%KrXV zzUKaxpOM?Im-j4txlih8nW<}_i{1Qw*J)zv$J^SE9cyblG;yh`pGeCjU-|TiX&=~| zx2@Y(>U+2LwbkE)%feQleWv6&$#MQ+u8kqT+yg}-1z7eSCnGv8iRY=tJp`epV_C||B8TYP5 z3~R12Xe`p`y0~Dmpg=gM=jEv}Zo$L}Q!0IT%>gXr^N-RO5Ezra_z{K~G ziSsR4zH2YbqGk1_pMCq$YHnWt>30Pd5vz}$+OTG-iYM3M59e*vncEUA4oAuGWEWP{ z?7Oz^-acRJ@A4jQhrPLjA3rt@PG0=*#HFNd2R;`W$xWa1u_EQey}KRP-^;&y^YZJu z+Z#6S-nn(_>9lf|0-5zMY&sHm%uT$x*2I^8ht0glwy)Xre0+Q6?x}ry>%yBSE^gDF z27PIW(*{)@YdCqCE;#6x)`uRqV^Fv&r@#CAhl%s@n&rZbFA9f`VfZwwh3Dts8i)=Boe3E3Q9sxfQbOu-B9 zN}|@7&7S4C)FR?sM8vA-fGq13tGc*s`nhcS85zWQ^%DbBS}gnoSUd%IP6y?!zy9pw zuQzh@&%gZm^RD0a+o@Y`<(w({$JVC6DRjK^e9FAT20Y6pk9isQTz&hsZP)K>x#!aO zjwyS0e->V>92}gSJTap}Q(c6ss3NhkUq|oUy`6Qr`-T?|@7mbCudDXf#cQA4 zu#QVmgd|D9|`bP|U{%($Wd3urxXsB~%joxIxew)CGWV?$HYGrR5A+aqpuiz>T-T!SvxVP-qs0n(^Mh49 zPcdgmoxKp(ebj4-Yhc^eItDHVjm`?4x#yog^4q?9YuN0yWwVdI{hHWaT)cD_E0fN0 zeZ8&wTS8YZGW9*25_u>!@({O8|5BmOA5UJq;4)kwIjg98ui1M02OoYh>#aZkysXMb zZ}#21bX_rNUt=B5K>r|#6n+twU^o?TkKS2uQVt@Py1AD0fjd2?oyWwy<W$m8>qSLP* z{dx1|~t zfusHMNjZyOG5Pm@@t)shGjFlUVIC3T?=u`Ht9G7Va=EzJ`0`@qX8z^J+S`&|hJ4zn zEams$V8Drs`wNr3!}H^(+uyj7we|Miqbb_{vYT|gof@BSn(1RT)k7s|qKA$cpL){7 z0xP-hw9h+b;zL%xX5BMWecR0Rvc08`9Ix*e(OLgbv_*i+#B`&G@8zxUoI^uZCwsXD zpLF31vu;~Efv5lcaUqq5Obi+#T#LRMrd*y`V>Y=jGir5|_l`|#j!JQuZEQY$wByr<87xyW8F|hpy|gqr zt3l_2)~!eYq3Ay)d}iy}W$=?Z>%`HBO~XixgCJnILlY<+oo^Z~2}toc8V8Y3pU* zYipj~xp^BD+ZA(|b_H=PG~AuwEd4>$t(l?bXu!d9`ODtLZ+*1=R?eAkw$;&Q?{9pa zqc2dgbJhcWtK(0DJCA&MabfZA{&#oh&YVBd@o*GzVnv;&G)XJB0FOAg!|o;y}3U>Ji2pdhK`Wm(#faGem{D3PvgZ?uHRK2 z4U&uo&noo4>c{?xcbTB_mX}3_#q(Ov%IT_|{zo1^WIE5CkjLb}z+kq!S(W1u>nt^K z3%~eV;$5NbkvxZAEMjBOo)<05c+6! zoRgL?ojuDpD^X=(z=MRHw-Q!1ExaebAZm%{(%uX8(^NZ8ED5Smo9gA`-}6|aO;E&l zvf1vrr8{lS@)aKNn6=l$)gO5Mv9dO7_Fc~)k={g!en{%&utjZ}|$Ym^(CSuWpKKAtt)CZ^v*illUe z8u_*#zn!$*`rGy`g$0^ySNp0{mEdZY`V?wjjqw+U3FOb~eTzT?%8OKHvUJHCf@jQ!oY8W%E?VSk4tv1^<60DzhbYgL{1jp zuDy2l$s0vvdF*2&G7Ycw7gpMw<(sa3;o{xRiMQYFEq;918C2ptpC0#m#3E{PAjmBg4KY6-?~=MGyK5ux!oz-FINy-Rf^9+qdjX+IaKZ zBa3$|#Ru1mRM^S!wjXbozgPd`!MC?ND@?RjtO_c6b=Y}r?z&QGvu$6$eE-fmYnHV{ zTcOR`tNT{1TBX5JV>kV@O47v_hwj{YbmqyCN0*V69Fh_$R2?6+U_XxO-D$;=Pta>5&OtQ1rNRa63x7{4qj%B!m4 z++CG=By0QT#)Qe6*REczdF9r%C){k!e9KQe8}t0mJju|OXpz0qBFft8n)%i(CHeRE zDH~ban%e!!D5y$GQJLhY%H0{^v!~|UmoI;Bn?Gka%d6T@c>CMGfavJ;SF=7RTkPx7 zQEu_*TC{6Vqr>XEFKsSdy!`p%i^cBC*Uhmup5>)tp`p&C`oF4EJlTce zFJ5n|KA*aI~w@ zrd2Kw6O6cN;;Ss`s%W$_#BQ?J(qnDy&opN(o8_eY?%TU}3DNH9-Wx1Migw(MtFrul zM0hr*R}^Eu!i9I=enwUO`YqgD{5e>;ng4j3+@1OUM;68CO%BY9*=J&3@%~=W{a;_3 zrMKt4&wc$OCcWHZmbM_{tVFh^vkUpA-!5LUJOA$S=I`(3?5g>8W=ep@3uV18=Xb?P zFHn!;%{?$(1{5zYb6@=no%x%gVT<+LHxHAK|Nd>BS9A5{HyLHmO^cl#3HfS>OnP{< z)!q5~d;WX-YqRy_dO4OB8|!#~UGthh=gzjh>$fi6eEnsa`NYy2TeBC=@CrMz*uZ!5gO{eNm`b@2*Q zhe;{EO-r=8rueBHzUkvOUo|h3LxDk|Ep;x3V${T`I_HZg{mWPJ6mk`2@C*`JS0A?{ zrY~HyRoUax=_nmOXW_6`CcWoQ9yZySFj9Eak()6A$k0Hoo{FXx{1PQ+AuL)91CXk$Cy` zz5KmB$?5U#<>%REAHJBACUwA|CslXa+=bV!*=;{wydXXHfAw{}IE(WC*Uoa-)QNk| zVyG?Yp2xGMr_@>c!&8@LhMJQBsaNB#9_&w(Nc(-SR`+)Kd&_71W_$gN&seogn0eru zi=&78v}tYf_x9F)Klt|c=gx?b3nskG40E-o=(FTyB*8fqVztf}-WIc?RY7RAv zXi_lfzkfeOHTMlyimTY7hf7_ZZ-?Lf@7Z-IV^*PVI^z_hnt9PD85tNHCW&+kC~bJE zWZLpCe`d+7a1mAipb+8HQFC^Ed;Nax75_~dT~113yw|4+a2)1{SGdq5%n~&HGXHB+ zt)+#LQ!j2fWSl!~#VHTAGal|Fdi~EleBf`?cHnEEer7eek}L)^W*JpZSr?^nr^kQpRf60&YuV8 z-oE&8!edeO-CYycT9S2019a;&-^(R^I6CKg;DUcC25z_wj47)urJ}U)4-f zc`9`A#f`(e%k%E;s!G+8?C(5!#CFHohY3}`*_%MwGXMP>sSUT@?(@&q4h;=`xU)u2 zvfq7~y4o^#d0xNs=Y5V>^gRv@y~@lc^{)BbB-@y)+l><+xTy1j7G74FrcQH;xP zAGV5JC$MVqnsosJn=US0I*EBf+ekP~_8AAtptJGY^Ye=jfRW zcehM@H^=SlA+6rFym-y7rE*RIy*x7}GI;F|51o2y$>kWexqkh;yl11|ZeyQoyZ7L| ze~o?D`p%Utzy0>N$v>v00fz#zqxak2xN>oS=I2K*7Ps@u-`Quo)4+W8vz>eXd^q>^ z#*GV$E8ZXY^-#9@dv4C_H&OW;qyDN%F}et}+<#cKcT?i$X}JrpT@yacFSn=q>!FddiPB7s%S;V^UNQOXzK4ZzD`)5x2+y8v2ZgJ`L_h^1u>wPQB6CRW;vCKSoUjl zwdPn&jhHomzO=mLJSlm(D32qLBwZ)ER_Hv)etUh_t@zhk@(VtB-OovKQQNOs+t0}G z?CWpYu-SWe&f{RvoA2#1ZJHNf!_upp0!z95rq5RNyu`^cL#69xjh%jT9J9j&6($#v z(^p>kGEC?>&gwetbAy22#VNP5HVek=6LH;9B>!uIr{$gv0@@#HZl#s8tiH$K)RC&Y z@7c95e;pyd!^sQR+HZep>-e)c?pF9Mt%;0_g%eGC8zyqRILWY7!)U7K(of&>?s@Rv z+ifkHkyZA6&FlP^Z(e5dw?#$0@mt=ma#H}Z!;^P!V{z^4 zO~I4oS0_J>;+(Z?rOolDiytoi`SRn(l^-82yt(t~)w+|-k@^pMqje9i7Y{m?V*8b= zcEu)hx$E7V3bXPuc>_$|uDTn(YL@SE<&zaU={xp^&SZP*r|vA!BCOcbxoARY%FZ=& zSv)6jII|own51yZl%XjgK*jTnLQ6r@l9;gByF?*^y}!FMxhAp9 z?C{f~Q(wKspSQEiyP4(QHr!MByU*8GSNE^U;Wb^iG_RH4xOeH^#iyStzJKFeQ~&zT zN#W_~YHC3N@8lD{<(ST4+3%7e&@eyv%EnjMS6hUut-IFecl=@U`S&m1y#34CeRbP% ziEH6(zL!H526&wD@w>CH^696&7u}mbGM`10!gtG8d@-q>BA?CyWQYWCfSt5e^v zWeW|Q5~DXgYR1f&a+O~Sa*|Ri6ybz#%%kb>b{S~jwgFnuG`oesj(QCn9 zpau4BQ$qfQ9zP|{VXWo#;!#=zPh@#a{Ko$-CqCqz=h`D{O@D- zo5@8+okprKTknE53UoWV5o;t4daN_Rk>tpxVzP*)WHhJ2@89}C3u06Z8uloG1eP5-w zS=^oX%wPG3s;7|g%8;6}tfHh3@8({7+4-?RZ}!>jS!rq?SPz${ZTr{dw14GN)|+q2 zB&4N;7TC?UYuNd~{C5o7UzHWo+Iv6f_eRhBuw1gOZ0B7?nd8}RULKQSdWq=L;=ELr>jmdRSq|#USXaeqgHEs#RRAPKt{&XLUW^arW)k zDUh~l=sx$CIj*t&_U%(qIwt1}t4j9-c3gi|{nz%Y5^I&a zd9X3#S%VqNGG}OTq@~i>T6H%rf5r0p1@Hf@o&EjY{au!mz0`I@sOZeG{P^(2 zh34O%ck{_aT;HE~*{uEY%_JeKj)@{yUvab4WxijieEYWb?th<7{VZNCe`lZQ#oqRh zca1*tXJjzf@m*A4uy2sXIZ9%Q%6QtW?|m#t;@I9KVEiLZvOgSg_E=5UQJctV4B}^^w8ww z#mUXz-}RmM^L2A|)KG1>$X#>r$?hta|Eq5NxxVk~TfW(M-~Cx_|2O};%fbbDH+J>f z{C&u7bLIKY_(G%ArWgOdaJRq2GfT?&P#ZJDLw>fmM<=YCwWRCxbKzYq4rwe4N^CdW zdc((aSZCHMt{A)dx?*um5oH$cEPazX1QM=8DwI!O(zMI#2Rr_=3 zz2DrMjlG)!P8jLDZqah!IIL?HZ6J|V=-1n;w$NtX{#CQ?T-cuWI7NkZ>J|gl#BD;e zesFw)x<<5Jvc$zhyT-9~@ zxw7$O;qttgT^0FHE+#CRu}!>uN6edRb9Y;r=ic6^D#7)&W)_Q`)4~I;hadj@IC0^| zg}=Y6r7vH$Xw@ny)_rxx!9TAreipxVQ+SHyYK<+SVVhEhF`2cOFZ=XtJg+AwtyXc$7{V&*3#)tDYIZ zoHCDrp)IjP!Ba}$kN{Ip#hVq|oS1gh=q=Bj)$(vg>(+?3$I{tPZ3PWiZ}d=^dp>P3 z-}2QRT`U|cV&%?D&))X_h5%3Ny?v!mPql}in?JYp`1=JH z%@-`>{b30j`8*hSeAWIZ2V-t&Ff6EIzgEpBU;S_9v~Shp^V>+IsTyuW_ymFSo{$ow|`?>qaQ{H5!@ z%@@*gOaH;-XzzOYU6gu2XsF+@$K9;+^c!|gzQ*MNT54UW#FHHA+4a;&GVXd`DwD&6 zFQ3v|CW?gG#EDH>wJIydZhm;^RCkWWx?-!D!)7ytEoFIT+2^k&|9biUzvKJgmhH5SUA3x@so~qf`2SybEL&+{XA>fn z^-DB=tuhp+j!-el!vzkU&B ziBfM7@H0N+P@En8`J#Aiv{hBrzfV`#-^X^h9k$f?&I>9c&s|hth))P9_+sq+Vzbf1 z3p|HqD*yf1b=JD9?)1}ddosjsEzg`a>HJeMcX{5p{YCH29R4};=AKnr9ES}StzCS1 z@9PH(eQTLtZ@)3k_V;{^CH?{|c4Bd}>P!CrdvJL7cJ-u(9$tY@f^J^Fl=f$h_&>Mj zcF8~Dd=IWaeCqH09VHXrzj-Np*lUOgMkMfCBYg;D{b&jS(20Wr$SzLJ? z_ASuzny26?f7VE^E%hVQ`PZ{k&af(+o}_Y2dE(J3E#^lo2Y2n=C)T9k5jpKE%K;Cj zc^(}zW^jcad|9+p&?zIU#DtaM){6@ZVxHdr`Z(NcQLyHe3p1P#^l%t#@L_pTVG`wW zUVYrfhZDV$SKy$95-|GKrTr0m}A!pGn4N?%`o zX=O@cX5zg6AKuQllaQ8+x>5Y%!?bhr?yWUByhiD#MW6Lszvmyn&ffmzce8JP?EaF6 zbFHthKP$>@G4?e;WJd-FvUU{@28dVe2~= z&EVD7vDsDk@z2%Y+w=4|n-~}xcJGZleQoaU-P_*W*?L%yd8;OnnHACBqQomb^zed=HT z<^S1#C+q)|Pj)?9qS_eG>7N|BIqJvnKW6QxMGw6?!4UD_XNiqer(^2p!^mSX^o;n3=BQXGE3Cv>fPB{ zW@>Epqag2YTkqQ0+uldqzjg6uZY`6N!vvMPB3Uns_dm#e6}LU_#j~lWzqiTTMF?@V zPKtc+r_c8HvhDA0?%pk-dtlmK4JQlN%dx(?y8D0L@m` zt#H)U4BqYMv$x-Tz+_-X$hy}bT`cy8HmN1nrBmajY)&4`^bcW?RIM?aC&E6tF&IG7@67Gn3TM~c6Q;(jTcp2r+II^%dK{Mx!|9z zHs8E!!=8PW?RVRv{rsHIXPNYALD#HXiBV#SP|c*AjH!qIhq1I=m;YcO=Di>+ zK6}=()XOh3)aIUQ{`sn2mDPYjq5G=aW0r?33<9o((HbAR{?%|KO7sbvD6~vi_Ryj) zSfXvJ;G!5c-4mPUFf%B4T*@rB@UCMzR;Ss`a$-sFP9H1LZ>&tUTi6XWrl2%inQ8M&7iT(X zyyH&rW0{eorW~`s#L)WFi;H)DosG6K%elL2-_o^vCnrYUjyhr0mbl~eW6s?Bo3CHK zbnjx}^J80YZ(kob^VIXALsx!8sO{NNk^6g|E%)v3Z*B|nw6gWwVu*+{_+qks%bx>v ze~zAAD?8WT^6$gn*B3u52rI8YmcjV9nCXH7W4wk5#{qGc(iMMtS94T7zLwkQe0*O0 zQq3!$xJ7)wE3}+C7JS*nbo$9Ny!Uoj|2(yG^Wld_S>?K>{@V8L&fR^<_y5Hn3|KLH zk;dt$+p9BY9V`C%=E;p47w$@5m+#}}*Zm+fy}9V%`R1J;)`x$Xee@OcnplpE=k}J7 zrxNq$7=){KS$?@=SayEl;n&C8+K=D=cXIwxp0^s&7uPK06+LSaSFhl3{UO5&jZG6e zj!)weWzb%By3}HBn9T8928Kx*&r||+R2OkGr$_wXUBM@C;gV_wi?TLmuVOP~Dpszq)ufo_Ay3;Klvr zUHpI7myxFb{I{l`mxx=T&Y=3aAx>N2;HTX>hqBTgZ3Q)MUpm=R@%7KmGcOh&yxAMQ zy)^gEw%lNYE0_ENugqGNBcyWDWc#*n)_31IM7uw4KAnF4&fJ-EJU+$5?X3BB=F68O zE;av+-Jkz9&%2Ym@z$T!TNo|g6UGA&-p}^^@}Al^A<9 z8uc~oLeG6;v$L)HaaexQT!Lgjr93;ufM{B>G*;QaY> zJ@Izc&knWv``w#2dtTHeRZVV&pO2<#=T+W4CTec0X<+qdrsdC>mfvSSYrDUrRQlJs z^?$8yU%A9|m|uRHTH=Zg>t{GW{P0TzDN_@lpPT#Q+1c5v zkA;@&{xuCdCdd$REvfL$t@;NI`&VXGw{AMEt?{At%Y(bSr>Ci@rdT?@b3-Vy;oeZCH2zEgYD({_Cl-+ zMS?h392e+Xmwme}d(L;&qLjm*KTlUX?)G>?)aQU*dYlYX7HNb8Ydp!#eJ`=%DSJbr z#KEV<#*3Z%ub60ojsMpJnv`zvs}T=KEIN0_S|`ER5$dTUs-th z_eP1s7O9i}t~wz;@3i={v}KPk3qLOI(n;49({?uQN!9(w$f4*GDDwI<`z-5S)lDLY zJyurO#A|%;GMg)=?&dyyM@`x|z z-~Ok~pP!;5T~U>h!BE$>BH{h|WuKP+J-FcSkL&j=Zd|?n{j}KXQgx>j8V9zftaoja}qM`lg_sj*4tX!6CS?%&_t-Cz6m zRe{N#DHlw9_g^x9*SosTc>O=GzS`2GPhS^4`O#gnU}fd>!%t^b{61fA6n|WIZP4*x zliuo@eZCfr?^AWBbu$=ntyX_66z0QHI*TbR_I%dnje6U6ubpSb#X8UbxY9$55H+u* zuNnFt&$yaZoFI{RJtR~^gv;`0p=`s{{})r+oF)2#Z#@3y{h%a!#rp1B1eGrHL~FG*Tp|m4@!tZxP5Vw{k9PKRoGl$|_eT8(m$8wJMIssxSY$ zm;b-d^oESojp8RKF3A7M-#_2@&)#dMUrx4tnbkO{a={Wog~Xq>nlsrlD%J!hcOB

dmAr~B+saF;zu6X-fU4!QVYAQf4pX=Hy}TtxZSoum zS;<|sZ%;LUoH(&{(cF0b550%>Pug{VOxiQ0n1c|(jw{nh^9Qd_QLz%HN0=9T;?X|s;YqzCsKb{>wXSVSyhMwzH zvz9SDE)M*-N1{!!WrFPSk5yqeqo#g-ebS+mtYQW+^VM+91}wx&H7m+kFlTe%?Dfd;7ZhJqEKpmve0n zp1gDW|3~WK2b>ocit?IycV7hcaJ}huan1ScGmmR~ekKsFO>{e&a>JeC^V>WyC z5{(!k*TwP;fy@h3k~jLO&FwPTzHP-;E#^x+k3X85{(N}v?j+@e*ht3fOwJYwz6;kM zum7?CU+BBu_kSL>x_^JKdG+6Vx2_~xMpI?xs;&Dca!lF6xU~1`Ti1DykK7JlUvT;H zWAEtlxAX4psXZPRZ*ap&z~$~&D+3wzKL?ksV|Jha)nxk?lUS?bU*E3$h)|k;R_nRn zJc-%!=X%Q2eB1eUuI=928nenI>iq>$4!q{CNq_(Fux;bAW&aCbHGkJ@7Z*1U*tg?i zHnWr^bKS8Ffrj&vp)LCjQ#zO!PCfp7vw#1$U-$0)YmDD~BWHKd#=o*;#)ZH;I7siw9FT)cDZl}*8yow|Re&GWY3dXpXZb^4y)?CA??=l6;oG zGrz61^7nj?5B5hr53CXJpV`mqIO)r^*xk&(`(#IEexIyP6>!!BFnvRpUIRqDH8!ArNXSLv>=jUKsaW$0#75BQ{ zpNzKuX`I}&VAHn{ufUi+^CSf?%uf#0P@N*oxHv4q^~dXe;f*Uw-aYAj^W?^fKkNRo zn}6qBb3dcl;@Xsxleb39`8(U}{l_1F4@ythi`!lM_La!_!b>j}A9T?X+E?)4Me)Y7 z)@ARuTFabOd)U--_MOFr{h7hDZ@>P%x;x!(Z|V16TU#GRbnW_>GlOLxLxu%oo!^QF zZ_=k-Nmn)7vAq7k|5xVs|3rn~-?jgA)Y|CYxPO~;io1(9m;2X#_;+%(_&NX2F>%V8 zUAOimr~m%EeqY&+{Di-JZClq^u8Y?Y+41t@#)X^J?QF{bUOIZPL~Ck8(er&eHf5hq zA53oFGAVf0%~$tzQqG2axL(9%WKlBp*X1`7JojJ!p3A_Hbh+oxM;&8)O@O}~L*kCBY319um2au2u~VArvuyLsEfEhYQ>&6}W}QwEi+iA|A6c8~zn!dpKQDI9eDB#kDIw#6TK4r-qC1RlM4UT3`d65qfB)^ZzP`h8^Z#3REjw+b*|o?*Ix^uU4- zx`NNAo(6GU*}7zv>E#~}baU6*T}$G0;N|UIwlYg?F4uCQk2)de8Fp-{tg(~s6E0(5 zh@A8}#!g@Ay!SD=uUJ`v5Sv=QW;(E6EX49e*l?)7%RAS58o7svVZT9Mwjg0Ym zwrS>!h|Ruw`13((iNef1aFbOrPhQb8~C<`ok}|*6JDec&t9VZFhOXf|CzRw#~Qx z`SHHZj@s2zj2CQ~D#rWEF5>0%HqQr}oe#5okUVtc-hQoTG9_B|vkxa$zm2|sZ-3?S zbNk;HSoJ4KgngT&)uq%T{_OpH+m9F3PixitEzX#AZ|i@D@0<1a{qczozwXwx=*F+; z9~D>YU!Qt|%yDzhm6v7a!6Hvt8C1HGDso<2oWJkuWcmH}Umn!?OnjPU`J*@G zu+DsD-qYWrPEVV=+q~@CH@TyQd$Q*2S*7vl$&DAi)!XxUo0h#aHCVKcH+5Ot+1uN< zZ!a(1-y+@N>dTaF5U*BroURqN5`&zz*%cLdT3=Tp|e|%{E9sc;Dho5~~ z+4AO?{h6ov+ET4UTz$`;^@*P|f2QBeFOB#1I59Ekif~ojKk%!pe#6S$VRLq|G0aT) zbn(W8#hDSgPDZn09%QcU&|dLkwQcaMo0juFm7ewCbvxTo7p#?|#jv7FN86kG^U9qs zU%EORu%4sGe%2so@3VtRR*BUcEJZ%CH-~5m`lnsa+<4&gr!!AndQLxAmRsMy^~M^# zmatyqLxqPjx8A$L0gteKyrelpoPo0u@n7kpLnEjsY$_R_MQ z^XtEEeSUlQuKM1z8KnsU+}y2BMM))3e%%z7zdL8{tTUOj+A3@8ZZ|GIpL=Id^6|LY zcOS;CJ{7Ma^5f>plM}U{pSvefX=0)69pt&AIAGq6<1b#MhkT#T*);DTFf*2N-(%NU2)Tv6Z^l1*BAO~h-``d&HtxiiAH@z;=?y5%kS?L z>2C4P^gDayS3;5R=8gK&_3;W9qP%}FGk8o2>1aFbJ!@51(JGTT>6>r(*xMe5FqWsd8e&n%acR&usPjub2OP zGjlcn`+M`mxmbTbd+Po9W5$;!7scazO22%`Td0vW)spvk;q>dze;;dHe7#=;2WrfYUU+GsOI#xcE`62nBGi#4|fNUv8{oc*;o9j+rTLzkteqZ+O+h6Bd ziN6-s#B7N%+YK6L70&%>@pYyS7LOvL2i+9l9EeSI8z5Hq){~U!C0nyR_KVIMW?a^la zy?buHEZaP5*}{_-CtkT-|L-yP_q-VU^G}Nn4JyA2v|TJ~|9oLt?(O>5z3=}$I_;~g zn-_7d!|=n7oK1G(E;nyn*Lr*Bz^w}k4E~a$SN^$8t@r$~c{jhzn~I0o>;Jp0*!tDn zV-ine-lWSWzMe-GEf)8${dBN%`~6+>{ZvJpR94RY%~!Jj&)0mr``had>&;rWHal~^ zj`yQKXTIE6$$#(vkH_Wr_sMj(91ciaq>;B&WWVa~{c%5Lb1nIKQ?m2)bNQ4@FEbB6 z4S)AGbKi;V87CuGp^^;Fxw&%P zSH;%2-ZAmLTy!%>N33(nf+CmJe^nd|6OJYoDz|v}hPo~cIMKOifz&M)7Ed9GL#Ip_ zZWJw=y{TI3!yYBhq;*rc54Dv-JEf9}`5*ryy4y)Bb}*677$7YI1bxSE#zjg`qS zVlKDC{DmKk#hJcNIK6zU)Y@-)9*d5wUL_QsvNB}O3K7u+Hx@6x-7+?P*EIJYUw!ZG z($=3x`S1Ul-M!rY*MrBcH*Xe3PE%bW%%S+CWcTcEGB!0|uA0|Bbf^yBF3k{NBPD8A z^?P}_-hA6)Ey@1#S+kbS`XiGZak}l@zS8>tukZg|`ueG(+BL;hXQkQ9XC1%$BJGgVQx*pHH-O`~clACYJ zzG+|mbh!4mmiO=_ zxizM2`xNiWGTTX)u`P9P>77~AdX9@%=$&_dT5xL9>&raN#yY#_Fgsj6;?#J4W!6ob z9tH+M70;Kx3>=D0DjlK4Oy>)W79L19@eLMen;5qGYWG8nWg1;G*$!wdc;ccn?c|cn z6CHvt|GLH57?HnW=TZA#FD{CNTxY6zc3$Mb`6JAGdusl^zW;x(1;dfj`;v1rwVw*E zNRhgbU)1>gX}0(|`wksFwQsVOY3}b2{PJCMG-$hU;YF1Vw_g_R)}Lcl`Sju3+uc87 z{Orm9Pd@^=vegf+q7-p_J6%}egDJaU3crtK=U^S^686r zu1@5u@X8QqSl(dO`oHVe{iLl?^J-r{)r~HD^UHVk-8zB9h{z)OKoR4~i8sx51&Io<|mWZ(kp~x9;(!rS3OPyE|6IwKM$u z{Ah!o(xn2Xe~S||7~kY8d2D*-qJ4UkK)>7c6i+S7Kaz`e4%`r%wsnHYS)FvoD<%`q z7gugB7G`l&h~+VN;#e-}_WogfR&&^cpE4PzAdR{`r5`V#NxPh+jjmvAGTi4^_%|sQ}5~NYTP#Z_xBdo8cz0_TlMZ~ z_|9+d-ubdPuK8qofb-B}ezV%=Gau_$tTp>Re~xu!lE=iEORHX) zbH%ia>!p0ucb$)#yL`6HnJfQ)UEP0gT9!_lis{xZ6Wrq~K7MsRZ~MQu(Ra4D*#|Gb z#$%#BktPgh4Yr(qovX;PC{1IUhRCLgOOI|?q;b{6;Fq1-nyXHeM4mD-ELpkg#Alg& z8~wJ#4i!%>#aI;qCkfZf%j`H?of^YULmfC0MO=4lw&^`(TJe&7!OB%zwixW!(0|^x zo=fI<=JeZlV|)^`&v5L}dh_Xdq-@TmZ&}Y&Y|qR~wS8$ci`6S?Uyw=v$GiT_4r-JA zj{4PqdDz>3ukQ8Xn=4N~RC>9Fo8z#-dix7?PkwZtm#=^OH8*el^+lOdvm|6a_kNyU zU-$3g-reCXPKwFjqInMM==FbJy0@M0|6%d?|G)UUmgNTAR8I)adNKcb`h)b|Hns=B z3;HDf8!S`qpZ9|GP1B=64@>CA$CO<^4f1`)3|7Z;reb z+i+Fu$0pI3z4{-5&qyZ3SiTP2<-gOSEuuJE`|l;``#0Wy`?ar8Kq;>3v2; zk?AY`S<{p@V-<^-vqWaG#jNJDipT%F@sX-)JJ&E@EL+6qs*ES&s{O@F_u7>=1ZpQN z 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⁣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 + + + + + #da532c + + + diff --git a/ProjectLighthouse/StaticFiles/favicon-16x16.png b/ProjectLighthouse/StaticFiles/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ef078108a961ddaf6acb80f47ae2c9dfe6e965 GIT binary patch literal 1206 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUNSs54@ z6p}rHd>I(3)EF2VS{N99F)%PRykKA`HDF+PmB7GYHG_dcykO3*KpO@ICdL4t5LX5U z24fg7GBh-R0V6|0n6R;tk&z)77#SHE8-uvW3`0XhxB>%xeFFmneK3Hq!TP`o3=E7Q z0Ic5F*x1m}z|asP2(s7M*x1(AE+i~GHZd_GIwmkU*v!l*`CZYC8HStlhrj)U_MoQPI!8{&@H2|NFoHKm7l{ zYV#HcM@K6ws|71oz5V^~`Iql+e*L}o`fY7fb8cbLtVK&6z5iHPT6X8k*@xOmF!xy2QglV{C&{qxV=S8t=^;%x2gwjVq)d-0O8>YDc6{*{|Hzy0%n>;8i| zg+(`>zBqRA%Gn#Y&)>Sc``C&7r_NlsbMN%Eo4205G&489|K{D}51;P8eSiDKt0x~n zKl%9S!Q1yu9bKlTrW<$dx&HXslTTka?b(-^n`dQh9UK~FWo7;U|Nr2^bTo>Da^?2*Mbj_pZzyCdcv3#A^2mhIyx66F^=(FY} z=fnOlAgzo^-tI1|_OXTUV_;xlFY)wsWq-;oC!oY7#$}ttz`!Wt>Eak7aXC35At5Cx zEipAY`T2ttx;ksuh3D)x|`C-bX3)KY3jPCqElT}kA`mIDKfn3 zYPz-bD{rswSy$b)pLn=(-=38%+uA!fw(hR&-icj2UVCc)3ak0evPsRlv*l&kDJ>qK zKgLE~wIroY?slUr<6k)Z+CinAM{wp5&)bYtmhpDU&fb%`PZ7i0DVr6KcZD3$!U@-fU)H4(fx%nxXX_dG&yxPAgih+S4yecH3Bq*_5p`a)~ zEi)%op`@}PRUxyWB$Jc1ICAEQ%n|m}4IT@;^cY@=3zmFxGM&o6z`)??>gTe~DWM4fawF?J literal 0 HcmV?d00001 diff --git a/ProjectLighthouse/StaticFiles/favicon-32x32.png b/ProjectLighthouse/StaticFiles/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..bc34a6c1d189f8c8959cdf7aee4278da281a8043 GIT binary patch literal 2648 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 oIdSC75t$?GryD#Lc5r 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 literal 0 HcmV?d00001 diff --git a/ProjectLighthouse/StaticFiles/mstile-150x150.png b/ProjectLighthouse/StaticFiles/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..1825f73d4c4b083f9e8a5b606776576a346288b3 GIT binary patch literal 12348 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 + + + + Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + + + + + + + + + + + + + + + + + diff --git a/ProjectLighthouse/StaticFiles/site.webmanifest b/ProjectLighthouse/StaticFiles/site.webmanifest new file mode 100644 index 00000000..b20abb7c --- /dev/null +++ b/ProjectLighthouse/StaticFiles/site.webmanifest @@ -0,0 +1,19 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} From abd3f071aaa320c7524ef3b27f6aa63cb701decd Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 12:06:30 -0500 Subject: [PATCH 02/24] Add page titles to all pages --- ProjectLighthouse/Pages/AdminPanelPage.cshtml | 3 +-- ProjectLighthouse/Pages/LandingPage.cshtml | 1 + ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml | 13 ++++++++++++- .../Pages/Layouts/BaseLayout.cshtml.cs | 4 ++++ ProjectLighthouse/Pages/LoginForm.cshtml | 3 +-- ProjectLighthouse/Pages/LogoutPage.cshtml | 1 + ProjectLighthouse/Pages/PasswordResetPage.cshtml | 3 +-- .../Pages/PasswordResetRequiredPage.cshtml | 2 +- ProjectLighthouse/Pages/PhotosPage.cshtml | 2 +- ProjectLighthouse/Pages/RegisterForm.cshtml | 3 +-- ProjectLighthouse/Pages/SlotsPage.cshtml | 2 +- ProjectLighthouse/Pages/UserPage.cshtml | 4 +++- 12 files changed, 28 insertions(+), 13 deletions(-) diff --git a/ProjectLighthouse/Pages/AdminPanelPage.cshtml b/ProjectLighthouse/Pages/AdminPanelPage.cshtml index f9c92c5c..891e8891 100644 --- a/ProjectLighthouse/Pages/AdminPanelPage.cshtml +++ b/ProjectLighthouse/Pages/AdminPanelPage.cshtml @@ -5,10 +5,9 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Admin Panel"; } -

Admin Panel

-

Commands

@foreach (ICommand command in MaintenanceHelper.Commands) diff --git a/ProjectLighthouse/Pages/LandingPage.cshtml b/ProjectLighthouse/Pages/LandingPage.cshtml index 312f9d1d..fc67aaae 100644 --- a/ProjectLighthouse/Pages/LandingPage.cshtml +++ b/ProjectLighthouse/Pages/LandingPage.cshtml @@ -4,6 +4,7 @@ @{ Layout = "Layouts/BaseLayout"; + Model.ShowTitleInPage = false; }

Welcome to Project Lighthouse!

diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml index b33b3e30..4632137e 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml @@ -32,7 +32,14 @@ - Project Lighthouse + @if (Model.Title == string.Empty) + { + Project Lighthouse + } + else + { + Project Lighthouse - @Model.Title + } @@ -93,6 +100,10 @@

+ @if (Model.ShowTitleInPage) + { +

@Model.Title

+ } @RenderBody()
@* makes it look nicer *@
diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs index e77b3f11..eaca0975 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs @@ -11,6 +11,10 @@ namespace LBPUnion.ProjectLighthouse.Pages.Layouts private User? user; + public string Title = string.Empty; + + public bool ShowTitleInPage = true; + public new User? User { get { if (this.user != null) return this.user; diff --git a/ProjectLighthouse/Pages/LoginForm.cshtml b/ProjectLighthouse/Pages/LoginForm.cshtml index b5b4b82d..d6ebed62 100644 --- a/ProjectLighthouse/Pages/LoginForm.cshtml +++ b/ProjectLighthouse/Pages/LoginForm.cshtml @@ -3,6 +3,7 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Log in"; } @@ -16,8 +17,6 @@ return true; } - -

Log in

diff --git a/ProjectLighthouse/Pages/LogoutPage.cshtml b/ProjectLighthouse/Pages/LogoutPage.cshtml index ac65ce91..589ed4f5 100644 --- a/ProjectLighthouse/Pages/LogoutPage.cshtml +++ b/ProjectLighthouse/Pages/LogoutPage.cshtml @@ -3,6 +3,7 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Logged out"; }

You have been successfully logged out. You will be redirected in 5 seconds, or you may click here to do so manually.

diff --git a/ProjectLighthouse/Pages/PasswordResetPage.cshtml b/ProjectLighthouse/Pages/PasswordResetPage.cshtml index e069274e..a9acf1b4 100644 --- a/ProjectLighthouse/Pages/PasswordResetPage.cshtml +++ b/ProjectLighthouse/Pages/PasswordResetPage.cshtml @@ -3,6 +3,7 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Password Reset"; } @@ -19,8 +20,6 @@ } -

Password Reset

-
diff --git a/ProjectLighthouse/Pages/PasswordResetRequiredPage.cshtml b/ProjectLighthouse/Pages/PasswordResetRequiredPage.cshtml index 5dc62ef7..616d2f8a 100644 --- a/ProjectLighthouse/Pages/PasswordResetRequiredPage.cshtml +++ b/ProjectLighthouse/Pages/PasswordResetRequiredPage.cshtml @@ -3,9 +3,9 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Password Reset Required"; } -

Password Reset Required

An admin has deemed it necessary that you reset your password. Please do so.

diff --git a/ProjectLighthouse/Pages/PhotosPage.cshtml b/ProjectLighthouse/Pages/PhotosPage.cshtml index 9cd07040..844165ca 100644 --- a/ProjectLighthouse/Pages/PhotosPage.cshtml +++ b/ProjectLighthouse/Pages/PhotosPage.cshtml @@ -4,9 +4,9 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Photos"; } -

Photos

There are @Model.PhotoCount total photos!

@foreach (Photo photo in Model.Photos) diff --git a/ProjectLighthouse/Pages/RegisterForm.cshtml b/ProjectLighthouse/Pages/RegisterForm.cshtml index 175e6741..6a755f8c 100644 --- a/ProjectLighthouse/Pages/RegisterForm.cshtml +++ b/ProjectLighthouse/Pages/RegisterForm.cshtml @@ -3,6 +3,7 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Register"; } @@ -19,8 +20,6 @@ } -

Register

-
diff --git a/ProjectLighthouse/Pages/SlotsPage.cshtml b/ProjectLighthouse/Pages/SlotsPage.cshtml index 3c2cef23..4af2a0bc 100644 --- a/ProjectLighthouse/Pages/SlotsPage.cshtml +++ b/ProjectLighthouse/Pages/SlotsPage.cshtml @@ -6,9 +6,9 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Levels"; } -

Levels

There are @Model.SlotCount total levels!

@foreach (Slot slot in Model.Slots) diff --git a/ProjectLighthouse/Pages/UserPage.cshtml b/ProjectLighthouse/Pages/UserPage.cshtml index d9e127e3..d23cc01c 100644 --- a/ProjectLighthouse/Pages/UserPage.cshtml +++ b/ProjectLighthouse/Pages/UserPage.cshtml @@ -6,11 +6,13 @@ @{ Layout = "Layouts/BaseLayout"; + Model.Title = "Model.ProfileUser!.Username's user page"; + Model.ShowTitleInPage = false; }
-

@Model.ProfileUser!.Username's user page

+

@Model.Title

@Model.ProfileUser.Status

From c9ae8d46887559d4612154df1738d257c24e458d Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 14:02:21 -0500 Subject: [PATCH 03/24] Add Yay, Boo, and Meh hashes to User Apparently necessary --- .../Controllers/UserController.cs | 15 + ...90200_AddYayBooMehHashesToUser.Designer.cs | 728 ++++++++++++++++++ ...20211130190200_AddYayBooMehHashesToUser.cs | 48 ++ .../Migrations/DatabaseModelSnapshot.cs | 9 + ProjectLighthouse/Types/User.cs | 9 +- 5 files changed, 808 insertions(+), 1 deletion(-) create mode 100644 ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.Designer.cs create mode 100644 ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.cs diff --git a/ProjectLighthouse/Controllers/UserController.cs b/ProjectLighthouse/Controllers/UserController.cs index 81755bb1..71fb7fd4 100644 --- a/ProjectLighthouse/Controllers/UserController.cs +++ b/ProjectLighthouse/Controllers/UserController.cs @@ -130,6 +130,21 @@ namespace LBPUnion.ProjectLighthouse.Controllers user.PlanetHash = await reader.GetValueAsync(); break; } + case "yay2": + { + user.YayHash = await reader.GetValueAsync(); + break; + } + case "boo2": + { + user.BooHash = await reader.GetValueAsync(); + break; + } + case "meh2": + { + user.MehHash = await reader.GetValueAsync(); + break; + } } break; diff --git a/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.Designer.cs b/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.Designer.cs new file mode 100644 index 00000000..8c618602 --- /dev/null +++ b/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.Designer.cs @@ -0,0 +1,728 @@ +// +using LBPUnion.ProjectLighthouse; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace ProjectLighthouse.Migrations +{ + [DbContext(typeof(Database))] + [Migration("20211130190200_AddYayBooMehHashesToUser")] + partial class AddYayBooMehHashesToUser + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.AuthenticationAttempt", b => + { + b.Property("AuthenticationAttemptId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("GameTokenId") + .HasColumnType("int"); + + b.Property("IPAddress") + .HasColumnType("longtext"); + + b.Property("Platform") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("AuthenticationAttemptId"); + + b.HasIndex("GameTokenId"); + + b.ToTable("AuthenticationAttempts"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.GameToken", b => + { + b.Property("TokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Approved") + .HasColumnType("tinyint(1)"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserLocation") + .HasColumnType("longtext"); + + b.Property("UserToken") + .HasColumnType("longtext"); + + b.HasKey("TokenId"); + + b.ToTable("GameTokens"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => + { + b.Property("HeartedProfileId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HeartedUserId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("HeartedProfileId"); + + b.HasIndex("HeartedUserId"); + + b.HasIndex("UserId"); + + b.ToTable("HeartedProfiles"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => + { + b.Property("HeartedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("HeartedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("HeartedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => + { + b.Property("QueuedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("QueuedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("QueuedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => + { + b.Property("RatedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("int"); + + b.Property("RatingLBP1") + .HasColumnType("double"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("RatedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("RatedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => + { + b.Property("SlotId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AuthorLabels") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BackgroundHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatorId") + .HasColumnType("int"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstUploaded") + .HasColumnType("bigint"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("IconHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("InitiallyLocked") + .HasColumnType("tinyint(1)"); + + b.Property("LastUpdated") + .HasColumnType("bigint"); + + b.Property("Lbp1Only") + .HasColumnType("tinyint(1)"); + + b.Property("LevelType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("MaximumPlayers") + .HasColumnType("int"); + + b.Property("MinimumPlayers") + .HasColumnType("int"); + + b.Property("MoveRequired") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PlaysLBP1") + .HasColumnType("int"); + + b.Property("PlaysLBP1Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP1Unique") + .HasColumnType("int"); + + b.Property("PlaysLBP2") + .HasColumnType("int"); + + b.Property("PlaysLBP2Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP2Unique") + .HasColumnType("int"); + + b.Property("PlaysLBP3") + .HasColumnType("int"); + + b.Property("PlaysLBP3Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP3Unique") + .HasColumnType("int"); + + b.Property("PlaysLBPVita") + .HasColumnType("int"); + + b.Property("PlaysLBPVitaComplete") + .HasColumnType("int"); + + b.Property("PlaysLBPVitaUnique") + .HasColumnType("int"); + + b.Property("ResourceCollection") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RootLevel") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Shareable") + .HasColumnType("int"); + + b.Property("SubLevel") + .HasColumnType("tinyint(1)"); + + b.Property("TeamPick") + .HasColumnType("tinyint(1)"); + + b.HasKey("SlotId"); + + b.HasIndex("CreatorId"); + + b.HasIndex("LocationId"); + + b.ToTable("Slots"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => + { + b.Property("VisitedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("PlaysLBP1") + .HasColumnType("int"); + + b.Property("PlaysLBP2") + .HasColumnType("int"); + + b.Property("PlaysLBP3") + .HasColumnType("int"); + + b.Property("PlaysLBPVita") + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("VisitedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("VisitedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => + { + b.Property("PhotoId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CreatorId") + .HasColumnType("int"); + + b.Property("LargeHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MediumHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhotoSubjectCollection") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PlanHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SmallHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("PhotoId"); + + b.HasIndex("CreatorId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => + { + b.Property("PhotoSubjectId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Bounds") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PhotoSubjectId"); + + b.HasIndex("UserId"); + + b.ToTable("PhotoSubjects"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => + { + b.Property("CommentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Message") + .HasColumnType("longtext"); + + b.Property("PosterUserId") + .HasColumnType("int"); + + b.Property("TargetUserId") + .HasColumnType("int"); + + b.Property("ThumbsDown") + .HasColumnType("int"); + + b.Property("ThumbsUp") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("CommentId"); + + b.HasIndex("PosterUserId"); + + b.HasIndex("TargetUserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.LastMatch", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("UserId"); + + b.ToTable("LastMatches"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("int"); + + b.Property("Y") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => + { + b.Property("ScoreId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("PlayerIdCollection") + .HasColumnType("longtext"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("ScoreId"); + + b.HasIndex("SlotId"); + + b.ToTable("Scores"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Biography") + .HasColumnType("longtext"); + + b.Property("BooHash") + .HasColumnType("longtext"); + + b.Property("Game") + .HasColumnType("int"); + + b.Property("IconHash") + .HasColumnType("longtext"); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("MehHash") + .HasColumnType("longtext"); + + b.Property("Password") + .HasColumnType("longtext"); + + b.Property("PasswordResetRequired") + .HasColumnType("tinyint(1)"); + + b.Property("Pins") + .HasColumnType("longtext"); + + b.Property("PlanetHash") + .HasColumnType("longtext"); + + b.Property("Username") + .HasColumnType("longtext"); + + b.Property("YayHash") + .HasColumnType("longtext"); + + b.HasKey("UserId"); + + b.HasIndex("LocationId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.WebToken", b => + { + b.Property("TokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserToken") + .HasColumnType("longtext"); + + b.HasKey("TokenId"); + + b.ToTable("WebTokens"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.AuthenticationAttempt", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.GameToken", "GameToken") + .WithMany() + .HasForeignKey("GameTokenId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GameToken"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "HeartedUser") + .WithMany() + .HasForeignKey("HeartedUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("HeartedUser"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") + .WithMany() + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Location"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") + .WithMany() + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Poster") + .WithMany() + .HasForeignKey("PosterUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Target") + .WithMany() + .HasForeignKey("TargetUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Poster"); + + b.Navigation("Target"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Location"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.cs b/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.cs new file mode 100644 index 00000000..26ae44f3 --- /dev/null +++ b/ProjectLighthouse/Migrations/20211130190200_AddYayBooMehHashesToUser.cs @@ -0,0 +1,48 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ProjectLighthouse.Migrations +{ + public partial class AddYayBooMehHashesToUser : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "BooHash", + table: "Users", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "MehHash", + table: "Users", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.AddColumn( + name: "YayHash", + table: "Users", + type: "longtext", + nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "BooHash", + table: "Users"); + + migrationBuilder.DropColumn( + name: "MehHash", + table: "Users"); + + migrationBuilder.DropColumn( + name: "YayHash", + table: "Users"); + } + } +} diff --git a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs index 92a8d2e0..e773e90a 100644 --- a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs +++ b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs @@ -473,6 +473,9 @@ namespace ProjectLighthouse.Migrations b.Property("Biography") .HasColumnType("longtext"); + b.Property("BooHash") + .HasColumnType("longtext"); + b.Property("Game") .HasColumnType("int"); @@ -485,6 +488,9 @@ namespace ProjectLighthouse.Migrations b.Property("LocationId") .HasColumnType("int"); + b.Property("MehHash") + .HasColumnType("longtext"); + b.Property("Password") .HasColumnType("longtext"); @@ -500,6 +506,9 @@ namespace ProjectLighthouse.Migrations b.Property("Username") .HasColumnType("longtext"); + b.Property("YayHash") + .HasColumnType("longtext"); + b.HasKey("UserId"); b.HasIndex("LocationId"); diff --git a/ProjectLighthouse/Types/User.cs b/ProjectLighthouse/Types/User.cs index cd8dbce0..001997f4 100644 --- a/ProjectLighthouse/Types/User.cs +++ b/ProjectLighthouse/Types/User.cs @@ -100,6 +100,10 @@ namespace LBPUnion.ProjectLighthouse.Types public bool PasswordResetRequired { get; set; } + public string YayHash { get; set; } = ""; + public string BooHash { get; set; } = ""; + public string MehHash { get; set; } = ""; + #nullable enable [NotMapped] public string Status { @@ -137,7 +141,10 @@ namespace LBPUnion.ProjectLighthouse.Types LbpSerializer.StringElement("pins", this.Pins) + LbpSerializer.StringElement("planets", this.PlanetHash) + LbpSerializer.BlankElement("photos") + - LbpSerializer.StringElement("heartCount", this.Hearts); + LbpSerializer.StringElement("heartCount", this.Hearts) + + LbpSerializer.StringElement("yay2", YayHash) + + LbpSerializer.StringElement("boo2", YayHash) + + LbpSerializer.StringElement("meh2", YayHash); this.ClientsConnected.Serialize(); return LbpSerializer.TaggedStringElement("user", user, "type", "user"); From de4fab3a35a4fadf9873f2ba41ed8c5b34a91449 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 14:13:43 -0500 Subject: [PATCH 04/24] Update InfluxDB.Client to 3.2.0 --- ProjectLighthouse/ProjectLighthouse.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectLighthouse/ProjectLighthouse.csproj b/ProjectLighthouse/ProjectLighthouse.csproj index a4e601cc..ffc2f979 100644 --- a/ProjectLighthouse/ProjectLighthouse.csproj +++ b/ProjectLighthouse/ProjectLighthouse.csproj @@ -9,7 +9,7 @@ - + From db6d0aab31c592a484df2c7216330fc5457f30bb Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 16:57:49 -0500 Subject: [PATCH 05/24] Use ASP.NET Partials for photo rendering --- .../Pages/Partials/PhotoPartial.cshtml | 22 +++++++++++++++++++ ProjectLighthouse/Pages/PhotosPage.cshtml | 20 +---------------- ProjectLighthouse/Pages/UserPage.cshtml | 15 +++---------- 3 files changed, 26 insertions(+), 31 deletions(-) create mode 100644 ProjectLighthouse/Pages/Partials/PhotoPartial.cshtml diff --git a/ProjectLighthouse/Pages/Partials/PhotoPartial.cshtml b/ProjectLighthouse/Pages/Partials/PhotoPartial.cshtml new file mode 100644 index 00000000..33a8fbc1 --- /dev/null +++ b/ProjectLighthouse/Pages/Partials/PhotoPartial.cshtml @@ -0,0 +1,22 @@ +@using LBPUnion.ProjectLighthouse.Types +@model LBPUnion.ProjectLighthouse.Types.Photo + + +
+ +

+ + Taken by + + @Model.Creator?.Username + + +

+ +

+ Photo contains @Model.Subjects.Count @(Model.Subjects.Count == 1 ? "person" : "people"): +

+@foreach (PhotoSubject subject in Model.Subjects) +{ + @subject.User.Username +} \ No newline at end of file diff --git a/ProjectLighthouse/Pages/PhotosPage.cshtml b/ProjectLighthouse/Pages/PhotosPage.cshtml index 844165ca..e579cbc3 100644 --- a/ProjectLighthouse/Pages/PhotosPage.cshtml +++ b/ProjectLighthouse/Pages/PhotosPage.cshtml @@ -12,25 +12,7 @@ @foreach (Photo photo in Model.Photos) {
- -
- -

- - Taken by - - @photo.Creator.Username - - -

- -

- Photo contains @photo.Subjects.Count @(photo.Subjects.Count == 1 ? "person" : "people"): -

- @foreach (PhotoSubject subject in photo.Subjects) - { - @subject.User.Username - } + @await Html.PartialAsync("Partials/PhotoPartial", photo)
} diff --git a/ProjectLighthouse/Pages/UserPage.cshtml b/ProjectLighthouse/Pages/UserPage.cshtml index d23cc01c..68317395 100644 --- a/ProjectLighthouse/Pages/UserPage.cshtml +++ b/ProjectLighthouse/Pages/UserPage.cshtml @@ -6,7 +6,7 @@ @{ Layout = "Layouts/BaseLayout"; - Model.Title = "Model.ProfileUser!.Username's user page"; + Model.Title = Model.ProfileUser!.Username + "'s user page"; Model.ShowTitleInPage = false; } @@ -14,7 +14,7 @@

@Model.Title

- @Model.ProfileUser.Status + @Model.ProfileUser!.Status

@Model.ProfileUser.Hearts @@ -74,16 +74,7 @@ @foreach (Photo photo in Model.Photos) {
- -
- -

- Photo contains @photo.Subjects.Count @(photo.Subjects.Count == 1 ? "person" : "people"): -

- @foreach (PhotoSubject subject in photo.Subjects) - { - @subject.User.Username - } + @await Html.PartialAsync("Partials/PhotoPartial", photo);
}
From 6dacfc364513c057eaf16c35e2b1e0e0b3ae5b30 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 18:32:28 -0500 Subject: [PATCH 06/24] Add SlotCardPartial class --- .../Pages/Partials/SlotCardPartial.cshtml | 74 +++++++++++++++++++ ProjectLighthouse/Pages/SlotsPage.cshtml | 73 +++--------------- 2 files changed, 83 insertions(+), 64 deletions(-) create mode 100644 ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml diff --git a/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml b/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml new file mode 100644 index 00000000..61fcf25b --- /dev/null +++ b/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml @@ -0,0 +1,74 @@ +@using LBPUnion.ProjectLighthouse +@using LBPUnion.ProjectLighthouse.Types +@using Microsoft.EntityFrameworkCore +@model LBPUnion.ProjectLighthouse.Types.Levels.Slot + +@{ + User user = (User)ViewData["User"]; + + await using Database database = new(); + + string slotName = string.IsNullOrEmpty(Model.Name) ? "Unnamed Level" : Model.Name; + + bool isQueued = false; + bool isHearted = false; + + if (user != null) + { + isQueued = await database.QueuedLevels.FirstOrDefaultAsync(h => h.SlotId == Model.SlotId && h.UserId == user.UserId) != null; + + isHearted = await database.HeartedLevels.FirstOrDefaultAsync(h => h.SlotId == Model.SlotId && h.UserId == user.UserId) != null; + } + + string callbackUrl = (string)ViewData["CallbackUrl"]; +} +
+
+

@slotName

+
+ @Model.Hearts + @Model.Plays + @Model.Thumbsup + @Model.Thumbsdown + + @if (Model.GameVersion == GameVersion.LittleBigPlanet1) + { + + @Model.RatingLBP1 + } +
+

+ Created by @Model.Creator?.Username +

+
+
+ @if (user != null) + { + if (isHearted) + { + + + + } + else + { + + + + } + + if (isQueued) + { + + + + } + else + { + + + + } + } +
+
\ No newline at end of file diff --git a/ProjectLighthouse/Pages/SlotsPage.cshtml b/ProjectLighthouse/Pages/SlotsPage.cshtml index 4af2a0bc..f94c1c69 100644 --- a/ProjectLighthouse/Pages/SlotsPage.cshtml +++ b/ProjectLighthouse/Pages/SlotsPage.cshtml @@ -1,7 +1,5 @@ @page "/slots/{pageNumber:int}" -@using LBPUnion.ProjectLighthouse.Types @using LBPUnion.ProjectLighthouse.Types.Levels -@using Microsoft.EntityFrameworkCore @model LBPUnion.ProjectLighthouse.Pages.SlotsPage @{ @@ -13,69 +11,16 @@ @foreach (Slot slot in Model.Slots) { - string slotName = string.IsNullOrEmpty(slot.Name) ? "Unnamed Level" : slot.Name; - - bool isQueued = false; - bool isHearted = false; - - if (Model.User != null) - { - isQueued = await Model.Database.QueuedLevels.FirstOrDefaultAsync(h => h.SlotId == slot.SlotId && h.UserId == Model.User.UserId) != null; - - isHearted = await Model.Database.HeartedLevels.FirstOrDefaultAsync(h => h.SlotId == slot.SlotId && h.UserId == Model.User.UserId) != null; - } -
-
-
-

@slotName

-
- @slot.Hearts - @slot.Plays - @slot.Thumbsup - @slot.Thumbsdown - - @if (slot.GameVersion == GameVersion.LittleBigPlanet1) - { - - @slot.RatingLBP1 - } -
-

- Created by @slot.Creator?.Username -

-
-
- @if (Model.User != null) - { - if (isHearted) - { - - - - } - else - { - - - - } - - if (isQueued) - { - - - - } - else - { - - - - } - } -
-
+ @await Html.PartialAsync("Partials/SlotCardPartial", slot, new ViewDataDictionary(ViewData) + { + { + "User", Model.User + }, + { + "CallbackUrl", $"~/slots/{Model.PageNumber}" + }, + })
} From 896795b9a28b78e314288b8b91754af4726e3a69 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 19:03:29 -0500 Subject: [PATCH 07/24] Add page for showing individual slots --- .../Pages/Layouts/BaseLayout.cshtml.cs | 5 +-- .../Pages/Partials/SlotCardPartial.cshtml | 14 ++++++- ProjectLighthouse/Pages/SlotPage.cshtml | 40 +++++++++++++++++++ ProjectLighthouse/Pages/SlotPage.cshtml.cs | 28 +++++++++++++ ProjectLighthouse/Pages/SlotsPage.cshtml | 3 ++ 5 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 ProjectLighthouse/Pages/SlotPage.cshtml create mode 100644 ProjectLighthouse/Pages/SlotPage.cshtml.cs diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs index eaca0975..5046b568 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml.cs @@ -9,12 +9,11 @@ namespace LBPUnion.ProjectLighthouse.Pages.Layouts { public readonly Database Database; - private User? user; - public string Title = string.Empty; - public bool ShowTitleInPage = true; + private User? user; + public new User? User { get { if (this.user != null) return this.user; diff --git a/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml b/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml index 61fcf25b..1d64b996 100644 --- a/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml +++ b/ProjectLighthouse/Pages/Partials/SlotCardPartial.cshtml @@ -21,10 +21,22 @@ } string callbackUrl = (string)ViewData["CallbackUrl"]; + bool showLink = (bool?)ViewData["ShowLink"] ?? false; }
-

@slotName

+ @if (showLink) + { +

+ @slotName +

+ } + else + { +

+ @slotName +

+ }
@Model.Hearts @Model.Plays diff --git a/ProjectLighthouse/Pages/SlotPage.cshtml b/ProjectLighthouse/Pages/SlotPage.cshtml new file mode 100644 index 00000000..75145e55 --- /dev/null +++ b/ProjectLighthouse/Pages/SlotPage.cshtml @@ -0,0 +1,40 @@ +@page "/slot/{id:int}" +@model LBPUnion.ProjectLighthouse.Pages.SlotPage + +@{ + Layout = "Layouts/BaseLayout"; + Model.Title = Model.Slot.Name; + Model.ShowTitleInPage = false; +} + +@await Html.PartialAsync("Partials/SlotCardPartial", Model.Slot, new ViewDataDictionary(ViewData) +{ + { + "User", Model.User + }, + { + "CallbackUrl", $"~/slot/{Model.Slot.SlotId}" + }, + { + "ShowLink", false + }, +}) + + +
+
+
+

Description

+

@Model.Slot.Description

+
+
+
+
+

Tags

+ @foreach (string label in Model.Slot.AuthorLabels.Split(",")) + { +
@label.Replace("LABEL_", "")
+ } +
+
+
\ No newline at end of file diff --git a/ProjectLighthouse/Pages/SlotPage.cshtml.cs b/ProjectLighthouse/Pages/SlotPage.cshtml.cs new file mode 100644 index 00000000..bd2de3ab --- /dev/null +++ b/ProjectLighthouse/Pages/SlotPage.cshtml.cs @@ -0,0 +1,28 @@ +#nullable enable +using System.Threading.Tasks; +using JetBrains.Annotations; +using LBPUnion.ProjectLighthouse.Pages.Layouts; +using LBPUnion.ProjectLighthouse.Types.Levels; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace LBPUnion.ProjectLighthouse.Pages +{ + public class SlotPage : BaseLayout + { + public SlotPage([NotNull] Database database) : base(database) + {} + + public Slot Slot; + + public async Task OnGet([FromRoute] int id) + { + Slot? slot = await this.Database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); + if (slot == null) return this.NotFound(); + + this.Slot = slot; + + return this.Page(); + } + } +} \ No newline at end of file diff --git a/ProjectLighthouse/Pages/SlotsPage.cshtml b/ProjectLighthouse/Pages/SlotsPage.cshtml index f94c1c69..ef76e3aa 100644 --- a/ProjectLighthouse/Pages/SlotsPage.cshtml +++ b/ProjectLighthouse/Pages/SlotsPage.cshtml @@ -20,6 +20,9 @@ { "CallbackUrl", $"~/slots/{Model.PageNumber}" }, + { + "ShowLink", true + }, })
} From 841692addb935ecc668b4dc84879be1f871ab02a Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 30 Nov 2021 19:06:30 -0500 Subject: [PATCH 08/24] Fix blank labels on slot page & blank creator --- ProjectLighthouse/Pages/SlotPage.cshtml | 2 +- ProjectLighthouse/Pages/SlotPage.cshtml.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ProjectLighthouse/Pages/SlotPage.cshtml b/ProjectLighthouse/Pages/SlotPage.cshtml index 75145e55..5faf620d 100644 --- a/ProjectLighthouse/Pages/SlotPage.cshtml +++ b/ProjectLighthouse/Pages/SlotPage.cshtml @@ -31,7 +31,7 @@

Tags

- @foreach (string label in Model.Slot.AuthorLabels.Split(",")) + @foreach (string label in Model.Slot.AuthorLabels.Split(",").Where(label => !string.IsNullOrEmpty(label))) {
@label.Replace("LABEL_", "")
} diff --git a/ProjectLighthouse/Pages/SlotPage.cshtml.cs b/ProjectLighthouse/Pages/SlotPage.cshtml.cs index bd2de3ab..af2bfd60 100644 --- a/ProjectLighthouse/Pages/SlotPage.cshtml.cs +++ b/ProjectLighthouse/Pages/SlotPage.cshtml.cs @@ -17,7 +17,7 @@ namespace LBPUnion.ProjectLighthouse.Pages public async Task OnGet([FromRoute] int id) { - Slot? slot = await this.Database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); + Slot? slot = await this.Database.Slots.Include(s => s.Creator).FirstOrDefaultAsync(s => s.SlotId == id); if (slot == null) return this.NotFound(); this.Slot = slot; From 6fb294a5b553b19041098e935ae28c29293b7b6a Mon Sep 17 00:00:00 2001 From: jvyden Date: Thu, 2 Dec 2021 18:40:36 -0500 Subject: [PATCH 09/24] Add admin controls to slot page Closes #77 --- .../Website/Admin/AdminSlotController.cs | 73 +++++++++++++++++++ ProjectLighthouse/Pages/SlotPage.cshtml | 53 ++++++++++++-- 2 files changed, 120 insertions(+), 6 deletions(-) create mode 100644 ProjectLighthouse/Controllers/Website/Admin/AdminSlotController.cs diff --git a/ProjectLighthouse/Controllers/Website/Admin/AdminSlotController.cs b/ProjectLighthouse/Controllers/Website/Admin/AdminSlotController.cs new file mode 100644 index 00000000..70c973ef --- /dev/null +++ b/ProjectLighthouse/Controllers/Website/Admin/AdminSlotController.cs @@ -0,0 +1,73 @@ +#nullable enable +using System; +using System.Threading.Tasks; +using LBPUnion.ProjectLighthouse.Types; +using LBPUnion.ProjectLighthouse.Types.Levels; +using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; + +namespace LBPUnion.ProjectLighthouse.Controllers.Website.Admin +{ + [ApiController] + [Route("admin/slot/{id:int}")] + public class AdminSlotController : ControllerBase + { + private readonly Database database; + + public AdminSlotController(Database database) + { + this.database = database; + } + + [Route("teamPick")] + public async Task TeamPick([FromRoute] int id) + { + User? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsAdmin) return this.StatusCode(403, ""); + + Slot? slot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); + if (slot == null) return this.NotFound(); + + slot.TeamPick = true; + + await this.database.SaveChangesAsync(); + + return this.Ok(); + } + + [Route("removeTeamPick")] + public async Task RemoveTeamPick([FromRoute] int id) + { + User? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsAdmin) return this.StatusCode(403, ""); + + Slot? slot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); + if (slot == null) return this.NotFound(); + + slot.TeamPick = false; + + await this.database.SaveChangesAsync(); + + return this.Ok(); + } + + [Route("delete")] + public async Task DeleteLevel([FromRoute] int id) + { + User? user = this.database.UserFromWebRequest(this.Request); + if (user == null || !user.IsAdmin) return this.StatusCode(403, ""); + + Slot? slot = await this.database.Slots.FirstOrDefaultAsync(s => s.SlotId == id); + if (slot == null) return this.Ok(); + + if (slot.Location == null) throw new ArgumentNullException(); + + this.database.Locations.Remove(slot.Location); + this.database.Slots.Remove(slot); + + await this.database.SaveChangesAsync(); + + return this.Ok(); + } + } +} \ No newline at end of file diff --git a/ProjectLighthouse/Pages/SlotPage.cshtml b/ProjectLighthouse/Pages/SlotPage.cshtml index 5faf620d..221d99f2 100644 --- a/ProjectLighthouse/Pages/SlotPage.cshtml +++ b/ProjectLighthouse/Pages/SlotPage.cshtml @@ -20,21 +20,62 @@ }, }) -

Description

-

@Model.Slot.Description

+

@(string.IsNullOrEmpty(Model.Slot.Description) ? "This level has no description." : Model.Slot.Description)

Tags

- @foreach (string label in Model.Slot.AuthorLabels.Split(",").Where(label => !string.IsNullOrEmpty(label))) - { -
@label.Replace("LABEL_", "")
+ @{ + string[] authorLabels = Model.Slot.AuthorLabels.Split(","); + if (authorLabels.Length == 1) // ..?? ok c# + { +

This level has no tags.

+ } + else + { + foreach (string label in authorLabels.Where(label => !string.IsNullOrEmpty(label))) + { +
@label.Replace("LABEL_", "")
+ } + } }
-
\ No newline at end of file +
+@if (Model.User != null && Model.User.IsAdmin) +{ +
+

Admin Settings

+ + @if (Model.Slot.TeamPick) + { + +
+ + Remove Team Pick +
+
+ } + else + { + +
+ + Team Pick +
+
+ } + + +
+ + Delete +
+
+
+} \ No newline at end of file From eb4d0c6f6770e3e74e2e54c63999699087eca338 Mon Sep 17 00:00:00 2001 From: jvyden Date: Thu, 2 Dec 2021 18:44:44 -0500 Subject: [PATCH 10/24] Rename LastMatch to LastContact --- ProjectLighthouse/Controllers/MatchController.cs | 6 +++--- ProjectLighthouse/Database.cs | 2 +- ProjectLighthouse/Helpers/StatisticsHelper.cs | 2 +- ProjectLighthouse/Pages/LandingPage.cshtml.cs | 2 +- .../Types/Profiles/{LastMatch.cs => LastContact.cs} | 2 +- ProjectLighthouse/Types/User.cs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) rename ProjectLighthouse/Types/Profiles/{LastMatch.cs => LastContact.cs} (90%) diff --git a/ProjectLighthouse/Controllers/MatchController.cs b/ProjectLighthouse/Controllers/MatchController.cs index 4315628e..cd9400c1 100644 --- a/ProjectLighthouse/Controllers/MatchController.cs +++ b/ProjectLighthouse/Controllers/MatchController.cs @@ -74,17 +74,17 @@ namespace LBPUnion.ProjectLighthouse.Controllers #region Update LastMatch - LastMatch? lastMatch = await this.database.LastMatches.Where(l => l.UserId == user.UserId).FirstOrDefaultAsync(); + LastContact? lastMatch = await this.database.LastContacts.Where(l => l.UserId == user.UserId).FirstOrDefaultAsync(); // below makes it not look like trash // ReSharper disable once ConvertIfStatementToNullCoalescingExpression if (lastMatch == null) { - lastMatch = new LastMatch + lastMatch = new LastContact { UserId = user.UserId, }; - this.database.LastMatches.Add(lastMatch); + this.database.LastContacts.Add(lastMatch); } lastMatch.Timestamp = TimestampHelper.Timestamp; diff --git a/ProjectLighthouse/Database.cs b/ProjectLighthouse/Database.cs index b8a9a599..3a5366cc 100644 --- a/ProjectLighthouse/Database.cs +++ b/ProjectLighthouse/Database.cs @@ -27,7 +27,7 @@ namespace LBPUnion.ProjectLighthouse public DbSet Scores { get; set; } public DbSet PhotoSubjects { get; set; } public DbSet Photos { get; set; } - public DbSet LastMatches { get; set; } + public DbSet LastContacts { get; set; } public DbSet VisitedLevels { get; set; } public DbSet RatedLevels { get; set; } public DbSet AuthenticationAttempts { get; set; } diff --git a/ProjectLighthouse/Helpers/StatisticsHelper.cs b/ProjectLighthouse/Helpers/StatisticsHelper.cs index 53d51710..97091d22 100644 --- a/ProjectLighthouse/Helpers/StatisticsHelper.cs +++ b/ProjectLighthouse/Helpers/StatisticsHelper.cs @@ -8,7 +8,7 @@ namespace LBPUnion.ProjectLighthouse.Helpers { private static readonly Database database = new(); - public static async Task RecentMatches() => await database.LastMatches.Where(l => TimestampHelper.Timestamp - l.Timestamp < 300).CountAsync(); + public static async Task RecentMatches() => await database.LastContacts.Where(l => TimestampHelper.Timestamp - l.Timestamp < 300).CountAsync(); public static async Task SlotCount() => await database.Slots.CountAsync(); diff --git a/ProjectLighthouse/Pages/LandingPage.cshtml.cs b/ProjectLighthouse/Pages/LandingPage.cshtml.cs index b02d3897..64fcd9dd 100644 --- a/ProjectLighthouse/Pages/LandingPage.cshtml.cs +++ b/ProjectLighthouse/Pages/LandingPage.cshtml.cs @@ -27,7 +27,7 @@ namespace LBPUnion.ProjectLighthouse.Pages this.PlayersOnlineCount = await StatisticsHelper.RecentMatches(); - List userIds = await this.Database.LastMatches.Where(l => TimestampHelper.Timestamp - l.Timestamp < 300).Select(l => l.UserId).ToListAsync(); + List userIds = await this.Database.LastContacts.Where(l => TimestampHelper.Timestamp - l.Timestamp < 300).Select(l => l.UserId).ToListAsync(); this.PlayersOnline = await this.Database.Users.Where(u => userIds.Contains(u.UserId)).ToListAsync(); return this.Page(); diff --git a/ProjectLighthouse/Types/Profiles/LastMatch.cs b/ProjectLighthouse/Types/Profiles/LastContact.cs similarity index 90% rename from ProjectLighthouse/Types/Profiles/LastMatch.cs rename to ProjectLighthouse/Types/Profiles/LastContact.cs index 832430cd..295250b8 100644 --- a/ProjectLighthouse/Types/Profiles/LastMatch.cs +++ b/ProjectLighthouse/Types/Profiles/LastContact.cs @@ -2,7 +2,7 @@ using System.ComponentModel.DataAnnotations; namespace LBPUnion.ProjectLighthouse.Types.Profiles { - public class LastMatch + public class LastContact { [Key] public int UserId { get; set; } diff --git a/ProjectLighthouse/Types/User.cs b/ProjectLighthouse/Types/User.cs index 001997f4..6f24a385 100644 --- a/ProjectLighthouse/Types/User.cs +++ b/ProjectLighthouse/Types/User.cs @@ -109,7 +109,7 @@ namespace LBPUnion.ProjectLighthouse.Types public string Status { get { using Database database = new(); - LastMatch? lastMatch = database.LastMatches.Where + LastContact? lastMatch = database.LastContacts.Where (l => l.UserId == this.UserId) .FirstOrDefault(l => TimestampHelper.Timestamp - l.Timestamp < 300); From 8677d1c72cb6f7a729aaacb8732fc9a0a78667db Mon Sep 17 00:00:00 2001 From: jvyden Date: Thu, 2 Dec 2021 19:02:31 -0500 Subject: [PATCH 11/24] Add LBP1 online tracking support --- .../Controllers/MatchController.cs | 24 +- .../Helpers/LastContactHelper.cs | 35 + ...enameLastMatchesToLastContacts.Designer.cs | 728 ++++++++++++++++++ ...2235932_RenameLastMatchesToLastContacts.cs | 20 + .../Migrations/DatabaseModelSnapshot.cs | 4 +- ProjectLighthouse/Startup.cs | 19 +- 6 files changed, 803 insertions(+), 27 deletions(-) create mode 100644 ProjectLighthouse/Helpers/LastContactHelper.cs create mode 100644 ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.Designer.cs create mode 100644 ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.cs diff --git a/ProjectLighthouse/Controllers/MatchController.cs b/ProjectLighthouse/Controllers/MatchController.cs index cd9400c1..b06a1218 100644 --- a/ProjectLighthouse/Controllers/MatchController.cs +++ b/ProjectLighthouse/Controllers/MatchController.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text.Json; using System.Threading.Tasks; using Kettu; @@ -10,7 +9,6 @@ using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types.Match; -using LBPUnion.ProjectLighthouse.Types.Profiles; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -72,27 +70,7 @@ namespace LBPUnion.ProjectLighthouse.Controllers #endregion - #region Update LastMatch - - LastContact? lastMatch = await this.database.LastContacts.Where(l => l.UserId == user.UserId).FirstOrDefaultAsync(); - - // below makes it not look like trash - // ReSharper disable once ConvertIfStatementToNullCoalescingExpression - if (lastMatch == null) - { - lastMatch = new LastContact - { - UserId = user.UserId, - }; - this.database.LastContacts.Add(lastMatch); - } - - lastMatch.Timestamp = TimestampHelper.Timestamp; - lastMatch.GameVersion = gameToken.GameVersion; - - await this.database.SaveChangesAsync(); - - #endregion + await LastContactHelper.SetLastContact(user, gameToken.GameVersion); #region Process match data diff --git a/ProjectLighthouse/Helpers/LastContactHelper.cs b/ProjectLighthouse/Helpers/LastContactHelper.cs new file mode 100644 index 00000000..fa06e84b --- /dev/null +++ b/ProjectLighthouse/Helpers/LastContactHelper.cs @@ -0,0 +1,35 @@ +#nullable enable +using System.Linq; +using System.Threading.Tasks; +using LBPUnion.ProjectLighthouse.Types; +using LBPUnion.ProjectLighthouse.Types.Profiles; +using Microsoft.EntityFrameworkCore; + +namespace LBPUnion.ProjectLighthouse.Helpers +{ + public static class LastContactHelper + { + private static readonly Database database = new(); + + public static async Task SetLastContact(User user, GameVersion gameVersion) + { + LastContact? lastContact = await database.LastContacts.Where(l => l.UserId == user.UserId).FirstOrDefaultAsync(); + + // below makes it not look like trash + // ReSharper disable once ConvertIfStatementToNullCoalescingExpression + if (lastContact == null) + { + lastContact = new LastContact + { + UserId = user.UserId, + }; + database.LastContacts.Add(lastContact); + } + + lastContact.Timestamp = TimestampHelper.Timestamp; + lastContact.GameVersion = gameVersion; + + await database.SaveChangesAsync(); + } + } +} \ No newline at end of file diff --git a/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.Designer.cs b/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.Designer.cs new file mode 100644 index 00000000..ef8e4d93 --- /dev/null +++ b/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.Designer.cs @@ -0,0 +1,728 @@ +// +using LBPUnion.ProjectLighthouse; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace ProjectLighthouse.Migrations +{ + [DbContext(typeof(Database))] + [Migration("20211202235932_RenameLastMatchesToLastContacts")] + partial class RenameLastMatchesToLastContacts + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.AuthenticationAttempt", b => + { + b.Property("AuthenticationAttemptId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("GameTokenId") + .HasColumnType("int"); + + b.Property("IPAddress") + .HasColumnType("longtext"); + + b.Property("Platform") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("AuthenticationAttemptId"); + + b.HasIndex("GameTokenId"); + + b.ToTable("AuthenticationAttempts"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.GameToken", b => + { + b.Property("TokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Approved") + .HasColumnType("tinyint(1)"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserLocation") + .HasColumnType("longtext"); + + b.Property("UserToken") + .HasColumnType("longtext"); + + b.HasKey("TokenId"); + + b.ToTable("GameTokens"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => + { + b.Property("HeartedProfileId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("HeartedUserId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("HeartedProfileId"); + + b.HasIndex("HeartedUserId"); + + b.HasIndex("UserId"); + + b.ToTable("HeartedProfiles"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => + { + b.Property("HeartedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("HeartedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("HeartedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => + { + b.Property("QueuedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("QueuedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("QueuedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => + { + b.Property("RatedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Rating") + .HasColumnType("int"); + + b.Property("RatingLBP1") + .HasColumnType("double"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("RatedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("RatedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => + { + b.Property("SlotId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("AuthorLabels") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("BackgroundHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("CreatorId") + .HasColumnType("int"); + + b.Property("Description") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("FirstUploaded") + .HasColumnType("bigint"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("IconHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("InitiallyLocked") + .HasColumnType("tinyint(1)"); + + b.Property("LastUpdated") + .HasColumnType("bigint"); + + b.Property("Lbp1Only") + .HasColumnType("tinyint(1)"); + + b.Property("LevelType") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("MaximumPlayers") + .HasColumnType("int"); + + b.Property("MinimumPlayers") + .HasColumnType("int"); + + b.Property("MoveRequired") + .HasColumnType("tinyint(1)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PlaysLBP1") + .HasColumnType("int"); + + b.Property("PlaysLBP1Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP1Unique") + .HasColumnType("int"); + + b.Property("PlaysLBP2") + .HasColumnType("int"); + + b.Property("PlaysLBP2Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP2Unique") + .HasColumnType("int"); + + b.Property("PlaysLBP3") + .HasColumnType("int"); + + b.Property("PlaysLBP3Complete") + .HasColumnType("int"); + + b.Property("PlaysLBP3Unique") + .HasColumnType("int"); + + b.Property("PlaysLBPVita") + .HasColumnType("int"); + + b.Property("PlaysLBPVitaComplete") + .HasColumnType("int"); + + b.Property("PlaysLBPVitaUnique") + .HasColumnType("int"); + + b.Property("ResourceCollection") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("RootLevel") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Shareable") + .HasColumnType("int"); + + b.Property("SubLevel") + .HasColumnType("tinyint(1)"); + + b.Property("TeamPick") + .HasColumnType("tinyint(1)"); + + b.HasKey("SlotId"); + + b.HasIndex("CreatorId"); + + b.HasIndex("LocationId"); + + b.ToTable("Slots"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => + { + b.Property("VisitedLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("PlaysLBP1") + .HasColumnType("int"); + + b.Property("PlaysLBP2") + .HasColumnType("int"); + + b.Property("PlaysLBP3") + .HasColumnType("int"); + + b.Property("PlaysLBPVita") + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("VisitedLevelId"); + + b.HasIndex("SlotId"); + + b.HasIndex("UserId"); + + b.ToTable("VisitedLevels"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => + { + b.Property("PhotoId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("CreatorId") + .HasColumnType("int"); + + b.Property("LargeHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("MediumHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PhotoSubjectCollection") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("PlanHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("SmallHash") + .IsRequired() + .HasColumnType("longtext"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("PhotoId"); + + b.HasIndex("CreatorId"); + + b.ToTable("Photos"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => + { + b.Property("PhotoSubjectId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Bounds") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("int"); + + b.HasKey("PhotoSubjectId"); + + b.HasIndex("UserId"); + + b.ToTable("PhotoSubjects"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => + { + b.Property("CommentId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Message") + .HasColumnType("longtext"); + + b.Property("PosterUserId") + .HasColumnType("int"); + + b.Property("TargetUserId") + .HasColumnType("int"); + + b.Property("ThumbsDown") + .HasColumnType("int"); + + b.Property("ThumbsUp") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("CommentId"); + + b.HasIndex("PosterUserId"); + + b.HasIndex("TargetUserId"); + + b.ToTable("Comments"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.LastContact", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("GameVersion") + .HasColumnType("int"); + + b.Property("Timestamp") + .HasColumnType("bigint"); + + b.HasKey("UserId"); + + b.ToTable("LastContacts"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Location", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("X") + .HasColumnType("int"); + + b.Property("Y") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("Locations"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => + { + b.Property("ScoreId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("PlayerIdCollection") + .HasColumnType("longtext"); + + b.Property("Points") + .HasColumnType("int"); + + b.Property("SlotId") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("int"); + + b.HasKey("ScoreId"); + + b.HasIndex("SlotId"); + + b.ToTable("Scores"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Biography") + .HasColumnType("longtext"); + + b.Property("BooHash") + .HasColumnType("longtext"); + + b.Property("Game") + .HasColumnType("int"); + + b.Property("IconHash") + .HasColumnType("longtext"); + + b.Property("IsAdmin") + .HasColumnType("tinyint(1)"); + + b.Property("LocationId") + .HasColumnType("int"); + + b.Property("MehHash") + .HasColumnType("longtext"); + + b.Property("Password") + .HasColumnType("longtext"); + + b.Property("PasswordResetRequired") + .HasColumnType("tinyint(1)"); + + b.Property("Pins") + .HasColumnType("longtext"); + + b.Property("PlanetHash") + .HasColumnType("longtext"); + + b.Property("Username") + .HasColumnType("longtext"); + + b.Property("YayHash") + .HasColumnType("longtext"); + + b.HasKey("UserId"); + + b.HasIndex("LocationId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.WebToken", b => + { + b.Property("TokenId") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("int"); + + b.Property("UserToken") + .HasColumnType("longtext"); + + b.HasKey("TokenId"); + + b.ToTable("WebTokens"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.AuthenticationAttempt", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.GameToken", "GameToken") + .WithMany() + .HasForeignKey("GameTokenId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("GameToken"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "HeartedUser") + .WithMany() + .HasForeignKey("HeartedUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("HeartedUser"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") + .WithMany() + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + + b.Navigation("Location"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") + .WithMany() + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Poster") + .WithMany() + .HasForeignKey("PosterUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Target") + .WithMany() + .HasForeignKey("TargetUserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Poster"); + + b.Navigation("Target"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") + .WithMany() + .HasForeignKey("SlotId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Slot"); + }); + + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => + { + b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") + .WithMany() + .HasForeignKey("LocationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Location"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.cs b/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.cs new file mode 100644 index 00000000..0029a287 --- /dev/null +++ b/ProjectLighthouse/Migrations/20211202235932_RenameLastMatchesToLastContacts.cs @@ -0,0 +1,20 @@ +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace ProjectLighthouse.Migrations +{ + public partial class RenameLastMatchesToLastContacts : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameTable(name: "LastMatches", newName: "LastContacts"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.RenameTable(name: "LastContacts", newName: "LastMatches"); + } + } +} diff --git a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs index e773e90a..afdbbcbb 100644 --- a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs +++ b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs @@ -405,7 +405,7 @@ namespace ProjectLighthouse.Migrations b.ToTable("Comments"); }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.LastMatch", b => + modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.LastContact", b => { b.Property("UserId") .ValueGeneratedOnAdd() @@ -419,7 +419,7 @@ namespace ProjectLighthouse.Migrations b.HasKey("UserId"); - b.ToTable("LastMatches"); + b.ToTable("LastContacts"); }); modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Location", b => diff --git a/ProjectLighthouse/Startup.cs b/ProjectLighthouse/Startup.cs index 0048c96c..27071604 100644 --- a/ProjectLighthouse/Startup.cs +++ b/ProjectLighthouse/Startup.cs @@ -4,6 +4,7 @@ using Kettu; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; using LBPUnion.ProjectLighthouse.Serialization; +using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types.Settings; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -135,11 +136,25 @@ namespace LBPUnion.ProjectLighthouse // Copy the buffered response to the actual respose stream. responseBuffer.Position = 0; - await responseBuffer.CopyToAsync(oldResponseStream); - context.Response.Body = oldResponseStream; + #nullable enable + // Log LastContact for LBP1. This is done on LBP2/3/V on a Match request. + if (context.Request.Path.ToString().StartsWith("/LITTLEBIGPLANETPS3_XML")) + { + // We begin by grabbing a token from the request, if this is a LBPPS3_XML request of course. + await using Database database = new(); // Gets nuked at the end of the scope + GameToken? gameToken = await database.GameTokenFromRequest(context.Request); + + if (gameToken != null && gameToken.GameVersion == GameVersion.LittleBigPlanet1) + { + // Ignore UserFromGameToken null because user must exist for a token to exist + await LastContactHelper.SetLastContact((await database.UserFromGameToken(gameToken))!, GameVersion.LittleBigPlanet1); + } + } + #nullable disable + requestStopwatch.Stop(); Logger.Log From a40e9ea14061c6c9754555d22d3fa337aca11f39 Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Fri, 3 Dec 2021 20:06:44 -0500 Subject: [PATCH 12/24] update gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index d03fbb3d..180e13fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# rider +.idea/ + r/ # cdn resources folder bin/ obj/ @@ -14,4 +17,4 @@ riderModule.iml .vs/ lighthouse.config.json gitBranch.txt -gitVersion.txt \ No newline at end of file +gitVersion.txt From 868308c574a579e57ed20fcfb89c87f9581e5286 Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Fri, 3 Dec 2021 21:36:00 -0500 Subject: [PATCH 13/24] Fix issue where register page sends username and password as GET parameters. --- ProjectLighthouse/Pages/RegisterForm.cshtml | 14 +++- .../Pages/RegisterForm.cshtml.cs | 78 +++++++++++++------ 2 files changed, 66 insertions(+), 26 deletions(-) diff --git a/ProjectLighthouse/Pages/RegisterForm.cshtml b/ProjectLighthouse/Pages/RegisterForm.cshtml index 6a755f8c..ab315267 100644 --- a/ProjectLighthouse/Pages/RegisterForm.cshtml +++ b/ProjectLighthouse/Pages/RegisterForm.cshtml @@ -20,8 +20,20 @@ } - +@if (!string.IsNullOrWhiteSpace(Model.Error)) +{ +
+
+ Uh oh! +
+

@Model.Error

+
+} + +
+ @Html.AntiForgeryToken() +


diff --git a/ProjectLighthouse/Pages/RegisterForm.cshtml.cs b/ProjectLighthouse/Pages/RegisterForm.cshtml.cs index 91a22719..44883a40 100644 --- a/ProjectLighthouse/Pages/RegisterForm.cshtml.cs +++ b/ProjectLighthouse/Pages/RegisterForm.cshtml.cs @@ -14,40 +14,68 @@ namespace LBPUnion.ProjectLighthouse.Pages { public RegisterForm(Database database) : base(database) {} - + + public string Error { get; private set; } public bool WasRegisterRequest { get; private set; } [UsedImplicitly] - [SuppressMessage("ReSharper", "SpecifyStringComparison")] - public async Task OnGet([FromQuery] string username, [FromQuery] string password, [FromQuery] string confirmPassword) + [SuppressMessage("ReSharper", + "SpecifyStringComparison")] + public async Task OnPost(string username, string password, string confirmPassword) { if (!ServerSettings.Instance.RegistrationEnabled) return this.NotFound(); - this.WasRegisterRequest = !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password) && !string.IsNullOrEmpty(confirmPassword); - - if (this.WasRegisterRequest) + if (string.IsNullOrWhiteSpace(username)) { - if (password != confirmPassword) return this.BadRequest(); - - bool userExists = await this.Database.Users.FirstOrDefaultAsync(u => u.Username.ToLower() == username.ToLower()) != null; - if (userExists) return this.BadRequest(); - - User user = await this.Database.CreateUser(username, HashHelper.BCryptHash(password)); - - WebToken webToken = new() - { - UserId = user.UserId, - UserToken = HashHelper.GenerateAuthToken(), - }; - - this.Database.WebTokens.Add(webToken); - await this.Database.SaveChangesAsync(); - - this.Response.Cookies.Append("LighthouseToken", webToken.UserToken); - - return this.RedirectToPage(nameof(LandingPage)); + this.Error = "The username field is blank."; + return this.Page(); } + if (string.IsNullOrWhiteSpace(password)) + { + this.Error = "Password field is required."; + return this.Page(); + } + + if (password != confirmPassword) + { + this.Error = "Passwords do not match!"; + return this.Page(); + } + + bool userExists = + await this.Database.Users.FirstOrDefaultAsync(u => u.Username.ToLower() == username.ToLower()) != null; + if (userExists) + { + this.Error = "The username you've chosen is already taken."; + return this.Page(); + } + + User user = await this.Database.CreateUser(username, + HashHelper.BCryptHash(password)); + + WebToken webToken = new() + { + UserId = user.UserId, + UserToken = HashHelper.GenerateAuthToken(), + }; + + this.Database.WebTokens.Add(webToken); + await this.Database.SaveChangesAsync(); + + this.Response.Cookies.Append("LighthouseToken", + webToken.UserToken); + + return this.RedirectToPage(nameof(LandingPage)); + } + + [UsedImplicitly] + [SuppressMessage("ReSharper", "SpecifyStringComparison")] + public IActionResult OnGet() + { + Error = string.Empty; + if (!ServerSettings.Instance.RegistrationEnabled) return this.NotFound(); + return this.Page(); } } From de897d01d9d3beb55938392b0061dfaf8df34d69 Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Fri, 3 Dec 2021 21:46:53 -0500 Subject: [PATCH 14/24] Fix issue where login form sends username and password as GET parameters. --- ProjectLighthouse/Pages/LoginForm.cshtml | 17 ++++- ProjectLighthouse/Pages/LoginForm.cshtml.cs | 73 ++++++++++++++------- 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/ProjectLighthouse/Pages/LoginForm.cshtml b/ProjectLighthouse/Pages/LoginForm.cshtml index d6ebed62..6781af70 100644 --- a/ProjectLighthouse/Pages/LoginForm.cshtml +++ b/ProjectLighthouse/Pages/LoginForm.cshtml @@ -16,8 +16,21 @@ return true; } - - + + +@if (!string.IsNullOrWhiteSpace(Model.Error)) +{ +
+
+ Uh oh! +
+

@Model.Error

+
+} + + + @Html.AntiForgeryToken() +
diff --git a/ProjectLighthouse/Pages/LoginForm.cshtml.cs b/ProjectLighthouse/Pages/LoginForm.cshtml.cs index 332f1448..4f54e05c 100644 --- a/ProjectLighthouse/Pages/LoginForm.cshtml.cs +++ b/ProjectLighthouse/Pages/LoginForm.cshtml.cs @@ -12,38 +12,63 @@ namespace LBPUnion.ProjectLighthouse.Pages public class LoginForm : BaseLayout { public LoginForm(Database database) : base(database) - {} + { } + + public string Error { get; private set; } public bool WasLoginRequest { get; private set; } [UsedImplicitly] - public async Task OnGet([FromQuery] string username, [FromQuery] string password) + public async Task OnPost(string username, string password) { - this.WasLoginRequest = !string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password); - - if (this.WasLoginRequest) + if (string.IsNullOrWhiteSpace(username)) { - User? user = await this.Database.Users.FirstOrDefaultAsync(u => u.Username == username); - if (user == null) return this.StatusCode(403, ""); - - if (!BCrypt.Net.BCrypt.Verify(password, user.Password)) return this.StatusCode(403, ""); - - WebToken webToken = new() - { - UserId = user.UserId, - UserToken = HashHelper.GenerateAuthToken(), - }; - - this.Database.WebTokens.Add(webToken); - await this.Database.SaveChangesAsync(); - - this.Response.Cookies.Append("LighthouseToken", webToken.UserToken); - - if (user.PasswordResetRequired) return this.Redirect("~/passwordResetRequired"); - - return this.RedirectToPage(nameof(LandingPage)); + this.Error = "The username field is required."; + return this.Page(); } + if (string.IsNullOrWhiteSpace(password)) + { + this.Error = "The password field is required."; + return this.Page(); + } + + User? user = await this.Database.Users.FirstOrDefaultAsync(u => u.Username == username); + if (user == null) + { + this.Error = "The username or password you entered is invalid."; + return this.Page(); + } + + if (!BCrypt.Net.BCrypt.Verify(password, + user.Password)) + { + this.Error = "The username or password you entered is invalid."; + return this.Page(); + } + + WebToken webToken = new() + { + UserId = user.UserId, + UserToken = HashHelper.GenerateAuthToken(), + }; + + this.Database.WebTokens.Add(webToken); + await this.Database.SaveChangesAsync(); + + this.Response.Cookies.Append("LighthouseToken", + webToken.UserToken); + + if (user.PasswordResetRequired) return this.Redirect("~/passwordResetRequired"); + + return this.RedirectToPage(nameof(LandingPage)); + } + + + [UsedImplicitly] + public async Task OnGet() + { + Error = string.Empty; return this.Page(); } } From fbcf0eafa78a69fb58a2627c075e38999caa2c75 Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Fri, 3 Dec 2021 21:54:30 -0500 Subject: [PATCH 15/24] Fix issue where password reset form sends password as a GET parameter. --- .../Pages/PasswordResetPage.cshtml | 14 ++++++- .../Pages/PasswordResetPage.cshtml.cs | 41 +++++++++++++------ 2 files changed, 41 insertions(+), 14 deletions(-) diff --git a/ProjectLighthouse/Pages/PasswordResetPage.cshtml b/ProjectLighthouse/Pages/PasswordResetPage.cshtml index a9acf1b4..d7b3ca36 100644 --- a/ProjectLighthouse/Pages/PasswordResetPage.cshtml +++ b/ProjectLighthouse/Pages/PasswordResetPage.cshtml @@ -19,8 +19,20 @@ return true; } + +@if (!string.IsNullOrWhiteSpace(Model.Error)) +{ +
+
+ Uh oh! +
+

@Model.Error

+
+} + + + @Html.AntiForgeryToken() -
diff --git a/ProjectLighthouse/Pages/PasswordResetPage.cshtml.cs b/ProjectLighthouse/Pages/PasswordResetPage.cshtml.cs index e0c473d3..1b1e893a 100644 --- a/ProjectLighthouse/Pages/PasswordResetPage.cshtml.cs +++ b/ProjectLighthouse/Pages/PasswordResetPage.cshtml.cs @@ -1,5 +1,6 @@ #nullable enable using System.Threading.Tasks; +using JetBrains.Annotations; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Pages.Layouts; using LBPUnion.ProjectLighthouse.Types; @@ -12,26 +13,40 @@ namespace LBPUnion.ProjectLighthouse.Pages public PasswordResetPage(Database database) : base(database) {} - public bool WasResetRequest { get; private set; } - public async Task OnGet([FromQuery] string password, [FromQuery] string confirmPassword) + + public string Error { get; private set; } + + [UsedImplicitly] + public async Task OnPost(string password, string confirmPassword) { User? user = this.Database.UserFromWebRequest(this.Request); if (user == null) return this.Redirect("~/login"); - this.WasResetRequest = !string.IsNullOrEmpty(password) && !string.IsNullOrEmpty(confirmPassword); - - if (this.WasResetRequest) + if (string.IsNullOrWhiteSpace(password)) { - if (password != confirmPassword) return this.BadRequest(); - - user.Password = HashHelper.BCryptHash(password); - user.PasswordResetRequired = false; - - await this.Database.SaveChangesAsync(); - - return this.Redirect("~/"); + this.Error = "The password field is required."; + return this.Page(); } + if (password != confirmPassword) + { + this.Error = "Passwords do not match!"; + return this.Page(); + } + + user.Password = HashHelper.BCryptHash(password); + user.PasswordResetRequired = false; + + await this.Database.SaveChangesAsync(); + + return this.Redirect("~/"); + } + + [UsedImplicitly] + public IActionResult OnGet() + { + User? user = this.Database.UserFromWebRequest(this.Request); + if (user == null) return this.Redirect("~/login"); return this.Page(); } } From d52bb6ecc469b16cc8815184b9c63740390a209c Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Mon, 6 Dec 2021 14:15:25 -0500 Subject: [PATCH 16/24] Add support for creating new users as an admin. --- .../Maintenance/Commands/CreateUserCommand.cs | 60 +++++++++++++++++++ ProjectLighthouse/ProjectLighthouse.csproj | 28 +++++---- 2 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 ProjectLighthouse/Maintenance/Commands/CreateUserCommand.cs diff --git a/ProjectLighthouse/Maintenance/Commands/CreateUserCommand.cs b/ProjectLighthouse/Maintenance/Commands/CreateUserCommand.cs new file mode 100644 index 00000000..b3db6c4a --- /dev/null +++ b/ProjectLighthouse/Maintenance/Commands/CreateUserCommand.cs @@ -0,0 +1,60 @@ +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Kettu; +using LBPUnion.ProjectLighthouse.Helpers; +using LBPUnion.ProjectLighthouse.Logging; +using Microsoft.EntityFrameworkCore; +using LBPUnion.ProjectLighthouse.Types; + +namespace LBPUnion.ProjectLighthouse.Maintenance.Commands +{ + [UsedImplicitly] + public class CreateUserCommand : ICommand + { + private readonly Database _database = new(); + + public async Task Run(string[] args) + { + string onlineId = args[0]; + string password = args[1]; + + password = HashHelper.Sha256Hash(password); + + User? user = await this._database.Users.FirstOrDefaultAsync(u => u.Username == onlineId); + if (user == null) + { + user = await this._database.CreateUser(onlineId, + HashHelper.BCryptHash(password)); + Logger.Log( + $"Created user {user.UserId} with online ID (username) {user.Username} and the specified password.", LoggerLevelLogin.Instance); + + user.PasswordResetRequired = true; + Logger.Log("This user will need to reset their password when they log in.", + LoggerLevelLogin.Instance); + + await this._database.SaveChangesAsync(); + Logger.Log("Database changes saved.", + LoggerLevelDatabase.Instance); + } + else + { + Logger.Log("A user with this username already exists.", + LoggerLevelLogin.Instance); + } + } + + public string Name() => "Create New User"; + + public string[] Aliases() => + new[] + { + "useradd", "adduser", "newuser", "createUser" + }; + + public string Arguments() => " "; + + public int RequiredArgs() => 2; + } +} \ No newline at end of file diff --git a/ProjectLighthouse/ProjectLighthouse.csproj b/ProjectLighthouse/ProjectLighthouse.csproj index ffc2f979..6240dece 100644 --- a/ProjectLighthouse/ProjectLighthouse.csproj +++ b/ProjectLighthouse/ProjectLighthouse.csproj @@ -8,34 +8,38 @@ - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + - + Always - + Always + + <_ContentIncludedByDefault Remove="Pages\Admin\Index.cshtml" /> + + - - + + From 087958155dd6c8d02964f33fecf5922aa4374792 Mon Sep 17 00:00:00 2001 From: Michael VanOverbeek Date: Mon, 6 Dec 2021 14:21:24 -0500 Subject: [PATCH 17/24] Update gitignore to ignore LBP resources folder --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 180e13fe..bb08bcee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +# LBP resources. +r/ + # rider .idea/ From 1bbff41196caffcbb88fbac8e6a766ba7e8d5118 Mon Sep 17 00:00:00 2001 From: jvyden Date: Mon, 6 Dec 2021 18:49:44 -0500 Subject: [PATCH 18/24] Fix broken player requirements (and add maintenance job) Closes #92 --- .../Controllers/PublishController.cs | 6 ++++ ...lBrokenPlayerRequirementsMaintenanceJob.cs | 33 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 ProjectLighthouse/Maintenance/MaintenanceJobs/FixAllBrokenPlayerRequirementsMaintenanceJob.cs diff --git a/ProjectLighthouse/Controllers/PublishController.cs b/ProjectLighthouse/Controllers/PublishController.cs index 0f6499dd..98f490e2 100644 --- a/ProjectLighthouse/Controllers/PublishController.cs +++ b/ProjectLighthouse/Controllers/PublishController.cs @@ -117,6 +117,12 @@ namespace LBPUnion.ProjectLighthouse.Controllers slot.GameVersion = gameToken.GameVersion; + if (slot.MinimumPlayers == 0 || slot.MaximumPlayers == 0) + { + slot.MinimumPlayers = 1; + slot.MaximumPlayers = 4; + } + this.database.Entry(oldSlot).CurrentValues.SetValues(slot); await this.database.SaveChangesAsync(); return this.Ok(oldSlot.Serialize()); diff --git a/ProjectLighthouse/Maintenance/MaintenanceJobs/FixAllBrokenPlayerRequirementsMaintenanceJob.cs b/ProjectLighthouse/Maintenance/MaintenanceJobs/FixAllBrokenPlayerRequirementsMaintenanceJob.cs new file mode 100644 index 00000000..4fae2b5e --- /dev/null +++ b/ProjectLighthouse/Maintenance/MaintenanceJobs/FixAllBrokenPlayerRequirementsMaintenanceJob.cs @@ -0,0 +1,33 @@ +using System; +using System.Threading.Tasks; +using LBPUnion.ProjectLighthouse.Types.Levels; + +namespace LBPUnion.ProjectLighthouse.Maintenance.MaintenanceJobs +{ + public class FixAllBrokenPlayerRequirementsMaintenanceJob : IMaintenanceJob + { + private readonly Database database = new(); + + public string Name() => "Fix All Broken Player Requirements"; + public string Description() => "Some LBP1 levels may report that they are designed for 0 players. This job will fix that."; + public async Task Run() + { + int count = 0; + await foreach (Slot slot in this.database.Slots) + { + if (slot.MinimumPlayers == 0 || slot.MaximumPlayers == 0) + { + slot.MinimumPlayers = 1; + slot.MaximumPlayers = 4; + + Console.WriteLine($"Fixed slotId {slot.SlotId}"); + count++; + } + } + + await this.database.SaveChangesAsync(); + + Console.WriteLine($"Fixed {count} broken player requirements."); + } + } +} \ No newline at end of file From ca4e32dd758c8e9a50d186425620d69cc893c7e0 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 7 Dec 2021 16:57:35 -0500 Subject: [PATCH 19/24] Revert "Merge branch 'main' into main" This reverts commit 817fecdc1819a963a936936c7f2cc66d162755d9, reversing changes made to 1bbff41196caffcbb88fbac8e6a766ba7e8d5118. --- .gitignore | 4 +- .../Controllers/EnterLevelController.cs | 12 +- .../Controllers/ReviewController.cs | 188 ----- .../Controllers/SlotsController.cs | 4 +- .../Controllers/UserController.cs | 10 +- ProjectLighthouse/Database.cs | 7 +- .../20211120025513_LevelReviews.Designer.cs | 752 ------------------ .../Migrations/20211120025513_LevelReviews.cs | 105 --- .../Migrations/DatabaseModelSnapshot.cs | 101 --- ProjectLighthouse/Types/DeletedBy.cs | 9 - ProjectLighthouse/Types/Levels/Slot.cs | 22 +- .../Types/Reviews/RatedReview.cs | 24 - ProjectLighthouse/Types/Reviews/Review.cs | 101 --- ProjectLighthouse/Types/User.cs | 7 +- 14 files changed, 22 insertions(+), 1324 deletions(-) delete mode 100644 ProjectLighthouse/Migrations/20211120025513_LevelReviews.Designer.cs delete mode 100644 ProjectLighthouse/Migrations/20211120025513_LevelReviews.cs delete mode 100644 ProjectLighthouse/Types/DeletedBy.cs delete mode 100644 ProjectLighthouse/Types/Reviews/RatedReview.cs delete mode 100644 ProjectLighthouse/Types/Reviews/Review.cs diff --git a/.gitignore b/.gitignore index 4513c4e7..bb08bcee 100644 --- a/.gitignore +++ b/.gitignore @@ -15,11 +15,9 @@ riderModule.iml /.idea/.idea.ProjectLighthouse/.idea/dataSources.local.xml *.sln.DotSettings.user /ProjectLighthouse/r/* -logs +/ProjectLighthouse/logs/* /ProjectLighthouse/ProjectLighthouse.csproj.user .vs/ -.vscode/ -.editorconfig lighthouse.config.json gitBranch.txt gitVersion.txt diff --git a/ProjectLighthouse/Controllers/EnterLevelController.cs b/ProjectLighthouse/Controllers/EnterLevelController.cs index 3cd45500..ba24c642 100644 --- a/ProjectLighthouse/Controllers/EnterLevelController.cs +++ b/ProjectLighthouse/Controllers/EnterLevelController.cs @@ -62,8 +62,11 @@ namespace LBPUnion.ProjectLighthouse.Controllers { v = await visited.FirstOrDefaultAsync(); } - - if (v == null) return this.NotFound(); + + if (v == null) + { + return this.NotFound(); + } switch (gameVersion) { @@ -116,7 +119,10 @@ namespace LBPUnion.ProjectLighthouse.Controllers v = await visited.FirstOrDefaultAsync(); } - if (v == null) return this.NotFound(); + if (v == null) + { + return this.NotFound(); + } slot.PlaysLBP1++; v.PlaysLBP1++; diff --git a/ProjectLighthouse/Controllers/ReviewController.cs b/ProjectLighthouse/Controllers/ReviewController.cs index 35948771..fa501d3f 100644 --- a/ProjectLighthouse/Controllers/ReviewController.cs +++ b/ProjectLighthouse/Controllers/ReviewController.cs @@ -1,15 +1,8 @@ #nullable enable using System; -using System.IO; -using System.Xml.Serialization; -using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; -using LBPUnion.ProjectLighthouse.Helpers; -using LBPUnion.ProjectLighthouse.Serialization; using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types.Levels; -using LBPUnion.ProjectLighthouse.Types.Reviews; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -81,186 +74,5 @@ namespace LBPUnion.ProjectLighthouse.Controllers return this.Ok(); } - [HttpPost("postReview/user/{slotId:int}")] - public async Task PostReview(int slotId) - { - User? user = await this.database.UserFromGameRequest(this.Request); - if (user == null) return this.StatusCode(403, ""); - - Review? review = await this.database.Reviews.FirstOrDefaultAsync(r => r.SlotId == slotId && r.ReviewerId == user.UserId); - Review? newReview = await this.GetReviewFromBody(); - if (newReview == null) return this.BadRequest(); - if (review == null) - { - review = new(); - review.SlotId = slotId; - review.ReviewerId = user.UserId; - review.DeletedBy = "none"; - - } - review.LabelCollection = newReview.LabelCollection; - review.Text = newReview.Text; - review.Deleted = false; - review.Timestamp = TimeHelper.UnixTimeMilliseconds(); - - // sometimes the game posts a review without also calling dpadrate/user/etc (why??) - RatedLevel? ratedLevel = await this.database.RatedLevels.FirstOrDefaultAsync(r => r.SlotId == slotId && r.UserId == user.UserId); - if (ratedLevel == null) - { - ratedLevel = new RatedLevel(); - ratedLevel.SlotId = slotId; - ratedLevel.UserId = user.UserId; - ratedLevel.RatingLBP1 = 0; - this.database.RatedLevels.Add(ratedLevel); - } - - ratedLevel.Rating = newReview.Thumb; - - - await this.database.SaveChangesAsync(); - - return this.Ok(); - } - - [HttpGet("reviewsFor/user/{slotId:int}")] - public async Task ReviewsFor(int slotId, [FromQuery] int pageStart = 1, [FromQuery] int pageSize = 10) - { - (User, GameToken)? userAndToken = await this.database.UserAndGameTokenFromRequest(this.Request); - - if (userAndToken == null) return this.StatusCode(403, ""); - - // ReSharper disable once PossibleInvalidOperationException - User user = userAndToken.Value.Item1; - GameToken gameToken = userAndToken.Value.Item2; - - GameVersion gameVersion = gameToken.GameVersion; - - Random rand = new(); - - IEnumerable reviews = this.database.Reviews.Where(r => r.SlotId == slotId && r.Slot.GameVersion <= gameVersion) - .Include(r => r.Reviewer) - .Include(r => r.Slot) - .AsEnumerable() // performance? Needed for next line (ThumbsUp is not in DB) - .OrderByDescending(r => r.ThumbsUp) - .ThenByDescending(_ => rand.Next()) - .Skip(pageStart - 1) - .Take(pageSize); - - string inner = Enumerable.Aggregate(reviews, string.Empty, (current, review) => - { - RatedLevel? ratedLevel = this.database.RatedLevels.FirstOrDefault(r => r.SlotId == slotId && r.UserId == review.ReviewerId); - RatedReview? ratedReview = this.database.RatedReviews.FirstOrDefault(r => r.ReviewId == review.ReviewId && r.UserId == user.UserId); - - return current + review.Serialize(ratedLevel, ratedReview); - }); - - string response = LbpSerializer.TaggedStringElement("reviews", inner, new Dictionary - { - { - "hint_start", pageStart + pageSize - }, - { - "hint", pageStart // not sure - }, - }); - return this.Ok(response); - } - - [HttpGet("reviewsBy/{username}")] - public async Task ReviewsBy(string username, [FromQuery] int pageStart = 1, [FromQuery] int pageSize = 10) - { - (User, GameToken)? userAndToken = await this.database.UserAndGameTokenFromRequest(this.Request); - - if (userAndToken == null) return this.StatusCode(403, ""); - - // ReSharper disable once PossibleInvalidOperationException - User user = userAndToken.Value.Item1; - GameToken gameToken = userAndToken.Value.Item2; - - GameVersion gameVersion = gameToken.GameVersion; - - IEnumerable reviews = this.database.Reviews.Where(r => r.Reviewer.Username == username && r.Slot.GameVersion <= gameVersion) - .Include(r => r.Reviewer) - .Include(r => r.Slot) - .OrderByDescending(r => r.Timestamp) - .Skip(pageStart - 1) - .Take(pageSize); - - string inner = Enumerable.Aggregate(reviews, string.Empty, (current, review) => - { - RatedLevel? ratedLevel = this.database.RatedLevels.FirstOrDefault(r => r.SlotId == review.SlotId && r.UserId == user.UserId); - RatedReview? ratedReview = this.database.RatedReviews.FirstOrDefault(r => r.ReviewId == review.ReviewId && r.UserId == user.UserId); - return current + review.Serialize(ratedLevel, ratedReview); - }); - - string response = LbpSerializer.TaggedStringElement("reviews", inner, new Dictionary - { - { - "hint_start", pageStart - }, - { - "hint", reviews.Last().Timestamp // Seems to be the timestamp of oldest - }, - }); - - return this.Ok(response); - } - - [HttpPost("rateReview/user/{slotId:int}/{username}")] - public async Task RateReview(int slotId, string username, [FromQuery] int rating = 0) - { - User? user = await this.database.UserFromGameRequest(this.Request); - if (user == null) return this.StatusCode(403, ""); - - User? reviewer = await this.database.Users.FirstOrDefaultAsync(u => u.Username == username); - if (reviewer == null) return this.StatusCode(400, ""); - - Review? review = await this.database.Reviews.FirstOrDefaultAsync(r => r.SlotId == slotId && r.ReviewerId == reviewer.UserId); - if (review == null) return this.StatusCode(400, ""); - - RatedReview? ratedReview = await this.database.RatedReviews.FirstOrDefaultAsync(r => r.ReviewId == review.ReviewId && r.UserId == user.UserId); - if (ratedReview == null) - { - ratedReview = new RatedReview(); - ratedReview.ReviewId = review.ReviewId; - ratedReview.UserId = user.UserId; - ratedReview.Thumb = 0; - this.database.RatedReviews.Add(ratedReview); - } - - ratedReview.Thumb = Math.Max(Math.Min(1, rating), -1); - - await this.database.SaveChangesAsync(); - - return this.Ok(); - } - - [HttpPost("deleteReview/user/{slotId:int}/{username}")] - public async Task DeleteReview(int slotId, string username) - { - User? reviewer = await this.database.Users.FirstOrDefaultAsync(u => u.Username == username); - if (reviewer == null) return this.StatusCode(403, ""); - - Review? review = await this.database.Reviews.FirstOrDefaultAsync(r => r.SlotId == slotId && r.ReviewerId == reviewer.UserId); - if (review == null) return this.StatusCode(403, ""); - - review.Deleted = true; - review.DeletedBy = DeletedBy.LevelAuthor; - - await this.database.SaveChangesAsync(); - return this.Ok(); - } - - public async Task GetReviewFromBody() - { - this.Request.Body.Position = 0; - string bodyString = await new StreamReader(this.Request.Body).ReadToEndAsync(); - - XmlSerializer serializer = new(typeof(Review)); - Review? review = (Review?)serializer.Deserialize(new StringReader(bodyString)); - - return review; - } - } } \ No newline at end of file diff --git a/ProjectLighthouse/Controllers/SlotsController.cs b/ProjectLighthouse/Controllers/SlotsController.cs index 6fb7f356..01ffe886 100644 --- a/ProjectLighthouse/Controllers/SlotsController.cs +++ b/ProjectLighthouse/Controllers/SlotsController.cs @@ -8,7 +8,6 @@ using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Settings; -using LBPUnion.ProjectLighthouse.Types.Reviews; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; @@ -87,8 +86,7 @@ namespace LBPUnion.ProjectLighthouse.Controllers RatedLevel? ratedLevel = await this.database.RatedLevels.FirstOrDefaultAsync(r => r.SlotId == id && r.UserId == user.UserId); VisitedLevel? visitedLevel = await this.database.VisitedLevels.FirstOrDefaultAsync(r => r.SlotId == id && r.UserId == user.UserId); - Review? yourReview = await this.database.Reviews.FirstOrDefaultAsync(r => r.SlotId == id && r.ReviewerId == user.UserId); - return this.Ok(slot.Serialize(ratedLevel, visitedLevel, yourReview)); + return this.Ok(slot.Serialize(ratedLevel, visitedLevel)); } [HttpGet("slots/lbp2cool")] diff --git a/ProjectLighthouse/Controllers/UserController.cs b/ProjectLighthouse/Controllers/UserController.cs index 126632b9..71fb7fd4 100644 --- a/ProjectLighthouse/Controllers/UserController.cs +++ b/ProjectLighthouse/Controllers/UserController.cs @@ -29,8 +29,7 @@ namespace LBPUnion.ProjectLighthouse.Controllers public async Task GetSerializedUser(string username, GameVersion gameVersion = GameVersion.LittleBigPlanet1) { User? user = await this.database.Users.Include(u => u.Location).FirstOrDefaultAsync(u => u.Username == username); - if (user == null) return ""; - return user.Serialize(gameVersion); + return user?.Serialize(gameVersion); } [HttpGet("user/{username}")] @@ -40,7 +39,7 @@ namespace LBPUnion.ProjectLighthouse.Controllers if (token == null) return this.StatusCode(403, ""); string? user = await this.GetSerializedUser(username, token.GameVersion); - if (string.IsNullOrEmpty(user)) return this.NotFound(); + if (user == null) return this.NotFound(); return this.Ok(user); } @@ -52,10 +51,9 @@ namespace LBPUnion.ProjectLighthouse.Controllers if (token == null) return this.StatusCode(403, ""); List serializedUsers = new(); - foreach (string username in u) + foreach (string userId in u) { - string? serializedUser = await this.GetSerializedUser(username, token.GameVersion); - if (serializedUser != "") serializedUsers.Add(serializedUser); + serializedUsers.Add(await this.GetSerializedUser(userId, token.GameVersion)); } string serialized = serializedUsers.Aggregate(string.Empty, (current, user) => user == null ? current : current + user); diff --git a/ProjectLighthouse/Database.cs b/ProjectLighthouse/Database.cs index 8b904eda..3a5366cc 100644 --- a/ProjectLighthouse/Database.cs +++ b/ProjectLighthouse/Database.cs @@ -8,7 +8,6 @@ using LBPUnion.ProjectLighthouse.Types; using LBPUnion.ProjectLighthouse.Types.Levels; using LBPUnion.ProjectLighthouse.Types.Profiles; using LBPUnion.ProjectLighthouse.Types.Settings; -using LBPUnion.ProjectLighthouse.Types.Reviews; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; @@ -31,8 +30,6 @@ namespace LBPUnion.ProjectLighthouse public DbSet LastContacts { get; set; } public DbSet VisitedLevels { get; set; } public DbSet RatedLevels { get; set; } - public DbSet Reviews { get; set; } - public DbSet RatedReviews { get; set; } public DbSet AuthenticationAttempts { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder options) @@ -63,7 +60,7 @@ namespace LBPUnion.ProjectLighthouse return user; } -#nullable enable + #nullable enable public async Task AuthenticateUser(LoginData loginData, string userLocation, string titleId = "") { // TODO: don't use psn name to authenticate @@ -255,6 +252,6 @@ namespace LBPUnion.ProjectLighthouse public async Task PhotoFromSubject(PhotoSubject subject) => await this.Photos.FirstOrDefaultAsync(p => p.PhotoSubjectIds.Contains(subject.PhotoSubjectId.ToString())); -#nullable disable + #nullable disable } } \ No newline at end of file diff --git a/ProjectLighthouse/Migrations/20211120025513_LevelReviews.Designer.cs b/ProjectLighthouse/Migrations/20211120025513_LevelReviews.Designer.cs deleted file mode 100644 index 64eaac27..00000000 --- a/ProjectLighthouse/Migrations/20211120025513_LevelReviews.Designer.cs +++ /dev/null @@ -1,752 +0,0 @@ -// -using LBPUnion.ProjectLighthouse; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; - -#nullable disable - -namespace ProjectLighthouse.Migrations -{ - [DbContext(typeof(Database))] - [Migration("20211120025513_LevelReviews")] - partial class LevelReviews - { - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "6.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 64); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => - { - b.Property("HeartedProfileId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("HeartedUserId") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("HeartedProfileId"); - - b.HasIndex("HeartedUserId"); - - b.HasIndex("UserId"); - - b.ToTable("HeartedProfiles"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => - { - b.Property("HeartedLevelId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("HeartedLevelId"); - - b.HasIndex("SlotId"); - - b.HasIndex("UserId"); - - b.ToTable("HeartedLevels"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => - { - b.Property("QueuedLevelId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("QueuedLevelId"); - - b.HasIndex("SlotId"); - - b.HasIndex("UserId"); - - b.ToTable("QueuedLevels"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => - { - b.Property("RatedLevelId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Rating") - .HasColumnType("int"); - - b.Property("RatingLBP1") - .HasColumnType("double"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("RatedLevelId"); - - b.HasIndex("SlotId"); - - b.HasIndex("UserId"); - - b.ToTable("RatedLevels"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => - { - b.Property("SlotId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("AuthorLabels") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("BackgroundHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("CreatorId") - .HasColumnType("int"); - - b.Property("Description") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("FirstUploaded") - .HasColumnType("bigint"); - - b.Property("GameVersion") - .HasColumnType("int"); - - b.Property("IconHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("InitiallyLocked") - .HasColumnType("tinyint(1)"); - - b.Property("LastUpdated") - .HasColumnType("bigint"); - - b.Property("Lbp1Only") - .HasColumnType("tinyint(1)"); - - b.Property("LevelType") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("LocationId") - .HasColumnType("int"); - - b.Property("MaximumPlayers") - .HasColumnType("int"); - - b.Property("MinimumPlayers") - .HasColumnType("int"); - - b.Property("MoveRequired") - .HasColumnType("tinyint(1)"); - - b.Property("Name") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("PlaysLBP1") - .HasColumnType("int"); - - b.Property("PlaysLBP1Complete") - .HasColumnType("int"); - - b.Property("PlaysLBP1Unique") - .HasColumnType("int"); - - b.Property("PlaysLBP2") - .HasColumnType("int"); - - b.Property("PlaysLBP2Complete") - .HasColumnType("int"); - - b.Property("PlaysLBP2Unique") - .HasColumnType("int"); - - b.Property("PlaysLBP3") - .HasColumnType("int"); - - b.Property("PlaysLBP3Complete") - .HasColumnType("int"); - - b.Property("PlaysLBP3Unique") - .HasColumnType("int"); - - b.Property("PlaysLBPVita") - .HasColumnType("int"); - - b.Property("PlaysLBPVitaComplete") - .HasColumnType("int"); - - b.Property("PlaysLBPVitaUnique") - .HasColumnType("int"); - - b.Property("ResourceCollection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("RootLevel") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Shareable") - .HasColumnType("int"); - - b.Property("SubLevel") - .HasColumnType("tinyint(1)"); - - b.Property("TeamPick") - .HasColumnType("tinyint(1)"); - - b.HasKey("SlotId"); - - b.HasIndex("CreatorId"); - - b.HasIndex("LocationId"); - - b.ToTable("Slots"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => - { - b.Property("VisitedLevelId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("PlaysLBP1") - .HasColumnType("int"); - - b.Property("PlaysLBP2") - .HasColumnType("int"); - - b.Property("PlaysLBP3") - .HasColumnType("int"); - - b.Property("PlaysLBPVita") - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("VisitedLevelId"); - - b.HasIndex("SlotId"); - - b.HasIndex("UserId"); - - b.ToTable("VisitedLevels"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => - { - b.Property("PhotoId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("CreatorId") - .HasColumnType("int"); - - b.Property("LargeHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("MediumHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("PhotoSubjectCollection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("PlanHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("SmallHash") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Timestamp") - .HasColumnType("bigint"); - - b.HasKey("PhotoId"); - - b.HasIndex("CreatorId"); - - b.ToTable("Photos"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => - { - b.Property("PhotoSubjectId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Bounds") - .HasColumnType("longtext"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("PhotoSubjectId"); - - b.HasIndex("UserId"); - - b.ToTable("PhotoSubjects"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => - { - b.Property("CommentId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Message") - .HasColumnType("longtext"); - - b.Property("PosterUserId") - .HasColumnType("int"); - - b.Property("TargetUserId") - .HasColumnType("int"); - - b.Property("ThumbsDown") - .HasColumnType("int"); - - b.Property("ThumbsUp") - .HasColumnType("int"); - - b.Property("Timestamp") - .HasColumnType("bigint"); - - b.HasKey("CommentId"); - - b.HasIndex("PosterUserId"); - - b.HasIndex("TargetUserId"); - - b.ToTable("Comments"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.LastMatch", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Timestamp") - .HasColumnType("bigint"); - - b.HasKey("UserId"); - - b.ToTable("LastMatches"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Location", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("X") - .HasColumnType("int"); - - b.Property("Y") - .HasColumnType("int"); - - b.HasKey("Id"); - - b.ToTable("Locations"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.RatedReview", b => - { - b.Property("RatedReviewId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ReviewId") - .HasColumnType("int"); - - b.Property("Thumb") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("RatedReviewId"); - - b.HasIndex("ReviewId"); - - b.HasIndex("UserId"); - - b.ToTable("RatedReviews"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.Review", b => - { - b.Property("ReviewId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Deleted") - .HasColumnType("tinyint(1)"); - - b.Property("DeletedBy") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("LabelCollection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ReviewerId") - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("Text") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Timestamp") - .HasColumnType("bigint"); - - b.HasKey("ReviewId"); - - b.HasIndex("ReviewerId"); - - b.HasIndex("SlotId"); - - b.ToTable("Reviews"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => - { - b.Property("ScoreId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("PlayerIdCollection") - .HasColumnType("longtext"); - - b.Property("Points") - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("Type") - .HasColumnType("int"); - - b.HasKey("ScoreId"); - - b.HasIndex("SlotId"); - - b.ToTable("Scores"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Token", b => - { - b.Property("TokenId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("GameVersion") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.Property("UserLocation") - .HasColumnType("longtext"); - - b.Property("UserToken") - .HasColumnType("longtext"); - - b.HasKey("TokenId"); - - b.ToTable("Tokens"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => - { - b.Property("UserId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Biography") - .HasColumnType("longtext"); - - b.Property("Game") - .HasColumnType("int"); - - b.Property("IconHash") - .HasColumnType("longtext"); - - b.Property("LocationId") - .HasColumnType("int"); - - b.Property("Pins") - .HasColumnType("longtext"); - - b.Property("PlanetHash") - .HasColumnType("longtext"); - - b.Property("Username") - .HasColumnType("longtext"); - - b.HasKey("UserId"); - - b.HasIndex("LocationId"); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.HeartedProfile", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "HeartedUser") - .WithMany() - .HasForeignKey("HeartedUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("HeartedUser"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.HeartedLevel", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.QueuedLevel", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.RatedLevel", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.Slot", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") - .WithMany() - .HasForeignKey("CreatorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") - .WithMany() - .HasForeignKey("LocationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Creator"); - - b.Navigation("Location"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Levels.VisitedLevel", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Photo", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Creator") - .WithMany() - .HasForeignKey("CreatorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.PhotoSubject", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Profiles.Comment", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Poster") - .WithMany() - .HasForeignKey("PosterUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Target") - .WithMany() - .HasForeignKey("TargetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Poster"); - - b.Navigation("Target"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.RatedReview", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Reviews.Review", "Review") - .WithMany() - .HasForeignKey("ReviewId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Review"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.Review", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Reviewer") - .WithMany() - .HasForeignKey("ReviewerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Reviewer"); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Slot"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.User", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Profiles.Location", "Location") - .WithMany() - .HasForeignKey("LocationId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Location"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/ProjectLighthouse/Migrations/20211120025513_LevelReviews.cs b/ProjectLighthouse/Migrations/20211120025513_LevelReviews.cs deleted file mode 100644 index 07d2e4c5..00000000 --- a/ProjectLighthouse/Migrations/20211120025513_LevelReviews.cs +++ /dev/null @@ -1,105 +0,0 @@ -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; - -#nullable disable - -namespace ProjectLighthouse.Migrations -{ - public partial class LevelReviews : Migration - { - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Reviews", - columns: table => new - { - ReviewId = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - ReviewerId = table.Column(type: "int", nullable: false), - SlotId = table.Column(type: "int", nullable: false), - Timestamp = table.Column(type: "bigint", nullable: false), - LabelCollection = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Deleted = table.Column(type: "tinyint(1)", nullable: false), - DeletedBy = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4"), - Text = table.Column(type: "longtext", nullable: false) - .Annotation("MySql:CharSet", "utf8mb4") - }, - constraints: table => - { - table.PrimaryKey("PK_Reviews", x => x.ReviewId); - table.ForeignKey( - name: "FK_Reviews_Slots_SlotId", - column: x => x.SlotId, - principalTable: "Slots", - principalColumn: "SlotId", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Reviews_Users_ReviewerId", - column: x => x.ReviewerId, - principalTable: "Users", - principalColumn: "UserId", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateTable( - name: "RatedReviews", - columns: table => new - { - RatedReviewId = table.Column(type: "int", nullable: false) - .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), - UserId = table.Column(type: "int", nullable: false), - ReviewId = table.Column(type: "int", nullable: false), - Thumb = table.Column(type: "int", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_RatedReviews", x => x.RatedReviewId); - table.ForeignKey( - name: "FK_RatedReviews_Reviews_ReviewId", - column: x => x.ReviewId, - principalTable: "Reviews", - principalColumn: "ReviewId", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_RatedReviews_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "UserId", - onDelete: ReferentialAction.Cascade); - }) - .Annotation("MySql:CharSet", "utf8mb4"); - - migrationBuilder.CreateIndex( - name: "IX_RatedReviews_ReviewId", - table: "RatedReviews", - column: "ReviewId"); - - migrationBuilder.CreateIndex( - name: "IX_RatedReviews_UserId", - table: "RatedReviews", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Reviews_ReviewerId", - table: "Reviews", - column: "ReviewerId"); - - migrationBuilder.CreateIndex( - name: "IX_Reviews_SlotId", - table: "Reviews", - column: "SlotId"); - } - - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "RatedReviews"); - - migrationBuilder.DropTable( - name: "Reviews"); - } - } -} diff --git a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs index df97ee90..afdbbcbb 100644 --- a/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs +++ b/ProjectLighthouse/Migrations/DatabaseModelSnapshot.cs @@ -439,69 +439,6 @@ namespace ProjectLighthouse.Migrations b.ToTable("Locations"); }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.RatedReview", b => - { - b.Property("RatedReviewId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("ReviewId") - .HasColumnType("int"); - - b.Property("Thumb") - .HasColumnType("int"); - - b.Property("UserId") - .HasColumnType("int"); - - b.HasKey("RatedReviewId"); - - b.HasIndex("ReviewId"); - - b.HasIndex("UserId"); - - b.ToTable("RatedReviews"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.Review", b => - { - b.Property("ReviewId") - .ValueGeneratedOnAdd() - .HasColumnType("int"); - - b.Property("Deleted") - .HasColumnType("tinyint(1)"); - - b.Property("DeletedBy") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("LabelCollection") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("ReviewerId") - .HasColumnType("int"); - - b.Property("SlotId") - .HasColumnType("int"); - - b.Property("Text") - .IsRequired() - .HasColumnType("longtext"); - - b.Property("Timestamp") - .HasColumnType("bigint"); - - b.HasKey("ReviewId"); - - b.HasIndex("ReviewerId"); - - b.HasIndex("SlotId"); - - b.ToTable("Reviews"); - }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => { b.Property("ScoreId") @@ -762,44 +699,6 @@ namespace ProjectLighthouse.Migrations b.Navigation("Target"); }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.RatedReview", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.Reviews.Review", "Review") - .WithMany() - .HasForeignKey("ReviewId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Review"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Reviews.Review", b => - { - b.HasOne("LBPUnion.ProjectLighthouse.Types.User", "Reviewer") - .WithMany() - .HasForeignKey("ReviewerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") - .WithMany() - .HasForeignKey("SlotId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Reviewer"); - - b.Navigation("Slot"); - }); - modelBuilder.Entity("LBPUnion.ProjectLighthouse.Types.Score", b => { b.HasOne("LBPUnion.ProjectLighthouse.Types.Levels.Slot", "Slot") diff --git a/ProjectLighthouse/Types/DeletedBy.cs b/ProjectLighthouse/Types/DeletedBy.cs deleted file mode 100644 index 02d61ec0..00000000 --- a/ProjectLighthouse/Types/DeletedBy.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace LBPUnion.ProjectLighthouse.Types -{ - public static class DeletedBy - { - public static string Moderator { get => "moderator"; } - public static string LevelAuthor { get => "level_author"; } - // TODO: deletion types for comments (profile etc) - } -} \ No newline at end of file diff --git a/ProjectLighthouse/Types/Levels/Slot.cs b/ProjectLighthouse/Types/Levels/Slot.cs index 42353c32..ff0c580e 100644 --- a/ProjectLighthouse/Types/Levels/Slot.cs +++ b/ProjectLighthouse/Types/Levels/Slot.cs @@ -6,7 +6,6 @@ using System.Xml.Serialization; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Serialization; using LBPUnion.ProjectLighthouse.Types.Profiles; -using LBPUnion.ProjectLighthouse.Types.Reviews; namespace LBPUnion.ProjectLighthouse.Types.Levels { @@ -195,23 +194,13 @@ namespace LBPUnion.ProjectLighthouse.Types.Levels [XmlElement("leveltype")] public string LevelType { get; set; } = ""; - [NotMapped] - [XmlElement("reviewCount")] - public int ReviewCount { - get { - using Database database = new(); - - return database.Reviews.Count(r => r.SlotId == this.SlotId); - } - } - public string SerializeResources() { return this.Resources.Aggregate("", (current, resource) => current + LbpSerializer.StringElement("resource", resource)) + LbpSerializer.StringElement("sizeOfResources", this.Resources.Sum(FileHelper.ResourceSize)); } - public string Serialize(RatedLevel? yourRatingStats = null, VisitedLevel? yourVisitedStats = null, Review? yourReview = null) + public string Serialize(RatedLevel? yourRatingStats = null, VisitedLevel? yourVisitedStats = null) { string slotData = LbpSerializer.StringElement("name", this.Name) + @@ -259,12 +248,9 @@ namespace LBPUnion.ProjectLighthouse.Types.Levels LbpSerializer.StringElement("yourLBP1PlayCount", yourVisitedStats?.PlaysLBP1) + LbpSerializer.StringElement("yourLBP2PlayCount", yourVisitedStats?.PlaysLBP2) + LbpSerializer.StringElement("yourLBP3PlayCount", yourVisitedStats?.PlaysLBP3) + - LbpSerializer.StringElement("yourLBPVitaPlayCount", yourVisitedStats?.PlaysLBPVita) + // i doubt this is the right name but we'll go with it - yourReview?.Serialize("yourReview") + - LbpSerializer.StringElement("reviewsEnabled", true) + - LbpSerializer.StringElement("commentsEnabled", false) + - LbpSerializer.StringElement("reviewCount", this.ReviewCount); - + LbpSerializer.StringElement + ("yourLBPVitaPlayCount", yourVisitedStats?.PlaysLBPVita); // i doubt this is the right name but we'll go with it + return LbpSerializer.TaggedStringElement("slot", slotData, "type", "user"); } } diff --git a/ProjectLighthouse/Types/Reviews/RatedReview.cs b/ProjectLighthouse/Types/Reviews/RatedReview.cs deleted file mode 100644 index 1ba9720f..00000000 --- a/ProjectLighthouse/Types/Reviews/RatedReview.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace LBPUnion.ProjectLighthouse.Types.Reviews -{ - public class RatedReview - { - // ReSharper disable once UnusedMember.Global - [Key] - public int RatedReviewId { get; set; } - - public int UserId { get; set; } - - [ForeignKey(nameof(UserId))] - public User User { get; set; } - - public int ReviewId { get; set; } - - [ForeignKey(nameof(ReviewId))] - public Review Review { get; set; } - - public int Thumb { get; set; } - } -} \ No newline at end of file diff --git a/ProjectLighthouse/Types/Reviews/Review.cs b/ProjectLighthouse/Types/Reviews/Review.cs deleted file mode 100644 index a2ee79d0..00000000 --- a/ProjectLighthouse/Types/Reviews/Review.cs +++ /dev/null @@ -1,101 +0,0 @@ -#nullable enable -using System; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using LBPUnion.ProjectLighthouse.Types.Levels; -using LBPUnion.ProjectLighthouse.Serialization; -using System.Xml.Serialization; - -namespace LBPUnion.ProjectLighthouse.Types.Reviews -{ - [XmlRoot("review")] - [XmlType("review")] - public class Review - { - // ReSharper disable once UnusedMember.Global - [Key] - public int ReviewId { get; set; } - - [XmlIgnore] - public int ReviewerId { get; set; } - - [ForeignKey(nameof(ReviewerId))] - public User Reviewer { get; set; } - - [XmlElement("slot_id")] - public int SlotId { get; set; } - - [ForeignKey(nameof(SlotId))] - public Slot Slot { get; set; } - - [XmlElement("timestamp")] - public long Timestamp { get; set; } - - [XmlElement("labels")] - public string LabelCollection { get; set; } - - [NotMapped] - [XmlIgnore] - public string[] Labels { - get => this.LabelCollection.Split(","); - set => this.LabelCollection = string.Join(',', value); - } - - [XmlElement("deleted")] - public Boolean Deleted { get; set; } - - [XmlElement("deleted_by")] - public string DeletedBy { get; set; } // enum ? Needs testing e.g. Moderated/Author/Level Author? etc. - - [XmlElement("text")] - public string Text { get; set; } - - [NotMapped] - [XmlElement("thumb")] - public int Thumb { get; set; } // (unused) -- temp value for getting thumb from review upload body for updating level rating - - [NotMapped] - [XmlElement("thumbsup")] - public int ThumbsUp { - get { - using Database database = new(); - - return database.RatedReviews.Count(r => r.ReviewId == this.ReviewId && r.Thumb == 1); - } - } - [NotMapped] - [XmlElement("thumbsdown")] - public int ThumbsDown { - get { - using Database database = new(); - - return database.RatedReviews.Count(r => r.ReviewId == this.ReviewId && r.Thumb == -1); - } - } - - public string Serialize(RatedLevel? yourLevelRating = null, RatedReview? yourRatingStats = null) { - return this.Serialize("review", yourLevelRating, yourRatingStats); - } - - public string Serialize(string elementOverride, RatedLevel? yourLevelRating = null, RatedReview? yourRatingStats = null) - { - - string reviewData = LbpSerializer.TaggedStringElement("slot_id", this.SlotId, "type", this.Slot.Type) + - LbpSerializer.StringElement("reviewer", this.Reviewer.Username) + - LbpSerializer.StringElement("thumb", yourLevelRating?.Rating) + - LbpSerializer.StringElement("timestamp", this.Timestamp) + - LbpSerializer.StringElement("labels", this.LabelCollection) + - LbpSerializer.StringElement("deleted", this.Deleted) + - LbpSerializer.StringElement("deleted_by", this.DeletedBy) + - LbpSerializer.StringElement("text", this.Text) + - LbpSerializer.StringElement("thumbsup", this.ThumbsUp) + - LbpSerializer.StringElement("thumbsdown", this.ThumbsDown) + - LbpSerializer.StringElement("yourthumb", yourRatingStats?.Thumb == null ? 0 : yourRatingStats?.Thumb); - - return LbpSerializer.TaggedStringElement(elementOverride, reviewData, "id", this.SlotId + "." + this.Reviewer.Username); - } - } - - -} \ No newline at end of file diff --git a/ProjectLighthouse/Types/User.cs b/ProjectLighthouse/Types/User.cs index 44424bbe..6f24a385 100644 --- a/ProjectLighthouse/Types/User.cs +++ b/ProjectLighthouse/Types/User.cs @@ -26,12 +26,7 @@ namespace LBPUnion.ProjectLighthouse.Types public string Biography { get; set; } [NotMapped] - public int Reviews { - get { - using Database database = new(); - return database.Reviews.Count(r => r.ReviewerId == this.UserId); - } - } + public int Reviews => 0; [NotMapped] public int Comments { From 46f85a46de1d1c0ef803545f64e0daa77b6d8538 Mon Sep 17 00:00:00 2001 From: jvyden Date: Tue, 7 Dec 2021 16:59:09 -0500 Subject: [PATCH 20/24] Revert "Add (base) support for reviews" From 90f70238d10a613302df96e709f92641f9721506 Mon Sep 17 00:00:00 2001 From: jvyden Date: Fri, 10 Dec 2021 14:31:46 -0500 Subject: [PATCH 21/24] Show comments section on userpage even if there are no comments --- ProjectLighthouse/Pages/UserPage.cshtml | 39 +++++++++++++------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/ProjectLighthouse/Pages/UserPage.cshtml b/ProjectLighthouse/Pages/UserPage.cshtml index 68317395..128a7883 100644 --- a/ProjectLighthouse/Pages/UserPage.cshtml +++ b/ProjectLighthouse/Pages/UserPage.cshtml @@ -81,21 +81,24 @@
} -@if (Model.ProfileUser.Comments > 0) -{ -
-

Comments

- @foreach (Comment comment in Model.Comments!) - { - DateTimeOffset timestamp = DateTimeOffset.FromUnixTimeSeconds(comment.Timestamp / 1000); -
- @comment.Poster.Username: - @comment.Message -

- @timestamp.ToString("MM/dd/yyyy @ h:mm tt") UTC -

-
-
- } -
-} \ No newline at end of file + +
+

Comments

+ @if (Model.ProfileUser.Comments == 0) + { +

There are no comments.

+ } + + @foreach (Comment comment in Model.Comments!) + { + DateTimeOffset timestamp = DateTimeOffset.FromUnixTimeSeconds(comment.Timestamp / 1000); +
+ @comment.Poster.Username: + @comment.Message +

+ @timestamp.ToString("MM/dd/yyyy @ h:mm tt") UTC +

+
+
+ } +
\ No newline at end of file From e09a9fa8323dec8cd38e7ca19df832a28bdacd90 Mon Sep 17 00:00:00 2001 From: jvyden Date: Fri, 10 Dec 2021 14:36:03 -0500 Subject: [PATCH 22/24] Add google analytics to config --- ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml | 13 +++++++++++++ ProjectLighthouse/Types/Settings/ServerSettings.cs | 6 +++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml index 4632137e..2295cea3 100644 --- a/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml +++ b/ProjectLighthouse/Pages/Layouts/BaseLayout.cshtml @@ -51,6 +51,19 @@ + + @if (ServerSettings.Instance.GoogleAnalyticsEnabled) + { + + + + }
diff --git a/ProjectLighthouse/Types/Settings/ServerSettings.cs b/ProjectLighthouse/Types/Settings/ServerSettings.cs index eabf41c4..e4caf307 100644 --- a/ProjectLighthouse/Types/Settings/ServerSettings.cs +++ b/ProjectLighthouse/Types/Settings/ServerSettings.cs @@ -63,7 +63,7 @@ namespace LBPUnion.ProjectLighthouse.Types.Settings } } - public const int CurrentConfigVersion = 10; // MUST BE INCREMENTED FOR EVERY CONFIG CHANGE! + public const int CurrentConfigVersion = 11; // MUST BE INCREMENTED FOR EVERY CONFIG CHANGE! #region Meta @@ -102,5 +102,9 @@ namespace LBPUnion.ProjectLighthouse.Types.Settings public int EntitledSlots { get; set; } = 50; public int ListsQuota { get; set; } = 50; + + public bool GoogleAnalyticsEnabled { get; set; } = false; + + public string GoogleAnalyticsId { get; set; } = ""; } } \ No newline at end of file From 9c9b41ae046b2731c44859eeed32550a0609613e Mon Sep 17 00:00:00 2001 From: jvyden Date: Fri, 10 Dec 2021 18:24:33 -0500 Subject: [PATCH 23/24] Add command-line option to wait for debugger on startup --- ProjectLighthouse/Program.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ProjectLighthouse/Program.cs b/ProjectLighthouse/Program.cs index 1ef82df1..9f3a035f 100644 --- a/ProjectLighthouse/Program.cs +++ b/ProjectLighthouse/Program.cs @@ -1,5 +1,6 @@ using System; using System.Diagnostics; +using System.Threading; using Kettu; using LBPUnion.ProjectLighthouse.Helpers; using LBPUnion.ProjectLighthouse.Logging; @@ -17,6 +18,16 @@ namespace LBPUnion.ProjectLighthouse { public static void Main(string[] args) { + if (args[0] == "--wait-for-debugger") + { + Console.WriteLine("Waiting for a debugger to be attached..."); + while (!Debugger.IsAttached) + { + Thread.Sleep(100); + } + Console.WriteLine("Debugger attached."); + } + // Log startup time Stopwatch stopwatch = new(); stopwatch.Start(); From 67fbd5ed5bb2da7c7925eb7969286e96c532ebcc Mon Sep 17 00:00:00 2001 From: jvyden Date: Fri, 10 Dec 2021 18:26:48 -0500 Subject: [PATCH 24/24] Fix IndexOutOfRangeException on startup --- ProjectLighthouse/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectLighthouse/Program.cs b/ProjectLighthouse/Program.cs index 9f3a035f..cfef9200 100644 --- a/ProjectLighthouse/Program.cs +++ b/ProjectLighthouse/Program.cs @@ -18,7 +18,7 @@ namespace LBPUnion.ProjectLighthouse { public static void Main(string[] args) { - if (args[0] == "--wait-for-debugger") + if (args.Length != 0 && args[0] == "--wait-for-debugger") { Console.WriteLine("Waiting for a debugger to be attached..."); while (!Debugger.IsAttached)