Add a option for requiring player name when register

This commit is contained in:
printempw 2018-07-28 16:37:44 +08:00
parent 7b8086b25b
commit f40947c688
13 changed files with 141 additions and 12 deletions

View File

@ -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');

View File

@ -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'),

View File

@ -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',

View File

@ -145,6 +145,7 @@ describe('tests for "register" module', () => {
document.body.innerHTML = `
<input id="email" />
<input id="nickname" />
<input id="player-name" />
<input id="password" />
<input id="confirm-pwd" />
<div id="captcha-form"></div>
@ -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');

View File

@ -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();

View File

@ -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

View File

@ -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',

View File

@ -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.

View File

@ -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: 密码

View File

@ -27,6 +27,7 @@
emptyConfirmPwd: '确认密码不能为空',
invalidConfirmPwd: '密码和确认的密码不一样诶?',
emptyNickname: '你还没有填写昵称哦',
emptyPlayerName: '你还没有填写角色名哦',
register: '注册',
registering: '注册中',

View File

@ -75,6 +75,9 @@ general:
user_can_register:
title: 开放注册
label: 任何人都可以注册
register_with_player_name:
title: 使用角色名注册
label: 注册时要求填写游戏内角色名
require_verification:
title: 邮箱验证
label: 用户必须验证邮箱后才能使用皮肤托管等功能

View File

@ -26,10 +26,17 @@
<span class="glyphicon glyphicon-log-in form-control-feedback"></span>
</div>
@if (option('register_with_player_name'))
<div class="form-group has-feedback" title="{{ trans('auth.register.player-name-intro') }}" data-placement="top" data-toggle="tooltip">
<input id="player-name" type="text" class="form-control" placeholder="{{ trans('auth.player-name') }}">
<span class="glyphicon glyphicon-pencil form-control-feedback"></span>
</div>
@else
<div class="form-group has-feedback" title="{{ trans('auth.register.nickname-intro') }}" data-placement="top" data-toggle="tooltip">
<input id="nickname" type="text" class="form-control" placeholder="{{ trans('auth.nickname') }}">
<span class="glyphicon glyphicon-pencil form-control-feedback"></span>
</div>
@endif
<div class="row">
<div class="col-xs-8">

View File

@ -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',