hy-farm/muchang/home/controllers/FriendController.php
2026-05-29 19:54:56 +08:00

579 lines
22 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/5/31
* Time: 11:03
*/
namespace app\controllers;
use common\models\Friend;
use common\models\User;
use common\models\Chatlog;
use common\services\ClientMessageServices;
use common\services\MessageServices;
use common\services\ResultStatusServices;
use common\services\UserLogService;
use common\utils\EnumUtil;
use Yii;
use yii\rest\Controller;
/**
* 好友
* Class FriendController
* @package app\controllers
*/
class FriendController extends Controller
{
/**
* 根据用户ID查询要加的好友
*/
public function actionFind()
{
$userID = Yii::$app->request->get('user_id');
$findUserID = Yii::$app->request->get('find_phone');//要查找的用户ID
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!$findUserID || $userID == $findUserID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
$userDbData = User::findOne(['username' => $findUserID]);
if (!$userDbData)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB);
//返回数据
$returnData['user_id'] = $userDbData->id;
$returnData['nickname'] = $userDbData->nickname;
$returnData['level'] = $userDbData->level;
$returnData['gold'] = $userDbData->gold;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
/**
* 添加好友
*/
public function actionAdd()
{
$userID = Yii::$app->request->get('user_id');
$friendUserID = Yii::$app->request->get('friend_user_id');//要添加的用户ID
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!$friendUserID || $userID == $friendUserID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//查找用户
$userDbData = User::findById($friendUserID);
if (!$userDbData)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_NOT_FIND_IN_DB);
//查找是否已经添加过这个用户
if (Friend::findOne(['user_id' => $userID, 'friend_user_id' => $friendUserID, 'status' => EnumUtil::FRIEND_AGREE]) ||
Friend::findOne(['user_id' => $friendUserID, 'friend_user_id' => $userID, 'status' => EnumUtil::FRIEND_AGREE])
)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_ADDED_FRIEND);
//已经申请过
if (Friend::findOne(['user_id' => $userID, 'friend_user_id' => $friendUserID, 'status' => EnumUtil::FRIEND_UNTREATED]) ||
Friend::findOne(['user_id' => $friendUserID, 'friend_user_id' => $userID, 'status' => EnumUtil::FRIEND_UNTREATED])
)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_ADDED_FRIEND_APPLY);
//添加数据
$friendDbData = new Friend();
$friendDbData->user_id = $userID;
$friendDbData->friend_user_id = $friendUserID;
if (!$friendDbData->save()) return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR);
//推送消息
MessageServices::addFriendMessage($friendUserID, $friendDbData->id);
UserLogService::addUserSystemLog($friendUserID, EnumUtil::USER_SYSTEM_LOG_FRIEND, sprintf('%s请求加好友', User::findById($userID)->nickname));
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS);
}
/**
* 获取需要进行好友回复的列表
*/
public function actionGetRespondList()
{
$userID = Yii::$app->request->get('user_id');
$offset = Yii::$app->request->get('offset'); //偏移
$count = Yii::$app->request->get('count'); //需要多少条数据
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if ($offset === null || $offset < 0 || $count === null || $count < 0 || $count > 10)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//获取列表
$find = Friend::find()->where(['friend_user_id' => $userID, 'status' => EnumUtil::FRIEND_UNTREATED])->orderBy(['updated_at' => SORT_DESC]);
$totalCount = $find->count();
$listDbData = $find->offset($offset)->limit($count)->all();
$listData = [];
foreach ($listDbData as $itemDbData) {
array_push($listData, Friend::genClientFriendData($userID, $itemDbData->user_id));
}
$returnData['offset'] = $offset;
$returnData['total_count'] = $totalCount;
$returnData['list'] = $listData;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
/**
* 同意或拒绝添加好友
*/
public function actionRespond()
{
$userID = Yii::$app->request->get('user_id');
$respondUserID = Yii::$app->request->get('respond_user_id');//要操作的用户ID
$type = Yii::$app->request->get('type');//回复类型1同意2拒绝
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!$respondUserID || $userID == $respondUserID || !in_array($type, EnumUtil::FRIEND_LIST))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//判断是否回复过
$friendDbData = Friend::findOne(['user_id' => $respondUserID, 'friend_user_id' => $userID]);
if ($friendDbData->status != EnumUtil::FRIEND_UNTREATED)
return ClientMessageServices::sendMessage(ResultStatusServices::RS_FRIEND_RESPONDED);
//修改类型
$friendDbData->status = $type;
if (!$friendDbData->save())
return ClientMessageServices::sendMessage(ResultStatusServices::RS_SAVE_DB_ERROR);
//推送消息
MessageServices::addFriendResponseMessage($respondUserID, $friendDbData->id, $type);
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS);
}
/**
* 批量回复好友添加
*/
public function actionRespondList()
{
$userID = Yii::$app->request->get('user_id');
$type = Yii::$app->request->get('type');//回复类型1同意2拒绝
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if (!$type || ($type != 1 && $type != 2))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//获取需要修改的列表
Friend::updateAll(['status' => $type, 'updated_at' => time()],
'friend_user_id =:friend_user_id and status =:status',
[':friend_user_id' => $userID, ':status' => EnumUtil::FRIEND_UNTREATED]);
// Friend::updateAll(['status' => $type, 'updated_at' => time()],
// 'friend_user_id =:friend_user_id',
// [':friend_user_id' => $userID]);
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS);
}
/**
* 获取好友列表
*/
public function actionFriendList()
{
$userID = Yii::$app->request->get('user_id');
$offset = Yii::$app->request->get('offset'); //偏移
$count = Yii::$app->request->get('count'); //需要多少条数据
$type = Yii::$app->request->get('type');//排行类型,0:金币排行1:等级排行,2:战力排行
if (!$userID) return ClientMessageServices::sendMessage(ResultStatusServices::RS_USER_NOT_LOGIN);//验证登录
if ($offset === null || $offset < 0 || $count === null || $count < 0 || $count > 10 || ($type != 0 && $type != 1 && $type != 2))
return ClientMessageServices::sendMessage(ResultStatusServices::RS_PARAM_ERROR);
//获取列表
$find = Friend::find()->where('status=:status and (user_id=:user_id or friend_user_id=:friend_user_id)')
->addParams([':status' => EnumUtil::FRIEND_AGREE, ':user_id' => $userID, ':friend_user_id' => $userID])
->orderBy(['updated_at' => SORT_DESC]);
$orderByKey = 'level';
if ($type == 0) $orderByKey = 'gold';
if ($type == 1) $orderByKey = 'level';
if ($type == 2) $orderByKey = 'fighting_capacity';
$mysql = 'SELECT
*
FROM
(SELECT
@index:=@index + 1 AS `index`, o.*
FROM
(SELECT @index:=0) i, (SELECT
f.*,
u1.gold gold,
u1.nickname nickname,
u1.level level,
u1.fighting_capacity fighting_capacity,
u2.gold be_gold,
u2.nickname be_nickname,
u2.level be_level,
u2.fighting_capacity be_fighting_capacity
FROM
friend f
LEFT JOIN user u1 ON u1.id = f.user_id
LEFT JOIN user u2 ON u2.id = f.friend_user_id
WHERE
(f.user_id = :user_id OR f.friend_user_id = :user_id) and f.status=1 ) o
ORDER BY :order_field DESC
LIMIT :offset , :len) AS r
';
$listDbData = Yii::$app->db->createCommand($mysql)
->bindValue(':user_id', $userID)
->bindValue(':offset', $offset)
->bindValue(':len', $count)
->bindValue(':order_field', $orderByKey)
->queryAll();
$listData = [];
for ($i = 0; $i < count($listDbData); $i++) {
$itemDbData = $listDbData[$i];
if ($itemDbData['friend_user_id'] != $userID)
$data = Friend::genClientFriendData($userID, $itemDbData['friend_user_id']);
else
$data = Friend::genClientFriendData($userID, $itemDbData['user_id']);
$data['index'] = $itemDbData['index'];
array_push($listData, $data);
}
$totalCount = $find = Friend::find()->where('status=:status and (user_id=:user_id or friend_user_id=:friend_user_id)')
->addParams([':status' => EnumUtil::FRIEND_AGREE, ':user_id' => $userID, ':friend_user_id' => $userID])
->count();
$returnData['offset'] = $offset;
$returnData['total_count'] = $totalCount;
$returnData['list'] = $listData;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
/**
* 获取好友列表
*/
public function actionAjaxfriends()
{
$Code = $_POST['token'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'用户不存在');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'用户不存在');
return $json;
}
$userID = $userData['id'];
$html='';
$listData = $find = Friend::find()->where('status=:status and (user_id=:user_id or friend_user_id=:friend_user_id)')
->addParams([':status' => EnumUtil::FRIEND_AGREE, ':user_id' => $userID, ':friend_user_id' => $userID])
->all();
$listarr=array();
foreach($listData as $k => $v){
if($v['user_id']==$userID){
$listarr[$k]['friendid']=$v['friend_user_id'];
}else{
$listarr[$k]['friendid']=$v['user_id'];
}
$friendData = User::findOne(['id' => $listarr[$k]['friendid']]);
$listarr[$k]['friendname']=$friendData['nickname'];
if(empty($friendData['avatar'])){
$friendData['avatar']=1;
}
if(strlen($friendData['avatar'])>5){
$friendData['avatar']= 'http://'.$_SERVER['HTTP_HOST'].$friendData['avatar'];
}else{
$friendData['avatar']= '/farm/resource/assets/icon/head/head'.$friendData['avatar'].'.png';
}
$html .='<a href="/web/chat/chat.html?toid='.$listarr[$k]['friendid'].'&token='.$Code.'"><div class="row flexbox flex-alignc wc__material-cell" >
<img class="uimg" src="'.$friendData['avatar'].'" /><span class="name flex1">'.$listarr[$k]['friendname'].'</span>
</div></a>';
}
if($html==''){
$json = array('code' =>'1004', 'msg' =>'您当前没有好友,请先进入游戏好友界面添加好友');
return $json;
}
$returnData['html'] = $html;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
/**
* 获取好友列表
*/
public function actionChatlog()
{
$Code = $_POST['token'];
$toid = $_POST['toid'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$friendData = User::findOne(['id' => $toid]);
if ($friendData == null) {
$json = array('code' =>'1004', 'msg' =>'该好友不存在');
return $json;
}
$userID = $userData['id'];
$html='';
if(strlen($userData['avatar'])>5){
$userData['avatar']= 'http://'.$_SERVER['HTTP_HOST'].$userData['avatar'];
}else{
$userData['avatar']= '/farm/resource/assets/icon/head/head'.$userData['avatar'].'.png';
}
$returnData['html'] = $html;
$returnData['friendinfo'] = $friendData;
$returnData['userinfo'] = $userData;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
public function actionChatajax()
{
$Code = $_POST['token'];
$toid = $_POST['toid'];
$type = $_POST['type'];
$chatmax = $_POST['chatmax'];
$headimg = $_POST['headimg'];
$data = $_POST['data'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$friendData = User::findOne(['id' => $toid]);
if ($friendData == null) {
$json = array('code' =>'1004', 'msg' =>'目标用户不存在');
return $json;
}
$userID = $userData['id'];
$friendID = $friendData['id'];
Chatlog::updateAll(['zuixin'=>'0'],'(userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.')');
$Chatlog = Chatlog::find()->where('(userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.')')->orderBy(["id" => SORT_DESC])->one();
if(!$Chatlog || $Chatlog['created_at']<time()-3600*2){
$chat = new Chatlog();
$chat->userid = $userID;
$chat->username = $userData['username'];
$chat->touserid = $friendData['id'];
$chat->tousername = $friendData['username'];
$chat->content = '';
$chat->type = 0;
$chat->headimg = $headimg;
$chat->status=0;
if (!$chat->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
}
$chat = new Chatlog();
$chat->userid = $userID;
$chat->username = $userData['username'];
$chat->touserid = $friendData['id'];
$chat->tousername = $friendData['username'];
$chat->content = $data;
$chat->type = $type;
$chat->headimg = $headimg;
$chat->status=0;
if (!$chat->save()) {
$json = array('code' =>'1004', 'msg' =>'操作失败');
return $json;
}
$Chatlog = Chatlog::find()->where('(userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.')')->orderBy(["id" => SORT_DESC])->one();
$returnData['chatmax'] = $Chatlog['id'];
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
public function actionChatgetnews()
{
$Code = $_POST['token'];
$toid = $_POST['toid'];
$chatmax = $_POST['chatmax'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$friendData = User::findOne(['id' => $toid]);
if ($friendData == null) {
$json = array('code' =>'1004', 'msg' =>'目标用户不存在');
return $json;
}
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$userID = $userData['id'];
$friendID = $friendData['id'];
$html='';
if($chatmax==0){
$Chatlog = Chatlog::find()->where('type=0 and ((userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.'))')->orderBy(["id" => SORT_DESC])->one();
if($Chatlog){
if($Chatlog['created_at']<$beginToday){
$Chatloglist = Chatlog::find()->where('id>='.$Chatlog['id'].' and ((userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.'))')->orderBy(["id" => SORT_ASC])->all();
}else{
$Chatloglist = Chatlog::find()->where('created_at>='.$beginToday.' and ((userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.'))')->orderBy(["id" => SORT_ASC])->all();
}
}
}else{
$Chatloglist = Chatlog::find()->where('id>'.$chatmax.' and ((userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.'))')->orderBy(["id" => SORT_ASC])->all();
}
foreach($Chatloglist as $k => $v){
if($v['type']==0){
$no=date("H",$v['created_at']);
if ($no>0&&$no<=6){
$shichen="凌晨";
}
if ($no>6&&$no<12){
$shichen="上午";
}
if ($no>=12&&$no<=18){
$shichen="下午";
}
if ($no>18&&$no<=24){
$shichen="晚上";
}
if(strlen($v['avatar'])>5){
$v['avatar']= 'http://'.$_SERVER['HTTP_HOST'].$v['avatar'];
}else{
$v['avatar']= '/farm/resource/assets/icon/head/head'.$v['avatar'].'.png';
}
$html .='<li class="time"><span>'.date('Y年m月d日 ',$v['created_at']).$shichen.date('H:i',$v['created_at']).'</span></li>';
}else{
if($v['userid']==$userID){
$html .='<li class="me">';
}else{
$html .='<li class="others"><a class="avatar" href="#"><img src="'.$v['avatar'].'" /></a>';
}
$html .='<div class="content"><p class="author">'.$v['username'].'</p>';
if($v['type']==2){
$html .='<div class="msg picture">'.$v['content'].'</div></div>';
}else{
$html .='<div class="msg">'.$v['content'].'</div></div>';
}
if($v['userid']==$userID){
$html .='<a class="avatar" href="#"><img src="'.$v['avatar'].'" /></a>';
}
$html .='</li>';
}
}
$Chatlog = Chatlog::find()->where('(userid='.$userID.' and touserid='.$friendID.') or (touserid='.$userID.' and userid='.$friendID.')')->orderBy(["id" => SORT_DESC])->one();
$returnData['chatmax'] = $Chatlog['id'];
$returnData['html'] = $html;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
public function actionChatlist()
{
$Code = $_POST['token'];
$chatmax = $_POST['chatmax'];
//验证
if (!$Code) {
$json = array('code' =>'1004', 'error_msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$userData = User::findOne(['code' => $Code]);
if ($userData == null) {
$json = array('code' =>'1004', 'msg' =>'当前登录已掉线,请重新登录');
return $json;
}
$userID=$userData['id'];
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$zuotian=$beginToday-86400;
$Chatloglist = Chatlog::find()->where('(userid='.$userID.' or touserid='.$userID.') and zuixin=1')->orderBy(["id" => SORT_DESC])->all();
$html='';
foreach($Chatloglist as $k => $v){
if($v['userid']==$userID){
$listarr[$k]['friendid']=$v['touserid'];
}else{
$listarr[$k]['friendid']=$v['userid'];
}
if($v['type']==2){
$v['content']='图片';
}
if($v['created_at']<$zuotian){
$shichen=date('Y年m月d日 ',$v['created_at']);
}elseif($v['created_at']<$beginToday && $v['created_at']>$zuotian){
$shichen='昨天 ';
}else{
$shichen='';
}
$friendData = User::findOne(['id' => $listarr[$k]['friendid']]);
if(strlen($friendData['avatar'])>5){
$friendData['avatar']= 'http://'.$_SERVER['HTTP_HOST'].$friendData['avatar'];
}else{
$friendData['avatar']= '/farm/resource/assets/icon/head/head'.$friendData['avatar'].'.png';
}
$html .='<li class="flexbox wc__material-cell" routeUrl="chat.html?toid='.$listarr[$k]['friendid'].'&token='.$Code.'">
<div class="img"><img src="'.$friendData['avatar'].'" /></div>
<div class="info flex1">
<h2 class="title">'.$friendData['nickname'].'</h2>
<p class="desc clamp1">'.$v['content'].'</p>
</div>
<label class="time">'.$shichen.date('H:i',$v['created_at']).'</label>
</li>';
}
$returnData['html'] = $html;
return ClientMessageServices::sendMessage(ResultStatusServices::RS_OPERATION_SUCCESS, $returnData);
}
}