Maxim Sokhatsky 11 лет назад
Родитель
Сommit
5ecb82d48c

+ 1 - 1
apps/face/priv/static/google_sdk.js

@@ -3,7 +3,7 @@ function plusoneCallback(auth){
   else if(auth['access_token']) {
     gapi.client.load('oauth2', 'v2', function(){
       gapi.client.oauth2.userinfo.get().execute(function(oauthResp){
-            if(plusLogin) plusLogin(oauthResp);
+            if(plusLogin) {console.log(JSON.stringify(oauthResp)); plusLogin(oauthResp); }
      }); });
   } else if(auth['error']) { console.log('error'); }
 }

+ 84 - 88
apps/face/src/index.erl

@@ -8,7 +8,16 @@
 -include_lib("kvs/include/user.hrl").
 -jsmacro([take/2,attach/1,join/1,discard/3,player_info/2,reveal/4,piece/2,logout/0,pause/2]).
 
-user() -> case wf:user() of undefined -> #user{id="maxim"}; U->U end.
+-define(GAMEID, 1000001).
+
+user() -> 
+    case wf:user() of undefined ->
+        Imagionary = fake_users:imagionary_users(),
+        {Id,Name,Surname} = lists:nth(crypto:rand_uniform(1,length(Imagionary)),Imagionary),
+        X = #user{id = fake_users:fake_id(Id),
+                  names = Name,
+                  surnames = Surname},
+        wf:user(X), X; U-> U end.
 
 join(Game) ->
     ws:send(bert:encodebuf(bert:tuple(
@@ -59,19 +68,17 @@ reveal(GameId, Color, Value, Hand) ->
              {hand, Hand}])))).
 
 pause(GameId, Action) ->
-    ws:send(
-      bert:encodebuf(
+    ws:send(bert:encodebuf(bert:tuple(
+        bert:atom("client"),
         bert:tuple(
-          bert:atom("client"),
-          bert:tuple(
             bert:atom("pause_game"),
             bert:atom("undefined"),
             GameId,
-            bert:atom(Action)
-           )
-         )
-       )
-     ).
+            bert:atom(Action))))).
+
+color(Id,Color) -> wf:wire(wf:f("document.querySelector('#~s').style.color = \"~s\";",[Id,Color])).
+unselect(Id) -> color(Id,black).
+select(Id) -> color(Id,red).
 
 redraw_tiles(undefined) -> [];
 redraw_tiles([{Tile, _}| _ ] = TilesList) ->
