From 5c02ecdf372b3b147aae934996f676a401a0bb85 Mon Sep 17 00:00:00 2001 From: Lost-MSth Date: Thu, 3 Dec 2020 21:54:24 +0800 Subject: [PATCH] Update to v1.8 close #4 close #7 --- README.md | 16 +- latest version/database/arcaea_database.db | Bin 118784 -> 126976 bytes latest version/database/arcsong.db | Bin 106496 -> 118784 bytes .../database/database_initialize.py | 19 +- latest version/database/packs.json | 48 +- latest version/database/singles.json | 84 +- latest version/main.py | 8 +- latest version/server/arcscore.py | 1222 +++++++++-------- latest version/server/auth.py | 2 +- latest version/server/info.py | 2 +- .../templates/web/changeuserpurchase.html | 2 +- latest version/templates/web/index.html | 1 + .../templates/web/updateusersave.html | 30 + latest version/web/index.py | 67 +- latest version/web/system.py | 57 +- 15 files changed, 887 insertions(+), 671 deletions(-) create mode 100644 latest version/templates/web/updateusersave.html diff --git a/README.md b/README.md index ece4729..3742c9e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ This is a small local Arcaea server based on Python and Flask, which can simulat 没有以下 We don't have: - 角色数值 Character characteristic value -- 数据同步的时间和设备记录 The record of time and device for data synchronization +- 数据同步的时间记录 The record of time for data synchronization - 服务器安全性保证 Server security assurance 可能有问题 There may be problems: @@ -54,15 +54,13 @@ It is just so interesting. What it can do is under exploration. > > Tips: When updating, please keep the original database in case of data loss. -### Version 1.7 -- 仍然适用于Arcaea 3.2.3版本 Still for Arcaea 3.2.3 +### Version 1.8 +- 适用于Arcaea 3.3.0版本 For Arcaea 3.3.0 - 更新了歌曲数据库 Update the song database. -- 新增了购买系统,包括单曲购买和曲包购买 Add purchase system, including single purchase and pack purchase. -- 后台查询与修改项目增多 Increase background query and modification items. -- 新增用户下载量限制和下载校验 Add user download limit and download verification. -- 新增了**梦**的语音 Add the voice of **Yume**. -- 新增了网站图标 Add a favicon. -- 尝试解锁了所有的场景 Try to unlock all the scenes. +- 新角色**Alice & Tenniel**已解锁 Unlock new character **Alice & Tenniel**. +- 数据同步机制修改 Modify data synchronization mechanism. +- Recent30增添简易的PTT保护机制 Add simple PTT protection mechanism to Recent30. +- 尝试解锁了一些东西 Try to unlock something. - 修复了一些Bug Fix some bugs. ## 运行环境与依赖 Running environment and requirements diff --git a/latest version/database/arcaea_database.db b/latest version/database/arcaea_database.db index 147e9b6bccf77af5cf523c1b9d83f8da26f0d1aa..522cd401cde8cee15648853e2a5fe26e4e7d68ee 100644 GIT binary patch delta 2502 zcma)-|7#m{7{~i0ZSF2%X{+l(mZg`vw%Kf*cbDcHv_hRJt6EU$53@g*UG8%?k6n{4 zNxNw+)_zOBHzUG>IHm3f9UIO{!4|fG&>ut*`Ui+IVPlB+LvcTebY5KTDt?Z75I8>X z-1~Vw&*ynQpV4Jz^bS+>)z(y0RPg5SpT~WvH3T(Zo+O@Uya&|TF!Ci+v=pHFC%RM&th-nveJGn~Jt?Uq7E!-FZdyrW#F)NKNhg`q9 zuDi~=8l8VQZ#t)(r=2IbZElnMh&#_ExJq_|oniY}p4n#BO`{ak^+K=~TJ~_6WWi2D zSJXgrpjS<&b=CMkkhb;D?T4Q`SPKo0ygJJ{nqCJJ`HbmQ`sU`VRb5Y*p-TQ+9;WP_ z)zhWhmz!4Kxb>;s9<273n6GAgdaK^idGzA7`w)Sr^kxp@Hhl%nxZMVJ`N{n8WG#@ z&v9s>YEle4CZLg~DVmHICg3K3C&c`P!x?xI7Zh(cx}>x zC6vNnCZUP82SiLsEu7EGnIi=q7v;2^&*XA?`mCW6Vzmd7hNq|CDJq93V{wXJFCwV; z-IN8R6h^LKp^0%kRj}wiNyXuURX-41DL_4yQ)(QZo55{ZZnoOh>Q zvXPe!b>DJ@aC(}KsAwAAp0+|%aBCU@r)U^rRPb}29Sr?#bKmx(5K{R13^dV;A>sQo z^kOKQir>#b;3XP`lnQw{{|<$w8*;yz&hG~zMld>S0V2qlowb@85xVt7N>$JAz84R#t44AK(Do;#qoy)c$&^4qHhtNrD{SL&n(ivQ?wW^FIsU5_|u|A zenK1aOLR{ngfO`Tt#y>7^<8#hiBlwt18K5(r5p*KA1K#$~i;N z<@b8%>702M89Ld!NYo+oYVXew)kvGO`L|TR6Ev64WZ!!HXXkP8h{KcMapgMrYs$$a R#a(WGP5cZtk6n2s@E3}EuNwdW delta 2051 zcmai#U1$?o6vulKab^;mZn}Pz8k4qmthVaCcarIp+J}N)b=@}~RupxTnUP>jOPior zgwn61Y15=cIEY2!KCDo%?Go4uyRr*D2wL#L$7RI@eOMMBim!g9Sl{lYGtA5V-*e9I zeB3)DuceW)RBZIu)zs7ks^7P#cCJH%x?eA6f*w6=go&mbdbqL{{C>c#Dxs28{ITNy zZdI;??!4LRR(+Y0R9;`ve5G59a;31C2Dd7^O49Pa1G~NNyi4A+x6Sj(^QR~0x!_?Q zm-14%ucVbeMV6n+dHJH;BD<>gi&Ev&%0u^_quc!u0GA5@dS$t``pVmnr~1`1>7-dY zKi^#X|M&K$WA%R6|8>*JjZO7u&G=wEHI!D*4#tzE$Mda~i+}v$cB^&4lJwU);d5Ul z_~PxdyW2I4(g<9yE`0%?Ii!NpN%;A$+4|BOQLG|!F@ zW+;t2l=T#P1_td!+Oh}C*i|S(@$=`1!?R%)o*085KNiK|G1$-3sN>+HF*wZA7>nVD zF=*#%RKuQe*vHeTW8w92IKa~w>BQg0`7Df5d@s_7j${HK_`4C$A)I%M$f~n)uTsH1jza7AN`jVob+plLAKK zppp@28pTr?!R*m49L|X5A%e>p*vsW4HonOSav&P+$wEsXZ~mx3o0Nu)dYOronXor2 z7qKv#6(ACZkFx?q+KFpf2%X|#Foy(`T^ktjo7KK;M!_^ZHwCTyV#M(Fl&BaKSEnHK z1CN60T7weUpm5>|^O~JZZ3<#zXHEdZ7!KwHr-npvDF+?g1ZV`;a)Rk0CX#7^M#I=Y zEn*?KFbyGYJko`)r};Mqb!=>!5pc37#%4q;4*om?hxqXfd^^LB$0$QJFSr$$iB?{4 z8mW!<^88v;Cx(CL;UJfVbz$Qy9N}uz!ppOKJL*KSJS*Zf@YSp+zZeD!e4mU)@lpXg zcJPLiVYwi3N$}qSv~2D6_SX33SGE;F_0BE(S9NU15MO-ftJvfVzmv}K{)g{CB-4+zlqbQez9J9i|-ragPk z{@lyzVF`OeSG)+KJ7W>*>l8ue;xg*%jK#cYg_^Ux#WuXjwgJoP7+_}qPqI>BRLw}5l$3JW{D7)3^TK)u-OLcgWb;rpoPGrzgHbdQ)8f}Jr=#%IHWSkl z)tAz(+`x;j2g*2Kv1{Hb=*_1K9op4v9wJxaBm@Sg7?j^BTp zJkj>YSNto7sUDYiwm0Va&~w`J1J5&_$2@m=GM>$zD?M{PH6AbhJNgy+oAl#!kshSC z(97wIXr4Mx{gis1dX&4*MIbRE~5+$U~)?=(4arI&btDfD_?b@4aw^Y}3L z5%)Xp2jK4yal1H~Tf;5onmN{g-v4v|*ZrUK@Aqr|_5PLqHh;a}%YMNAnthRdl6{cf z!zS1p*fuue`-|@l-}ih^`40Q;@nw9s_^$S~`)YkI<{jogm=~C%%)`uXMqySl^O+Ds zc;EE?(EAOq_p{!6yjky7iwO{yMEEc82l;(`o|nAKy)(Q%&wHL%kL#SLP__4F_pF*J z*q_<+m2<})i|*azZmyYZ-!s(Y+i0cKofU9;LBAnSJ}u+(+FHPbWGE!s96f_pWot8qjyn?z`vhCm%d}@BZN4wdJvM_dR{? z-hID$_7J~!jXPRnJJq?bf8pH8udsVpyQ5+JK5?RU?@jKe=1FmW_Nz~v+xPUjW7gSY zcUA4Z(OuU(B4wnUnmzaU9(Zu}-Y3qEJyo@Lm3!iidg3B-`UAu2xOhNJ zi5tX4Vm0v+ag6wwcypq*kzfgH?hNAMvHQ0bs;TChDJjaqi2V8AdjKGjKdYx&8$OY( zDkzb!{GF!=lZ_Jj)4$0Z6PL^+e#+O8ue%Nq?|aB!lV2qdlLyG#Nrl`%c9643&SKh# zX(aK!bx|9UqsSM<-&v2e5rZtTi%1abiRI$CG5y7bHPoz{sp-=30rD5MR8s?)&}1o* zQS<%D97uEa!Dr4s`2exSS~r6@JS{@S8l03|u^IXA5R+c`v)-FQgeU&gPJF;!4PP%z zt(cPh2@4PQk{^1=52;hsW7HkgHflN5OmXfH+^@O6>;97a0rwr^yY7DXYWEV0SxKZQ z_iT5Km0L*+S)op1=JC6}Pgvh;e~D4`4P<{_(h^EWI{WFdGk1UPH_tss>Jh3Q@^@+ct)pLi`=OJh z5v3YnP*c)LS<-TEe`D;elP1yPj85!XKrACBes(nx^KS>G0#tplvcR=hyPjl;ZLR@g zg^PKTxtGZ^o0zMZ*$nSJ?|s=j;XUmAly}g(!8_l}dfxJ!@;v0(OS@BizCGog;Sllm;ii)^dTp_lK!4r*Z zHvR*!GGK6!Kg_wK#STlHds4gs}Yv5r*PD458 z4#)Z85;_J0seD?I+@T(^xR|bk??dv4q`^pFbFjFGZh(JMiv#95`f#~tpC z6fdKjVbK4Hkvma5_cy0!dT<)|Y=TX~4TZxG`y z@ekkt-xr?}4~hFkO_angI6-ELqUaLN3%?Rx7M>O!6ZQ+cgru-mSRu?6Y6Y5qm;WXI zP5$%zgZv&o!{5f=#4qFL@Krp`{jtFPn)@zyoIA|j!;L`wu$EiF&E_H;;s1mG7yjp= zf*AMj_NV>Z{Hy(){`vk|Kh3_&zRteH9%T=)``H{DXS>*Tb|xF}edPPC?>~Is^&Rsa z@g49D`()p0-%8(HUyS*P`91S9=6lR><}=Iz<_@NxS&Ym#L?zBh;s;osjUarxsDIREQ$o@4H`xr2mZjhZS11wfk8i60D~`78>9FrD@`qcNueujjL^+c zHc$2*t`qhjreiRS-XnDTjUgEx%K79j+r{+OI3`}%^5p!$CNavWUu8qLdGDzH6m-$U{c8_Ia%n67%J}253SV5XrHFY znM9WB2pAb`AL5#t&8pBBah)|rnqJ@=e`8&wKCmfdq;RcCjf_2Gz@8CYA6X@I^TrOk z24w7&>~2En5)Fl}hwo`AscLGk#B~Zr5(Uo5nzAzu13{yoo&i%JIy1SH0#yaq5jOg) zH^zx*LB{>EaY;+b(989M?3|H61=Wn)2LgtSIL;Y@Gb@ox%BnWXwsS@=&gqv22B66a z8WL{No08%KDK(eRLZ4%7$8M${Iefe_Pq5tZ&=k*33)`0=Rtf>PB7M?JxZrO+a5C3 z;`Y5#E|-!sD&Wj@28=bRj$BYONm<(=X|`=wqbz+2^y83=ZQr{IVTYD6BL&t6j2rPK zX$aKQq+PI%V64L3QqoRs)V980bmKr)&VcxNc5&3W0p*06YDmtcM#1!QHY;@37}tZF z5f(W_gbPAxNlgep;qr|e=8f-Ph$x6VIIMCL6k`EMqn#Ie=p zIwM90dKj3lUrvAk;4ay~hLCZEwZI}Gh09SwG$mlWGp}U9DD2{Zu@phc<_BdhqYlB| zys-pz9+Km5lG-3GMvxL}E~ml=*C85@4c6*|MAh8sIGlwRD?ik&UO_c#TuwF1ih*zlx3#=23pyP)b&^w=1n3kXsKn38nG~@u# z`wFg8G(?=1hH%Y*?w%&z5FBLkslL2sXM5gpBv2|nnt|NJb<`T1b?Q-KTF8%^_M#{d zyb*)7-g%U$D)?~Ga))O}HRH@oNm(#6uwRB3&x^DSW&##+Fb~-p^bxuOh6ho}$RiL_ zki=}e(kMb!0a$aOO_FU78&oNMq`_bNR7h(OeIdhbV^biq5bF69SUd;595P5m%t_}- zHI>M+?V>@TkeaMyAT{QI+cR8PPGlhi+Du;ozwON1p~LID9aIJ(^6f;c--!zCfN03b z5U(Nq4%`F7Z(6@9XVnbbF6dAXfm=Zo+vvi%q3^P$e};%n8%1}++0Yy3z+vMKFBsNG zthJv3=NLwvH5tylL~kk&F9-A?geIHUG$=7_hY9O>gaP_yc?i-%N=l4|wuST@3L}lc zVHbyL4bt64QO}~naW&Hih(k;Tbq)7WU`UPIrUCf%ow!Hx7I2%KI;cp@yr4el;IHO0 ziD6)YlMv#%it}vh7${@=>=gA3ZUDLr4yraC8qm|FNh*X0Bx-hXou0CmA0p}(4&dBg zIKH!LI%{*OI}j=a`K4K z71g)fIm>E#j0jUb^kScN-){E4gNXd+* zY-e?f93|6dSGuE45n+qB4qxvBmr3>(pbE4hSc_wJ5G&w0NvK}+HHf;?TSB(fS7UO+ z*3w?(rjnB2%63f$xkkUy5kiyt({Ola(}7LAz6w`?Y?@Lep{rW&#?XNjCTHSsa#%k+ zOmKx8P{UG}%C<-J>zz|EDM4`v#f4J|2leZ40}awUlp(N&?a9|Vl4sQ6;UpX+_S;?f zc3Q^d0-K2 zxOav7*aw7&e+Arl>}EIVt@`El(I}AVv1XE?VspbJ*d@Wq?0Tr@rP(GNI9VAIqukQ5~Cmj;BoiTby25%b=3HsBaJDk(ar%&+U6~| z^fK3{aL$cV7F&Mi1=f3Lk<9F3j{GG1Mn7%`TTZP5- zP0jYLLOtoDq7@*Tnwog~Z&IVS25*`gH`!NB3l_Jzz5-_jB*g2~H1r%h@~$!1Z?BC9 zV$#*~F(Uvb^S@Iye))I&h3lXUgRFm(JfQyl|LUy1q<&VbZIe0><$_IOu^0j|rIoy< zd=u8V0V<9Km$ti#2*NE=TG}D!T>C&6y`p?%F|lEM`#@y;m3?)TxY1>e=_AC!vCi66 zBl;Efus&=Wo`QZ&O$}~}O>dW-Y!@tC==!t+bo)lv-LQVKvVKc<60{xP+uzoIrM|Sj z6>dmKAdx3~mTk^u%a%FjtTf7K&{^5W^`&dR1xwpp-@;9<$s|+_GQcG+3$`*UTQzlT z{n*2W#_#{vs#T};Cr%sV_NVP--#V>Z<>wxT;B}4=l{|EjT{3-sQ`Fr>*FY&AR zrF;t?1FGkJ?w8!l+_T*0;Z{`Rdbn4*3+{>v)BQaA zS0H+R3D-qWu?N{AJIHQiuYwDsYS!aB=liMe1)zBz_1)#m`+9uW`Mgh(`!@9?b%?r~8ltvS zH&F|zizvVQFYaHtzwdt9eaOAfeY-o3^v=cZpqn6nN4`#ek332qB<~_~WSs0G+sH6n zxSS<^LVO#pUJe4#Q~!;vq1H!>&{#k!n&RwaU_-b#zsx6=uX{8-Vk^CXu;~&H8BK?aEmm8W zh*GocL10MMk`Y-bUW^2$Ly?eSDNt;t>p|=?M}o3JGXXkJ@0LWbkfVhsW|g&!d!JN(6JIt)4hK?2|ei!p?+ z!jO>BRH#^mTBg*cWsU@Z4i%#~dVwT?O~OU!G+;4cNy;P%z*JofTffQ?wMqyfEz=~V zO&7;x-?L<#6qRTOdNRHnq{3X1|-r9_pGf%V}cZ*9**>C2%iP?$q8 z0pth>9Vq%ygfcsV7GV)T~z`)F>}aT zISd?H9>J-wB=ATubEvsPlYk=yOz1s8;4)7Fx&=%Phss0=8Bqe}P8=#TC4f!P9CV;B z-wOiHf~n%_4pl)^P3Wn8;K=Zknk-~L!Q6rq zp|9})e*)Unn73F5Mv1yUU|VgSpwB2>Ho=h*GH=GsE^sHX8Egic^!Qz$Q&Pq;yq)1u!{&4u0-ixCS>Z z(<%@#qItFRvcs#`_bujCc+`B7Sg{kN2|s6obt}vY214gtl=1?%0udH5SE4CO{ST5W z5Y}OHh4s|!M08*|VmgUV0XGYn%TT&9p8_d}Gdu9Q$R<=kG|s#NzuJrn;3JrqJAfgj zf;ns{DpTTAK#s7v#A>^Ph|YEHAWJL?_;{7M2%}Z?F^f3PAFaARp96i znDbHdGO+^D9x9lZ;7%8)6*zl><~-afS*BJ1qmWs`zrw9RCi5V9v%} z%IpdZ1$%LpE%!^P{4e}Kvuwe=EE#ZHGqs z1=nf7b)*vi0?rvSr#paE2pBMpXx8K6B?bo5;WRY7CIi~wfO%xiK<|39&bnte(Gaag zNGePWtP(M6tW&#zm8?dUCUGzDFkr?|lrs4OnKftvFAL&U*cb54fEmSUW%>n_h?)@$ z(<$@|Di_A7W&VYX^ou62v&0gpHys8BHwoe<6$%DIC}aXd3maeHU|{DeQ?w2g;G$l@ z`3~m-lnZ!i(ByHf!npvBg2^G)4(S5o@TMO#BC;+3RM2Eg+LdS*bV8rAafNpQ9~Mjo zS8|9K`1$D88q;e%IY!hLOb?o+#I}G-MNQf{XD8Dwkd8wpg$rNcTgbqgpy_tRE)y;w zRn#PLfhmj&*jqFS+^R&mpl7-YXh)k+EO9PyQU#5IgHM@s0jYwA zbJQjN8h(TJW$|7yEv^-piOnJ}yf3^Wd<}j*aF>t~HVW4Wm%wiaJpB9ofAY`spXE(n z=C9@F^VK}Dg*(grhtEwv?4J(56?mKd z8T%~zX?8a&u~)Mfv8?Yr{6^pf-_;DXF0H8Z5R*%KOTD z%G=6sl{b{vPRv~NyfXHS>9fKog)J@0JIXJ|)EWERq=@*Q_`3Kb@wE7e_%Gt8#GA#6 zm>Iiu#>%np&RBP%Yv#*=V@C&1Y?*Us*SwD|fkV~00H2Dt9X@4u4hMhm%E#ferCs^C z@{ID3^6?Wh)k6wt8@p}&ti`QKzPppN(xx$NXs^4Uef`v(oC2FuZG881uArHjs#SXP z)bTe@-S^fLpJ{mxeo8jPUec{HF`V))e71Bb|E;_`t_~5M)HLoIZV5MsYv*|KHhG17 zhdf4(lOrv0_bOp#gb-Ud^-|f?9Y^d}-F{&@tT`oXWTaq}^=NO(T`A0krJ`Q6>}pQS zl;Mx)QrTT0bi=Y)$rw4^jxJ5O%Z1snP|!6yYm^<$$clZcdu0s|%xQ*QEo-J8oUOWj zxRln?nr$7d=wg4&y+UY(XKlmL!}DZ!86G`sRCUwT#6H>mATH!BD_hnF#r}5pa$zA8 zZaL));A9$yw6bB9SJ@wa{9{iHA! zI=zGxj=2{~ZjZa9r@LE9a-HqrG3RveiO-+jb4j2!vGoI$CF=jClJ)8~+^R@QXew(K`oL554uNyUslP@UroqS>#tz2+;T>SsrLiTSTTc zmMtRX#-oeK&~EN!?kVmI+|68;yPCUzlgPW|W%5n(Wpb1pB3ZJTELYCJqyO+fDb7>*p7`YAHLF`596!8@>?Do%uOjDlwDYs!39DQ%hIK1vYiGvp zJ#+6#?)3OOz2uK#WBn@95oUfHBZ~u#1uKc!`1DFLJdb~ZzlT4}XZY3prF=)={lKe% zCjy@h90`;IdjnSmdbmGx|G_=P(MF=5%o-oqO6q~J()yn9AFd|tv1v(Alavg57=l+n zbNmZ$e(nCnzK}gFjddHy%El))kPWND4~LJ1o$!wEmEmdOme6lQFNB^99S_lv9=a~H zB-9h)(fiK@9}gZ69tjQxHwJryDd9cgRpHyhBf=fRO@h&QbpzSNk>$tSh2sxBOE!hZ z*01j#e|`s9)?Ry%6I-CvyrO(Z8CM=qZdEFZrmR=`l=GFi{8#zc@(c1)@)zY>mYOnl44fKZ!pVpBGPx$HiO4lDJh|B`y@Z z#c1sP*l%M$i9H>AFm^}GjTK{?Vk=_{W391TAo_ar`_WU;FGm~Eden~Yjt)eZL}x`~ zkv~U%9{EA!$;js-w??WFEwUkUMPyE-H4+H_F8o6HX#nQl@XcX6ye~Wu?hW^Z1pw!z z&~u^3L-&Vn3mpy(hPH>U49yKG!T$>W64K*q!7o69j0E=w*9TVw7X&+m_k~~7gzpRA z5WWOi@-e{?_6Tc*UdWR$|405M{#*RR{N4P`{3ySlU(YY+XY+F4Z-Fy`7X#l6{A=Kj zKs|6Uus^UWurQ!D`AXa(AwWPQFc8`g&^c3y+ZYgCGX z#QwJWJYhbp8l{|3GRjq`xx;!1evs>Pg--Y(s~4fB2a*}7eu2;q3udKgXo18&r9MaK zhVR4rXic+WN!<~zpD#>@rO6VF+h*goX2lI8(@K37u8e9W(8J+US*bqLKUy0y94@gp zS)YNbj_S5HRA74PTr%BSpN@v*HB%d{=4?YRWgS?L*E`Nbu^HQP9BWv&;fSt!k8mj& zdu>x{I@elE)~DftQ_2H8*j4Xld*Yi@js1@jVOnzGMCtus<$=1@+fJmwW3rfquHij&S-fsLzC($ zG}bEVIh#{ACF@DtH4L{;wp`HRPUO@bQaypY^7`PQ#;My9^*G8&n_6bjw8|B*T;K4Ah;R1Rx?qLHtst?QVSxe6Z<7^l?pa4Z0YhWr@msPR7frfrlM`fc?92Ih!mn^}ES&r~3w zbxz%?)H(D)v#;UQ&B;1Jk!h_A%}2=sWZ{5#y#*E5jZ#6k4`?=cT%|RXpEFF2g*9xG z=uHUpZn*eM8kfq&>5cfDHVk&z+95!5zd{eAOjA2(SDD{;Df9+harDw))v9pn_BMJ5 z74|d8tb)^_5n^FRs}1rv>DK5d9-KG9#kQqo0c(|x_zKy&p3_VdJT1{-R0uC$PTeTe z3L;Z9>_b`+vL!{!!W{6=ux3IJXM%>d#ia`E)M?!KIO#NO{I#f?R<>&8Oh^bYQ=tb@ zU(KlK01%61I)p2kf^IrG#MsspweZm)%`O`m6S}Xm1EH9tC4|>E%*k37K$%I>V&m_R zlh&GvK?GjQ>)E_s(j7?QRx?Ql@u94(YuS=jVTqAUx6=c{MW8x574U@^alkn&%&39j zIF%vYE?L7G?3QT(Eg#ldrwCD`(mbM-waR4+KEU^CjplI87}O3`G6jQ687kFrDGy!S zU zC{JZu>3%fZv6h)eS+lFm&LV)7p!+Z(MpMQetYQjLxNWh3-U+t)eyvfe&7d z(;fKmP=RHoV?eC#mg#msf^^$7N}Rg0jc!A;;D#{v+R!bH7$qoa06~&&_1!j_tC(g{ zhm;3LD0B;oDYO1uFGJi)bTbC2UCA4eAiI-v6Fvu}2FiNYW)(Y?P0)>v{wGN4iVY~g z06ww}2z!PMcuTo@td!bp4t^CI*l5E*?U{*G6WuKQxOhyGF6a> zaC{IYO*Gt)L<+s!f7sL%w>nz;l)E9s+dj8sgBl5!Q0O443`wQO6Ze8Do|zEA8{ z>7}Tw4V4{w6-ec+B3&f3f@%)bRW7kdq?h2=+QACTKTW0=`=|{;C4r29+P4smI{-OW z(&4_{mZS?%6y|Z>(j9nEUaQcHa9^ehmn%3Rb)b!2h^bSx4nb|PwOl1#88iUePC8$> z1XRESfU}h0?uccu03`OO=)A_!uamY5=OQAu4!3DGZC031;`9Q<&Z*cobTlmBcBJT> z#`oF&^HC{n6mHQBP+C@6iz=Os_Ghe84%`6gs3+*GhWaE)=`-=D0>o9>8iM3kw4R=$d|CYN$innD|*d>EQ1b)Eu?TE1N~3I0{5siiN|OVpk^A5N#znWf#w=TC>DC! zu(JTMLgRS0K5Us~eH8L&S{qf-kG2jlLb6tTSE*ZisM5IYDKfn#qv_aFI#$JmV^UPY z*v%9m9ARDnuFtY%wT4@-PG(!k0YT1%Lg104_8^XO4d=sln5G~7@)im_=C`3RZTFDx$K#v2! z?M_f0K>;D<>abC&f;IcvXrOWQ8>C|whx>Do=Y=#hmk@q&N^p&3w*jG40AOX>g5djn z0JM?38Wu(515l3R-c3#GAc(P1RJWcSB9;Fi8#Tv9w@9_GlX{Etmhz(Vl=7f*mvXZ* zqU2!`)33}|S`|)yTmG5+tb9^_Kt3iPmUHrEd9gfAj!A!#UYC9-{hRa{F!dwSVQEm> zDP1AWliH+!_Qhga=_MWD`InE zsTddiP4uPcQ_(L*?}~mb>O{5ZhUgX13!?2&KJuTDS0c|u#v>0zJ`r&unaH|GUu0e+ z8R5h4gkKFm6FwP!ApFVj;jj_j9$pb%5bg+*&|9GwL(c+Ze;{-$R0~<5-Jw;Xi$m=p zF8I6PkAu&^P~$Vfn}b8a{WX|tFw(9He-_>pek43CJSN;P+$J0n3}K_tFU%L(`M=_9 z>oor$e;P}_Iyr&-fxJkbAzvbQ0q`v?3*i5RccY&Rww5o#sE@UCy6hds;D+|V zWR+`Ir*}hR!70*J^A2Ht0m)??7ph#VSM@u;f|i9$hYHMETXl278^v?a&OkYJL);tj z6KP@y3VG7%4dVglOhKU}DP9FdHOHWg8G7X!Ru)!!n}bm3p5mV4XY9lv6ts$aHm*%h zLfNJ09mHFZjY1(`70>VYo3l{Zpm-KaY*KTmupM3rulUJnXstO8g(A}774f&T^U$(W z8ML5%8IU~_r>adxFRvB7L7|;ZRT-fd`x4#(9OzEr^YTE-GjJMw4xNWNuUEj)hEL{W zz~;sNPA@N98ewE!04D6^8gGA+qnT9g$!L7vau;VSYnLJxeOpzdP7>_Kl2 zD{xaV<}UWfJq>5pFso=1cd;+&?HA_2rkoCx$bk_FxK`{>c>7TMDKuUl5WT%LW9uZ??~aqTQ?hyK$$ z0R1~0G=;S@-8SL`9JtI7^rR&~B(Fi&$YN;&;yc0P;nMQf3-jRs7}f(Hh6@!MHr-C_ zl{{$aVLgq!p6$D?@zYO{_S!mhN0Y=ydlTMTR3Lqp!^1lS??Y(OB!y?5U4xP*7(9!$ zYY}AR??4E>Yw(##`p$emfWn&Woh@8FA6J^}J-W2jTaD`b9Cw1e%WFHmRgF*IPP%JX z;h~e%ohbrcJQ$X1GItgdD^U?7?#zWN&~l%*%L7SoIR@8M+Aa^Yc~=S-!7*h6rW;vn z1W?P`;=kf((s&lcAH)aQWk12xK*2q9Hv`S)s%3Fe=b`GQO0=ngW05`J+x5?<4`imRiy8~G4Wr)utdl&m8 zuNTet$veXfx^_@}g1d`-inj3`6drBzcP4ihJ~>I>Sscyu z;|SS13)LB@2P5y3+`Wb+Xu9v9v)rAba~?`)Qg@avJs73P+*w?}WE3=*Lfjc5-F}IH zJoYP+JRo^69)*oQi5L4)UMGU-bNFdZ63^7_z=Qj0kAfT|@M3?`OCoMl`8x}ygda>z`kvUA^y0WLi!&eS&Y?q>2UJf*IDyR9 zd^Ruki=Ki4kj%5fBcozdxO`$?!jo`u3YAwk%bti(HkrJ-N%5e?2UTHUi9|j;FYZOr zAjac;8ZY)M9(4E-(hHZ7Pve8LB`@q_ge;!n5b`5%lEjOBU0$%U=58`=oq$4{9G(R+ zkGP*h;aL<0{M2c_GGmnj=A@t<#4984@Iuogjj!AdR}IWX8Nd@<9sKPAQ-`IqOg-A0 zbZzYhPjTo?IWtembNOus0OfvNF!nk|D2Y-^FLm6;k8VVvN`8hb) zEuer2dd}X6=bM|F>^!=(+sz3dfah#2oi@tQ*c9}}k3UVM8Vp2Xd4jC77voukvB}jL z-WgnIQg!wcK8;q|P@7=bIHK83c%I^Fc+doIXV2}&=bE&gIdUI5(r4{Z58S;%=N=I5 zvvw93d+>}2($2zfHzIJBv$KB`unW&^Qg-OO-RsfM=Mr|YZ<@Qaar$0zUJd4+ObUAk z#P~XtTz5NqZz^49!MY9Yn!?s0N8PQc(*#+E67Fun^Cr1E6diXnZknL#;dv={6Xqf# z>Z>Q2I)iB=?wla%Q0UzaXik%-Gv}?x^CxLKbfoTw8^`~dBx~29q36DlV;Zf)Cnkw{ zv{!Z4;?g8fhfdi25W?@%bSS6p8mxB6(%B)`HqC01bSOUVHHiMu1R>g1gqINR03PEL tB9={83zq=AP}FpY1}j${fww!*9y8NcqiIcw#QvGbD*u|D%8j&lG2 diff --git a/latest version/database/database_initialize.py b/latest version/database/database_initialize.py index 12d852f..6c4fc46 100644 --- a/latest version/database/database_initialize.py +++ b/latest version/database/database_initialize.py @@ -199,17 +199,26 @@ type text, primary key(user_id, item_id, type) );''') +c.execute('''create table if not exists user_save(user_id int primary key, +scores_data text, +clearlamps_data text, +clearedsongs_data text, +unlocklist_data text, +installid_data text, +devicemodelname_data text, +story_data text +);''') -char = ['Hikari', 'Tairitsu', 'Kou', 'Sapphire', 'Lethe', '', 'Tairitsu(Axium)', 'Tairitsu(Grievous Lady)', 'Stella', 'Hikari & Fisica', 'Ilith', 'Eto', 'Luna', 'Shirabe', 'Hikari(Zero)', 'Hikari(Fracture)', 'Hikari(Summer)', 'Tairitsu(Summer)', 'Tairitsu&Trin', - 'Ayu', 'Eto&Luna', 'Yume', 'Seine & Hikari', 'Saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'Haruna', 'Nono', 'MTA-XXX', 'MDA-21', 'Kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'Sia', 'DORO*C', 'Tairitsu(Tempest)', 'Brillante', 'Ilith(Summer)', 'Etude'] +char = ['Hikari', 'Tairitsu', 'Kou', 'Sapphire', 'Lethe', '', 'Tairitsu(Axium)', 'Tairitsu(Grievous Lady)', 'Stella', 'Hikari & Fisica', 'Ilith', 'Eto', 'Luna', 'Shirabe', 'Hikari(Zero)', 'Hikari(Fracture)', 'Hikari(Summer)', 'Tairitsu(Summer)', 'Tairitsu & Trin', + 'Ayu', 'Eto & Luna', 'Yume', 'Seine & Hikari', 'Saya', 'Tairitsu & Chuni Penguin', 'Chuni Penguin', 'Haruna', 'Nono', 'MTA-XXX', 'MDA-21', 'Kanae', 'Hikari(Fantasia)', 'Tairitsu(Sonata)', 'Sia', 'DORO*C', 'Tairitsu(Tempest)', 'Brillante', 'Ilith(Summer)', 'Etude', 'Alice & Tenniel'] skill_id = ['gauge_easy', '', '', '', 'note_mirror', '', '', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere', - 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', ''] + 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', '', '', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', '', 'note_mirror|visual_hide_far'] skill_id_uncap = ['', '', 'frags_kou', '', 'visual_ink', '', '', '', '', '', '', '', '', 'shirabe_entry_fee', - '', '', '', '', '', '', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] + '', '', '', '', '', '', '', 'frags_yume', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] -for i in range(0, 39): +for i in range(0, 40): if i in [0, 1, 2, 4, 13, 26, 27, 28, 29, 36, 21]: sql = 'insert into character values('+str( i)+',"'+char[i]+'''",30,25000,25000,90,90,90,"'''+skill_id[i]+'''",0,0,"'''+skill_id_uncap[i]+'''",0,'',1,1)''' diff --git a/latest version/database/packs.json b/latest version/database/packs.json index a586926..bd0993e 100644 --- a/latest version/database/packs.json +++ b/latest version/database/packs.json @@ -3,7 +3,7 @@ "items": [{ "type": "pack", "id": "core", - "_id": "5fb5b68a68273a03de60f205", + "_id": "5fc8306209787401bb857d1b", "is_available": true }], "price": 500, @@ -15,12 +15,12 @@ "items": [{ "type": "pack", "id": "shiawase", - "_id": "5fb5b68a68273a03de60f234", + "_id": "5fc8306209787401bb857d3b", "is_available": true }, { "type": "character", "id": "kou", - "_id": "5fb5b68a68273a03de60f233", + "_id": "5fc8306209787401bb857d3a", "is_available": true }], "price": 500, @@ -32,12 +32,12 @@ "items": [{ "type": "pack", "id": "dynamix", - "_id": "5fb5b68a68273a03de60f238", + "_id": "5fc8306209787401bb857d33", "is_available": true }, { "type": "character", "id": "sapphire", - "_id": "5fb5b68a68273a03de60f237", + "_id": "5fc8306209787401bb857d32", "is_available": true }], "price": 500, @@ -49,12 +49,12 @@ "items": [{ "type": "pack", "id": "mirai", - "_id": "5fb5b68a68273a03de60f23e", + "_id": "5fc8306209787401bb857d37", "is_available": true }, { "type": "character", "id": "lethe", - "_id": "5fb5b68a68273a03de60f23d", + "_id": "5fc8306209787401bb857d36", "is_available": true }], "price": 500, @@ -66,7 +66,7 @@ "items": [{ "type": "pack", "id": "yugamu", - "_id": "5fb5b68a68273a03de60f206", + "_id": "5fc8306209787401bb857d1c", "is_available": true }], "price": 500, @@ -78,7 +78,7 @@ "items": [{ "type": "pack", "id": "lanota", - "_id": "5fb5b68a68273a03de60f211", + "_id": "5fc8306209787401bb857d26", "is_available": true }], "price": 500, @@ -90,7 +90,7 @@ "items": [{ "type": "pack", "id": "nijuusei", - "_id": "5fb5b68a68273a03de60f207", + "_id": "5fc8306209787401bb857d1d", "is_available": true }], "price": 500, @@ -102,7 +102,7 @@ "items": [{ "type": "pack", "id": "rei", - "_id": "5fb5b68a68273a03de60f1fd", + "_id": "5fc8306209787401bb857cfa", "is_available": true }], "price": 500, @@ -114,7 +114,7 @@ "items": [{ "type": "pack", "id": "tonesphere", - "_id": "5fb5b68a68273a03de60f213", + "_id": "5fc8306209787401bb857d28", "is_available": true }], "price": 500, @@ -126,7 +126,7 @@ "items": [{ "type": "pack", "id": "groovecoaster", - "_id": "5fb5b68a68273a03de60f22c", + "_id": "5fc8306209787401bb857d14", "is_available": true }], "price": 500, @@ -138,7 +138,7 @@ "items": [{ "type": "pack", "id": "zettai", - "_id": "5fb5b68a68273a03de60f1ff", + "_id": "5fc8306209787401bb857cfc", "is_available": true }], "price": 500, @@ -150,7 +150,7 @@ "items": [{ "type": "pack", "id": "chunithm", - "_id": "5fb5b68a68273a03de60f221", + "_id": "5fc8306209787401bb857d09", "is_available": true }], "price": 300, @@ -160,7 +160,7 @@ "items": [{ "type": "pack", "id": "prelude", - "_id": "5fb5b68a68273a03de60f22d", + "_id": "5fc8306209787401bb857d15", "is_available": true }], "price": 400, @@ -170,7 +170,7 @@ "items": [{ "type": "pack", "id": "omatsuri", - "_id": "5fb5b68a68273a03de60f200", + "_id": "5fc8306209787401bb857cfd", "is_available": true }], "price": 500, @@ -180,7 +180,7 @@ "items": [{ "type": "pack", "id": "vs", - "_id": "5fb5b68a68273a03de60f224", + "_id": "5fc8306209787401bb857d0c", "is_available": true }], "price": 500, @@ -190,9 +190,19 @@ "items": [{ "type": "pack", "id": "extend", - "_id": "5fb5b68a68273a03de60f230", + "_id": "5fc8306209787401bb857d18", "is_available": true }], "price": 700, "orig_price": 700 +}, { + "name": "alice", + "items": [{ + "type": "pack", + "id": "alice", + "_id": "5fc8306209787401bb857d02", + "is_available": true + }], + "orig_price": 500, + "price": 500 }] \ No newline at end of file diff --git a/latest version/database/singles.json b/latest version/database/singles.json index 5527600..d746292 100644 --- a/latest version/database/singles.json +++ b/latest version/database/singles.json @@ -12,7 +12,7 @@ "items": [{ "id": "dataerror", "type": "single", - "_id": "5fb5b68a68273a03de60f210", + "_id": "5fc8306209787401bb857d0f", "is_available": true }], "price": 100, @@ -24,7 +24,7 @@ "items": [{ "id": "yourvoiceso", "type": "single", - "_id": "5fb5b68a68273a03de60f227", + "_id": "5fc8306209787401bb857cf7", "is_available": true }], "price": 100, @@ -36,7 +36,7 @@ "items": [{ "id": "crosssoul", "type": "single", - "_id": "5fb5b68a68273a03de60f21b", + "_id": "5fc8306209787401bb857d03", "is_available": true }], "price": 100, @@ -48,7 +48,7 @@ "items": [{ "type": "single", "id": "impurebird", - "_id": "5fb5b68a68273a03de60f21c", + "_id": "5fc8306209787401bb857d04", "is_available": true }], "price": 100, @@ -60,7 +60,7 @@ "items": [{ "type": "single", "id": "auxesia", - "_id": "5fb5b68a68273a03de60f228", + "_id": "5fc8306209787401bb857d10", "is_available": true }], "price": 100, @@ -72,7 +72,7 @@ "items": [{ "type": "single", "id": "modelista", - "_id": "5fb5b68a68273a03de60f1fb", + "_id": "5fc8306209787401bb857cf8", "is_available": true }], "price": 100, @@ -84,7 +84,7 @@ "items": [{ "type": "single", "id": "yozakurafubuki", - "_id": "5fb5b68a68273a03de60f21d", + "_id": "5fc8306209787401bb857d05", "is_available": true }], "price": 100, @@ -96,7 +96,7 @@ "items": [{ "type": "single", "id": "surrender", - "_id": "5fb5b68a68273a03de60f229", + "_id": "5fc8306209787401bb857d11", "is_available": true }], "price": 100, @@ -108,7 +108,7 @@ "items": [{ "type": "single", "id": "metallicpunisher", - "_id": "5fb5b68a68273a03de60f1fc", + "_id": "5fc8306209787401bb857cf9", "is_available": true }], "price": 100, @@ -118,7 +118,7 @@ "items": [{ "type": "single", "id": "carminescythe", - "_id": "5fb5b68a68273a03de60f21e", + "_id": "5fc8306209787401bb857d06", "is_available": true }], "price": 100, @@ -128,7 +128,7 @@ "items": [{ "type": "single", "id": "bethere", - "_id": "5fb5b68a68273a03de60f22a", + "_id": "5fc8306209787401bb857d12", "is_available": true }], "price": 100, @@ -140,7 +140,7 @@ "items": [{ "type": "single", "id": "callmyname", - "_id": "5fb5b68a68273a03de60f212", + "_id": "5fc8306209787401bb857d27", "is_available": true }], "price": 100, @@ -152,7 +152,7 @@ "items": [{ "type": "single", "id": "fallensquare", - "_id": "5fb5b68a68273a03de60f208", + "_id": "5fc8306209787401bb857d1e", "is_available": true }], "price": 100, @@ -164,7 +164,7 @@ "items": [{ "type": "single", "id": "dropdead", - "_id": "5fb5b68a68273a03de60f21f", + "_id": "5fc8306209787401bb857d07", "is_available": true }], "price": 100, @@ -176,7 +176,7 @@ "items": [{ "type": "single", "id": "alexandrite", - "_id": "5fb5b68a68273a03de60f22b", + "_id": "5fc8306209787401bb857d13", "is_available": true }], "price": 100, @@ -188,7 +188,7 @@ "items": [{ "type": "single", "id": "astraltale", - "_id": "5fb5b68a68273a03de60f1fe", + "_id": "5fc8306209787401bb857cfb", "is_available": true }], "price": 100, @@ -200,7 +200,7 @@ "items": [{ "type": "single", "id": "phantasia", - "_id": "5fb5b68a68273a03de60f209", + "_id": "5fc8306209787401bb857d1f", "is_available": true }], "price": 100, @@ -210,7 +210,7 @@ "items": [{ "type": "single", "id": "empireofwinter", - "_id": "5fb5b68a68273a03de60f220", + "_id": "5fc8306209787401bb857d08", "is_available": true }], "price": 100, @@ -220,7 +220,7 @@ "items": [{ "type": "single", "id": "libertas", - "_id": "5fb5b68a68273a03de60f214", + "_id": "5fc8306209787401bb857d29", "is_available": true }], "price": 100, @@ -232,7 +232,7 @@ "items": [{ "type": "single", "id": "dottodot", - "_id": "5fb5b68a68273a03de60f20a", + "_id": "5fc8306209787401bb857d20", "is_available": true }], "price": 100, @@ -244,7 +244,7 @@ "items": [{ "type": "single", "id": "dreadnought", - "_id": "5fb5b68a68273a03de60f215", + "_id": "5fc8306209787401bb857d2a", "is_available": true }], "price": 100, @@ -256,7 +256,7 @@ "items": [{ "type": "single", "id": "mirzam", - "_id": "5fb5b68a68273a03de60f20b", + "_id": "5fc8306209787401bb857d21", "is_available": true }], "price": 100, @@ -268,7 +268,7 @@ "items": [{ "type": "single", "id": "heavenlycaress", - "_id": "5fb5b68a68273a03de60f222", + "_id": "5fc8306209787401bb857d0a", "is_available": true }], "price": 100, @@ -278,7 +278,7 @@ "items": [{ "type": "single", "id": "filament", - "_id": "5fb5b68a68273a03de60f22e", + "_id": "5fc8306209787401bb857d16", "is_available": true }], "price": 100, @@ -288,7 +288,7 @@ "items": [{ "type": "single", "id": "avantraze", - "_id": "5fb5b68a68273a03de60f216", + "_id": "5fc8306209787401bb857d2b", "is_available": true }], "price": 100, @@ -298,7 +298,7 @@ "items": [{ "type": "single", "id": "battlenoone", - "_id": "5fb5b68a68273a03de60f201", + "_id": "5fc8306209787401bb857cfe", "is_available": true }], "price": 100, @@ -308,7 +308,7 @@ "items": [{ "type": "single", "id": "saikyostronger", - "_id": "5fb5b68a68273a03de60f20c", + "_id": "5fc8306209787401bb857d22", "is_available": true }], "price": 100, @@ -318,7 +318,7 @@ "items": [{ "type": "single", "id": "izana", - "_id": "5fb5b68a68273a03de60f223", + "_id": "5fc8306209787401bb857d0b", "is_available": true }], "price": 100, @@ -328,7 +328,7 @@ "items": [{ "type": "single", "id": "einherjar", - "_id": "5fb5b68a68273a03de60f22f", + "_id": "5fc8306209787401bb857d17", "is_available": true }], "price": 100, @@ -338,7 +338,7 @@ "items": [{ "type": "single", "id": "laqryma", - "_id": "5fb5b68a68273a03de60f217", + "_id": "5fc8306209787401bb857d2c", "is_available": true }], "price": 100, @@ -348,7 +348,7 @@ "items": [{ "type": "single", "id": "amygdata", - "_id": "5fb5b68a68273a03de60f202", + "_id": "5fc8306209787401bb857cff", "is_available": true }], "price": 100, @@ -358,7 +358,7 @@ "items": [{ "type": "single", "id": "altale", - "_id": "5fb5b68a68273a03de60f20d", + "_id": "5fc8306209787401bb857d23", "is_available": true }], "price": 100, @@ -368,7 +368,7 @@ "items": [{ "type": "single", "id": "feelssoright", - "_id": "5fb5b68a68273a03de60f218", + "_id": "5fc8306209787401bb857d2d", "is_available": true }], "price": 100, @@ -378,7 +378,7 @@ "items": [{ "type": "single", "id": "scarletcage", - "_id": "5fb5b68a68273a03de60f203", + "_id": "5fc8306209787401bb857d00", "is_available": true }], "price": 100, @@ -388,7 +388,7 @@ "items": [{ "type": "single", "id": "teriqma", - "_id": "5fb5b68a68273a03de60f20e", + "_id": "5fc8306209787401bb857d24", "is_available": true }], "price": 100, @@ -398,7 +398,7 @@ "items": [{ "type": "single", "id": "mahoroba", - "_id": "5fb5b68a68273a03de60f225", + "_id": "5fc8306209787401bb857d0d", "is_available": true }], "price": 100, @@ -408,7 +408,7 @@ "items": [{ "type": "single", "id": "badtek", - "_id": "5fb5b68a68273a03de60f219", + "_id": "5fc8306209787401bb857d2e", "is_available": true }], "price": 100, @@ -418,7 +418,7 @@ "items": [{ "type": "single", "id": "maliciousmischance", - "_id": "5fb5b68a68273a03de60f231", + "_id": "5fc8306209787401bb857d19", "is_available": true }], "price": 100, @@ -428,7 +428,7 @@ "items": [{ "type": "single", "id": "buchigireberserker", - "_id": "5fb5b68a68273a03de60f20f", + "_id": "5fc8306209787401bb857d25", "is_available": true }], "price": 100, @@ -438,7 +438,7 @@ "items": [{ "type": "single", "id": "galaxyfriends", - "_id": "5fb5b68a68273a03de60f226", + "_id": "5fc8306209787401bb857d0e", "is_available": true }], "price": 100, @@ -448,7 +448,7 @@ "items": [{ "type": "single", "id": "xeraphinite", - "_id": "5fb5b68a68273a03de60f232", + "_id": "5fc8306209787401bb857d1a", "is_available": true }], "orig_price": 100, @@ -458,7 +458,7 @@ "items": [{ "type": "single", "id": "xanatos", - "_id": "5fb5b68a68273a03de60f21a", + "_id": "5fc8306209787401bb857d2f", "is_available": true }], "price": 100, diff --git a/latest version/main.py b/latest version/main.py index e245acb..1f123bc 100644 --- a/latest version/main.py +++ b/latest version/main.py @@ -440,10 +440,16 @@ def cloud_post(): token = token[7:] scores_data = request.form['scores_data'] clearlamps_data = request.form['clearlamps_data'] + clearedsongs_data = request.form['clearedsongs_data'] + unlocklist_data = request.form['unlocklist_data'] + installid_data = request.form['installid_data'] + devicemodelname_data = request.form['devicemodelname_data'] + story_data = request.form['story_data'] try: user_id = server.auth.token_get_id(token) if user_id is not None: - server.arcscore.arc_all_post(user_id, scores_data, clearlamps_data) + server.arcscore.arc_all_post(user_id, scores_data, clearlamps_data, clearedsongs_data, + unlocklist_data, installid_data, devicemodelname_data, story_data) return jsonify({ "success": True, "value": { diff --git a/latest version/server/arcscore.py b/latest version/server/arcscore.py index 43f5e39..42066bc 100644 --- a/latest version/server/arcscore.py +++ b/latest version/server/arcscore.py @@ -243,7 +243,7 @@ def get_song_state(x): return 0 -def update_recent30(c, user_id, song_id, rating): +def update_recent30(c, user_id, song_id, rating, is_protected): # 刷新r30,这里的判断方法存疑 c.execute('''select * from recent30 where user_id = :a''', {'a': user_id}) x = c.fetchone() @@ -257,7 +257,7 @@ def update_recent30(c, user_id, song_id, rating): if x[i] not in songs: songs.append(x[i]) if flag: - n = len(song_id) + n = len(songs) if n >= 11: r30_id = 29 elif song_id not in songs and n == 10: @@ -279,11 +279,28 @@ def update_recent30(c, user_id, song_id, rating): for i in range(1, 61, 2): a.append(x[i]) b.append(x[i+1]) + + if is_protected: + a_pre = [x for x in a] + b_pre = [x for x in b] + s_pre = 0 + for x in a_pre: + s_pre += x + for i in range(r30_id, 0, -1): a[i] = a[i-1] b[i] = b[i-1] a[0] = rating b[0] = song_id + + if is_protected: + s = 0 + for x in a: + s += x + if s < s_pre: + a = [x for x in a_pre] + b = [x for x in b_pre] + c.execute('''delete from recent30 where user_id = :a''', {'a': user_id}) sql = 'insert into recent30 values(' + str(user_id) for i in range(0, 30): @@ -342,7 +359,10 @@ def arc_score_post(user_id, song_id, difficulty, score, shiny_perfect_count, per c.execute('''update user set song_id = :b, difficulty = :c, score = :d, shiny_perfect_count = :e, perfect_count = :f, near_count = :g, miss_count = :h, health = :i, modifier = :j, clear_type = :k, rating = :l, time_played = :m where user_id = :a''', { 'a': user_id, 'b': song_id, 'c': difficulty, 'd': score, 'e': shiny_perfect_count, 'f': perfect_count, 'g': near_count, 'h': miss_count, 'i': health, 'j': modifier, 'k': clear_type, 'l': rating, 'm': now}) # recent30 更新 - update_recent30(c, user_id, song_id+str(difficulty), rating) + if health == -1 or int(score) >= 9800000: + update_recent30(c, user_id, song_id+str(difficulty), rating, True) + else: + update_recent30(c, user_id, song_id+str(difficulty), rating, False) # 成绩录入 c.execute('''select score, best_clear_type from best_score where user_id = :a and song_id = :b and difficulty = :c''', { 'a': user_id, 'b': song_id, 'c': difficulty}) @@ -514,38 +534,14 @@ def arc_score_check(user_id, song_id, difficulty, score, shiny_perfect_count, pe return True -def arc_all_post(user_id, scores_data, clearlamps_data): +def arc_all_post(user_id, scores_data, clearlamps_data, clearedsongs_data, unlocklist_data, installid_data, devicemodelname_data, story_data): # 向云端同步,无返回 - # 注意,best_score表不比较,直接覆盖 + conn = sqlite3.connect('./database/arcaea_database.db') c = conn.cursor() - scores = json.loads(scores_data)[""] - clearlamps = json.loads(clearlamps_data)[""] - clear_song_id_difficulty = [] - clear_state = [] - for i in clearlamps: - clear_song_id_difficulty.append(i['song_id']+str(i['difficulty'])) - clear_state.append(i['clear_type']) - - for i in scores: - rating = get_one_ptt(i['song_id'], i['difficulty'], i['score']) - try: - index = clear_song_id_difficulty.index( - i['song_id'] + str(i['difficulty'])) - except: - index = -1 - if index != -1: - clear_type = clear_state[index] - else: - clear_type = 0 - c.execute('''delete from best_score where user_id = :a and song_id = :b and difficulty = :c''', { - 'a': user_id, 'b': i['song_id'], 'c': i['difficulty']}) - c.execute('''insert into best_score values(:a,:b,:c,:d,:e,:f,:g,:h,:i,:j,:k,:l,:m,:n)''', { - 'a': user_id, 'b': i['song_id'], 'c': i['difficulty'], 'd': i['score'], 'e': i['shiny_perfect_count'], 'f': i['perfect_count'], 'g': i['near_count'], 'h': i['miss_count'], 'i': i['health'], 'j': i['modifier'], 'k': i['time_played'], 'l': clear_type, 'm': clear_type, 'n': rating}) - - ptt = get_user_ptt(c, user_id) # 更新PTT - c.execute('''update user set rating_ptt = :a where user_id = :b''', { - 'a': ptt, 'b': user_id}) + c.execute('''delete from user_save where user_id=:a''', {'a': user_id}) + c.execute('''insert into user_save values(:a,:b,:c,:d,:e,:f,:g,:h)''', { + 'a': user_id, 'b': scores_data, 'c': clearlamps_data, 'd': clearedsongs_data, 'e': unlocklist_data, 'f': installid_data, 'g': devicemodelname_data, 'h': story_data}) conn.commit() conn.close() return None @@ -555,40 +551,60 @@ def arc_all_get(user_id): # 从云端同步,返回字典 conn = sqlite3.connect('./database/arcaea_database.db') c = conn.cursor() - c.execute('''select * from best_score where user_id = :a''', - {'a': user_id}) - x = c.fetchall() - song_1 = [] - song_2 = [] - song_3 = [] - if x != []: - for i in x: - if i[11] != 0: - song_1.append({ - "grade": get_song_grade(i[3]), - "difficulty": i[2], - "song_id": i[1] - }) - song_2.append({ - "ct": 0, - "clear_type": i[11], - "difficulty": i[2], - "song_id": i[1] - }) - song_3.append({ - "ct": 0, - "time_played": i[10], - "modifier": i[9], - "health": i[8], - "miss_count": i[7], - "near_count": i[6], - "perfect_count": i[5], - "shiny_perfect_count": i[4], - "score": i[3], - "difficulty": i[2], - "version": 1, - "song_id": i[1] - }) + c.execute('''select * from user_save where user_id=:a''', {'a': user_id}) + x = c.fetchone() + + scores_data = [] + clearlamps_data = [] + clearedsongs_data = [] + # unlocklist_data = [] + installid_data = '' + devicemodelname_data = '' + # story_data = [] + + if x: + scores_data = json.loads(x[1])[""] + clearlamps_data = json.loads(x[2])[""] + clearedsongs_data = json.loads(x[3])[""] + # unlocklist_data = json.loads(x[4])[""] + installid_data = json.loads(x[5])["val"] + devicemodelname_data = json.loads(x[6])["val"] + # story_data = json.loads(x[7])[""] + + # c.execute('''select * from best_score where user_id = :a''', + # {'a': user_id}) + # x = c.fetchall() + # song_1 = [] + # song_2 = [] + # song_3 = [] + # if x != []: + # for i in x: + # if i[11] != 0: + # song_1.append({ + # "grade": get_song_grade(i[3]), + # "difficulty": i[2], + # "song_id": i[1] + # }) + # song_2.append({ + # "ct": 0, + # "clear_type": i[11], + # "difficulty": i[2], + # "song_id": i[1] + # }) + # song_3.append({ + # "ct": 0, + # "time_played": i[10], + # "modifier": i[9], + # "health": i[8], + # "miss_count": i[7], + # "near_count": i[6], + # "perfect_count": i[5], + # "shiny_perfect_count": i[4], + # "score": i[3], + # "difficulty": i[2], + # "version": 1, + # "song_id": i[1] + # }) conn.commit() conn.close() @@ -596,820 +612,854 @@ def arc_all_get(user_id): "user_id": user_id, "story": { "": [{ - "r": True, - "c": True, + "ma": 1, "mi": 1, - "ma": 1 - }, { - "r": True, "c": True, - "mi": 2, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 2, "c": True, - "mi": 3, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 3, "c": True, - "mi": 4, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 4, "c": True, - "mi": 5, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 5, "c": True, - "mi": 6, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 6, "c": True, - "mi": 7, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 7, "c": True, - "mi": 8, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 8, "c": True, - "mi": 9, - "ma": 1 + "r": True }, { - "r": True, + "ma": 1, + "mi": 9, "c": True, - "mi": 1, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 1, "c": True, - "mi": 2, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 2, "c": True, - "mi": 3, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 3, "c": True, - "mi": 4, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 4, "c": True, - "mi": 5, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 5, "c": True, - "mi": 6, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 6, "c": True, - "mi": 7, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 7, "c": True, - "mi": 8, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 8, "c": True, - "mi": 9, - "ma": 2 + "r": True }, { - "r": True, + "ma": 2, + "mi": 9, "c": True, - "mi": 1, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 1, "c": True, - "mi": 2, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 2, "c": True, - "mi": 3, - "ma": 100 + "r": True }, { - "r": True, + "ma": 100, + "mi": 3, "c": True, + "r": True + }, { + "ma": 100, "mi": 4, - "ma": 100 + "c": True, + "r": True + }, { + "ma": 100, + "mi": 5, + "c": True, + "r": True }, { - "r": True, + "ma": 101, + "mi": 1, + "c": True, + "r": True + }, { + "ma": 101, + "mi": 2, "c": True, + "r": True + }, { + "ma": 101, + "mi": 3, + "c": True, + "r": True + }, { + "ma": 101, + "mi": 4, + "c": True, + "r": True + }, { + "ma": 101, "mi": 5, - "ma": 100 + "c": True, + "r": True }, { - "r": True, + "ma": 101, + "mi": 6, "c": True, - "mi": 1, - "ma": 101 + "r": True }, { - "r": True, + "ma": 101, + "mi": 7, "c": True, - "mi": 2, - "ma": 101 + "r": True }, { - "r": True, + "ma": 101, + "mi": 8, "c": True, - "mi": 3, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 1, "c": True, - "mi": 4, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 2, "c": True, - "mi": 5, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 3, "c": True, - "mi": 6, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 4, "c": True, - "mi": 7, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 5, "c": True, - "mi": 8, - "ma": 101 + "r": True }, { - "r": True, + "ma": 3, + "mi": 6, "c": True, - "mi": 1, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 1, "c": True, - "mi": 2, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 2, "c": True, - "mi": 3, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 3, "c": True, - "mi": 4, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 4, "c": True, - "mi": 5, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 5, "c": True, - "mi": 6, - "ma": 3 + "r": True }, { - "r": True, + "ma": 4, + "mi": 6, "c": True, - "mi": 1, - "ma": 4 + "r": True }, { - "r": True, + "ma": 4, + "mi": 7, "c": True, - "mi": 2, - "ma": 4 + "r": True }, { - "r": True, + "ma": 4, + "mi": 8, "c": True, - "mi": 3, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 1, "c": True, - "mi": 4, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 2, "c": True, - "mi": 5, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 3, "c": True, - "mi": 6, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 4, "c": True, - "mi": 7, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 5, "c": True, - "mi": 8, - "ma": 4 + "r": True }, { - "r": True, + "ma": 5, + "mi": 6, "c": True, - "mi": 1, - "ma": 5 + "r": True }, { - "r": True, + "ma": 6, + "mi": 1, "c": True, - "mi": 2, - "ma": 5 + "r": True }, { - "r": True, + "ma": 6, + "mi": 2, "c": True, + "r": True + }, { + "ma": 6, "mi": 3, - "ma": 5 + "c": True, + "r": True }, { - "r": True, + "ma": 7, + "mi": 1, "c": True, - "mi": 4, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 2, "c": True, - "mi": 5, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 3, "c": True, - "mi": 6, - "ma": 5 + "r": True }, { - "r": True, + "ma": 7, + "mi": 4, "c": True, - "mi": 1, - "ma": 6 + "r": True }, { - "r": True, + "ma": 7, + "mi": 5, "c": True, - "mi": 2, - "ma": 6 + "r": True }, { - "r": True, + "ma": 7, + "mi": 6, "c": True, - "mi": 3, - "ma": 6 - }] - }, + "r": True + }]}, "devicemodelname": { - "val": "MopeMope" + "val": devicemodelname_data }, "installid": { - "val": "b5e064cf-1a3f-4e64-9636-fce4accc9011" + # installid_data 这里如果不固定,可能会导致arcaea以为数据一样而不更新 + "val": "0fcec8ed-7b62-48e2-9d61-55041a22b123" }, "unlocklist": { "": [{ - "complete": 1, - "unlock_key": "worldvanquisher|2|0" + "unlock_key": "worldvanquisher|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldvanquisher|1|0" + "unlock_key": "worldvanquisher|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldexecuteme|2|0" + "unlock_key": "worldexecuteme|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "viciousheroism|2|0" + "unlock_key": "viciousheroism|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "vector|2|0" + "unlock_key": "vector|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "valhallazero|2|0" + "unlock_key": "valhallazero|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiferet|1|0" + "unlock_key": "tiferet|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiemedowngently|1|0" + "unlock_key": "tiemedowngently|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|0|101" + "unlock_key": "tempestissimo|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "syro|2|0" + "unlock_key": "syro|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "suomi|1|0" + "unlock_key": "suomi|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "solitarydream|2|0" + "unlock_key": "solitarydream|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "snowwhite|2|0" + "unlock_key": "snowwhite|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "sheriruth|2|0" + "unlock_key": "sheriruth|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "senkyou|2|0" + "unlock_key": "senkyou|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "senkyou|1|0" + "unlock_key": "senkyou|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "scarletlance|2|0" + "unlock_key": "scarletlance|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "scarletlance|1|0" + "unlock_key": "scarletlance|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rugie|2|0" + "unlock_key": "rugie|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rugie|1|0" + "unlock_key": "rugie|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rise|2|0" + "unlock_key": "rise|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "revixy|2|0" + "unlock_key": "revixy|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "reinvent|2|0" + "unlock_key": "reinvent|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "reinvent|1|0" + "unlock_key": "reinvent|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "redandblue|2|0" + "unlock_key": "redandblue|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "redandblue|1|0" + "unlock_key": "redandblue|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rabbitintheblackroom|2|0" + "unlock_key": "rabbitintheblackroom|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rabbitintheblackroom|1|0" + "unlock_key": "rabbitintheblackroom|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "worldexecuteme|1|0" + "unlock_key": "worldexecuteme|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ringedgenesis|2|0" + "unlock_key": "ringedgenesis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "quon|1|0" + "unlock_key": "quon|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "qualia|2|0" + "unlock_key": "qualia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "purgatorium|2|0" + "unlock_key": "purgatorium|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "supernova|2|0" + "unlock_key": "supernova|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|einherjar|2" + "unlock_key": "saikyostronger|2|3|einherjar|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "purgatorium|1|0" + "unlock_key": "purgatorium|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "pragmatism|2|0" + "unlock_key": "pragmatism|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ouroboros|2|0" + "unlock_key": "ouroboros|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ouroboros|1|0" + "unlock_key": "ouroboros|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oracle|1|0" + "unlock_key": "oracle|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "onelastdrive|2|0" + "unlock_key": "onelastdrive|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "onelastdrive|1|0" + "unlock_key": "onelastdrive|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oblivia|2|0" + "unlock_key": "oblivia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "memoryforest|1|0" + "unlock_key": "pragmatism|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "melodyoflove|2|0" + "unlock_key": "nhelv|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|laqryma|2" + "unlock_key": "memoryforest|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "melodyoflove|1|0" + "unlock_key": "melodyoflove|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lucifer|2|0" + "unlock_key": "saikyostronger|2|3|laqryma|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|3|izana|2" + "unlock_key": "melodyoflove|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "halcyon|1|0" + "unlock_key": "lucifer|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "memoryforest|2|0" + "unlock_key": "saikyostronger|2|3|izana|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiemedowngently|2|0" + "unlock_key": "halcyon|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostdesire|1|0" + "unlock_key": "memoryforest|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "viciousheroism|1|0" + "unlock_key": "tiemedowngently|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "flyburg|1|0" + "unlock_key": "lostdesire|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostcivilization|2|0" + "unlock_key": "viciousheroism|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "infinityheaven|1|0" + "unlock_key": "flyburg|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostdesire|2|0" + "unlock_key": "lostcivilization|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ignotus|2|0" + "unlock_key": "infinityheaven|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "harutopia|2|0" + "unlock_key": "lostdesire|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "revixy|1|0" + "unlock_key": "ignotus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aterlbus|1|0" + "unlock_key": "harutopia|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "linearaccelerator|2|0" + "unlock_key": "revixy|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|2|0" + "unlock_key": "aterlbus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|2|0" + "unlock_key": "linearaccelerator|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "linearaccelerator|1|0" + "unlock_key": "guardina|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|1|0" + "unlock_key": "corpssansorganes|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "saikyostronger|2|0" + "unlock_key": "linearaccelerator|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "guardina|0|0" + "unlock_key": "guardina|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "valhallazero|1|0" + "unlock_key": "saikyostronger|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grimheart|1|0" + "unlock_key": "guardina|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blaster|2|0" + "unlock_key": "blaster|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|2|101" + "unlock_key": "grievouslady|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "partyvinyl|2|0" + "unlock_key": "partyvinyl|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "darakunosono|1|0" + "unlock_key": "darakunosono|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|1|101" + "unlock_key": "grievouslady|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "goodtek|1|0" + "unlock_key": "valhallazero|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|3|101" + "unlock_key": "grimheart|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "chronostasis|2|0" + "unlock_key": "ifi|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|2|0" + "unlock_key": "gothiveofra|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "supernova|1|0" + "unlock_key": "tempestissimo|3|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "singularity|2|0" + "unlock_key": "chronostasis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|0|0" + "unlock_key": "gloryroad|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "shadesoflight|1|0" + "unlock_key": "supernova|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "kanagawa|2|0" + "unlock_key": "singularity|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "genesis|1|0" + "unlock_key": "gloryroad|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|1|101" + "unlock_key": "shadesoflight|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "freefall|2|0" + "unlock_key": "kanagawa|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "babaroque|1|0" + "unlock_key": "genesis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "monochromeprincess|2|0" + "unlock_key": "fractureray|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "flyburg|2|0" + "unlock_key": "freefall|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "shadesoflight|2|0" + "unlock_key": "fractureray|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "espebranch|2|0" + "unlock_key": "qualia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "qualia|1|0" + "unlock_key": "etherstrike|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "etherstrike|2|0" + "unlock_key": "etherstrike|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|1|101" + "unlock_key": "syro|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "conflict|1|0" + "unlock_key": "anokumene|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nhelv|1|0" + "unlock_key": "essenceoftwilight|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "etherstrike|1|0" + "unlock_key": "shadesoflight|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "syro|1|0" + "unlock_key": "espebranch|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "anokumene|2|0" + "unlock_key": "snowwhite|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "essenceoftwilight|2|0" + "unlock_key": "partyvinyl|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "snowwhite|1|0" + "unlock_key": "axiumcrisis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "partyvinyl|1|0" + "unlock_key": "ifi|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "axiumcrisis|1|0" + "unlock_key": "tempestissimo|1|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "ifi|2|0" + "unlock_key": "nhelv|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "espebranch|1|0" + "unlock_key": "conflict|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lostcivilization|1|0" + "unlock_key": "espebranch|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "goodtek|2|0" + "unlock_key": "lostcivilization|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dandelion|2|0" + "unlock_key": "goodtek|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "suomi|2|0" + "unlock_key": "dandelion|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dandelion|1|0" + "unlock_key": "suomi|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oblivia|1|0" + "unlock_key": "dandelion|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyberneciacatharsis|1|0" + "unlock_key": "oblivia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "quon|2|0" + "unlock_key": "cyberneciacatharsis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "bookmaker|2|0" + "unlock_key": "quon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "chronostasis|1|0" + "unlock_key": "bookmaker|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "heavensdoor|1|0" + "unlock_key": "chronostasis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tempestissimo|2|101" + "unlock_key": "heavensdoor|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyaegha|2|0" + "unlock_key": "tempestissimo|2|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "axiumcrisis|2|0" + "unlock_key": "cyaegha|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blrink|2|0" + "unlock_key": "axiumcrisis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "rise|1|0" + "unlock_key": "blrink|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyanine|1|0" + "unlock_key": "rise|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ifi|1|0" + "unlock_key": "cyanine|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aterlbus|2|0" + "unlock_key": "corpssansorganes|0|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "dreaminattraction|2|0" + "unlock_key": "vector|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "bookmaker|1|0" + "unlock_key": "infinityheaven|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lucifer|1|0" + "unlock_key": "essenceoftwilight|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "solitarydream|1|0" + "unlock_key": "conflict|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ringedgenesis|1|0" + "unlock_key": "singularity|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|1|0" + "unlock_key": "harutopia|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "vector|1|0" + "unlock_key": "cyberneciacatharsis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "infinityheaven|2|0" + "unlock_key": "oracle|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "essenceoftwilight|1|0" + "unlock_key": "clotho|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "conflict|2|0" + "unlock_key": "ignotus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "singularity|1|0" + "unlock_key": "nirvluce|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "harutopia|1|0" + "unlock_key": "monochromeprincess|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyberneciacatharsis|2|0" + "unlock_key": "lethaeus|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "oracle|2|0" + "unlock_key": "clotho|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "clotho|2|0" + "unlock_key": "aterlbus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "corpssansorganes|0|0" + "unlock_key": "dreaminattraction|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "ignotus|1|0" + "unlock_key": "lucifer|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "monochromeprincess|1|0" + "unlock_key": "solitarydream|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nirvluce|1|0" + "unlock_key": "ringedgenesis|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lethaeus|1|0" + "unlock_key": "corpssansorganes|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "clotho|1|0" + "unlock_key": "buchigireberserker|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blaster|1|0" + "unlock_key": "bookmaker|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|0|101" + "unlock_key": "heavensdoor|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "kanagawa|1|0" + "unlock_key": "genesis|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "darakunosono|2|0" + "unlock_key": "halcyon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "freefall|1|0" + "unlock_key": "blrink|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nirvluce|2|0" + "unlock_key": "grievouslady|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "cyanine|2|0" + "unlock_key": "buchigireberserker|2|3|gothiveofra|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "heavensdoor|2|0" + "unlock_key": "kanagawa|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "genesis|2|0" + "unlock_key": "darakunosono|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "pragmatism|1|0" + "unlock_key": "freefall|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "nhelv|2|0" + "unlock_key": "nirvluce|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "halcyon|2|0" + "unlock_key": "cyanine|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "blrink|1|0" + "unlock_key": "lethaeus|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "fractureray|2|101" + "unlock_key": "sheriruth|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "lethaeus|2|0" + "unlock_key": "babaroque|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "sheriruth|1|0" + "unlock_key": "tiferet|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "babaroque|2|0" + "unlock_key": "grimheart|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "tiferet|2|0" + "unlock_key": "cyaegha|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grimheart|2|0" + "unlock_key": "monochromeprincess|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "cyaegha|1|0" + "unlock_key": "babaroque|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "aiueoon|2|0" + "unlock_key": "flyburg|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gloryroad|1|0" + "unlock_key": "goodtek|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "anokumene|1|0" + "unlock_key": "buchigireberserker|2|3|ouroboros|2", + "complete": 1 }, { - "complete": 1, - "unlock_key": "grievouslady|0|101" + "unlock_key": "fractureray|0|101", + "complete": 100 }, { - "complete": 1, - "unlock_key": "dreaminattraction|1|0" + "unlock_key": "blaster|1|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "buchigireberserker|2|0" + "unlock_key": "gothiveofra|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gothiveofra|2|0" + "unlock_key": "aiueoon|2|0", + "complete": 1 }, { - "complete": 1, - "unlock_key": "gothiveofra|1|0" - } - - ] + "unlock_key": "gloryroad|1|0", + "complete": 1 + }, { + "unlock_key": "anokumene|1|0", + "complete": 1 + }, { + "unlock_key": "dreaminattraction|1|0", + "complete": 1 + }] }, "clearedsongs": { - "": song_1 + "": clearedsongs_data }, "clearlamps": { - "": song_2 + "": clearlamps_data }, "scores": { - "": song_3 + "": scores_data }, "version": { "val": 1 diff --git a/latest version/server/auth.py b/latest version/server/auth.py index 2afe4a4..8404552 100644 --- a/latest version/server/auth.py +++ b/latest version/server/auth.py @@ -82,7 +82,7 @@ def insert_user_char(c, user_id): now = int(time.time() * 1000) c.execute('''insert into user(user_id, name, password, join_date, user_code, rating_ptt, character_id, is_skill_sealed, is_char_uncapped, is_char_uncapped_override, is_hide_rating, favorite_character, max_stamina_notification_enabled, current_map, ticket) - values(:user_id, :name, :password, :join_date, :user_code, 0, 0, 0, 0, 0, 0, -1, 0, '', 114514) + values(:user_id, :name, :password, :join_date, :user_code, 0, 0, 0, 0, 0, 0, -1, 0, '', 0) ''', {'user_code': user_code, 'user_id': user_id, 'join_date': now, 'name': name, 'password': hash_pwd}) c.execute('''insert into recent30(user_id) values(:user_id)''', { 'user_id': user_id}) diff --git a/latest version/server/info.py b/latest version/server/info.py index 93b2aec..403cdfb 100644 --- a/latest version/server/info.py +++ b/latest version/server/info.py @@ -182,7 +182,7 @@ def get_value_0(c, user_id): "max_stamina_ts": 1586274871917, "stamina": 12, "world_unlocks": ["scenery_chap1", "scenery_chap2", "scenery_chap3", "scenery_chap4", "scenery_chap5"], - "world_songs": ["babaroque", "shadesoflight", "kanagawa", "lucifer", "anokumene", "ignotus", "rabbitintheblackroom", "qualia", "redandblue", "bookmaker", "darakunosono", "espebranch", "blacklotus", "givemeanightmare", "vividtheory", "onefr", "gekka", "vexaria3", "infinityheaven3", "fairytale3", "goodtek3", "suomi", "rugie", "faintlight", "harutopia", "goodtek", "dreaminattraction", "syro", "diode", "freefall", "grimheart", "blaster", "cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3"], + "world_songs": ["babaroque", "shadesoflight", "kanagawa", "lucifer", "anokumene", "ignotus", "rabbitintheblackroom", "qualia", "redandblue", "bookmaker", "darakunosono", "espebranch", "blacklotus", "givemeanightmare", "vividtheory", "onefr", "gekka", "vexaria3", "infinityheaven3", "fairytale3", "goodtek3", "suomi", "rugie", "faintlight", "harutopia", "goodtek", "dreaminattraction", "syro", "diode", "freefall", "grimheart", "blaster", "cyberneciacatharsis", "monochromeprincess", "revixy", "vector", "supernova", "nhelv", "purgatorium3", "dement3", "crossover", "guardina", "axiumcrisis", "worldvanquisher", "sheriruth", "pragmatism", "gloryroad", "etherstrike", "corpssansorganes", "lostdesire", "blrink", "essenceoftwilight", "lapis", "solitarydream", "lumia3", "purpleverse"], "singles": get_user_singles(c, user_id), # ["dataerror", "yourvoiceso", "crosssoul", "impurebird", "auxesia", "modelista", "yozakurafubuki", "surrender", "metallicpunisher", "carminescythe", "bethere", "callmyname", "fallensquare", "dropdead", "alexandrite", "astraltale", "phantasia", "empireofwinter", "libertas", "dottodot", "dreadnought", "mirzam", "heavenlycaress", "filament", "avantraze", "battlenoone", "saikyostronger", "izana", "einherjar", "laqryma", "amygdata", "altale", "feelssoright", "scarletcage", "teriqma", "mahoroba", "badtek", "maliciousmischance", "buchigireberserker", "galaxyfriends", "xeraphinite", "xanatos"] "packs": get_user_packs(c, user_id), # ["vs", "extend", "dynamix", "prelude", "core", "yugamu", "omatsuri", "zettai", "mirai", "shiawase", "chunithm", "nijuusei", "groovecoaster", "rei", "tonesphere", "lanota"] diff --git a/latest version/templates/web/changeuserpurchase.html b/latest version/templates/web/changeuserpurchase.html index 95c06e4..e7df2bb 100644 --- a/latest version/templates/web/changeuserpurchase.html +++ b/latest version/templates/web/changeuserpurchase.html @@ -28,7 +28,7 @@

