diff --git a/app/Http/Controllers/PlayerController.php b/app/Http/Controllers/PlayerController.php index ee1789bc..a89be8a2 100644 --- a/app/Http/Controllers/PlayerController.php +++ b/app/Http/Controllers/PlayerController.php @@ -70,7 +70,7 @@ class PlayerController extends Controller return json('', 0, $players); } - public function add(Request $request) + public function add(Request $request, Dispatcher $dispatcher) { $user = Auth::user(); @@ -87,6 +87,7 @@ class PlayerController extends Controller ], ])['name']; + $dispatcher->dispatch('player.add.attempt', [$name, $user]); event(new CheckPlayerExists($name)); if (!Player::where('name', $name)->get()->isEmpty()) { @@ -97,43 +98,48 @@ class PlayerController extends Controller return json(trans('user.player.add.lack-score'), 7); } + $dispatcher->dispatch('player.adding', [$name, $user]); event(new PlayerWillBeAdded($name)); $player = new Player(); - $player->uid = $user->uid; $player->name = $name; $player->tid_skin = 0; $player->tid_cape = 0; $player->save(); - event(new PlayerWasAdded($player)); - $user->score -= option('score_per_player'); $user->save(); + $dispatcher->dispatch('player.added', [$player, $user]); + event(new PlayerWasAdded($player)); + return json(trans('user.player.add.success', ['name' => $name]), 0, $player->toArray()); } - public function delete($pid) + public function delete(Dispatcher $dispatcher, $pid) { + $user = auth()->user(); $player = Player::find($pid); $playerName = $player->name; + $dispatcher->dispatch('player.delete.attempt', [$player, $user]); + if (option('single_player', false)) { return json(trans('user.player.delete.single'), 1); } + $dispatcher->dispatch('player.deleting', [$player, $user]); event(new PlayerWillBeDeleted($player)); $player->delete(); if (option('return_score')) { - $user = auth()->user(); $user->score += option('score_per_player'); $user->save(); } + $dispatcher->dispatch('player.deleted', [$player, $user]); event(new PlayerWasDeleted($playerName)); return json(trans('user.player.delete.success', ['name' => $playerName]), 0); @@ -181,43 +187,51 @@ class PlayerController extends Controller return json(trans('user.player.rename.success', ['old' => $oldName, 'new' => $newName]), 0, $player->toArray()); } - public function setTexture(Request $request, $pid) + public function setTexture(Request $request, Dispatcher $dispatcher, $pid) { $player = Player::find($pid); foreach (['skin', 'cape'] as $type) { - if ($tid = $request->input($type)) { + $tid = $request->input($type); + if ($tid) { $texture = Texture::find($tid); if (!$texture) { return json(trans('skinlib.non-existent'), 1); } + $dispatcher->dispatch('player.texture.updating', [$player, $texture]); + $field = "tid_$type"; $player->$field = $tid; $player->save(); + + $dispatcher->dispatch('player.texture.updated', [$player, $texture]); } } return json(trans('user.player.set.success', ['name' => $player->name]), 0, $player->toArray()); } - public function clearTexture(Request $request, $pid) + public function clearTexture(Request $request, Dispatcher $dispatcher, $pid) { $player = Player::find($pid); - array_map(function ($type) use ($request, $player) { - if ( - $request->has($type) || - ($request->has('type') && in_array($type, $request->input('type'))) - ) { + $types = $request->input('type', []); + + foreach (['skin', 'cape'] as $type) { + if ($request->has($type) || in_array($type, $types)) { + $dispatcher->dispatch('player.texture.resetting', [$player, $type]); + $field = "tid_$type"; $player->$field = 0; + $player->save(); + + $dispatcher->dispatch('player.texture.reset', [$player, $type]); } - }, ['skin', 'cape']); - $player->save(); + } return json(trans('user.player.clear.success', ['name' => $player->name]), 0, $player->toArray()); } - public function bind(Request $request) + public function bind(Request $request, Dispatcher $dispatcher) { $name = $this->validate($request, [ 'player' => [ @@ -232,6 +246,7 @@ class PlayerController extends Controller event(new CheckPlayerExists($name)); $player = Player::where('name', $name)->first(); if (!$player) { + $dispatcher->dispatch('player.adding', [$name, $user]); event(new PlayerWillBeAdded($name)); $player = new Player(); @@ -240,6 +255,7 @@ class PlayerController extends Controller $player->tid_skin = 0; $player->save(); + $dispatcher->dispatch('player.added', [$player, $user]); event(new PlayerWasAdded($player)); } elseif ($player->uid != $user->uid) { return json(trans('user.player.rename.repeated'), 1); diff --git a/tests/HttpTest/ControllersTest/PlayerControllerTest.php b/tests/HttpTest/ControllersTest/PlayerControllerTest.php index a5fcd6f2..9e1585a2 100644 --- a/tests/HttpTest/ControllersTest/PlayerControllerTest.php +++ b/tests/HttpTest/ControllersTest/PlayerControllerTest.php @@ -75,9 +75,18 @@ class PlayerControllerTest extends TestCase 'code' => 7, 'message' => trans('user.player.add.lack-score'), ]); + Event::assertDispatched('player.add.attempt', function ($event, $payload) use ($user) { + $this->assertEquals('no_score', $payload[0]); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); Event::assertDispatched(Events\CheckPlayerExists::class); + Event::assertNotDispatched('player.adding'); + Event::assertNotDispatched('player.added'); // Allowed to use CJK characters + Event::fake(); option(['player_name_rule' => 'cjk']); $user = factory(User::class)->create(); $score = $user->score; @@ -87,6 +96,24 @@ class PlayerControllerTest extends TestCase 'code' => 0, 'message' => trans('user.player.add.success', ['name' => '角色名']), ]); + Event::assertDispatched('player.add.attempt', function ($event, $payload) use ($user) { + $this->assertEquals('角色名', $payload[0]); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); + Event::assertDispatched('player.adding', function ($event, $payload) use ($user) { + $this->assertEquals('角色名', $payload[0]); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); + Event::assertDispatched('player.added', function ($event, $payload) use ($user) { + $this->assertEquals('角色名', $payload[0]->name); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); Event::assertDispatched(Events\PlayerWillBeAdded::class); Event::assertDispatched(Events\PlayerWasAdded::class); $player = Player::where('name', '角色名')->first(); @@ -99,11 +126,14 @@ class PlayerControllerTest extends TestCase ); // Add a existed player + Event::fake(); $this->postJson('/user/player/add', ['name' => '角色名']) ->assertJson([ 'code' => 6, 'message' => trans('user.player.add.repeated'), ]); + Event::assertNotDispatched('player.adding'); + Event::assertNotDispatched('player.added'); // Single player option(['single_player' => true]); @@ -127,7 +157,25 @@ class PlayerControllerTest extends TestCase 'code' => 0, 'message' => trans('user.player.delete.success', ['name' => $player->name]), ]); + Event::assertDispatched('player.delete.attempt', function ($event, $payload) use ($player, $user) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); + Event::assertDispatched('player.deleting', function ($event, $payload) use ($player, $user) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); $this->assertNull(Player::find($player->pid)); + Event::assertDispatched('player.deleted', function ($event, $payload) use ($player, $user) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); Event::assertDispatched(Events\PlayerWillBeDeleted::class); Event::assertDispatched(Events\PlayerWasDeleted::class); $this->assertEquals( @@ -257,14 +305,29 @@ class PlayerControllerTest extends TestCase ]); // Set for "skin" type + Event::fake(); $this->postJson('/user/player/set/'.$player->pid, ['skin' => $skin->tid]) ->assertJson([ 'code' => 0, 'message' => trans('user.player.set.success', ['name' => $player->name]), ]); $this->assertEquals($skin->tid, Player::find($player->pid)->tid_skin); + Event::assertDispatched('player.texture.updating', function ($event, $payload) use ($player, $skin) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals($skin->tid, $payload[1]->tid); + + return true; + }); + Event::assertDispatched('player.texture.updated', function ($event, $payload) use ($player, $skin) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals($skin->tid, $payload[0]->tid_skin); + $this->assertEquals($skin->tid, $payload[1]->tid); + + return true; + }); // Set for "cape" type + Event::fake(); $this->postJson('/user/player/set/'.$player->pid, ['cape' => $cape->tid]) ->assertJson([ 'code' => 0, @@ -297,8 +360,37 @@ class PlayerControllerTest extends TestCase $this->assertEquals(0, Player::find($player->pid)->tid_cape); Event::assertDispatched(Events\PlayerProfileUpdated::class); + Event::fake(); $this->postJson('/user/player/texture/clear/'.$player->pid, ['type' => ['skin']]) ->assertJson(['code' => 0]); + Event::assertDispatched('player.texture.resetting', function ($event, $payload) use ($player) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals('skin', $payload[1]); + + return true; + }); + Event::assertDispatched('player.texture.reset', function ($event, $payload) use ($player) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals('skin', $payload[1]); + + return true; + }); + + Event::fake(); + $this->postJson('/user/player/texture/clear/'.$player->pid, ['type' => ['cape']]) + ->assertJson(['code' => 0]); + Event::assertDispatched('player.texture.resetting', function ($event, $payload) use ($player) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals('cape', $payload[1]); + + return true; + }); + Event::assertDispatched('player.texture.reset', function ($event, $payload) use ($player) { + $this->assertEquals($player->pid, $payload[0]->pid); + $this->assertEquals('cape', $payload[1]); + + return true; + }); } public function testBind() @@ -317,6 +409,18 @@ class PlayerControllerTest extends TestCase 'message' => trans('user.player.bind.success'), ]); Event::assertDispatched(Events\CheckPlayerExists::class); + Event::assertDispatched('player.adding', function ($event, $payload) use ($user) { + $this->assertEquals('abc', $payload[0]); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); + Event::assertDispatched('player.added', function ($event, $payload) use ($user) { + $this->assertEquals('abc', $payload[0]->name); + $this->assertEquals($user->uid, $payload[1]->uid); + + return true; + }); Event::assertDispatched(Events\PlayerWillBeAdded::class); Event::assertDispatched(Events\PlayerWasAdded::class); $player = Player::where('name', 'abc')->first();