@@ -81,8 +88,15 @@ redraw_tiles([{Tile, _}| _ ] = TilesList) ->
         options = [#option{label = CVBin, value = CVBin} || {CVBin, _} <- TilesList]}]).
 
 redraw_players(Players) ->
-    [wf:update(LabelId, [#label{id = LabelId, body = PlayerLabel}]) 
-     || {LabelId, _, PlayerLabel}  <- Players].
+    User = user(),
+    [ begin PN = player_name(PI),
+        wf:update(LabelId, [#label{id = LabelId,
+        style= case User#user.id == Id of
+            true -> "font-weight: bold;";
+            _ -> "" end, body = <<" ",PN/binary>>}]) 
+     end || {LabelId, _, #'PlayerInfo'{id=Id}=PI} <- Players].
+
+player_name(PI) -> auth_server:player_name(PI).
 
 main() -> #dtl{file="index", bindings=[{title,<<"N2O">>},{body,body()}]}.
 
@@ -129,24 +143,25 @@ body() ->
       #button{ id = player_info, body = <<"PlayerInfo">>, postback = player_info}
     ].
 
-event(terminate) -> wf:info("terminate");
-event(init) -> ok; %event(attach), event(join);
+event(terminate) -> wf:user(undefined), wf:info("terminate");
+event(init) -> event(attach), event(join);
 
 event(combo)  -> wf:info("Combo: ~p",[wf:q(discard_combo)]);
-event(join)   -> wf:wire(join("1000001"));
-event(take)   -> wf:wire(take("1000001", wf:q(take_combo)));
+event(join)   -> wf:wire(join(wf:to_list(?GAMEID)));
+event(take)   -> wf:wire(take(wf:to_list(?GAMEID), wf:q(take_combo)));
+
 event(player_info) -> 
     User = user(),
     wf:wire(player_info(wf:f("'~s'",[wf:to_list(User#user.id)]),wf:f("'~s'",[game_okey])));
+
 event(attach) -> 
     wf:info("ATTACH"),
     {ok,GamePid} = game_session:start_link(self()),
     wf:session(<<"game_pid">>,GamePid),
     User = user(),
-    Login = User#user.id,
-    put(okey_im, Login),
-    wf:info("Session User: ~p",[Login]),
-    Token = auth_server:generate_token(1000001,Login),
+    put(okey_im, User),
+    wf:info("Session User: ~p",[User]),
+    Token = auth_server:generate_token(?GAMEID,User),
     wf:wire(attach(wf:f("'~s'",[Token]))),
     ok;
 
@@ -155,10 +170,9 @@ event(discard) ->
     DiscardCombo = wf:q(discard_combo),
     case lists:keyfind(erlang:list_to_binary(DiscardCombo), 1, TilesList) of
     {_, {C, V}} ->
-        wf:wire(discard("1000001", erlang:integer_to_list(C), erlang:integer_to_list(V)));
+        wf:wire(discard(wf:to_list(?GAMEID), erlang:integer_to_list(C), erlang:integer_to_list(V)));
     false -> wf:info("Discard Combo: ~p",[DiscardCombo]) end;
 
-
 %event({binary,M}) -> {ok,<<"Hello">>};
 
 event({client,Message}) ->
@@ -168,27 +182,44 @@ event({client,Message}) ->
 
 event({server, {game_event, _, okey_game_started, Args}}) ->
     {_, Tiles} = lists:keyfind(tiles, 1, Args),
-    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ",
-                 erlang:integer_to_list(V)]), {C, V}} || {_, C, V} <- Tiles],
+    TilesList = [{wf:to_binary([wf:to_list(C)," ",wf:to_list(V)]), {C, V}} || {_, C, V} <- Tiles],
     %%wf:info("tiles ~p", [TilesList]),
     put(game_okey_tiles, TilesList),
     put(game_okey_pause, resume),
     redraw_tiles(TilesList);
 
 event({server, {game_event, _, okey_game_player_state, Args}}) ->
+
+    {_, WhosMove} = lists:keyfind(whos_move, 1, Args),
+    Players = get(okey_players),
+    {X, _, _} = lists:keyfind(WhosMove, 2, Players),
+    case X of
+        null -> skip;
+        false -> skip;
+        X -> select(X), put(okey_turn_mark,X) end,
+
     {_, Tiles} = lists:keyfind(tiles, 1, Args),
-    TilesList =
-        [
-         {erlang:list_to_binary([erlang:integer_to_list(C), " ", erlang:integer_to_list(V)]), {C, V}}
-         || {_, C, V} <- Tiles
-        ],
+    TilesList = [{wf:to_binary([wf:to_list(C)," ",wf:to_list(V)]),{C, V}}|| {_, C, V} <- Tiles],
     redraw_tiles(TilesList),
     put(game_okey_tiles, TilesList);
 
+event({server, {game_event, _, okey_tile_taken, Args}}) ->
+    Im = get(okey_im),
+    {_, Player} = lists:keyfind(player, 1, Args),
+    if
+       Im == Player ->
+            case lists:keyfind(revealed, 1, Args) of
+                {_, {_, C, V}} ->
+                    TilesList = [{wf:to_binary([wf:to_list(C), " ", wf:to_list(V)]), {C, V}} | get(game_okey_tiles)],
+                    put(game_okey_tiles, TilesList),
+                    redraw_tiles(TilesList);
+                _ -> ok end;
+       true -> ok end;
+
 event({server, {game_event, _, okey_tile_discarded, Args}}) ->
     Im = get(okey_im),
 %%    Players = get(okey_players),
-    {_, Player} = (catch lists:keyfind(player, 1, Args)),
+    {_, Player} = lists:keyfind(player, 1, Args),
 %%    wf:info("++++ ~p", [Args]),
 
     if
@@ -202,23 +233,6 @@ event({server, {game_event, _, okey_tile_discarded, Args}}) ->
             ok
     end;
 
-event({server, {game_event, _, okey_tile_taken, Args}}) ->
-    Im = get(okey_im),
-    {_, Player} = lists:keyfind(player, 1, Args),
-    if
-       Im == Player ->
-            case lists:keyfind(revealed, 1, Args) of
-                {_, {_, C, V}} ->
-                    TilesList = [{erlang:list_to_binary([erlang:integer_to_list(C), " ",
-                                  erlang:integer_to_list(V)]), {C, V}} | get(game_okey_tiles)],
-                    put(game_okey_tiles, TilesList),
-                    redraw_tiles(TilesList);
-                _ ->
-                    ok
-            end;
-       true ->
-            ok
-    end;
 
 event({server,{game_event, Game, okey_turn_timeout, Args}}) ->
     wf:info("okey_turn_timeout ~p", [Args]),
@@ -230,64 +244,46 @@ event({server,{game_event, Game, okey_turn_timeout, Args}}) ->
             [{player, get(okey_im)}, {tile, TileDiscarded}]}});
 
 event({server, {game_event, _, okey_game_info, Args}}) ->
-%%    wf:info("okay_game_info ~p", [Args]),
+%%  wf:info("okay_game_info ~p", [Args]),
     {_, PlayersInfo} = lists:keyfind(players, 1, Args),
 
-%%          [p1right_combo, p2right_combo, p3right_combo],
+%%  [p1right_combo, p2right_combo, p3right_combo],
 
     Players = 
         lists:zipwith(
-          fun(LabelId, {PlayerId, PlayerLabel}) ->
-                  {LabelId, PlayerId, PlayerLabel}
-          end,
-          [player1, player2, player3, player4],
-          lists:map(
-            fun
-                (#'PlayerInfo'{id = Id, robot = true}) ->
-                    {Id, <<Id/binary, <<" R ">>/binary>>};
-                (#'PlayerInfo'{id = Id, robot = false}) ->
-                    {Id, <<Id/binary, <<" M ">>/binary>>}
-            end,
-            PlayersInfo
-           )
-         ),
-    wf:info("players ~p", [Players]),
+          fun(LabelId, #'PlayerInfo'{id = Id}=PI) -> {LabelId, Id, PI} end,
+          [player1, player2, player3, player4], PlayersInfo),
     put(okey_players, Players),
-%%    put(pkey_game_right, [{p1right_combo, []}, {p2right_combo, []}, {p3right_combo, []}]),
+
+%   wf:info("players ~p", [Players]),
+
+%%  put(pkey_game_right, [{p1right_combo, []}, {p2right_combo, []}, {p3right_combo, []}]),
     redraw_players(Players);
 
 event({server,{game_event, _, player_left, Args}}) ->
     {_, OldPlayerId} = lists:keyfind(player, 1, Args),
-    wf:info("++++ pi ~p", [lists:keyfind(replacement, 1, Args)]),
-    {_, #'PlayerInfo'{id = NewPlayerId, robot = IsRobot}} = lists:keyfind(replacement, 1, Args),
+    {_, PI} = lists:keyfind(replacement, 1, Args),
+    #'PlayerInfo'{id = NewPlayerId, robot = IsRobot} = PI,
     OldPlayers = get(okey_players),
 
-    wf:info("left ~p replacment ~p is_robot ~p old players ~p", [OldPlayerId, NewPlayerId, IsRobot, OldPlayers]),
     {ListId, _, _} = lists:keyfind(OldPlayerId, 2, OldPlayers),
 
-    PlayerMark = case IsRobot of true -> <<" R ">>; false -> <<" M ">> end,
-    NewPlayers = 
-        lists:sort(fun({E1, _, _}, {E2, _, _}) -> E1 < E2 end,
-                   [{ListId, NewPlayerId, <<NewPlayerId/binary, PlayerMark/binary>>} | lists:keydelete(OldPlayerId, 2, OldPlayers)]
-                  ),
-    wf:info("+++++ new players ~p", [NewPlayers]),
+    NewPlayers = lists:sort(fun({E1, _, _}, {E2, _, _}) -> E1 < E2 end,
+        [{ListId, NewPlayerId, PI} | lists:keydelete(OldPlayerId, 2, OldPlayers)]),
+
     put(okey_players, NewPlayers),
-    redraw_players(NewPlayers);
+    redraw_players(NewPlayers),
+
+    case get(okey_turn_mark) of undefined -> ok; X -> select(X) end;
 
 event({server,{game_event, _, okey_next_turn, Args}}) ->
     {player, PlayerId} = lists:keyfind(player, 1, Args),
-    wf:info("im ~p next turn players ~p ~p", [get(okey_im), PlayerId, get(okey_players)]),
+%    wf:info("im ~p next turn players ~p ~p", [get(okey_im), PlayerId, get(okey_players)]),
     {LabelId, _, _} = lists:keyfind(PlayerId, 2, get(okey_players)),
     case get(okey_turn_mark) of
-        undefined ->
-            ok;
-        OldLabelId -> 
-            wf:wire("document.querySelector('#" ++ 
-                     erlang:atom_to_list(OldLabelId) ++ "').style.color = \"black\";")
-    end,
-    wf:wire("document.querySelector('#" ++ erlang:atom_to_list(LabelId) 
-        ++ "').style.color = \"red\";"),
-
+        undefined -> ok;
+        OldLabelId -> unselect(OldLabelId) end,
+    select(LabelId),
     put(okey_turn_mark, LabelId);
 
 event(reveal) ->
@@ -299,7 +295,7 @@ event(reveal) ->
             Hand = [{C,V} || {_, {C, V}} <- lists:keydelete(Key, 2, TilesList) ],
             HandJS = "[[" ++ string:join([
                 wf:f("bert.tuple(bert.atom('OkeyPiece'),~p,~p)",[C,V]) || {C,V} <- Hand],",") ++ "],[]]",
-            RevealJS = reveal("1000001",wf:f("~p",[CD]),wf:f("~p",[VD]),HandJS),
+            RevealJS = reveal(wf:to_list(?GAMEID),wf:f("~p",[CD]),wf:f("~p",[VD]),HandJS),
             wf:info("RevealJS: ~p",[lists:flatten(RevealJS)]),
             wf:wire(RevealJS);
         _ ->
@@ -313,7 +309,7 @@ event({login,User}) -> wf:info("Login: ~p",[User]), kvs:put(User), wf:user(User)
 event(pause) ->
     Action  =
         case get(game_okey_pause) of 
-            resume -> 
+            X when X == resume orelse X == undefined -> 
                 put(game_okey_pause, pause),
                 wf:update(pause, [#button{id = pause, body = "Resume", postback = pause}]),
                 "pause";
@@ -322,7 +318,7 @@ event(pause) ->
                 wf:update(pause, [#button{id = pause, body = <<"Pause">>, postback = pause}]),
                 "resume"
         end,
-    wf:wire(pause("1000001", wf:f("~p", [Action])));
+    wf:wire(pause(wf:to_list(?GAMEID), wf:f("~p", [Action])));
 
 event(Event)  -> ok. %wf:info("Event: ~p", [Event]).
 

+ 38 - 63
apps/server/src/auth_server.erl

@@ -13,45 +13,32 @@
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
 
 -define(SERVER, ?MODULE).
--define(SPARE_LOGINS, [#'PlayerInfo'{name = <<"Abe">>, surname="Kobo", login = <<"dunes">>, avatar_url = <<"/files/users/user_dunes/avatar/1-small.jpg">>},
-                       #'PlayerInfo'{name = <<"Herman">>, surname="Hesse", login = <<"wolves">>, avatar_url = <<"/files/users/user_wolves/avatar/1-small.jpg">>},
-                       #'PlayerInfo'{name = <<"Ernest">>, surname = <<"Hemingway">>, login = <<"oldman">>, avatar_url = <<"/files/users/user_oldman/avatar/1-small.jpg">>},
-                       #'PlayerInfo'{name = <<"Erich Maria">>, surname = <<"Remarque">>, login = <<"imwesten">>, avatar_url = <<"/files/users/user_imwesten/avatar/1-small.jpg">>}]).
+
+-define(SPARE_LOGINS, [
+    #'PlayerInfo'{name = <<"Albert">>, surname= <<"Einstein">>, login = <<"quantum">>, robot = true },
+    #'PlayerInfo'{name = <<"Marie">>, surname="Curie", login = <<"radio">>, robot = true },
+    #'PlayerInfo'{name = <<"Ilya">>, surname = <<"Prigogine">>, login = <<"synergetics">>, robot = true},
+    #'PlayerInfo'{name = <<"Mother">>, surname = <<"Teresa">>, login = <<"peace">>, robot = true}]).
 
 -record(state, {
           spare = ?SPARE_LOGINS,
           tokens
          }).
 
-%% definition of user from zealot/include/user.hrl
--record(user_info,
-        {username,
-         name,
-         surname,
-         age,
-	 avatar_url,
-         sex,
-         skill :: integer(),
-         score :: integer()}).
+spare() -> [ P#'PlayerInfo'{id =list_to_binary(binary_to_list(P#'PlayerInfo'.login) ++
+         integer_to_list(id_generator:get_id2()))} || P <- ?SPARE_LOGINS ].
 
 start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
 store_token(GameId, Token, UserId) when is_list(Token) -> store_token(GameId, list_to_binary(Token), UserId);
 store_token(GameId, Token, UserId) when is_binary(Token) -> gen_server:call(?SERVER, {store_token, GameId, Token, UserId}).
 get_user_info(Token) when is_list(Token)  -> get_user_info(list_to_binary(Token));
 get_user_info(Token) when is_binary(Token) -> gen_server:call(?SERVER, {get_user_info, Token}).
-get_user_info(Token, Id) when is_list(Token) -> get_user_info(list_to_binary(Token), Id);
-get_user_info(Token, Id) when is_list(Id) -> get_user_info(Token, list_to_binary(Id));
-get_user_info(Token, Id) when is_binary(Token), is_binary(Id) -> gen_server:call(?SERVER, {get_user_info, Token, Id}).
 get_user_info_by_user_id(UserId) when is_list(UserId) -> get_user_info_by_user_id(list_to_binary(UserId));
 get_user_info_by_user_id(UserId) -> user_info(UserId).
-fake_credentials() -> gen_server:call(?SERVER, {fake_credentials}).
-robot_credentials() -> gen_server:call(?SERVER, {robot_credentials}).
 generate_token(Game,User) -> T = base64:encode(crypto:rand_bytes(100)), store_token(Game,T,User).
 
 init([]) ->
     Tokens = ets:new(tokens, [private, ordered_set, {keypos, #authtoken.token}]),
-    store_token(0,Tokens, <<?TEST_TOKEN>>, "maxim"),
-    store_token(0,Tokens, <<?TEST_TOKEN2>>, "alice"),
     {ok, #state{tokens = Tokens}}.
 
 handle_call({store_token, GameId, Token, UserId}, _From, #state{tokens = E} = State) ->
@@ -59,72 +46,60 @@ handle_call({store_token, GameId, Token, UserId}, _From, #state{tokens = E} = St
     {reply, Token, State};
 
 handle_call({get_user_info, Token}, _From, #state{tokens = E} = State) ->
-    gas:info("checking token: ~p", [Token]),
     case ets:lookup(E, Token) of
         [] ->
-            gas:info("token not found", []),
+            gas:info(?MODULE,"Token not found. Denied.", []),
             {reply, false, State};
         List ->
             {authtoken, _, UserId} = hd(List),
-            gas:info("token was registred, getting user info for ~p",[UserId]),
             Reply = case user_info(UserId) of
-                {ok, UserInfo} ->
-                    gas:info("..user info retrieved", []),
-                    UserInfo;
                 {error, not_found} ->
-                    gas:info("..no such user info, providing fake credentials", []),
-                    fake_credentials0(State#state.spare); %% for eunit tests. FIX
-                {badrpc, _} ->
-                    gas:info("..bad rpc, providing fake credentials", []),
-                    fake_credentials0(State#state.spare)  %% for eunit tests. FIX
+                    gas:info(?MODULE,"User is not in DB", []),
+                    user_info(#user{id = UserId });
+                UserInfo ->
+                    gas:info(?MODULE,"Registered User", []),
+                    UserInfo
             end,
             {reply, Reply, State}
     end;
 
-handle_call({get_user_info, Token, Id}, _From, #state{tokens = E} = State) ->
-    gas:info("checking token: ~p", [Token]),
-    case ets:lookup(E, Token) of
-        [] ->
-            gas:error("token not found", []),
-            {reply, false, State};
-        _List ->
-            Reply0 = fake_credentials0(State#state.spare),
-            Reply = Reply0#'PlayerInfo'{id = Id},
-            {reply, Reply, State}
-    end;
-
-
-handle_call({fake_credentials}, _From, #state{spare = Spare} = State) -> H = fake_credentials0(Spare), {reply, H, State};
-handle_call({robot_credentials}, _From, #state{spare = Spare} = State) -> H = fake_credentials0(Spare), {reply, H#'PlayerInfo'{robot = true}, State};
 handle_call(_Request, _From, State) -> Reply = ok, {reply, Reply, State}.
 handle_cast(_Msg, State) -> {noreply, State}.
 handle_info(_Info, State) -> {noreply, State}.
 terminate(_Reason, _State) -> ok.
 code_change(_OldVsn, State, _Extra) -> {ok, State}.
 
-fake_credentials0(Spare) ->
-    Pos = crypto:rand_uniform(1, length(Spare)),
-    H0 = lists:nth(Pos, Spare),
+robot_credentials() ->
+    Pos = crypto:rand_uniform(1, length(?SPARE_LOGINS) + 1),
+    H0 = lists:nth(Pos, ?SPARE_LOGINS),
     Id = list_to_binary(binary_to_list(H0#'PlayerInfo'.login) ++
          integer_to_list(id_generator:get_id2())),
     H0#'PlayerInfo'{id = Id}.
 
 store_token(GameId, E, Token, UserId) ->
-    gas:info("storing token: ~p", [Token]),
+    gas:info(?MODULE,"Storing token: ~p", [Token]),
     Data = #authtoken{token = Token, id = UserId},
     ets:insert(E, Data).
 
-user_info(UserId) ->
+player_name(#'PlayerInfo'{login = Id, name = Name, surname = Surname}) ->
+    wf:to_binary([case Name of <<"undefined">> -> Id;
+              _ -> wf:to_list(Name) ++ case Surname of
+                     <<"undefined">> -> ""; _ -> " " ++ wf:to_list(Surname) end end]).
+
+user_info(#user{}=UserData) ->
+%    gas:info(?MODULE,"PlayerInfo by #user: ~p",[UserData]),
+    #'PlayerInfo'{id = wf:to_binary(UserData#user.id),
+        login = wf:to_binary(UserData#user.username),
+        name = wf:to_binary(UserData#user.names),
+        avatar_url = wf:to_binary(UserData#user.avatar),
+        skill = 0,
+        score = 0,
+        surname = wf:to_binary(UserData#user.surnames)};
+
+
+user_info(UserId) when is_list(UserId); is_binary(UserId) ->
     case kvs:get(user,UserId) of
         {ok, UserData} ->
-            gas:info("User Data: ~p",[UserData]),
-            {ok, #'PlayerInfo'{id = wf:to_binary(UserData#user.id),
-                               login = wf:to_binary(UserData#user.username),
-                               name = wf:to_binary(UserData#user.id),
-                               avatar_url = wf:to_binary(UserData#user.avatar),
-                               skill = 0,
-                               score = 0,
-                               surname = wf:to_binary(UserData#user.surnames)}};
-        Error ->
-            Error
-    end.
+%            gas:info(?MODULE,"User Data: ~p",[UserData]),
+            user_info(UserData);
+        Error -> Error end.

+ 14 - 3
apps/server/src/fake_users.erl

@@ -19,10 +19,21 @@ surnames() ->
     "ozbek","ozcan","ozdemir","ozden","ozturk","pasa","polat","sezer","sahin","sen",
     "simsek","tekin","tosun","tunc","turan","unal","yalcin","yazici","yildirim","yilmaz"].
 
-ima_gio(N) -> {MD5,Name} = lists:nth(N,imagionary_users()), Name.
-ima_gio(N,L) -> {MD5,Name} = lists:nth(N,L), Name.
+ima_gio(N) -> {Id,Name,Surname} = lists:nth(N,imagionary_users()), Id.
+ima_gio(N,L) -> {Id,Name,Surname} = lists:nth(N,L), Id.
 
 imagionary_users() ->
-    List = [{crypto:md5(X++Y),X++"_"++Y}||X<-names(),Y<-surnames()],
+    List = [ begin
+        [HX|TX] = X, NX = [string:to_upper(HX)] ++ TX,
+        [HY|TY] = Y, NY = [string:to_upper(HY)] ++ TY,
+        {wf:to_binary(X++"_"++Y),wf:to_binary(NX),wf:to_binary(NY)}
+    end || X<-names(), Y<-surnames()],
     lists:keysort(1,List).
 
+fake_id() ->
+    FakeUsers = fake_users:imagionary_users(),
+    Pos = crypto:rand_uniform(1, length(FakeUsers)),
+    H0 = fake_users:ima_gio(Pos,FakeUsers),
+    Id = wf:to_binary(wf:to_list(H0) ++ wf:to_list(id_generator:get_id2())).
+
+fake_id(Login) -> wf:to_binary(wf:to_list(Login) ++ wf:to_list(id_generator:get_id2())).

+ 3 - 1
apps/server/src/game_manager.erl

@@ -17,7 +17,8 @@ destroy_game(Pid,Sup) -> game_sup:stop_game(Sup,Pid).
 gen_game_id() ->
     PoolNum = wf:config(nsx_idgen,game_pool,5000000) div 1000000,
     PoolNumStr = integer_to_list(PoolNum),
-    nsm_db:next_id("game_id_pool_"++PoolNumStr, PoolNum*1000000 + 200, 1). %% 200 is reserved for lucky games and for already created games
+    PoolNum*1000000 + 200 + kvs:next_id("game_table", 1).
+     %% 200 is reserved for lucky games and for already created games
 
 create_game(GameId, GameFSM, Params) ->
     {ok, Pid} = create_game_monitor(GameId, GameFSM, Params),
@@ -448,6 +449,7 @@ start_tournament(TrnId,NumberOfTournaments,NumberOfPlayers,_Quota,_Tours,_Speed,
 %%                        false -> [lists:nth(N,RealPlayers)||N<-lists:seq(1,NumberOfPlayers)] end,
 
     RealPlayersNumber = length(RealPlayers),
+
     Registrants = if NumberOfPlayers == RealPlayersNumber -> RealPlayers;
                      NumberOfPlayers > RealPlayersNumber ->
                          RealPlayers ++ [list_to_binary(fake_users:ima_gio(N)) ||

+ 1 - 1
apps/server/src/game_sup.erl

@@ -25,5 +25,5 @@ init([]) ->
     TavlaSup = {tavla_sup, {tavla_sup, start_link, []}, Restart, Shutdown, supervisor, [tavla_sup]},
     OkeySup = {okey_sup, {okey_sup, start_link, []}, Restart, Shutdown, supervisor, [okey_sup]},
     LuckySup = {lucky_sup, {lucky_sup, start_link, []}, Restart, Shutdown, supervisor, [lucky_sup]},
-    {ok, {SupFlags, [IdGen,GameManager,LuckySup,TavlaSup,OkeySup,AuthServer,GameStats]}}.
+    {ok, {SupFlags, [IdGen,GameManager,LuckySup,AuthServer,GameStats,TavlaSup,OkeySup]}}.
 

+ 1 - 1
apps/server/src/gas.erl

@@ -2,7 +2,7 @@
 -compile(export_all).
 
 %-define(ALLOWED, [gas,nsg_trn_lucky,game_session,game_manager,game_okey_ng_table_trn]).
--define(ALLOWED, [gas]).
+-define(ALLOWED, [gas,auth_server]).
 
 log(Module, String, Args, Fun) ->
     case lists:member(Module,?ALLOWED) of

+ 12 - 9
apps/server/src/nsg_crowd_lib.erl

@@ -12,10 +12,13 @@
 
 create_users(A,B) ->
     ImagioUsers = fake_users:imagionary_users(),
-    [ begin U = #user{username = fake_users:ima_gio(N,ImagioUsers),
-                            id = fake_users:ima_gio(N,ImagioUsers),
-                            birth={1981,9,29}
-                           }, kvs:put(U) end || N <- lists:seq(A, B) ].
+    [ begin 
+        {Id,Name,Surname} = lists:nth(N,ImagioUsers),
+        U = #user{  username = Id,
+                    id = Id,
+                    names = Name,
+                    surnames = Surname,
+                    birth={1981,9,29} }, kvs:put(U) end || N <- lists:seq(A, B) ].
 
 virtual_users() ->
     case kvs:get(user,"maxim@synrc.com") of
@@ -23,12 +26,12 @@ virtual_users() ->
                 create_users(1,100), kvs:put(#user{id="maxim@synrc.com"});
         {ok,_} -> skip end,
 
-    {_, AllUsers} = lists:unzip(fake_users:imagionary_users()),
-    F = fun(UserId, Acc) ->
+    AllUsers = fake_users:imagionary_users(),
+    F = fun({UserId,_,_}, Acc) ->
         User = auth_server:get_user_info_by_user_id(UserId),
         case User of
-                    {ok, _} -> [UserId | Acc];
-                    {error,_} -> Acc
+                    {error,_} -> Acc;
+                    _ -> [UserId | Acc]
                 end
         end,
     lists:usort(lists:foldl(F, [], AllUsers)).
@@ -39,7 +42,7 @@ random_users(Num, AllUsers) ->
 
 random_users(0, Acc, _AllUsers, _AllUsersNum) -> Acc;
 random_users(N, Acc, AllUsers, AllUsersNum) ->
-    User = list_to_binary(lists:nth(crypto:rand_uniform(1, AllUsersNum + 1), AllUsers)),
+    User = lists:nth(crypto:rand_uniform(1, AllUsersNum + 1), AllUsers),
     case lists:member(User, Acc) of
         false -> random_users(N - 1, [User | Acc], AllUsers, AllUsersNum);
         true -> random_users(N, Acc, AllUsers, AllUsersNum)

+ 1 - 1
apps/server/src/nsg_trn_elimination.erl

@@ -877,7 +877,7 @@ setup_tables(TableModule, Players, PlayersPerTable, TTable, Tour,
 %% setup_players(Registrants) -> Players
 setup_players(Registrants) ->
     F = fun(UserId, {Acc, PlayerId}) ->
-                {ok, UserInfo} = auth_server:get_user_info_by_user_id(UserId),
+                UserInfo = auth_server:get_user_info_by_user_id(UserId),
                 NewAcc = store_player(#player{id = PlayerId, user_id = UserId,
                                               user_info = UserInfo, status = active}, Acc),
                 {NewAcc, PlayerId + 1}

+ 8 - 6
apps/server/src/nsg_trn_lucky.erl

@@ -719,16 +719,18 @@ del_seats_by_table_id(TabId, Seats) ->
         end,
     lists:foldl(F, Seats, find_seats_by_table_id(TabId, Seats)).
 
+spawn_bots(GameId, BotModule, 1) ->
+    [ spawn_bot(BotModule, GameId, auth_server:robot_credentials()) ];
 spawn_bots(GameId, BotModule, BotsNum) ->
-    [spawn_bot(BotModule, GameId) || _ <- lists:seq(1, BotsNum)].
+    [ spawn_bot(BotModule, GameId, PlayerInfo) 
+     || PlayerInfo <- lists:sublist(auth_server:spare(),BotsNum) ].
 
-spawn_bot(BotModule, GameId) ->
-    {NPid, UserInfo} = create_robot(BotModule, GameId),
+spawn_bot(BotModule, GameId, PlayerInfo) ->
+    {NPid, UserInfo} = create_robot(BotModule, GameId, PlayerInfo),
     BotModule:join_game(NPid),
-    UserInfo.
+    PlayerInfo.
 
-create_robot(BotModule, GameId) ->
-    UserInfo = auth_server:robot_credentials(),
+create_robot(BotModule, GameId, UserInfo) ->
     {ok, NPid} = BotModule:start(self(), UserInfo, GameId),
     BotModule:get_session(NPid), %% Hack for the game_tavla_bot. Creates a game session process.
     {NPid, UserInfo}.

+ 1 - 1
apps/server/src/nsg_trn_standalone.erl

@@ -778,7 +778,7 @@ setup_players(Registrants, GameId, BotModule) ->
                                               user_info = UserInfo, is_bot = true}, Acc),
                 {NewAcc, PlayerId + 1};
            (UserId, {Acc, PlayerId}) ->
-                {ok, UserInfo} = auth_server:get_user_info_by_user_id(UserId),
+                UserInfo = auth_server:get_user_info_by_user_id(UserId),
                 NewAcc = store_player(#player{id = PlayerId, user_id = UserId,
                                               user_info = UserInfo, is_bot = false}, Acc),
                 {NewAcc, PlayerId + 1}

+ 1 - 1
apps/server/src/okey/game_okey_ng_desk.erl

@@ -404,7 +404,7 @@ handle_player_action(PlayerId, {reveal, Tash, TashPlaces}, ?STATE_DISCARD,
     end;
 
 handle_player_action(_PlayerId, _Action, _StateName, _StateData) ->
-    ?ERROR("OKEY_NG_DESK Invalid action passed. Player: ~p. Action: ~p. StateName: ~p.",
+    ?ERROR("OKEY_NG_DESK Invalid action passed. Player: ~p.~n Action: ~p. StateName: ~p.",
            [_PlayerId, _Action, _StateName]),
     {error, invalid_action}.
 

+ 1 - 1
apps/server/src/tavla/game_tavla_ng_trn_paired.erl

@@ -1017,7 +1017,7 @@ setup_players(Registrants, GameId, BotModule) ->
                                               user_info = UserInfo, is_bot = true}, Acc),
                 {NewAcc, PlayerId + 1};
            (UserId, {Acc, PlayerId}) ->
-                {ok, UserInfo} = auth_server:get_user_info_by_user_id(UserId),
+                UserInfo = auth_server:get_user_info_by_user_id(UserId),
                 NewAcc = store_player(#player{id = PlayerId, user_id = UserId,
                                               user_info = UserInfo, is_bot = false}, Acc),
                 {NewAcc, PlayerId + 1}

+ 1 - 1
apps/server/src/tavla_sup.erl

@@ -35,7 +35,7 @@ tavla_standalone_specs(GamesNum, VirtUsersPerTable) ->
        true ->
            F = fun(_) ->
                        GameId = game_manager:gen_game_id(),
-                       GameName = "Tavla/Crowd game - " ++ erlang:integer_to_list(GameId),
+                       GameName = "Tavla/Crowd game: " ++ erlang:integer_to_list(GameId),
                        Users = nsg_crowd_lib:random_users(VirtUsersPerTable, VirtualUsers),
 %%%                    Users = [robot],
                        TableParams = [