facebook.erl 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. -module(facebook).
  2. %%-author('Andrii Zadorozhnii').
  3. -include_lib("avz/include/avz.hrl").
  4. -include_lib("nitro/include/nitro.hrl").
  5. -include_lib("n4u/include/wf.hrl"). %% todo unbind avz -- todo avz usage example without nitro and n4u (n2o v4.4 fork) framework
  6. -include_lib("kvs/include/user.hrl").
  7. -export([
  8. sdk/0, % JavaScript for page embedding for JavaScript based login methods
  9. login_button/0, % HTML Button for page embedding
  10. event/1, % Page Event for HTTP redirect based login methods
  11. api_event/3, % Page Event for JavaScript based login methods
  12. email_prop/2,
  13. callback/0, % Callback part of HTTP redirect based login methods
  14. registration_data/3, % Process Parameters
  15. index/1
  16. ]).
  17. -define(FB_APP_ID, application:get_env(avz, fb_id, [])).
  18. callback() -> ok.
  19. event({facebook,_Event}) -> wf:wire("fb_login();"), ok.
  20. api_event(fbLogin, Args, _Term) -> {JSArgs} = ?AVZ_JSON:decode(list_to_binary(Args)), avz:login(facebook, JSArgs).
  21. registration_data(Props, facebook, Ori)->
  22. Id = proplists:get_value(<<"id">>, Props),
  23. BirthDay = case proplists:get_value(<<"birthday">>, Props) of
  24. undefined -> {1, 1, 1970};
  25. BD -> list_to_tuple([list_to_integer(X) || X <- string:tokens(binary_to_list(BD), "/")]) end,
  26. Email = proplists:get_value(<<"email">>, Props),
  27. [UserName|_] = string:tokens(binary_to_list(Email),"@"),
  28. Cover = case proplists:get_value(<<"cover">>,Props) of undefined -> ""; {P} -> case proplists:get_value(<<"source">>,P) of undefined -> ""; C -> binary_to_list(C) end end,
  29. Ori#user{ display_name = UserName,
  30. images = avz:update({fb_cover,Cover},avz:update({fb_avatar,"https://graph.facebook.com/" ++ binary_to_list(Id) ++ "/picture?type=large"},Ori#user.images)),
  31. email = Email,
  32. names = proplists:get_value(<<"first_name">>, Props),
  33. surnames = proplists:get_value(<<"last_name">>, Props),
  34. tokens = avz:update({facebook,Id},Ori#user.tokens),
  35. birth = {element(3, BirthDay), element(1, BirthDay), element(2, BirthDay)},
  36. register_date = os:timestamp(),
  37. status = ok }.
  38. index(K) -> wf:to_binary(K).
  39. email_prop(Props, _) -> proplists:get_value(<<"email">>, Props).
  40. login_button() ->
  41. #link{id=loginfb, body=[<<"Facebook">>], postback={facebook,loginClick}}.
  42. sdk() ->
  43. wf:wire(#api{name=fbLogin, tag=fb}),
  44. [ #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
  45. bindings=[{appid, ?FB_APP_ID}] } ].