Browse Source

add ranking scoring to roster

Maxim Sokhatsky 11 years ago
parent
commit
a986d7dd4a

+ 1 - 1
apps/server/include/requests.hrl

@@ -15,7 +15,7 @@
 
 -record(game_event, {game :: 'GameId'(), event, args = [] }).
 -record(chat_event, {game :: 'GameId'(), player_id :: 'PlayerId'(), who, message }).
--record(stats_event, {player_id :: 'PlayerId'(), games, reveals, protocol}).
+-record(stats_event, {player_id :: 'PlayerId'(), games, reveals, protocol, score}).
 -record(game_paused, {table_id :: integer(), game :: 'GameId'(),action,who :: 'PlayerId'(),retries}).
 -record(disconnect, {reason_id,reason}).
 -record(player_left, {player :: 'PlayerId'(),human_replaced=false,replacement::'PlayerId'()}).

+ 2 - 1
apps/server/src/game.erl

@@ -517,7 +517,8 @@ get_player_info(_,User) ->
         player_id=User,
         games=Games,
         reveals=Reveals#reveal_log.stats,
-        protocol=Protocol#protocol_log.stats}.
+        protocol=Protocol#protocol_log.stats,
+        score=Reveals#reveal_log.score}.
 
 plist_setkey(Name,Pos,List,New) ->
     case lists:keyfind(Name,Pos,List) of

+ 7 - 2
apps/server/src/okey/okey_scoring.erl

@@ -333,13 +333,18 @@ check_win([TopRow, BottomRow], Gosterge) ->
                        _ -> E
                   end || E <- FlatList],
 
