From baf49214795ffc758508d9beebbb7e5bfb6b804f Mon Sep 17 00:00:00 2001 From: Pig Fang Date: Sun, 25 Jul 2021 13:14:08 +0800 Subject: [PATCH] new player name rule: allow UTF-8 --- app/Http/Controllers/OptionsController.php | 1 + app/Rules/PlayerName.php | 3 +++ resources/lang/en/options.yml | 1 + resources/lang/en/user.yml | 1 + .../ControllersTest/PlayerControllerTest.php | 14 +++++++++++--- 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/OptionsController.php b/app/Http/Controllers/OptionsController.php index 500ebf26..566bc75e 100644 --- a/app/Http/Controllers/OptionsController.php +++ b/app/Http/Controllers/OptionsController.php @@ -164,6 +164,7 @@ class OptionsController extends Controller $form->select('player_name_rule') ->option('official', trans('options.general.player_name_rule.official')) ->option('cjk', trans('options.general.player_name_rule.cjk')) + ->option('utf8', trans('options.general.player_name_rule.utf8')) ->option('custom', trans('options.general.player_name_rule.custom')); $form->text('custom_player_name_regexp')->hint()->placeholder(); diff --git a/app/Rules/PlayerName.php b/app/Rules/PlayerName.php index 4c235b6f..613e0685 100644 --- a/app/Rules/PlayerName.php +++ b/app/Rules/PlayerName.php @@ -21,6 +21,9 @@ class PlayerName implements Rule $regexp = '/^[A-Za-z0-9_§\x{4e00}-\x{9fff}]+$/u'; break; + case 'utf8': + return mb_check_encoding($value, 'UTF-8'); + case 'custom': $regexp = option('custom_player_name_regexp') ?: $regexp; break; diff --git a/resources/lang/en/options.yml b/resources/lang/en/options.yml index 37643975..73041336 100644 --- a/resources/lang/en/options.yml +++ b/resources/lang/en/options.yml @@ -115,6 +115,7 @@ general: title: Player Name Rule official: Letters, numbers and underscores (Mojang's official rule) cjk: Allow CJK Unified Ideographs + utf8: Allow all valid UTF-8 characters custom: Use custom rules (regular expression) custom_player_name_regexp: title: Custom Player Name Rules diff --git a/resources/lang/en/user.yml b/resources/lang/en/user.yml index 8f29ac08..9d89ebb9 100644 --- a/resources/lang/en/user.yml +++ b/resources/lang/en/user.yml @@ -49,6 +49,7 @@ player: player-name-rule: official: Player name may only contains letters, numbers and underscores. cjk: Player name may contains letters, numbers, underscores and CJK Unified Ideographs. + utf8: Player name must be a UTF-8 string. custom: Custom player name rules are applied on this site. Please contact admins for further information. player-name-length: The player name should be at least :min characters and not greater than :max characters. diff --git a/tests/HttpTest/ControllersTest/PlayerControllerTest.php b/tests/HttpTest/ControllersTest/PlayerControllerTest.php index e617da2f..b4ef5056 100644 --- a/tests/HttpTest/ControllersTest/PlayerControllerTest.php +++ b/tests/HttpTest/ControllersTest/PlayerControllerTest.php @@ -53,9 +53,6 @@ class PlayerControllerTest extends TestCase public function testAdd() { - Event::fake(); - $filter = Fakes\Filter::fake(); - // Without player name $this->postJson(route('user.player.add'))->assertJsonValidationErrors('name'); @@ -74,12 +71,23 @@ class PlayerControllerTest extends TestCase ['name' => 'yjsnpi'] )->assertJsonValidationErrors('name'); + + // allow UTF-8 + option(['player_name_rule' => 'utf8']); + $this->postJson(route('user.player.add'), ['name' => '響け!ユーフォニアム']) + ->assertJson(['code' => 0]); + $this->postJson(route('user.player.add'), ['name' => 'मूलपाठ']) + ->assertJson(['code' => 0]); + // with an existed player name option(['player_name_rule' => 'official']); $existed = Player::factory()->create(); $this->postJson(route('user.player.add'), ['name' => $existed->name]) ->assertJsonValidationErrors('name'); + Event::fake(); + $filter = Fakes\Filter::fake(); + // Lack of score $user = User::factory()->create(['score' => 0]); $this->actingAs($user)->postJson(