facebook.cpp 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. #include "facebook.h"
  2. #ifdef __ANDROID__
  3. #include "android/AndroidFacebook.h"
  4. #elif __APPLE__
  5. #include <TargetConditionals.h>
  6. #include "ios/iosFacebook.h"
  7. #else
  8. #include "sim/FacebookSimulator.h"
  9. #endif
  10. #include "ox/json.hpp"
  11. #include "ox/oxygine.hpp"
  12. #include "ox/ThreadDispatcher.hpp"
  13. namespace facebook
  14. {
  15. namespace internal
  16. {
  17. using namespace std;
  18. cbInit fInit = []() {};
  19. cbFree fFree = []() {};
  20. cbLogin fLogin = [](const vector<string>& permissions) {};
  21. cbLogout fLogout = []() {};
  22. cbNewMeRequest fNewMeRequest = []() {};
  23. cbGetFriends fGetFriends = []() {};
  24. cbGameRequest fGameRequest = [](const string& title, const string& text, const vector<string>& dest, const string& objectID, const std::string& userData) {};
  25. cbRequestInvitableFriends fRequestInvitableFriends = [](const vector<string>&) {};
  26. cbShareLink fShareLink = [](const string&, const string&)
  27. {
  28. core::getMainThreadDispatcher().postCallback([]()
  29. {
  30. ShareEvent ev(true);
  31. dispatch(&ev);
  32. });
  33. };
  34. cbIsLoggedIn fIsLoggedIn = []() {return false; };
  35. cbGetUserID fGetUserID = []() {return std::string(""); };
  36. cbGetAccessToken fGetAccessToken = []() {return std::string(""); };
  37. cbGetAppID fGetAppID = []() {return std::string(""); };
  38. cbGetAccessTokenPermissions fGetAccessTokenPermissions = []() {return std::vector<string>();};
  39. cbLogPurchase fLogPurchase = [](const double& price, const string& currency) {};
  40. }
  41. using namespace internal;
  42. spEventDispatcher _dispatcher;
  43. spEventDispatcher dispatcher()
  44. {
  45. return _dispatcher;
  46. }
  47. void init()
  48. {
  49. #ifdef __ANDROID__
  50. fInit = jniFacebookInit;
  51. fFree = jniFacebookFree;
  52. fLogin = jniFacebookLogin;
  53. fLogout = jniFacebookLogout;
  54. fNewMeRequest = jniFacebookNewMeRequest;
  55. fGetFriends = jniFacebookGetFriends;
  56. fIsLoggedIn = jniFacebookIsLoggedIn;
  57. fGetUserID = jniFacebookGetUserID;
  58. fGetAccessToken = jniFacebookGetAccessToken;
  59. fGetAppID = jniFacebookGetAppID;
  60. fGameRequest = jniFacebookGameRequest;
  61. fGetAccessTokenPermissions = jniFacebookGetAccessTokenPermissions;
  62. fRequestInvitableFriends = jniFacebookRequestInvitableFriends;
  63. fShareLink = jniFacebookShareLink;
  64. fLogPurchase = jniFacebookLogPurchase;
  65. #elif TARGET_OS_IPHONE
  66. fInit = iosFacebookInit;
  67. fFree = iosFacebookFree;
  68. fLogin = iosFacebookLogin;
  69. fLogout = iosFacebookLogout;
  70. fNewMeRequest = iosFacebookRequestMe;
  71. fGetFriends = []() {OX_ASSERT(0); };
  72. fIsLoggedIn = []() {OX_ASSERT(0); return false; };
  73. fGetUserID = iosFacebookGetUserID;
  74. fGetAccessToken = iosFacebookGetAccessToken;
  75. fGetAppID = []() {OX_ASSERT(0); return std::string(""); };
  76. fGameRequest = iosFacebookGameRequest;
  77. fGetAccessTokenPermissions = iosFacebookGetPermissions;
  78. fRequestInvitableFriends = iosFacebookRequestInvitableFriends;
  79. fShareLink = iosFacebookShareLink;
  80. #else
  81. fInit = facebookSimulatorInit;
  82. fFree = facebookSimulatorFree;
  83. fLogin = facebookSimulatorLogin;
  84. fLogout = facebookSimulatorLogout;
  85. fNewMeRequest = facebookSimulatorNewMeRequest;
  86. fGetFriends = facebookSimulatorGetFriends;
  87. fIsLoggedIn = facebookSimulatorIsLoggedIn;
  88. fGetUserID = facebookSimulatorGetUserID;
  89. fGetAccessToken = facebookSimulatorGetAccessToken;
  90. fGetAppID = facebookSimulatorGetAppID;
  91. fGameRequest = facebookSimulatorGameRequest;
  92. fGetAccessTokenPermissions = facebookSimulatorGetAccessTokenPermissions;
  93. fRequestInvitableFriends = facebookSimulatorInvitableFriendsRequest;
  94. fShareLink = facebookSimulatorShareLink;
  95. #endif
  96. logs::messageln("facebook::init");
  97. OX_ASSERT(_dispatcher == 0);
  98. _dispatcher = new EventDispatcher;
  99. fInit();
  100. logs::messageln("facebook::init done");
  101. }
  102. void free()
  103. {
  104. logs::messageln("facebook::free");
  105. OX_ASSERT(_dispatcher);
  106. fFree();
  107. if (_dispatcher)
  108. _dispatcher->removeAllEventListeners();
  109. _dispatcher = 0;
  110. logs::messageln("facebook::free done");
  111. }
  112. void login(const vector<string>& permissions)
  113. {
  114. logs::messageln("facebook::login");
  115. fLogin(permissions);
  116. logs::messageln("facebook::login done");
  117. }
  118. void logout()
  119. {
  120. logs::messageln("facebook::logout");
  121. fLogout();
  122. logs::messageln("facebook::logout done");
  123. }
  124. bool appInviteDialog(const string& appLinkUrl, const string& previewImageUrl)
  125. {
  126. logs::messageln("facebook::AppInviteDialog");
  127. #ifdef __ANDROID__
  128. return jniFacebookAppInviteDialog(appLinkUrl, previewImageUrl);
  129. #elif TARGET_OS_IPHONE
  130. #else
  131. return facebookSimulatorAppInviteDialog(appLinkUrl, previewImageUrl);
  132. #endif
  133. return false;
  134. }
  135. void newMeRequest()
  136. {
  137. logs::messageln("facebook::newMeRequest");
  138. fNewMeRequest();
  139. logs::messageln("facebook::newMeRequest done");
  140. }
  141. void gameRequest(const string& title, const string& text, const vector<string>& dest, const string& objectID, const string& userData)
  142. {
  143. fGameRequest(title, text, dest, objectID, userData);
  144. }
  145. void requestInvitableFriends(const vector<string>& exclude)
  146. {
  147. logs::messageln("facebook::requestInvitableFriends");
  148. fRequestInvitableFriends(exclude);
  149. }
  150. void shareLink(const string& url, const string& quote)
  151. {
  152. logs::messageln("facebook::shareLink");
  153. fShareLink(url, quote);
  154. }
  155. void logPurchase(const double& price, const string& currency)
  156. {
  157. logs::messageln("facebook::logPurchase");
  158. fLogPurchase(price, currency);
  159. logs::messageln("facebook::logPurchase done");
  160. }
  161. void getFriends()
  162. {
  163. logs::messageln("facebook::getFriends");
  164. fGetFriends();
  165. logs::messageln("facebook::getFriends done");
  166. }
  167. bool isLoggedIn()
  168. {
  169. logs::messageln("facebook::isLoggined");
  170. return fIsLoggedIn();
  171. }
  172. string getAccessToken()
  173. {
  174. logs::messageln("facebook::getAccessToken");
  175. string token = fGetAccessToken();
  176. logs::messageln("%s", token.c_str());
  177. return token;
  178. }
  179. vector<string> getAccessTokenPermissions()
  180. {
  181. logs::messageln("facebook::getAccessToken");
  182. vector<string> res = fGetAccessTokenPermissions();
  183. string str;
  184. for (const auto& s : res)
  185. str += s + ",";
  186. if (!str.empty())
  187. str.pop_back();
  188. logs::messageln("permissions: %s", str.c_str());
  189. return res;
  190. }
  191. string getUserID()
  192. {
  193. logs::messageln("facebook::getUserID");
  194. string id = fGetUserID();
  195. logs::messageln("%s", id.c_str());
  196. return id;
  197. }
  198. string getAppID()
  199. {
  200. return fGetAppID();
  201. }
  202. GameRequestEvent::GameRequestEvent(const string& Data, bool Canceled) : Event(EVENT), data(Data), canceled(Canceled)
  203. {
  204. Json::Reader reader;
  205. Json::Value value;
  206. bool ok = !Data.empty();
  207. if (ok)
  208. ok = reader.parse((char*)&Data.front(), (char*)&Data.front() + Data.size(), value, false);
  209. if (ok)
  210. {
  211. const Json::Value& jr = value["request"];
  212. if (!jr.isNull())
  213. request = jr.asString();
  214. const Json::Value& jto = value["to"];
  215. if (!jto.isNull())
  216. {
  217. for (Json::ArrayIndex i = 0; i < jto.size(); ++i)
  218. {
  219. to.push_back(jto[i].asString());
  220. }
  221. }
  222. }
  223. }
  224. ShareEvent::ShareEvent(bool Canceled): Event(EVENT), canceled(Canceled) {}
  225. namespace internal
  226. {
  227. void newToken(const string& value)
  228. {
  229. logs::messageln("facebook::internal::newToken %s", value.c_str());
  230. TokenEvent ev;
  231. ev.token = value;
  232. if (_dispatcher)
  233. _dispatcher->dispatchEvent(&ev);
  234. }
  235. void loginResult(bool value, const string& userID, const string& token)
  236. {
  237. logs::messageln("facebook::internal::loginResult %d %s %s", value, userID.c_str(), token.c_str());
  238. LoginEvent ev;
  239. ev.isLoggedIn = value;
  240. ev.userID = userID;
  241. ev.token = token;
  242. if (_dispatcher)
  243. _dispatcher->dispatchEvent(&ev);
  244. }
  245. void newMeRequestResult(const string& data, bool error)
  246. {
  247. logs::messageln("facebook::internal::newMeRequestResult %s", data.c_str());
  248. NewMeRequestEvent event;
  249. Json::Reader reader;
  250. Json::Value root;
  251. bool parsingSuccessful = reader.parse(data.c_str(), root); //parse process
  252. if (!parsingSuccessful || error)
  253. {
  254. event.error = true;
  255. logs::messageln("newMeRequestResult error %s", error ? "response error" : "parse error");
  256. return;
  257. }
  258. else
  259. {
  260. event.data = data;
  261. }
  262. if (_dispatcher)
  263. _dispatcher->dispatchEvent(&event);
  264. }
  265. void newMyFriendsRequestResult(const string& data, bool error)
  266. {
  267. logs::messageln("facebook::internal::newMyFriendsRequestResult %s", data.c_str());
  268. }
  269. void gameRequestResult(const string& data, bool canceled)
  270. {
  271. logs::messageln("facebook::internal::gameRequestResult %s", data.c_str());
  272. GameRequestEvent ev(data, canceled);
  273. if (_dispatcher)
  274. _dispatcher->dispatchEvent(&ev);
  275. }
  276. void dispatch(Event* ev)
  277. {
  278. if (_dispatcher)
  279. _dispatcher->dispatchEvent(ev);
  280. }
  281. }
  282. }