From a12e15eb78be8d76e0dc725e42bbef1f26d1d9ce Mon Sep 17 00:00:00 2001 From: Hide_D Date: Wed, 8 Jun 2022 02:34:10 +0900 Subject: [PATCH] =?UTF-8?q?feat,wip:=20=EC=9C=A0=EB=8B=88=ED=81=AC=20?= =?UTF-8?q?=EC=9E=85=EC=B0=B0=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Auction/GetUniqueItemAuctionDetail.php | 19 ++- .../API/Auction/GetUniqueItemAuctionList.php | 8 +- hwe/sammo/Auction.php | 36 ++++- hwe/sammo/AuctionUniqueItem.php | 31 ---- hwe/ts/components/AuctionUniqueItem.vue | 147 +++++++++++++++++- hwe/ts/defs/API/Auction.ts | 16 +- 6 files changed, 206 insertions(+), 51 deletions(-) diff --git a/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php b/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php index 2564995a..9c13b103 100644 --- a/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php +++ b/hwe/sammo/API/Auction/GetUniqueItemAuctionDetail.php @@ -4,10 +4,12 @@ namespace sammo\API\Auction; use sammo\Session; use DateTimeInterface; +use sammo\AuctionUniqueItem; use sammo\DB; use sammo\DTO\AuctionBidItem; use sammo\DTO\AuctionInfo; use sammo\Enums\AuctionType; +use sammo\TimeUtil; use sammo\Validator; class GetUniqueItemAuctionDetail extends \sammo\BaseAPI @@ -16,14 +18,14 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI { $v = new Validator($this->args); $v->rule('required', [ - 'auction_id', + 'auctionID', ]) - ->rule('integer', 'auction_id'); + ->rule('integer', 'auctionID'); if (!$v->validate()) { return $v->errorStr(); } - $this->args['auction_id'] = (int)$this->args['auction_id']; + $this->args['auctionID'] = (int)$this->args['auctionID']; return null; } @@ -37,11 +39,11 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI $db = DB::db(); $generalID = $session->generalID; - $auctionID = $this->args['auction_id']; + $auctionID = $this->args['auctionID']; $rawAuction = $db->queryFirstRow( - 'SELECT * FROM `ng_auction` WHERE `type` = %s AND `auction_id` = %s', - AuctionType::UniqueItem, + 'SELECT * FROM `ng_auction` WHERE `type` = %s AND `id` = %i', + AuctionType::UniqueItem->value, $auctionID ); @@ -63,10 +65,12 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI 'generalName' => $bid->aux->generalName, 'amount' => $bid->amount, 'isCallerHighestBidder' => $bid->generalID === $generalID, - 'date' => $bid->date, + 'date' => TimeUtil::format($bid->date, false), ]; } + $obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID); + return [ 'result' => true, 'auction' => [ @@ -80,6 +84,7 @@ class GetUniqueItemAuctionDetail extends \sammo\BaseAPI 'availableLatestBidCloseDate' => $auction->detail->availableLatestBidCloseDate, ], 'bidList' => $responseBid, + 'obfuscatedName' => $obfuscatedName, ]; } } diff --git a/hwe/sammo/API/Auction/GetUniqueItemAuctionList.php b/hwe/sammo/API/Auction/GetUniqueItemAuctionList.php index 0faaf0f8..765833a3 100644 --- a/hwe/sammo/API/Auction/GetUniqueItemAuctionList.php +++ b/hwe/sammo/API/Auction/GetUniqueItemAuctionList.php @@ -4,10 +4,12 @@ namespace sammo\API\Auction; use sammo\Session; use DateTimeInterface; +use sammo\AuctionUniqueItem; use sammo\DB; use sammo\DTO\AuctionBidItem; use sammo\DTO\AuctionInfo; use sammo\Enums\AuctionType; +use sammo\TimeUtil; use sammo\Util; class GetUniqueItemAuctionList extends \sammo\BaseAPI @@ -56,6 +58,8 @@ class GetUniqueItemAuctionList extends \sammo\BaseAPI $rawHighestBids ); + $obfuscatedName = AuctionUniqueItem::genObfuscatedName($generalID); + $response = []; foreach ($auctions as $auction) { $auctionID = $auction->id; @@ -71,8 +75,9 @@ class GetUniqueItemAuctionList extends \sammo\BaseAPI 'target' => $auction->target, 'isCallerHost' => $auction->hostGeneralID === $generalID, 'hostName' => $auction->detail->hostName, + 'closeDate' => TimeUtil::format($auction->closeDate, false), 'remainCloseDateExtensionCnt' => $auction->detail->remainCloseDateExtensionCnt, - 'availableLatestBidCloseDate' => $auction->detail->availableLatestBidCloseDate, + 'availableLatestBidCloseDate' => TimeUtil::format($auction->detail->availableLatestBidCloseDate, false), 'highestBid' => [ 'generalName' => $highestBid->aux->generalName, 'amount' => $highestBid->amount, @@ -85,6 +90,7 @@ class GetUniqueItemAuctionList extends \sammo\BaseAPI return [ 'result' => true, 'list' => $response, + 'obfuscatedName' => $obfuscatedName, ]; } } diff --git a/hwe/sammo/Auction.php b/hwe/sammo/Auction.php index cef03db5..878ceefd 100644 --- a/hwe/sammo/Auction.php +++ b/hwe/sammo/Auction.php @@ -31,6 +31,37 @@ abstract class Auction protected AuctionBidItem|null|false $_highestBid = false; + static public function genObfuscatedName(int $id): string + { + $db = DB::db(); + $gameStor = KVStorage::getStorage($db, 'game_env'); + + $namePool = $gameStor->getValue('obfuscatedNamePool'); + if ($namePool === null) { + $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( + UniqueConst::$hiddenSeed, + ))); + $namePool = []; + foreach (GameConst::$randGenFirstName as $ch0) { + foreach (GameConst::$randGenMiddleName as $ch1) { + foreach (GameConst::$randGenLastName as $ch2) { + $namePool[] = "{$ch0}{$ch1}{$ch2}"; + } + } + } + $namePool = $rng->shuffle($namePool); + $gameStor->setValue('obfuscatedNamePool', $namePool); + } + + + $dupIdx = intdiv($id, count($namePool)); + $subIdx = $id % count($namePool); + if ($dupIdx == 0) { + return $namePool[$subIdx]; + } + return "{$namePool[$subIdx]}{$dupIdx}"; + } + static protected function openAuction(AuctionInfo $info, General $general): int|string { $db = DB::db(); @@ -238,6 +269,7 @@ abstract class Auction return '유산포인트가 부족합니다.'; } + $obfuscatedName = static::genObfuscatedName($general->getID()); //여기서부터 입찰 성공 $newBid = new AuctionBidItem( @@ -249,7 +281,7 @@ abstract class Auction $now, new AuctionBidItemData( $general->getVar('owner_name'), - $general->getName(), + $obfuscatedName, $tryExtendCloseDate, ) ); @@ -275,7 +307,7 @@ abstract class Auction $general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, $morePoint); if ($highestBid !== null && $myPrevBid === null) { - $this->refundBid($highestBid, "{$auctionInfo->id}번 $auctionInfo->detail->title}에 상회입찰자가 나타났습니다."); + $this->refundBid($highestBid, "{$auctionInfo->id}번 {$auctionInfo->detail->title}에 상회입찰자가 나타났습니다."); } $general->applyDB($db); return null; diff --git a/hwe/sammo/AuctionUniqueItem.php b/hwe/sammo/AuctionUniqueItem.php index 71d3c0ce..65a6c618 100644 --- a/hwe/sammo/AuctionUniqueItem.php +++ b/hwe/sammo/AuctionUniqueItem.php @@ -17,37 +17,6 @@ class AuctionUniqueItem extends Auction static AuctionType $auctionType = AuctionType::UniqueItem; - static public function genObfuscatedName(int $id): string - { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - $namePool = $gameStor->getValue('obfuscatedNamePool'); - if ($namePool === null) { - $rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize( - UniqueConst::$hiddenSeed, - ))); - $namePool = []; - foreach (GameConst::$randGenFirstName as $ch0) { - foreach (GameConst::$randGenMiddleName as $ch1) { - foreach (GameConst::$randGenLastName as $ch2) { - $namePool[] = "{$ch0}{$ch1}{$ch2}"; - } - } - } - $namePool = $rng->shuffle($namePool); - $gameStor->setValue('obfuscatedNamePool', $namePool); - } - - - $dupIdx = intdiv($id, count($namePool)); - $subIdx = $id % count($namePool); - if ($dupIdx == 0) { - return $namePool[$subIdx]; - } - return "{$namePool[$subIdx]}{$dupIdx}"; - } - static public function openItemAuction(BaseItem $item, General $general, int $startAmount): self|string { if ($startAmount < GameConst::$inheritItemUniqueMinPoint) { diff --git a/hwe/ts/components/AuctionUniqueItem.vue b/hwe/ts/components/AuctionUniqueItem.vue index 528108c0..7e557499 100644 --- a/hwe/ts/components/AuctionUniqueItem.vue +++ b/hwe/ts/components/AuctionUniqueItem.vue @@ -1,7 +1,150 @@ \ No newline at end of file +type AuctionItemInfo = UniqueItemAuctionList["list"][0]; + +const currentAuctionID = ref(); +const currentAuction = ref(undefined); +const bidAmount = ref(5000); +watch(currentAuctionID, async (auctionID) => { + if (auctionID === undefined) { + return; + } + try { + currentAuction.value = await SammoAPI.Auction.GetUniqueItemAuctionDetail({ auctionID }); + } catch (e) { + console.error(e); + if (isString(e)) { + unwrap(useToast()).danger({ + title: "에러", + body: e, + }); + } + } +}); +const auctionList = ref(new Map()); +const obfuscatedName = ref(""); + +const toasts = unwrap(useToast()); + +async function refresh() { + try { + const result = await SammoAPI.Auction.GetUniqueItemAuctionList(); + obfuscatedName.value = result.obfuscatedName; + auctionList.value = new Map(result.list.map((auction) => [auction.id, auction])); + if (currentAuctionID.value === undefined && result.list.length > 0) { + currentAuctionID.value = result.list[0].id; + bidAmount.value = result.list[0].highestBid.amount; + } + } catch (e) { + console.error(e); + if (isString(e)) { + toasts.danger({ + title: "에러", + body: e, + }); + } + } +} + +async function bidAuction(){ + if(currentAuction.value === undefined){ + return; + } + + + const amount = bidAmount.value; + const auctionInfo = currentAuction.value.auction; + + if(confirm(`${auctionInfo.title}에 ${amount}유산포인트를 입찰하시겠습니까?`)){ + try{ + await SammoAPI.Auction.BidUniqueAuction({ auctionID: auctionInfo.id, amount }); + toasts.success({ + title: "성공", + body: "입찰이 완료되었습니다.", + }); + await refresh(); + }catch(e){ + console.error(e); + if(isString(e)){ + toasts.danger({ + title: "에러", + body: e, + }); + } + } + } +} + +onMounted(() => { + void refresh(); +}); + diff --git a/hwe/ts/defs/API/Auction.ts b/hwe/ts/defs/API/Auction.ts index 5fcd792b..9ea32194 100644 --- a/hwe/ts/defs/API/Auction.ts +++ b/hwe/ts/defs/API/Auction.ts @@ -34,6 +34,7 @@ export type UniqueItemAuctionInfo = { target: string; isCallerHost: boolean; hostName: string; + closeDate: string; remainCloseDateExtensionCnt: number; availableLatestBidCloseDate: string; }; @@ -46,19 +47,18 @@ export type ActiveResourceAuctionList = ValidResponse & { }; export type UniqueItemAuctionList = ValidResponse & { - list: ( - | UniqueItemAuctionInfo - | { - highestBid: UniqueItemAuctionBidder; - } - )[]; + list: (UniqueItemAuctionInfo & { + highestBid: UniqueItemAuctionBidder; + })[]; + obfuscatedName: string; }; export type UniqueItemAuctionDetail = ValidResponse & { auction: UniqueItemAuctionInfo; bidList: UniqueItemAuctionBidder[]; -} + obfuscatedName: string; +}; export type OpenAuctionResponse = ValidResponse & { auctionID: number; -} \ No newline at end of file +};