-    Res = check_win_rec(sets:from_list(Normalized)),
+    Res = check_unordered(sets:from_list(Normalized),#{}),
 
     gas:info(?MODULE,"NEW check_reveal/2 ~p",[Res]),
 
     ok.
 
-check_win_rec(Set) -> ok.
+check_unordered(Set,Map) ->
+
+    case sets:size() of
+        0 -> false;
+        _ -> true
+    end.
 
 %% @spec check_reveal(TashPlaces, Gosterge) -> {RightReveal, WithPairs, SameColor}
 %% @end

+ 0 - 16
apps/web/priv/ssl/cowboy-ca.crt

@@ -1,16 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICeDCCAeGgAwIBAgIJAOvpU0y2e5J4MA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczETMBEGA1UECgwKTmluZSBOaW5lczEPMA0G
-A1UECwwGQ293Ym95MRAwDgYDVQQDDAdST09UIENBMB4XDTEzMDIyODA1MTAwMVoX
-DTMzMDIyMzA1MTAwMVowVTELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRMw
-EQYDVQQKDApOaW5lIE5pbmVzMQ8wDQYDVQQLDAZDb3dib3kxEDAOBgNVBAMMB1JP
-T1QgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMzmY7Us06yjyUbpqwPx
-Iv+xh/g3V7we07ClC9GEYnvr3OQvdA1jFEHccMBUUjRoQ8DPd6uSyK5UkixABs08
-Tt5B3VsnGKr0DIN+IO4SN2PkmBqIU/BN3KdcwN65YNr3iM0KsKWeFtAZdYx4CakX
-7REbO0wjK20AH3xSBn3uFGiBAgMBAAGjUDBOMB0GA1UdDgQWBBRKfZ8KF2jlLBDm
-NL6IuEuGY0pdbzAfBgNVHSMEGDAWgBRKfZ8KF2jlLBDmNL6IuEuGY0pdbzAMBgNV
-HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAG1I0kBxXiLkM1b7rl2zPLizREYg
-1m+ajb6rWzPOBg6TXjv58Be+H4tqoHIL/M/crixew5emftBkuAGjiKMhbIokjvan
-aPTCV8U6HHvNvz9c68HpESWbd+56cHqfsS5XCKp1OpW5tbL2UQYpFKMP4qmbv3Ea
-pBfPPmSFMBb1i2AI
------END CERTIFICATE-----

+ 0 - 17
apps/web/priv/ssl/server.crt

@@ -1,17 +0,0 @@
------BEGIN CERTIFICATE-----
-MIICpTCCAg6gAwIBAgIJAOvpU0y2e5J5MA0GCSqGSIb3DQEBBQUAMFUxCzAJBgNV
-BAYTAlVTMQ4wDAYDVQQIDAVUZXhhczETMBEGA1UECgwKTmluZSBOaW5lczEPMA0G
-A1UECwwGQ293Ym95MRAwDgYDVQQDDAdST09UIENBMB4XDTEzMDIyODA1MjMzNFoX
-DTMzMDIyMzA1MjMzNFowVzELMAkGA1UEBhMCVVMxDjAMBgNVBAgMBVRleGFzMRMw
-EQYDVQQKDApOaW5lIE5pbmVzMQ8wDQYDVQQLDAZDb3dib3kxEjAQBgNVBAMMCWxv
-Y2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAzbW1GjECzHUc/WST
-qLiAGqjCNccR5saVS+yoz2SPRhpoyf0/qBrX5BY0tzmgozoTiRfE4wCiVD99Cc+D
-rp/FM49r4EpZdocIovprmOmv/gwkoj95zaA6PKNn1OdmDp2hwJsX2Zm3kpbGUZTx
-jDkkccmgUb4EjL7qNHq7saQtivUCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgB
-hvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYE
-FB6jTEIWI8T1ckORA4GezbyYxtbvMB8GA1UdIwQYMBaAFEp9nwoXaOUsEOY0voi4
-S4ZjSl1vMA0GCSqGSIb3DQEBBQUAA4GBACMboVQjrx8u/fk3gl/sR0tbA0Wf/NcS
-2Dzsy2czndgVUAG4Sqb+hfgn0dqAyUKghRrj3JDcYxYksGPIklDfPzZb7yJ39l16
-6x5ZiIzhp8CAVdPvRxRznw5rZwaXesryXu1jVSZxTr3MYZdkG6KaAM0t90+YlGLZ
-UG8fAicx0Bf+
------END CERTIFICATE-----

+ 0 - 15
apps/web/priv/ssl/server.key

@@ -1,15 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXQIBAAKBgQDNtbUaMQLMdRz9ZJOouIAaqMI1xxHmxpVL7KjPZI9GGmjJ/T+o
-GtfkFjS3OaCjOhOJF8TjAKJUP30Jz4Oun8Uzj2vgSll2hwii+muY6a/+DCSiP3nN
-oDo8o2fU52YOnaHAmxfZmbeSlsZRlPGMOSRxyaBRvgSMvuo0eruxpC2K9QIDAQAB
-AoGAaD85c/h6bpq7Aj7CBbLaWKhFI3OqwsTITB22vsM7SE+B4zsP02UnG1OVi3UM
-zytTUxpUkKV1njQ+bYZYOVqGWF4Up8tTqUglHn0FTPok1AIemELWtz3sXvdSHC1T
-lqvFBAZ9kibn13qGyVOiyCFaMwfOM/05RvV7p3jfUMTWnNECQQDs7yCJZ8Ol8MyH
-TGZzvkjoN2zg1KwmTbSD1hkP6QAJtPdRuqFbjlEru0/PefgOXsWLRIa3/3v0qw2G
-xGkV6AXTAkEA3kNbFisqUydjPnZIYv/P6SvPdUimHJEjXbAbfNfzS9dzszrOVJd2
-XqGH7z5yzjoH3IyaIMW8GnubVzGDSjrHFwJAKSU5vELlygpwKkrNO+pelN0TLlQg
-dSJnZ8GlZorq88SWcn37iX/EftivenNO7YftvEqxLoDSkOGnnrC7Iw/A+wJBAIEe
-L/QY72WPJCBNJpAce/PA96vyoE1II3txqwZDjZspdpVQPDz4IFOpEwbxCFC1dYuy
-Qnd3Z2cbF4r3wIWGz9ECQQCJGNhUNtY+Om1ELdqPcquxE2VRV/pucnvJSTKwyo2C
-Rvm6H7kFDwPDuN23YnTOlTiho0zzCkclcIukhIVJ+dKz
------END RSA PRIVATE KEY-----

+ 2 - 2
apps/web/priv/static/app/js/chat.js

@@ -126,7 +126,7 @@ if (!String.prototype.encodeHTML) {
   };
 }
 
