okey.erl 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. -module(okey).
  2. -compile(export_all).
  3. -include_lib("n2o/include/wf.hrl").
  4. -include_lib("server/include/requests.hrl").
  5. -include_lib("server/include/settings.hrl").
  6. -include_lib("avz/include/avz.hrl").
  7. -include_lib("kvs/include/user.hrl").
  8. -include_lib("db/include/journal.hrl").
  9. -define(GAMEID, game_form()).
  10. game_form() ->
  11. case wf:qs(<<"game">>) of
  12. undefined -> 1000001;
  13. X -> wf:to_integer(X) end.
  14. new_user() ->
  15. Imagionary = anonymous:imagionary_users(),
  16. {Id,Name,Surname,Sex} = lists:nth(crypto:rand_uniform(1,length(Imagionary)),Imagionary),
  17. FakeId = anonymous:fake_id(Id),
  18. X = #user{
  19. id = FakeId,
  20. sex = Sex,
  21. tokens=[{n2o,get(session_id)}],
  22. names = Name,
  23. surnames = Surname},
  24. wf:wire(wf:f("document.cookie='~s=~s; path=/; expires=~s';",
  25. ["n2o-name",wf:to_list(FakeId),js_session:cookie_expire(js_session:ttl())])),
  26. kvs:put(X),
  27. X.
  28. new_facebook_user(User) ->
  29. ExistingUser = user(),
  30. Score = proplists:get_value(score,ExistingUser#user.tokens,0),
  31. Skill = case kvs:get(reveal_log, User#user.id) of
  32. {ok,RL} -> RL#reveal_log.skill;
  33. _ -> 0 end,
  34. U1 = User#user{tokens=game:plist_setkey(score,1,User#user.tokens,{score,Score})},
  35. U2 = U1#user{tokens=game:plist_setkey(n2o,1,U1#user.tokens,{n2o,get(session_id)})},
  36. U3 = U2#user{tokens=game:plist_setkey(skill,1,U2#user.tokens,{skill,Skill})},
  37. kvs:put(U3),
  38. send_auth_cookies(U3),
  39. U3.
  40. send_auth_cookies(User) ->
  41. wf:wire(wf:f("document.cookie='~s=~s; path=/; expires=~s';",
  42. ["n2o-name",wf:to_list(User#user.id),
  43. js_session:cookie_expire(js_session:ttl())])),
  44. wf:wire(wf:f("document.cookie='~s=~s; path=/; expires=~s';",
  45. ["n2o-sid",wf:to_list(proplists:get_value(n2o,User#user.tokens)),
  46. js_session:cookie_expire(js_session:ttl())])),
  47. wf:user(User),
  48. ok.
  49. user() ->
  50. case wf:user() of
  51. undefined ->
  52. SessionUser = wf:cookie_req(<<"n2o-name">>,?REQ),
  53. SessionId = get(session_id),
  54. wf:info(?MODULE,"Auth User: ~p",[SessionUser]),
  55. wf:info(?MODULE,"Auth Id: ~p",[SessionId]),
  56. X = case kvs:get(user,SessionUser) of
  57. {ok,User} ->
  58. SS = lists:keyfind(n2o,1,User#user.tokens),
  59. case SS of
  60. {n2o,SessionId} -> User;
  61. _ -> new_user() end;
  62. _ -> new_user() end,
  63. wf:user(X),
  64. X;
  65. U-> U end.
  66. player_name(PI) -> auth_server:player_name(PI).
  67. main() -> #dtl{file="index", bindings=[{title,<<"N2O">>},{body,[]}]}.
  68. patch_users() ->
  69. [ begin
  70. Score = score_journal(User),
  71. Sex = case User#user.sex of undefined -> male; S -> S end,
  72. case Score of
  73. 0 -> kvs:delete(user,User#user.id);
  74. _ -> kvs:put(User#user{sex=Sex,
  75. tokens=game:plist_setkey(score,1,Tokens,{score,Score})}) end
  76. end|| User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined].
  77. send_roster(Pid) ->
  78. % X = [ send_roster_item(User) || User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined],
  79. X = [ begin
  80. {User#user.id,User#user.names,User#user.surnames,score(User)}
  81. end || User=#user{tokens=Tokens} <- kvs:all(user), Tokens /= [], Tokens /= undefined, proplists:get_value(score,Tokens,0) /= 0],
  82. XS = lists:sort(fun({_,_,_,S1},{_,_,_,S2}) -> S1 > S2 end,X),
  83. Lists = [lists:sublist(XS,100)], %split(170,XS,[]),
  84. [ send_roster_group(Pid,List) || List <- Lists],
  85. Pid ! {server,{roster_end,length(Lists)}},
  86. wf:info(?MODULE,"Users: ~p",[length(X)]).
  87. split(N,[],Result) -> Result;
  88. split(N,List,Result) when length(List) < N -> Result ++ [List];
  89. split(N,List,Result) -> {A,B}=lists:split(N,List), Result ++ [A] ++ split(N,B,Result).
  90. score(User) -> proplists:get_value(score,User#user.tokens,0).
  91. score_journal(User) ->
  92. Score = case kvs:get(reveal_log,User#user.id) of
  93. {ok,#reveal_log{score=S}} -> S;
  94. _ -> wf:info(?MODULE,"Score not found for User ~p",[User#user.id]), 0 end.
  95. already_online(Pid) ->
  96. [ Pid ! {user_online,User} || {_,_,{_,User}} <- game:online() ].
  97. send_roster_item(Pid,User) ->
  98. Pid ! {server,{roster_item,User#user.id,User#user.names,User#user.surnames,0}}.
  99. send_roster_group(Pid,List) ->
  100. wf:info(?MODULE,"User Group: ~p",[List]),
  101. Pid ! {server,{roster_group,List}}.
  102. event(terminate) ->
  103. User = user(),
  104. wf:send(broadcast,{user_offline,User}),
  105. wf:info(?MODULE,"EXTerminate",[]);
  106. event(init) ->
  107. js_session:ensure_sid([],?CTX),
  108. event(attach),
  109. event(join);
  110. event(join) ->
  111. GameId = get(okey_game_id),
  112. wf:wire(#api{name=fbLogin, tag=fb}),
  113. wf:wire(protocol:join(wf:to_list(GameId)));
  114. event(attach) ->
  115. {ok,GamePid} = game_session:start_link(self()),
  116. wf:session(<<"game_pid">>,GamePid),
  117. User = user(),
  118. wf:reg(User#user.id),
  119. wf:info(?MODULE,"User Attach: ~p",[User]),
  120. gproc:set_value({p,l,broadcast},{wf:peer(?REQ),User}),
  121. wf:info(?MODULE,"Games Online: ~p",[game:online()]),
  122. put(okey_im, User#user.id),
  123. wf:wire(wf:f("document.user = '~s';document.names = '~s';document.surnames = '~s';",
  124. [User#user.id,User#user.names,User#user.surnames])),
  125. wf:info(?MODULE,"Session User: ~p",[User]),
  126. GameId = case wf:q(games_ids) of undefined -> ?GAMEID; Res -> Res end,
  127. put(okey_game_id, GameId),
  128. Token = auth_server:generate_token(GameId,User#user.id),
  129. wf:info(?MODULE,"Game Token: ~p",[Token]),
  130. wf:wire(protocol:attach(wf:f("'~s'",[Token]))),
  131. Pid = self(),
  132. spawn(fun() ->
  133. send_roster(Pid),
  134. already_online(Pid),
  135. wf:send(broadcast,{user_online,User})
  136. end),
  137. ok;
  138. event({client,{message,From,Name,To,Message}}) ->
  139. wf:info(?MODULE,"Online Chat Message from ~p(~p) to ~p:~n ~p~n",[From,Name,To,Message]),
  140. wf:send(To,{server,{chat_message,{From,Name},To,wf:to_binary(Message)}}),
  141. ok;
  142. event({client,Message}) ->
  143. wf:info(?MODULE,"Client: ~p", [Message]),
  144. case wf:session(<<"game_pid">>) of
  145. undefined -> skip;
  146. GamePid -> SyncRes = game_session:process_request(GamePid, Message),
  147. wf:info(?MODULE,"Sync Result: ~p",[SyncRes]) end;
  148. event({server,{roster_group,List}}) -> skip;
  149. event({server,terminate}) -> event(terminate);
  150. event({server,{update_score,Score}}) ->
  151. User = user(),
  152. NewUser = User#user{tokens=game:plist_setkey(score,1,User#user.tokens,{score,Score})},
  153. wf:user(NewUser),
  154. gproc:set_value({p,l,broadcast},{wf:peer(?REQ),NewUser}),
  155. wf:info(?MODULE,"User Process Updated Score ~p ~p",[User#user.id,Score]),
  156. wf:send(broadcast,{user_online,NewUser}),
  157. ok;
  158. event({counter,Res}) -> Pid = self(), spawn(fun() -> Pid ! {server,{online_number,length(game:online())}} end);
  159. 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,score(User)}};
  160. event({user_offline,User}) -> self() ! {server,{offline,User#user.id,User#user.names,User#user.surnames,score(User)}};
  161. event({register,User}) -> wf:info(?MODULE,"Register: ~p",[User]), wf:send(broadcast,{user_offline,user()}), new_facebook_user(User), wf:wire("window.location='https://kakaranet.com'");
  162. event({login,User}) -> wf:info(?MODULE,"Login: ~p",[User]), wf:send(broadcast,{user_offline,user()}), send_auth_cookies(User), wf:wire("window.location='https://kakaranet.com'");
  163. event(_Event) -> wf:info(?MODULE,"Unknown Event: ~p", [_Event]).
  164. api_event(X,Y,Z) -> avz:api_event(X,Y,Z).