This commit is contained in:
Pig Fang 2019-03-23 00:20:28 +08:00
parent aec3fe4a87
commit b4ef665848
15 changed files with 76 additions and 312 deletions

View File

@ -404,7 +404,8 @@ class AdminController extends Controller
return json(trans('admin.users.operations.email.existed', ['email' => $request->input('email')]), 1);
}
$user->setEmail($request->input('email'));
$user->email = $request->input('email');
$user->save();
return json(trans('admin.users.operations.email.success'), 0);
} elseif ($action == 'verification') {
@ -417,7 +418,8 @@ class AdminController extends Controller
'nickname' => 'required|no_special_chars',
]);
$user->setNickName($request->input('nickname'));
$user->nickname = $request->input('nickname');
$user->save();
return json(trans('admin.users.operations.nickname.success', [
'new' => $request->input('nickname'),
@ -486,7 +488,9 @@ class AdminController extends Controller
return json(trans('admin.players.textures.non-existent', ['tid' => $request->tid]), 1);
}
$player->setTexture(['tid_'.$request->type => $request->tid]);
$field = 'tid_'.$request->type;
$player->$field = $request->tid;
$player->save();
return json(trans('admin.players.textures.success', ['player' => $player->name]), 0);
} elseif ($action == 'owner') {
@ -500,9 +504,10 @@ class AdminController extends Controller
return json(trans('admin.users.operations.non-existent'), 1);
}
$player->setOwner($request->input('uid'));
$player->uid = $request->input('uid');
$player->save();
return json(trans('admin.players.owner.success', ['player' => $player->name, 'user' => $user->getNickName()]), 0);
return json(trans('admin.players.owner.success', ['player' => $player->name, 'user' => $user->nickname]), 0);
} elseif ($action == 'delete') {
$player->delete();
@ -512,7 +517,8 @@ class AdminController extends Controller
'name' => 'required|player_name|min:'.option('player_name_length_min').'|max:'.option('player_name_length_max'),
])['name'];
$player->rename($name);
$player->name = $name;
$player->save();
if (option('single_player', false)) {
$owner = $player->user;

View File

@ -66,7 +66,7 @@ class ClosetController extends Controller
$user = Auth::user();
if ($user->getScore() < option('score_per_closet_item')) {
if ($user->score < option('score_per_closet_item')) {
return json(trans('user.closet.add.lack-score'), 7);
}

View File

@ -32,7 +32,13 @@ class PlayerController extends Controller
$this->middleware(function ($request, $next) {
if ($request->has('pid')) {
if ($this->player = Player::find($request->pid)) {
$this->player->checkForInvalidTextures();
foreach (['skin', 'cape'] as $type) {
$field = "tid_$type";
if (! Texture::find($this->player->$field)) {
$this->player->$field = 0;
}
}
$this->player->save();
}
}
@ -79,7 +85,7 @@ class PlayerController extends Controller
return json(trans('user.player.add.repeated'), 6);
}
if ($user->getScore() < Option::get('score_per_player')) {
if ($user->score < Option::get('score_per_player')) {
return json(trans('user.player.add.lack-score'), 7);
}
@ -138,8 +144,8 @@ class PlayerController extends Controller
}
$oldName = $this->player->name;
$this->player->rename($newName);
$this->player->name = $newName;
$this->player->save();
if (option('single_player', false)) {
$user = auth()->user();
@ -150,12 +156,6 @@ class PlayerController extends Controller
return json(trans('user.player.rename.success', ['old' => $oldName, 'new' => $newName]), 0);
}
/**
* A wrapper of Player::setTexture().
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function setTexture(Request $request)
{
foreach ($request->input('tid') as $key => $value) {
@ -165,9 +165,10 @@ class PlayerController extends Controller
return json(trans('skinlib.un-existent'), 6);
}
$fieldName = $texture->type == 'cape' ? 'tid_cape' : 'tid_skin';
$field = $texture->type == 'cape' ? 'tid_cape' : 'tid_skin';
$this->player->setTexture([$fieldName => $value]);
$this->player->$field = $value;
$this->player->save();
}
return json(trans('user.player.set.success', ['name' => $this->player->name]), 0);
@ -175,12 +176,13 @@ class PlayerController extends Controller
public function clearTexture(Request $request)
{
$types = array_filter(['skin', 'cape'], function ($type) use ($request) {
return $request->input($type);
});
$this->player->clearTexture($types);
array_map(function ($type) use ($request) {
if ($request->input($type)) {
$field = "tid_$type";
$this->player->$field = 0;
}
}, ['skin', 'cape']);
$this->player->save();
return json(trans('user.player.clear.success', ['name' => $this->player->name]), 0);
}

View File

@ -191,7 +191,7 @@ class SkinlibController extends Controller
$cost += option('score_per_closet_item');
$cost -= option('score_award_per_texture', 0);
if ($user->getScore() < $cost) {
if ($user->score < $cost) {
return json(trans('skinlib.upload.lack-score'), 7);
}
@ -292,7 +292,7 @@ class SkinlibController extends Controller
if ($t->public && option('take_back_scores_after_deletion', true)) {
$score_diff -= option('score_award_per_texture', 0);
}
if ($users->get($t->uploader)->getScore() + $score_diff < 0) {
if ($users->get($t->uploader)->score + $score_diff < 0) {
return json(trans('skinlib.upload.lack-score'), 1);
}

View File

@ -132,7 +132,7 @@ class TextureController extends Controller
$user = $users->get(base64_decode($base64_email), 'email');
if ($user) {
return $this->avatarByTid($user->getAvatarId(), $size);
return $this->avatarByTid($user->avatar, $size);
}
return response()->file(storage_path('static_textures/avatar.png'));

View File

@ -76,7 +76,7 @@ class UserController extends Controller
$result['percentage'] = 0;
if ($rate != 0) {
$result['total'] = $used + floor($user->getScore() / $rate);
$result['total'] = $used + floor($user->score / $rate);
$result['percentage'] = $result['total'] ? $used / $result['total'] * 100 : 100;
}
@ -98,7 +98,7 @@ class UserController extends Controller
return json([
'errno' => 0,
'msg' => trans('user.sign-success', ['score' => $acquiredScore]),
'score' => $user->getScore(),
'score' => $user->score,
'storage' => $this->calculatePercentageUsed($user->getStorageUsed(), option('score_per_storage')),
'remaining_time' => $gap > 1 ? round($gap) : $gap,
]);
@ -184,14 +184,11 @@ class UserController extends Controller
]);
$nickname = $request->input('new_nickname');
$user->nickname = $nickname;
$user->save();
event(new UserProfileUpdated($action, $user));
if ($user->setNickName($nickname)) {
event(new UserProfileUpdated($action, $user));
return json(trans('user.profile.nickname.success', ['nickname' => $nickname]), 0);
}
break; // @codeCoverageIgnore
return json(trans('user.profile.nickname.success', ['nickname' => $nickname]), 0);
case 'password':
$this->validate($request, [
@ -227,19 +224,15 @@ class UserController extends Controller
return json(trans('user.profile.email.wrong-password'), 1);
}
if ($user->setEmail($request->input('new_email'))) {
// Set account status to unverified
$user->verified = false;
$user->save();
$user->email = $request->input('new_email');
$user->verified = false;
$user->save();
event(new UserProfileUpdated($action, $user));
event(new UserProfileUpdated($action, $user));
Auth::logout();
Auth::logout();
return json(trans('user.profile.email.success'), 0);
}
break; // @codeCoverageIgnore
return json(trans('user.profile.email.success'), 0);
case 'delete':
$this->validate($request, [
@ -301,9 +294,9 @@ class UserController extends Controller
return json(trans('user.profile.avatar.wrong-type'), 1);
}
if ($user->setAvatar($tid)) {
return json(trans('user.profile.avatar.success'), 0);
}
$user->avatar = $tid;
$user->save();
return json(trans('user.profile.avatar.success'), 0);
} else {
return json(trans('skinlib.non-existent'), 1);
}

View File

@ -44,7 +44,8 @@ class CheckAuthenticated
if (isset($request->email)) {
if (filter_var($request->email, FILTER_VALIDATE_EMAIL)) {
if (User::where('email', $request->email)->get()->isEmpty()) {
$user->setEmail($request->email);
$user->email = $request->input('email');
$user->save();
return $next($request);
} else {

View File

@ -12,25 +12,14 @@ class Player extends Model
public const CREATED_AT = null;
public const UPDATED_AT = 'last_modified';
/**
* Json APIs.
*/
const CSL_API = 0;
const USM_API = 1;
protected static $types = ['skin', 'cape'];
/**
* Properties for Eloquent Model.
*/
public $primaryKey = 'pid';
protected $fillable = ['uid', 'name', 'last_modified'];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'pid' => 'integer',
'uid' => 'integer',
@ -38,21 +27,15 @@ class Player extends Model
'tid_cape' => 'integer',
];
/**
* Check if the player is banned.
*
* @return bool
*/
protected $dispatchesEvents = [
'updated' => PlayerProfileUpdated::class,
];
public function isBanned()
{
return $this->user->getPermission() == User::BANNED;
return $this->user->permission == User::BANNED;
}
/**
* Return the owner of the player.
*
* @return \App\Models\User
*/
public function user()
{
return $this->belongsTo('App\Models\User', 'uid');
@ -73,111 +56,6 @@ class Player extends Model
return false;
}
/**
* Set textures for the player.
*
* @param array $tids
* @return $this
*/
public function setTexture(array $tids)
{
foreach (self::$types as $type) {
$property = "tid_$type";
if (isset($tids[$property])) {
$this->$property = $tids[$property];
}
}
$this->save();
event(new PlayerProfileUpdated($this));
return $this;
}
/**
* Check and delete invalid textures from player profile.
*
* @return $this
*/
public function checkForInvalidTextures()
{
foreach (self::$types as $type) {
$property = "tid_$type";
if (! Texture::find($this->$property)) {
// reset texture
$this->$property = 0;
}
}
$this->save();
return $this;
}
/**
* Clear the textures of player.
*
* @param array|string $types
* @return $this
*/
public function clearTexture($types)
{
$types = (array) $types;
$map = [];
foreach ($types as $type) {
$map["tid_$type"] = 0;
}
$this->setTexture($map);
return $this;
}
/**
* Rename the player.
*
* @param string $newName
* @return $this
*/
public function rename($newName)
{
$this->update([
'name' => $newName,
]);
$this->name = $newName;
event(new PlayerProfileUpdated($this));
return $this;
}
/**
* Set a new owner for the player.
*
* @param int $uid
* @return $this
*/
public function setOwner($uid)
{
$this->update(['uid' => $uid]);
event(new PlayerProfileUpdated($this));
return $this;
}
/**
* Get Json profile of player.
*
* @param int $api_type Which API to use, 0 for CustomSkinAPI, 1 for UniSkinAPI
* @return string User profile in json format
*/
public function getJsonProfile($api_type)
{
// Support both CustomSkinLoader API & UniSkinAPI
@ -195,12 +73,6 @@ class Player extends Model
}
}
/**
* Generate player profile in json format.
*
* @param int $api_type
* @return string
*/
public function generateJsonProfile($api_type)
{
$json[($api_type == self::CSL_API) ? 'username' : 'player_name'] = $this->name;

View File

@ -130,77 +130,6 @@ class User extends Authenticatable
return $this->save();
}
/**
* Get user permission.
*
* @return int
*/
public function getPermission()
{
return $this->permission;
}
/**
* Set user permission.
*
* @param int $permission
* @return bool
*/
public function setPermission($permission)
{
return $this->update(['permission' => $permission]);
}
/**
* Set new email for user.
*
* @param string $new_email
* @return bool
*/
public function setEmail($new_email)
{
$this->email = $new_email;
return $this->save();
}
/**
* Return Email if nickname is not set.
*
* @return string
*/
public function getNickName()
{
if (! $this->uid) {
return trans('general.unexistent-user');
} else {
return ($this->nickname == '') ? $this->email : $this->nickname;
}
}
/**
* Set nickname for the user.
*
* @param string $newNickName
* @return bool
*/
public function setNickName($newNickName)
{
$this->nickname = $newNickName;
return $this->save();
}
/**
* Get current score of user.
*
* @return int
*/
public function getScore()
{
return $this->score;
}
/**
* Set user score.
*
@ -276,7 +205,7 @@ class User extends Authenticatable
*/
public function getSignRemainingTime()
{
$lastSignTime = Carbon::parse($this->getLastSignTime());
$lastSignTime = Carbon::parse($this->last_sign_at);
if (option('sign_after_zero')) {
return Carbon::now()->diffInSeconds(
@ -298,39 +227,6 @@ class User extends Authenticatable
return $this->getSignRemainingTime() <= 0;
}
/**
* Get the last time of signing in.
*
* @return string Formatted time string.
*/
public function getLastSignTime()
{
return $this->last_sign_at;
}
/**
* Get the texture id of user's avatar.
*
* @return int
*/
public function getAvatarId()
{
return $this->avatar;
}
/**
* Set user avatar.
*
* @param int $tid
* @return bool
*/
public function setAvatar($tid)
{
$this->avatar = $tid;
return $this->save();
}
/**
* Delete the user.
*

View File

@ -19,7 +19,7 @@ if (! function_exists('get_base_url')) {
if (! function_exists('avatar')) {
function avatar(User $user, $size)
{
$fname = base64_encode($user->email).'.png?tid='.$user->getAvatarId();
$fname = base64_encode($user->email).'.png?tid='.$user->avatar;
return url("avatar/$size/$fname");
}
@ -259,7 +259,7 @@ if (! function_exists('bs_role')) {
User::SUPER_ADMIN => 'super-admin',
];
$role = Arr::get($roles, $user->getPermission());
$role = Arr::get($roles, $user->permission);
return trans("admin.users.status.$role");
}

View File

@ -10,7 +10,7 @@
</div>
<div class="login-box-body">
<p class="login-box-msg">@lang('auth.reset.message', ['username' => $user->getNickName()])</p>
<p class="login-box-msg">@lang('auth.reset.message', ['username' => $user->nickname])</p>
<form></form>
</div>

View File

@ -480,7 +480,7 @@ class AdminControllerTest extends BrowserKitTestCase
'msg' => trans('validation.in', ['attribute' => 'permission']),
]);
$user = User::find($user->uid);
$this->assertEquals(User::NORMAL, $user->getPermission());
$this->assertEquals(User::NORMAL, $user->permission);
// Update permission successfully
$this->postJson('/admin/users', [
@ -492,7 +492,7 @@ class AdminControllerTest extends BrowserKitTestCase
'msg' => trans('admin.users.operations.permission'),
]);
$user = User::find($user->uid);
$this->assertEquals(User::BANNED, $user->getPermission());
$this->assertEquals(User::BANNED, $user->permission);
// Delete a user
$this->postJson('/admin/users', ['uid' => $user->uid, 'action' => 'delete'])

View File

@ -19,15 +19,6 @@ class UserTest extends TestCase
$this->assertFalse($user->sign());
}
public function testGetNickName()
{
$user = new User();
$this->assertEquals(
trans('general.unexistent-user'),
$user->getNickName()
);
}
public function testGetPlayerNameAttribute()
{
$user = factory(User::class)->create();

View File

@ -174,6 +174,7 @@ class PlayerControllerTest extends TestCase
public function testRename()
{
Event::fake();
$player = factory(Player::class)->create();
$user = $player->user;
@ -219,7 +220,6 @@ class PlayerControllerTest extends TestCase
]);
// Success
$this->expectsEvents(Events\PlayerProfileUpdated::class);
$this->postJson('/user/player/rename', [
'pid' => $player->pid,
'new_player_name' => 'new_name',
@ -230,6 +230,7 @@ class PlayerControllerTest extends TestCase
['old' => $player->name, 'new' => 'new_name']
),
]);
Event::assertDispatched(Events\PlayerProfileUpdated::class);
// Single player
option(['single_player' => true]);
@ -289,16 +290,15 @@ class PlayerControllerTest extends TestCase
public function testClearTexture()
{
Event::fake();
$player = factory(Player::class)->create();
$user = $player->user;
$player->setTexture([
'tid_skin' => 1,
'tid_cape' => 2,
]);
$player = Player::find($player->pid);
$player->tid_skin = 1;
$player->tid_cape = 2;
$player->save();
$player->refresh();
$this->expectsEvents(Events\PlayerProfileUpdated::class);
$this->actAs($user)
->postJson('/user/player/texture/clear', [
'pid' => $player->pid,
@ -311,6 +311,7 @@ class PlayerControllerTest extends TestCase
]);
$this->assertEquals(0, Player::find($player->pid)->tid_skin);
$this->assertEquals(0, Player::find($player->pid)->tid_cape);
Event::assertDispatched(Events\PlayerProfileUpdated::class);
}
public function testBind()

View File

@ -27,12 +27,14 @@ class TextureControllerTest extends TestCase
// Player is banned
$player = factory(Player::class)->create(['tid_skin' => $steve->tid]);
$player->user->setPermission(User::BANNED);
$player->user->permission = User::BANNED;
$player->user->save();
$this->get("/{$player->name}.json")
->assertSee(trans('general.player-banned'))
->assertStatus(403);
$player->user->setPermission(User::NORMAL);
$player->user->permission = User::NORMAL;
$player->user->save();
// Default API is CSL API
$this->getJson("/{$player->name}.json")