1
This commit is contained in:
parent
d65f1f29ad
commit
258053c297
@ -6,7 +6,6 @@ require_once('mt/Hero.php');
|
||||
require_once('mt/Item.php');
|
||||
require_once('mt/Parameter.php');
|
||||
require_once('mt/Drop.php');
|
||||
require_once('mt/Dailyselection.php');
|
||||
require_once('mt/ShopChest.php');
|
||||
|
||||
require_once('models/User.php');
|
||||
@ -23,6 +22,7 @@ require_once('models/Transaction.php');
|
||||
require_once('services/AwardService.php');
|
||||
require_once('services/PropertyChgService.php');
|
||||
require_once('services/BlockChainService.php');
|
||||
require_once('services/ShopService.php');
|
||||
|
||||
require_once('phpcommon/bignumber.php');
|
||||
|
||||
@ -38,85 +38,20 @@ use models\GunSkin;
|
||||
use models\ShopBuyRecord;
|
||||
use models\Chip;
|
||||
use mt\Shop;
|
||||
use mt\Dailyselection;
|
||||
use mt\ShopChest;
|
||||
use mt\ShopGoods;
|
||||
use models\Transaction;
|
||||
use models\BcOrder;
|
||||
use services\LogService;
|
||||
use services\ShopAddItemService;
|
||||
use services\ShopService;
|
||||
|
||||
class ShopController extends BaseAuthedController
|
||||
{
|
||||
class ShopController extends BaseAuthedController {
|
||||
|
||||
public function getGoodsList()
|
||||
{
|
||||
$shopId = getReqVal('shop_id', 0);
|
||||
if ($shopId == 0) {
|
||||
$goodsMetaList = mt\ShopGoods::all();
|
||||
} else {
|
||||
$goodsMetaList = mt\ShopGoods::getGoodsList($shopId);
|
||||
}
|
||||
|
||||
$goodsMetaList = $goodsMetaList ? $goodsMetaList : array();
|
||||
$buyRecordHash = ShopBuyRecord::allToHash();
|
||||
|
||||
$goodsList = array();
|
||||
foreach ($goodsMetaList as $goodsMeta) {
|
||||
$goodsDto = array(
|
||||
'goods_meta' => $this->goodsMetaToInfo($goodsMeta),
|
||||
'bought_times' => 0,
|
||||
'free_num' => 0,
|
||||
);
|
||||
array_push($goodsList, $goodsDto);
|
||||
switch ($goodsMeta['limit_type']) {
|
||||
case mt\Item::DAILY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['this_day_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
case mt\Item::WEEKLY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['this_week_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
case mt\Item::TOTAL_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['total_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$goodsId = $goodsMeta['goods_id'];
|
||||
$itemMeta = mt\Item::get($goodsId);
|
||||
if ($itemMeta) {
|
||||
// 如果是皮肤,判断是否已经拥有,如果已经拥有,不能购买
|
||||
if ($itemMeta['type'] == mt\Item::HERO_SKIN_TYPE) {
|
||||
$errCode = 0;
|
||||
$errMsg = '';
|
||||
if (!$this->canBuy($itemMeta, $errCode, $errMsg)) {
|
||||
$goods['bought_times'] = 1;
|
||||
} else {
|
||||
$goods['bought_times'] = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// error !!!!!!
|
||||
error_log('item not found:' . $goodsId);
|
||||
}
|
||||
|
||||
if (!empty($goods['free_type'])) {
|
||||
$count = $this->countFreeBuyTimes($goodsMeta['free_type'],
|
||||
$goodsMeta['id'],
|
||||
$goodsMeta['goods_id']);
|
||||
$goods['free_num'] = $goods['free_num'] - $count;
|
||||
// error_log('free_num:' . $goods['free_num']);
|
||||
}
|
||||
}
|
||||
|
||||
$goodsList = ShopService::getGoodsList($shopId);
|
||||
$this->_rspData(
|
||||
array(
|
||||
'goods_list' => $goodsList,
|
||||
@ -135,29 +70,22 @@ class ShopController extends BaseAuthedController
|
||||
return;
|
||||
}
|
||||
|
||||
$row = mt\ShopGoods::get($id);
|
||||
$goodsMeta = mt\ShopGoods::get($id);
|
||||
|
||||
if (!$row) {
|
||||
if (!$goodsMeta) {
|
||||
$this->_rspErr(1, 'goods not found');
|
||||
return;
|
||||
}
|
||||
|
||||
$goodsId = $row['goods_id'];
|
||||
if (!empty($address)) {
|
||||
// $pending = $this->checkPendingBuyGoodsNormal($address, $goodsId, $row['shop_id'], $id);
|
||||
// if ($pending) {
|
||||
// $this->_rspErr(1, 'pending');
|
||||
// return;
|
||||
// }
|
||||
}
|
||||
$goodsId = $goodsMeta['goods_id'];
|
||||
|
||||
$desired_token_type = $row['token_type'];
|
||||
$desired_token_type = $goodsMeta['token_type'];
|
||||
$check_token_type = splitStr1($desired_token_type);
|
||||
$token_pos = array_search($tokenType, $check_token_type, true);
|
||||
$isFreeBuy = false;
|
||||
if (!empty($row['free_type'])) {
|
||||
$count = $this->countFreeBuyTimes($row['free_type'], $row['id'], $row['goods_id']);
|
||||
if ($count < $row['free_num']) {
|
||||
if (!empty($goodsMeta['free_type'])) {
|
||||
$count = $this->countFreeBuyTimes($goodsMeta['free_type'], $goodsMeta['id'], $goodsMeta['goods_id']);
|
||||
if ($count < $goodsMeta['free_num']) {
|
||||
$isFreeBuy = true;
|
||||
}
|
||||
}
|
||||
@ -168,20 +96,20 @@ class ShopController extends BaseAuthedController
|
||||
}
|
||||
}
|
||||
|
||||
if ($goodsNum > $row['max_amount']) {
|
||||
$this->_rspErr(1, "goods_num parameter error, max_amount: {$row['max_amount']}");
|
||||
if ($goodsNum > $goodsMeta['max_amount']) {
|
||||
$this->_rspErr(1, "goods_num parameter error, max_amount: {$goodsMeta['max_amount']}");
|
||||
return;
|
||||
}
|
||||
|
||||
// 这里命名混乱了, 购买个数,一捆个数命名冲突
|
||||
$goods_count = $row['goods_num'];
|
||||
$goods_count = $goodsMeta['goods_num'];
|
||||
|
||||
$buyRecordHash = ShopBuyRecord::allToHash();
|
||||
$boughtTimes = 1;
|
||||
|
||||
$itemMeta = mt\Item::get($row['goods_id']);
|
||||
$itemMeta = mt\Item::get($goodsMeta['goods_id']);
|
||||
if (!$itemMeta) {
|
||||
$this->_rspErr(1, 'goods not found, goods_id: ' . $row['goods_id']);
|
||||
$this->_rspErr(1, 'goods not found, goods_id: ' . $goodsMeta['goods_id']);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -194,11 +122,11 @@ class ShopController extends BaseAuthedController
|
||||
}
|
||||
} else {
|
||||
|
||||
switch ($row['limit_type']) {
|
||||
switch ($goodsMeta['limit_type']) {
|
||||
case ShopController::DAILY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $id);
|
||||
$boughtTimes = $buyRecord ? $buyRecord['this_day_buy_times'] + 1 : 1;
|
||||
if ($buyRecord && getXVal($buyRecord, 'this_day_buy_times', 0) >= $row['limit_num']) {
|
||||
if ($buyRecord && getXVal($buyRecord, 'this_day_buy_times', 0) >= $goodsMeta['limit_num']) {
|
||||
$this->_rspErr(2, 'Daily purchase limit');
|
||||
return;
|
||||
}
|
||||
@ -207,17 +135,17 @@ class ShopController extends BaseAuthedController
|
||||
case ShopController::WEEKLY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $id);
|
||||
$boughtTimes = $buyRecord ? $buyRecord['this_week_buy_times'] + 1 : 1;
|
||||
if ($buyRecord && getXVal($buyRecord, 'this_week_buy_times', 0) >= $row['limit_num']) {
|
||||
if ($buyRecord && getXVal($buyRecord, 'this_week_buy_times', 0) >= $goodsMeta['limit_num']) {
|
||||
$this->_rspErr(2, 'Weekly purchase limit reached');
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case ShopController::TOTAL_BUY_LIMIT: {
|
||||
// error_log("total buy limit " . $address . " " . $id . " " . $row['limit_num']);
|
||||
// error_log("total buy limit " . $address . " " . $id . " " . $goodsMeta['limit_num']);
|
||||
$buyRecord = getXVal($buyRecordHash, $id);
|
||||
$boughtTimes = $buyRecord ? $buyRecord['total_buy_times'] + 1 : 1;
|
||||
if ($buyRecord && getXVal($buyRecord, 'total_buy_times', 0) >= $row['limit_num']) {
|
||||
if ($buyRecord && getXVal($buyRecord, 'total_buy_times', 0) >= $goodsMeta['limit_num']) {
|
||||
$this->_rspErr(2, 'Purchase limit reached');
|
||||
return;
|
||||
}
|
||||
@ -229,14 +157,14 @@ class ShopController extends BaseAuthedController
|
||||
}
|
||||
}
|
||||
|
||||
$price_array = splitStr1($row['price']);
|
||||
$discount_array = splitStr1($row['discount']);
|
||||
$price_array = splitStr1($goodsMeta['price']);
|
||||
$discount_array = splitStr1($goodsMeta['discount']);
|
||||
|
||||
$need_price = $price_array[$token_pos];
|
||||
$discount = $discount_array[$token_pos];
|
||||
|
||||
$discount_begin = strtotime($row['discount_begin']);
|
||||
$discount_end = strtotime($row['discount_end']);
|
||||
$discount_begin = strtotime($goodsMeta['discount_begin']);
|
||||
$discount_end = strtotime($goodsMeta['discount_end']);
|
||||
$nowTime = $this->_getNowTime();
|
||||
|
||||
if ($nowTime >= $discount_begin && $nowTime < $discount_end) {
|
||||
@ -255,28 +183,28 @@ class ShopController extends BaseAuthedController
|
||||
return;
|
||||
}
|
||||
|
||||
$itemMeta = mt\Item::get($row['goods_id']);
|
||||
$itemMeta = mt\Item::get($goodsMeta['goods_id']);
|
||||
$propertyChgService = new services\PropertyChgService();
|
||||
for ($i = 0; $i < $goodsNum; $i++) {
|
||||
$this->internalAddItem($propertyChgService, $itemMeta, $goods_count, 0);
|
||||
}
|
||||
$awardService = new services\AwardService();
|
||||
$awardService->addItem($row['goods_id'], $goodsNum);
|
||||
$awardService->addItem($goodsMeta['goods_id'], $goodsNum);
|
||||
ShopBuyRecord::add($id, $goodsNum);
|
||||
$this->_decItems($costItems);
|
||||
$goodsDto = array(
|
||||
'goods_id' => $id,
|
||||
'item_id' => $row['goods_id'],
|
||||
'item_id' => $goodsMeta['goods_id'],
|
||||
'price_info' => array(
|
||||
'item_id' => $row['goods_id'],
|
||||
'item_id' => $goodsMeta['goods_id'],
|
||||
'cost_list' => array(),
|
||||
'discount_begin_time' => phpcommon\datetimeToTimestamp($row['discount_begin']),
|
||||
'discount_end_time' => phpcommon\datetimeToTimestamp($row['discount_end'])
|
||||
'discount_begin_time' => phpcommon\datetimeToTimestamp($goodsMeta['discount_begin']),
|
||||
'discount_end_time' => phpcommon\datetimeToTimestamp($goodsMeta['discount_end'])
|
||||
),
|
||||
'flag_icon' => $row['tag'],
|
||||
'limit_type' => $row['limit_type'],
|
||||
'flag_icon' => $goodsMeta['tag'],
|
||||
'limit_type' => $goodsMeta['limit_type'],
|
||||
'bought_times' => $boughtTimes,
|
||||
'total_buy_times' => $row['limit_num'],
|
||||
'total_buy_times' => $goodsMeta['limit_num'],
|
||||
); {
|
||||
$priceInfo = mt\Item::getPriceInfo($itemMeta);
|
||||
if (!empty($priceInfo)) {
|
||||
@ -303,16 +231,16 @@ class ShopController extends BaseAuthedController
|
||||
return;
|
||||
}
|
||||
|
||||
$itemMeta = mt\Item::get($row['goods_id']);
|
||||
$itemMeta = mt\Item::get($goodsMeta['goods_id']);
|
||||
$propertyChgService = new services\PropertyChgService();
|
||||
for ($i = 0; $i < $goodsNum; $i++) {
|
||||
$this->internalAddItem($propertyChgService, $itemMeta, $goods_count, 0);
|
||||
}
|
||||
$awardService = new services\AwardService();
|
||||
$awardService->addItem($row['goods_id'], $goodsNum);
|
||||
$awardService->addItem($goodsMeta['goods_id'], $goodsNum);
|
||||
ShopBuyRecord::add($id, $goodsNum);
|
||||
if ($isFreeBuy) {
|
||||
$this->addFreeBuyRecord($row);
|
||||
$this->addFreeBuyRecord($goodsMeta);
|
||||
}
|
||||
$this->_decItems($costItems);
|
||||
$event = [
|
||||
@ -323,17 +251,17 @@ class ShopController extends BaseAuthedController
|
||||
|
||||
$goodsDto = array(
|
||||
'goods_id' => $id,
|
||||
'item_id' => $row['goods_id'],
|
||||
'item_id' => $goodsMeta['goods_id'],
|
||||
'price_info' => array(
|
||||
'item_id' => $row['goods_id'],
|
||||
'item_id' => $goodsMeta['goods_id'],
|
||||
'cost_list' => array(),
|
||||
'discount_begin_time' => phpcommon\datetimeToTimestamp($row['discount_begin']),
|
||||
'discount_end_time' => phpcommon\datetimeToTimestamp($row['discount_end'])
|
||||
'discount_begin_time' => phpcommon\datetimeToTimestamp($goodsMeta['discount_begin']),
|
||||
'discount_end_time' => phpcommon\datetimeToTimestamp($goodsMeta['discount_end'])
|
||||
),
|
||||
'flag_icon' => $row['tag'],
|
||||
'limit_type' => $row['limit_type'],
|
||||
'flag_icon' => $goodsMeta['tag'],
|
||||
'limit_type' => $goodsMeta['limit_type'],
|
||||
'bought_times' => $boughtTimes,
|
||||
'total_buy_times' => $row['limit_num'],
|
||||
'total_buy_times' => $goodsMeta['limit_num'],
|
||||
); {
|
||||
$priceInfo = mt\Item::getPriceInfo($itemMeta);
|
||||
if (!empty($priceInfo)) {
|
||||
@ -353,13 +281,13 @@ class ShopController extends BaseAuthedController
|
||||
case ShopController::TOKEN_TYPE_CEC:
|
||||
if ($isFreeBuy) {
|
||||
$propertyChgService = new services\PropertyChgService();
|
||||
$this->addFreeBuyRecord($row);
|
||||
$itemMeta = mt\Item::get($row['goods_id']);
|
||||
$this->addFreeBuyRecord($goodsMeta);
|
||||
$itemMeta = mt\Item::get($goodsMeta['goods_id']);
|
||||
$this->internalAddItem($propertyChgService, $itemMeta, $goods_count, 1);
|
||||
$this->_rspOk();
|
||||
} else {
|
||||
$price = $this->normalizeWeb3Price($goodsNum * $need_price);
|
||||
$item_id = $row['goods_id'];
|
||||
$item_id = $goodsMeta['goods_id'];
|
||||
$item_count = $goodsNum;
|
||||
|
||||
$response = services\BlockChainService::gameItemMallBuy(
|
||||
@ -376,7 +304,7 @@ class ShopController extends BaseAuthedController
|
||||
'price' => $goodsNum * $need_price,
|
||||
'ext_data' => json_encode(array(
|
||||
'mode' => SHOP_BUY_MODE_NORMAL,
|
||||
'shop_id' => $row['shop_id'],
|
||||
'shop_id' => $goodsMeta['shop_id'],
|
||||
'id' => $id,
|
||||
)),
|
||||
));
|
||||
@ -696,46 +624,6 @@ class ShopController extends BaseAuthedController
|
||||
}
|
||||
}
|
||||
|
||||
private function canBuy($itemMeta, &$errCode, &$errMsg)
|
||||
{
|
||||
$errCode = 0;
|
||||
$errMsg = '';
|
||||
switch ($itemMeta['type']) {
|
||||
case mt\Item::HERO_TYPE: {
|
||||
$heroDb = Hero::find($itemMeta['id']);
|
||||
if ($heroDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the hero';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case mt\Item::HERO_SKIN_TYPE: {
|
||||
$heroSkinDb = HeroSkin::find($itemMeta['id']);
|
||||
if ($heroSkinDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the skin';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case mt\Item::GUN_SKIN_TYPE: {
|
||||
$gunSkinDb = GunSkin::find($itemMeta['id']);
|
||||
if ($gunSkinDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the skin';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private function beginFirstTupop($address = null)
|
||||
{
|
||||
if (!$address) {
|
||||
@ -829,10 +717,4 @@ class ShopController extends BaseAuthedController
|
||||
}
|
||||
}
|
||||
|
||||
private function goodsMetaToInfo($goodsMeta) {
|
||||
return array(
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
138
webapp/services/ShopService.php
Normal file
138
webapp/services/ShopService.php
Normal file
@ -0,0 +1,138 @@
|
||||
<?php
|
||||
|
||||
namespace services;
|
||||
|
||||
require_once('mt/ShopGoods.php');
|
||||
require_once('mt/Item.php');
|
||||
|
||||
require_once('models/ShopBuyRecord.php');
|
||||
require_once('models/Hero.php');
|
||||
require_once('models/HeroSkin.php');
|
||||
require_once('models/GunSkin.php');
|
||||
|
||||
use phpcommon;
|
||||
use models\ShopBuyRecord;
|
||||
use models\Hero;
|
||||
use models\HeroSkin;
|
||||
use models\GunSkin;
|
||||
|
||||
class ShopService {
|
||||
|
||||
public static function getGoodsList($shopId) {
|
||||
if ($shopId == 0) {
|
||||
$goodsMetaList = mt\ShopGoods::all();
|
||||
} else {
|
||||
$goodsMetaList = mt\ShopGoods::getGoodsList($shopId);
|
||||
}
|
||||
|
||||
$goodsMetaList = $goodsMetaList ? $goodsMetaList : array();
|
||||
$buyRecordHash = ShopBuyRecord::allToHash();
|
||||
|
||||
$goodsList = array();
|
||||
foreach ($goodsMetaList as $goodsMeta) {
|
||||
$goodsDto = array(
|
||||
'goods_meta' => self::goodsMetaToInfo($goodsMeta),
|
||||
'bought_times' => 0,
|
||||
'free_num' => 0,
|
||||
);
|
||||
array_push($goodsList, $goodsDto);
|
||||
switch ($goodsMeta['limit_type']) {
|
||||
case mt\Item::DAILY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['this_day_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
case mt\Item::WEEKLY_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['this_week_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
case mt\Item::TOTAL_BUY_LIMIT: {
|
||||
$buyRecord = getXVal($buyRecordHash, $goodsMeta['id']);
|
||||
$goodsDto['bought_times'] = $buyRecord ? $buyRecord['total_buy_times'] : 0;
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$goodsId = $goodsMeta['goods_id'];
|
||||
$itemMeta = mt\Item::get($goodsId);
|
||||
if ($itemMeta) {
|
||||
// 如果是皮肤,判断是否已经拥有,如果已经拥有,不能购买
|
||||
if ($itemMeta['type'] == mt\Item::HERO_SKIN_TYPE) {
|
||||
$errCode = 0;
|
||||
$errMsg = '';
|
||||
if (!self::canBuy($itemMeta, $errCode, $errMsg)) {
|
||||
$goods['bought_times'] = 1;
|
||||
} else {
|
||||
$goods['bought_times'] = 0;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// error !!!!!!
|
||||
error_log('item not found:' . $goodsId);
|
||||
}
|
||||
|
||||
if (!empty($goods['free_type'])) {
|
||||
$count = self::getFreeBuyTimes($goodsMeta['free_type'],
|
||||
$goodsMeta['id'],
|
||||
$goodsMeta['goods_id']);
|
||||
$goodsDto['free_num'] = $goodsDto['free_num'] - $count;
|
||||
}
|
||||
}
|
||||
return $goodsList;
|
||||
}
|
||||
|
||||
public static function getFreeBuyTimes() {
|
||||
|
||||
}
|
||||
|
||||
private static function goodsMetaToInfo($goodsMeta) {
|
||||
return array(
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
private static function canBuy($itemMeta, &$errCode, &$errMsg)
|
||||
{
|
||||
$errCode = 0;
|
||||
$errMsg = '';
|
||||
switch ($itemMeta['type']) {
|
||||
case mt\Item::HERO_TYPE: {
|
||||
$heroDb = Hero::find($itemMeta['id']);
|
||||
if ($heroDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the hero';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case mt\Item::HERO_SKIN_TYPE: {
|
||||
$heroSkinDb = HeroSkin::find($itemMeta['id']);
|
||||
if ($heroSkinDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the skin';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case mt\Item::GUN_SKIN_TYPE: {
|
||||
$gunSkinDb = GunSkin::find($itemMeta['id']);
|
||||
if ($gunSkinDb) {
|
||||
$errCode = 10;
|
||||
$errMsg = 'You already have the skin';
|
||||
return false;
|
||||
}
|
||||
}
|
||||
break;
|
||||
default: {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user