Skip to content

Commit 1a40422

Browse files
committedJan 12, 2017
- find winner job
- dificulty on two zeros - removed unused libraries - ui changes
1 parent e74f79f commit 1a40422

File tree

5 files changed

+164
-108
lines changed

5 files changed

+164
-108
lines changed
 

‎priv/index.html

+5-6
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,12 @@
3636
<button id="buttonReset" class="btn" type="button" onclick="reset()">Reset</button>
3737
</div>
3838

39-
<div id="winner_content" class="winner">
40-
WINNER IS
41-
<div id="output"></div>
42-
</div>
43-
44-
<div id="clients" class="clients_block_title">LOG</div>
39+
<!-- <div id="winner_content" class="winner"> -->
40+
<!-- <div id="output"></div> -->
41+
<!-- </div> -->
4542

43+
<div class="clients_block_title">LOG</div>
44+
<div id="log"></div>
4645
<!-- scripts -->
4746
<script type="text/javascript" src="static/game.js">
4847

‎priv/static/game.js

+77-44
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
"use strict";
22
var socket = new WebSocket("ws://localhost:5555/hashchain");
33

4-
var my_cookie = "uuid="+guid();
4+
var my_uuid = guid();
5+
var my_cookie = "uuid=" + my_uuid;
56

67
function init() {
7-
console.log("init client");
8+
console.log("init client with uuid " + my_cookie);
89
document.cookie = my_cookie;
910
if (!("WebSocket" in window)) {
1011
// console.log("websockets not supported");
@@ -30,69 +31,94 @@ socket.onmessage = function(messageEvent) {
3031
var message = messageEvent.data;
3132
if (message.substring(0, 2) == "10") {
3233
console.log("get random uuid " + message);
33-
document.getElementById("dataUUID0").innerHTML = guid();
34-
//--
34+
document.getElementById("dataUUID0").innerHTML = guid();
35+
// --
3536
var div = document.createElement("div");
3637
div.id = "uuid" + message;
3738
div.className = "clients_block_uuid";
38-
div.innerHTML = "<span class=\"msg\">" + message + " UUID</span>";
39-
document.getElementById("clients").appendChild(div);
39+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
40+
+ message + "</span>";
41+
// document.getElementById("clients").appendChild(div);
42+
document.getElementById("log").insertBefore(div,
43+
document.getElementById("log").firstChild);
4044
} else if (message.substring(0, 2) == "20") {
4145
document.getElementById("buttonUuid").disabled = true;
4246
document.getElementById("buttonReset").disabled = false;
4347
console.log("mined hash " + message);
4448
document.getElementById("dataHash0").innerHTML = message.substring(3,
4549
message.length);
46-
//--
50+
// --
4751
var div = document.createElement("div");
4852
div.id = "mine" + message;
4953
div.className = "clients_block_hash";
50-
div.innerHTML = "<span class=\"msg\">" + message + " HASH</span>";
51-
document.getElementById("clients").appendChild(div);
54+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
55+
+ message + "</span>";
56+
document.getElementById("log").insertBefore(div,
57+
document.getElementById("log").firstChild);
5258
} else if (message.substring(0, 2) == "30") {
5359
console.log("reset " + message);
5460
document.getElementById("buttonUuid").disabled = false;
5561
document.getElementById("buttonReset").disabled = false;
5662
document.getElementById("buttonStop").disabled = false;
5763
document.getElementById("buttonMine").disabled = false;
58-
//--
64+
// --
5965
var div = document.createElement("div");
6066
div.id = "reset" + message;
6167
div.className = "clients_block_reset";
62-
div.innerHTML = "<span class=\"msg\">" + message + " RESET</span>";
63-
document.getElementById("clients").appendChild(div);
68+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
69+
+ message + "</span>";
70+
document.getElementById("log").insertBefore(div,
71+
document.getElementById("log").firstChild);
6472
} else if (message.substring(0, 2) == "40") {
6573
console.log("stop " + message);
6674
document.getElementById("buttonUuid").disabled = true;
6775
document.getElementById("buttonReset").disabled = true;
6876
document.getElementById("buttonStop").disabled = true;
69-
//--
77+
// --
7078
var div = document.createElement("div");
7179
div.id = "stop" + message;
7280
div.className = "clients_block_stop";
73-
div.innerHTML = "<span class=\"msg\">" + message + " STOP</span>";
74-
document.getElementById("clients").appendChild(div);
81+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
82+
+ message + "</span>";
83+
document.getElementById("log").insertBefore(div,
84+
document.getElementById("log").firstChild);
7585
} else if (message.substring(0, 2) == "50") {
7686
console.log("winner " + message);
77-
//--
87+
// --
88+
document.getElementById("buttonUuid").disabled = true;
89+
document.getElementById("buttonReset").disabled = false;
90+
document.getElementById("buttonStop").disabled = true;
91+
document.getElementById("buttonMine").disabled = true;
92+
7893
var div = document.createElement("div");
7994
div.id = "winner" + message;
80-
div.className = "clients_block_hash";
81-
div.innerHTML = "<span class=\"msg\">" + message + " WINNER</span>";
82-
document.getElementById("clients").appendChild(div);
95+
div.className = "winner";
96+
97+
if(my_uuid == message.substring(3, message.length)){
98+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
99+
+" !!! YOU WIN !!!</span>";
100+
}else{
101+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "| Winner is : "
102+
+ message.substring(3, message.length) + "</span>";
103+
}
104+
105+
document.getElementById("log").insertBefore(div,
106+
document.getElementById("log").firstChild);
83107
} else if (message.substring(0, 2) == "60") {
84108
console.log("update all clients " + message);
85109
var div = document.createElement("div");
86-
div.id = "test" + messageEvent.data;
110+
div.id = "client_update" + messageEvent.data;
87111
if (message.substring(message.length - 1, message.length) == "1") {
88112
div.className = "clients_block_online";
89-
div.innerHTML = "<span class=\"msg\">" + message + " ONLINE</span>";
113+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
114+
+ message + " ONLINE</span>";
90115
} else {
91116
div.className = "clients_block_offline";
92-
div.innerHTML = "<span class=\"msg\">" + message
93-
+ " OFFLINE</span>";
117+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime() + "|"
118+
+ message + " OFFLINE</span>";
94119
}
95-
document.getElementById("clients").appendChild(div);
120+
document.getElementById("log").insertBefore(div,
121+
document.getElementById("log").firstChild);
96122
} else {
97123
console.log("unknown message " + message);
98124
}
@@ -119,11 +145,13 @@ function generateUUID() {
119145
if (socket.readyState == socket.OPEN) {
120146
console.log("10: get random UUID");
121147
socket.send("10");
122-
148+
123149
var div = document.createElement("div");
124150
div.className = "clients_block_uuid";
125-
div.innerHTML = "<span class=\"msg\">SEND GENERATE UUID</span>";
126-
document.getElementById("clients").appendChild(div);
151+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime()
152+
+ " GENERATE UUID...</span>";
153+
document.getElementById("log").insertBefore(div,
154+
document.getElementById("log").firstChild);
127155
} else {
128156
console.log('websocket is not connected');
129157
}
@@ -135,12 +163,14 @@ function mine() {
135163
console.log("mine");
136164
socket.send("20: " + document.getElementById("dataUUID0").innerHTML);
137165
document.getElementById("buttonMine").disabled = true;
138-
166+
139167
document.getElementById("buttonReset").disabled = false;
140168
var div = document.createElement("div");
141169
div.className = "clients_block_hash";
142-
div.innerHTML = "<span class=\"msg\">BEGINNING WITH MINING</span>";
143-
document.getElementById("clients").appendChild(div);
170+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime()
171+
+ " MINING...</span>";
172+
document.getElementById("log").insertBefore(div,
173+
document.getElementById("log").firstChild);
144174
} else {
145175
console.log('websocket is not connected');
146176
}
@@ -155,11 +185,13 @@ function reset() {
155185
document.getElementById("buttonReset").disabled = false;
156186
document.getElementById("buttonStop").disabled = false;
157187
document.getElementById("buttonMine").disabled = false;
158-
188+
159189
var div = document.createElement("div");
160190
div.className = "clients_block_reset";
161-
div.innerHTML = "<span class=\"msg\">MY RESET</span>";
162-
document.getElementById("clients").appendChild(div);
191+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime()
192+
+ " RESET...</span>";
193+
document.getElementById("log").insertBefore(div,
194+
document.getElementById("log").firstChild);
163195
} else {
164196
console.log('websocket is not connected');
165197
}
@@ -173,23 +205,24 @@ function stop() {
173205
document.getElementById("buttonUuid").disabled = true;
174206
document.getElementById("buttonReset").disabled = true;
175207
document.getElementById("buttonStop").disabled = true;
176-
208+
177209
var div = document.createElement("div");
178210
div.className = "clients_block_stop";
179-
div.innerHTML = "<span class=\"msg\">MY STOP</span>";
180-
document.getElementById("clients").appendChild(div);
211+
div.innerHTML = "<span class=\"msg\">" + new Date().getTime()
212+
+ " STOP</span>";
213+
document.getElementById("log").insertBefore(div,
214+
document.getElementById("log").firstChild);
181215
} else {
182216
console.log('websocket is not connected');
183217
}
184218
}
185219

186220
// http://stackoverflow.com/questions/105034/create-guid-uuid-in-javascript
187221
function guid() {
188-
function s4() {
189-
return Math.floor((1 + Math.random()) * 0x10000)
190-
.toString(16)
191-
.substring(1);
192-
}
193-
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
194-
s4() + '-' + s4() + s4() + s4();
195-
}
222+
function s4() {
223+
return Math.floor((1 + Math.random()) * 0x10000).toString(16)
224+
.substring(1);
225+
}
226+
return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4()
227+
+ s4() + s4();
228+
}

‎rebar.config

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
{erl_opts, [debug_info, {parse_transform, lager_transform}]}.
22
{deps, [
33
cowboy,
4-
lager,
5-
mochiweb
4+
lager
65
]}.
76

87
{plugins, [rebar3_run]}.
@@ -14,7 +13,6 @@
1413
lager,
1514
ranch,
1615
mnesia,
17-
mochiweb,
1816
sasl]},
1917

