Skip to content
This repository was archived by the owner on Jan 9, 2024. It is now read-only.

Commit 5757a78

Browse files
authored
Merge pull request #95 from ruby-nord/bug/update-player-reload
Bug/update player reload
2 parents 7984669 + 837802e commit 5757a78

File tree

8 files changed

+143
-40
lines changed

8 files changed

+143
-40
lines changed

app/assets/javascripts/battletype.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//= require battletype/combat_zone
77
//= require battletype/dockyard
88
//= require battletype/ship
9+
//= require battletype/player
910
//= require battletype/life_o_meter
1011

1112
(function () {
@@ -32,6 +33,9 @@
3233

3334
this.mothership = Dockyard.launchMothership(this.$combatZone);
3435

36+
this.player = Player.build(document.getElementById("current_player_nickname"));
37+
this.opponent = Player.build(document.getElementById("opponent_nickname"));
38+
3539
this.playerLifeOMeter = LifeOMeter.activate(document.getElementById("life_player"));
3640
this.opponentLifeOMeter = LifeOMeter.activate(document.getElementById("life_opponent"));
3741

@@ -118,9 +122,18 @@
118122
case "player_joined":
119123
if (payload.player_id != this.playerId) {
120124
var nickname = payload.nickname;
125+
Battletype.opponent.nickname = payload.nickname;
126+
this._logs.displayMessage(payload.code);
127+
}
128+
break;
129+
case "player_nickname_changed":
130+
var nickname = payload.nickname;
121131

122-
this.$combatZone.find("#opponent_nickname").text(nickname); // TODO tell-dont-ask
132+
if (payload.player_id == this.playerId) {
133+
Battletype.player.nickname = payload.nickname;
123134
this._logs.displayMessage(payload.code);
135+
} else {
136+
Battletype.opponent.nickname = payload.nickname;
124137
}
125138
break;
126139
}

app/assets/javascripts/battletype/logs.js

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
(function () {
22
var LOG_CODES_AND_TYPES_MAP = {
3-
"failed_attack": "attack",
4-
"failed_bombing": "attack",
5-
"failed_defense": "defense",
6-
"game_won": "game",
7-
"player_joined": "player",
8-
"successful_attack": "attack",
9-
"successful_bombing": "bomb",
10-
"successful_defense": "defense",
3+
"failed_attack": "attack",
4+
"failed_bombing": "attack",
5+
"failed_defense": "defense",
6+
"game_won": "game",
7+
"player_joined": "player",
8+
"player_nickname_changed": "player",
9+
"successful_attack": "attack",
10+
"successful_bombing": "bomb",
11+
"successful_defense": "defense",
1112
};
1213

1314
var LOG_CODES_AND_MESSAGES_MAP = {
14-
"failed_attack": "OOPS! Attack failed",
15-
"failed_bombing": "OOPS! Bombing failed",
16-
"failed_defense": "OOPS! Defense failed",
17-
"game_won": "Game finished!",
18-
"player_joined": "Opponent joined",
19-
"successful_attack": "New ship launched!",
20-
"successful_bombing": "Mothership hit!",
21-
"successful_defense": "Ship destroyed!",
15+
"failed_attack": "OOPS! Attack failed",
16+
"failed_bombing": "OOPS! Bombing failed",
17+
"failed_defense": "OOPS! Defense failed",
18+
"game_won": "Game finished!",
19+
"player_joined": "Opponent joined",
20+
"player_nickname_changed": "Nickname changed",
21+
"successful_attack": "New ship launched!",
22+
"successful_bombing": "Mothership hit!",
23+
"successful_defense": "Ship destroyed!",
2224
};
2325

2426
var ERROR_CODES_AND_MESSAGES_MAP = {
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
(function () {
2+
this.Player = {
3+
_properties: {
4+
nickname: {
5+
get: function () { return this._nickname; },
6+
set: function (nickname) {
7+
this._nickname = nickname;
8+
9+
$(this)
10+
.text(nickname)
11+
.fadeIn("slow")
12+
.blur();
13+
}
14+
}
15+
},
16+
build: function (node) {
17+
var player = Object.defineProperties(node, this._properties);
18+
return player;
19+
}
20+
};
21+
}).call(this);

app/controllers/players_controller.rb

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@ class PlayersController < ApplicationController
22
before_action :set_player
33

44
def update
5-
return render json: {error: "Cannot update another user"}, status: 401 if @player != current_player
5+
return render json: { error: "Cannot update another user" }, status: 401 if @player != current_player
66

7-
@player.update(player_params)
8-
render json: {status: :ok}, status: 200
7+
payload = Players::ChangeNickname.call(player: @player, nickname: params[:player][:nickname])
8+
ActionCable.server.broadcast "game_#{current_player.game_id}", payload
9+
head 200
910
end
1011

1112
private
13+
1214
def set_player
1315
@player = Player.find(params[:id])
1416
end
15-
16-
def player_params
17-
params.require(:player).permit(:nickname)
18-
end
1917
end
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
module Players
2+
class ChangeNickname
3+
private
4+
attr_reader :nickname, :player
5+
6+
public
7+
8+
def self.call(player:, nickname:)
9+
new(player: player, nickname: nickname).call
10+
end
11+
12+
def initialize(player:, nickname:)
13+
@nickname = nickname
14+
@player = player
15+
end
16+
17+
def call
18+
update_nickname
19+
20+
return successful_payload
21+
end
22+
23+
private
24+
25+
def update_nickname
26+
player.update(nickname: nickname)
27+
end
28+
29+
def successful_payload
30+
{ code: "player_nickname_changed", player_id: @player.id, nickname: @player.nickname }
31+
end
32+
end
33+
end

app/views/games/show.html.erb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@
1919
<li class="life_bar"><%= render "games/hud/life" %></li>
2020
<li class="life_bar"><%= render "games/hud/life" %></li>
2121
</ul>
22-
<!-- <h1 class="player">Casimir</h1> -->
2322
<div id="current_player" data-player-id="<%= current_player.id %>" data-player-nickname="<%= current_player.nickname %>"></div>
24-
<%= form_for(current_player, url: player_path(current_player), class: "player") do |f|%>
23+
<%= form_for(current_player, url: player_path(current_player), data: { remote: true }, class: "player") do |f| %>
2524
<%= f.text_field :nickname, id: 'current_player_nickname' %>
2625
<% end %>
2726
<ul id="life_opponent">
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
require "rails_helper"
2+
3+
RSpec.describe "Players::ChangeNickname", type: :dispatch do
4+
subject(:dispatch) { Players::ChangeNickname }
5+
let(:game) { Game.create! }
6+
let(:player) { Player.create!(game: game, nickname: "Rico") }
7+
8+
describe ".call" do
9+
it 'updates player nickname' do
10+
expect { dispatch.call(player: player, nickname: "Zim") }.to change { player.nickname }.from("Rico").to("Zim")
11+
end
12+
13+
it 'returns a payload' do
14+
expect(dispatch.call(player: player, nickname: "Zim")).to be_instance_of(Hash)
15+
end
16+
17+
it "returns payload with the new nickname of the player" do
18+
expect(dispatch.call(player: player, nickname: "Zim")).to include(code: 'player_nickname_changed', player_id: player.id, nickname: "Zim")
19+
end
20+
end
21+
end

spec/requests/players_spec.rb

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,44 @@
11
require "rails_helper"
22

33
RSpec.describe "Players", type: :request do
4-
let(:player) { Player.create!(nickname: "Rico") }
4+
let(:player) { Player.create!(nickname: "Rico") }
55

66
describe "PUT update" do
77
context 'update current_player' do
88
before :each do
99
allow_any_instance_of(ApplicationController).to receive(:current_player).and_return(player)
1010
end
1111

12-
before { put "/players/#{player.id}", params: {player: {nickname: "Zim"}} }
13-
it { expect(response).to have_http_status(200) }
14-
it { expect(player.reload.nickname).to eq("Zim") }
15-
end
16-
end
12+
it "returns 200 HTTP status" do
13+
put "/players/#{player.id}", params: { player: { nickname: "Zim" }}
14+
expect(response).to have_http_status(200)
15+
end
1716

18-
context 'update another player' do
19-
let(:other_player) { Player.create!(nickname: "Carmen") }
20-
before :each do
21-
allow_any_instance_of(ApplicationController).to receive(:current_player).and_return(other_player)
17+
it "updates player nickname" do
18+
put "/players/#{player.id}", params: { player: { nickname: "Zim" }}
19+
expect(player.reload.nickname).to eq("Zim")
20+
end
21+
22+
it 'broadcasts a player nickname updated payload' do
23+
allow(ActionCable.server).to receive(:broadcast)
24+
put "/players/#{player.id}", params: { player: { nickname: "Zim" }}
25+
expect(ActionCable.server).to have_received(:broadcast).with(
26+
anything,
27+
code: 'player_nickname_changed', player_id: player.id, nickname: 'Zim'
28+
)
29+
end
2230
end
2331

24-
before { put "/players/#{player.id}", params: {player: {nickname: "Ace"}} }
25-
it { expect(response).to have_http_status(401) }
26-
it { expect(player.reload.nickname).to eq("Rico") }
32+
context 'update another player' do
33+
let(:other_player) { Player.create!(nickname: "Carmen") }
34+
35+
before :each do
36+
allow_any_instance_of(ApplicationController).to receive(:current_player).and_return(other_player)
37+
put "/players/#{player.id}", params: { player: { nickname: "Ace" }}
38+
end
39+
40+
it { expect(response).to have_http_status(401) }
41+
it { expect(player.reload.nickname).to eq("Rico") }
42+
end
2743
end
28-
end
44+
end

0 commit comments

Comments
 (0)