-
Notifications
You must be signed in to change notification settings - Fork 200
/
achievements.ex
95 lines (80 loc) · 2.34 KB
/
achievements.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
defmodule Codebattle.User.Achievements do
@moduledoc """
Count user achievements
"""
alias Codebattle.{Repo, UserGame}
alias Codebattle.User.Stats
import Ecto.Query, warn: false
def recalculate_achievements(user) do
{user.achievements, user}
|> count_played_games
|> count_wins
|> elem(0)
end
def count_played_games({achievements, user}) do
query =
from(ug in UserGame,
select: ug.result,
where: ug.user_id == ^user.id
)
data = Repo.all(query)
user_games = Enum.count(Enum.into(data, []))
cond do
user_games >= 10 && user_games < 50 ->
if Enum.member?(achievements, "played_ten_games") do
{achievements, user}
else
{achievements ++ ["played_ten_games"], user}
end
user_games >= 50 && user_games < 100 ->
if Enum.member?(achievements, "played_fifty_games") do
{achievements, user}
else
{achievements ++ ["played_fifty_games"], user}
end
user_games >= 100 ->
if Enum.member?(achievements, "played_hundred_games") do
{achievements, user}
else
{achievements ++ ["played_hundred_games"], user}
end
true ->
{achievements, user}
end
end
def check_bot({achievements, user}) do
cond do
Enum.member?(achievements, "bot") ->
{achievements, user}
user.bot == true ->
{achievements ++ ["bot"], user}
true ->
{achievements, user}
end
end
def count_wins({achievements, user}) do
query =
from(ug in UserGame,
select: {
ug.lang,
count(ug.id)
},
where: ug.user_id == ^user.id and ug.result == "won" and not is_nil(ug.lang),
group_by: ug.lang
)
languages = Repo.all(query) |> Enum.into(%{}) |> Map.keys()
exist_achievement = Enum.filter(achievements, fn x -> String.contains?(x, "win_games_with") end) |> Enum.at(0)
new_achievement = "win_games_with?#{Enum.join(languages, "_")}"
cond do
Enum.count(languages) >= 3 ->
if (new_achievement !== exist_achievement) do
new_list = List.delete(achievements, exist_achievement)
{new_list ++ [new_achievement], user}
else
{achievements, user}
end
true ->
{achievements, user}
end
end
end