game2006api/webapp/controller/CallbackController.class.php
hujiabin 62312e60f1 1
2022-11-24 17:22:57 +08:00

445 lines
14 KiB
PHP

<?php
require_once('mt/Item.php');
require_once('mt/Currency.php');
require_once('mt/Hero.php');
require_once('mt/Parameter.php');
require_once('models/Nft.php');
require_once('models/Withdrawal.php');
require_once('models/Transfer.php');
require_once('models/UserWalletRecord.php');
require_once('models/NftUpEvent.php');
require_once('models/Hero.php');
require_once('models/Gun.php');
require_once('models/Chip.php');
require_once('models/DynData.php');
require_once('models/NftUpReceive.php');
require_once('models/Transaction.php');
require_once('phpcommon/bchelper.php');
use phpcommon\SqlHelper;
use models\Nft;
use models\Withdrawal;
use models\Transfer;
use models\UserWalletRecord;
use models\NftUpEvent;
use models\Hero;
use models\Gun;
use models\Chip;
use models\DynData;
use models\NftUpReceive;
use models\Transaction;
class CallbackController extends BaseController {
private function isTestMode()
{
return isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443 && SERVER_ENV == _TEST;
}
public function transfer()
{
$dir = getReqVal('dir', '');
$account = strtolower(getReqVal('account', ''));
$txHash = getReqVal('txhash', '');
$type = getReqVal('type', '');
$value = getReqVal('value', '0');
$gameId = 2006;
$channel = BC_CHANNEL;
$accountId = phpcommon\createAccountId($channel, $gameId, $account);
$conn = myself()->_getMysql($accountId);
if (UserWalletRecord::find($conn, $txHash)) {
myself()->_rspOk();
return;
}
UserWalletRecord::add($conn, $txHash, $dir, $account, $type, $value);
if (!in_array($dir, array(0, 1))){
myself()->_rspErr(1, '');
return;
}
if (!in_array($type, array(1, 2))){
myself()->_rspErr(2, '');
return;
}
if (strlen($value) <= 18){
myself()->_rspErr(4, '');
return;
}
$value = substr($value, 0, -18);
if ($value < 0 || empty($value)) {
myself()->_rspErr(3, '');
return;
}
$gold = 0;
$diamond = 0;
if ($type == 1) {
$gold = $value;
} else {
$diamond = $value;
}
if ($dir == 1) {
$gold = -$gold;
$diamond = -$diamond;
}
$userRow = SqlHelper::ormSelect(
$conn,
't_user',
array(
'account_id' => $accountId,
));
if ($userRow) {
SqlHelper::update(
$conn,
't_user',
array(
'account_id' => $accountId,
),
array(
'gold' => function() use($gold) {
return "CASE WHEN gold + ${gold} < 0 THEN 0 ELSE gold + ${gold} END";
},
'diamond' => function() use($diamond) {
return "CASE WHEN diamond + ${diamond} < 0 THEN 0 ELSE diamond + ${diamond} END";
},
));
} else {
SqlHelper::upsert(
$conn,
't_user_wallet_offline',
array(
'account_id' => $accountId,
),
array(
'gold' => function() use($gold) {
return "CASE WHEN gold + ${gold} < 0 THEN 0 ELSE gold + ${gold} END";
},
'diamond' => function() use($diamond) {
return "CASE WHEN diamond + ${diamond} < 0 THEN 0 ELSE diamond + ${diamond} END";
},
'modifytime' => myself()->_getNowTime()
),
array(
'account_id' => $accountId,
'gold' => $gold,
'diamond' => $diamond,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
));
}
UserWalletRecord::update($conn,
$txHash,
array(
'state' => 1,
'modifytime' => myself()->_getNowTime()
));
myself()->_rspOk();
}
public function heroUpgradeQuality(){
$transId = getReqVal('trans_id', '0');
$tokenId1 = getReqVal('token_id1', '0');
$tokenId2 = getReqVal('token_id2', '0');
if (!$transId || !$tokenId1){
myself()->_rspErr(1, 'param error');
return;
}
$tranDb= Transaction::findEx($transId);
if (!$tranDb){
myself()->_rspErr(1, 'param error');
return;
}
if (NftUpEvent::find($transId)){
myself()->_rspOk();
return;
}
if (! $tranDb['result']){
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId1,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
myself()->_rspOk();
return;
}
$heroDb = SqlHelper::ormSelectOne(
myself()->_getMysql(''),
't_hero',
array(
'token_id' => $tokenId1,
)
);
if ( !$heroDb ){
myself()->_rspErr(1, 'token_id param error');
return;
}
$nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']+1);
if (! $nextQualityMeta){
myself()->_rspOk();
return;
}
$heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality']);
$nextHeroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality']+1);
$heroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'],$heroLucky);
$nextHeroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality']+1,$nextHeroLucky);
SqlHelper::update
( myself()->_getMysql(''),
't_hero',
array(
'token_id' => $tokenId1,
),
array(
'hero_tili' => $heroDb['hero_tili']+($nextHeroTili-$heroTili),
'skill_points' => $heroDb['skill_points'] + $nextQualityMeta['skill_point'],
'quality' => $heroDb['quality']+1,
'advanced_count' => $heroDb['advanced_count'] + 1,
// 'lock_type' => 0,
// 'unlock_time' => 0,
'labour' => 0,
)
);
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId1,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
$param = array(
'trans_id'=>$transId,
'token_id1'=>$tokenId1,
'token_id2'=>$tokenId2,
'token_type'=>1,
);
NftUpReceive::upsert($tranDb['account_id'],$param);
if ($heroDb['quality'] + 1 > $this->_getDynDataV($tranDb['account_id'],TN_HERO_MAX_QUALITY, 0)) {
$this->_setDynDataV($tranDb['account_id'],TN_HERO_MAX_QUALITY, 0, $heroDb['quality'] + 1);
}
myself()->_rspOk();
}
public function gunUpgradeQuality(){
$transId = getReqVal('trans_id', '0');
$tokenId1 = getReqVal('token_id1', '0');
$tokenId2 = getReqVal('token_id2', '0');
if (!$transId || !$tokenId1){
myself()->_rspErr(1, 'param error');
return;
}
$tranDb= Transaction::findEx($transId);
if (!$tranDb){
myself()->_rspErr(1, 'param error');
return;
}
if (NftUpEvent::find($transId)){
myself()->_rspOk();
return;
}
if (! $tranDb['result']){
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId1,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
myself()->_rspOk();
return;
}
$gunDb =SqlHelper::ormSelectOne(
myself()->_getMysql($tranDb['account_id']),
't_gun',
array(
'token_id' => $tokenId1,
)
);
if ( !$gunDb ){
myself()->_rspErr(1, 'token_id param error');
return;
}
$nextQualityMeta = mt\GunQuality::getByQuality($gunDb['quality']+1);
if (!$nextQualityMeta) {
myself()->_rspOk();
return;
}
$gunLucky = \services\FormulaService::Weapon_Advanced_Lucky_Value($gunDb['quality']);
$nextGunLucky = \services\FormulaService::Weapon_Advanced_Lucky_Value($gunDb['quality']+1);
$durability = \services\FormulaService::Weapon_NFT_Maximum_Durability($gunDb['quality'],$gunLucky);
$nextDurability = \services\FormulaService::Weapon_NFT_Maximum_Durability($gunDb['quality']+1,$nextGunLucky);
SqlHelper::update
(myself()->_getMysql($tranDb['account_id']),
't_gun',
array(
'token_id' => $tokenId1,
),
array(
'durability' => $gunDb['durability']+($nextDurability-$durability),
'quality' => $gunDb['quality']+1,
// 'lock_type' => 0,
// 'unlock_time' => 0,
'labour' => 0,
)
);
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId1,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
$param = array(
'trans_id'=>$transId,
'token_id1'=>$tokenId1,
'token_id2'=>$tokenId2,
'token_type'=>2,
);
NftUpReceive::upsert($tranDb['account_id'],$param);
if ($gunDb['quality'] + 1 > $this->_getDynDataV($tranDb['account_id'],TN_GUN_MAX_QUALITY, 0)) {
$this->_setDynDataV($tranDb['account_id'],TN_GUN_MAX_QUALITY, 0, $gunDb['quality'] + 1);
}
myself()->_rspOk();
}
public function chipUpgradeGrade(){
$transId = getReqVal('trans_id', '0');
$tokenId = getReqVal('token_id', '0');
if (!$transId || !$tokenId){
myself()->_rspErr(1, 'param error');
return;
}
$tranDb= Transaction::findEx($transId);
if (!$tranDb){
myself()->_rspErr(1, 'param error');
return;
}
if (NftUpEvent::find($transId)){
myself()->_rspOk();
return;
}
if (! $tranDb['result']){
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
myself()->_rspOk();
return;
}
$chipDb = SqlHelper::ormSelectOne(
myself()->_getMysql($tranDb['account_id']),
't_chip',
array(
'token_id' => $tokenId
)
);
if ( !$chipDb ){
myself()->_rspErr(1, 'token_id param error');
return;
}
$nextGrade = $chipDb['chip_grade']+1;
if ($nextGrade > 15){
myself()->_rspErr(1, 'Chip Lv upper limit');
return;
}
if ($nextGrade == 3 || $nextGrade == 5){
Chip::updateRandAttr($tranDb['account_id'],$chipDb);
}
$lucky = ltrim(\services\FormulaService::getChipLuckyValue($nextGrade),'-') ;
if ($nextGrade>=5){
$fieldsKv = array(
'lucky_temporary'=>$lucky,
'chip_grade'=>$nextGrade,
'supper_state'=>1,
'modifytime' => myself()->_getNowTime()
);
}else{
$fieldsKv = array(
'lucky_temporary'=>$lucky,
'chip_grade'=>$nextGrade,
'modifytime' => myself()->_getNowTime()
);
}
SqlHelper::update
(myself()->_getMysql($tranDb['account_id']),
't_chip',
array(
'token_id' => $tokenId,
),
$fieldsKv
);
NftUpEvent::add(
array(
'trans_id' => $transId,
'token_id' => $tokenId,
'value' => 1,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime(),
)
);
myself()->_rspOk();
}
private function _getDynDataV($accountId,$x, $y, $val = 0){
SqlHelper::ormSelectOne(
myself()->_getMysql($accountId),
't_dyndata',
array(
'account_id' => $accountId,
'x' => $x,
'y' => $y,
)
);
}
private function _setDynDataV($accountId,$x, $y, $val = 0){
SqlHelper::upsert
(myself()->_getMysql($accountId),
't_dyndata',
array(
'account_id' => $accountId,
'x' => $x,
'y' => $y
),
array(
'val' => $val,
'modifytime' => myself()->_getNowTime()
),
array(
'account_id' => $accountId,
'x' => $x,
'y' => $y,
'val' => $val,
'createtime' => myself()->_getNowTime(),
'modifytime' => myself()->_getNowTime()
)
);
}
}