refac: 토너먼트 베팅 세부 로직을 ng_betting으로 이동 (#218)
- 토너먼트 베팅을 betting 테이블 대신 Betting 모듈을 이용하는 형태로 변경 - 이전 토너먼트 베팅 기록이 남음 - 현재 이전 토너먼트 기록을 볼 수는 없음 - 베팅에 API/Betting/Bet 을 이용 - 토너먼트, 베팅 페이지를 Betting 모듈에 맞게 임시 조정 - 이전 버전과의 호환성을 위해 betting table과 betting 테이블에 초기값을 추가하는 로직은 남김 - 이후 0.30이 되었을 때 제거 Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/218
This commit was merged in pull request #218.
This commit is contained in:
+32
-16
@@ -10,9 +10,10 @@ class Betting
|
||||
|
||||
private BettingInfo $info;
|
||||
|
||||
public CONST LAST_BETTING_ID_KEY = 'last_betting_id';
|
||||
public const LAST_BETTING_ID_KEY = 'last_betting_id';
|
||||
|
||||
static public function genNextBettingID(): int{
|
||||
static public function genNextBettingID(): int
|
||||
{
|
||||
$db = DB::db();
|
||||
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
@@ -24,7 +25,8 @@ class Betting
|
||||
return $bettingID;
|
||||
}
|
||||
|
||||
static public function openBetting(BettingInfo $info){
|
||||
static public function openBetting(BettingInfo $info)
|
||||
{
|
||||
$db = DB::db();
|
||||
$bettingID = $info->id;
|
||||
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||
@@ -47,7 +49,7 @@ class Betting
|
||||
return Json::encode($bettingType);
|
||||
}
|
||||
|
||||
public function purifyBettingKey(array $bettingType, bool $ignoreOver = false): array
|
||||
public function purifyBettingKey(array $bettingType, bool $noValidate = false): array
|
||||
{
|
||||
$selectCnt = $this->info->selectCnt;
|
||||
sort($bettingType, SORT_NUMERIC);
|
||||
@@ -56,17 +58,30 @@ class Betting
|
||||
throw new \InvalidArgumentException('중복된 값이 있습니다.');
|
||||
}
|
||||
|
||||
if ($bettingType[0] < 0) {
|
||||
throw new \InvalidArgumentException('올바르지 않은 값이 있습니다.(0 미만)' . print_r($bettingType, true));
|
||||
}
|
||||
|
||||
if (!$ignoreOver && Util::array_last($bettingType) >= count($this->info->candidates)) {
|
||||
throw new \InvalidArgumentException('올바르지 않은 값이 있습니다.(초과)' . print_r($bettingType, true));
|
||||
if (!$noValidate) {
|
||||
foreach($bettingType as $bettingKey){
|
||||
if(!key_exists($bettingKey, $this->info->candidates)){
|
||||
throw new \InvalidArgumentException('올바른 후보가 아닙니다.' . print_r($bettingType, true));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $bettingType;
|
||||
}
|
||||
|
||||
public function closeBetting(): void
|
||||
{
|
||||
$db = DB::db();
|
||||
$bettingStor = KVStorage::getStorage($db, 'betting');
|
||||
$bettingID = $this->info->id;
|
||||
$gameStor = KVStorage::getStorage($db, 'game_env');
|
||||
|
||||
//XXX: 베팅 종료 시점을 '현재 연월'로 하여 강제로 닫는다.
|
||||
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
|
||||
$this->info->closeYearMonth = Util::joinYearMonth($year, $month);
|
||||
$bettingStor->setValue("id_{$bettingID}", $this->info->toArray());
|
||||
}
|
||||
|
||||
public function convertBettingKey(array $bettingType): string
|
||||
{
|
||||
$bettingType = $this->purifyBettingKey($bettingType);
|
||||
@@ -78,7 +93,8 @@ class Betting
|
||||
return $this->info;
|
||||
}
|
||||
|
||||
public function bet(int $generalID, ?int $userID, array $bettingType, int $amount): void{
|
||||
public function bet(int $generalID, ?int $userID, array $bettingType, int $amount): void
|
||||
{
|
||||
$bettingInfo = $this->info;
|
||||
|
||||
if ($bettingInfo->finished) {
|
||||
@@ -107,6 +123,7 @@ class Betting
|
||||
throw new \RuntimeException('필요한 선택 수를 채우지 못했습니다.');
|
||||
}
|
||||
|
||||
$resKey = $this->info->reqInheritancePoint?'유산포인트':'금';
|
||||
$bettingTypeKey = $this->convertBettingKey($bettingType);
|
||||
|
||||
$inheritStor = KVStorage::getStorage($db, "inheritance_{$userID}");
|
||||
@@ -114,7 +131,7 @@ class Betting
|
||||
$prevBetAmount = $db->queryFirstField('SELECT sum(amount) FROM ng_betting WHERE betting_id = %i AND user_id = %i', $this->bettingID, $userID) ?? 0;
|
||||
|
||||
if ($prevBetAmount + $amount > 1000) {
|
||||
throw new \RuntimeException((1000 - $prevBetAmount) . ' 포인트까지만 베팅 가능합니다.');
|
||||
throw new \RuntimeException((1000 - $prevBetAmount) . $resKey.'까지만 베팅 가능합니다.');
|
||||
}
|
||||
|
||||
if ($bettingInfo->reqInheritancePoint) {
|
||||
@@ -287,8 +304,8 @@ class Betting
|
||||
|
||||
//남은 상금은 '당첨자'에게 몰아준다.
|
||||
//당첨자가 아무도 없다면, 0개 맞춘 그룹에게 돌아간다.
|
||||
if($rewardAmount){
|
||||
foreach(Util::range($selectCnt, -1, -1) as $matchPoint){
|
||||
if ($rewardAmount) {
|
||||
foreach (Util::range($selectCnt, -1, -1) as $matchPoint) {
|
||||
if (!key_exists($matchPoint, $rewardAmount)) {
|
||||
continue;
|
||||
}
|
||||
@@ -338,7 +355,7 @@ class Betting
|
||||
$previousPoint = ($inheritStor->getValue('previous') ?? [0, 0])[0];
|
||||
$nextPoint = $previousPoint + $amount;
|
||||
$inheritStor->setValue('previous', [$nextPoint, 0]);
|
||||
$inheritStor->invalidateCacheValue('previous');//XXX: 실제로는 previous 값을 사용할 수 없도록 락을 걸어야 한다.
|
||||
$inheritStor->invalidateCacheValue('previous'); //XXX: 실제로는 previous 값을 사용할 수 없도록 락을 걸어야 한다.
|
||||
|
||||
$amountText = number_format($amount);
|
||||
$previousPointText = number_format($previousPoint);
|
||||
@@ -368,7 +385,6 @@ class Betting
|
||||
foreach ($loggers as $userLogger) {
|
||||
$userLogger->flush();
|
||||
}
|
||||
|
||||
} else {
|
||||
$generalList = General::createGeneralObjListFromDB(array_unique(Util::squeezeFromArray($rewardList, 'generalID')), ['gold', 'npc'], 1);
|
||||
foreach ($rewardList as $rewardItem) {
|
||||
|
||||
@@ -196,6 +196,16 @@ class ResetHelper{
|
||||
'plock'=>1,
|
||||
'locktime'=>TimeUtil::now(true)
|
||||
]);
|
||||
$db->insert('plock', [
|
||||
'type'=>'TOURNAMENT',
|
||||
'plock'=>1,
|
||||
'locktime'=>TimeUtil::now(true)
|
||||
]);
|
||||
$db->insert('plock', [
|
||||
'type'=>'ETC',
|
||||
'plock'=>1,
|
||||
'locktime'=>TimeUtil::now(true)
|
||||
]);
|
||||
|
||||
$prevWinner = $db->queryFirstField('SELECT l12name FROM emperior ORDER BY `no` DESC LIMIT 1');
|
||||
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games') + 1;
|
||||
|
||||
Reference in New Issue
Block a user