add more events about players

This commit is contained in:
Pig Fang 2020-01-05 11:05:22 +08:00
parent 70d8614d84
commit 516c5ef762
2 changed files with 137 additions and 17 deletions

View File

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

View File

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