package Ġred . man 1 0 . man 1 0 bank Ċ Ċ import Ġorg . bukkit . Bu kkit Ċ import Ġorg . bukkit . entity . Player Ċ import Ġorg . bukkit . plugin . java . Java Plugin Ċ import Ġred . man 1 0 . man 1 0 bank . Bank . Int Transaction Ċ import Ġred . man 1 0 . man 1 0 bank . Bank . Pair Transaction Ċ import Ġred . man 1 0 . man 1 0 bank . Man 1 0 Bank . Companion . bank Enable Ċ import Ġred . man 1 0 . man 1 0 bank . Man 1 0 Bank . Companion . format Ċ import Ġred . man 1 0 . man 1 0 bank . Man 1 0 Bank . Companion . plugin Ċ import Ġred . man 1 0 . man 1 0 bank . Man 1 0 Bank . Companion . send Msg Ċ import Ġred . man 1 0 . man 1 0 bank . Man 1 0 Bank . Companion . vault Ċ import Ġred . man 1 0 . man 1 0 bank . MySQL Manager . Companion . mysql Queue Ċ import Ġred . man 1 0 . man 1 0 bank . history . E state Data Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġkotlin . math . floor Ċ Ċ object ĠBank Ġ{ ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġmysql Ġ: ĠMySQL Manager ĊĠĠĠ Ġprivate Ġvar Ġbank Queue Ġ= ĠLinked BlockingQueue < Pair < Any , Result Transaction >>() ĊĠĠĠ Ġprivate Ġval Ġsimple DateFormat Ġ= ĠSimpleDateFormat (" yyyy - MM - dd ĠHH : mm ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠBu kkit . getLogger (). info (" Start Bank Queue ") ĊĠĠĠĠĠĠĠ ĠBu kkit . get Scheduler (). run Task As ynchronously ( plugin , ĠRunnable Ġ{ Ġbank Queue () Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////// ĊĠĠĠ Ġ// åı£ åº§ ãĤĴ æĮģ ãģ£ ãģ¦ãģĦãĤĭ ãģĭ ãģ© ãģĨ ãģĭ ĊĠĠĠ Ġ////////////////////////////////// ĊĠĠĠ Ġprivate Ġfun Ġhas Account ( uuid : UUID ): Boolean { Ċ Ċ // ĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Bank ") Ċ // ĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= Ġmysql . query (" SELECT Ġbalance ĠFROM Ġuser _ bank ĠWHERE Ġuuid ='$ uuid '") ?: return Ġfalse ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rs . next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmysql . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmysql . close () ĊĠĠĠĠĠĠĠ Ġrs . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////// /// ĊĠĠĠ Ġ// æĸ° è¦ı åı£ åº§ ä½ľæĪĲ Ġ æĹ¢ ãģ« æĮģ ãģ£ ãģ¦ãģĦ ãģŁ ãĤī ä½ľ ãĤī ãģªãģĦ ĊĠĠĠ Ġ////////////////////////////////// /// ĊĠĠĠ Ġprivate Ġfun Ġcreate Account ( uuid : ĠUUID ): Boolean { ĊĊĠĠĠĠĠĠĠ Ġif Ġ( has Account ( uuid )) return Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBu kkit . get Offline Player ( uuid ) ĊĊĠĠĠĠĠĠĠ Ġval Ġret Ġ Ġ= Ġmysql . execute (" INSERT ĠINTO Ġuser _ bank Ġ( player , Ġuuid , Ġbalance ) Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VALUES Ġ(' ${ p . name }', Ġ'$ uuid ', Ġ 0 ); ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ret ) return Ġfalse ĊĊĠĠĠĠĠĠĠ Ġadd Log ( uuid , plugin . name ," Create Account "," åı£ åº§ ãĤĴä½ľæĪĲ ", 0 . 0 , true ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġãĥ Ń ãĤ° ãĤĴ çĶŁæĪĲ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplugin Ġ åĩ¦çĲĨ ãĤĴè¡Į ãģ£ãģŁ ãĥĹ ãĥ© ãĤ° ãĤ¤ãĥ³ ãģ® åĲįåīį ĊĠĠĠĠ Ġ* Ġ@ param Ġnote Ġãĥ Ń ãĤ° ãģ® åĨħå®¹ Ġ( max 6 4 ) ĊĠĠĠĠ Ġ* Ġ@ param Ġamount Ġ åĭķ ãģĦ ãģŁ éĩĳ é¡ į ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Log ( uuid : ĠUUID , plugin : String , note : String , display Note : ĠString , amount : Double , is Deposit : Boolean ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBu kkit . get Offline Player ( uuid ) ĊĊĠĠĠĠĠĠĠ Ġmysql Queue . add (" INSERT ĠINTO Ġmoney _ log Ġ( player , Ġuuid , Ġplugin _ name , Ġamount , Ġserver , Ġnote , display _ note , Ġdeposit ) Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" VALUES Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" (' ${ p . name }', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' $ uuid ', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' ${ plugin }', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ amount , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' paper ', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' $ note ', Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"' ${ display Note }', " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ if Ġ( is Deposit ) Ġ 1 Ġelse Ġ 0 }); ") ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġset Balance ( uuid : UUID , amount : ĠDouble ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Bank ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( amount Ġ< 0 . 0 ) return ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! has Account ( uuid )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Account ( uuid ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġsql . execute (" update Ġuser _ bank Ġset Ġbalance =$ amount Ġwhere Ġuuid ='$ uuid '; ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ret ) return ĊĊĠĠĠĠĠĠĠ Ġadd Log ( uuid , plugin . name , Ġ" Set Balance By Command "," æīĢ æĮģ éĩĳ ãĤĴ ${ format ( amount )} ãģ« ãĤ»ãĥĥãĥĪ ", Ġamount , true ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ª ãĥķ ãĥ© ãĤ¤ãĥ³ åı£ åº§ ãģ® æ® ĭ é«ĺ ãĤĴ ç¢ºèªį ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġuuid Ġãĥ ¦ãĥ¼ãĤ¶ãĥ¼ ãģ® uuid * ĊĠĠĠĠ Ġ* Ġ@ return Ġæ ® ĭ é«ĺ Ġ åŃĺåľ¨ ãģĹãģªãģĦ ãĥ¦ãĥ¼ãĤ¶ãĥ¼ ãģł ãģ£ãģŁ åł´åĲĪ ãĢģ 0 . 0 ãģĮ è¿Ķ ãģķãĤĮãĤĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Balance Queue ( uuid : UUID ): Pair < Double , Int >{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġbal Ġ= Ġ 0 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= Ġmysql . query (" SELECT Ġbalance ĠFROM Ġuser _ bank ĠWHERE Ġuuid ='$ uuid '; ") ?: return ĠPair ( bal , 2 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! rs . next ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmysql . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( bal , 3 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbal Ġ= Ġrs . getDouble (" balance ") ĊĊĠĠĠĠĠĠĠ Ġrs . close () ĊĠĠĠĠĠĠĠ Ġmysql . close () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( bal , 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ª ãĥķ ãĥ© ãĤ¤ãĥ³ åı£ åº§ ãģ« åħ¥ éĩĳ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplugin Ġ åħ¥ éĩĳ ãģĹãģŁ ãĥĹ ãĥ© ãĤ° ãĤ¤ãĥ³ ĊĠĠĠĠ Ġ* Ġ@ param Ġnote Ġ åħ¥ éĩĳ ãģ® åĨħå®¹ ( 6 4 æĸĩåŃĹ ä»¥ åĨħ ) ĊĠĠĠĠ Ġ* Ġ@ param Ġamount Ġ åħ¥ éĩĳ é¡ į ( ãĥŀ ãĤ¤ ãĥĬ ãĤ¹ ãģł ãģ£ãģŁ åł´åĲĪ ãĢģ åħ¥ éĩĳ åĩ¦çĲĨ ãģ¯ è¡Į ãĤı ãĤĮ ãģªãģĦ ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdeposit Queue ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠString , Ġnote : String , display Note : String ?): Int { ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBu kkit . get Offline Player ( uuid ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! bank Enable ){ Ġreturn Ġ 1 Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfinal Amount Ġ= Ġfloor ( amount ) ĊĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmysql . execute (" update Ġuser _ bank Ġset Ġbalance = balance +$ final Amount Ġwhere Ġuuid ='$ uuid '; ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ret ){ Ġreturn Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Log ( uuid , plugin , Ġnote , display Note ?: note , Ġfinal Amount , true ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( p . is Online ){ Ġsend Msg ( p . player !! ," Â§ e ${ format ( amount )} åĨ Ĩ åħ¥ éĩĳ ãģĮãģĤ ãĤĬ ãģ¾ãģĹãģŁ ãĢĤ ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠãĤ ª ãĥķ ãĥ© ãĤ¤ãĥ³ åı£ åº§ ãģĭãĤī åĩº éĩĳ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġplugin Ġ åĩº éĩĳ ãģĹãģŁ ãĥĹ ãĥ© ãĤ° ãĤ¤ãĥ³ ĊĠĠĠĠ Ġ* Ġ@ param Ġnote Ġ åĩº éĩĳ ãģ® åĨħå®¹ ( 6 4 æĸĩåŃĹ ä»¥ åĨħ ) ĊĠĠĠĠ Ġ* Ġ@ param Ġamount Ġ åĩº éĩĳ é¡ į ( ãĥŀ ãĤ¤ ãĥĬ ãĤ¹ ãģł ãģ£ãģŁ åł´åĲĪ ãĢģ åħ¥ éĩĳ åĩ¦çĲĨ ãģ¯ è¡Į ãĤı ãĤĮ ãģªãģĦ ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ãĢĢ åĩº éĩĳ æĪĲåĬŁ ãģ§ true ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġwithdraw Queue ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠString , Ġnote : String , display Note : String ?): Int { ĊĊĠĠĠĠĠĠĠ Ġval Ġp Ġ= ĠBu kkit . get Offline Player ( uuid ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! bank Enable ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit . getLogger (). warning ("[ åĩº éĩĳ ãĤ¨ãĥ© ãĥ¼ ] Man 1 0 Bank ãģĮ éĸ ī ãģĺ ãģ¦ãģĦãģ¾ãģĻ Ġãĥ ¦ãĥ¼ãĤ¶ãĥ¼ :${ p . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ċ Ċ // ĠĠĠĠĠĠĠ Ġif Ġ(! has Account ( uuid )) return Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġfinal Amount Ġ= Ġfloor ( amount ) ĊĠĠĠĠĠĠĠ Ġval Ġbalance Ġ= Ġget Balance Queue ( uuid ). first ĊĊĠĠĠĠĠĠĠ Ġif Ġ( balance Ġ< Ġfinal Amount ){ Ġreturn Ġ 2 Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġmysql . execute (" update Ġuser _ bank Ġset Ġbalance = balance -${ final Amount } Ġwhere Ġuuid ='$ uuid '; ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! ret ){ Ġreturn Ġ 3 Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Log ( uuid , plugin , Ġnote , display Note ?: note , Ġfinal Amount , false ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( p . is Online ){ Ġsend Msg ( p . player !! ," Â§ e ${ format ( amount )} åĨ Ĩ åĩº éĩĳ ãģķãĤĮ ãģ¾ãģĹãģŁ ãĢĤ ") Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġãĥ ¦ãĥ¼ãĤ¶ãĥ¼ åĲį ãģĭãĤī uuid ãĤĴåıĸå¾Ĺ ãģĻãĤĭ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ*@ return Ġ åı£ åº§ ãģĮ åŃĺåľ¨ ãģĹãģª ãģĭ ãģ£ãģŁ ãĤī null ãĤĴ è¿Ķ ãģĻ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget UUID ( player : String ): UUID ? { ĊĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Bank ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= Ġsql . query (" SELECT Ġuuid ĠFROM Ġuser _ bank ĠWHERE Ġplayer ='$ player '; ") ?: return Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( rs . next ()){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= ĠUUID . fromString ( rs . getString (" uuid ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġsql . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrs . close () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġuuid ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsql . close () ĊĠĠĠĠĠĠĠ Ġrs . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchange Name ( player : ĠPlayer ){ ĊĠĠĠĠĠĠĠ Ġmysql Queue . add (" update Ġuser _ bank Ġset Ġplayer =' ${ player . name }' Ġwhere Ġuuid =' ${ player . unique Id }'; ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Bank Log ( p : Player , page : Int ): ĠMutable List < Bank Log > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġsql Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Bank ") ĊĊĠĠĠĠĠĠĠ Ġval Ġrs Ġ= Ġsql . query (" select Ġ* Ġfrom Ġmoney _ log Ġwhere Ġuuid =' ${ p . unique Id }' Ġorder Ġby Ġid Ġdesc ĠLimit Ġ 1 0 Ġoffset Ġ${ ( page )* 1 0 }; ") ?: return ĠCollections . emptyList () ĊĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < Bank Log >() ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( rs . next ()){ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= ĠBank Log () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . is Deposit Ġ= Ġrs . getInt (" deposit ") Ġ== Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . amount Ġ= Ġrs . getDouble (" amount ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . note Ġ= Ġrs . getString (" display _ note ") ?: rs . getString (" note ") !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . date Format Ġ= Ġsimple DateFormat . format ( rs . getTimestamp (" date ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsql . close () ĊĠĠĠĠĠĠĠ Ġrs . close () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġreload (){ ĊĠĠĠĠĠĠĠ ĠBu kkit . getLogger (). info (" Start ĠRe load ĠMan 1 0 Bank ") ĊĊĠĠĠĠĠĠĠ Ġmysql Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Offline Bank ") ĊĊĠĠĠĠĠĠĠ ĠBu kkit . getLogger (). info (" Finish ĠRe load ĠMan 1 0 Bank ") ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinit ( name : String ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġuuid Ġ= Ġget UUID ( name ) ?: return ĊĊĠĠĠĠĠĠĠ Ġmysql . execute (" delete Ġfrom Ġuser _ bank Ġwhere Ġuuid =' ${ uuid }'; ") ĊĠĠĠĠĠĠĠ Ġmysql . execute (" delete Ġfrom Ġloan _ table Ġwhere Ġborrow _ uuid =' ${ uuid }'; ") ĊĊĠĠĠĠĠĠĠ Ġvault . withdraw ( uuid , Ġvault . get Balance ( uuid )) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġinterface ĠResult Transaction { Ġfun Ġon Transaction Result ( errorCode : Int , Ġamount : Double , ĠerrorMessage : ĠString ) Ġ} ĊĠĠĠ Ġfun Ġinterface ĠInt Transaction { Ġfun Ġtransaction (): Int Ġ} ĊĠĠĠ Ġfun Ġinterface ĠPair Transaction { Ġfun Ġtransaction (): Pair < Double , Int > Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbank Queue (){ ĊĊĠĠĠĠĠĠĠ Ġmysql Ġ Ġ= ĠMySQL Manager ( plugin ," Man 1 0 Offline Bank ") ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbank Transaction Ġ= Ġbank Queue . take () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġbank Transaction . first ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠerrorCode Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġamount Ġ= Ġ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠerrorMessage Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction Ġis ĠInt Transaction ){ ĠerrorCode Ġ= Ġtransaction . transaction () Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( transaction Ġis ĠPair Transaction ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Ġ= Ġtransaction . transaction () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= Ġret . first ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorCode Ġ= Ġret . second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} catch Ġ( e : Exception ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠerrorMessage Ġ= Ġe . message . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBu kkit . getLogger (). info (" Man 1 0 Bank Queue ãĤ¨ãĥ© ãĥ¼ :${ errorMessage }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} finally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbank Transaction . second . on Transaction Result ( errorCode , amount , errorMessage ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġadd Transaction Queue ( transaction : ĠAny , Ġtransaction CallBack : ĠResult Transaction ): Result Transaction { ĊĠĠĠĠĠĠĠ Ġbank Queue . add ( Pair ( transaction , transaction CallBack )) ĊĠĠĠĠĠĠĠ Ġreturn Ġtransaction CallBack ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasync Deposit ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠJava Plugin , Ġnote : String , display Note : String ?, callback : Result Transaction ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠInt Transaction Ġ{ Ġreturn @ Int Transaction Ġdeposit Queue ( uuid , amount , plugin . name , note , display Note ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Transaction Queue ( transaction ) Ġ{ Ġ_ code : ĠInt , Ġ_ amount : ĠDouble , Ġ_ message : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Transaction Result (_ code ,_ amount ,_ message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲĮ æľŁ ãģ§ åħ¥ éĩĳ ãģĻãĤĭ åĩ¦çĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdeposit ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠJava Plugin , Ġnote : String , display Note : String ?): ĠTrip le < Int , ĠDouble , ĠString > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġret Ġ= ĠTrip le (- 1 , 0 . 0 ," ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= ĠLock () ĊĊĠĠĠĠĠĠĠ Ġasync Deposit ( uuid , amount , plugin , note , display Note ) Ġ{ Ġ_ code : ĠInt , Ġ_ amount : ĠDouble , Ġ_ message : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= ĠTrip le (_ code ,_ amount ,_ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġasync Withdraw ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠJava Plugin , Ġnote : String , display Note : String ?, callback : ĠResult Transaction ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠInt Transaction Ġ{ Ġreturn @ Int Transaction Ġwithdraw Queue ( uuid , amount , plugin . name , note , display Note ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Transaction Queue ( transaction ) Ġ{ Ġ_ code : ĠInt , Ġ_ amount : ĠDouble , Ġ_ message : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Transaction Result (_ code ,_ amount ,_ message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ åĲĮ æľŁ ãģ§ åĩº éĩĳ ãģĻãĤĭ åĩ¦çĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġwithdraw ( uuid : ĠUUID , Ġamount : ĠDouble , Ġplugin : ĠJava Plugin , Ġnote : String , display Note : String ?): ĠTrip le < Int , ĠDouble , ĠString > Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġret Ġ= ĠTrip le (- 1 , 0 . 0 ," ") ĊĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= ĠLock () ĊĊĠĠĠĠĠĠĠ Ġasync Withdraw ( uuid , amount , plugin , note , display Note ) Ġ{ Ġ_ code : ĠInt , Ġ_ amount : ĠDouble , Ġ_ message : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġret Ġ= ĠTrip le (_ code ,_ amount ,_ message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġret ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩĳ é¡ į ãĤĴåıĸå¾Ĺ ãģĻãĤĭ åĩ¦çĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġasync Get Balance ( uuid : ĠUUID , callback : ĠResult Transaction ){ ĊĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= ĠPair Transaction Ġ{ Ġreturn @ Pair Transaction Ġget Balance Queue ( uuid ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Transaction Queue ( transaction ) Ġ{ Ġ_ code : ĠInt , Ġ_ amount : ĠDouble , Ġ_ message : ĠString Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . on Transaction Result (_ code ,_ amount ,_ message ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éĩĳ é¡ į ãĤĴåıĸå¾Ĺ ãģĻãĤĭ åĩ¦çĲĨ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Balance ( uuid : ĠUUID ): Double { ĊĠĠĠĠĠĠĠ Ġvar Ġamount Ġ= Ġ- 1 . 0 ĊĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= ĠLock () ĊĊĠĠĠĠĠĠĠ Ġasync Get Balance ( uuid ){ Ġ_, Ġ_ amount , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġamount Ġ= Ġ_ amount ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlock . lock () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġamount ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// //////////////////////// ////// ĊĠĠĠ Ġ// ãĥŃãĤ° ãĤ¤ãĥ³ æĻĤ ãģ« ãģ¾ ãģ¨ ãĤģ ãģ¦ ãĤĦ ãĤĭ åĩ¦çĲĨ ( ãĤ¢ ãĤ«ãĤ¦ãĥ³ãĥĪ ãģ® ä½ľæĪĲ ãĢģ åĲįåīį ãĤĴ æĽ´æĸ° ãĢģ è³ĩ çĶ £ ãĥ¬ ãĤ³ãĥ¼ãĥī ä½ľæĪĲ ãģªãģ© ) ĊĠĠĠ Ġ// //////////////////////// /////// ĊĠĠĠ Ġfun Ġlogin Process ( p : Player ){ ĊĠĠĠĠĠĠĠ Ġval Ġt Ġ= ĠInt Transaction Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Account ( p . unique Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchange Name ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠE state Data . create E state Data ( p ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ Int Transaction Ġ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadd Transaction Queue ( t ) Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠBank Log { ĊĊĠĠĠĠĠĠĠ Ġvar Ġis Deposit Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġvar Ġamount Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġvar Ġnote Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar ĠdateFormat Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġplugin Ġ= Ġ"" ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠLock { ĊĊĠĠĠĠĠĠĠ Ġ@ Volatile ĊĠĠĠĠĠĠĠ Ġprivate Ġ Ġvar Ġis Lock Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġfun Ġlock (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ){ Ġis Lock Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( is Lock ){ ĠThread . sleep ( 1 ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġunlock (){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( this ){ Ġis Lock Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ Ċ }