blessing-skin-server/app/Http/Controllers/UserController.php

215 lines
6.7 KiB
PHP
Raw Normal View History

2016-07-21 22:01:57 +08:00
<?php
2016-08-28 10:05:21 +08:00
namespace App\Http\Controllers;
2016-07-21 22:01:57 +08:00
2016-10-23 11:41:52 +08:00
use App;
use View;
use Utils;
2016-07-21 22:01:57 +08:00
use App\Models\User;
use App\Models\Texture;
use Illuminate\Http\Request;
2016-11-18 23:06:15 +08:00
use App\Events\UserProfileUpdated;
use Illuminate\Support\Facades\Auth;
use App\Exceptions\PrettyPageException;
2016-10-23 11:41:52 +08:00
use App\Services\Repositories\UserRepository;
2016-07-21 22:01:57 +08:00
class UserController extends Controller
2016-07-21 22:01:57 +08:00
{
public function index()
{
$user = Auth::user();
return view('user.index')->with([
'user' => $user,
'statistics' => [
'players' => $this->calculatePercentageUsed($user->players->count(), option('score_per_player')),
'storage' => $this->calculatePercentageUsed($user->getStorageUsed(), option('score_per_storage'))
]
]);
}
/**
* Calculate percentage of resources used by user.
*
* @param int $used
* @param int $rate
* @return array
*/
protected function calculatePercentageUsed($used, $rate)
{
$user = Auth::user();
2018-02-16 17:31:04 +08:00
// Initialize default value to avoid division by zero.
$result['used'] = $used;
$result['total'] = 'UNLIMITED';
$result['percentage'] = 0;
if ($rate != 0) {
$result['total'] = $used + floor($user->getScore() / $rate);
$result['percentage'] = $result['total'] ? $used / $result['total'] * 100 : 100;
}
return $result;
2016-07-21 22:01:57 +08:00
}
/**
2017-07-14 09:17:42 +08:00
* Handle user signing.
*
2017-11-18 13:25:08 +08:00
* @return \Illuminate\Http\JsonResponse
*/
2017-07-14 09:17:42 +08:00
public function sign()
2016-07-21 22:01:57 +08:00
{
$user = Auth::user();
if ($user->canSign()) {
$acquiredScore = $user->sign();
2016-09-10 21:39:45 +08:00
return json([
'errno' => 0,
2017-11-18 13:25:08 +08:00
'msg' => trans('user.sign-success', ['score' => $acquiredScore]),
'score' => $user->getScore(),
'storage' => $this->calculatePercentageUsed($user->getStorageUsed(), option('score_per_storage')),
'remaining_time' => $this->getUserSignRemainingTimeWithPrecision()
2016-07-21 22:01:57 +08:00
]);
} else {
$remaining_time = $this->getUserSignRemainingTimeWithPrecision();
return json(trans('user.cant-sign-until', [
2017-11-18 13:25:08 +08:00
'time' => $remaining_time >= 1
? $remaining_time : round($remaining_time * 60),
'unit' => $remaining_time >= 1
? trans('user.time-unit-hour') : trans('user.time-unit-min')
]), 1);
2016-07-21 22:01:57 +08:00
}
}
public function getUserSignRemainingTimeWithPrecision()
{
$hours = Auth::user()->getSignRemainingTime() / 3600;
return $hours > 1 ? round($hours) : $hours;
}
2016-07-21 22:01:57 +08:00
public function profile()
{
return view('user.profile')->with('user', Auth::user());
2016-07-21 22:01:57 +08:00
}
/**
* Handle changing user profile.
*
* @param Request $request
2017-11-18 13:25:08 +08:00
* @param UserRepository $users
* @return mixed
*/
public function handleProfile(Request $request, UserRepository $users)
2016-07-21 22:01:57 +08:00
{
$action = $request->input('action', '');
$user = Auth::user();
switch ($action) {
case 'nickname':
$this->validate($request, [
2018-06-18 21:50:32 +08:00
'new_nickname' => 'required|no_special_chars|max:255'
]);
$nickname = $request->input('new_nickname');
2016-07-21 22:01:57 +08:00
if ($user->setNickName($nickname)) {
event(new UserProfileUpdated($action, $user));
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.nickname.success', ['nickname' => $nickname]), 0);
2017-11-18 13:25:08 +08:00
}
2016-07-21 22:01:57 +08:00
2017-11-18 13:25:08 +08:00
break; // @codeCoverageIgnore
case 'password':
$this->validate($request, [
2018-06-18 21:50:32 +08:00
'current_password' => 'required|min:6|max:32',
'new_password' => 'required|min:8|max:32'
]);
if (! $user->verifyPassword($request->input('current_password')))
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.password.wrong-password'), 1);
if ($user->changePassword($request->input('new_password'))) {
event(new UserProfileUpdated($action, $user));
2018-02-16 19:54:07 +08:00
Auth::logout();
2018-02-16 19:54:07 +08:00
return json(trans('user.profile.password.success'), 0);
2017-11-18 13:25:08 +08:00
}
2016-07-21 22:01:57 +08:00
2017-11-18 13:25:08 +08:00
break; // @codeCoverageIgnore
2016-07-21 22:01:57 +08:00
case 'email':
$this->validate($request, [
'new_email' => 'required|email',
2018-06-18 21:50:32 +08:00
'password' => 'required|min:6|max:32'
]);
2016-07-21 22:01:57 +08:00
if ($users->get($request->input('new_email'), 'email')) {
return json(trans('user.profile.email.existed'), 1);
}
if (! $user->verifyPassword($request->input('password')))
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.email.wrong-password'), 1);
2016-07-21 22:01:57 +08:00
if ($user->setEmail($request->input('new_email'))) {
event(new UserProfileUpdated($action, $user));
2018-02-16 19:54:07 +08:00
Auth::logout();
return json(trans('user.profile.email.success'), 0);
2017-11-18 13:25:08 +08:00
}
2016-07-21 22:01:57 +08:00
2017-11-18 13:25:08 +08:00
break; // @codeCoverageIgnore
2016-07-21 22:01:57 +08:00
case 'delete':
$this->validate($request, [
2018-06-18 21:50:32 +08:00
'password' => 'required|min:6|max:32'
]);
2016-07-21 22:01:57 +08:00
if (! $user->verifyPassword($request->input('password')))
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.delete.wrong-password'), 1);
Auth::logout();
if ($user->delete()) {
2016-11-17 17:32:12 +08:00
session()->flush();
2017-11-18 13:25:08 +08:00
return response()
->json([
'errno' => 0,
'msg' => trans('user.profile.delete.success')
]);
}
2017-11-18 13:25:08 +08:00
break; // @codeCoverageIgnore
default:
2016-09-24 22:49:20 +08:00
return json(trans('general.illegal-parameters'), 1);
break;
2016-07-21 22:01:57 +08:00
}
2017-11-18 13:25:08 +08:00
} // @codeCoverageIgnore
2016-07-21 22:01:57 +08:00
/**
* Set user avatar.
*
* @param Request $request
*/
public function setAvatar(Request $request)
2016-07-21 22:01:57 +08:00
{
$this->validate($request, [
'tid' => 'required|integer'
]);
$result = Texture::find($request->input('tid'));
2016-07-21 22:01:57 +08:00
if ($result) {
if ($result->type == "cape")
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.avatar.wrong-type'), 1);
2016-07-21 22:01:57 +08:00
if (Auth::user()->setAvatar($request->input('tid'))) {
2016-09-24 22:49:20 +08:00
return json(trans('user.profile.avatar.success'), 0);
2016-07-21 22:01:57 +08:00
}
} else {
2017-08-07 13:48:20 +08:00
return json(trans('skinlib.non-existent'), 1);
2016-07-21 22:01:57 +08:00
}
2017-11-18 13:25:08 +08:00
} // @codeCoverageIgnore
2016-07-21 22:01:57 +08:00
}