Skip to content

Commit f5b550d

Browse files
committed
Stop nullify cache
1 parent 551aebe commit f5b550d

File tree

13 files changed

+1020
-13
lines changed

13 files changed

+1020
-13
lines changed

README.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22

33
[![Actions Status](https://github.com/hexlet-codebattle/codebattle/workflows/Build%20master/badge.svg)](https://github.com/hexlet-codebattle/codebattle/actions)
44
[![codecov](https://codecov.io/gh/hexlet-codebattle/codebattle/branch/master/graph/badge.svg)](https://codecov.io/gh/hexlet-codebattle/codebattle)
5-
[![Maintainability](https://api.codeclimate.com/v1/badges/a99a88d28ad37a79dbf6/maintainability)](https://codeclimate.com/github/hexlet-codebattle/codebattle/maintainability)
6-
[![codebeat badge](https://codebeat.co/badges/7557979e-74a7-45a6-b9ab-dcd44bab7e5b)](https://codebeat.co/projects/github-com-hexlet-codebattle-codebattle-master)
7-
[![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fhexlet-codebattle%2Fcodebattle&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com)
85

96
Codebattle - is an open source game being developed by the Hexlet community.
107
The current version of the application is available at [codebattle.hexlet.io](https://codebattle.hexlet.io).

apps/codebattle/lib/codebattle/game/elo.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ defmodule Codebattle.Game.Elo do
9494
end
9595

9696
{
97-
round(winner_rating + k * (s_winner - e_winner)),
98-
round(loser_rating + k * (s_loser - e_loser))
97+
(winner_rating + k * (s_winner - e_winner)) |> round() |> max(0),
98+
(loser_rating + k * (s_loser - e_loser)) |> round() |> max(0)
9999
}
100100
end
101101

apps/codebattle/lib/codebattle/game/engine.ex

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -613,7 +613,19 @@ defmodule Codebattle.Game.Engine do
613613
editor_text = Utils.sanitize_jsonb(player.editor_text)
614614

615615
player
616-
|> Map.take([:id, :result, :result_percent, :name, :clan_id, :is_bot, :lang, :editor_lang])
616+
|> Map.take([
617+
:id,
618+
:result,
619+
:result_percent,
620+
:name,
621+
:clan_id,
622+
:is_bot,
623+
:lang,
624+
:editor_lang,
625+
:rating,
626+
:rating_diff,
627+
:rank
628+
])
617629
|> Map.put(:editor_text, editor_text)
618630
end)
619631
end

apps/codebattle/lib/codebattle/game/player.ex

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ defmodule Codebattle.Game.Player do
1515
alias Runner.Languages
1616

1717
@primary_key false
18+
@default_rating 1200
1819
@default_editor_text ~s|const _ = require("lodash");\nconst R = require("rambda");\n\nconst solution = () => {\n\n};\n\nmodule.exports = solution;|
1920

2021
@derive {Jason.Encoder,
@@ -70,7 +71,7 @@ defmodule Codebattle.Game.Player do
7071
field(:name, :string, default: "Ada Lovelace")
7172
field(:playbook_id, :integer, default: nil)
7273
field(:rank, :integer, default: -1)
73-
field(:rating, :integer, default: 0)
74+
field(:rating, :integer, default: @default_rating)
7475
field(:rating_diff, :integer, default: 0)
7576
field(:result, :string, default: "undefined")
7677
field(:result_percent, :float, default: 0.0)
@@ -119,7 +120,7 @@ defmodule Codebattle.Game.Player do
119120
clan_id: user.clan_id,
120121
name: user.name,
121122
avatar_url: user.avatar_url,
122-
rating: user_game.rating,
123+
rating: default_rating(user_game.rating, user.rating),
123124
rating_diff: user_game.rating_diff,
124125
editor_lang: get_editor_lang(user, params),
125126
lang: user.lang || Application.get_env(:codebattle, :default_lang_slug),
@@ -141,7 +142,7 @@ defmodule Codebattle.Game.Player do
141142
is_guest: false,
142143
clan_id: player.clan_id,
143144
name: player.name,
144-
rating: player.rating,
145+
rating: default_rating(player.rating),
145146
rank: player.rank,
146147
avatar_url: player.avatar_url,
147148
editor_lang: get_editor_lang(player, params),
@@ -167,7 +168,7 @@ defmodule Codebattle.Game.Player do
167168
is_guest: player.is_guest,
168169
clan_id: player.clan_id,
169170
name: player.name,
170-
rating: player.rating,
171+
rating: default_rating(player.rating),
171172
rank: player.rank,
172173
editor_lang: get_editor_lang(player, params),
173174
lang: player.lang || Application.get_env(:codebattle, :default_lang_slug),
@@ -198,7 +199,7 @@ defmodule Codebattle.Game.Player do
198199
is_guest: user.is_guest,
199200
name: user.name,
200201
clan_id: user.clan_id,
201-
rating: user.rating,
202+
rating: default_rating(user.rating),
202203
rank: user.rank,
203204
editor_lang: get_editor_lang(user, params),
204205
lang: user.lang || Application.get_env(:codebattle, :default_lang_slug),
@@ -277,4 +278,10 @@ defmodule Codebattle.Game.Player do
277278
do: user.style_lang || Application.get_env(:codebattle, :default_style_lang_slug)
278279

279280
defp get_editor_lang(user, _params), do: user.lang || Application.get_env(:codebattle, :default_lang_slug)
281+
282+
defp default_rating(nil), do: @default_rating
283+
defp default_rating(rating), do: rating
284+
285+
defp default_rating(nil, fallback), do: default_rating(fallback)
286+
defp default_rating(rating, _fallback), do: rating
280287
end

apps/codebattle/lib/codebattle/tournament/player.ex

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ defmodule Codebattle.Tournament.Player do
77
@type t :: %__MODULE__{}
88

99
@primary_key false
10+
@default_rating 1200
1011

1112
@derive Jason.Encoder
1213

@@ -58,7 +59,7 @@ defmodule Codebattle.Tournament.Player do
5859
field(:name, :string)
5960
field(:place, :integer, default: 0)
6061
field(:rank, :integer, default: 5432)
61-
field(:rating, :integer)
62+
field(:rating, :integer, default: @default_rating)
6263
field(:score, :integer, default: 0)
6364
field(:state, :string, default: "active")
6465
field(:task_ids, {:array, :integer}, default: [])

apps/codebattle/lib/codebattle/user.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ defmodule Codebattle.User do
171171
name: "John Doe",
172172
subscription_type: :free,
173173
lang: Application.get_env(:codebattle, :default_lang_slug),
174-
rating: 0,
174+
rating: 1200,
175175
locale: Application.get_env(:codebattle, :default_locale, "en"),
176176
points: 0,
177177
rank: 0,

apps/codebattle/test/codebattle/game/context_test.exs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
defmodule Codebattle.Game.ContextTest do
22
use Codebattle.DataCase
33

4+
alias Codebattle.Game.GlobalSupervisor
45
alias Codebattle.Game.Player
56
alias Codebattle.Game.Server
67
alias Codebattle.PubSub.Message
@@ -55,6 +56,18 @@ defmodule Codebattle.Game.ContextTest do
5556
assert {:error, :handoff_in_progress} = Game.Context.trigger_timeout(game_id)
5657
assert :ok == Server.unfreeze(game_id)
5758
end
59+
60+
test "preserves player ratings when reloading timed out game from db", %{user1: user1, user2: user2} do
61+
{:ok, %{id: game_id}} =
62+
Game.Context.create_game(%{state: "playing", players: [user1, user2], level: "easy"})
63+
64+
assert {:ok, _new_game} = Game.Context.trigger_timeout(game_id)
65+
assert :ok = GlobalSupervisor.terminate_game(game_id)
66+
67+
reloaded_game = Game.Context.get_game!(game_id)
68+
69+
assert Enum.map(reloaded_game.players, & &1.rating) == [user1.rating, user2.rating]
70+
end
5871
end
5972

6073
describe "fetch_head_to_head_by_game_id/1" do
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
defmodule Codebattle.Game.EloTest do
2+
use ExUnit.Case, async: true
3+
4+
alias Codebattle.Game.Elo
5+
6+
test "never returns negative ratings for low-rated losers" do
7+
{winner_rating, loser_rating} = Elo.calc_elo(11, 0, "grand_slam", :win)
8+
9+
assert winner_rating >= 11
10+
assert loser_rating == 0
11+
end
12+
13+
test "preserves zero-change behavior for open tournaments" do
14+
assert {0, 0} = Elo.calc_elo(0, 0, "open", :win)
15+
end
16+
end

0 commit comments

Comments
 (0)