-function addOnlineUser(name,full_name,insertMode) {
+function addOnlineUser(name,full_name,score,insertMode) {
     var listElement = document.getElementById("Online-List");
     var clickEvent = ' onclick="openChat(evt);" '; 
     var events = ' onmouseover="onlineHover(evt);" onmouseout="onlineHoverOut(evt);" ' + clickEvent;
@@ -140,7 +140,7 @@ function addOnlineUser(name,full_name,insertMode) {
             'font-family="Exo 2" font-size="18" cursor="pointer" font-weight="normal" line-spacing="18"'+
             ' fill="#3B5998">' +
                 '<tspan xmlns:data="'+name+'" font-weight="normal" fill="'+color+'" x="19" y="22">'+full_name+'</tspan>' + 
-                '<tspan xmlns:data="'+name+'" font-size="14" x="19" y="40">Score: 1043 Pos: 13</tspan></text>'+
+                '<tspan xmlns:data="'+name+'" font-size="14" x="19" y="40">Score: '+score+' </tspan></text>'+
             '<rect '+
             '  x="10" y="48" width="196" height="8"></rect></g>';
     var element = svg(html);

+ 1 - 1
apps/web/priv/static/app/js/okey/okey_protocol.js

@@ -105,7 +105,7 @@ function OkeyApiProviderScope(scope) {
             return msg;
         },
         emitEvent: function(raw,msg) {
-//            console.log(String(dec(raw)));
+            //console.log(String(dec(raw)));
             for (var event, i = eventMap.length, obj; i--; ) {
                 event = eventMap[i];
                 found = (event == msg[0] || msg[event] != null);

+ 25 - 14
apps/web/priv/static/app/js/roster.js

@@ -12,26 +12,34 @@ function RosterHandlers(scope) {
         document.getElementById("Users-Online-Number").firstElementChild.textContent = e.detail.toString(); 
     });
 
-
     scope.apiProvider.on("online", function (x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
-        var msg = e.detail, id = msg[0], name = msg[1], surname = msg[2];
+        var id      = dec(e.raw).value[0][1].value;
+            name    = dec(e.raw).value[0][2].value;
+            surname = dec(e.raw).value[0][3].value;
+            score   = dec(e.raw).value[0][4];
         if (null != document.getElementById(id)) removeOnlineUser(id);
-        addOnlineUser(id,name+" "+surname,"insertTop");
+        addOnlineUser(id,name+" "+surname,score,"insertTop");
         if (currentChat == null) showOnlineList();
     });
 
     scope.apiProvider.on("offline", function (x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
-        var msg = e.detail, id = msg[0], name = msg[1], surname = msg[2];
+        var id      = dec(e.raw).value[0][1].value;
+            name    = dec(e.raw).value[0][2].value;
+            surname = dec(e.raw).value[0][3].value;
+            score   = dec(e.raw).value[0][4];
         if (null != document.getElementById(id)) removeOnlineUser(id);
-        addOnlineUser(id,name+" "+surname,"appendChild");
+        addOnlineUser(id,name+" "+surname,score,"appendChild");
     });
 
     scope.apiProvider.on("roster_item", function (x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
-        var msg = e.detail, id = msg[0], name = msg[1], surname = msg[2];
-        addOnlineUser(id,name+" "+surname,"appendChild");
+        var id      = dec(e.raw).value[0][1].value;
+            name    = dec(e.raw).value[0][2].value;
+            surname = dec(e.raw).value[0][3].value;
+            score   = dec(e.raw).value[0][4];
+        addOnlineUser(id,name+" "+surname,score,"appendChild");
     });
 
     scope.apiProvider.on("roster_end", function (x) {
@@ -44,9 +52,9 @@ function RosterHandlers(scope) {
 
     scope.apiProvider.on("chat_message", function (x) {
         var e = {detail: x.detail.json, raw: x.detail.bert};
-        var from = dec(e.raw).value[0][1].value[0][0].value,
-            names = dec(e.raw).value[0][1].value[0][1].value,
-            to = dec(e.raw).value[0][2].value,
+        var from    = dec(e.raw).value[0][1].value[0][0].value,
+            names   = dec(e.raw).value[0][1].value[0][1].value,
+            to      = dec(e.raw).value[0][2].value,
             message = dec(e.raw).value[0][3].value;
         chatMessage("Chat+"+from,"1",from==document.user?"Self":from,utf8decode(message));
         if (null != currentChat) {
@@ -78,11 +86,13 @@ function RosterHandlers(scope) {
         var games    = dec(e.raw).value[0][2],
             reveals  = dec(e.raw).value[0][3],
             protocol = dec(e.raw).value[0][4];
+            score    = dec(e.raw).value[0][5];
         removeChilds(document.getElementById('Stat-Left'));
         removeChilds(document.getElementById('Stat-Right'));
 //            for (var i=0;i<games.length;i++) { statsRow(24, i,games); }
         for (var i=0;i<protocol.length;i++) { statsRow(24,i,protocol); }
         for (var i=0;i<reveals.length;i++) { statsRow(340,i,reveals); }
+        $("#Score").text("Score: " + score).attr({y: 40});
     });
 
     scope.apiProvider.on("roster_group", function (x) {
@@ -90,10 +100,11 @@ function RosterHandlers(scope) {
         var list = dec(e.raw).value[0][1];
         for (var i=0;i<list.length;i++) {
             var item = list[i],
-                id = item.value[0][0].value,
-                names = item.value[0][1].value,
-                surnames = item.value[0][2].value;
-            addOnlineUser(id,names+" "+surnames+" "+user_count++,'appendChild');
+                id       = item.value[0][0].value,
+                names    = item.value[0][1].value,
+                surnames = item.value[0][2].value,
+                score    = item.value[0][3];
+            addOnlineUser(id,names+" "+surnames+" "+user_count++,score,'appendChild');
         }
     });
 

+ 3 - 3
apps/web/priv/static/app/svg/Player-Statistics.svg

@@ -36,11 +36,11 @@
                 <text id="Games" font-size="35.1627907" font-weight="normal" fill="#3B5998">
                     <tspan x="0" y="122.014225">Games</tspan>
                 </text>
-                <text id="Score:-722-" fill="#FFFFFF" font-size="35.1627907" font-weight="bold">
+                <text id="Score" font-size="35.1627907" font-weight="bold" fill="#FFFFFF">
                     <tspan x="0" y="36.0284512">Score: 722 </tspan>
                 </text>
-                <text id="Rank:-22-" fill="#FFFFFF" font-size="35.1627922" font-weight="bold">
-                    <tspan x="458" y="38.0284509">Rank: 22 </tspan>
+                <text id="Rank" font-size="35.1627922" font-weight="bold" fill="#48AF5E">
+                    <tspan x="416" y="38.0284509">Rank: 22 </tspan>
                 </text>
             </g>
         </g>

BIN
apps/web/priv/static/doc/Kakaranet-Scene.sketch/Data


+ 1 - 1
apps/web/priv/static/doc/Kakaranet-Scene.sketch/metadata

@@ -16,7 +16,7 @@
 		<string>ZapfDingbatsITC</string>
 	</array>
 	<key>length</key>
-	<integer>2882562</integer>
+	<integer>2882204</integer>
 	<key>version</key>
 	<integer>37</integer>
 </dict>

+ 21 - 8
apps/web/src/okey.erl

@@ -5,6 +5,7 @@
 -include_lib("server/include/settings.hrl").
 -include_lib("avz/include/avz.hrl").
 -include_lib("kvs/include/user.hrl").
+-include_lib("db/include/journal.hrl").
 
 -define(GAMEID, game_form()).
 
@@ -92,8 +93,12 @@ main() -> #dtl{file="index", bindings=[{title,<<"N2O">>},{body,body()}]}.
 
 send_roster(Pid) ->
 %    X = [ send_roster_item(User) || User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined],
-    X = [ {User#user.id,User#user.names,User#user.surnames} || User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined],
-    Lists = split(170,X,[]),
+    X = [ begin
+        Score = score(User#user.id),
+       {User#user.id,User#user.names,User#user.surnames,Score}
+       end || User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined],
+    XS = lists:sort(fun({_,_,_,S1},{_,_,_,S2}) -> S1 < S2 end,X),
+    Lists = split(170,XS,[]),
     [ send_roster_group(Pid,List) || List <- Lists],
     Pid ! {server,{roster_end,length(Lists)}},
     wf:info(?MODULE,"Users: ~p",[length(X)]).
@@ -102,11 +107,18 @@ split(N,[],Result) -> Result;
 split(N,List,Result) when length(List) < N -> Result ++ [List];
 split(N,List,Result) -> {A,B}=lists:split(N,List), Result ++ [A] ++ split(N,B,Result). 
 
+score(User) ->
+    Score = case kvs:get(reveal_log,User) of
+        {ok,#reveal_log{score=S}} -> S;
+        _ -> wf:info(?MODULE,"Score not found for User ~p",[User]), 0 end.
+
 already_online(Pid) ->
-    [ Pid ! {user_online,User} || {_,_,{_,User}} <- game:online() ].
+    [ begin 
+        Score = score(User#user.id),
+     Pid ! {user_online,User,Score} end || {_,_,{_,User}} <- game:online() ].
 
 send_roster_item(Pid,User) ->
-    Pid ! {server,{roster_item,User#user.id,User#user.names,User#user.surnames}}.
+    Pid ! {server,{roster_item,User#user.id,User#user.names,User#user.surnames,0}}.
 
 send_roster_group(Pid,List) ->
     wf:info(?MODULE,"User Group: ~p",[List]),
@@ -143,7 +155,7 @@ body2() ->
 
 event(terminate) -> 
     User = user(),
-    wf:send(broadcast,{user_offline,User}),
+    wf:send(broadcast,{user_offline,User,0}),
     wf:info(?MODULE,"EXTerminate",[]);
 
 event(init) -> 
@@ -198,7 +210,8 @@ event(attach) ->
     spawn(fun() ->
         send_roster(Pid),
         already_online(Pid),
-        wf:send(broadcast,{user_online,User})
+        Score = score(User#user.id),
+        wf:send(broadcast,{user_online,User,Score})
     end),
     ok;
 
@@ -435,8 +448,8 @@ event({server,terminate}) -> event(terminate);
 event({register,User}) -> wf:info(?MODULE,"Register: ~p",[User]), kvs:add(User), wf:user(User);
 event({login,User}) -> wf:info(?MODULE,"Login: ~p",[User]), kvs:put(User), wf:user(User), event(init);
 event({counter,Res}) -> Pid = self(), spawn(fun() -> Pid ! {server,{online_number,length(game:online())}} end);
-event({user_online,User}) -> wf:info(?MODULE,"User ~p goes Online",[User#user.id]), self() ! {server,{online,User#user.id,User#user.names,User#user.surnames}};
-event({user_offline,User}) -> self() ! {server,{offline,User#user.id,User#user.names,User#user.surnames}};
+event({user_online,User,Score}) -> wf:info(?MODULE,"User ~p goes Online",[User#user.id]), self() ! {server,{online,User#user.id,User#user.names,User#user.surnames,Score}};
+event({user_offline,User,Score}) -> self() ! {server,{offline,User#user.id,User#user.names,User#user.surnames,Score}};
 event(_Event) -> wf:info(?MODULE,"Unknown Event: ~p", [_Event]).
 
 %api_event(X,Y,Z) -> avz:api_event(X,Y,Z).