okey.erl 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. -module(okey).
  2. -compile(export_all).
  3. -include_lib("n2o/include/wf.hrl").
  4. -include("requests.hrl").
  5. -include("settings.hrl").
  6. -include_lib("avz/include/avz.hrl").
  7. -include_lib("kvs/include/user.hrl").
  8. -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,integer_to_binary(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}) ->
  83. binary_to_integer(S1) > binary_to_integer(S2) end,X),
  84. Lists = [lists:sublist(XS,100)], %split(170,XS,[]),
  85. [ send_roster_group(Pid,List) || List <- Lists],
  86. Pid ! {server,{roster_end,length(Lists)}},
  87. wf:info(?MODULE,"Users: ~p",[length(X)]).
  88. split(N,[],Result) -> Result;
  89. split(N,List,Result) when length(List) < N -> Result ++ [List];
  90. split(N,List,Result) -> {A,B}=lists:split(N,List), Result ++ [A] ++ split(N,B,Result).
  91. score(User) -> proplists:get_value(score,User#user.tokens,0).
  92. score_journal(User) ->
  93. Score = case kvs:get(reveal_log,User#user.id) of
  94. {ok,#reveal_log{score=S}} -> S;
  95. _ -> wf:info(?MODULE,"Score not found for User ~p",[User#user.id]), 0 end.
  96. already_online(Pid) ->
  97. [ Pid ! {user_online,User} || {_,_,{_,User}} <- game:online() ].
  98. send_roster_item(Pid,User) ->
  99. Pid ! {server,{roster_item,User#user.id,User#user.names,User#user.surnames,0}}.
  100. send_roster_group(Pid,List) ->
  101. wf:info(?MODULE,"User Group: ~p",[List]),
  102. Pid ! {server,{roster_group,List}}.
  103. event(terminate) ->
  104. User = user(),
  105. wf:send(broadcast,{user_offline,User}),
  106. wf:info(?MODULE,"EXTerminate",[]);
  107. event(init) ->
  108. js_session:ensure_sid([],?CTX),
  109. event(attach),
  110. event(join);
  111. event(join) ->
  112. GameId = get(okey_game_id),
  113. wf:wire(#api{name=fbLogin, tag=fb}),
  114. wf:wire(protocol:join(wf:to_list(GameId)));
  115. event(attach) ->
  116. {ok,GamePid} = game_session:start_link(self()),
  117. wf:session(<<"game_pid">>,GamePid),
  118. User = user(),
  119. wf:reg(User#user.id),
  120. wf:info(?MODULE,"User Attach: ~p",[User]),
  121. gproc:set_value({p,l,broadcast},{wf:peer(?REQ),User}),
  122. wf:info(?MODULE,"Games Online: ~p",[game:online()]),
  123. put(okey_im, User#user.id),
  124. wf:wire(wf:f("document.user = '~s';document.names = '~s';document.surnames = '~s';",
  125. [User#user.id,User#user.names,User#user.surnames])),
  126. wf:info(?MODULE,"Session User: ~p",[User]),
  127. GameId = case wf:q(games_ids) of undefined -> ?GAMEID; Res -> Res end,
  128. put(okey_game_id, GameId),
  129. Token = auth_server:generate_token(GameId,User#user.id),
  130. wf:info(?MODULE,"Game Token: ~p",[Token]),
  131. wf:wire(protocol:attach(wf:f("'~s'",[Token]))),
  132. Pid = self(),
  133. spawn(fun() ->
  134. send_roster(Pid),
  135. already_online(Pid),
  136. wf:send(broadcast,{user_online,User})
  137. end),
  138. ok;
  139. event(logout) ->
  140. wf:wire(protocol:logout());
  141. event({client,{message,From,Name,To,Message}}) ->
  142. wf:info(?MODULE,"Online Chat Message from ~p(~p) to ~p:~n ~p~n",[From,Name,To,Message]),
  143. wf:send(To,{server,{chat_message,{From,Name},To,wf:to_binary(Message)}}),
  144. ok;
  145. event({client,Message}) ->
  146. wf:info(?MODULE,"Client: ~p", [Message]),
  147. case wf:session(<<"game_pid">>) of
  148. undefined -> skip;
  149. GamePid -> SyncRes = game_session:process_request(GamePid, Message),
  150. wf:info(?MODULE,"Sync Result: ~p",[SyncRes]) end;
  151. event({server,{roster_group,List}}) -> skip;
  152. event({server,terminate}) -> event(terminate);
  153. event({server,{update_score,Score}}) ->
  154. User = user(),
  155. NewUser = User#user{tokens=game:plist_setkey(score,1,User#user.tokens,{score,Score})},
  156. wf:user(NewUser),
  157. gproc:set_value({p,l,broadcast},{wf:peer(?REQ),NewUser}),
  158. wf:info(?MODULE,"User Process Updated Score ~p ~p",[User#user.id,Score]),
  159. wf:send(broadcast,{user_online,NewUser}),
  160. ok;
  161. event({counter,Res}) -> Pid = self(), spawn(fun() -> Pid ! {server,{online_number,length(game:online())}} end);
  162. event({user_online,User}) ->
  163. wf:info(?MODULE,"User ~p goes Online",[User#user.id]),
  164. Id = User#user.id,
  165. Names = User#user.names,
  166. Surnames = User#user.surnames,
  167. Score = score(User),
  168. self() ! {server,{online,Id,Names,Surnames,integer_to_binary(Score)}};
  169. event({user_offline,User}) ->
  170. Id = User#user.id,
  171. Names = User#user.names,
  172. Surnames = User#user.surnames,
  173. Score = score(User),
  174. self() ! {server,{offline,Id,Names,Surnames,integer_to_binary(Score)}};
  175. event({register,User}) ->
  176. wf:info(?MODULE,"Register: ~p",[User]),
  177. wf:send(broadcast,{user_offline,user()}),
  178. new_facebook_user(User),
  179. wf:wire("window.location='https://kakaranet.com'");
  180. event({login,User}) ->
  181. wf:info(?MODULE,"Login: ~p",[User]),
  182. wf:send(broadcast,{user_offline,user()}),
  183. send_auth_cookies(User),
  184. % event(logout),
  185. % event(attach),
  186. % event(join),
  187. wf:wire("window.location='https://kakaranet.com'");
  188. event(_Event) -> wf:info(?MODULE,"Unknown Event: ~p", [_Event]).
  189. api_event(X,Y,Z) -> avz:api_event(X,Y,Z).