From f40947c688cd62e431e295e506e3813616e54925 Mon Sep 17 00:00:00 2001 From: printempw Date: Sat, 28 Jul 2018 16:37:44 +0800 Subject: [PATCH] Add a option for requiring player name when register --- app/Http/Controllers/AdminController.php | 1 + app/Http/Controllers/AuthController.php | 45 ++++++++++++---- config/options.php | 1 + .../assets/src/js/__tests__/auth.test.js | 27 ++++++++++ resources/assets/src/js/auth/register.js | 8 ++- resources/lang/en/auth.yml | 2 + resources/lang/en/locale.js | 1 + resources/lang/en/options.yml | 3 ++ resources/lang/zh_CN/auth.yml | 2 + resources/lang/zh_CN/locale.js | 1 + resources/lang/zh_CN/options.yml | 3 ++ resources/views/auth/register.tpl | 7 +++ tests/AuthControllerTest.php | 52 +++++++++++++++++++ 13 files changed, 141 insertions(+), 12 deletions(-) diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index ab5af931..536e3b39 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -171,6 +171,7 @@ class AdminController extends Controller }); $form->checkbox('user_can_register')->label(); + $form->checkbox('register_with_player_name')->label(); $form->checkbox('require_verification')->label(); $form->text('regs_per_ip'); diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 928e65c4..f61a35bc 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -12,6 +12,7 @@ use Option; use Session; use App\Events; use App\Models\User; +use App\Models\Player; use Illuminate\Http\Request; use App\Exceptions\PrettyPageException; use App\Services\Repositories\UserRepository; @@ -112,14 +113,24 @@ class AuthController extends Controller if (! $this->checkCaptcha($request)) return json(trans('auth.validation.captcha'), 1); - $this->validate($request, [ - 'email' => 'required|email', - 'password' => 'required|min:8|max:32', - 'nickname' => 'required|no_special_chars|max:255' - ]); - - if (! option('user_can_register')) { + if (! option('user_can_register')) return json(trans('auth.register.close'), 7); + + // Validate nickname or player name + $rule = option('register_with_player_name') ? + ['player_name' => 'required|player_name|min:'.option('player_name_length_min').'|max:'.option('player_name_length_max')] : + ['nickname' => 'required|no_special_chars|max:255']; + $this->validate($request, array_merge([ + 'email' => 'required|email', + 'password' => 'required|min:8|max:32' + ], $rule)); + + if (option('register_with_player_name')) { + event(new Events\CheckPlayerExists($request->get('player_name'))); + + if (Player::where('player_name', $request->get('player_name'))->first()) { + return json(trans('user.player.add.repeated'), 2); + } } // If amount of registered accounts of IP is more than allowed amounts, @@ -130,15 +141,17 @@ class AuthController extends Controller // If the email is already registered, // it will return a false value. $user = User::register( - $request->input('email'), - $request->input('password'), function($user) use ($request) + $request->get('email'), + $request->get('password'), function($user) use ($request) { $user->ip = Utils::getClientIp(); $user->score = option('user_initial_score'); $user->register_at = Utils::getTimeFormatted(); $user->last_sign_at = Utils::getTimeFormatted(time() - 86400); $user->permission = User::NORMAL; - $user->nickname = $request->input('nickname'); + $user->nickname = $request->get( + option('register_with_player_name') ? 'player_name' : 'nickname' + ); }); if (! $user) { @@ -147,6 +160,18 @@ class AuthController extends Controller event(new Events\UserRegistered($user)); + // Add player with chosen name + if (option('register_with_player_name')) { + $player = new Player; + $player->uid = $user->uid; + $player->player_name = $request->get('player_name'); + $player->preference = 'default'; + $player->last_modified = Utils::getTimeFormatted(); + $player->save(); + + event(new Events\PlayerWasAdded($player)); + } + return json([ 'errno' => 0, 'msg' => trans('auth.register.success'), diff --git a/config/options.php b/config/options.php index dccfc3b6..72ea224a 100644 --- a/config/options.php +++ b/config/options.php @@ -5,6 +5,7 @@ return [ 'site_name' => 'Blessing Skin', 'site_description' => 'Open-source PHP Minecraft Skin Hosting Service', 'user_can_register' => 'true', + 'register_with_player_name' => 'true', 'require_verification' => 'false', 'regs_per_ip' => '3', 'ip_get_method' => '0', diff --git a/resources/assets/src/js/__tests__/auth.test.js b/resources/assets/src/js/__tests__/auth.test.js index fdf5cc68..b528ef8c 100644 --- a/resources/assets/src/js/__tests__/auth.test.js +++ b/resources/assets/src/js/__tests__/auth.test.js @@ -145,6 +145,7 @@ describe('tests for "register" module', () => { document.body.innerHTML = ` +
@@ -194,6 +195,16 @@ describe('tests for "register" module', () => { expect($('#confirm-pwd').is(':focus')).toBe(true); $('#confirm-pwd').val('password'); + + // Register with player name + $('#nickname').attr('id', 'nickname-alter'); + $('button').click(); + expect(trans).toBeCalledWith('auth.emptyPlayerName'); + expect($('#player-name').is(':focus')).toBe(true); + + // Register with nickname + $('#nickname-alter').attr('id', 'nickname'); + $('#player-name').attr('id', 'player-name-alter'); $('button').click(); expect(trans).toBeCalledWith('auth.emptyNickname'); expect($('#nickname').is(':focus')).toBe(true); @@ -222,7 +233,23 @@ describe('tests for "register" module', () => { expect($('button').prop('disabled')).toBe(true); expect(swal).toBeCalledWith({ type: 'success', html: 'success' }); + // Register with player name + $('#nickname').attr('id', 'nickname-alter'); + $('#player-name-alter').attr('id', 'player-name'); + $('#player-name').val('Player Name'); + await $('button').click(); + expect(fetch).toBeCalledWith(expect.objectContaining({ + type: 'POST', + url: 'auth/register', + dataType: 'json', + data: { + email: 'a@b.c', + player_name: 'Player Name', + password: 'password', + captcha: 'captcha' + } + })); expect(refreshCaptcha).toBeCalled(); expect(showMsg).toBeCalledWith('warning', 'warning'); expect($('button').html()).toBe('auth.register'); diff --git a/resources/assets/src/js/auth/register.js b/resources/assets/src/js/auth/register.js index 70c028c1..d65d4c45 100644 --- a/resources/assets/src/js/auth/register.js +++ b/resources/assets/src/js/auth/register.js @@ -9,10 +9,11 @@ $('#register-button').click(e => { email: $('#email').val(), password: $('#password').val(), nickname: $('#nickname').val(), + player_name: $('#player-name').val(), captcha: $('#captcha').val(), }; - (function validate({ email, password, nickname, captcha }, callback) { + (function validate({ email, password, nickname, player_name, captcha }, callback) { // Massive form validation if (email === '') { showMsg(trans('auth.emptyEmail')); @@ -31,9 +32,12 @@ $('#register-button').click(e => { } else if (password !== $('#confirm-pwd').val()) { showMsg(trans('auth.invalidConfirmPwd'), 'warning'); $('#confirm-pwd').focus(); - } else if (nickname === '') { + } else if ($('#nickname').length > 0 && nickname === '') { showMsg(trans('auth.emptyNickname')); $('#nickname').focus(); + } else if ($('#player-name').length > 0 && player_name === '') { + showMsg(trans('auth.emptyPlayerName')); + $('#player-name').focus(); } else if (captcha === '') { showMsg(trans('auth.emptyCaptcha')); $('#captcha').focus(); diff --git a/resources/lang/en/auth.yml b/resources/lang/en/auth.yml index 43530a5d..918aeeb7 100644 --- a/resources/lang/en/auth.yml +++ b/resources/lang/en/auth.yml @@ -16,6 +16,7 @@ register: title: Register button: Register message: Welcome to :sitename! + player-name-intro: Player name in Minecraft, can be changed later nickname-intro: Whatever you like expect special characters repeat-pwd: Repeat your password close: Well, this site doesn't allow any register. @@ -74,6 +75,7 @@ logout: fail: No valid session. nickname: Nickname +player-name: Minecraft player name email: Email identification: Email or player name password: Password diff --git a/resources/lang/en/locale.js b/resources/lang/en/locale.js index 124fffb6..141a7110 100644 --- a/resources/lang/en/locale.js +++ b/resources/lang/en/locale.js @@ -27,6 +27,7 @@ emptyConfirmPwd: 'Empty confirming password.', invalidConfirmPwd: 'Confirming password is not equal with password.', emptyNickname: 'Empty nickname.', + emptyPlayerName: 'Empty player name.', register: 'Register', registering: 'Registering', diff --git a/resources/lang/en/options.yml b/resources/lang/en/options.yml index 6438d00b..bdf076b8 100644 --- a/resources/lang/en/options.yml +++ b/resources/lang/en/options.yml @@ -75,6 +75,9 @@ general: user_can_register: title: Open Registration label: Everyone is allowed to register. + register_with_player_name: + title: Register with Player Name + label: Require Minecraft's player name when user register require_verification: title: Account Verification label: Users must verify their email address first. diff --git a/resources/lang/zh_CN/auth.yml b/resources/lang/zh_CN/auth.yml index 76ee96b6..141de0d7 100644 --- a/resources/lang/zh_CN/auth.yml +++ b/resources/lang/zh_CN/auth.yml @@ -16,6 +16,7 @@ register: title: 注册 button: 注册 message: 欢迎使用 :sitename! + player-name-intro: 游戏内的角色名,注册后可修改 nickname-intro: 昵称可使用汉字,不可包含特殊字符 repeat-pwd: 重复密码 close: 残念。。本皮肤站已经关闭注册咯 QAQ @@ -74,6 +75,7 @@ logout: fail: 并没有有效的 session nickname: 昵称 +player-name: 游戏内角色名 email: Email identification: Email 或角色名 password: 密码 diff --git a/resources/lang/zh_CN/locale.js b/resources/lang/zh_CN/locale.js index b046f640..5e4fe4fe 100644 --- a/resources/lang/zh_CN/locale.js +++ b/resources/lang/zh_CN/locale.js @@ -27,6 +27,7 @@ emptyConfirmPwd: '确认密码不能为空', invalidConfirmPwd: '密码和确认的密码不一样诶?', emptyNickname: '你还没有填写昵称哦', + emptyPlayerName: '你还没有填写角色名哦', register: '注册', registering: '注册中', diff --git a/resources/lang/zh_CN/options.yml b/resources/lang/zh_CN/options.yml index ea62b69c..d5050405 100644 --- a/resources/lang/zh_CN/options.yml +++ b/resources/lang/zh_CN/options.yml @@ -75,6 +75,9 @@ general: user_can_register: title: 开放注册 label: 任何人都可以注册 + register_with_player_name: + title: 使用角色名注册 + label: 注册时要求填写游戏内角色名 require_verification: title: 邮箱验证 label: 用户必须验证邮箱后才能使用皮肤托管等功能 diff --git a/resources/views/auth/register.tpl b/resources/views/auth/register.tpl index 74c89403..176fb19a 100644 --- a/resources/views/auth/register.tpl +++ b/resources/views/auth/register.tpl @@ -26,10 +26,17 @@ + @if (option('register_with_player_name')) +
+ + +
+ @else
+ @endif
diff --git a/tests/AuthControllerTest.php b/tests/AuthControllerTest.php index 5d649d58..35798e61 100644 --- a/tests/AuthControllerTest.php +++ b/tests/AuthControllerTest.php @@ -275,6 +275,58 @@ class AuthControllerTest extends TestCase 'msg' => trans('validation.max.string', ['attribute' => 'password', 'max' => 32]) ]); + // The register_with_player_name option is set to true by default. + // Should return a warning if `player_name` is empty + $this->post( + '/auth/register', + [ + 'email' => 'a@b.c', + 'password' => '12345678', + 'captcha' => 'a' + ], + ['X-Requested-With' => 'XMLHttpRequest'] + )->seeJson([ + 'errno' => 1, + 'msg' => trans('validation.required', ['attribute' => 'Player Name']) + ]); + + // Should return a warning if `player_name` is invalid + option(['player_name_rule' => 'official']); + $this->post( + '/auth/register', + [ + 'email' => 'a@b.c', + 'password' => '12345678', + 'player_name' => '角色名', + 'captcha' => 'a' + ], + ['X-Requested-With' => 'XMLHttpRequest'] + )->seeJson([ + 'errno' => 1, + 'msg' => trans('validation.player_name', ['attribute' => 'Player Name']) + ]); + + // Should return a warning if `player_name` is too long + $this->post( + '/auth/register', + [ + 'email' => 'a@b.c', + 'password' => '12345678', + 'player_name' => str_random(option('player_name_length_max') + 10), + 'captcha' => 'a' + ], + ['X-Requested-With' => 'XMLHttpRequest'] + )->seeJson([ + 'errno' => 1, + 'msg' => trans('validation.max.string', [ + 'attribute' => 'Player Name', + 'max' => option('player_name_length_max') + ]) + ]); + + // Test registering with nickname + option(['register_with_player_name' => false]); + // Should return a warning if `nickname` is empty $this->post( '/auth/register',