From ca0e933d95b8d4b2931c94bc362d485ba2901ebd Mon Sep 17 00:00:00 2001 From: Mario Date: Sat, 2 May 2026 23:10:41 +0200 Subject: [PATCH] Weiter am Taskgame gebastelt --- .../migration/V8__lock_game_aufgaben_text.sql | 2 + .../oaa/xxx/games/bdsm/BdsmGameService.class | Bin 13494 -> 13496 bytes .../bdsm/controller/AufgabeController.class | Bin 10355 -> 11857 bytes .../bdsm/controller/BdsmGameController.class | Bin 41501 -> 41511 bytes .../bdsm/controller/FinisherController.class | Bin 9388 -> 10800 bytes .../bdsm/controller/SperreController.class | Bin 9711 -> 10881 bytes .../bdsm/controller/StrafeController.class | Bin 9421 -> 10718 bytes ...CardLockController$AssignTaskRequest.class | Bin 1992 -> 1992 bytes ...LockController$CreateCardLockRequest.class | Bin 5243 -> 5398 bytes .../CardLockController$FreezeRequest.class | Bin 1516 -> 1516 bytes ...ardLockController$ModifyCardsRequest.class | Bin 1911 -> 1911 bytes ...rdLockController$SpeedConfirmRequest.class | Bin 1668 -> 1668 bytes .../cardlock/CardLockController.class | Bin 79591 -> 80631 bytes .../chastity/cardlock/CardLockEntity.class | Bin 5507 -> 5510 bytes .../chastity/cardlock/CardLockService.class | Bin 16258 -> 16445 bytes .../chastity/common/BaseLockEntity.class | Bin 9138 -> 9384 bytes .../chastity/common/BaseLockHelper.class | Bin 0 -> 1349 bytes .../chastity/common/BaseLockService.class | Bin 18157 -> 17745 bytes .../xxx/games/chastity/common/GameState.class | Bin 2245 -> 3573 bytes .../chastity/common/LockGameController.class | Bin 24478 -> 27908 bytes .../chastity/common/LockGameEntity.class | Bin 4760 -> 6861 bytes .../chastity/common/LockGameLockEntity.class | Bin 2859 -> 3197 bytes .../chastity/common/LockGameService$1.class | Bin 0 -> 849 bytes .../chastity/common/LockGameService.class | Bin 12849 -> 18693 bytes .../keyholder/KeyholderOfferController.class | Bin 24586 -> 24832 bytes .../lockee/LockeeInvitationController.class | Bin 16864 -> 17273 bytes .../timelock/TimeLockAdditionalSettings.class | Bin 2158 -> 2294 bytes ...LockController$CreateTimeLockRequest.class | Bin 2595 -> 2731 bytes .../TimeLockController$FreezeRequest.class | Bin 1516 -> 1516 bytes .../timelock/TimeLockController.class | Bin 42920 -> 43619 bytes .../chastity/timelock/TimeLockEntity.class | Bin 5623 -> 5623 bytes .../chastity/timelock/TimeLockService.class | Bin 20968 -> 21656 bytes .../chastity/unlock/TempOpeningReason.class | Bin 1340 -> 1392 bytes .../xxx/games/common/aufgaben/Finisher.class | Bin 4807 -> 5133 bytes .../xxx/games/common/aufgaben/Sperre.class | Bin 5504 -> 5216 bytes .../games/common/entity/FinisherEntity.class | Bin 7469 -> 7856 bytes .../games/common/entity/SperreEntity.class | Bin 8547 -> 8198 bytes bin/main/static/games/aufgaben/aufgaben.html | 86 +++++-- bin/main/static/games/bdsm/neubdsm.html | 1 + bin/main/static/games/chastity/neulock.html | 20 +- bin/main/static/games/chastity/taskgame.html | 240 +++++++++++++++--- .../cardlock/CardLockServiceTest.class | Bin 4015 -> 4016 bytes .../oaa/xxx/games/bdsm/BdsmGameService.java | 12 +- .../bdsm/controller/AufgabeController.java | 22 ++ .../bdsm/controller/BdsmGameController.java | 2 +- .../bdsm/controller/FinisherController.java | 21 ++ .../bdsm/controller/SperreController.java | 30 ++- .../bdsm/controller/StrafeController.java | 21 ++ .../chastity/cardlock/CardLockController.java | 45 ++-- .../chastity/cardlock/CardLockEntity.java | 2 +- .../chastity/cardlock/CardLockService.java | 39 +-- .../games/chastity/common/BaseLockEntity.java | 7 +- .../games/chastity/common/BaseLockHelper.java | 20 ++ .../chastity/common/BaseLockService.java | 25 +- .../xxx/games/chastity/common/GameState.java | 13 +- .../chastity/common/LockGameController.java | 85 +++++-- .../games/chastity/common/LockGameEntity.java | 18 +- .../chastity/common/LockGameLockEntity.java | 2 + .../chastity/common/LockGameService.java | 125 ++++++++- .../keyholder/KeyholderOfferController.java | 10 +- .../lockee/LockeeInvitationController.java | 12 +- .../timelock/TimeLockAdditionalSettings.java | 2 +- .../chastity/timelock/TimeLockController.java | 40 +-- .../chastity/timelock/TimeLockEntity.java | 4 +- .../chastity/timelock/TimeLockService.java | 22 +- .../chastity/unlock/TempOpeningReason.java | 2 +- .../xxx/games/common/aufgaben/Finisher.java | 1 + .../oaa/xxx/games/common/aufgaben/Sperre.java | 3 +- .../games/common/entity/FinisherEntity.java | 4 + .../xxx/games/common/entity/SperreEntity.java | 10 +- .../migration/V8__lock_game_aufgaben_text.sql | 2 + .../static/games/aufgaben/aufgaben.html | 86 +++++-- .../resources/static/games/bdsm/neubdsm.html | 1 + .../static/games/chastity/neulock.html | 20 +- .../static/games/chastity/taskgame.html | 216 ++++++++++++---- .../cardlock/CardLockServiceTest.java | 2 +- 76 files changed, 987 insertions(+), 288 deletions(-) create mode 100644 bin/main/db/migration/V8__lock_game_aufgaben_text.sql create mode 100644 bin/main/de/oaa/xxx/games/chastity/common/BaseLockHelper.class create mode 100644 bin/main/de/oaa/xxx/games/chastity/common/LockGameService$1.class create mode 100644 src/main/java/de/oaa/xxx/games/chastity/common/BaseLockHelper.java create mode 100644 src/main/resources/db/migration/V8__lock_game_aufgaben_text.sql diff --git a/bin/main/db/migration/V8__lock_game_aufgaben_text.sql b/bin/main/db/migration/V8__lock_game_aufgaben_text.sql new file mode 100644 index 0000000..7c9a1a0 --- /dev/null +++ b/bin/main/db/migration/V8__lock_game_aufgaben_text.sql @@ -0,0 +1,2 @@ +ALTER TABLE lock_game + MODIFY COLUMN aufgaben TEXT NULL; diff --git a/bin/main/de/oaa/xxx/games/bdsm/BdsmGameService.class b/bin/main/de/oaa/xxx/games/bdsm/BdsmGameService.class index 6d74e30cb698cb5707255842474686a500231380..1273c5b8275b43d8087241f312c615b64cd71df6 100644 GIT binary patch delta 127 zcmdm%xg&E!tDuN*dTL2PW^%S`S!z*baB6aXUP|%g8Gpo6igKGO|HbO@1V# n24nIGE5n%PaOUO&VJ2oisF92eG8$f*K9e`Hif?Wg)0YDPo53qN delta 113 zcmdmyxh-=;tDvw@dTL2PW^%S`S!z+GZ)RR;N$TX8f-1s7#Teq7FADN9vO(265mJLO b1%#DB%uJw8OE`0Lk}wl9RK?~jF+Vu~VDTsa diff --git a/bin/main/de/oaa/xxx/games/bdsm/controller/AufgabeController.class b/bin/main/de/oaa/xxx/games/bdsm/controller/AufgabeController.class index 6ee5090e5bb6051159536a22e247b8948116c221..6727f3faf76e7dcd081a2f587732b71c220c95a1 100644 GIT binary patch delta 2207 zcmZ`(dvH|c761MAaqsTt=0!+0Hzb<`^Vo%8KnR4Sr~!EdNCo9#;)AZqvMwaM>+U8B zNK=a_DkAWSLao*Z8f|^VL@(LktFN@Rm0~-#we7U(f97DC*Z~c4nbpRdw`AfdBQq$F&NbVuF1UK#q4~3ftGqL{Wty?>< zXjh41Q;m2+rR~Jd|L485rMTHn(7Z1^xHB5QG1A$$--pwzG8kYrQ5=nAI;K7GwW+~m zGD0j1h7@Nts`L2;!xD>HALp`8=S4)p=P?+pN0RWR!tuVufQ`z|-Doh#5MiV*BlH4cl?24q*;b^QU+@6(&7daOsX<7MB>~eR-;j`I6*L-Zj3r z!b9zd!TWhs9h!5Q_qahn6|q8n;4W2NMYGkFz7l0rws{}oDV-;YI+ZN1a~k~G_)z6y zYEN-Q=hN!Nsz&ECd{(_z^?ujsB6Ry?Se`d{FAo=Le6EOxeSC@II>#hIuCKXah{cBz zyCXAWGCfXf!o8V9YL7i|xbHJz`jj{?i|)to5wa#A%{FLk{^luAvrYkG?KZ5!S93_idUg6_LT zJRyh+-F%RciT}u9s`pF1>WylD*^lHNb;je7)T;h)Ivq*te4D6OI|5Y&>AH=H#O}eQ z&Yuzi+oYD%^wBqds>bhLQ~=@zd0Vc9G;t1=$v>sQA%<4ln8tG1mjL`DT+l`TP~Bcv zGi=CB>K)S@$IT4vE_ zYG>KnE!MUv`0Ql_a!UIdUTQI4K+ZL_ES_;-`vgm;;Yck`REk`WSt9#I4xk!w)FUBP zC$R-L<9ehJL0Y^S?8P7sUyhRy>M57!mU*_Tg>ZhWD@^Rg!AmG*M{60@(>= zlCDSCw6%Bf3pnJc^X$Oy1VBAr<4XKW$X$+SCBv`bmO~G+T)Y}SkZ-Pm>tCqWar$E{ z(Xo%82)tok2X)TXxk?QJp<%S3|{c z)SgKEQanysH_xAfF+aNVo1sGxCpOi5OaN3~O*)6*bmYAHr`1&F>|+Ojf~! z-|%kx0-=(Jc#qoDSW_Xt7_r#MFOk(|!86a|eG@#U?rCfomODPN zIiHjG>3J0Sh4syFawn)g57J^bnb delta 1114 zcmY*XO;DRv6g?*)->V zR&BLveg3rm)w*!TamK;oAi)`zE*z)YaU2&qQ@eAkF5EfZL|nLe_uPBVJMZ52-mSxb z?koQ0@71pWbn}DHif@!VjgjO;GMgk0MD*_#k9K)F^&gd=8dZwb4C;?OVLKU846|0> z@+6IV#Rf+77H?Z?lVUTnggr4loSe!gM~d0Pn921-*?3|$5t~S)Mq@p5d2%eBQoLJV z_m&y0if!DeSG^rYn-n+ezr49^TNJl)8)1%RdM2l`^Mp0hc+lkb|Ey-RV-vCN>FLD$ z-my%!m|duGLUX6$z3kCH`Wo#P_A2h?9&Pxejz0FA+)KFiO~2cwct0P|1ODE-tmt;K zj}I#B=0ik#LwI4Cm*GBFsK=bTMzN@Qb)i}V_0#7N!?r3 zfJw zus+GB^p)VRfrPG z`_Lx7Br+iy*{v_-udY7nLD~!{z)LHAc*$nab=}XPENBuc;TF~@4LW9c;46L#S zSZ3V{8*`W;7W;3&8(n5Jn&Sp5Rv7=c49cggM*~}6gX?#|iC< z)-1HM0~Xv7Ud|mgWzTxSHsS{f7F@@NVzMER*@-fVKS|XpaewpIP|Z2sLtKUPOLh%@ z!R|#V>>yUT3&`<4i=cgZwBI7j!$iNd`o9hBi!xrlR0k|r6xX6c!y(uO&!QYB;lmv2 zFpn5cVWZ@6oW?Gk(Z5A&s*m6o>E^a*D|bq*{)@&MU}y+$@zIH#hW#vv>iD!7+4sX7#JA3C&$dT zV|2gBpZQ)j0cdoal{WHQM!bTTP0m;u#@K~%EzFrNqVI2f8)dYPv)Ffyh9 ac{~h^Ad$&>b1WH+C-=`$+1xW{A}avvjUy-k delta 119 zcmZ2}glX;(rVXM|!b0h(B>|bq*{)@&MU}ppd8H+(n>C}f9XaC}m>HND7#Nx+$IiB# zJb!kYu|1O1CeIz{r>a-q6}=bs1A&S$^v`DOl`2ZMM+$M5iaqHx4W_ZkzEeeqZ# zGQQ84nvN!oA<>8Gc8!H+!i}+Te57%EA`vsf@iq_U@urSH;w`aAeYmGT^dXLQ{Vu#s z6n94BQT0xKvGdP5&fqU9x8Rz>zv=ipMhRPDoNz=Ele0vRYPGj2@2bLU^BYY~yE<(+)}0lMKg)5)-CI?3tz0NsY*s>`buBM-l}qSzU2&tLr!I-8wz=3J$UV z9~?GpQLhvP)yrN@z3ukJ#3LVMw$2>p5=9f?aib#8RDI)g}?1P^;y$Wk3amJxxg zQ|d^>Vn!q#O~eHz;Y=l_lM&(4IbxBjb`tzE;^4J7D4a{tdW=*mJYsn92)F3m%2xH9 zZ>!@YI+Il-gceQRG%=Z$mavEF_6vNJnJIPY+`(=WXF6$wCy0`eI_WPf z;7*;p*du+EHd2yurL;o3&)0ObG<8&%Hrl-0!@U}BmIA!r56e*+g;)uub02R}hQBM% zfvu)_zm9Djpp?af+x>Q>8U_ovE{(ffhRNS%DS{V4BK&jf$fb2txsJ<>t<>l~ty>*R?%8XkUvpVat}1bF|xM&mPyal_0V84A~|a|-=~N(A+@2TT>YZdrG6c3Q?q)BnkXsHd(g#`gqxM2or%e)QKz0P3F@c3 z{0tw}_z2OgjyQbk)shMqD|sr{O{G}6nP|wk}^048|pBso~sHCzl#vEWChXv1NAcJ zh+V(@8g2zs_$L}gr^|DL4W=?Bk#Ye(B`0Lb&I=|~f!AyUGuV9*^F8Z-2z?PRE@6j2 zm4yDayFqQM2+Uo;{NOpf*Xjs37I8U4nHw^61sr0d&Qk|6_>s9{UIst0gjE^*)DrSD zc-0aLGI-q*d_q&eae;+{;!yMwJm&N?oQo_z$C3mBgn@P zDqsjz!?+$J=)x%WAc{VW$?iB}@|ng2?nPW)o&-)}65qlUmXNfl-n2}^6{=rYp*kN6 zEXVhS)*3v)3ds3(34RFgiqe6La`+xNE}=rh{3VoYNL&^aSsKiDT6Ch25q23|I4$4H z66*i99apwB%%E0+W>El0fmn&&E0yh&%4&d9)K%)Os_Hwq+A5jJ(O`zv1LwI`=x6;R z8<$(GNBT|}ZC<~`&C+>nTj@Nrhib8w8&^8eZ>4`1$}x+zxLdmE5L$4Lnp#~ocRgdKjmIX;~wPhD1ixrWPx4Fr3co5| aB|&j{icj+!f@2IF{HD{5ZkeBPy8jEdlo`eV delta 1260 zcmY*Y%Trr*6#l-O$IauW0RnlEknl`GKuRnq*0uy}E4J8DX%Sk42q}ezXF_M#*t&8Y zm%njF{STaRf#Og?XOxXP((#LdU-6q7@ix{F ze;D`^e-YNq)KqqK?6iX# z%{onlN8R>$LIy1uCmb``!eBO^&&*_oGeG8tPqN@o1&NDtZWgHh+A6 zsjxHBYyN~yqtpwtPHp+y z>`^x8tS5ZxM!;t=*vKYj51e$F(Bov3F$2AftMR~*P?W6(laO|;g~d{CC)?Sf^D*L} zdR6zA+doT}Bss{=jk^Imtxp>4;Zy2CFl~KWM#>{9UAtyYvtMVQ+Nn+OnTu;e@znBrX`3Dy6$@@F>s+KYHY!^j8lR(+c+;(HUe@Iw)^#Jc#I;Fq@>F7;JYd*>=H;RePL5MAqD9yFm@ zB*}Nd5BD$(3b3|KvaLv~K%-+HTB%SAV$}8_dZh#~g*r?lhAiT^j4sTm-B^94iwC6i zj@YH}j809}$Aj11aEs;(v6zGoB|n9cEV6=l8_rv-9=%ELx+r|aHfw<*Bbsp1Y>_RR zJPBe@Q2jqZ8fg$^n^vBlxjelF*rY%XHJC>&7Gz$F=zwbpheXkZWt_l@`Yc`_N#T~D zDgE_cp@K>3Juai_LWn6IQhFj9l=~7*33*CrX$rR1O+K;3!z!I<@yWgHoBQ_7E;0A2 zR}%i~3+25T?O=RDT2ml%PaE2!~uZMiF^A+FwavwE%KoF$m%&P w_Vav^qh;=8h~^+sJ$ z@Oj|@qNsSFV01}9(b|fwZM6rj)mlqiZLK{#df0=C^S)iuSbxngzc=%}H#2YE{AcF9 z{b=r0-Hz8jKYSEG3mrM=u-R>GSR=3&KDplBZueuZh5+F#xx-p1KeoH<>o842kkBMa zXR0YZ^KN{r!4S;6B_h9~RTByRk>Z1M-BJV}1}1$=Xy; z*29F9hE3kSEe`C)qXPTznB1M(Wq$(uH9Sd}EO)qSL~F$B>rP4e4xZ_ES{X~ z!G{8Wz#j=YEV)o080_}@0=;V&=<6chpw1R@$~z<`=j#xn$EQWhsAyPr5^JBKH$YFzCo(WdG}N;*eSF6AW-`@gQpw&KEsAJvO8 zLF5)xK!t?70nb{!E#U9-mo{|=kpS*p+F?q%Tc!W8{w8U*|VK@IAEqJg3h9;a&vZhhKar==xq8r zOL=;G^}(>r(29*-b;6P^Kgce(P8ZZf=gN$nv)tziI$xo0ONi=y4r-w`jaudMocw|d zusqSkI`vS<)30-1pjm=u(;Rtg&N^N1VQ zQa&4s)pEC>MYLExmRoHzQ;(pfv`oI8TW4KPD>YgnMP8BlQu4^!yxFN1oa3bB)F&{5 zbQ#TSE?Q3gf>x_=S;GMpMklQypGKUsjmchIU>+dGmt=N{ym~35JCg#lkG;s$pwE2U)k#ts31TmlRf-x6=-J zb>WG5H>YF1gVX2^K|uLf1o6Z!d=v}vd2B^GkJFKZCKTaZ zRNy@RI-kcGn9Zx*dBivA*w6N>&Oj^8T!`#AnoA7$o~IR08+ z!;FG3j(@1V>i-Mfzj@#PFhGPc7|i2fxR_y>j}m^wG;)NRIruZN2%T8W+!8G3D_+M^ z3}6`|9Lp^{b0b#ZcC6&L$EAoW7-|v`7=vLSCSw6dh@)ZvVq()9jNm6i&7CxdLtUbA zk5-Ykn^*yfV3QeDr-MzFv0yJ^bM?zWAxc35%L?L&Mo<*>Ay!Ufm|kQrRJk1gO01J* zkc@R*oUHTe|8FfEL9FKxIi_=tkB~D?>26DXoU+{(4)9%viSw6nQeRZWKyi^USIkfu zObKISFr^Hd!IUv-26G0ZWH4tkZf?sFD(_*<3L{sj;!#*fXyPHNPU3gE_P&bRg~;SX z>O8JODWd%x_0?QCUM`b0xQHLs-SDB80rSDnkOjDS2C)_Eu$@a_C%>8>M3@UA!jHY7 zaYb}|487w?^fK`>)p5a?c;x`qb2*uLk8KQ)Dk4=f7r}DLNt7~-2AH8!{2WiwKpF|2 z<3dsZn|ZKdFaMunQ(sxOj4f;YN>|yyWv8-%Xp-Dhnr)&6Syw(`Wus9%3fi7HO5MDwUZE_F~RJFCuU1@&vJo%BpK1e5w9z~+pGK=V}c;Z2@3Go4?145D_FE+US# zQ-OSlx(@KfLT)Cs1Q?}DOw3)TxLy+vtN0zrPP0OEoCY8COrG_caDc5Q+UA+CF@GJ` z>-8vPNGsTn2KHnse^0|r+$&=Spk)b9#sHmfbUPavB0sv-a8fm3AeFABYnZA%Q($t=;I}bd%O57X&ZzxDeso>WqV*x#N;fFRXaYCV zO`IVy7Hs5vxs8P+-AQ-R{hT(tjPE`42<19k$xP0CjwK761SM delta 2979 zcmZuzd3@B>5&zC!zdhdOB%8||Kp;2aiUJV~NjU-uB?m`9kd^!hOP1YacM~q-f&wCf zLY_UKQnXsNtyVDhXM)vg3$fLDw6-3-#M;9aDs8Q`2hz^_CFTRR|NQ3do9~-9GvAqc zyKC8n#qJj_oq7hqTsm~p?R4p_*d)+_Ai>+N$C^9!NJO9Ctw#tcMaA`-{5}4P?pPpL zQ6GrLsyqmxQ$v`LaHU3|3w%TiMCWbpjBO)Wi;7pdQHz*BH+p22tIo9*i#4!nnmp_% zOfRSjw{5HG4g}luhzC1Rso^FSaiI zbF08^>>=2qf$h3^ZJoOIHi3P(UB=xD9d`&EKv2Hq&T!l*a2F2AbM8u4AMVy538m&0 z=RLwH(2UO!j!DWNFV7}va<6Ag(ia52h(=}J-=jNmRC+~mRUhsVIEIY`&!{tXZEo~o zwFmd&D;n-2B!wgG717{^>6p?uM;UPk;O!j5S5^t$p;A{B0 z{7CpyA0gN)b_Cjb-FOh+6nG3LWQVue^*El;&`+3Ro_X7wZT%Ju`LTC}YXGM-3=&F4 zG%0NDDSTTVNXTcg7? zZ{c-jF{;N}^sO;BTJdv%UtkUM&5<_gLERtKhgE&}mB8Byp1|-=sooLzHQtpUB$wy^ zR^WGN8?LT~K&U&WhiU>*m8|y!{=lH>lri(q37l6TC*M-9_vk^Te_!AN-sMfUKeE}1 zzX<#l9}uz`*`jamToww3*LT$D8^RG?-kmZow+|l*{2d=L#0=w8ke5>?wER=xU&=<- z6*lH>i0P3gy{kJA(aqdk6!=)#$-2VM|G@qu2t+b9wJ5KTtb%Mrgk(NbqldzJEYKd) zTf*C-PIAaqsoBnZi7V}Xa>?G*N$DOz0zCvvxP#zm2jB^&5d12^k~%Iu5;be1VIz2PzKUxI*J9AaMwPZ-e06q#V1D0IWRX8 z@o!VZz)h2o!!1Zt1x=&ra(6~?iiNHgbPdhmhKcFX7$IL)+kI(EIirE~{+M3np;>gT zMpcA#*_)Ye7c`sZNJr*^WGiMWoVfwo-jY&^$E(9I>#v z-$M(iPNRkLL}sOR5iRb2FVjxWK57!wOfB-mtl6&RoL*W%m@Qv%q{*e(e%ESRqtW$* z0-iHt9n6cMwf*m8*OOxt1vToB({c)}n<*sM@0wvs3pHL|rJPM{0xqXjG4Cv|ldCFR>jU9}<)4$N=_^oGpzT*l*zAlG3vB0UVxX zV{5sYwn2Q}f)$U$mvY4MG_0-GOq+o(HMiQ7{Bm=vU0v8bh~ria;HxR$Fz~4DGMs^v z2A&+i)5EuLbT(x0w+2c4orN@1p#s-p2Ij=kfa}nRYOG@QM)lZW9(pk!d$0h9u@D9p z;Z@Y(H7v%PEHl}}^x>4D02BBZClAlzyCAl80N=xDSlGh#ID;Wr*-i_d$M@NVA23od zYFPII>t4h(zyn)_^CHG-=*`4L#@LC?fq_57OMFo=uPt~Pr7RP8_Z2yzpfJ9UkK1_X zG-sE2D`3IA<*;Dhd@K}UO8h^^%J)GmXw=py*h}6%x5_tT4~@lCD$5wL&={R z_@$D5180@|jSR>jZ$@*O*U~BIddjy7B;`jBuLQ#@USdmHgYw7JQNu&3m?ER zA>?Imh6(Xn*eS(`gBvkH4ipx|6V05eNLvj`T5*cT00w0Y&{e}RHgG+c8I)HxNChhN zqLI**FB4Hn`OK)QQlD8|8&1e(`m@^v9oRPvSf-g>`RK|s(f?%iG zH8yxzHCfcZ7CvoO6O|*8VQ(;8*=sBvg5Z)cJKOUVO=^9TCZAx6rVvh1CHSAgObf5B zQ>$tVe`>kb%dR{SpR7i~IF4?<1t-|*aLK;9_qw@-A{Fg9-Q{ro7YFC8r2qf` diff --git a/bin/main/de/oaa/xxx/games/bdsm/controller/StrafeController.class b/bin/main/de/oaa/xxx/games/bdsm/controller/StrafeController.class index 2bf396ff49934555fd5a038efea88bfe96a9b8d5..d4eb608f050296f1a855274b1e83227a66de454e 100644 GIT binary patch delta 2148 zcmZWqYj9L&8GfGKv*#qcCuDQm?1gLsxv&etTnd&;NuepE5dsEC5KwX1Y{EjayWQO& zfzq`=3vJYveoBi~+jv83Ra%@S8%At9j*hp{8UHw5D$aEL>Db~=+u5O+tS>JiV{f)&@~rbgYMi&%0rc0ATK zolj17jf@Q5Z_>aK!kvw!#?n)kMdDd$(oGNH$tCi87B3{~B0JulyfHdzMOT?z!fHVw z(f^BL9U~TsXmqqzkk**2WgXEt6+4#bPp9Is{Jv!Vh-kTdES1j@9V%1RP_VC=jHM>J zE>wq&!hnH|Yo-twOF;3UH)n{k40q{rP1 za+!%BmlJ{iuBbmfIhly(lj&506h`Q|^mH~ZOzIOhrD~*ZyTPc*m0YE+)V0<)xZ31< z*d-CMcs!BGs~V%};$J-KmgZG;^{sl3$zI;2?y0}4cdg0yVv?vRM<&MHT*nOt*Z&*1 zUG3Hr)-i&>tlSAC8{@f6)aPs{ohq+rd`#SZ#95pzihJ8z&`}hHs@eO!2toLv)51QD_4-)It z6RwrY@GS{j)(@LJWKpK)(-xH;#uztvnCMn>)qZs^{VtPZOkCUDXi%RtImMJZu2``Vj`6MqIe2Qp$XC{)VL&dZ!YuXZtSQTUcWqAo41^<5#%!Bi@d z?VpV0a*3S5uM_QRIMn!blc9baG~_vcg9w)`2k5?bu<3cN5P=I(`3^X68>?hp0%BDD zRv!d&_$Ru=W<7dzTgDuEPz~@EXp#r~c;&YdUR6S`11w_atC$_?`~l2){IG-vh^w7N zyuEXE5z{5e*m%e0P+h~z^C*-sCGHz2%uZUmSN@EeXY{g&1A8aL1#GeA%4F>m1=F;!OZ7o-z&$H<|TZ(wg zf*sIGc(UNYzIptu3`Yub!Y^_gYDC6Si!n4Kfi{ez4-*)`5$r+|BRDGFW0;hmX-wf^ zq;MW-JcSG{<3RzP#p}o+Ag8P;6D4P~%T6d03U>>awJ5O_h1Z1nHe6vFz9W|p;2i#e z*M!~gN$4(Ux6y21_BO%>a(CnwmjN2o#3lxjaEhqFbMkvfPWnH$6!8^GEFF>tgOuzYo_H@PeRmN?f1a;UZVqO|~}si;V1BV5jtk-Sb>i=5FW} z_=M%VJ4?LBiFs~bq?B?-2Uc*MoMut$v+0;YSm3O{DMauP*5b5HRZICs;iIq2RUZ~` zL%52-$9~=~1zNNS$_YabT&!k6Ob%SYt>sJSq?5G3oJH zDdN1$&4vFIqH?YN=5c&iu)QuxK3Rcb+~kB5v=&P_&Lir@)|Q}re8eKJ3ca#gd{wM0 z^4L7n>dn@UMtSs$?)w(qRpQR8Wo`b#Ir}!#PO9PzPfD`IkP8maW zJS~lXSiq9r`$r_ETgKvo_#fxT`3Wi+gHPG}XZTru-qv2=7x^Vy`!c`6ukve> a6$(nqi+qXS6dWn^^ILi)24%gfSN;pArOosJ delta 1104 zcmY*X%~M--6g?*&@8#nMNlOzR2_yl8e2_{@i)}?H6x&J*BKAwD)u!-BK?pPnwX{}> zGj7~C&TrL)WBm`XC=#5hj^ns+#_70n<2de|amLZLAJv=GjjMa^x#!(`?)|+V&wM-L z`{vQk0{}x@|HwDipzno7O#Gt=QvV)m_mECS7u`A4!+h>~u6w0Cx6nOQEap~6=SpQC6KL_{CZAC3 zV5g2*X^(>`#WXW|+{zkRK525VUbmW^-Q1_|Sto-|9Pu;D0}6vYNF3JhxHI~YRUfOe zPbnV44Zzy((=PNa1LD(4G@3nNV5Gh{;r_Mfy~EW`Q zg&jJ8EgIYORj^2GjNL~#yT!U}g}a^DX818J4S-H0Sq~>H!C@Hz%pe9ENz5XJJbH0e zzn^T~)x?O5{z~dHIB&9EKTJl}q6i4{y;PhMC%V3d>Z-7rxC{ShOiX^twhbZLi5(_^ z3cDPF_E(WOuCSLF6IcKLKo)5e@~{IN($rP6)&`H@MTAg56iev9GP+TB4F`qjMG+@Z z(krRf_y9f^H(!c4EKxk+0guY2y=dkD2lXeZL`2?Pn5y$0iPbB3GFu$p=1Kiqs$z4qREK%vea{&p*SZ4MEgT2&Kbj#K^fho-LCR0KEDMDF6Tf delta 35 kcmX@Xe}aF*5mqLa|C5ig8iJ^w5K4#5h>>A)JX;7h5q+RUa!ElZxm-$G9aeOj1SPNHD3KK?v?P*}HlnD5ha5Ui0`87Uh)ZA% zU}e(rnLEzm+}CeNRpP3kQl$_10r^p>ycsOGSP(+2Dpfx8&VhN|Jv}|sZ~y(DC;tL) z4S()OkA~ZIQE@G+vbD8US+h2UU#YEIeqaaNm73+%8*Xi*GR@8$JJYTccy6O1ywlU3 zumTZ(cp%wH=WJlk0_H4JQs?RB?N z7apO}f>vNRDoab%8GhEK141nM!mCnKDH_g*z_J_uvhCZe4Qkd_xYBm)z_uFFC%;?Q zob3nF)PlX{SV7Ap;I7m< zcygUptF<;;4TkF;5p=ESuerXmaJMPsWMIpHl_Q06P+|P7#thdi zazwR9*SFVfN3_?^v^*=YT_fM@(9j!LzVzeOXNZA&uy9Xj@F7>l*3dmAUOT=A-oVT{P$S9KJzPxh|p z7?qA4iBTCDD%ZWHql7WpyQbqnq-9#iL5xsaj8)P2Uste`6ih#<@P>{<*e`pxbR3S{ z`nrxIQEyJiQEB8HjXeEcca*A3lgjSuIEEKBn7P3GG?RKB=s1oq$ljuk6VdT5>o^(3 z;B_6Rqf>sjXL&lOoJrZnyKq(ANZop=*f z2}+Mw5)%f zv8-u-dk&#})(0&kka6Ii*Gc5L)CoG@sMv6KtUmW!^nX9GLF~bXjx{vYldwzzbw>p2 zZvCF+v1SIsD5?+hR>3jWIK=D4N-|!-?E%~L-?oXTz8|@G!w_)b(hrcY^+6?Pm?`!)>8|uT`1#D~Dq~yKk4#73$WsA9Nd(h2f z%_N64Qv}mY5lM45jWlNvtv z=PLYu{EBSn>Gvx!I53Yj`n#DeF>{$m9j{q|vurKj2*S z9|{*pCHAmTmdL?KI@v2q+NfHRM%9ums+Nq7t6yNh2SZ#({-);1-c(EOrdo0{)smU1 zmb^^0Bvw24GV!EWYM$guwWL<6B~wx@nT~47b5u)~qgrwtwuh*z7pM7qhNClVHMYIR zKXCT%?DSxqzkO=*Jxr(>aMTZjziG&19%LXBay}0-h)RZ)3xCaVOvfv9I*RU>b~$)4 zZSDQUo`&(23~QJ2AjM1vFQ*+$S{coRn0b&AzLw$GRNAo*5_>t2xtFVXkb{|!>v@nv ziD1v{3ifOo`eDMs!3IYK!~IYv27IYBu|IYsG(!`~jbXtI5UVSI;p4O@5@-^F`) zA0OaDe1wnjJ$xTOzz^{w{1`vMPw@$UhM(gX_$6^gYS8d0eodRd!SC<~l<`NU_f!0d z?I-jrDrQkBiwap(#=47GT*71lipp11yrR+-6|U~G6&0fs8pHy EFS5q_!vFvP literal 5243 zcmb_fYggRX72U#y8L%8+0ORo^)UMrtOfpHFIF98<3D^M#YzmmRq-`o@Za_vzMAA6W z=H2v}=G7$M@)PnQSu0vu%OCOs`lGtK@70LW3_`8f;=`GHb#?bS=N_GN&z^t(=i!e4 zCh%1O9U5M#iHc`gmF?~A%9^z)f=YGW3PL;FsZ=e$=6KbO$|NVVoJ@Ld=zESM{Bx7O zutJf%SP*a2MGzKnSVP}^>w#5qEO)K4AgZ2U({R|OVhyF)=Bvffx7{^UL-&T*S@)cp z@Cl7K)I-~;+`Bh3#n-xYK!|&R@MoxLFn*j8p=CS4vK`o~4mE2l+-bXZXj_i-DQML- zYX_k;wP>%oR#^9mxREj?UtgX5KjU!It#6vwsjYX*u5R3XApD&<+pUMxIgmQvj2ntI z;mdtiwOZe-I}F!65p=B-tb1=Rh)s(gyK4=9`{jlpyt^gjVra{Nm1BkSp~CoE&J_17 z@ri0rt?#Vau4wF^s{2-Gdv5FsZIoMHCvMs_p`kOh0_n%)M~H!fRF()-hadF$#cf{% z%fh!`x2wvyhN3)z%oHBG?#gd9>D9z6{iL~~)G^0r4MtA1o0jBWo>Z?k(r#&Ii`W-) zu+n0(TSja*V zwH&=zfWT^}+(VFEfTfQxylf^_`Goz)J3pxrY%Gr}Tx>3|{Xmo5vK0mFa2S=D8 zEx<lnn4oc&zKu~^GXI)>4&;Yxy4(fD6Q*GvN@oK$#I$8j8$vzK+8h~1jeaWbC0qT`e_ zGEO7=S8`LS$}Oqvj*ioKoF~i$<|mfa^9vm#_=%h?>NpdB-g`REN~emU7w1xm7w@lh zEaTT2tkE1ttB-p1nwg1PIFEt3E+o;fgT-3Q)=sKmRcEw|=~;M}a|ZPd5S)VFS_QWft8PHTDhp1W}#*qMKs%}pt+X_ntN!V z*}~-7h+gZyaT=5NB*VO$-dM`?xjX@D>af?sgb-&jU-09_%iXNM{1qqNR6aMY9!N9 zBbkaC$y3xwmcntEIy&)F{+{F0d5#*#PUCx=|CW;uJi*^CwfGiB)e87jz!-nqAx0jg zI}k+1mp`#IQ8AFdnm^RA25pEmhz6f(hxj(|ZQ7%PTFvAZM=hb@gCmC2lx{{#GmmO{1t!0-|-KkO2ljU2p`khC-@Bi zLK$Butsmh_jvvyixC_NSDDFUU|7q<$N$-)JBkntK*NJ;h+;Lj_P26qbUK4kkxX;90 KChjq+!~7QtzT4LT diff --git a/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$FreezeRequest.class b/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$FreezeRequest.class index e3b467af51c952cdedfa467fb68b6ecac122f7e1..6989bb8137a0987ade002f6d44d74c1466a291a0 100644 GIT binary patch delta 14 WcmaFE{f2wPHWtQ88 delta 14 WcmaFE{f2wPHWtPco42!=G6DcG{RPGV diff --git a/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$ModifyCardsRequest.class b/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$ModifyCardsRequest.class index ee9f4778347e497271da3849caad12d847e24fb7..056d2a64c378a1299c99c89acdce73c8ada0c3e8 100644 GIT binary patch delta 20 ccmey)_nmLUTUN%p$?sT=80$7GvV}1M0AA|{lmGw# delta 20 ccmey)_nmLUTUN%>$?sT=7)v)RvV}1M0A5K4f&c&j diff --git a/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$SpeedConfirmRequest.class b/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockController$SpeedConfirmRequest.class index 4a66943e908f0a5457ee18c50e6473a02dd0c9a6..ace8387f084e422a7abb5af0d2ca91642ca3914f 100644 GIT binary patch delta 20 bcmZqSZQLcLc|{ElFe(Y>hLfR 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 diff --git a/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.class b/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.class index c2e2603419070aff1faf95ac1d9ef7131271ebec..945b55568f5ca9928b640ab907998456bdf9e231 100644 GIT binary patch delta 82 zcmZqHZqwedj8RaaATv4JwJf!$GB`CkKQE`v>OITI`C5ka6lGs)F E0Hrb=a{vGU diff --git a/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockService.class b/bin/main/de/oaa/xxx/games/chastity/cardlock/CardLockService.class index cc03d99187a8e594ce743b75ed3b6474a0be72e5..2677c8d1052b136dede8015d94c73ec55015992d 100644 GIT binary patch delta 5684 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 delta 5444 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 ITC?f@2J_q-4gdfE diff --git a/bin/main/de/oaa/xxx/games/chastity/common/BaseLockEntity.class b/bin/main/de/oaa/xxx/games/chastity/common/BaseLockEntity.class index c19966356d6ca0935df09d2c9b30ea3f5f5e3d27..166de8c3b07e839f67a6b0978d4ca87c8287d7c5 100644 GIT binary patch literal 9384 zcmb7|{eN6V6^GAF+oVZv(>8B?NlT%&Gz~2af_+P=rcGMbZdy#zh(W10yVK-0yLZFA zcVkmUP!vT`QG7vB6h%Qr1*D>=_>PM2@9+L8e*B)9+0EVTW@q>z*?VWsJagvEIcLt? zm;U$s3q&+X|81crhf+C_Dtcb(;>C-pX|EunRCdOTVn1F;Ws8MEF-RTrB9SR(XNLoB zZK0J8t-s*Sd#St^OsCFFT@cyWq2@e9(mC{HWM?V%^Qp6E(?bIeZ5}OQY(Y%;kw29e zgF#S?z1S}XkwcpxKI?_Cmzon{PT_;5#LN6A%2`^s~5L+F^{64*4 z7=ii57v^}xO4iGvt#$dwi}_L^V5tD+aHvDAM=o|O4*g)7=L|~uyoa@{fGJ6@UO>8a zRxHdE^EnYhC>Bx7mUGCNbf_y7ca;24L=z(P&-+3GJW&cu}I z080}g=4@LObjZyXgE%ba^SmU74rP|#My8jgQ>@PM#87artZRnhpj1$HhRCXUwzWf7 zEGw!l+dMWtnm&D!4IaKJSmg1rk5XfK6M|f#R9a_=1X9COP zz-*%xbljy^(`#C3m`=9P35WWYk2qdeB)5e%cIjq14DRUQ>7g?tt;iOyb?Fct=BJEH zN2r^hPP=rJx*b}Vfxn+F6{bWu&IyJS5J$;`7yA6J8&}3NK78r=26n5PzS(@!Lhh2X z{NBDj4H(rc!Qi!Hv6r14@#eH1t$=Y(;mqFwR88*h)ww?%%-6~O9hrQwFjbsQRkHd3 z8{;;YR#CGBlicaM)Wv(y<45c&OLH}g&m;GNOUFgF-v{cr2{O* zp~8B~yu ziePmzZjBbxOK0EG?85nZ{fLNXin&|75P1S88_e8-K`Lu>>mkXc!Gp?JuGm~iR~EsC z3;Rg9Zd=(m$?_Y~ST7?W51^+u5A-DGEvEqnt*sJA(Br*2=#TU@NXLz1o+sedBw~H5 zR-{g-SF6L(gaE2EbO|_MkfYgpz zDVX*(GRBfqyKI6)5IfY1nJaEz8@uSOgrxHCiVPP|o09$2A=@@qEQMKd!spthv-S$FbnhRdr?4!3^$Lv4^W9M(i@l=*x>chO0|v z_}uv5vCObTT+GzoOox1~W(z*b^^jG}{ENA(z(TwTVj~EwTo`Yw@>!k~W|N)ldBnR6n|de-#BqPkmvO zIyJ&5V`|z^z|^#%^w4cR&}S>2w+Xs}wo5IqOk<@@TxZmbLxoY(hN7aT4aGxE8|s9b zHWUXnZKwun+Hj87wBZ1+X~Ss?%~R6+*U8=K!u$1*du5hxkgK~fqF12}hi}bj9JRWw zykS}xM{SKTE(yA=jtTWf;~cIThbzUBNwhFd+ZtiqI_e1@KqKxu_&KLF&+?vuMYstoCCqxSKgNL9d6hx9TBp z!0#abQhJJ2U{5l&DM8(upsuRu_eOe?0d%_^=*>orJUdX<2+G-k&eODEX){k++3121 zG;0ScP+-ugXt%UGjJp=vfnq8dG@7>qU8DsA=#m}iZAQ?YcA&eApu6or?=_DG0+Uij|&=-tu@R%LwOU6uj$}UqrZd}?Eb{c)fsL_a>Mqi~T;ZI9X z+{5ttCLAKo{nuQk$;A>u9pu~Ok;`QbAML6n;3rk{ehsaw@WmYUgF|1ZZ01r8hvyV+@#{L(fG|0|84q?N&9(Qyt*xE{1%CS zp1y0sU$Vuki__*7!XV|6}@z$uS?W#j9Jl z#`jD7PtC@8&=#*Q@EX5Y;(taj;(Ds8pP$#9TAAdj^$<^!ynZfsYVkJ#hkgNRb;)hU zH~H((q9@)bC;p{58$E2hF7;_aJyO0 z-z4#WFl(Rq#M8KbQ(u!b{wVNG^hbn66a7hkD(gq+{Tc6nL2$H3^jG>D9`Hr;@AMD) QC#2B!FZ#Ej|IqgT12N#8w*UYD literal 9138 zcmb7|{eN6V6^GAF+oVZv(>8B?NlT%&Gz~2a0)0!Vq)pnUY*I|N5sFxDH`C2+cJHS5 z-i-~SD2k$}D88U5ii+Y3Dj*R>#dlPEf7gG;kKZ#hySba)>5lxEFzvySB1z@jIz@|H1oDyjfW-KU~Rno5H^py7MG|5H{{`mr{;5h zAkNH+0EWkwO()-nO4xX8>!=@;U~90ex`*dPIFCMG_N|LWVOE3G1f7YNGRmP1iPmx9 zMa96On;V!{?Mf=MNLQn)bG;jlcWaqre3d;)U@zMv^XJvE@iHmGjm>yx0 z8NM@vwPs6UD1w-kai}NpHYB2K=+7$YR#sUXWHmpJ!tWjGx6+1XvCK`C7#l}KA;!ei zSs6nPZ4q$V98$=}cC#s-$Eo3Pmrb3*Qmvi07+Jq;MuE5YEk z6S0?_8TDqh9<6|J7U5jq0aQ)4@739UB$%s{?>o}@V&Ot@CRNGf18j_QF0G~3E^X!otV2&S7dtf2 zaBK1n6FHOTT-rjt$_UuDa?0&3D_JM$^050{+Cgtfs>%tHd*12NPVVV~s_CWam<8VL z(k>R*4uPs%T~4SvH?!<}UAmSnvURC!GEuYO`(4`2f*lY{ z54*I739NU5P|oN38``-flS!S7&g74|)KAwr)DH5A#q`cypKxg}>$RFE<%F;_Ky7n2ml^5vFisYLO2Pp9~JR*aq12) zL^8mE1zWaYkV*~RdPp)e@Srl53o#ecl|>*0;&n0nSN5G_`Hg6-7xoBt^wb7>PjcRJ ztTSkBl{g|B@70lgq_08FZ5-G<0k0+z&|9@4b>g{N9S#{p0Y=wEFJczWjbav&x>O<= zsqk)eC!$MD)>GYBj!LCPLb@D_2O3#s*-+$VwqvG52=Yy!5_nZ!CF71q3?zN+brn}U zx~KYBM&YfGL{=mbZiv6?hD7|St*k_ycFam0w6BpdmK@EjQZFW|czJE8qPG%(%AG4R zTo7$a_E$$}+eEPxX2l7g>yggtE8z8fzA(y{8ex_8tdF707E(1(l~Jz@v?2z}JB{g2v#K5ksvV|JiV z(x;GA)oJzVhMDqlJK$%HG53TW=<`OZg4jbq=T zZ_>9+_{OSX7b?`wRI#6M3jG}IoR6WHR_)j{JoO8ocCo^#n2uWlh4zggm6qy>}q zC0o3@&}jS?iT^&mWWvwe;?-S9<9A5>56t-cZSm?_rSUr@{)cA#1Gac|L(}+O692N< za~`zCtIM9oUn}uHGUFez#jAUx#_yK+ADfNyuq|F)K{dWl;(ub+{t;Wey3K0*9*KX2 zerj^eM{V)yVyyA~68|%^aUQe9t2?&F@0IwU(=TwVR7J}#Yfi0n^3-~qr%B!#mpiri z+V0S=Ag%7E&G;0416uUN`{cyGHfN(JY}ci3{~Etv;$Jo6pR~oR4+$E7K;nO6-j%0p z@#=Gg#vhdU-_q|)K6T0#ufA+({2_^d&3ulXw#BQDA{sv+@xM14=V@EK`n00)MMM=L-wJ#a{SkiKM1PW>oB9zOf5!V?;Jxh;{gwWP2YeO$JN<+H2`RMw Li~cR>KeYY-oc4P# diff --git a/bin/main/de/oaa/xxx/games/chastity/common/BaseLockHelper.class b/bin/main/de/oaa/xxx/games/chastity/common/BaseLockHelper.class new file mode 100644 index 0000000000000000000000000000000000000000..b804fa62021e005af440fd755e274d16690a4005 GIT binary patch literal 1349 zcmb7E+foxj5IqwD3t_nh0lCS=3rWDNC?Xm_xmiLb#3}+0zD+hmvas1rZ6<&p;6LbJ zpbwGq!ABnaCd;yC6A6@*C6%h_?aa(M-KV?f$FFbS0jyv{Lx91^3B%>wI5{~n^1LX@ zhFRccY03A7=@yHwW32MBNV?|X8)27(rye@7u3e%R|=iVS%=ZlRBocHCoz z;Yc0f?{fq-fI$tnZ=!fDEFD9NBAgd8BZ{STNjR31SL6zFM8_!ZF!W#DUaxpuTCT&; z_a`X7T$_#*dErqwgK*3#v`F0Luv z6<^{y%!|$FRtO7tq2W10XG2xhNjef(B%ULsXL_HZ_d+wjEPl7q)YvpIiy5fB^kyy2;nbGsrTs&9Sd&{p@dtXjR)lE81z*YX``7kk^JzbPB^b@+i;Ni@46;ICa?3A6--6kl$Az}ov1&Jk0 zJd?x{Bc6HkR1D)a9xP#*yddUigkMrzlVo4fSAgC|6)*dVd5xNWmAq!^3^Mep&>Fz{ EZ$kt}2YK(#z2}~L>i?YkPF+XG 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 delta 7360 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 RU5*n=ZtOGc8j;GcLX zYt^f3<)I(Yk79Mt$c`sMq2+~#qq&`Z=FFKhXX~H0JAVUM!HX0I3|KW$^lZEM^5x57 z-ENAYSlzUP&!IpuXrm`0Lj$5Zj zwy$yBrM-Nl6go{&taw$su}TluIil`dU-znTJrO$faAk`d>~*o?1R=FY*POa*hizXN zII5jME?;`rmCJ;Tg>3`=2A^R64;AqgFYflo~gV}xcajw|l8n;XJkw>KIz zn^WO=Wc!XBt4Rs?+(b$OW_xD$T#3~9(nK1g24?nXbZAz%wkmbzBX|nTK&ev z!DzK)VorLU4!!6sIX;KWCNAMS16K-_|NkIL-3w8X+s)K8-_K@rql1OTvb289#1-&? z6hF**neRuuXxoiIUXzxJcQ>AkYFJu)B8}fNaUE1$`5@y-*0|jzreJv4z}xP2{kI&? zJ=P+ zk0nKpr9N$GU9z1v+RJApjfYAa3zam+S(lusje88F&&g_4>M_kO`|Qq4u*6g5DMu&^ zlmcamvP?NeIYT*1IZwGjxoE&FyRPt6@I;UTxqqR5#R>81-Bt=@$HVVeWu=O)mYwJ~ z1gBZ<2U!lYWCk)JdpSvPswIu7mTaY3vXN@ZCPYoLKY%IflT*|@8AY|^6V;MUR7);V zEty2MNR&r=5E1|Y literal 2245 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%0AjV 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 M2ecO$?-iB&KhqD(=>Px# literal 24478 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 diff --git a/bin/main/de/oaa/xxx/games/chastity/common/LockGameEntity.class b/bin/main/de/oaa/xxx/games/chastity/common/LockGameEntity.class index 4e0c38ae14e25081b8ace2ad85843ab87a6aee62..db34e38420f3c6f853e5e1128f8829afd2332ac5 100644 GIT binary patch literal 6861 zcmbuD`*R${5yyLFy)3O|J#1qkB?e=#EE`{dge2H8oUI2360$AHV3QbDccarT`!!sGMwTs#v>c8Zz zdxe@8R10%Umqa;ssFNp`D)7xnXA=9h!s23S;+R9jXA{h=i*tU%U#f{>5QMQ8`(e;< zXfKAZdQt2Z)6U4cmb80V<$k}*D~t4KrDo_Ua)}? z-F0tmO;k>9IMlH$;_}M%CQY$(VPj2TQpaR*dh#sZ!%LQ{-jWDTN8yZE7d3~5RP1s) zN-9Qi>NjQ+Ar_JmmW1D`j{q4tHz zM;08~eO37JvbP$C(FOc!#F4iw;7(&E!UVewOpn@$1+TH{(2mWA$pG6ltQO|_;8OEy z6J9J9@PvtbH^-h7K`3Is8si=Ob?j~oS}8b_hy>f$D>uFQ)YTAivc@&AGZyu=xit~s zeVB=&N?9h7NS0wKnDv7s7ATWGb}t5uI~7(iejr>I5eJtVG{EU-tcYknM&*i15%u5Q zw4nlzbGA-6v~BFrIb@7MJ+zJPbm=G+y6BhKvQ3Q?qsZIflIx+n=+5or(63$Uqn!wT z#t+0pNqtE~3m!7b+2sVC^CF+0wXr>3@e%nQ_7$tE6$+?|n5E6B8XP;Mb|S6Z5v|-( zu--zugEO_Tz7(z&rbQr-N>Mq+@fTg{piV_!lp1C0giAe5D_#QV~}B4A+tMjX^dmqmv!e<&0`an4srem^w>>_v-gTiUh|<+K+;kTH6p znxq7zek<7^xqxNFk|9d1F!6!(IzL4$4BL}EdeD^g@iWB1Kyaun>}g}4_m4mHJvr)Y8sWSM{HIy$`iI+{VH>_C{rzq6WlZ-rui_5%3{jr zMl;0WZeIG1a=W_Th3r~489`a+uX3_X(97Ec)HUk32J&NkS;Sd{7KuySZffI(fu}A! z_28)+f4AemHf|Z(-iyDisNM_Y!hx=#9sE}fM%RR=Urrp5utE3+VH;{-gQ%?-x6*?KTe&DIW_nXMf-HFJ0z zl{p)Z#GDNWVa|rLFK5GXm$Tuh)3!`<4#S9>5B~iH_U0ru-NE1f@o(sk@$cxa^WV^~ zzNWkXBlqn$__t4%#U5%$Qg>prSI>EneOFG=5m(|7ph0+v3#)QsZxw_*dvv zQ*s`*#jCrh#*aw+zv$m4{G+ybb)(hzeG>ngIr@vXcy&3}_?spEb$Y`T{gN$SU9mNO zzr??3j$YW})ooql4@mr5X8ejRUfuaM{#J>9+l*he#j7s|jlWIe-!Y#?fh}Hre`x$c ziGSC;wU=%2>QhGJ$0Ytevua~oy!tBA_(Kx^zB%_#*y7a(md1}u{0HXfuiE0(x0=Qu zmiQ0Nxqs3YuRi-U{)ohXWKPc0ws`dgsqwc1-$ozH4)%%sp6BoTPx1U2dd}w!`r`jC CF-1xM literal 4760 zcmbuCeOD7l6vpp{SHmJH2nC^4tG0-(seQF#ZG%LNjfy6q(pp`TNm!HY;=WL@FQ2JB zrykE~&*=x~hwABbXC|;Q!QFHGgY3@SxxcwH^V~bjzyJO94-w_)w;@Uyl&y-aYgyUd z-Q8^6Y6(AE*|Pk=4)(GYx7Bi;Y|*VWR$$3H+&e`524$XFJ65)7IrZ$F&8MOg7&OSv zg(_@CX$%9qnO$2eEH4@~b1#H%ORU?zz1b8w$8iHIuwBPDXd1&CmKRvrZQ=R09|)%+ zvV|(#=6ag0xy`WUz&sfG!s8hSL&ts=iaxB$FlfZ81on>LsDY10Qv@A;M@n|xv4YSO z2CYPbW%HF{;_cuG)Rrt>1@%PFVDC7h?B24RJ&YJ`S=-y9y0mA|KurXdt;3wIv$4Fl zE#Nee&#mO|VI5Xjt6Q7GS@qna*bz;GCRFV56beot>cV4(rn1ho9dcnU*9bzJll z9B$hT8jnCqfoD5)FftXn$IGH-J2sz_LH*_YgR()B&xIY-tVZB^8+h{r&#DQSqnKqk z#32KdRwq%m{DwiJ2aUXgLz__(vn*I)R&&`3L>VnOjs$QiICn!4;*3U`*y;V&kS~I8 zTORurj_#^Kee>tm5#cqrD$>+P3nsl!9}Lll*rEd|<~+~Z<0DSfd0IF^P`*i{bkv}+ zqV0&=VQW)(Webt>YB->E%d@$yJNttz8-lu+Tp?N=P+VOEoIxD*`20Dw@@Rt0>I5k` zJ3Uflyx4SGn{Fe!A{^mio2rW(|5qjr(4eBP$yDIpD<-A6_bBGfMKhsuVx0?xj%eO2 z115OJE|pHUXXwx=M|#bqDS8`u0Y52B?!0c&GUM2)W8cOh1}*hD~XhN-7c9!!qftlme2YEwqXGS9Qi&lDQ>< zEw{RAdC+5kiVOX~N$Ceu;=MyP9TX`VrreCO-$XSGo9fIq)IFVX6C6yJpr-WP9eQHU zFox>_Hy82jQV%o}F{7qMfm$-mo5rX^q|)J{mBKEg4Bl4=cDti3bup)B>mds!@Bu{R zpgJNVz|mtwsa*rpB{%dc;=0XcYl6oe+|(Di_#JkO?$@SSsHFS;l_#)>qUt~v?#c^X-6r=|e*{k!=*R|{FrePzcT5h-NXKy)-$LKG z588yFV>F2t>VgI^NI_8+y82K7y84jjy01O?oKNoniX845jO^__7`fRs7)jZCFjBI& z0ZI7^g$Lqx!tXqGVF_Dl;F(!?N#_>+rt=S9(nl}o!XI*nKF04+x!IG{k0p#@Z!V(G zR6g_xeTtSrpV8-7-WPc1*}lY+*;%|Zdtl*Dy7W6u8R%=e zin!G|fAiYNE+hkfi|^IfFL5auXgL;?PX=0v1>Hynx=G)~EUlOfberzPfL4=%?!`t_ zN(Ne^^_Yn6Cj&i|PpleGsS&qrOG($IZX1oCl5;iV@%f~9b#ZC@w8XdK@i&s< z)g7quGZOER8@D;dqF%bt!B7yAtokM_)>cSNFTdpOko?g1G4K zC&jC;1dTr>@nL-Q8%go%gG1v_OZ-ke{!voA`fSnoGZOz(e7Sg%6t6yhH2y5`DcVI+ Wr)W=p`HkW2IodxXwSV#H*Z%=ci6905 diff --git a/bin/main/de/oaa/xxx/games/chastity/common/LockGameLockEntity.class b/bin/main/de/oaa/xxx/games/chastity/common/LockGameLockEntity.class index 70bb24a76b0ba9970bed1ad95d6f5323bcc39e52..39bf8914c241d9bf7011b5ad927901d3e3e6c0f4 100644 GIT binary patch literal 3197 zcmbVOe^c8=5M3Dz!8qnufCOkl($IiuQQI_a8VKR1si{L!+mNPd%N+J$1hPbBi9$bB zJJU>N(wTmMeyC30o@9_g#7_SJ>F##l?!J9{@<0E+{hNpuX}gnR8r?5T-4;SWK0ekf zqAF{8X;0K#!#&YUcC~6-dd@B#tl@;8s}`ShQoBaI`{GFGrm!mdvz>ieay3esA=7Lb zHaTVFxrV84Ze~|zHM)`afKioOM$OnU<)UTTu5b<8s%dl`<_E%Yg?=cVno)D5Rg!wP z47ah!qh;IlsuqqrICYNL$th%Pr!jU8Sg`6U7!^yno+CAS97>Ik=W-W`@aq@eZbj@! zOMfAqgWsfAnVkpLcw|DWmRFUIa3$v)KN6;gP&Y3%EuI`o&c0C0XE)X~x)*I}%Br+n z6l;QJPz9H6S2z{vE}NnT;-=ptdE~V#-O`>$w<4ou_%KK;zPh-!n%8I|((){!qChK= zRl9{YXw)YTT;oU<&_zdX?|KsL=-#&t%kLKwj%IKD)C5?mFbKEy%C7tfvruaq25htvz1Wi-Ai!{=c)J;i^ zdUA#(H@xbObQE=51821*9D}J0Hrw4j17tmj=x);)MPYpq2w+c#mr3lOoboFR&*W$@ zlUeI1Vk-M{rd{2!5A-!@1={9XzD`n{Ixtj-!q-E#%)4_*O7LzXh^kzjC@!K*Xoe!RtluRSuH1NoNhx?ArGaC(Yi;3GT3n~Nq6W&jRxUZjF8D--Csql z3xz$uP10SOKoe>gn=mkWz6Y$P-lx*tv&+wg12$b;fZ!I+KDS^r08)%LASgl^VIhqB z{){rjP@@iUKLuJ$A$$YbgF&z`*NhN0R2+{5h7lCA{UCs&s2vL9*O_I9M8Wo)lFS$; z275RxaR2Kx!xMPf7sEHfaEzh_7r!<2i%fmVw)vy7ZDNAxHagmduVx3uSoK(SVwJ$^ z3Z7l~i?Qy5eSZ3Tn0B08Rp%+?Gf(Z*gY#ZVebi3_IKEb*K^l@YOxNiK)+034iPW@7&&1tZ`4_|0KMZP?3gbZ~6^QrT?Pomv88k z*EI8o%Jx(IPpO(mknsd^9-+^$m-Kz;bGna}Mqkha!C0tMlD^1n?NQD?R<19-isJZ{M(L-;i$+w2xcs&&3A(;`oh0z3BC`=J2zv z!u#VDz$X;^bNUY2^gEruP(?0Wg;I4}NQ9SF!4s=d0af@)@4y#3g`FU9w+dXO&1SSM zwOW@y&H?cQKO MSpNhDagY7{AInIXK>z>% delta 1100 zcma)*Nl(IH5Qg7UT4ZrKA@PLb0(IYTLj*(-#eIthV@M>PJn2!xk7)c6#*0P`i6$mq z_4jzx_^xg5D0|R_EF#~9WlV_S~2O0UyGZ?}!BMBoI zW%d|-mC-n@U=Pw4Y(;xO^p=hQ7R?;MUqw>Nq)AKC)Gz6O&B*kpl|5l^%elz8#@uHX9 zCMGP2fk_Nn7-X&aQ#Jg$c#nx^{{`P;@RzZ|y)uWC`=cXQt;5(z+1N-!N8LJJV>?$_ z#@tdBUhZ&N824W&Tf@3l=Mr|61<_vN2MzoNHtXQ?<;kS&^7#{2_#Nasutj+eY{Ny{ OOmByFmq~4B*!u>4u~XXs diff --git a/bin/main/de/oaa/xxx/games/chastity/common/LockGameService$1.class b/bin/main/de/oaa/xxx/games/chastity/common/LockGameService$1.class new file mode 100644 index 0000000000000000000000000000000000000000..2043ee33aaa0f675665f7a9a2964da76a7e2b0df GIT binary patch literal 849 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 diff --git a/bin/main/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.class b/bin/main/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.class index c5c9c9ef3af8a16d497ffb21bbafbb06928338e2..58eb67cd4dfd00546dfb229f29440b62bab6c75c 100644 GIT binary patch delta 3325 zcmZWr33Qaz6~4=4{>kJ|GRe#&nUDYx30cWPg4xIlLNE(vF(e_7AsIs?%*12>v6X14 zTDRKvwX}joqe5D>LX3_C>H=60Y^!axShW;!siv-7Tv{XEf0E|t@tmCe_kDN$?tAyW zx%nx)_9)s;eR1ds0H|QM282+eh6{7mwVHLbW-=LfC@fA;XXhuX9Sicu_AWTb4*Q_T zzpA%ueFi*+q=8T$YaqQKMJyb%=by|V@5$rwRbhM(CR_b&K z)gXlR_iY}W4v3JDvNE+st&NFYUTnqJsZOVQj7A8T>~)^2{8jFO?rN{0xm2eHL*o!l zjeF3)Vp~tI*Hho`@%DOq!l(%y8Z{&2tI@OtYHoIPXp4>~X*EJ`kXt`RsSVksp>4EA zqjrQ`b!B#Lh)x}}R=t&76WU4ZHF6s`y5gl1aSolj-~fWD&)2olN*?Ob=yG*kP7ZIN zUiD~B#=MO>^}#1owKjVVvnpS=M{30vjejp`)UTdTPE=00;*!Q%Hd`UiTw(LEOW4gzLc;WT|$r|ankbvn0ko{zq# z(@h2$iv(}-ZS;7hAhd_6M zs=Zr!{ceA+&)eMJ?e=@D@CN-@r=Q@X!b;9XMOT-n-|zNzd8&Myy?%{;swNjDxOPI4 zg?1sBjV4xihrv#|Q>UNP9+jI{6@NEEMDI-CMvvETrF-Z;jqX*q=fx%NMTkjhORc%W zy~Ul?=l1qwRr-8=9=EsHLL*~O=e@(`-{^FlPN=bhbn{7_PSLaKje-jE?{xY-J*UzO z-(C5lPJcGq7a}!QcU#~-3;hK__j@+=_X&+U_og6~S9E&SXlJCDHGM^A!8C*E-*h^w z+(omjuj|-DZy?M~QCR3ywR5e@EYe!~ySTc)-U17~Bgdd?z$0n8EBr>7f9UisMo4Gf1=Z;^qER2xzjwU(+BjSI#tq1j4ETv(NK-$Ptv9b zCt`M~#bh@9OTXKI|GZY*EG3pq=TmY>Z|vtdl6hOst`7s(39i*@=h{V!7Ed;^0M z23D-o7j#~*B6XyqGJ46hX@$JHEq zUv)AZHWk^7k5}z)oHgWYeT=Rwa!Pz#fCl8F1+Y9on?(u<&{ZzyLHbsJw%h5t=vM=@ zBS1F_grNbtS;8(dYPn^qmV8%O0O|ttebZvc2tJBA z5HF-_a6aw8WZI1jXfLMFgP2C6m`(>VgN|b+J%7X6 z16a!sVI7a+Dt;WB_#`&-i`c?va5cY=t^5VHnQYh&B`^e70CS9^2}__<-fxlcBG?KT zlxEQ{fPz{-Yz79aNf++3!30sJ5ZEGiA&|(QVHI8gW+;#Z>6if;+{CwGl3*6t&pq@@ zybwa+Np7M01+&7NoI?*tlrZ>oh-c${_yFh_OXul9`W1vrV?UKABpD*4O>fgfk|YwZ z2P^Fo$;O2?!O6lAQubI!whf zA;)Ud1N3xV<_QSNIFOlfh@Jr$r{AiTZN)=ISL6i&SFkGt;ozX>g(3$j#z>%`PDuP; z_Xl8uglr;Cf?b1l4R%7A03k?^$cJQT;>Ewxkm-*`LD(VXu&f`JnKeeXHp5PTlA>NH znweQaPNxTO=U0K3#N_3v5f=4dWp!p|^_nVekFP!_Ot6<=9IikZ0rNqUE5*11#QseQ z7nr#N1b9mVD7isrEZ!DiB0%p6poZJqobL;93KG|YO}U@mrz6U?W_gV~fisjo3ikL8 zp=9)UQJSQQt;@92KSe0d2*A;qoN`;G8sIqYCdfQQ{{jfm$LiiS)xlI#JvLIAAv2f? zI~**}n{szJ@pHAXBb()6la+%Q)Ygvd1bNWJ+}Pt%smExkH7z4OcyoTPj)}dzZtCNX z+2Q6oUThkHh_uXc4pT{M6EQ-Stxd1B$+XCbLl#GIw2-wyJlokJq3m+#oic}};O@$( zPeP2w8d}fGR&#KlPs^bM)HnicR^xS4kF6~#i<5{D^a%k9D@ReuBRO4Vy#$tf1QOHi zJS#oGiBr9o)ofYKH5#A2E_G<0Tnh3di7ymW;`y*tzET}0%djjE&Bg72gPbCR1F!-# z&IaZj&gDfxDUUDWf}m8$C0rVm%D9rNg3>Zx!7GE(C0xh#L1`5?ax-5h(b8myhjZm^ nZ-F=*mhWna<5q6x4sgMp;N!LCP%M@2I&&y@ii27B4CC;Z49*t< delta 3135 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 G-1Z+I!Q~ME diff --git a/bin/main/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.class b/bin/main/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.class index de035b1ff1c5ca59f3cd01910e7cf31f0525cfaa..4a276a24603faf7756e79b5848753b52afff7d18 100644 GIT binary patch delta 1059 zcmY*XU1(Ex6#t!**dG2*gMG=q1gEUt8tNX#1Xn@rCc+-}P!N48$QbNtjOk83UixtFIltfkoZmVB zbN){+(?9Q%|G~>2e*%!>!#Y^yyeYLkW-N?fXblBV6wVx(o|+juTR8pBWMQf}cYI#0 zw*I2ke08nukX5G}=o>=lw2DQ7&W6ax9<$C9+7hp;FMTb}a%YsHc)@OyJ+wyfotiDp z=cngNXA1KM{mr_`4eCYLP;-D_l;&oOQ!}H*;{_j9xXGlW9CSvyACtF}yLIj&^s7se zxEkrzsK+_bOQa=vhtAtoJ|1`N2@a zJJiKQ%>5dnM?Fro8{HGd;!Nq3&ikE}#Hio!Jb@d2fXAJdbc$?hvh}-k@)I&_{bxFv z_1V5M6_@d^I+00-ml3Mq56gHnFg&}2$?xDM^;ssJt)G0l?&J<0xp34rg7ift?P@*f z>bfBHJhOP=b3C90JfwSgL~Ak?3%_yI(3DKP0G_@w$5cMoUh3s|1#?3FEOQErZ4$3fV86s}ItH5OExc9u zjl!qk;$1w*yQ^N7_wZg>KhP=9@xHXNPd1d}QF%T#4dPoqpn0iZ>_N@Tha}DoqWk{? D_)XtU delta 911 zcmXYvU2F_t6o%h(W_PALJG)kY=(MXpYqi^=MORxb{Z#}_1c}gyi(0ZNnxMpuHX*_V zk$gyq1d#~pubtYoNO3_ERe~!QL>dt;a6uyC_tZ0Cx2dq>Nz*!DfG@oil@W9oJ816?pKcqzE#AByUH z3to0xDc(T{MwY6x-W+EnlurhIVVA{jdeFU>>+m_Duj^@sdF)zk=f<js^6TV1#J{KBXpvsD7QOMa)M5NE)GJ|KTO~u7pInPo@i{F$?4^Z3$anxd)b0+9q z5#XHv+B}PcJVmtX08ddTBZXA2ZbwR8jf6Zk9LaNxl911It%L?2z?M@{86_JpY~wy{ zJ&94;lX`chTr6dNiD+t0BY5@8S7{5(9$4ZT}FPDpXf)c@r4TV9T}! z*{{~uz0xLfx>``*x;O*NVd4`7X^b;v95>q8C&OB_7pwl$E6hw0exV~dwvTpW9cS?* z_~{55c(Qs{|G_&^#^{xcI9o-c`Oe#hYoy7qqmDPt(Q-*shnsSk^VGYhysoJnmP$8I zlRI+}vSdvcDwb_TzTM$riN YU{f_NaI@~A>9Q`=J=`L7E)b3U1sVpz+yDRo diff --git a/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.class b/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.class index d16eb078de838785a548b06cb781abf5a69e3c18..474bea0968d83ea7223a24110831f7d44b983a19 100644 GIT binary patch delta 944 zcmaKqOKVd>6vzK_b6<(m+uUkmVr-gfo5v(IK3i>!HO4-ottk{l1Q$^+g;Js<#f2yr z@e}BL4HpVtlq}p71pN+fT#HMW;z><4uAjK`2wJVO#=!; zS-w)rZ#MS%k@i!^dA!niwD+VXEmmU_@*Z1G9Op1#2Eh>L2*P9tWOMhs`APYiOeaL$!~!NdI@C%S7kw+30%XH+*0?AMH4p|s&Z0Wm@oNS zA7`-1qGU0$1X+?S#lUOLrqinKHrj2cZQ!%C0_$9g-U%s_$ z&NwEAAjtt0mnJxz#v00`1{fb=)7zi!%Vg-1x_4%X4rYKsh#lzI^gXhD$n{e>U~nQo zRlr=I%94~qQl`jvaAp+6=vSSm+AvkGP&6o}#V1@4c@MTIEP9BFIS(-rQ9UF?T=S3= zaot1e1C{!p{jimJI*IFV%}B+fm5PO4=xE> S2XWLXPeYfRW>WwE1^)rH_h*g( delta 871 zcmaJ=yKYlK5Iu9B_GKY9X$2pdECgp1vd9SRD1MsyCG$n9&ZL4eza$FIE1biW;9+E{QhKAOOw)>k8HH&? zf|XwMn-vAK3Nhvck9yH{yJEday#@2uo>%eX05+~DT*OuL(|+dN#4R5S=7}?H-^QYO z<$U%V87v7JX47rNV}cwdq!cJcN?D+`4i1_xSD){;TFsV^4MEMkc51edE%V)76xWo! zxSig`#R=*$cA!Qpw66Yu+JJE)I>2_M2GCZ}BYXg%7B{)o%Eo*<`Z6NGv$K|zO3f});q6O<2`(?7g_MO@=f z=yK@1CHBE*4FnWLaWGG9;W}>6rX#+?B*9(sE@K6&xQ{jN1dOd?6Wg564*d#`bGvo% QyU^!X>1G|HRyYp)1;#^CWdHyG diff --git a/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockController$CreateTimeLockRequest.class b/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockController$CreateTimeLockRequest.class index 9d49d314218c1d8ed28030daf771b05d08319ca0..dc7112975e060cb2bb2a3eaffd7342005f729fc1 100644 GIT binary patch literal 2731 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 ZX5{1|%{(5MnUfosg?2eu(c{&-{|_TbPV4{x literal 42920 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 J(c{!h{}1_ys^|a! diff --git a/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.class b/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.class index 70ec571b9e35619e6f750bda436520fb5a1690bf..54134e0270062e2fe080b1bf72f994b4d8911c0a 100644 GIT binary patch delta 77 zcmeya{at$lA0u0EYI1&F%4QKpeK^~bDVPZ=K6w$#QJ9ikRzA3JBl{tkuqVelUH|~e B8fpLl delta 77 zcmeya{at$lA0wM@W?pGY>Shr}eK^~bDVPZ=K6w$#QJ9ikRzA3JBl{tkuqVelUH}t^ B8two9 diff --git a/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockService.class b/bin/main/de/oaa/xxx/games/chastity/timelock/TimeLockService.class index f5f3c77ee504b6846a549a73d3d008baba00b056..bc825774c6a212639d2801f9ce56781d337fb753 100644 GIT binary patch delta 7620 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 delta 6986 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 Tdr1mpmd{vu#pthM&BXO@N_j>A delta 528 zcmZ{gO)mpM7{~v!+nw#ML0i?*7w?K~sd_8o;w(<=&eh@sD4V7YR?fB_zc zX@Oxtz?2Y{kQN9_up|r#Sm5$DB4DG-zhQY6^{)y4BOO z{bPYS6#ZT8nlB2>W6A&2UYOyx^^sa6B}K?nh~5zBCfy#Q3u3u;9>Bat(Mu3#-@c>!3f#EyS)i6q@jhaRwgeB-0Q)yYE ziO?x+lqj!LG@X2=iSfTqPCn6T66$VZ0-SPFv@H#j5gis~|93X?PFU9U z{VY?KesQZRi(522xzZKZM#-<`ueNNiIE@-#et{9XGO)|RrAlCLcLuOx`vGl6*6gxl z1r1LMT#Uu19$)BowD+Y^E@cOg6;ENi4xa>9R zb*U1W4P>o;+o`(6$}Ra`!}cU^9*E`dvg=l*x(YV$G_^Mb{}>!CgDp;?55&C*X14iMxt|jyZpZJ3RvAS#AGP z*hs2gq(c(znf@7G)IE6J4*a?;tI{hx$1AyeDi^Prn84U5UdMR@Utqbm`%~4wi2^Q= zMmvz66}X}}A!$uhBwFAA8pe@A+o4O!l>c&^h4(%$r5$lX)tT`_STH&~ckmVZMZ zjUA@5deej%X7!edHEm=2S8DZOS0HVLO7!Y;aK>h?N4hfnexy5zTCx?nz}Q+~6)V@R zdeqkw*JZHfmTp=e<(+i0=*P-3Xg0AHn-0z+-G1p-!wKw~Tz0l?-=J``>G5#OpIVS^xPJ4ff;)4BDlBIPZI9(9<|SQ z1Rm-A8(lY_RpqmBS52Ys@E>XY`R8#Js=dle)x;#m!n|E=N&l42Tetd8HJ$1C+0=i9 z^PY)=m|}MQPF@d0;?^F=YCw$As?E|=4*^tG2Cc%Wtx)5f<$82dFUl0kB;VajT1Qlx zGiCW^JXUr0*+^3m)16~&x859W*?1H!KI1ndJ`2wgL`bLduM!)hkyqzOsT;T7eQtw!`%vp-KOx#b|CW#9*%RS(BE3R8<)C>F0z>XK!ndctn_hSe>MtB6VXjQ9g z96p8dA^d09AJPH-Lemu5u!m!?M_RD2;w-HQD;Bt>`OYI^ zo%;x9)ba$M7dSuoXB<8>_yiXP{*A>Or{0C;pmAN(k0$<-0pKu3zP`*?@$-sN8L`cJluHKm z^}aw>GN2-Jw|_))$$%s_NkrIG<$ZItnhbC&G2ppmfOZVPnpsEn3|+q*YYtUP$xPnIb6=pwSOLmlR%! za|_v-F-`X8jgH0jpaNtsl`y~X4K4gXzyuV10mlftWSh8Fxm!Vlp4q%(yd;D=mQk^Y>2 Szre3}mErE!_$_{qL;nY8fHlGZ literal 4807 zcmbVPYj+bx7=9*cx^23(ZGa-)3JTJ+Koqin3m^0xJqjN@e&T~a!yh6(v%5()ZD^LBLo+iw?>z6kx91)H`S12$04DK+hL}J) zFEh4bWL8#IG6kb7olMRymu)L!)D{cIg0wOxP0MtaWK~0#z~D7w*~pX(tB^Ufa82f1 zf#hN!FrDZAj3-cY%~Iyvx#{Csfu3TmdVOB5P&DQ5ddKJ7s%aIt-{pFH$%1rpOC_0G zqTrJ=>#ntscgmSl4Ve>Gt<1v@@P@W@&4N2wbj{_~3(S~~OPSs|vtSu+ttthMhVG}f zkE~a;*8U5!TD&f6h3o{e1{(U#8jhnBHg6#3?NvwMh5J{*gC2TMp<1g{q;h2U5qi~~ z5QvYa&(ld$c3vhC$AdbyVjC|qV_Ncbt-K(s^TtAnrln@=oKZS&R86%GK6bfFChs)f z+01&FX=IOU`_U2DI+|V|vt9`7)R91U5|3lIh9_DQ!#}HI51tgzmW@(Po>^o}M?*+{ z@?`G;KB_}Qk5V(HBZ)pW+oxj-x>HQu13EHzN??20D9S0@${Fqj(_P}saSh9*xtGJL zf1XLJmrzYovh z1r5(L2b)Ewl3K@$ILt7buB;laT@@IvhtVs{>EL^|4@WSe;V6@*iBR9w@e*EU=2>2O zwkARlJ`KmBFi5?E`fwa4HJlK5dR=+1t-7_&(s2r}2hHJ8T6or)R@`7C?&sr*VWS(r$N8HyM6s~cl$Xuo2J34yN<7;j* zv%n}duM2Q{{vIOSu{9Lldhvk7Uuv;tGt`|5tE#hii~fMX4{t`5PvOcd*K`b_-}l?8 z2A}sktd8RFTsu5Y=O=XoXh za`>+I?|KC>+}fO0EAP9Msm)sRde#BsrqJry=V?7 z4kWuDvu)RLt477IF(-+S@u`MS1a^BY={;XeYuPT!jNeN9CUnxsk!)90clu1=$8hih zX&>+v!^)SWvwOz2i?vF2!^YHdaGq{!BYr7_(59~j5K~5}G{=sR9q7hKJ@}Gcq;B{n zGk;X<+gX37sd@7;=BJ}Rz|f~PH#!&FJNK1ahh0(;iErJbP~z7u$CV^LD2?-lG~ zCB@n7dk|9(4bEcfP2i0r9dG2zz#GZhlzzaQ4^WQ1v1QG2Y^+n<=R1P3TlkGnDgF*~ zmEkBjCdU52_Fp}y9sKR~KI(XgbKMuf!+3-%fk*Kef7Rh>ba{ItW4~eKPwe8bmw#!0 zI?mxX_5;6AG=?VZju7lf1NLbgq!eMr1jhu=d_b&2cW_V*xA3gM;jW+Y(2lNKAU*$$ z$ZruHs;g~ zuV$kGE=C4C6b-Nt0$keghGsOtV#l-?j|NminZ8?_Uxyi(n98}a@!v7BmRtI~1RM4x z8b#9Wk)H5UIKk&9IZd##>`w4|qrxjLZNO_De5Et|)u`}_q8sqN9{jtgcDj8!D!gL; z27J7hUn8sEYj# z7FIkMRy^n_UI{5)-PmF?s$#!Yh7}JX)wFoXQ+&O1nvX|~r0T_uNNyo~9PiWLF}8^h XIjSuBoPS^7E3T59eT{GNJ$C#L1|Rs% diff --git a/bin/main/de/oaa/xxx/games/common/aufgaben/Sperre.class b/bin/main/de/oaa/xxx/games/common/aufgaben/Sperre.class index b92ef149342a68945db8aad98e3b545751d714f6..9960d63d3eaa39251458f79763449f2311abfa57 100644 GIT binary patch literal 5216 zcmb_f*>)Sp5xvcAC}60ClE^5QZ8?%{u0j-Lu?8`rfRn>K?`LF+c z_zwUV@W8@=z|&P(@ExbHwY62KIZYWBDt@!+dj+R`r{hEVfeHpp6NUr(!i1Ez-er77_+@F>=ETrs%FZVJJObqv@&Lc_~-JW?_*(D{d6FTvkp{oW7aIIh?n!z)QAWg{ll} zJdYQcG&hog6Zx#8iEh$#r7m~Yi+L>KMGH&3DBB3#T^ldqB5#?e>$NxSon%>fnFr2X zb2)qwB@3_cuI$q3+Ok%5=*sCn@!82=agnPaE#j(;FX0+*-i8xi z*50syZVHUF7<6}&7cpDN8PeA~^dT_2Tj!z25ExsHoJxJgX?1Gw;EIek{OVOFAOSNS zypH*rj7-5P8XWJ*Sch95xz_d~w<(vsO*eE|(HA_=kDSQmrB=n>@SA17UbrMZm3UcY zYC! zA!TJ|CBe%_yNJ4vY%_C0PLuN}^-7ALl?P25hjB>YC>PiIkaaI;m#&rOYc`JHsK6m= zF7Dv&=ekGHWt7o5!`=$IZDRss3~Sg8q{{T+4h?NLQAO@bW;<_3`%smVvM6Ob=zh); zSu_BN+{GqM?s|;s)G4?Zl1IttUR-PEiwa_*x8vMvb-T_OPmoOOMAD^hRuw`*(Bzeh zITM2|d?Y9H5_9Dc-*yY)RkHcAM{-(fsCE}x_^rT`yJFMNTMO?AJhrze8Qp{iPq5ks`3T5k zKs`!08&K~DJ(BeFNQToR-wS%=3xZnv_51+k`O469zA^MjKG7rDL60ouSbh@6IOijb zzn|o8furC!Jo7g^@+U3+D1S%vqK(Hmw~YWE#|eH39{E%JRm!(Ja`Q8P#>v0qNe;98 zn>W*f8P1sDEQb&AIpB{}9Dp*iUweL>zCVgnIG!*z9~*lX&rw<#`!&ZQj&rnd<^!-} zT>b+l=Rd#&fq&xC%Iw@sNWoy@6)40evkM=yoY8e$MBYhzn>0&J1e|m z`xt(ohW|!7d^sz;Y9cXwPQ!mQJ@#j_!mHjC!{;^pxA1Kewkgo>>`HMdnc_3bj3H`6 ziw{e&X?<@{+H|E6jt904tN*wKzKidrC4D}tU#hppejU{C-%p1xWQA8PJBA6 fj|nz_pWvq))lGkwf4}6T0c_#|zrpYDdmQ^OiDwAg literal 5504 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 V$KUV|{FCi+W%4il2Pbjne*p&Ao6rCN literal 7469 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 literal 8547 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 diff --git a/bin/main/static/games/aufgaben/aufgaben.html b/bin/main/static/games/aufgaben/aufgaben.html index 5c4251e..25f6230 100644 --- a/bin/main/static/games/aufgaben/aufgaben.html +++ b/bin/main/static/games/aufgaben/aufgaben.html @@ -263,6 +263,12 @@ cursor: pointer; transition: border-color 0.15s, color 0.15s; } .btn-item-edit:hover { border-color: var(--color-text); color: var(--color-text); } + .btn-item-copy { + background: none; border: 1px solid rgba(100,160,255,0.4); border-radius: 5px; + color: var(--color-muted); font-size: 0.75rem; padding: 0.2rem 0.6rem; + cursor: pointer; transition: border-color 0.15s, color 0.15s; + } + .btn-item-copy:hover { border-color: rgba(100,160,255,0.9); color: var(--color-text); } .btn-item-delete { background: none; border: 1px solid rgba(233,69,96,0.4); border-radius: 5px; color: var(--color-primary); font-size: 0.75rem; padding: 0.2rem 0.6rem; @@ -533,17 +539,11 @@
- -
- - -
+
@@ -765,7 +765,7 @@ ${g.beschreibung ? `
${esc(g.beschreibung)}
` : ''} ${renderSubSection('Aufgaben', sortByLevelThenName(g.aufgaben || []), 'aufgabe', renderAufgabe, g.gruppenId, type)} ${g.availableIn !== 'CHASTITY_ONLY' ? renderSubSection('Strafen', sortByLevelThenName(g.strafen || []), 'strafe', renderStrafe, g.gruppenId, type) : ''} - ${renderSubSection('Zeitstrafen',sortByName(g.sperren || []), 'zeitstrafe',renderZeitstrafe, g.gruppenId, type)} + ${renderSubSection('Zeitstrafen',sortByLevelThenName(g.sperren || []), 'zeitstrafe',renderZeitstrafe, g.gruppenId, type)} ${renderSubSection('Finisher', sortByGeschlecht(g.finisher || []), 'finisher', renderFinisher, g.gruppenId, type)}
`; @@ -814,6 +814,7 @@ function renderAufgabe(a, type, gruppenId) { _itemData[a.aufgabeId] = { ...a, _kind: 'aufgabe', _gruppenId: gruppenId }; const badges = []; + (a.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatSek(a.sekundenVon, a.sekundenBis); if (zeit) badges.push(`${esc(zeit)}`); if (a.level != null) badges.push(`Level ${esc(String(a.level))}`); @@ -826,6 +827,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -841,6 +843,7 @@ function renderStrafe(s, type, gruppenId) { _itemData[s.strafeId] = { ...s, _kind: 'strafe', _gruppenId: gruppenId }; const badges = []; + (s.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatSek(s.sekundenVon, s.sekundenBis); if (zeit) badges.push(`${esc(zeit)}`); if (s.level != null) badges.push(`Level ${esc(String(s.level))}`); @@ -853,6 +856,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -868,8 +872,10 @@ function renderZeitstrafe(z, type, gruppenId) { _itemData[z.sperreId] = { ...z, _kind: 'zeitstrafe', _gruppenId: gruppenId }; const badges = []; + (z.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatMin(z.minutenVon, z.minutenBis); if (zeit) badges.push(`${esc(zeit)}`); + if (z.level != null) badges.push(`Level ${esc(String(z.level))}`); const detailRows = []; if (z.text) detailRows.push(`
${esc(z.text)}
`); @@ -879,6 +885,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -896,6 +903,7 @@ function renderFinisher(f, type, gruppenId) { _itemData[f.finisherId] = { ...f, _kind: 'finisher', _gruppenId: gruppenId }; const badges = []; + (f.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); if (f.geschlecht) badges.push(`${esc(GESCHLECHT_LABEL[f.geschlecht] || f.geschlecht)}`); const detailRows = []; @@ -906,6 +914,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -944,10 +953,36 @@ finisher: apiUrl('/finisher') }; const ITEM_DELETE_FIELD = { aufgabe: 'aufgabeId', strafe: 'strafeId', zeitstrafe: 'sperreId', finisher: 'finisherId' }; + const ITEM_COPY_URL = { + aufgabe: apiUrl('/aufgabe/copy'), + strafe: '/strafe/copy', + zeitstrafe: '/sperre/copy', + finisher: apiUrl('/finisher/copy') + }; + + function duplicateItem(kind, itemId, gruppenId, event) { + event.stopPropagation(); + const copyUrl = ITEM_COPY_URL[kind]; + if (!copyUrl) return; + fetch(`${copyUrl}/${itemId}`, { method: 'POST' }).then(r => { + if (r.ok) { + pendingExpandId = gruppenId; + pendingExpandType = 'user'; + _notifyOnLoad = true; loadUserGruppen(); + } else { + document.getElementById('userActionError').textContent = 'Fehler beim Duplizieren (HTTP ' + r.status + ').'; + } + }).catch(() => { + document.getElementById('userActionError').textContent = 'Verbindungsfehler.'; + }); + } function deleteItem(kind, itemId, gruppenId, event) { event.stopPropagation(); - if (!confirm('Eintrag wirklich löschen?')) return; + openConfirmModal('Eintrag wirklich löschen?', () => _doDeleteItem(kind, itemId, gruppenId)); + } + + function _doDeleteItem(kind, itemId, gruppenId) { const deleteUrl = ITEM_DELETE_URL[kind]; if (!deleteUrl) return; const body = { [ITEM_DELETE_FIELD[kind]]: itemId }; @@ -1430,7 +1465,7 @@ const lbl = document.querySelector(`#iSperreFuer input[value="${v}"]`)?.closest('label'); if (lbl) lbl.style.display = isChastity ? 'none' : ''; }); - document.getElementById('iTempUnlockRow').style.display = (isZeit && isChastity) ? 'block' : 'none'; + document.getElementById('iTempUnlockRow').style.display = ((isZeit || isFinisher) && isChastity) ? 'block' : 'none'; document.getElementById('iReleaseTextRow').style.display = isZeit ? 'block' : 'none'; } @@ -1449,8 +1484,7 @@ document.querySelectorAll('#iWerkzeugFinisherPassiv input').forEach(cb => cb.checked = false); document.querySelectorAll('#iSperreFuer input').forEach(cb => cb.checked = false); document.querySelectorAll('#iGeschlecht input').forEach(rb => rb.checked = false); - document.getElementById('iTempUnlockBefore').checked = false; - document.getElementById('iTempUnlockAfter').checked = false; + document.getElementById('iTempUnlockRequired').checked = false; _selectedToys = []; renderSelectedToys(); document.getElementById('itemModalError').style.display = 'none'; @@ -1495,6 +1529,9 @@ const rb = document.querySelector(`#iGeschlecht input[value="${d.geschlecht}"]`); if (rb) rb.checked = true; } + if (_isChastityMode) { + document.getElementById('iTempUnlockRequired').checked = d.tempUnlockRequired === true; + } } else { document.getElementById('iMinVon').value = d.minutenVon != null ? d.minutenVon : ''; document.getElementById('iMinBis').value = d.minutenBis != null ? d.minutenBis : ''; @@ -1502,8 +1539,7 @@ (d.sperreFuer || []).forEach(w => { const cb = document.querySelector(`#iSperreFuer input[value="${w}"]`); if (cb) cb.checked = true; }); if (_isChastityMode) { document.getElementById('iLevel').value = d.level != null ? d.level : ''; - document.getElementById('iTempUnlockBefore').checked = d.tempUnlockBeforeRequired === true; - document.getElementById('iTempUnlockAfter').checked = d.tempUnlockAfterRequired === true; + document.getElementById('iTempUnlockRequired').checked = d.tempUnlockRequired === true; } } @@ -1666,11 +1702,12 @@ if (!_isChastityMode && !geschlecht) { showItemError('Bitte ein Geschlecht auswählen.'); return; } payload = { kurzText, text, - geschlecht: geschlecht || null, - gruppeId: isEdit ? undefined : currentItemGruppeId, - benoetigtAktiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherAktiv'), - benoetigtPassiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherPassiv'), - benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })) + geschlecht: geschlecht || null, + gruppeId: isEdit ? undefined : currentItemGruppeId, + benoetigtAktiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherAktiv'), + benoetigtPassiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherPassiv'), + benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })), + tempUnlockRequired: _isChastityMode ? document.getElementById('iTempUnlockRequired').checked : null }; url = isEdit ? apiUrl(`/finisher/${currentItemEditId}`) : apiUrl('/finisher'); method = isEdit ? 'PUT' : 'POST'; @@ -1698,8 +1735,7 @@ releaseText: document.getElementById('iReleaseText').value.trim() || null, sperreFuer, level: zeitLevel, - tempUnlockBeforeRequired: _isChastityMode ? document.getElementById('iTempUnlockBefore').checked : null, - tempUnlockAfterRequired: _isChastityMode ? document.getElementById('iTempUnlockAfter').checked : null, + tempUnlockRequired: _isChastityMode ? document.getElementById('iTempUnlockRequired').checked : null, benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })) }; url = isEdit ? `/sperre/${currentItemEditId}` : '/sperre'; // BDSM-only diff --git a/bin/main/static/games/bdsm/neubdsm.html b/bin/main/static/games/bdsm/neubdsm.html index 965d1a1..ee791ef 100644 --- a/bin/main/static/games/bdsm/neubdsm.html +++ b/bin/main/static/games/bdsm/neubdsm.html @@ -679,6 +679,7 @@ // ── Gruppe lists ── function renderGruppeList(containerId, gruppen) { + gruppen = gruppen.filter(g => g.availableIn !== 'CHASTITY_ONLY'); const ul = document.getElementById(containerId); const section = ul.closest('[id^="section"]'); const selectAllWrap = section?.querySelector('.select-all-label'); diff --git a/bin/main/static/games/chastity/neulock.html b/bin/main/static/games/chastity/neulock.html index 85885ba..576ad31 100644 --- a/bin/main/static/games/chastity/neulock.html +++ b/bin/main/static/games/chastity/neulock.html @@ -256,9 +256,14 @@
- +
+
@@ -515,6 +520,7 @@ khInput.readOnly = true; khInput.style.opacity = '0.6'; document.getElementById('rowTestLock').style.display = 'none'; + document.getElementById('rowSpeedFactor').style.display = 'none'; document.getElementById('rowDetailsVisible').style.display = ''; } else { khInput.readOnly = false; @@ -728,6 +734,15 @@ el.scrollIntoView({ behavior: 'smooth', block: 'center' }); } + function onTestLockChange() { + const checked = document.getElementById('testLock').checked; + document.getElementById('rowSpeedFactor').style.display = checked ? 'flex' : 'none'; + if (!checked) { + document.getElementById('speedFactor').value = 1; + document.getElementById('speedFactorLabel').textContent = '×1'; + } + } + // ── Absenden ── async function createSession() { document.getElementById('errorMsg').style.display = 'none'; @@ -756,6 +771,7 @@ const isFriendLockee = lockeeVal && lockeeVal !== myUserId; const unlockCodeLen = isFriendLockee ? null : (parseInt(document.getElementById('unlockCodeLines').value) || 5); const isTestLock = isFriendLockee ? false : document.getElementById('testLock').checked; + const speedFactor = isTestLock ? parseInt(document.getElementById('speedFactor').value) : 1; let endpoint, body; @@ -769,6 +785,7 @@ testLock: isTestLock, unlockCodeLength: unlockCodeLen, controllType: selectedLockControl, + speedFactor: speedFactor, }; } else { // CardLock @@ -798,6 +815,7 @@ controllType: selectedLockControl, gameSetId: t.gameSetId || null, gameSpieldauerIdx: t.gameSpieldauerIdx ?? null, + speedFactor: speedFactor, }; } diff --git a/bin/main/static/games/chastity/taskgame.html b/bin/main/static/games/chastity/taskgame.html index 8a6aeef..b2760fa 100644 --- a/bin/main/static/games/chastity/taskgame.html +++ b/bin/main/static/games/chastity/taskgame.html @@ -53,6 +53,48 @@ height: 2.75rem; } + .game-requirements { + margin: 0.75rem 0 0; + display: flex; + flex-direction: column; + gap: 0.4rem; + } + .game-requirements-label { + font-size: 0.7rem; + font-weight: 700; + text-transform: uppercase; + letter-spacing: 0.07em; + color: var(--color-muted); + margin-bottom: 0.1rem; + } + .req-check { + display: flex; + align-items: center; + gap: 0.55rem; + padding: 0.4rem 0.6rem; + border-radius: 7px; + background: rgba(255,255,255,0.03); + border: 1px solid var(--color-secondary); + cursor: pointer; + user-select: none; + transition: border-color 0.15s, background 0.15s; + font-size: 0.9rem; + color: var(--color-text); + } + .req-check input[type="checkbox"] { + accent-color: var(--color-primary); + width: 15px; + height: 15px; + flex-shrink: 0; + cursor: pointer; + } + .req-check.done { + border-color: var(--color-primary); + background: rgba(233,69,96,0.07); + color: var(--color-muted); + text-decoration: line-through; + } + .level-display { display: flex; justify-content: center; @@ -190,6 +232,7 @@ + + + @@ -340,6 +402,7 @@ async function startWithExcludedToys(gameSetId, excludedToyIds) { const params = new URLSearchParams({ aufgabenGruppeId: gameSetId }); + if (lockId) params.append('lockId', lockId); excludedToyIds.forEach(id => params.append('excludedToyIds', id)); const r = await fetch('/lock-game/init?' + params.toString(), { method: 'POST' }); @@ -417,6 +480,27 @@ await loadAndShowToys(sel.value); } + // ── Benötigt-Checkboxen ─────────────────────────────────────────────────── + + const WERKZEUG_LABEL = { + MUND: 'Mund', VAGINA: 'Vagina', PENIS: 'Penis', + ANUS: 'Anus', UMSCHNALLDILDO: 'Umschnall-Dildo' + }; + + function renderRequirements(list) { + const box = document.getElementById('gameRequirements'); + if (!list || list.length === 0) { box.style.display = 'none'; box.innerHTML = ''; return; } + box.innerHTML = '
Benötigt
' + + list.map(w => { + const label = WERKZEUG_LABEL[w] || w; + return ``; + }).join(''); + box.style.display = 'flex'; + } + // ── Game Loop ───────────────────────────────────────────────────────────── function setGameCard(label, text, action, btnLabel) { @@ -432,10 +516,16 @@ async function runGameLoop() { hide('gameCard'); hide('finisherBox'); + hide('tempOpeningBox'); clearTimer(); - if (_state.level >= 6) { - await showFinisherFlow(); + if (_state.finisher) { + showFinisherUI(); + return; + } + + if (_state.tempOpeningTime) { + showTempOpeningDialog(); return; } @@ -460,12 +550,14 @@ let sperre; try { sperre = JSON.parse(_state.lockInQueue); } catch { sperre = {}; } setGameCard('🔒 Neue Sperre', sperre.text || sperre.kurzText || '', 'queue-start', '▶ Starten'); + renderRequirements(null); } else if (_state.taskInQueue) { let aufgabe; try { aufgabe = JSON.parse(_state.taskInQueue); } catch { aufgabe = {}; } const hasDuration = !!(aufgabe.sekundenVon || aufgabe.sekundenBis); setGameCard('🎯 Neue Aufgabe', aufgabe.text || '', hasDuration ? 'queue-start' : 'queue-done', hasDuration ? '▶ Starten' : '✓ Erledigt'); + renderRequirements(aufgabe.benoetigtAktiv); } show('gameBox'); show('gameCard'); @@ -479,6 +571,7 @@ timerEl.textContent = ''; document.getElementById('gameLabel').textContent = 'Aktive Aufgabe'; document.getElementById('gameText').textContent = text; + renderRequirements(_state.activeTaskBenoetigtAktiv); if (endIso) { const end = new Date(endIso); @@ -504,12 +597,31 @@ async function doQueueStart() { try { - await checkAndShowLocks(); + const wasLock = !!_state.lockInQueue; + let tempUnlockRequired = false; + if (wasLock) { + try { tempUnlockRequired = JSON.parse(_state.lockInQueue).tempUnlockRequired === true; } catch (_) {} + } + const r = await fetch('/lock-game/apply-task', { method: 'POST' }); if (!r.ok) { showError('Fehler beim Starten'); return; } - const stateR = await fetch('/lock-game/state'); - _state = await stateR.json(); - await runGameLoop(); + + if (wasLock && tempUnlockRequired) { + await fetch('/lock-game/start-temp-opening', { method: 'POST' }); + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + showTempOpeningDialog(); + } else if (wasLock) { + const nextR = await fetch('/lock-game/abandon-task', { method: 'POST' }); + if (!nextR.ok) { showError('Fehler beim Ziehen'); return; } + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + await runGameLoop(); + } else { + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + await runGameLoop(); + } } catch (e) { showError(e.message || 'Fehler (Starten)'); } } @@ -526,16 +638,28 @@ } catch (e) { showError(e.message || 'Fehler (Erledigt)'); } } - function doCancelCountdown() { + async function doCancelCountdown() { clearTimer(); + const lockR = await fetch('/lock-game/check-locks', { method: 'POST' }); + if (lockR.ok) { + const texts = await lockR.json(); + for (const text of (texts || [])) { + if (text != null && text !== '') await waitForReleaseOk(text); + } + } _gameAction = 'active-done'; document.getElementById('gameBtn').textContent = '✓ Erledigt'; } async function doErledigt() { try { - await checkAndShowLocks(); - if (_state.level >= 6) { await showFinisherFlow(); return; } + const lockR = await fetch('/lock-game/check-locks', { method: 'POST' }); + if (lockR.ok) { + const texts = await lockR.json(); + for (const text of (texts || [])) { + if (text != null && text !== '') await waitForReleaseOk(text); + } + } const r = await fetch('/lock-game/next-task', { method: 'POST' }); if (!r.ok) { showError('Fehler beim Ziehen'); return; } const stateR = await fetch('/lock-game/state'); @@ -557,51 +681,87 @@ } } - async function showFinisherFlow() { + function showTempOpeningDialog() { show('gameBox'); hide('gameCard'); hide('lockReleaseBox'); hide('finisherBox'); - // 1. Release-Texte sequenziell anzeigen + document.getElementById('tempOpeningTask').textContent = _state.activeTask || ''; + const code = _state.tempOpeningCode; + if (code) { + document.getElementById('tempOpeningCode').textContent = code; + show('tempOpeningCodeRow'); + } else { + hide('tempOpeningCodeRow'); + } + show('tempOpeningBox'); + } + + async function doEndTempOpening() { try { - const r = await fetch('/lock-game/release-locks'); - if (r.ok) { - const texts = await r.json(); - for (const text of texts) { - await waitForReleaseOk(text); - } - } - } catch (_) { /* ignorieren */ } + await fetch('/lock-game/end-temp-opening', { method: 'POST' }); + await fetch('/lock-game/abandon-task', { method: 'POST' }); + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + hide('tempOpeningBox'); + await runGameLoop(); + } catch (e) { showError(e.message || 'Fehler beim Abschluss der temporären Öffnung'); } + } - // 2. Finisher laden und Zeit messen - const finisherStartTime = Date.now(); - let finisher = null; - try { - const r = await fetch('/lock-game/finisher'); - if (r.ok) finisher = await r.json(); - } catch (_) { /* ignorieren */ } + function showFinisherUI() { + show('gameBox'); + hide('gameCard'); + hide('lockReleaseBox'); - document.getElementById('finisherTitle').textContent = finisher?.kurzText || ''; - document.getElementById('finisherText').textContent = finisher?.text || 'Glückwunsch – du hast Level 6 erreicht!'; + let finisher = {}; + try { finisher = JSON.parse(_state.finisher); } catch (_) {} + document.getElementById('finisherTitle').textContent = finisher.kurzText || ''; + document.getElementById('finisherText').textContent = finisher.text || ''; - // 3. Warten bis Nutzer OK drückt - await new Promise(resolve => { - document.getElementById('btnFinisherOk').onclick = resolve; - show('finisherBox'); - }); + if (_state.finisherStartedAt) { + hide('finisherStart'); + show('finisherRunning'); + startElapsedTimer(new Date(_state.finisherStartedAt)); + } else { + show('finisherStart'); + hide('finisherRunning'); + } + show('finisherBox'); + } - // 4. Zeit berechnen und Spiel beenden - const timeInMinutes = Math.round((Date.now() - finisherStartTime) / 60000); - const params = new URLSearchParams({ timeInMinutes }); - if (lockId) params.set('lockId', lockId); - await fetch('/lock-game/complete?' + params.toString(), { method: 'POST' }); + async function doStartFinisher() { + await fetch('/lock-game/start-finisher', { method: 'POST' }); + const r = await fetch('/lock-game/state'); + _state = await r.json(); + hide('finisherStart'); + show('finisherRunning'); + startElapsedTimer(new Date(_state.finisherStartedAt)); + } + + async function doEndFinisher() { + clearTimer(); + await fetch('/lock-game/end-finisher', { method: 'POST' }); + const url = '/lock-game/complete' + (lockId ? '?lockId=' + lockId : ''); + await fetch(url, { method: 'POST' }); goBack(); } + function startElapsedTimer(startDate) { + clearTimer(); + const el = document.getElementById('finisherTimer'); + _timerInt = setInterval(() => { + const diff = Math.floor((Date.now() - startDate) / 1000); + const m = String(Math.floor(diff / 60)).padStart(2, '0'); + const s = String(diff % 60).padStart(2, '0'); + el.textContent = m + ':' + s; + }, 1000); + } + function waitForReleaseOk(text) { return new Promise(resolve => { - document.getElementById('releaseText').textContent = text; + hide('gameCard'); + document.getElementById('releaseText').textContent = text || ''; document.getElementById('btnReleaseOk').onclick = () => { hide('lockReleaseBox'); resolve(); diff --git a/bin/test/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.class b/bin/test/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.class index 8097cd265ef89c68e97520ea5e6ea514b94a59b4..d54f67658f2c55a6dbb16214c86b6852ff9934fe 100644 GIT binary patch delta 33 ocmZ24zd?S36O)K=acW6GW^%S`S!z*baB6aXUP|%iP^Kte0LtrYK$jzRL@F diff --git a/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameService.java b/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameService.java index 21fd5cc..339f7e8 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameService.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/BdsmGameService.java @@ -127,12 +127,12 @@ public class BdsmGameService { newLock.setLockee(lockeeUserId); newLock.setKeyholder(keyholderUserId); newLock.setInitialCards(template.getInitialCards()); - newLock.setPickEveryMinute(template.getPickEveryMinute()); + newLock.setPickEverySeconds(template.getPickEverySeconds()); newLock.setAccumulatePicks(template.isAccumulatePicks()); newLock.setShowRemainingCards(template.isShowRemainingCards()); newLock.setLatestOpeningtime(template.getLatestOpeningtime()); - newLock.setHygineOpeningDurationMinutes(template.getHygineOpeningDurationMinutes()); - newLock.setHygineOpeningEveryMinites(template.getHygineOpeningEveryMinites()); + newLock.setHygineOpeningDurationSeconds(template.getHygineOpeningDurationSeconds()); + newLock.setHygineOpeningEverySeconds(template.getHygineOpeningEverySeconds()); newLock.setTasks(template.getTasks()); newLock.setRequiresVerification(template.isRequiresVerification()); newLock.setTestLock(false); @@ -149,10 +149,10 @@ public class BdsmGameService { newLock.setAvailableCards(template.getInitialCards() != null ? new ArrayList<>(template.getInitialCards()) : new ArrayList<>()); newLock.setOpenPicks(0); - if (template.getPickEveryMinute() != null) { - newLock.setNextCardIn(now.plusMinutes(template.getPickEveryMinute())); + if (template.getPickEverySeconds() != null) { + newLock.setNextCardIn(now.plusSeconds(template.getPickEverySeconds())); } - if (template.getHygineOpeningEveryMinites() != null) { + if (template.getHygineOpeningEverySeconds() != null) { newLock.setLastHygineOpening(now); } cardlockRepository.save(newLock); diff --git a/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java b/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java index 476b237..bc68740 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/controller/AufgabeController.java @@ -103,6 +103,28 @@ public class AufgabeController { return ResponseEntity.ok().build(); } + @PostMapping("/copy/{aufgabeId}") + public ResponseEntity copy(@PathVariable("aufgabeId") UUID aufgabeId, Principal principal) { + AufgabeEntity source = aufgabeRepository.findById(aufgabeId).orElse(null); + if (source == null) return ResponseEntity.notFound().build(); + AufgabenGruppeEntity gruppe = source.getAufgabenGruppe(); + int limit = limitService.maxTasksPerGroup(userService.requireUser(principal).getUserId()); + if (gruppe.getAufgaben().size() >= limit) return ResponseEntity.status(409).build(); + AufgabeEntity copy = new AufgabeEntity(); + copy.setAufgabeId(UUID.randomUUID()); + copy.setAufgabenGruppe(gruppe); + copy.setKurzText(source.getKurzText() + " (Kopie)"); + copy.setText(source.getText()); + copy.setLevel(source.getLevel()); + copy.setSekundenVon(source.getSekundenVon()); + copy.setSekundenBis(source.getSekundenBis()); + copy.setBenoetigtAktiv(source.getBenoetigtAktiv()); + copy.setBenoetigtPassiv(source.getBenoetigtPassiv()); + copy.setBenoetigteToys(new ArrayList<>(source.getBenoetigteToys() != null ? source.getBenoetigteToys() : List.of())); + aufgabeRepository.save(copy); + return ResponseEntity.ok().build(); + } + @DeleteMapping public ResponseEntity delete(@RequestBody Aufgabe aufgabe) { try { diff --git a/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java b/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java index 6a3ac01..5b05c79 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/controller/BdsmGameController.java @@ -538,7 +538,7 @@ public class BdsmGameController extends BaseController { Map item = new LinkedHashMap<>(); item.put("lockId", l.getLockId()); item.put("name", l.getName() != null ? l.getName() : "Unbenanntes Lock"); - item.put("pickEveryMinute", l.getPickEveryMinute()); + item.put("pickEveryMinute", l.getPickEverySeconds() / 60); item.put("totalCards", l.getInitialCards() != null ? l.getInitialCards().size() : 0); item.put("active", l.getStartTime() != null && l.getUnlockTime() == null); return item; diff --git a/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java b/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java index c6fe989..2244924 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/controller/FinisherController.java @@ -88,11 +88,32 @@ public class FinisherController { entity.setBenoetigtAktiv(finisher.getBenoetigtAktiv()); entity.setBenoetigtPassiv(finisher.getBenoetigtPassiv()); entity.setBenoetigteToys(resolveToys(finisher.getBenoetigteToys())); + entity.setTempUnlockRequired(finisher.getTempUnlockRequired()); finisherRepository.save(entity); LOGGER.debug("Finisher {} aktualisiert", finisherId); return ResponseEntity.ok().build(); } + @PostMapping("/copy/{finisherId}") + public ResponseEntity copy(@PathVariable("finisherId") UUID finisherId) { + FinisherEntity source = finisherRepository.findById(finisherId).orElse(null); + if (source == null) return ResponseEntity.notFound().build(); + AufgabenGruppeEntity gruppe = source.getAufgabenGruppe(); + if (gruppe.getFinisher().size() >= 100) return ResponseEntity.status(409).build(); + FinisherEntity copy = new FinisherEntity(); + copy.setFinisherId(UUID.randomUUID()); + copy.setAufgabenGruppe(gruppe); + copy.setKurzText(source.getKurzText() + " (Kopie)"); + copy.setText(source.getText()); + copy.setGeschlecht(source.getGeschlecht()); + copy.setBenoetigtAktiv(source.getBenoetigtAktiv()); + copy.setBenoetigtPassiv(source.getBenoetigtPassiv()); + copy.setTempUnlockRequired(source.getTempUnlockRequired()); + copy.setBenoetigteToys(new ArrayList<>(source.getBenoetigteToys() != null ? source.getBenoetigteToys() : List.of())); + finisherRepository.save(copy); + return ResponseEntity.ok().build(); + } + @DeleteMapping public ResponseEntity delete(@RequestBody Finisher finisher) { try { diff --git a/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java b/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java index 83f6ce1..fd6111c 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/controller/SperreController.java @@ -56,7 +56,7 @@ public class SperreController { @PostMapping public ResponseEntity create(@RequestBody Sperre sperre) { if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null - || sperre.getGruppeId() == null || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { + || sperre.getGruppeId() == null) { return ResponseEntity.badRequest().build(); } AufgabenGruppeEntity gruppeEntity = gruppeRepository.findById(sperre.getGruppeId()).orElse(null); @@ -77,8 +77,7 @@ public class SperreController { @PutMapping("/{sperreId}") public ResponseEntity update(@PathVariable("sperreId") UUID sperreId, @RequestBody Sperre sperre) { - if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null - || sperre.getSperreFuer() == null || sperre.getSperreFuer().isEmpty()) { + if (sperre.getKurzText() == null || sperre.getText() == null || sperre.getMinutenVon() == null) { return ResponseEntity.badRequest().build(); } SperreEntity entity = sperreRepository.findById(sperreId).orElse(null); @@ -89,8 +88,7 @@ public class SperreController { entity.setMinutenVon(sperre.getMinutenVon()); entity.setMinutenBis(sperre.getMinutenBis()); entity.setLevel(sperre.getLevel()); - entity.setTempUnlockBeforeRequired(sperre.getTempUnlockBeforeRequired()); - entity.setTempUnlockAfterRequired(sperre.getTempUnlockAfterRequired()); + entity.setTempUnlockRequired(sperre.getTempUnlockRequired()); entity.setSperreFuer(sperre.getSperreFuer()); entity.setBenoetigteToys(resolveToys(sperre.getBenoetigteToys())); sperreRepository.save(entity); @@ -98,6 +96,28 @@ public class SperreController { return ResponseEntity.ok().build(); } + @PostMapping("/copy/{sperreId}") + public ResponseEntity copy(@PathVariable("sperreId") UUID sperreId) { + SperreEntity source = sperreRepository.findById(sperreId).orElse(null); + if (source == null) return ResponseEntity.notFound().build(); + AufgabenGruppeEntity gruppe = source.getAufgabenGruppe(); + if (gruppe.getSperren().size() >= 100) return ResponseEntity.status(409).build(); + SperreEntity copy = new SperreEntity(); + copy.setSperreId(UUID.randomUUID()); + copy.setAufgabenGruppe(gruppe); + copy.setKurzText(source.getKurzText() + " (Kopie)"); + copy.setText(source.getText()); + copy.setReleaseText(source.getReleaseText()); + copy.setLevel(source.getLevel()); + copy.setMinutenVon(source.getMinutenVon()); + copy.setMinutenBis(source.getMinutenBis()); + copy.setSperreFuer(source.getSperreFuer()); + copy.setTempUnlockRequired(source.getTempUnlockRequired()); + copy.setBenoetigteToys(new ArrayList<>(source.getBenoetigteToys() != null ? source.getBenoetigteToys() : List.of())); + sperreRepository.save(copy); + return ResponseEntity.ok().build(); + } + @DeleteMapping public ResponseEntity delete(@RequestBody Sperre sperre) { try { diff --git a/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java b/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java index c1b3e09..720aed0 100644 --- a/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java +++ b/src/main/java/de/oaa/xxx/games/bdsm/controller/StrafeController.java @@ -94,6 +94,27 @@ public class StrafeController { return ResponseEntity.ok().build(); } + @PostMapping("/copy/{strafeId}") + public ResponseEntity copy(@PathVariable("strafeId") UUID strafeId) { + StrafeEntity source = strafeRepository.findById(strafeId).orElse(null); + if (source == null) return ResponseEntity.notFound().build(); + AufgabenGruppeEntity gruppe = source.getAufgabenGruppe(); + if (gruppe.getStrafen().size() >= 100) return ResponseEntity.status(409).build(); + StrafeEntity copy = new StrafeEntity(); + copy.setStrafeId(UUID.randomUUID()); + copy.setAufgabenGruppe(gruppe); + copy.setKurzText(source.getKurzText() + " (Kopie)"); + copy.setText(source.getText()); + copy.setLevel(source.getLevel()); + copy.setSekundenVon(source.getSekundenVon()); + copy.setSekundenBis(source.getSekundenBis()); + copy.setBenoetigtAktiv(source.getBenoetigtAktiv()); + copy.setBenoetigtPassiv(source.getBenoetigtPassiv()); + copy.setBenoetigteToys(new ArrayList<>(source.getBenoetigteToys() != null ? source.getBenoetigteToys() : List.of())); + strafeRepository.save(copy); + return ResponseEntity.ok().build(); + } + @DeleteMapping public ResponseEntity delete(@RequestBody Strafe strafe) { try { diff --git a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java index c74e72c..d5dd892 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java +++ b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockController.java @@ -125,7 +125,8 @@ public class CardLockController { List initialCards, Integer pickEveryMinute, boolean accumulatePicks, boolean showRemainingCards, LocalDateTime latestOpeningtime, Integer hygineOpeningDurationMinutes, Integer hygineOpeningEveryMinites, List tasks, boolean requiresVerification, boolean testLock, Integer unlockCodeLines, - TaskMode taskMode, LockControllType controllType, UUID gameSetId, Integer gameSpieldauerIdx) { + TaskMode taskMode, LockControllType controllType, UUID gameSetId, Integer gameSpieldauerIdx, + Integer speedFactor) { } private static final SecureRandom RNG = new SecureRandom(); @@ -166,12 +167,12 @@ public class CardLockController { lock.setLockee(lockee.getUserId()); lock.setKeyholder(myId); lock.setInitialCards(req.initialCards()); - lock.setPickEveryMinute(req.pickEveryMinute()); + lock.setPickEverySeconds(req.pickEveryMinute() * 60); lock.setAccumulatePicks(req.accumulatePicks()); lock.setShowRemainingCards(req.showRemainingCards()); lock.setLatestOpeningtime(req.latestOpeningtime()); - lock.setHygineOpeningDurationMinutes(req.hygineOpeningDurationMinutes()); - lock.setHygineOpeningEveryMinites(req.hygineOpeningEveryMinites()); + lock.setHygineOpeningDurationSeconds(req.hygineOpeningDurationMinutes() != null ? req.hygineOpeningDurationMinutes() * 60 : null); + lock.setHygineOpeningEverySeconds(req.hygineOpeningEveryMinites() != null ? req.hygineOpeningEveryMinites() * 60 : null); lock.setTasks(req.tasks() != null ? req.tasks() : List.of()); lock.setRequiresVerification(req.requiresVerification()); lock.setTestLock(false); @@ -206,21 +207,23 @@ public class CardLockController { } int codeLines = (req.unlockCodeLines() != null && req.unlockCodeLines() >= 1) ? req.unlockCodeLines() : 5; + int sf = (req.testLock() && req.speedFactor() != null && req.speedFactor() > 1) ? req.speedFactor() : 1; CardLockEntity lock = new CardLockEntity(); lock.setName(req.name()); lock.setLockee(myId); lock.setKeyholder(null); // set only after invitation is confirmed lock.setInitialCards(req.initialCards()); - lock.setPickEveryMinute(req.pickEveryMinute()); + lock.setPickEverySeconds(req.pickEveryMinute() * 60); lock.setAccumulatePicks(req.accumulatePicks()); lock.setShowRemainingCards(req.showRemainingCards()); lock.setLatestOpeningtime(req.latestOpeningtime()); - lock.setHygineOpeningDurationMinutes(req.hygineOpeningDurationMinutes()); - lock.setHygineOpeningEveryMinites(req.hygineOpeningEveryMinites()); + lock.setHygineOpeningDurationSeconds(req.hygineOpeningDurationMinutes() != null ? req.hygineOpeningDurationMinutes() * 60 : null); + lock.setHygineOpeningEverySeconds(req.hygineOpeningEveryMinites() != null ? req.hygineOpeningEveryMinites() * 60 : null); lock.setTasks(req.tasks() != null ? req.tasks() : List.of()); lock.setRequiresVerification(req.requiresVerification()); lock.setTestLock(req.testLock()); + lock.setSpeedFactor(sf > 1 ? sf : null); lock.setTaskMode(req.taskMode() != null ? req.taskMode() : TaskMode.RANDOM); lock.setUnlockCodeLength(codeLines); lock.setControllType(controllType); @@ -231,8 +234,9 @@ public class CardLockController { lock.setStartTime(now); lock.setAvailableCards(new ArrayList<>(req.initialCards())); lock.setOpenPicks(0); - lock.setNextCardIn(now.plusMinutes(req.pickEveryMinute())); - if (req.hygineOpeningEveryMinites() != null) { + long firstCardSeconds = sf > 1 ? Math.max(6L, req.pickEveryMinute() * 60L / sf) : req.pickEveryMinute() * 60L; + lock.setNextCardIn(now.plusSeconds(firstCardSeconds)); + if (req.hygineOpeningEveryMinites() != null) { // stored as seconds already above lock.setLastHygineOpening(now); } cardlockRepository.save(lock); // erst speichern, damit Lock-ID vorhanden ist @@ -243,7 +247,7 @@ public class CardLockController { "🃏 Deine erste Karte ist bereit – jetzt ziehen!", "/games/chastity/activelock.html?lockId=" + lock.getLockId(), de.oaa.xxx.social.entity.MessageCause.GAME_STATE, - now.plusMinutes(req.pickEveryMinute())); + now.plusSeconds(firstCardSeconds)); // Initialen Unlock-Code / TTLock-PIN via LockControl setzen CardLockService initService = cardLockServiceFactory.create(lock); @@ -307,9 +311,10 @@ public class CardLockController { result.put("taskPending", taskPending); // Nächste Karte: geplante Benachrichtigung anlegen (echte nextCardIn aus Entity) + int drawSf = (l.getSpeedFactor() != null && l.getSpeedFactor() > 1) ? l.getSpeedFactor() : 1; LocalDateTime nextCard = l.getNextCardIn() != null ? l.getNextCardIn() - : LocalDateTime.now().plusMinutes(l.getPickEveryMinute()); + : LocalDateTime.now().plusSeconds(drawSf > 1 ? Math.max(6L, l.getPickEverySeconds() / drawSf) : l.getPickEverySeconds()); systemMessageService.sendScheduled( myId, myId, "🃏 Deine nächste Karte ist bereit – jetzt ziehen!", @@ -345,7 +350,7 @@ public class CardLockController { cardLockServiceFactory.create(l).startHygieneOpening(); int actualDuration = l.getTempOpeningDuration() != null ? l.getTempOpeningDuration() - : (l.getHygineOpeningDurationMinutes() != null ? l.getHygineOpeningDurationMinutes() : 30); + : (l.getHygineOpeningDurationSeconds() != null ? l.getHygineOpeningDurationSeconds() / 60 : 30); return ResponseEntity.ok(Map.of("unlockCode", l.getUnlockCode(), "durationMinutes", actualDuration)); } @@ -471,13 +476,15 @@ public class CardLockController { long totalCards = l.getAvailableCards() != null ? l.getAvailableCards().size() : 0; // Hygiene-Berechnung - boolean hygieneEnabled = l.getHygineOpeningEveryMinites() != null; + boolean hygieneEnabled = l.getHygineOpeningEverySeconds() != null; boolean hygieneOpeningDue = false; long hygieneSecondsRemaining = 0; if (hygieneEnabled) { + int lockSf = (l.getSpeedFactor() != null && l.getSpeedFactor() > 1) ? l.getSpeedFactor() : 1; + long hygineSeconds = lockSf > 1 ? Math.max(6L, l.getHygineOpeningEverySeconds() / lockSf) : l.getHygineOpeningEverySeconds(); LocalDateTime base = l.getLastHygineOpening() != null ? l.getLastHygineOpening() : l.getStartTime(); if (base != null) { - LocalDateTime nextHygiene = base.plusMinutes(l.getHygineOpeningEveryMinites()); + LocalDateTime nextHygiene = base.plusSeconds(hygineSeconds); hygieneSecondsRemaining = ChronoUnit.SECONDS.between(LocalDateTime.now(), nextHygiene); hygieneOpeningDue = hygieneSecondsRemaining <= 0; } @@ -507,7 +514,7 @@ public class CardLockController { result.put("hygieneOpeningStarted", l.getTempOpeningTime() != null ? l.getTempOpeningTime().toString() : null); result.put("hygieneDurationMinutes", - l.getHygineOpeningDurationMinutes() != null ? l.getHygineOpeningDurationMinutes() : 0); + l.getHygineOpeningDurationSeconds() != null ? l.getHygineOpeningDurationSeconds() / 60 : 0); result.put("hasKeyholder", l.getKeyholder() != null); result.put("keyholderInvitationPending", l.getKeyholder() == null && !invitationRepository.findByLockId(l.getLockId()).isEmpty()); @@ -680,7 +687,9 @@ public class CardLockController { UUID gameSetId = l.getGameSetId(); l.setGameCardParkedAt(null); l.setFrozenUntil(null); - l.setNextCardIn(LocalDateTime.now().plusMinutes(l.getPickEveryMinute() != null ? l.getPickEveryMinute() : 60)); + int pickSecs = l.getPickEverySeconds() != null ? l.getPickEverySeconds() : 3600; + int gameSf = (l.getSpeedFactor() != null && l.getSpeedFactor() > 1) ? l.getSpeedFactor() : 1; + l.setNextCardIn(LocalDateTime.now().plusSeconds(gameSf > 1 ? Math.max(6L, pickSecs / gameSf) : pickSecs)); l.setGameActive(true); cardlockRepository.save(l); @@ -976,13 +985,13 @@ public class CardLockController { l.getAvailableCards().forEach(c -> cardCounts.merge(c.name(), 1L, Long::sum)); } - boolean hygieneEnabled = l.getHygineOpeningEveryMinites() != null; + boolean hygieneEnabled = l.getHygineOpeningEverySeconds() != null; boolean hygieneOpeningDue = false; long hygieneSecondsRemaining = 0; if (hygieneEnabled) { LocalDateTime base = l.getLastHygineOpening() != null ? l.getLastHygineOpening() : l.getStartTime(); if (base != null) { - LocalDateTime nextHygiene = base.plusMinutes(l.getHygineOpeningEveryMinites()); + LocalDateTime nextHygiene = base.plusSeconds(l.getHygineOpeningEverySeconds()); hygieneSecondsRemaining = ChronoUnit.SECONDS.between(LocalDateTime.now(), nextHygiene); hygieneOpeningDue = hygieneSecondsRemaining <= 0; } diff --git a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java index c827d2c..0649ffe 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java +++ b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockEntity.java @@ -24,7 +24,7 @@ public class CardLockEntity extends BaseLockEntity { @Column(columnDefinition = "TEXT") private List initialCards; @Column - private Integer pickEveryMinute; + private Integer pickEverySeconds; @Column private boolean accumulatePicks; @Column diff --git a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java index 4ba2516..b015691 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java +++ b/src/main/java/de/oaa/xxx/games/chastity/cardlock/CardLockService.java @@ -98,12 +98,12 @@ public class CardLockService extends BaseLockService implements LockControlCallb @Override protected void applyHygieneOvertime(Long overtime) { - long penalty = Math.round(overtime * 4 * getTimeMultiplier()); - LOGGER.debug("Apply {} Minutes Overtime (penalty: {})", overtime, penalty); + long penaltySeconds = Math.round(overtime * 4 * 60.0 * getTimeMultiplier()); + LOGGER.debug("Apply {} Minutes Overtime (penalty: {} seconds)", overtime, penaltySeconds); if (lock.getFrozenUntil() != null) { - lock.setFrozenUntil(lock.getFrozenUntil().plusMinutes(penalty)); + lock.setFrozenUntil(lock.getFrozenUntil().plusSeconds(penaltySeconds)); } else { - lock.setFrozenUntil(LocalDateTime.now().plusMinutes(penalty)); + lock.setFrozenUntil(LocalDateTime.now().plusSeconds(penaltySeconds)); } LOGGER.debug("Frozen until {}", lock.getFrozenUntil()); } @@ -128,7 +128,7 @@ public class CardLockService extends BaseLockService implements LockControlCallb } } else { if (lock.getNextCardIn().isBefore(LocalDateTime.now())) { - lock.setNextCardIn(LocalDateTime.now().plusMinutes(Math.round(lock.getPickEveryMinute() * getTimeMultiplier()))); + lock.setNextCardIn(LocalDateTime.now().plusSeconds(Math.round(lock.getPickEverySeconds() * 1.0 * getTimeMultiplier()))); card = getRandomCard(); } } @@ -175,16 +175,16 @@ public class CardLockService extends BaseLockService implements LockControlCallb } public String freeze() { - var multiplier = lock.getPickEveryMinute() * new Random().nextDouble(1.0, 4.0) * getTimeMultiplier(); + var multiplier = lock.getPickEverySeconds() * 1.0 * new Random().nextDouble(1.0, 4.0) * getTimeMultiplier(); freeze(multiplier); return ""; } - private String freeze(double multiplier) { - LocalDateTime frozenTill = LocalDateTime.now().plus((long) multiplier, ChronoUnit.MINUTES); + private String freeze(double seconds) { + LocalDateTime frozenTill = LocalDateTime.now().plus((long) seconds, ChronoUnit.SECONDS); lock.setFrozenUntil(frozenTill); lock.setNextCardIn(frozenTill); - LOGGER.info("[CardLock {}] FREEZE: eingefroren für {} Minuten (bis {})", lock.getLockee(), (long) multiplier, frozenTill); + LOGGER.info("[CardLock {}] FREEZE: eingefroren für {} Sekunden (bis {})", lock.getLockee(), (long) seconds, frozenTill); return ""; } @@ -247,9 +247,9 @@ public class CardLockService extends BaseLockService implements LockControlCallb } public void startHygieneOpening() { - int base = lock.getHygineOpeningDurationMinutes() != null ? lock.getHygineOpeningDurationMinutes() : 30; - int duration = (int) Math.round(base * getTimeMultiplier()); - startTempOpening(TempOpeningReason.HYGIENE, duration); + int baseSecs = lock.getHygineOpeningDurationSeconds() != null ? lock.getHygineOpeningDurationSeconds() : (30 * 60); + int durationMinutes = (int) Math.round(baseSecs / 60.0 * getTimeMultiplier()); + startTempOpening(TempOpeningReason.HYGIENE, durationMinutes); } // ── Cum cards ───────────────────────────────────────────────────────────── @@ -313,23 +313,24 @@ public class CardLockService extends BaseLockService implements LockControlCallb private double getTimeMultiplier() { LocalDateTime now = LocalDateTime.now(); + double sf = (lock.getSpeedFactor() != null && lock.getSpeedFactor() > 1) ? lock.getSpeedFactor() : 1.0; if (lock.getSpeedupUntil() != null && lock.getSpeedupUntil().isAfter(now)) { - return 0.25; + return 0.25 / sf; } if (lock.getSlowmoUntil() != null && lock.getSlowmoUntil().isAfter(now)) { - return 4.0; + return 4.0 / sf; } - return 1.0; + return 1.0 / sf; } @Override - protected void handleLockGameFinished(int timeInMinutes) { - int freezeTime = (int) (timeInMinutes * new Random().nextDouble(1.0, 4.0)); - freeze(freezeTime); + protected void handleLockGameFinished(int timeInSeconds) { + double freezeSeconds = timeInSeconds * new Random().nextDouble(1.0, 4.0); + freeze(freezeSeconds); } @Override public void penaltyLockGame() { - handleLockGameFinished(60); + handleLockGameFinished(3600); } } diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockEntity.java b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockEntity.java index 593499e..dd5c65c 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockEntity.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockEntity.java @@ -64,9 +64,9 @@ public class BaseLockEntity { @Column private LocalDateTime lastHygineOpening; @Column - private Integer hygineOpeningDurationMinutes; + private Integer hygineOpeningDurationSeconds; @Column - private Integer hygineOpeningEveryMinites; + private Integer hygineOpeningEverySeconds; @Column private LocalDateTime tempOpeningTime; // If null, not while hygine opening @Column @@ -90,6 +90,9 @@ public class BaseLockEntity { @Column(nullable = false) private TaskMode taskMode = TaskMode.RANDOM; + @Column + private Integer speedFactor; + // --- Notfall- & Keyholder-Status --- @Column(nullable = false) private boolean keyholderRequestedUnlock = false; diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockHelper.java b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockHelper.java new file mode 100644 index 0000000..713d903 --- /dev/null +++ b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockHelper.java @@ -0,0 +1,20 @@ +package de.oaa.xxx.games.chastity.common; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +public class BaseLockHelper { + + private BaseLockHelper() {} + + public static Long calcOvertime(BaseLockEntity lock) { + LocalDateTime now = LocalDateTime.now(); + if (lock.getTempOpeningTime() != null && lock.getTempOpeningDuration() != null) { + LocalDateTime dueTime = lock.getTempOpeningTime().plusMinutes(lock.getTempOpeningDuration()); + if (now.isAfter(dueTime)) { + return ChronoUnit.MINUTES.between(dueTime, now); + } + } + return null; + } +} diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockService.java b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockService.java index 2af66d7..b752a9b 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockService.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/BaseLockService.java @@ -3,7 +3,6 @@ package de.oaa.xxx.games.chastity.common; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; import java.util.Random; import java.util.Set; import java.util.UUID; @@ -17,13 +16,13 @@ import de.oaa.xxx.games.chastity.community.CommunityTaskVoteEntity; import de.oaa.xxx.games.chastity.community.CommunityTaskVoteRepository; import de.oaa.xxx.games.chastity.community.CommunityVerificationRepository; import de.oaa.xxx.games.chastity.community.CommunityVerificationVoteRepository; -import de.oaa.xxx.games.chastity.timelock.TimeLockRepository; import de.oaa.xxx.games.chastity.keyholder.KeyholderNotificationEntity; import de.oaa.xxx.games.chastity.keyholder.KeyholderNotificationRepository; import de.oaa.xxx.games.chastity.keyholder.KeyholderTaskChoiceEntity; import de.oaa.xxx.games.chastity.keyholder.KeyholderTaskChoiceRepository; import de.oaa.xxx.games.chastity.keyholder.KeyholderVerificationRepository; import de.oaa.xxx.games.chastity.tasks.Task; +import de.oaa.xxx.games.chastity.timelock.TimeLockRepository; import de.oaa.xxx.games.chastity.unlock.TempOpeningReason; import de.oaa.xxx.games.chastity.unlock.UnlockCodeHistoryService; import de.oaa.xxx.games.history.GameHistoryEntity; @@ -70,7 +69,7 @@ public abstract class BaseLockService { /** TimeLock: lockControl.lock() nach dem Schließen der Hygiene-Öffnung aufrufen. */ protected void afterHygieneClosing() {} - protected abstract void handleLockGameFinished(int timeInMinutes); + protected abstract void handleLockGameFinished(int timeInSeconds); public abstract void penaltyLockGame(); @@ -111,18 +110,6 @@ public abstract class BaseLockService { // ── Gemeinsame Hilfsmethoden ────────────────────────────────────────────── - protected Long calcOvertime() { - LocalDateTime now = LocalDateTime.now(); - BaseLockEntity lock = getLock(); - if (lock.getTempOpeningTime() != null && lock.getTempOpeningDuration() != null) { - LocalDateTime dueTime = lock.getTempOpeningTime().plusMinutes(lock.getTempOpeningDuration()); - if (now.isAfter(dueTime)) { - return ChronoUnit.MINUTES.between(dueTime, now); - } - } - return null; - } - protected void reportKeyholder(Long overtime) { BaseLockEntity lock = getLock(); KeyholderNotificationEntity notification = new KeyholderNotificationEntity(); @@ -147,9 +134,9 @@ public abstract class BaseLockService { // ── Lock-Game Abschluss ─────────────────────────────────────────────────── - public void lockGameFinished(int timeInMinutes) { - LOGGER.info("[Lock {}] lockGameFinished nach {} Minuten", getLock().getLockee(), timeInMinutes); - handleLockGameFinished(timeInMinutes); + public void lockGameFinished(int timeInSeconds) { + LOGGER.info("[Lock {}] lockGameFinished nach {} Sekunden Overtime", getLock().getLockee(), timeInSeconds); + handleLockGameFinished(timeInSeconds); } @@ -227,7 +214,7 @@ public abstract class BaseLockService { public String endTempOpening() { var lock = getLock(); var now = LocalDateTime.now(); - var overtime = calcOvertime(); + var overtime = BaseLockHelper.calcOvertime(lock); if (overtime != null) { if (lock.getKeyholder() != null) { reportKeyholder(overtime); diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/GameState.java b/src/main/java/de/oaa/xxx/games/chastity/common/GameState.java index 9a9f2e8..8c3bb16 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/GameState.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/GameState.java @@ -1,15 +1,22 @@ package de.oaa.xxx.games.chastity.common; import java.time.LocalDateTime; +import java.util.List; import java.util.UUID; public record GameState( - UUID gameID, + UUID gameID, UUID userId, Integer level, String activeTask, LocalDateTime activeTaskEnd, + List activeTaskBenoetigtAktiv, String taskInQueue, - String lockInQueue) { - + String lockInQueue, + LocalDateTime tempOpeningTime, + Integer tempOpeningDuration, + String tempOpeningCode, + LocalDateTime finisherStartedAt, + String finisher) { + } diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameController.java b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameController.java index b9de450..9cfc1b6 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameController.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameController.java @@ -21,6 +21,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.oaa.xxx.games.chastity.cardlock.CardLockServiceFactory; import de.oaa.xxx.games.chastity.cardlock.CardlockRepository; +import de.oaa.xxx.games.chastity.lockcontroll.LockControlFactory; +import de.oaa.xxx.games.chastity.unlock.UnlockCodeHistoryService; import de.oaa.xxx.games.common.aufgaben.AufgabenList; import de.oaa.xxx.games.common.aufgaben.AvailableIn; import de.oaa.xxx.games.common.entity.AufgabeEntity; @@ -50,6 +52,9 @@ public class LockGameController { private final ObjectMapper objectMapper; private final CardlockRepository cardlockRepository; private final CardLockServiceFactory cardLockServiceFactory; + private BaseLockRepository baseLockRepository; + private UnlockCodeHistoryService unlockCodeHistoryService; + private LockControlFactory lockControlFactory; public LockGameController(LockGameRepository lockGameRepository, LockGameLockRepository lockGameLockRepository, @@ -60,7 +65,10 @@ public class LockGameController { UserService userService, ObjectMapper objectMapper, CardlockRepository cardlockRepository, - CardLockServiceFactory cardLockServiceFactory) { + CardLockServiceFactory cardLockServiceFactory, + BaseLockRepository baseLockRepository, + UnlockCodeHistoryService unlockCodeHistoryService, + LockControlFactory lockControlFactory) { this.lockGameRepository = lockGameRepository; this.lockGameLockRepository = lockGameLockRepository; this.aufgabenGruppeRepository = aufgabenGruppeRepository; @@ -71,6 +79,9 @@ public class LockGameController { this.objectMapper = objectMapper; this.cardlockRepository = cardlockRepository; this.cardLockServiceFactory = cardLockServiceFactory; + this.baseLockRepository = baseLockRepository; + this.unlockCodeHistoryService = unlockCodeHistoryService; + this.lockControlFactory = lockControlFactory; } /** Verfügbare CHASTITY_ONLY-Gruppen des angemeldeten Users. */ @@ -136,6 +147,7 @@ public class LockGameController { @PostMapping("/init") public ResponseEntity init( @RequestParam UUID aufgabenGruppeId, + @RequestParam UUID lockId, @RequestParam(required = false) List excludedToyIds, Principal principal) { UUID userId = userService.requireUser(principal).getUserId(); @@ -180,6 +192,10 @@ public class LockGameController { )); } + aufgaben.forEach(a -> { if (a.getBenoetigteToys() != null) a.getBenoetigteToys().forEach(t -> t.setBild(null)); }); + sperren.forEach(s -> { if (s.getBenoetigteToys() != null) s.getBenoetigteToys().forEach(t -> t.setBild(null)); }); + finisher.forEach(f -> { if (f.getBenoetigteToys() != null) f.getBenoetigteToys().forEach(t -> t.setBild(null)); }); + AufgabenList list = new AufgabenList(); list.setAufgaben(aufgaben); list.setSperren(sperren); @@ -196,11 +212,15 @@ public class LockGameController { return g; }); + game.setLockId(lockId); game.setAufgaben(aufgabenJson); game.setLevel(1); game.setAufgabenProLevel(AUFGABEN_PRO_LEVEL); game.setAufgabenAufAktuellemLevel(0); - game.setZeitfaktorZeitstrafen(1.0); + double zeitfaktor = baseLockRepository.findById(lockId) + .map(l -> l.getSpeedFactor() != null && l.getSpeedFactor() > 1 ? 1.0 / l.getSpeedFactor() : 1.0) + .orElse(1.0); + game.setZeitfaktorZeitstrafen(zeitfaktor); game.setSetupId(aufgabenGruppeId); game.setActiveTask(null); game.setActiveTaskEnd(null); @@ -290,17 +310,55 @@ public class LockGameController { } } - @GetMapping("/finisher") - public ResponseEntity getFinisher(Principal principal) { + @PostMapping("/start-finisher") + public ResponseEntity startFinisher(Principal principal) { UUID userId = userService.requireUser(principal).getUserId(); var opt = lockGameRepository.findByUserId(userId); if (opt.isEmpty()) return ResponseEntity.notFound().build(); try { - var finisher = buildService(opt.get()).getFinisher(); - Map result = new LinkedHashMap<>(); - result.put("kurzText", finisher.getKurzText()); - result.put("text", finisher.getText()); - return ResponseEntity.ok(result); + buildService(opt.get()).startFinisher(); + return ResponseEntity.noContent().build(); + } catch (Exception e) { + return ResponseEntity.internalServerError().body(Map.of("error", e.getMessage())); + } + } + + @PostMapping("/end-finisher") + public ResponseEntity endFinisher(Principal principal) { + UUID userId = userService.requireUser(principal).getUserId(); + var opt = lockGameRepository.findByUserId(userId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + try { + buildService(opt.get()).endFinisher(); + return ResponseEntity.noContent().build(); + } catch (Exception e) { + return ResponseEntity.internalServerError().body(Map.of("error", e.getMessage())); + } + } + + @Transactional + @PostMapping("/start-temp-opening") + public ResponseEntity startTempOpening(Principal principal) { + UUID userId = userService.requireUser(principal).getUserId(); + var opt = lockGameRepository.findByUserId(userId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + try { + buildService(opt.get()).startTempOpening(); + return ResponseEntity.noContent().build(); + } catch (Exception e) { + return ResponseEntity.internalServerError().body(Map.of("error", e.getMessage())); + } + } + + @Transactional + @PostMapping("/end-temp-opening") + public ResponseEntity endTempOpening(Principal principal) { + UUID userId = userService.requireUser(principal).getUserId(); + var opt = lockGameRepository.findByUserId(userId); + if (opt.isEmpty()) return ResponseEntity.notFound().build(); + try { + buildService(opt.get()).endTempOpening(); + return ResponseEntity.noContent().build(); } catch (Exception e) { return ResponseEntity.internalServerError().body(Map.of("error", e.getMessage())); } @@ -324,23 +382,20 @@ public class LockGameController { @PostMapping("/complete") public ResponseEntity completeGame( @RequestParam(required = false) UUID lockId, - @RequestParam(required = false, defaultValue = "0") int timeInMinutes, Principal principal) { UUID userId = userService.requireUser(principal).getUserId(); var opt = lockGameRepository.findByUserId(userId); if (opt.isEmpty()) return ResponseEntity.notFound().build(); LockGameEntity game = opt.get(); + int overtimeInSeconds = game.getOvertimeInSeconds() != null ? game.getOvertimeInSeconds() : 0; lockGameLockRepository.deleteAll(lockGameLockRepository.findByGameId(game.getGameId())); lockGameRepository.delete(game); if (lockId != null) { cardlockRepository.findById(lockId).ifPresent(l -> { if (l.getLockee().equals(userId)) { - cardLockServiceFactory.create(l).lockGameFinished(timeInMinutes); + cardLockServiceFactory.create(l).lockGameFinished(overtimeInSeconds); l.setGameActive(false); - l.setFrozenUntil(null); - l.setNextCardIn(LocalDateTime.now() - .plusMinutes(l.getPickEveryMinute() != null ? l.getPickEveryMinute() : 60)); cardlockRepository.save(l); } }); @@ -349,6 +404,6 @@ public class LockGameController { } private LockGameService buildService(LockGameEntity entity) throws Exception { - return new LockGameService(entity, lockGameRepository, lockGameLockRepository); + return new LockGameService(entity, lockGameRepository, lockGameLockRepository, baseLockRepository, unlockCodeHistoryService, lockControlFactory); } } diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameEntity.java b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameEntity.java index 1244a43..8e1bca5 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameEntity.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameEntity.java @@ -18,13 +18,15 @@ import lombok.Setter; @Setter @Entity @Table(name = "lock_game") -public class LockGameEntity { +public class LockGameEntity { @Id @Column private UUID gameId; @Column(unique = true) private UUID userId; + @Column + private UUID lockId; @OneToMany(mappedBy = "gameId", fetch = FetchType.EAGER) private List activeLocks = new ArrayList<>(); @Column @@ -42,9 +44,23 @@ public class LockGameEntity { @Column private LocalDateTime activeTaskEnd; @Column(columnDefinition = "TEXT") + private String activeTaskBenoetigtAktiv; + @Column(columnDefinition = "TEXT") private String taskInQueue; @Column(columnDefinition = "TEXT") private String lockInQueue; @Column private UUID setupId; + @Column + private LocalDateTime tempOpeningTime; + @Column + private Integer tempOpeningDurationInMinutes; + @Column + private String tempUnlockCode; + @Column + private Integer overtimeInSeconds; + @Column + private LocalDateTime finisherStartedAt; + @Column(columnDefinition = "TEXT") + private String finisher; } diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameLockEntity.java b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameLockEntity.java index 50e5af5..8f6e29b 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameLockEntity.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameLockEntity.java @@ -39,4 +39,6 @@ public class LockGameLockEntity { private String releaseText; @Column private LocalDateTime releaseTime; + @Column + private Boolean tempUnlockRequired; } diff --git a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameService.java b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameService.java index d4fdb0d..360e122 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/common/LockGameService.java +++ b/src/main/java/de/oaa/xxx/games/chastity/common/LockGameService.java @@ -1,5 +1,6 @@ package de.oaa.xxx.games.chastity.common; +import java.time.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -14,39 +15,60 @@ import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.oaa.xxx.games.bdsm.AufgabeAnzeige; +import de.oaa.xxx.games.chastity.lockcontroll.LockControlCallback; +import de.oaa.xxx.games.chastity.lockcontroll.LockControlFactory; +import de.oaa.xxx.games.chastity.unlock.TempOpeningReason; +import de.oaa.xxx.games.chastity.unlock.UnlockCodeHistoryService; import de.oaa.xxx.games.common.aufgaben.Aufgabe; import de.oaa.xxx.games.common.aufgaben.AufgabenList; -import de.oaa.xxx.games.common.aufgaben.Finisher; import de.oaa.xxx.games.common.aufgaben.Sperre; -public class LockGameService { +public class LockGameService implements LockControlCallback { private static final Logger LOGGER = LoggerFactory.getLogger(LockGameService.class); - private LockGameEntity gamestate; private LockGameRepository lockGameRepository; private LockGameLockRepository lockGameLockRepository; + private BaseLockRepository baseLockRepository; + private UnlockCodeHistoryService unlockCodeHistoryService; + private LockControlFactory lockControlFactory; + + private LockGameEntity gamestate; private AufgabenList aufgabenList; public LockGameService(LockGameEntity gamestate, LockGameRepository lockGameRepository, - LockGameLockRepository lockGameLockRepository) throws JsonMappingException, JsonProcessingException { + LockGameLockRepository lockGameLockRepository, BaseLockRepository baseLockRepository, + UnlockCodeHistoryService unlockCodeHistoryService, LockControlFactory lockControlFactory) throws JsonMappingException, JsonProcessingException { this.gamestate = gamestate; this.lockGameRepository = lockGameRepository; this.lockGameLockRepository = lockGameLockRepository; + this.baseLockRepository = baseLockRepository; + this.unlockCodeHistoryService = unlockCodeHistoryService; + this.lockControlFactory = lockControlFactory; this.aufgabenList = new ObjectMapper().readValue(gamestate.getAufgaben(), AufgabenList.class); } public GameState getGameState() { + List benoetigtAktiv = null; + if (gamestate.getActiveTaskBenoetigtAktiv() != null) { + try { + benoetigtAktiv = new ObjectMapper().readValue(gamestate.getActiveTaskBenoetigtAktiv(), + new com.fasterxml.jackson.core.type.TypeReference>() {}); + } catch (Exception ignored) {} + } return new GameState(gamestate.getGameId(), gamestate.getUserId(), gamestate.getLevel(), - gamestate.getActiveTask(), gamestate.getActiveTaskEnd(), gamestate.getTaskInQueue(), - gamestate.getLockInQueue()); + gamestate.getActiveTask(), gamestate.getActiveTaskEnd(), benoetigtAktiv, + gamestate.getTaskInQueue(), gamestate.getLockInQueue(), gamestate.getTempOpeningTime(), + gamestate.getTempOpeningDurationInMinutes(), gamestate.getTempUnlockCode(), + gamestate.getFinisherStartedAt(), gamestate.getFinisher()); } public void initNextTask() throws JsonProcessingException { gamestate.setActiveTask(null); gamestate.setActiveTaskEnd(null); + gamestate.setActiveTaskBenoetigtAktiv(null); checkLevel(); lockGameRepository.save(gamestate); pickNextTask(); @@ -55,6 +77,7 @@ public class LockGameService { public void abandonActiveTask() throws JsonProcessingException { gamestate.setActiveTask(null); gamestate.setActiveTaskEnd(null); + gamestate.setActiveTaskBenoetigtAktiv(null); lockGameRepository.save(gamestate); pickNextTask(); } @@ -136,6 +159,9 @@ public class LockGameService { var aufgabe = mapper.readValue(gamestate.getTaskInQueue(), Aufgabe.class); gamestate.setActiveTask(aufgabe.getText()); gamestate.setTaskInQueue(null); + var benoetigtAktiv = aufgabe.getBenoetigtAktiv(); + gamestate.setActiveTaskBenoetigtAktiv( + (benoetigtAktiv != null && !benoetigtAktiv.isEmpty()) ? mapper.writeValueAsString(benoetigtAktiv) : null); var time = getAufgabeTime(aufgabe); gamestate.setActiveTaskEnd(time > 0 ? LocalDateTime.now().plusSeconds(time) : null); LOGGER.info("[LockGame {}] AUFGABE aktiv: kurzText='{}', berechnete Zeit={}s (Range: {}s-{}s)", @@ -147,6 +173,7 @@ public class LockGameService { var lock = mapper.readValue(gamestate.getLockInQueue(), Sperre.class); String displayText = lock.getText() != null ? lock.getText() : lock.getKurzText(); gamestate.setActiveTask(displayText != null ? displayText : "Zeitstrafe aktiv"); + gamestate.setActiveTaskBenoetigtAktiv(null); gamestate.setLockInQueue(null); applyLock(lock); } @@ -168,11 +195,14 @@ public class LockGameService { return (int) (time * gamestate.getZeitfaktorZeitstrafen()); } - protected void checkLevel() { + protected void checkLevel() throws JsonProcessingException { var aufgabenAufAktuellemLevel = gamestate.getAufgabenAufAktuellemLevel(); if (++aufgabenAufAktuellemLevel >= 1 + gamestate.getAufgabenProLevel()) { aufgabenAufAktuellemLevel = 0; gamestate.setLevel(gamestate.getLevel() + 1); + if (gamestate.getLevel() >= 6) { + initFinisher(); + } } gamestate.setAufgabenAufAktuellemLevel(aufgabenAufAktuellemLevel); } @@ -190,6 +220,7 @@ public class LockGameService { entity.setGameId(gamestate.getGameId()); entity.setLockFor(lock.getSperreFuer()); entity.setReleaseText(lock.getReleaseText()); + entity.setTempUnlockRequired(lock.getTempUnlockRequired()); int lockMinutes = getLockTime(lock); entity.setReleaseTime(LocalDateTime.now().plusMinutes(lockMinutes)); LOGGER.info("[LockGame {}] ZEITSTRAFE aktiv: kurzText='{}', berechnete Zeit={}min (Range: {}min-{}min), sperreFuer={}", @@ -201,9 +232,13 @@ public class LockGameService { public List checkLocks() { var result = new ArrayList(); for (LockGameLockEntity entity : lockGameLockRepository.findByGameId(gamestate.getGameId())) { - if (entity.getReleaseTime().isAfter(LocalDateTime.now())) { + if (entity.getReleaseTime().isBefore(LocalDateTime.now())) { result.add(entity.getReleaseText()); + if (Boolean.TRUE.equals(entity.getTempUnlockRequired())) { + startTempOpening(); + } lockGameLockRepository.delete(entity); + } } return result; @@ -218,7 +253,77 @@ public class LockGameService { return result; } - public Finisher getFinisher() { - return aufgabenList.getFinisher().get(new Random().nextInt(aufgabenList.getFinisher().size())); + public void initFinisher() throws JsonProcessingException { + var finisher = aufgabenList.getFinisher().get(new Random().nextInt(aufgabenList.getFinisher().size())); + ObjectMapper mapper = new ObjectMapper(); + gamestate.setFinisher(mapper.writeValueAsString(finisher)); + gamestate.setActiveTask(null); + gamestate.setActiveTaskBenoetigtAktiv(null); + lockGameLockRepository.deleteAll(lockGameLockRepository.findByGameId(gamestate.getGameId())); + lockGameRepository.save(gamestate); + } + + public void startFinisher() { + gamestate.setFinisherStartedAt(LocalDateTime.now()); + lockGameRepository.save(gamestate); + } + + public void endFinisher() { + var seconds = Duration.between(gamestate.getFinisherStartedAt(), LocalDateTime.now()).toSeconds(); + addOvertime(seconds); + } + + private void addOvertime(Long seconds) { + var currentOvertime = gamestate.getOvertimeInSeconds() != null ? gamestate.getOvertimeInSeconds() : 0; + gamestate.setOvertimeInSeconds(currentOvertime + seconds.intValue()); + lockGameRepository.save(gamestate); + } + + public void startTempOpening() { + startTempOpening(5); + } + + private void startTempOpening(Integer duration) { + assert duration != null; + var lock = baseLockRepository.findById(gamestate.getLockId()).get(); + gamestate.setTempOpeningTime(LocalDateTime.now()); + gamestate.setTempOpeningDurationInMinutes(duration); + gamestate.setTempUnlockCode(lock.getUnlockCode()); + lockGameRepository.save(gamestate); + unlockCodeHistoryService.save(lock.getLockee(), lock.getLockId(), lock.getName(), lock.getUnlockCode(), TempOpeningReason.TASK.toString()); + } + + public void endTempOpening() { + var lock = baseLockRepository.findById(gamestate.getLockId()).get(); + var overtime = BaseLockHelper.calcOvertime(lock); + if (overtime != null) { + addOvertime(overtime); + } + + gamestate.setTempOpeningTime(null); + gamestate.setTempOpeningDurationInMinutes(null); + gamestate.setTempUnlockCode(null); + lockGameRepository.save(gamestate); + + if (lock.getControllType() != null) { + var lockControl = lockControlFactory.create(lock.getControllType(), this, lock.getLockee()); + if (lockControl != null + && lock.getControllType() != de.oaa.xxx.games.chastity.lockcontroll.LockControllType.UNLOCK_CODE) { + lockControl.lock(); + } + } + } + + @Override + public void setUnlockCode(String code) { + var lock = baseLockRepository.findById(gamestate.getLockId()).get(); + lock.setUnlockCode(code); + baseLockRepository.save(lock); + } + + @Override + public int getUnlockcodeLenght() { + var lock = baseLockRepository.findById(gamestate.getLockId()).get(); + return lock.getUnlockCodeLength(); } } diff --git a/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java b/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java index 7d0dde5..6f00869 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java +++ b/src/main/java/de/oaa/xxx/games/chastity/keyholder/KeyholderOfferController.java @@ -267,7 +267,7 @@ public class KeyholderOfferController { if (template instanceof TimeLockTemplateEntity tl) { TimeLockAdditionalSettings settings = new TimeLockAdditionalSettings( - controllType, myId, keyholderIdIfDirect, false, codeLen); + controllType, myId, keyholderIdIfDirect, false, codeLen, 1); TimeLockEntity lock = new TimeLockEntity(); timeLockServiceFactory.create(lock).init(tl, settings); timeLockRepository.save(lock); @@ -283,11 +283,11 @@ public class KeyholderOfferController { lock.setLockee(myId); lock.setKeyholder(keyholderIdIfDirect); lock.setInitialCards(cards); - lock.setPickEveryMinute(cl.getPickEveryMinute() != null ? cl.getPickEveryMinute() : 60); + lock.setPickEverySeconds((cl.getPickEveryMinute() != null ? cl.getPickEveryMinute() : 60) * 60); lock.setAccumulatePicks(cl.isAccumulatePicks()); lock.setShowRemainingCards(cl.isShowRemainingCards()); - lock.setHygineOpeningDurationMinutes(cl.getHygineOpeningDurationMinutes()); - lock.setHygineOpeningEveryMinites(cl.getHygineOpeningEveryMinites()); + lock.setHygineOpeningDurationSeconds(cl.getHygineOpeningDurationMinutes() != null ? cl.getHygineOpeningDurationMinutes() * 60 : null); + lock.setHygineOpeningEverySeconds(cl.getHygineOpeningEveryMinites() != null ? cl.getHygineOpeningEveryMinites() * 60 : null); lock.setTasks(cl.getTasks() != null ? cl.getTasks() : List.of()); lock.setRequiresVerification(cl.isRequiresVerification()); lock.setTestLock(false); @@ -299,7 +299,7 @@ public class KeyholderOfferController { lock.setStartTime(now); lock.setAvailableCards(new ArrayList<>(cards)); lock.setOpenPicks(0); - lock.setNextCardIn(now.plusMinutes(lock.getPickEveryMinute())); + lock.setNextCardIn(now.plusSeconds(lock.getPickEverySeconds())); if (cl.getHygineOpeningEveryMinites() != null) { lock.setLastHygineOpening(now); } diff --git a/src/main/java/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.java b/src/main/java/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.java index a17b212..e97f3c2 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.java +++ b/src/main/java/de/oaa/xxx/games/chastity/lockee/LockeeInvitationController.java @@ -198,11 +198,11 @@ public class LockeeInvitationController { .collect(java.util.stream.Collectors.groupingBy( c -> c.name(), java.util.stream.Collectors.counting())); result.put("cardCounts", cardCounts); - result.put("pickEveryMinute", cardLock.getPickEveryMinute()); + result.put("pickEveryMinute", cardLock.getPickEverySeconds() != null ? cardLock.getPickEverySeconds() / 60 : null); result.put("accumulatePicks", cardLock.isAccumulatePicks()); result.put("showRemainingCards", cardLock.isShowRemainingCards()); - result.put("hygineOpeningEveryMinites", cardLock.getHygineOpeningEveryMinites()); - result.put("hygineOpeningDurationMinutes", cardLock.getHygineOpeningDurationMinutes()); + result.put("hygineOpeningEveryMinites", cardLock.getHygineOpeningEverySeconds() != null ? cardLock.getHygineOpeningEverySeconds() / 60 : null); + result.put("hygineOpeningDurationMinutes", cardLock.getHygineOpeningDurationSeconds() != null ? cardLock.getHygineOpeningDurationSeconds() / 60 : null); result.put("requiresVerification", cardLock.isRequiresVerification()); result.put("taskCount", cardLock.getTasks() != null ? cardLock.getTasks().size() : 0); } @@ -246,8 +246,8 @@ public class LockeeInvitationController { cardLock.setUnlockCodeLength(codeLines); cardLock.setAvailableCards(new ArrayList<>(cardLock.getInitialCards())); cardLock.setOpenPicks(0); - cardLock.setNextCardIn(now.plusMinutes(cardLock.getPickEveryMinute())); - if (cardLock.getHygineOpeningEveryMinites() != null) { + cardLock.setNextCardIn(now.plusSeconds(cardLock.getPickEverySeconds())); + if (cardLock.getHygineOpeningEverySeconds() != null) { cardLock.setLastHygineOpening(now); } cardlockRepository.save(cardLock); @@ -258,7 +258,7 @@ public class LockeeInvitationController { timeLock.setEstimatedUnlockTime(now.plusMinutes(unlockMinutes)); timeLock.setUnlockCode(unlockCode); timeLock.setUnlockCodeLength(codeLines); - if (timeLock.getHygineOpeningEveryMinites() != null) { + if (timeLock.getHygineOpeningEverySeconds() != null) { timeLock.setLastHygineOpening(now); } timeLockRepository.save(timeLock); diff --git a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.java b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.java index 447fc3d..662c549 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.java +++ b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockAdditionalSettings.java @@ -4,6 +4,6 @@ import java.util.UUID; import de.oaa.xxx.games.chastity.lockcontroll.LockControllType; -public record TimeLockAdditionalSettings(LockControllType controllType, UUID lockee, UUID keyholder, boolean testlock, Integer unlockCodeLength) { +public record TimeLockAdditionalSettings(LockControllType controllType, UUID lockee, UUID keyholder, boolean testlock, Integer unlockCodeLength, Integer speedFactor) { } diff --git a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockController.java b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockController.java index 98b70b2..b345f45 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockController.java +++ b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockController.java @@ -100,7 +100,8 @@ public class TimeLockController { UUID keyholder, boolean testLock, Integer unlockCodeLength, - LockControllType controllType + LockControllType controllType, + Integer speedFactor ) {} @PostMapping("/timelock") @@ -155,9 +156,10 @@ public class TimeLockController { return ResponseEntity.status(403).body(Map.of("error", "subscription_required")); } + int speedFactor = (req.testLock() && req.speedFactor() != null && req.speedFactor() > 1) ? req.speedFactor() : 1; TimeLockAdditionalSettings settings = new TimeLockAdditionalSettings( req.controllType() != null ? req.controllType() : LockControllType.UNLOCK_CODE, - myId, req.keyholder(), req.testLock(), codeLen); + myId, req.keyholder(), req.testLock(), codeLen, speedFactor); TimeLockEntity lock = new TimeLockEntity(); timeLockServiceFactory.create(lock).init(template, settings); timeLockRepository.save(lock); // Sicherstellen dass auch TRUST-Locks persistiert sind @@ -234,7 +236,7 @@ public class TimeLockController { && (l.getFrozenUntil() == null || l.getFrozenUntil().isAfter(now)); // Hygiene state - boolean hygieneEnabled = l.getHygineOpeningEveryMinites() != null; + boolean hygieneEnabled = l.getHygineOpeningEverySeconds() != null; boolean hygieneOpeningDue = false; long hygieneSecondsRemaining = 0; boolean hygieneOpeningActive = l.getTempOpeningTime() != null @@ -244,7 +246,9 @@ public class TimeLockController { if (lastH == null) { hygieneOpeningDue = true; } else { - LocalDateTime nextH = lastH.plusMinutes(l.getHygineOpeningEveryMinites()); + int tlSf = (l.getSpeedFactor() != null && l.getSpeedFactor() > 1) ? l.getSpeedFactor() : 1; + long hygineSeconds = tlSf > 1 ? Math.max(6L, l.getHygineOpeningEverySeconds() / tlSf) : l.getHygineOpeningEverySeconds(); + LocalDateTime nextH = lastH.plusSeconds(hygineSeconds); long secs = ChronoUnit.SECONDS.between(now, nextH); if (secs <= 0) hygieneOpeningDue = true; else hygieneSecondsRemaining = secs; @@ -252,7 +256,7 @@ public class TimeLockController { } // Spin wheel state - boolean spinEnabled = l.getSpinsEveryMinutes() != null + boolean spinEnabled = l.getSpinsEverySeconds() != null && l.getSpinningWheelEntries() != null && !l.getSpinningWheelEntries().isEmpty(); boolean spinDue = false; String nextSpinIn = null; @@ -261,23 +265,23 @@ public class TimeLockController { if (times == null || times.isEmpty()) { spinDue = true; } else { - LocalDateTime next = times.get(times.size() - 1).plusMinutes(l.getSpinsEveryMinutes()); + LocalDateTime next = times.get(times.size() - 1).plusSeconds(l.getSpinsEverySeconds()); if (next.isBefore(now)) spinDue = true; else nextSpinIn = next.toString(); } } // Task timing state - boolean taskTimingEnabled = l.getTaskEveryMinutes() != null; + boolean taskTimingEnabled = l.getTaskEverySeconds() != null; String nextTaskIn = null; if (taskTimingEnabled && l.getCurrentTask() == null) { List times = l.getTaskTimes(); LocalDateTime next; if (times == null || times.isEmpty()) { next = l.getStartTime() != null - ? l.getStartTime().plusMinutes(l.getTaskEveryMinutes()) : null; + ? l.getStartTime().plusSeconds(l.getTaskEverySeconds()) : null; } else { - next = times.get(times.size() - 1).plusMinutes(l.getTaskEveryMinutes()); + next = times.get(times.size() - 1).plusSeconds(l.getTaskEverySeconds()); } if (next != null && next.isAfter(now)) nextTaskIn = next.toString(); } @@ -347,7 +351,7 @@ public class TimeLockController { result.put("hygieneSecondsRemaining", hygieneSecondsRemaining); result.put("hygieneOpeningActive", hygieneOpeningActive); result.put("hygieneOpeningStarted", l.getTempOpeningTime() != null ? l.getTempOpeningTime().toString() : null); - result.put("hygieneDurationMinutes", l.getHygineOpeningDurationMinutes() != null ? l.getHygineOpeningDurationMinutes() : 0); + result.put("hygieneDurationMinutes", l.getHygineOpeningDurationSeconds() != null ? l.getHygineOpeningDurationSeconds() / 60 : 0); result.put("verificationRequired", l.isRequiresVerification()); result.put("verificationDue", verificationDue); @@ -402,8 +406,8 @@ public class TimeLockController { // Check spin is due List spinTimes = l.getSpinningWheelTimes(); - if (spinTimes != null && !spinTimes.isEmpty() && l.getSpinsEveryMinutes() != null) { - LocalDateTime next = spinTimes.get(spinTimes.size() - 1).plusMinutes(l.getSpinsEveryMinutes()); + if (spinTimes != null && !spinTimes.isEmpty() && l.getSpinsEverySeconds() != null) { + LocalDateTime next = spinTimes.get(spinTimes.size() - 1).plusSeconds(l.getSpinsEverySeconds()); if (next.isAfter(now)) return ResponseEntity.status(409).body(Map.of("error", "not_due")); } @@ -477,7 +481,7 @@ public class TimeLockController { if (lockOpt.isEmpty()) return ResponseEntity.notFound().build(); var l = lockOpt.get(); if (!l.getLockee().equals(myId)) return ResponseEntity.status(403).build(); - if (l.getHygineOpeningEveryMinites() == null) return ResponseEntity.status(409).build(); + if (l.getHygineOpeningEverySeconds() == null) return ResponseEntity.status(409).build(); if (l.getTempOpeningTime() != null) return ResponseEntity.status(409).body(Map.of("error", "already_open")); TimeLockService service = timeLockServiceFactory.create(l); @@ -485,7 +489,7 @@ public class TimeLockController { return ResponseEntity.ok(Map.of( "unlockCode", l.getUnlockCode() != null ? l.getUnlockCode() : "", - "durationMinutes", l.getHygineOpeningDurationMinutes() != null ? l.getHygineOpeningDurationMinutes() : 0, + "durationMinutes", l.getHygineOpeningDurationSeconds() != null ? l.getHygineOpeningDurationSeconds() / 60 : 0, "openedAt", l.getTempOpeningTime() != null ? l.getTempOpeningTime().toString() : "")); } @@ -840,13 +844,13 @@ public class TimeLockController { lock.setEndTimeVisible(template.isEndTimeVisible()); lock.setTasks(template.getTasks()); lock.setTaskMode(template.getTaskCardMode()); - lock.setTaskEveryMinutes(template.getTaskEveryMinutes()); + lock.setTaskEverySeconds(template.getTaskEveryMinutes() != null ? template.getTaskEveryMinutes() * 60 : null); lock.setMinTasksPerDay(template.getMinTasksPerDay()); lock.setSpinningWheelEntries(template.getSpinningWheelEntries()); - lock.setSpinsEveryMinutes(template.getSpinsEveryMinutes()); + lock.setSpinsEverySeconds(template.getSpinsEveryMinutes() != null ? template.getSpinsEveryMinutes() * 60 : null); lock.setMinSpinsPerDay(template.getMinSpinsPerDay()); - lock.setHygineOpeningDurationMinutes(template.getHygineOpeningDurationMinutes()); - lock.setHygineOpeningEveryMinites(template.getHygineOpeningEveryMinites()); + lock.setHygineOpeningDurationSeconds(template.getHygineOpeningDurationMinutes() != null ? template.getHygineOpeningDurationMinutes() * 60 : null); + lock.setHygineOpeningEverySeconds(template.getHygineOpeningEveryMinites() != null ? template.getHygineOpeningEveryMinites() * 60 : null); lock.setPenaltyType(template.getPenaltyType()); lock.setPenaltyValue(template.getPenaltyValue()); lock.setMinTimeInMinutes(template.getMinTimeInMinutes()); diff --git a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.java b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.java index bed085d..d54a585 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.java +++ b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockEntity.java @@ -29,7 +29,7 @@ public class TimeLockEntity extends BaseLockEntity { private Integer maxTimeInMinutes; @Column - private Integer taskEveryMinutes; + private Integer taskEverySeconds; @Column private Integer minTasksPerDay; @@ -37,7 +37,7 @@ public class TimeLockEntity extends BaseLockEntity { @Column(columnDefinition = "TEXT") private List spinningWheelEntries; @Column - private Integer spinsEveryMinutes; + private Integer spinsEverySeconds; @Column private Integer minSpinsPerDay; diff --git a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockService.java b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockService.java index 463bff2..160ca09 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockService.java +++ b/src/main/java/de/oaa/xxx/games/chastity/timelock/TimeLockService.java @@ -132,24 +132,26 @@ public class TimeLockService extends BaseLockService implements LockControlCallb lock.setTestLock(settings.testlock()); lock.setUnlockCodeLength(settings.unlockCodeLength() != null ? settings.unlockCodeLength() : 5); + int sf = (settings.speedFactor() != null && settings.speedFactor() > 1) ? settings.speedFactor() : 1; + lock.setSpeedFactor(sf > 1 ? sf : null); Integer minMinutes = template.getMinTimeInMinutes(); Integer maxMinutes = template.getMaxTimeInMinutes() != null ? template.getMaxTimeInMinutes() : 60; int unlockTimeMinutes = (minMinutes != null && minMinutes < maxMinutes) ? minMinutes + new Random().nextInt(maxMinutes - minMinutes) : maxMinutes; - lock.setEstimatedUnlockTime(now.plusMinutes(unlockTimeMinutes)); + lock.setEstimatedUnlockTime(now.plusSeconds(Math.max(6L, unlockTimeMinutes * 60L / sf))); lock.setEndTimeVisible(template.isEndTimeVisible()); lock.setTasks(template.getTasks()); - lock.setTaskEveryMinutes(template.getTaskEveryMinutes()); + lock.setTaskEverySeconds(template.getTaskEveryMinutes() != null ? Math.max(6, template.getTaskEveryMinutes() * 60 / sf) : null); lock.setMinTasksPerDay(template.getMinTasksPerDay()); lock.setSpinningWheelEntries(template.getSpinningWheelEntries()); - lock.setSpinsEveryMinutes(template.getSpinsEveryMinutes()); + lock.setSpinsEverySeconds(template.getSpinsEveryMinutes() != null ? Math.max(6, template.getSpinsEveryMinutes() * 60 / sf) : null); lock.setMinSpinsPerDay(template.getMinSpinsPerDay()); - lock.setHygineOpeningDurationMinutes(template.getHygineOpeningDurationMinutes()); - lock.setHygineOpeningEveryMinites(template.getHygineOpeningEveryMinites()); + lock.setHygineOpeningDurationSeconds(template.getHygineOpeningDurationMinutes() != null ? template.getHygineOpeningDurationMinutes() * 60 : null); + lock.setHygineOpeningEverySeconds(template.getHygineOpeningEveryMinites() != null ? template.getHygineOpeningEveryMinites() * 60 : null); if (template.getHygineOpeningEveryMinites() != null) { lock.setLastHygineOpening(now); } @@ -360,7 +362,7 @@ public class TimeLockService extends BaseLockService implements LockControlCallb // ── Hygiene opening ─────────────────────────────────────────────────────── public void startHygieneOpening() { - startTempOpening(TempOpeningReason.HYGIENE, lock.getHygineOpeningDurationMinutes()); + startTempOpening(TempOpeningReason.HYGIENE, lock.getHygineOpeningDurationSeconds() != null ? lock.getHygineOpeningDurationSeconds() / 60 : 0); } // ── LockControlCallback ─────────────────────────────────────────────────── @@ -377,13 +379,13 @@ public class TimeLockService extends BaseLockService implements LockControlCallb } @Override - protected void handleLockGameFinished(int timeInMinutes) { - int freezeTime = (int) (timeInMinutes * new Random().nextDouble(1.0, 4.0)); - addTime(freezeTime); + protected void handleLockGameFinished(int timeInSeconds) { + int freezeMinutes = (int) (timeInSeconds / 60.0 * new Random().nextDouble(1.0, 4.0)); + addTime(Math.max(1, freezeMinutes)); } @Override public void penaltyLockGame() { - handleLockGameFinished(60); + handleLockGameFinished(3600); } } diff --git a/src/main/java/de/oaa/xxx/games/chastity/unlock/TempOpeningReason.java b/src/main/java/de/oaa/xxx/games/chastity/unlock/TempOpeningReason.java index f121f78..f827935 100644 --- a/src/main/java/de/oaa/xxx/games/chastity/unlock/TempOpeningReason.java +++ b/src/main/java/de/oaa/xxx/games/chastity/unlock/TempOpeningReason.java @@ -1,5 +1,5 @@ package de.oaa.xxx.games.chastity.unlock; public enum TempOpeningReason { - HYGIENE, CARD, TASK, TTLOCK_UNAUTHORIZED; + HYGIENE, CARD, TASK, TTLOCK_UNAUTHORIZED, TEMPORARY; } diff --git a/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java b/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java index 1a47182..8a9ba50 100644 --- a/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java +++ b/src/main/java/de/oaa/xxx/games/common/aufgaben/Finisher.java @@ -19,6 +19,7 @@ public class Finisher { private List benoetigtPassiv; private List benoetigteToys; private UUID gruppeId; + private Boolean tempUnlockRequired; @Override public String toString() { diff --git a/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java b/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java index 89233d4..3189d46 100644 --- a/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java +++ b/src/main/java/de/oaa/xxx/games/common/aufgaben/Sperre.java @@ -20,8 +20,7 @@ public class Sperre { private Integer minutenVon; private Integer minutenBis; private Integer level; - private Boolean tempUnlockBeforeRequired; - private Boolean tempUnlockAfterRequired; + private Boolean tempUnlockRequired; private List benoetigteToys; @Override diff --git a/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java b/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java index 36aabe6..5cc8f6f 100644 --- a/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java +++ b/src/main/java/de/oaa/xxx/games/common/entity/FinisherEntity.java @@ -55,6 +55,8 @@ public class FinisherEntity { @ManyToMany(cascade = CascadeType.DETACH) @JoinTable(name = "finisherToy", joinColumns = {@JoinColumn(name = "finisherId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) private List benoetigteToys; + @Column + private Boolean tempUnlockRequired; @Override public String toString() { @@ -71,6 +73,7 @@ public class FinisherEntity { finisher.setBenoetigtPassiv(benoetigtPassiv != null ? new ArrayList<>(benoetigtPassiv) : new ArrayList<>()); finisher.setBenoetigteToys(benoetigteToys != null ? benoetigteToys.stream().map(ToyEntity::toToy).toList() : new ArrayList<>()); finisher.setGruppeId(aufgabenGruppe.getGruppenId()); + finisher.setTempUnlockRequired(tempUnlockRequired); return finisher; } @@ -84,6 +87,7 @@ public class FinisherEntity { entity.setBenoetigtAktiv(finisher.getBenoetigtAktiv()); entity.setBenoetigtPassiv(finisher.getBenoetigtPassiv()); entity.setBenoetigteToys(toys != null ? toys : new ArrayList<>()); + entity.setTempUnlockRequired(finisher.getTempUnlockRequired()); return entity; } } diff --git a/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java b/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java index 15ee62b..d47ea71 100644 --- a/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java +++ b/src/main/java/de/oaa/xxx/games/common/entity/SperreEntity.java @@ -53,9 +53,7 @@ public class SperreEntity { @Column private Integer level; @Column - private Boolean tempUnlockBeforeRequired; - @Column - private Boolean tempUnlockAfterRequired; + private Boolean tempUnlockRequired; @ManyToMany(cascade = CascadeType.DETACH) @JoinTable(name = "sperreToy", joinColumns = {@JoinColumn(name = "sperreId")}, inverseJoinColumns = {@JoinColumn(name = "toyId")}) private List benoetigteToys; @@ -74,8 +72,7 @@ public class SperreEntity { sperre.setMinutenBis(minutenBis); sperre.setMinutenVon(minutenVon); sperre.setLevel(level); - sperre.setTempUnlockBeforeRequired(tempUnlockBeforeRequired); - sperre.setTempUnlockAfterRequired(tempUnlockAfterRequired); + sperre.setTempUnlockRequired(tempUnlockRequired); sperre.setReleaseText(releaseText); sperre.setSperreFuer(sperreFuer != null ? new ArrayList<>(sperreFuer) : new ArrayList<>()); sperre.setText(text); @@ -92,8 +89,7 @@ public class SperreEntity { entity.setMinutenBis(sperre.getMinutenBis()); entity.setMinutenVon(sperre.getMinutenVon()); entity.setLevel(sperre.getLevel()); - entity.setTempUnlockBeforeRequired(sperre.getTempUnlockBeforeRequired()); - entity.setTempUnlockAfterRequired(sperre.getTempUnlockAfterRequired()); + entity.setTempUnlockRequired(sperre.getTempUnlockRequired()); entity.setReleaseText(sperre.getReleaseText()); entity.setSperreFuer(sperre.getSperreFuer()); entity.setText(sperre.getText()); diff --git a/src/main/resources/db/migration/V8__lock_game_aufgaben_text.sql b/src/main/resources/db/migration/V8__lock_game_aufgaben_text.sql new file mode 100644 index 0000000..7c9a1a0 --- /dev/null +++ b/src/main/resources/db/migration/V8__lock_game_aufgaben_text.sql @@ -0,0 +1,2 @@ +ALTER TABLE lock_game + MODIFY COLUMN aufgaben TEXT NULL; diff --git a/src/main/resources/static/games/aufgaben/aufgaben.html b/src/main/resources/static/games/aufgaben/aufgaben.html index 5c4251e..25f6230 100644 --- a/src/main/resources/static/games/aufgaben/aufgaben.html +++ b/src/main/resources/static/games/aufgaben/aufgaben.html @@ -263,6 +263,12 @@ cursor: pointer; transition: border-color 0.15s, color 0.15s; } .btn-item-edit:hover { border-color: var(--color-text); color: var(--color-text); } + .btn-item-copy { + background: none; border: 1px solid rgba(100,160,255,0.4); border-radius: 5px; + color: var(--color-muted); font-size: 0.75rem; padding: 0.2rem 0.6rem; + cursor: pointer; transition: border-color 0.15s, color 0.15s; + } + .btn-item-copy:hover { border-color: rgba(100,160,255,0.9); color: var(--color-text); } .btn-item-delete { background: none; border: 1px solid rgba(233,69,96,0.4); border-radius: 5px; color: var(--color-primary); font-size: 0.75rem; padding: 0.2rem 0.6rem; @@ -533,17 +539,11 @@
- -
- - -
+
@@ -765,7 +765,7 @@ ${g.beschreibung ? `
${esc(g.beschreibung)}
` : ''} ${renderSubSection('Aufgaben', sortByLevelThenName(g.aufgaben || []), 'aufgabe', renderAufgabe, g.gruppenId, type)} ${g.availableIn !== 'CHASTITY_ONLY' ? renderSubSection('Strafen', sortByLevelThenName(g.strafen || []), 'strafe', renderStrafe, g.gruppenId, type) : ''} - ${renderSubSection('Zeitstrafen',sortByName(g.sperren || []), 'zeitstrafe',renderZeitstrafe, g.gruppenId, type)} + ${renderSubSection('Zeitstrafen',sortByLevelThenName(g.sperren || []), 'zeitstrafe',renderZeitstrafe, g.gruppenId, type)} ${renderSubSection('Finisher', sortByGeschlecht(g.finisher || []), 'finisher', renderFinisher, g.gruppenId, type)}
`; @@ -814,6 +814,7 @@ function renderAufgabe(a, type, gruppenId) { _itemData[a.aufgabeId] = { ...a, _kind: 'aufgabe', _gruppenId: gruppenId }; const badges = []; + (a.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatSek(a.sekundenVon, a.sekundenBis); if (zeit) badges.push(`${esc(zeit)}`); if (a.level != null) badges.push(`Level ${esc(String(a.level))}`); @@ -826,6 +827,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -841,6 +843,7 @@ function renderStrafe(s, type, gruppenId) { _itemData[s.strafeId] = { ...s, _kind: 'strafe', _gruppenId: gruppenId }; const badges = []; + (s.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatSek(s.sekundenVon, s.sekundenBis); if (zeit) badges.push(`${esc(zeit)}`); if (s.level != null) badges.push(`Level ${esc(String(s.level))}`); @@ -853,6 +856,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -868,8 +872,10 @@ function renderZeitstrafe(z, type, gruppenId) { _itemData[z.sperreId] = { ...z, _kind: 'zeitstrafe', _gruppenId: gruppenId }; const badges = []; + (z.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); const zeit = formatMin(z.minutenVon, z.minutenBis); if (zeit) badges.push(`${esc(zeit)}`); + if (z.level != null) badges.push(`Level ${esc(String(z.level))}`); const detailRows = []; if (z.text) detailRows.push(`
${esc(z.text)}
`); @@ -879,6 +885,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -896,6 +903,7 @@ function renderFinisher(f, type, gruppenId) { _itemData[f.finisherId] = { ...f, _kind: 'finisher', _gruppenId: gruppenId }; const badges = []; + (f.benoetigteToys || []).forEach(t => badges.push(`${esc(t.name || t)}`)); if (f.geschlecht) badges.push(`${esc(GESCHLECHT_LABEL[f.geschlecht] || f.geschlecht)}`); const detailRows = []; @@ -906,6 +914,7 @@ const actionBtns = type === 'user' ? `
+
` : ''; @@ -944,10 +953,36 @@ finisher: apiUrl('/finisher') }; const ITEM_DELETE_FIELD = { aufgabe: 'aufgabeId', strafe: 'strafeId', zeitstrafe: 'sperreId', finisher: 'finisherId' }; + const ITEM_COPY_URL = { + aufgabe: apiUrl('/aufgabe/copy'), + strafe: '/strafe/copy', + zeitstrafe: '/sperre/copy', + finisher: apiUrl('/finisher/copy') + }; + + function duplicateItem(kind, itemId, gruppenId, event) { + event.stopPropagation(); + const copyUrl = ITEM_COPY_URL[kind]; + if (!copyUrl) return; + fetch(`${copyUrl}/${itemId}`, { method: 'POST' }).then(r => { + if (r.ok) { + pendingExpandId = gruppenId; + pendingExpandType = 'user'; + _notifyOnLoad = true; loadUserGruppen(); + } else { + document.getElementById('userActionError').textContent = 'Fehler beim Duplizieren (HTTP ' + r.status + ').'; + } + }).catch(() => { + document.getElementById('userActionError').textContent = 'Verbindungsfehler.'; + }); + } function deleteItem(kind, itemId, gruppenId, event) { event.stopPropagation(); - if (!confirm('Eintrag wirklich löschen?')) return; + openConfirmModal('Eintrag wirklich löschen?', () => _doDeleteItem(kind, itemId, gruppenId)); + } + + function _doDeleteItem(kind, itemId, gruppenId) { const deleteUrl = ITEM_DELETE_URL[kind]; if (!deleteUrl) return; const body = { [ITEM_DELETE_FIELD[kind]]: itemId }; @@ -1430,7 +1465,7 @@ const lbl = document.querySelector(`#iSperreFuer input[value="${v}"]`)?.closest('label'); if (lbl) lbl.style.display = isChastity ? 'none' : ''; }); - document.getElementById('iTempUnlockRow').style.display = (isZeit && isChastity) ? 'block' : 'none'; + document.getElementById('iTempUnlockRow').style.display = ((isZeit || isFinisher) && isChastity) ? 'block' : 'none'; document.getElementById('iReleaseTextRow').style.display = isZeit ? 'block' : 'none'; } @@ -1449,8 +1484,7 @@ document.querySelectorAll('#iWerkzeugFinisherPassiv input').forEach(cb => cb.checked = false); document.querySelectorAll('#iSperreFuer input').forEach(cb => cb.checked = false); document.querySelectorAll('#iGeschlecht input').forEach(rb => rb.checked = false); - document.getElementById('iTempUnlockBefore').checked = false; - document.getElementById('iTempUnlockAfter').checked = false; + document.getElementById('iTempUnlockRequired').checked = false; _selectedToys = []; renderSelectedToys(); document.getElementById('itemModalError').style.display = 'none'; @@ -1495,6 +1529,9 @@ const rb = document.querySelector(`#iGeschlecht input[value="${d.geschlecht}"]`); if (rb) rb.checked = true; } + if (_isChastityMode) { + document.getElementById('iTempUnlockRequired').checked = d.tempUnlockRequired === true; + } } else { document.getElementById('iMinVon').value = d.minutenVon != null ? d.minutenVon : ''; document.getElementById('iMinBis').value = d.minutenBis != null ? d.minutenBis : ''; @@ -1502,8 +1539,7 @@ (d.sperreFuer || []).forEach(w => { const cb = document.querySelector(`#iSperreFuer input[value="${w}"]`); if (cb) cb.checked = true; }); if (_isChastityMode) { document.getElementById('iLevel').value = d.level != null ? d.level : ''; - document.getElementById('iTempUnlockBefore').checked = d.tempUnlockBeforeRequired === true; - document.getElementById('iTempUnlockAfter').checked = d.tempUnlockAfterRequired === true; + document.getElementById('iTempUnlockRequired').checked = d.tempUnlockRequired === true; } } @@ -1666,11 +1702,12 @@ if (!_isChastityMode && !geschlecht) { showItemError('Bitte ein Geschlecht auswählen.'); return; } payload = { kurzText, text, - geschlecht: geschlecht || null, - gruppeId: isEdit ? undefined : currentItemGruppeId, - benoetigtAktiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherAktiv'), - benoetigtPassiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherPassiv'), - benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })) + geschlecht: geschlecht || null, + gruppeId: isEdit ? undefined : currentItemGruppeId, + benoetigtAktiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherAktiv'), + benoetigtPassiv: _isChastityMode ? [] : checkedValues('iWerkzeugFinisherPassiv'), + benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })), + tempUnlockRequired: _isChastityMode ? document.getElementById('iTempUnlockRequired').checked : null }; url = isEdit ? apiUrl(`/finisher/${currentItemEditId}`) : apiUrl('/finisher'); method = isEdit ? 'PUT' : 'POST'; @@ -1698,8 +1735,7 @@ releaseText: document.getElementById('iReleaseText').value.trim() || null, sperreFuer, level: zeitLevel, - tempUnlockBeforeRequired: _isChastityMode ? document.getElementById('iTempUnlockBefore').checked : null, - tempUnlockAfterRequired: _isChastityMode ? document.getElementById('iTempUnlockAfter').checked : null, + tempUnlockRequired: _isChastityMode ? document.getElementById('iTempUnlockRequired').checked : null, benoetigteToys: _selectedToys.map(t => ({ toyId: t.toyId })) }; url = isEdit ? `/sperre/${currentItemEditId}` : '/sperre'; // BDSM-only diff --git a/src/main/resources/static/games/bdsm/neubdsm.html b/src/main/resources/static/games/bdsm/neubdsm.html index 965d1a1..ee791ef 100644 --- a/src/main/resources/static/games/bdsm/neubdsm.html +++ b/src/main/resources/static/games/bdsm/neubdsm.html @@ -679,6 +679,7 @@ // ── Gruppe lists ── function renderGruppeList(containerId, gruppen) { + gruppen = gruppen.filter(g => g.availableIn !== 'CHASTITY_ONLY'); const ul = document.getElementById(containerId); const section = ul.closest('[id^="section"]'); const selectAllWrap = section?.querySelector('.select-all-label'); diff --git a/src/main/resources/static/games/chastity/neulock.html b/src/main/resources/static/games/chastity/neulock.html index 85885ba..576ad31 100644 --- a/src/main/resources/static/games/chastity/neulock.html +++ b/src/main/resources/static/games/chastity/neulock.html @@ -256,9 +256,14 @@
- +
+
@@ -515,6 +520,7 @@ khInput.readOnly = true; khInput.style.opacity = '0.6'; document.getElementById('rowTestLock').style.display = 'none'; + document.getElementById('rowSpeedFactor').style.display = 'none'; document.getElementById('rowDetailsVisible').style.display = ''; } else { khInput.readOnly = false; @@ -728,6 +734,15 @@ el.scrollIntoView({ behavior: 'smooth', block: 'center' }); } + function onTestLockChange() { + const checked = document.getElementById('testLock').checked; + document.getElementById('rowSpeedFactor').style.display = checked ? 'flex' : 'none'; + if (!checked) { + document.getElementById('speedFactor').value = 1; + document.getElementById('speedFactorLabel').textContent = '×1'; + } + } + // ── Absenden ── async function createSession() { document.getElementById('errorMsg').style.display = 'none'; @@ -756,6 +771,7 @@ const isFriendLockee = lockeeVal && lockeeVal !== myUserId; const unlockCodeLen = isFriendLockee ? null : (parseInt(document.getElementById('unlockCodeLines').value) || 5); const isTestLock = isFriendLockee ? false : document.getElementById('testLock').checked; + const speedFactor = isTestLock ? parseInt(document.getElementById('speedFactor').value) : 1; let endpoint, body; @@ -769,6 +785,7 @@ testLock: isTestLock, unlockCodeLength: unlockCodeLen, controllType: selectedLockControl, + speedFactor: speedFactor, }; } else { // CardLock @@ -798,6 +815,7 @@ controllType: selectedLockControl, gameSetId: t.gameSetId || null, gameSpieldauerIdx: t.gameSpieldauerIdx ?? null, + speedFactor: speedFactor, }; } diff --git a/src/main/resources/static/games/chastity/taskgame.html b/src/main/resources/static/games/chastity/taskgame.html index 8a6aeef..82c3651 100644 --- a/src/main/resources/static/games/chastity/taskgame.html +++ b/src/main/resources/static/games/chastity/taskgame.html @@ -52,6 +52,9 @@ margin-top: 1rem; height: 2.75rem; } + #confirmModal { display:none; } + #confirmModal.open { display:flex; } + .level-display { display: flex; @@ -190,7 +193,7 @@ + + + @@ -340,6 +362,7 @@ async function startWithExcludedToys(gameSetId, excludedToyIds) { const params = new URLSearchParams({ aufgabenGruppeId: gameSetId }); + if (lockId) params.append('lockId', lockId); excludedToyIds.forEach(id => params.append('excludedToyIds', id)); const r = await fetch('/lock-game/init?' + params.toString(), { method: 'POST' }); @@ -417,7 +440,9 @@ await loadAndShowToys(sel.value); } - // ── Game Loop ───────────────────────────────────────────────────────────── + // ── Benötigt-Checkboxen ─────────────────────────────────────────────────── + +// ── Game Loop ───────────────────────────────────────────────────────────── function setGameCard(label, text, action, btnLabel) { document.getElementById('gameLabel').textContent = label; @@ -432,10 +457,16 @@ async function runGameLoop() { hide('gameCard'); hide('finisherBox'); + hide('tempOpeningBox'); clearTimer(); - if (_state.level >= 6) { - await showFinisherFlow(); + if (_state.finisher) { + showFinisherUI(); + return; + } + + if (_state.tempOpeningTime) { + showTempOpeningDialog(); return; } @@ -460,12 +491,14 @@ let sperre; try { sperre = JSON.parse(_state.lockInQueue); } catch { sperre = {}; } setGameCard('🔒 Neue Sperre', sperre.text || sperre.kurzText || '', 'queue-start', '▶ Starten'); + } else if (_state.taskInQueue) { let aufgabe; try { aufgabe = JSON.parse(_state.taskInQueue); } catch { aufgabe = {}; } const hasDuration = !!(aufgabe.sekundenVon || aufgabe.sekundenBis); setGameCard('🎯 Neue Aufgabe', aufgabe.text || '', hasDuration ? 'queue-start' : 'queue-done', hasDuration ? '▶ Starten' : '✓ Erledigt'); + } show('gameBox'); show('gameCard'); @@ -497,19 +530,38 @@ switch (_gameAction) { case 'queue-start': doQueueStart(); break; case 'queue-done': doQueueDone(); break; - case 'active-running': doCancelCountdown(); break; + case 'active-running': openConfirmModal('Aufgabe wirklich abbrechen?', () => doCancelCountdown()); break; case 'active-done': doErledigt(); break; } } async function doQueueStart() { try { - await checkAndShowLocks(); + const wasLock = !!_state.lockInQueue; + let tempUnlockRequired = false; + if (wasLock) { + try { tempUnlockRequired = JSON.parse(_state.lockInQueue).tempUnlockRequired === true; } catch (_) {} + } + const r = await fetch('/lock-game/apply-task', { method: 'POST' }); if (!r.ok) { showError('Fehler beim Starten'); return; } - const stateR = await fetch('/lock-game/state'); - _state = await stateR.json(); - await runGameLoop(); + + if (wasLock && tempUnlockRequired) { + await fetch('/lock-game/start-temp-opening', { method: 'POST' }); + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + showTempOpeningDialog(); + } else if (wasLock) { + const nextR = await fetch('/lock-game/abandon-task', { method: 'POST' }); + if (!nextR.ok) { showError('Fehler beim Ziehen'); return; } + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + await runGameLoop(); + } else { + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + await runGameLoop(); + } } catch (e) { showError(e.message || 'Fehler (Starten)'); } } @@ -526,16 +578,28 @@ } catch (e) { showError(e.message || 'Fehler (Erledigt)'); } } - function doCancelCountdown() { + async function doCancelCountdown() { clearTimer(); + const lockR = await fetch('/lock-game/check-locks', { method: 'POST' }); + if (lockR.ok) { + const texts = await lockR.json(); + for (const text of (texts || [])) { + if (text != null && text !== '') await waitForReleaseOk(text); + } + } _gameAction = 'active-done'; document.getElementById('gameBtn').textContent = '✓ Erledigt'; } async function doErledigt() { try { - await checkAndShowLocks(); - if (_state.level >= 6) { await showFinisherFlow(); return; } + const lockR = await fetch('/lock-game/check-locks', { method: 'POST' }); + if (lockR.ok) { + const texts = await lockR.json(); + for (const text of (texts || [])) { + if (text != null && text !== '') await waitForReleaseOk(text); + } + } const r = await fetch('/lock-game/next-task', { method: 'POST' }); if (!r.ok) { showError('Fehler beim Ziehen'); return; } const stateR = await fetch('/lock-game/state'); @@ -557,51 +621,87 @@ } } - async function showFinisherFlow() { + function showTempOpeningDialog() { show('gameBox'); hide('gameCard'); hide('lockReleaseBox'); hide('finisherBox'); - // 1. Release-Texte sequenziell anzeigen + document.getElementById('tempOpeningTask').textContent = _state.activeTask || ''; + const code = _state.tempOpeningCode; + if (code) { + document.getElementById('tempOpeningCode').textContent = code; + show('tempOpeningCodeRow'); + } else { + hide('tempOpeningCodeRow'); + } + show('tempOpeningBox'); + } + + async function doEndTempOpening() { try { - const r = await fetch('/lock-game/release-locks'); - if (r.ok) { - const texts = await r.json(); - for (const text of texts) { - await waitForReleaseOk(text); - } - } - } catch (_) { /* ignorieren */ } + await fetch('/lock-game/end-temp-opening', { method: 'POST' }); + await fetch('/lock-game/abandon-task', { method: 'POST' }); + const stateR = await fetch('/lock-game/state'); + _state = await stateR.json(); + hide('tempOpeningBox'); + await runGameLoop(); + } catch (e) { showError(e.message || 'Fehler beim Abschluss der temporären Öffnung'); } + } - // 2. Finisher laden und Zeit messen - const finisherStartTime = Date.now(); - let finisher = null; - try { - const r = await fetch('/lock-game/finisher'); - if (r.ok) finisher = await r.json(); - } catch (_) { /* ignorieren */ } + function showFinisherUI() { + show('gameBox'); + hide('gameCard'); + hide('lockReleaseBox'); - document.getElementById('finisherTitle').textContent = finisher?.kurzText || ''; - document.getElementById('finisherText').textContent = finisher?.text || 'Glückwunsch – du hast Level 6 erreicht!'; + let finisher = {}; + try { finisher = JSON.parse(_state.finisher); } catch (_) {} + document.getElementById('finisherTitle').textContent = finisher.kurzText || ''; + document.getElementById('finisherText').textContent = finisher.text || ''; - // 3. Warten bis Nutzer OK drückt - await new Promise(resolve => { - document.getElementById('btnFinisherOk').onclick = resolve; - show('finisherBox'); - }); + if (_state.finisherStartedAt) { + hide('finisherStart'); + show('finisherRunning'); + startElapsedTimer(new Date(_state.finisherStartedAt)); + } else { + show('finisherStart'); + hide('finisherRunning'); + } + show('finisherBox'); + } - // 4. Zeit berechnen und Spiel beenden - const timeInMinutes = Math.round((Date.now() - finisherStartTime) / 60000); - const params = new URLSearchParams({ timeInMinutes }); - if (lockId) params.set('lockId', lockId); - await fetch('/lock-game/complete?' + params.toString(), { method: 'POST' }); + async function doStartFinisher() { + await fetch('/lock-game/start-finisher', { method: 'POST' }); + const r = await fetch('/lock-game/state'); + _state = await r.json(); + hide('finisherStart'); + show('finisherRunning'); + startElapsedTimer(new Date(_state.finisherStartedAt)); + } + + async function doEndFinisher() { + clearTimer(); + await fetch('/lock-game/end-finisher', { method: 'POST' }); + const url = '/lock-game/complete' + (lockId ? '?lockId=' + lockId : ''); + await fetch(url, { method: 'POST' }); goBack(); } + function startElapsedTimer(startDate) { + clearTimer(); + const el = document.getElementById('finisherTimer'); + _timerInt = setInterval(() => { + const diff = Math.floor((Date.now() - startDate) / 1000); + const m = String(Math.floor(diff / 60)).padStart(2, '0'); + const s = String(diff % 60).padStart(2, '0'); + el.textContent = m + ':' + s; + }, 1000); + } + function waitForReleaseOk(text) { return new Promise(resolve => { - document.getElementById('releaseText').textContent = text; + hide('gameCard'); + document.getElementById('releaseText').textContent = text || ''; document.getElementById('btnReleaseOk').onclick = () => { hide('lockReleaseBox'); resolve(); @@ -658,7 +758,37 @@ box.style.display = ''; } + // ── Confirm Modal ───────────────────────────────────────────────────────── + + const _confirmModal = document.getElementById('confirmModal'); + document.getElementById('confirmModalCancel').addEventListener('click', closeConfirmModal); + document.getElementById('confirmModalOk').addEventListener('click', closeConfirmModal); + _confirmModal.addEventListener('click', e => { if (e.target === _confirmModal) closeConfirmModal(); }); + document.addEventListener('keydown', e => { if (e.key === 'Escape' && _confirmModal.classList.contains('open')) closeConfirmModal(); }); + + function closeConfirmModal() { _confirmModal.classList.remove('open'); } + + function openConfirmModal(text, onConfirm) { + document.getElementById('confirmModalText').textContent = text; + const okBtn = document.getElementById('confirmModalOk'); + const newOk = okBtn.cloneNode(true); + okBtn.parentNode.replaceChild(newOk, okBtn); + newOk.addEventListener('click', () => { closeConfirmModal(); onConfirm(); }); + _confirmModal.classList.add('open'); + } + boot(); + + diff --git a/src/test/java/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.java b/src/test/java/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.java index 2af0d90..64dbd64 100644 --- a/src/test/java/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.java +++ b/src/test/java/de/oaa/xxx/games/chastity/cardlock/CardLockServiceTest.java @@ -29,7 +29,7 @@ class CardLockServiceTest { @BeforeEach void setUp() { lock = new CardLockEntity(); - lock.setPickEveryMinute(60); + lock.setPickEverySeconds(60); lock.setNextCardIn(LocalDateTime.now().minusMinutes(1)); // controllType bleibt null → lockControlFactory.create() wird nicht aufgerufen