2018
{sys_config, "./config/sys.config"},

‎src/my_sha.erl

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ generate_sha(Value, Context, Count) ->
2020
New_context = crypto:hash_update(Context, Value),
2121
Diggest = crypto:hash_final(New_context),
2222
List = lists:flatten(list_to_hex(binary:bin_to_list(Diggest))),
23-
lager:info("MD5: ~p ~p \n", [List, Count]),
24-
Start = string:sub_string(List, 1, 1),
23+
%% lager:info("MD5: ~p ~p \n", [List, Count]),
24+
Start = string:sub_string(List, 1, 2),
2525
if
26-
Start == "0"->
26+
Start == "00"->
2727
{List, Count};
2828
true -> generate_sha(Value, New_context, Count+1)
2929
end.

‎src/ws_handler.erl

+78-52
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
-module(ws_handler).
22

3+
-include_lib("stdlib/include/qlc.hrl").
34
-include("block.hrl").
45

56
-export([init/3]).
@@ -8,9 +9,12 @@
89
-export([websocket_info/3]).
910
-export([websocket_terminate/3]).
1011

12+
-export([find_winner/0]).
13+
-export([show_all_players/0]).
14+
15+
1116
%% Wird beim initialen Verbindungsaufbau aufgerufen und upgradet das Protokoll auf einen Websocket
1217
init({tcp, http}, _Req, _Opts) ->
13-
show_all_players(player),
1418
{upgrade, protocol, cowboy_websocket}.
1519

