facebook.erl 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. -module(facebook).
  2. -author('Andrii Zadorozhnii').
  3. -include_lib("avz/include/avz.hrl").
  4. -include_lib("nitro/include/nitro.hrl").
  5. -include_lib("n2o/include/wf.hrl").
  6. -include_lib("avz/include/avz_user.hrl").
  7. -compile(export_all).
  8. -export(?API).
  9. -define(FB_APP_ID, application:get_env(avz, fb_id, [])).
  10. callback() -> ok.
  11. event({facebook,_Event}) -> wf:wire("fb_login();"), ok.
  12. api_event(fbLogin, Args, _Term) -> {JSArgs} = ?AVZ_JSON:decode(list_to_binary(Args)), avz:login(facebook, JSArgs).
  13. registration_data(Props, facebook, Ori)->
  14. Id = proplists:get_value(<<"id">>, Props),
  15. BirthDay = case proplists:get_value(<<"birthday">>, Props) of
  16. undefined -> {1, 1, 1970};
  17. BD -> list_to_tuple([list_to_integer(X) || X <- string:tokens(binary_to_list(BD), "/")]) end,
  18. Email = email_prop(Props, facebook),
  19. [UserName|_] = string:tokens(binary_to_list(Email),"@"),
  20. 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,
  21. Ori#avz_user{ id = Email,
  22. display_name = UserName,
  23. images = avz:update({fb_cover,Cover},avz:update({fb_avatar,"https://graph.facebook.com/" ++ binary_to_list(Id) ++ "/picture?type=large"},Ori#avz_user.images)),
  24. email = Email,
  25. names = proplists:get_value(<<"first_name">>, Props),
  26. surnames = proplists:get_value(<<"last_name">>, Props),
  27. tokens = avz:update({facebook,Id},Ori#avz_user.tokens),
  28. birth = {element(3, BirthDay), element(1, BirthDay), element(2, BirthDay)},
  29. register_date = os:timestamp(),
  30. status = ok }.
  31. email_prop(Props, _) ->
  32. proplists:get_value(<<"email">>, Props).
  33. login_button() -> application:get_env(avz,facebook_button,
  34. #panel{class=["btn-group"], body=#link{id=loginfb,
  35. class=["btn-primary btn-large btn-lg"],
  36. body=[#i{class=[fa,"fa-facebook","fa-lg","icon-facebook","icon-large"]},
  37. <<"Facebook">>], postback={facebook,loginClick} }}).
  38. sdk() ->
  39. wf:wire(#api{name=fbLogin, tag=fb}),
  40. [ #dtl{bind_script=false, file="facebook_sdk", ext="dtl", folder="priv/static/js",
  41. bindings=[{appid, ?FB_APP_ID}] } ].