userID = $userDbData->id; $userInfo->username = $userDbData->username; $userInfo->token = $userDbData->token; $userInfo->save(); } /** * 登出 * @param $userID * @internal param $phone */ public static function loginOut($userID) { $userInfo = UserInfo::loadByUserID($userID); if (empty($userInfo)) return; $userInfo->delete(); } /** * 用户是否在线 * @param $userID * @return bool */ public static function isOnline($userID) { $userInfo = UserInfo::loadByUserID($userID); if (empty($userInfo)) return false; if (empty($userInfo->fd)) return false; return true; } /** * 判断并修改更改金钱 * isAdd 是否为添加操作 * @param $userID * @param $isAdd * @param $gold * @param $gem * @param SystemLog $log * @return bool|int */ public static function checkAndModifyMoney($userID, $isAdd, $gold, $gem, SystemLog $log) { //正负验证 if ($isAdd && ($gold < 0 || $gem < 0)) return ResultStatusServices::RS_PARAM_ERROR; if (!$isAdd && ($gold > 0 || $gem > 0)) return ResultStatusServices::RS_PARAM_ERROR; //加锁 $lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockUser($userID), RedisLock::FLAG_CATCH_EXCEPTIONS); if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION; try { //获取用户信息 $userDbData = User::findById($userID, false); if (!$userDbData) return ResultStatusServices::RS_NOT_FIND_USER; //修改金钱 $userDbData->gold += $gold; $userDbData->score += $gem; if ($userDbData->gold < 0) return ResultStatusServices::RS_GOLD_NOT_ENOUGH; if ($userDbData->score < 0) return ResultStatusServices::RS_GEM_NOT_ENOUGH; //保存 if (!$userDbData->save(true, ['gold', 'score', 'updated_at'])) return ResultStatusServices::RS_SAVE_DB_ERROR; if (!$log->save()) return ResultStatusServices::RS_SAVE_DB_ERROR; if ($gem != 0) { //任务记录 DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_EXPEND_GEM, null, 1); } } finally { //解锁 $lock->release(); } return ResultStatusServices::RS_OPERATION_SUCCESS; } /** * @param User $userDbData * @return bool */ public static function initNewUserDataAndSave(User $userDbData, $introduceUserID) { return SafeUtil::dbOperate(function (User $userDbData, $introduceUserID) { $userDbData->gold = GameConfigServices::getParamByPath('init.1.gold', 0);//金币 $userDbData->gem = GameConfigServices::getParamByPath('init.1.gem', 0);//钻石 // //使用默认小狗 // $dogItemID = GameConfigServices::getParamByPath('init.1.dog_item_id', 0);//默认小狗 // $dogItemConfig = GameConfigServices::getParamByPath('item_list.' . $dogItemID); // if (!empty($dogItemConfig)) $userDbData->use_dog_item_id = $dogItemID; //推荐码 $userDbData->introduce_code = substr(md5(uniqid('', false)), 8, 16); //保存user if (!$userDbData->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR); $userDbData->introduce_code = $userDbData->id; if (!$userDbData->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR); if (!empty($introduceUserID)) RebateUtil::createUserRebates($userDbData->id, $introduceUserID); //新建农场 $farm = new Farm(); FarmService::initNewFarmDataAndSave($farm, $userDbData->id); // //向仓库添加默认小狗 // if (!empty($dogItemConfig)) { // $item = new Item(); // $item->user_id = $userDbData->id; // $item->item_id = $dogItemID; // $item->name = $dogItemConfig['name']; // $item->type = $dogItemConfig['type2']; // if (!$item->save()) return 0; // } //初始送物品 $configItemList = GameConfigServices::getParamByPath('init.1.item_list'); if ($configItemList != null) { foreach ($configItemList as $configItem) { $itemID = $configItem['item_id']; $num = (int)$configItem['num']; if ($num == 0) continue; $log = SystemLogUtil::get($userDbData->id, SystemLogUtil::TYPE_ITEM, $itemID, $num, SystemLogUtil::FROM_TYPE_INIT_USER, []); MoneyUtil::checkAndModifyNum($userDbData->id, $itemID, true, $num, $log); } } return $userDbData->id; }, [$userDbData, $introduceUserID]); } /** * 狗狗饥饿剩余时间 * @param User $userDbData * @return int */ public static function getDogHungerRemainingTime(User $userDbData) { $remainingTime = $userDbData->dog_hunger_end_time - time(); return $remainingTime > 0 ? $remainingTime : 0; } public static function getUserNickName($userID) { $userDbData = User::findById($userID); if (empty($userDbData)) return ""; return $userDbData->nickname; } public static function getOnlineInfo($userID) { $info = null; $infoStr = Yii::$app->redis->get(RedisKeyUtil::onlineInfo($userID)); if (!empty($infoStr)) { $info = json_decode($infoStr, true); } if (empty($info)) { $info['start_time'] = 0; $info['last_time'] = 0; $info['total_time'] = 0; $info['get_count'] = 0; } if (CommUtil::dayStr($info['start_time']) != CommUtil::dayStr(time())) { $info['start_time'] = time(); $info['last_time'] = time(); $info['total_time'] = 0; $info['get_count'] = 0; } return $info; } public static function updateOnlineInfo($userID) { $time = time(); $info = self::getOnlineInfo($userID); $disTime = $time - intval($info['last_time']); if ($disTime > 120) { $info['last_time'] = $time; } else { $info['last_time'] = $time; $info['total_time'] += $disTime; } self::saveOnlineInfo($userID, $info); return $info; } public static function saveOnlineInfo($userID, $info) { $str = json_encode($info); Yii::$app->redis->set(RedisKeyUtil::onlineInfo($userID), $str); } }