You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

286 lines
8.6 KiB
PHTML

5 years ago
<?php
/**
* Created by PhpStorm.
* User: xmy 280564871@qq.com
* Date: 2017/4/25
* Time: 13:47
*/
namespace Open\Model;
use Admin\Controller\PlistController;
class GameSourceModel extends BaseModel{
protected $_auto = [
['apply_status', '0', self::MODEL_INSERT],
];
protected $_validate = [
['pack_name','require','包名不能为空',self::MODEL_BOTH,'regex'],
['version','require','游戏版本不能为空',self::MODEL_BOTH,'regex'],
['pay_notify_url','require','游戏通知地址不能为空',self::MODEL_BOTH,'regex'],
];
/**
* 描述文件验证
* @param $data
* @return bool
* author: xmy 280564871@qq.com
*/
public function description_verify($data){
if(I('version') == 2 && empty($data)){
return false;
}
return true;
}
public function upDate($user_id,$game_id){
$data = I('post.');
if(empty($data['file_url'])){
$this->error = "原包不能为空";
return false;
}
$Game = new GameModel();
$game = $Game->getUserData($user_id,$game_id);
if($data['file_type'] == 1){//安卓包处理
$result = $this->androidPacket($data['file_name'],$data['file_url']);
$data = array_merge($data,$result);
}else{//ios处理
if(empty($data['description_file_url'])){
$this->error = "描述文件不能为空";
return false;
}
$result = $this->iosPacket($data['file_name'],$data['file_url']);
$data = array_merge($data,$result);
//生成plist文件
$data['plist_url'] = $this->generatePlist($data['file_name'],$data['file_url'],$game,$data['pack_name']);
$data['description_url'] = $this->descriptionPacket($data['file_name'],$data['description_file_url'],$data['description_file_name']);
}
$data = $this->create($data);
if(!$data){
return false;
}
if($data['file_type'] == 1){
$this->sourcePack($data['file_url'],$game);
}
$data['game_name'] = $game['game_name'];
$data['file_id'] = 0;
$data['develop_id'] = $user_id;
$data['game_id'] = $game_id;
$data['bao_name'] = $data['version'];
$data['create_time'] = time();
$remark = str_replace(array("\r\n", "\r", "\n"), "@@@", $data['remark']);
$data['remark'] = json_encode(explode('@@@',$remark));
$source = $this->where(['develop_id'=>$user_id,'game_id'=>$game_id])->find();
//设置游戏支付回调地址
M("game_set","tab_")->where(['game_id'=>$game_id])->setField("pay_notify_url",I('post.pay_notify_url'));
if (empty($source)){
$data['source_version'] = 1;
$res = $this->add($data);
$this->soure_pack($data['game_id'],$data['file_url'],$data['file_type'],1);
$this->update_game_size($data);
}else{
$data = array_merge($source,$data);
$data['source_version'] = $source['source_version']+1;
$this->soure_pack($data['game_id'],$data['file_url'],$data['file_type'],$data['source_version']);
$res = $this->save($data);
if($res){
$appmodel = M('Apply','tab_');
$app_map['status'] = 1;
$app_map['game_id'] = $game_source['game_id'];
$app_data = $appmodel->where($app_map)->select();
if($app_data){
M()->startTrans();
$app_res = $appmodel->where($app_map)->setField('enable_status',2);
if($app_res === false){
M()->rollback();
}else{
M()->commit();
}
}
}
$this->update_game_size($data);
}
return $res;
}
/**
* 安卓包处理
* @param $file_name
* @param $file_url
* @return mixed
* author: xmy 280564871@qq.com
*/
public function androidPacket($file_name,$file_url){
$data['file_name'] = $file_name;
$data['file_url'] = $file_url.'/'.$file_name;
return $data;
}
/**
* ios包处理
* @param $file_name
* @param $file_url
* @return mixed
* author: xmy 280564871@qq.com
*/
public function iosPacket($file_name,$file_url){
$data['file_name'] = $file_name;
$data['file_url'] = $file_url.'/'.$file_name;
$new_path = "./Uploads/Ios/original/" . $data['file_name'];
//IOS原包 移到新目录
copy($data['file_url'],$new_path);
@unlink($data['file_url']);
$data['file_url'] = $new_path;
return $data;
}
/**
* 生成IOS plist文件
* @param $file_url
* @param $file_name
* @param $game
* author: xmy 280564871@qq.com
*/
public function generatePlist($file_name,$file_path,$game,$pack_name){
$game_appid = $game['game_appid'];
$Plist = new PlistController();
$Plist->createPlist($game,0,$pack_name,$file_path);
$plist_path = "./Uploads/SourcePlist/{$game['id']}.Plist";
return $plist_path;
}
/* public function generatePlist($file_url,$file_name,$game){
$game_appid = $game['game_appid'];
$file_path = $file_url.'/'.$file_name;
$Plist = new PlistController();
$Plist->createPlist($game,0,$game_appid,$file_path);
$plist_path = "./Uploads/SourcePlist/{$game['id']}.Plist";
return $plist_path;
} */
/**
* 描述文件处理
* @param $new_name
* @param $file_url
* @param $file_name
* @return string
* author: xmy 280564871@qq.com
*/
public function descriptionPacket($new_name,$file_url,$file_name){
$old_file = $file_url."/".$file_name;
$file_name = str_replace(".ipa",".mobileprovision",$new_name);
$file_path = $file_url."/".$file_name;
rename($old_file,$file_path);
return $file_path;
}
/**
* 安卓原包打包
* @param $file_url 文件地址
* @param $game
* author: xmy 280564871@qq.com
*/
public function sourcePack($file_url,$game){
$zip = new \ZipArchive;
$zip->open($file_url, \ZipArchive::CREATE);
$data = array(
"game_id" => $game['id'],
"game_name" => $game['game_name'],
"game_appid" => $game['game_appid'],
"promote_id" => 0,
"promote_account"=> "自然注册",
);
$zip->addFromString('META-INF/mch.properties', json_encode($data));
$zip->close();
}
public function getUserData($user_id,$game_id){
$map['s.develop_id'] = $user_id;
$map['s.game_id'] = $game_id;
$data = $this->alias("s")
->field("s.*,t.pay_notify_url")
->join("left join tab_game_set t on t.game_id = s.game_id")
->join()
->where($map)
->find();
$data['description_file_name'] = str_replace(".ipa",".mobileprovision",$data['file_name']);
$data['description_file_url'] = str_replace('/'.$data['description_file_name'],"",$data['description_url']);
return $data;
}
protected function update_game_size($param=null){
$model = D('Game');
$map['id'] = $param['game_id'];
$data['game_size'] = round(filesize($param['file_url'])/pow(1024,2),2)."MB";;
// $data['version'] = $param['version'];
if($param['file_type']==1){
$data['and_dow_address'] = $param['file_url'];
$ggame=$model->where(array('id'=>$map['id']))->find();
if($ggame['sdk_version']!=-1){
if($ggame['sdk_version']==2){
$data['sdk_version']=0;
}
}else{
$data['sdk_version']=1;
}
}
else{
if($ggame['sdk_version']!=-1){
if($ggame['sdk_version']==1){
$data['sdk_version']=0;
}
}else{
$data['sdk_version']=2;
}
$data['ios_dow_address'] = $param['file_url'];
}
$model->where($map)->save($data);
}
/**
*原包打包
*/
protected function soure_pack($game_id=0,$file_url="",$file_type=1,$source_version=1){
$game_info = M("game","tab_")->find($game_id);
$data = array(
"game_id" => $game_info['id'],
"game_name" => $game_info['game_name'],
"game_appid" => $game_info['game_appid'],
"promote_id" => 0,
"promote_account"=> "自然注册",
'source_version' =>$source_version,
);
if($file_type==1){
$zip = new \ZipArchive;
$res = $zip->open($file_url, \ZipArchive::CREATE);
$zip->addFromString('META-INF/mch.properties', json_encode($data));
$zip->close();
}elseif($file_type==2){
$zip_open_game_source = zip_open($file_url);
if ($zip_open_game_source) {
while ($zip_entry = zip_read($zip_open_game_source)) {
if(preg_match("/.app/", zip_entry_name($zip_entry))){
$ios_app=substr(zip_entry_name($zip_entry),8) ."<br/>";
}
$new_ios_1=explode("/", $ios_app);
}
}
$url_ver="Payload/".$new_ios_1[0]."/_CodeSignature/TXChannel";
$zip = new \ZipArchive;
$res = $zip->open($file_url, \ZipArchive::CREATE);
$zip->addFromString($url_ver, json_encode($data));
$zip->close();
}
}
}