{% block title %}Change user purchase information{% endblock %}



-
+
Edit all the users

对所有单曲和曲包的操作 Operation to all singles and packs: diff --git a/latest version/templates/web/index.html b/latest version/templates/web/index.html index 1f37a2f..cda32c2 100644 --- a/latest version/templates/web/index.html +++ b/latest version/templates/web/index.html @@ -20,6 +20,7 @@

游戏方面 Game


系统方面 System

数据库更新 Update databases

+用户存档更新 Update user saves

歌曲修改 Change the songs

角色修改 Change the characters

购买信息修改 Change the items

diff --git a/latest version/templates/web/updateusersave.html b/latest version/templates/web/updateusersave.html new file mode 100644 index 0000000..ae23463 --- /dev/null +++ b/latest version/templates/web/updateusersave.html @@ -0,0 +1,30 @@ +{% extends 'base.html' %} +{% block header %} +

{% block title %}Update users' saves{% endblock %}

+{% endblock %} + +{% block content %} + +
Update one user's saves to the database
+ + + or
+ + +
+ + + +
+
+
+
Update all users' saves to the database
+
+ + +
这里会将用户上传的存档覆盖到best_score表中,请注意是覆盖,不会进行分数比较。
+
Here you can overlay the saves uploaded by users to best_score table. Please remember that it + is an overlay action, so scores will not be compared.
+ +
+{% endblock %} \ No newline at end of file diff --git a/latest version/web/index.py b/latest version/web/index.py index 101c0a2..be009c3 100644 --- a/latest version/web/index.py +++ b/latest version/web/index.py @@ -402,7 +402,7 @@ def all_character(): def change_character(): # 修改角色数据 skill_ids = ['No_skill', 'gauge_easy', 'note_mirror', 'gauge_hard', 'frag_plus_10_pack_stellights', 'gauge_easy|frag_plus_15_pst&prs', 'gauge_hard|fail_frag_minus_100', 'frag_plus_5_side_light', 'visual_hide_hp', 'frag_plus_5_side_conflict', 'challenge_fullcombo_0gauge', 'gauge_overflow', 'gauge_easy|note_mirror', 'note_mirror', 'visual_tomato_pack_tonesphere', - 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume'] + 'frag_rng_ayu', 'gaugestart_30|gaugegain_70', 'combo_100-frag_1', 'audio_gcemptyhit_pack_groovecoaster', 'gauge_saya', 'gauge_chuni', 'kantandeshou', 'gauge_haruna', 'frags_nono', 'gauge_pandora', 'gauge_regulus', 'omatsuri_daynight', 'sometimes(note_mirror|frag_plus_5)', 'scoreclear_aa|visual_scoregauge', 'gauge_tempest', 'gauge_hard', 'gauge_ilith_summer', 'frags_kou', 'visual_ink', 'shirabe_entry_fee', 'frags_yume', 'note_mirror|visual_hide_far'] return render_template('web/changechar.html', skill_ids=skill_ids) @@ -564,7 +564,6 @@ def edit_user(): '''select user_id from user where name=:a''', {'a': name}) user_id = c.fetchone() - posts = [] if user_id: user_id = user_id[0] @@ -642,7 +641,6 @@ def edit_user_purchase(): '''select user_id from user where name=:a''', {'a': name}) user_id = c.fetchone() - posts = [] if user_id: user_id = user_id[0] @@ -717,11 +715,13 @@ def change_item(): else: orig_price = None if discount_from: - discount_from = int(time.mktime(time.strptime(discount_from, "%Y-%m-%dT%H:%M"))) * 1000 + discount_from = int(time.mktime(time.strptime( + discount_from, "%Y-%m-%dT%H:%M"))) * 1000 else: discount_from = None if discount_to: - discount_to = int(time.mktime(time.strptime(discount_to, "%Y-%m-%dT%H:%M"))) * 1000 + discount_to = int(time.mktime(time.strptime( + discount_to, "%Y-%m-%dT%H:%M"))) * 1000 else: discount_to = None except: @@ -767,3 +767,60 @@ def change_item(): flash(error) return render_template('web/changeitem.html') + + +@bp.route('/updateusersave', methods=['POST', 'GET']) +@login_required +def update_user_save(): + # 将用户存档覆盖到分数表中 + + if request.method == 'GET': + return render_template('web/updateusersave.html') + + error = None + flag = True + name = None + user_code = None + + conn = sqlite3.connect('./database/arcaea_database.db') + c = conn.cursor() + + # 全修改 + if 'name' not in request.form and 'user_code' not in request.form: + flag = False + web.system.update_all_save(c) + flash("全部用户存档同步成功 Successfully update all users' saves.") + + else: + name = request.form['name'] + user_code = request.form['user_code'] + + # 指定修改 + if name or user_code: + + if user_code: + c.execute('''select user_id from user where user_code=:a''', { + 'a': user_code}) + else: + c.execute( + '''select user_id from user where name=:a''', {'a': name}) + + user_id = c.fetchone() + if user_id: + user_id = user_id[0] + web.system.update_one_save(c, user_id) + flash("用户存档同步成功 Successfully update the user's saves.") + + else: + error = '玩家不存在 The player does not exist.' + + else: + if flag: + error = '输入为空 Null Input.' + + conn.commit() + conn.close() + if error: + flash(error) + + return render_template('web/updateusersave.html') diff --git a/latest version/web/system.py b/latest version/web/system.py index d0b2355..5a9b92b 100644 --- a/latest version/web/system.py +++ b/latest version/web/system.py @@ -1,6 +1,8 @@ import os import sqlite3 import time +import json +import server.arcscore def int2b(x): @@ -140,7 +142,7 @@ def update_user_char(c): def update_database(): # 将old数据库不存在数据加入到新数据库上,并删除old数据库 - # 对于arcaea_datebase.db,更新best_score,friend,recent30,user,user_world, user_item并用character数据更新user_char + # 对于arcaea_datebase.db,更新best_score,friend,recent30,user,user_world, user_item, user_save并用character数据更新user_char # 对于arcsong.db,更新songs if os.path.isfile("database/old_arcaea_database.db") and os.path.isfile("database/arcaea_database.db"): conn1 = sqlite3.connect('./database/old_arcaea_database.db') @@ -154,6 +156,7 @@ def update_database(): update_one_table(c1, c2, 'recent30') update_one_table(c1, c2, 'user_world') update_one_table(c1, c2, 'user_item') + update_one_table(c1, c2, 'user_save') update_user_char(c2) @@ -243,3 +246,55 @@ def get_all_item(): conn.commit() conn.close() return re + + +def update_one_save(c, user_id): + # 同步指定用户存档 + # 注意,best_score表不比较,直接覆盖 + + c.execute('''select scores_data, clearlamps_data from user_save where user_id=:a''', { + 'a': user_id}) + x = c.fetchone() + if x: + scores = json.loads(x[0])[""] + clearlamps = json.loads(x[1])[""] + clear_song_id_difficulty = [] + clear_state = [] + for i in clearlamps: + clear_song_id_difficulty.append(i['song_id']+str(i['difficulty'])) + clear_state.append(i['clear_type']) + + for i in scores: + rating = server.arcscore.get_one_ptt( + i['song_id'], i['difficulty'], i['score']) + try: + index = clear_song_id_difficulty.index( + i['song_id'] + str(i['difficulty'])) + except: + index = -1 + if index != -1: + clear_type = clear_state[index] + else: + clear_type = 0 + c.execute('''delete from best_score where user_id=:a and song_id=:b and difficulty=:c''', { + 'a': user_id, 'b': i['song_id'], 'c': i['difficulty']}) + c.execute('''insert into best_score values(:a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l, :m, :n)''', { + 'a': user_id, 'b': i['song_id'], 'c': i['difficulty'], 'd': i['score'], 'e': i['shiny_perfect_count'], 'f': i['perfect_count'], 'g': i['near_count'], 'h': i['miss_count'], 'i': i['health'], 'j': i['modifier'], 'k': i['time_played'], 'l': clear_type, 'm': clear_type, 'n': rating}) + + ptt = server.arcscore.get_user_ptt(c, user_id) # 更新PTT + c.execute('''update user set rating_ptt=:a where user_id=:b''', { + 'a': ptt, 'b': user_id}) + + return + + +def update_all_save(c): + # 同步所有用户存档 + + c.execute('''select user_id from user_save''') + x = c.fetchall() + if x: + for i in x: + update_one_save(c, i[0]) + + return