1620
%% Wird aufgerufen, sobald der Websocket erstellt wurde
@@ -20,79 +24,101 @@ websocket_init(_TransportName, Req, _Opts) ->
2024

2125
Player = #player { pid = self(), init_uuid = CookieVal, uuid = CookieVal, current_uuid = CookieVal, score=0, current_score=0 },
2226
mnesia:dirty_write(Player),
23-
NewClientMessage = lists:flatten(io_lib:format("60:~s:~p:~p", [Player#player.init_uuid, Player#player.score, 1])),
27+
NewClientMessage = lists:flatten(io_lib:format("60:~s:~p", [Player#player.init_uuid, 1])),
2428
lager:info("new player ~p ", [NewClientMessage]),
29+
show_all_players(),
2530
relay_message(NewClientMessage, Player#player.init_uuid),
2631
{ok, Req, Player}.
2732

2833
%% Behandelt eingehende Text-Nachrichten des Websockets
2934
websocket_handle({text, Msg}, Req, State) ->
30-
3135
MessageNr = string:sub_string(binary_to_list(Msg), 1, 2),
32-
lager:info("incomming message : ~p", [MessageNr]),
36+
lager:info("incomming message : ~p", [Msg]),
3337
if
34-
MessageNr == "10"->lager:info("generate uuid"),
35-
generate_new_uuids(player);
36-
MessageNr == "20"->lager:info("mine hash"),
37-
mine_hash(player);
38+
MessageNr == "10"->
39+
generate_new_uuids();
40+
MessageNr == "20"->
41+
mine_hash(),
42+
find_winner();
3843
MessageNr == "30"->lager:info("reset"),
44+
generate_new_uuids(),
3945
RelayMessage = lists:flatten(io_lib:format("30:~s", ["RESET"])),
4046
relay_message(RelayMessage, State#player.init_uuid);
4147
MessageNr == "40"->lager:info("stop"),
4248
RelayMessage = lists:flatten(io_lib:format("40:~s", ["STOP"])),
4349
relay_message(RelayMessage, State#player.init_uuid);
44-
MessageNr == "50"->lager:info("winner"),
45-
Winner = "YOU",
46-
RelayMessage = lists:flatten(io_lib:format("50:~s", [Winner])),
47-
relay_message(RelayMessage, State#player.init_uuid);
48-
MessageNr == "60"->lager:info("update palyers information");
49-
true -> lager:info("unknown message")
50+
true -> lager:error("unknown message")
5051
end,
5152
{ok, Req, State};
5253
websocket_handle(_Data, Req, State) ->
5354
{ok, Req, State}.
5455

5556
%% http://stackoverflow.com/questions/7763745/best-way-to-print-out-mnesia-table
56-
show_all_players(Table)->
57+
show_all_players()->
58+
lager:info("players in game..."),
5759
Iterator = fun(Rec,_)-> lager:info("~p~n",[Rec]),[]end,
58-
case mnesia:is_transaction() of
59-
true -> mnesia:foldl(Iterator,[],Table);
60-
false ->
61-
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
62-
mnesia:activity(transaction,Exec,[{Iterator,Table}],mnesia_frag)
63-
end.
64-
65-
generate_new_uuids(Table)->
66-
Iterator = fun(Player,_) -> lager:info("generate new uuids"),
67-
UUID = uuid:to_string(uuid:v4()),
68-
UUIDasMessage = lists:flatten(io_lib:format("10:~s:~s", [Player#player.init_uuid, UUID])),
69-
Player2 = Player#player {uuid = UUID},
70-
mnesia:dirty_write(Player2),
71-
relay_message_uuid(UUIDasMessage, Player#player.init_uuid),
72-
[]end,
73-
case mnesia:is_transaction() of
74-
true -> mnesia:foldl(Iterator,[],Table);
75-
false ->
76-
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
77-
mnesia:activity(transaction,Exec,[{Iterator,Table}],mnesia_frag)
78-
end.
79-
80-
mine_hash(Table)->
81-
Iterator = fun(Player,_) -> lager:info("mine"),
82-
{Hash, Count} = my_sha:generate_sha(Player#player.uuid, crypto:hash_init(md5), 0),
83-
NewScore = Player#player.score + Count,
84-
Player2 = Player#player {current_hash = Hash, current_score = Count, score = NewScore },
85-
mnesia:dirty_write(Player2),
86-
RelayMessage = lists:flatten(io_lib:format("20:~s:~s:~p:~p", [Player2#player.init_uuid, Hash, Player2#player.score, Count])),
87-
relay_message(RelayMessage, Player2#player.init_uuid),
88-
[]end,
89-
case mnesia:is_transaction() of
90-
true -> mnesia:foldl(Iterator,[],Table);
91-
false ->
92-
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
93-
mnesia:activity(transaction,Exec,[{Iterator,Table}],mnesia_frag)
94-
end.
60+
case mnesia:is_transaction() of
61+
true -> mnesia:foldl(Iterator,[],player);
62+
false ->
63+
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
64+
mnesia:activity(transaction,Exec,[{Iterator,player}],mnesia_frag)
65+
end.
66+
67+
generate_new_uuids()->
68+
lager:info("generate new uuids..."),
69+
Iterator = fun(Player,_) ->
70+
UUID = uuid:to_string(uuid:v4()),
71+
UUIDasMessage = lists:flatten(io_lib:format("10:~s:~s", [Player#player.init_uuid, UUID])),
72+
Player2 = Player#player {uuid = UUID},
73+
mnesia:dirty_write(Player2),
74+
relay_message_uuid(UUIDasMessage, Player#player.init_uuid),
75+
[]end,
76+
case mnesia:is_transaction() of
77+
true -> mnesia:foldl(Iterator,[],player);
78+
false ->
79+
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
80+
mnesia:activity(transaction,Exec,[{Iterator,player}],mnesia_frag)
81+
end.
82+
83+
mine_hash()->
84+
lager:info("mine..."),
85+
Iterator = fun(Player,_) ->
86+
{Hash, Count} = my_sha:generate_sha(Player#player.uuid, crypto:hash_init(md5), 0),
87+
NewScore = Player#player.score + Count,
88+
Player2 = Player#player {current_hash = Hash, current_score = Count, score = NewScore },
89+
mnesia:dirty_write(Player2),
90+
RelayMessage = lists:flatten(io_lib:format("20:~s:~s:~p:~p", [Player2#player.init_uuid, Hash, Player2#player.score, Count])),
91+
relay_message(RelayMessage, Player2#player.init_uuid),
92+
[]end,
93+
case mnesia:is_transaction() of
94+
true -> mnesia:foldl(Iterator,[],player);
95+
false ->
96+
Exec = fun({Fun,Tab}) -> mnesia:foldl(Fun, [],Tab) end,
97+
mnesia:activity(transaction,Exec,[{Iterator,player}],mnesia_frag)
98+
end.
99+
100+
find_winner()->
101+
lager:info("find winner..."),
102+
Query = fun() ->
103+
qlc:e(
104+
qlc:q([X || X <- mnesia:table(player)])
105+
)
106+
end,
107+
{atomic, Records} = mnesia:transaction(Query),
108+
Player = find_min_score(Records),
109+
RelayMessage = lists:flatten(io_lib:format("50:~s", [Player#player.init_uuid])),
110+
relay_message(RelayMessage, Player#player.init_uuid).
111+
112+
find_min_score([H|T]) -> find_min_score(H ,T).
95113

114+
find_min_score(Winner, []) -> Winner;
115+
find_min_score(Winner ,[H|T]) ->
116+
%% lager:info("winner -> ~p ", [Winner#player.score]),
117+
if H#player.score =< Winner#player.score
118+
-> find_min_score(H,T);
119+
true -> find_min_score(Winner, T)
120+
end.
121+
96122
%% Behandelt eingehende Nachrichten anderer Erlang-Prozesse
97123
websocket_info({{init_uuid, Name}, {message, Message}}, Req, State) when erlang:is_list(Message) andalso erlang:is_list(Name) ->
98124
CompleteMessage = lists:flatten(io_lib:format("~s", [Message])),

0 commit comments

Comments
 (0)
Please sign in to comment.