1
1
-module (ws_handler ).
2
2
3
+ -include_lib (" stdlib/include/qlc.hrl" ).
3
4
-include (" block.hrl" ).
4
5
5
6
-export ([init /3 ]).
8
9
-export ([websocket_info /3 ]).
9
10
-export ([websocket_terminate /3 ]).
10
11
12
+ -export ([find_winner /0 ]).
13
+ -export ([show_all_players /0 ]).
14
+
15
+
11
16
% % Wird beim initialen Verbindungsaufbau aufgerufen und upgradet das Protokoll auf einen Websocket
12
17
init ({tcp , http }, _Req , _Opts ) ->
13
- show_all_players (player ),
14
18
{upgrade , protocol , cowboy_websocket }.
15
19
16
20
% % Wird aufgerufen, sobald der Websocket erstellt wurde
@@ -20,79 +24,101 @@ websocket_init(_TransportName, Req, _Opts) ->
20
24
21
25
Player = # player { pid = self (), init_uuid = CookieVal , uuid = CookieVal , current_uuid = CookieVal , score = 0 , current_score = 0 },
22
26
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 ])),
24
28
lager :info (" new player ~p " , [NewClientMessage ]),
29
+ show_all_players (),
25
30
relay_message (NewClientMessage , Player # player .init_uuid ),
26
31
{ok , Req , Player }.
27
32
28
33
% % Behandelt eingehende Text-Nachrichten des Websockets
29
34
websocket_handle ({text , Msg }, Req , State ) ->
30
-
31
35
MessageNr = string :sub_string (binary_to_list (Msg ), 1 , 2 ),
32
- lager :info (" incomming message : ~p " , [MessageNr ]),
36
+ lager :info (" incomming message : ~p " , [Msg ]),
33
37
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 ();
38
43
MessageNr == " 30" ->lager :info (" reset" ),
44
+ generate_new_uuids (),
39
45
RelayMessage = lists :flatten (io_lib :format (" 30:~s " , [" RESET" ])),
40
46
relay_message (RelayMessage , State # player .init_uuid );
41
47
MessageNr == " 40" ->lager :info (" stop" ),
42
48
RelayMessage = lists :flatten (io_lib :format (" 40:~s " , [" STOP" ])),
43
49
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" )
50
51
end ,
51
52
{ok , Req , State };
52
53
websocket_handle (_Data , Req , State ) ->
53
54
{ok , Req , State }.
54
55
55
56
% % 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..." ),
57
59
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 ).
95
113
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
+
96
122
% % Behandelt eingehende Nachrichten anderer Erlang-Prozesse
97
123
websocket_info ({{init_uuid , Name }, {message , Message }}, Req , State ) when erlang :is_list (Message ) andalso erlang :is_list (Name ) ->
98
124
CompleteMessage = lists :flatten (io_lib :format (" ~s " , [Message ])),
0 commit comments