greensiderp.inc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. #include <a_http>
  2. #define MAX_COUNTRY_NAME (40)
  3. #define MAX_ZIP_LENGTH (15) // I don't know how long zip codes are in other countries.
  4. forward HTTP_OnLookupResponse(index, response, data[]);
  5. enum e_LookupData
  6. {
  7. e_LookupCountry[MAX_COUNTRY_NAME char],
  8. e_LookupRegion[MAX_COUNTRY_NAME char],
  9. e_LookupCity[MAX_COUNTRY_NAME char],
  10. e_LookupISP[MAX_COUNTRY_NAME char],
  11. e_LookupTimezone[MAX_COUNTRY_NAME char],
  12. e_LookupZipcode[MAX_ZIP_LENGTH char]
  13. };
  14. new g_asLookupData[MAX_PLAYERS][e_LookupData];
  15. #if defined OnLookupComplete
  16. forward OnLookupComplete(playerid);
  17. #endif
  18. public HTTP_OnLookupResponse(index, response, data[])
  19. {
  20. new pos = -1;
  21. if (!IsPlayerConnected(index)) return 0;
  22. else if (response == 200)
  23. {
  24. if (strfind(data, "Reserved", true) != -1 || strlen(data) < 15)
  25. {
  26. return 0;
  27. }
  28. else
  29. {
  30. new country[MAX_COUNTRY_NAME],region[MAX_COUNTRY_NAME],city[MAX_COUNTRY_NAME],isp[MAX_COUNTRY_NAME], timezone[MAX_COUNTRY_NAME], zip[10];
  31. if ((pos = strfind(data, "\"country\":")) != -1)
  32. {
  33. pos = pos + 11;
  34. strmid(country, data, pos, strfind(data, "\"", true, pos), MAX_COUNTRY_NAME);
  35. }
  36. if ((pos = strfind(data, "\"regionName\":")) != -1)
  37. {
  38. pos = pos + 14;
  39. strmid(region, data, pos, strfind(data, "\"", true, pos), MAX_COUNTRY_NAME);
  40. }
  41. if ((pos = strfind(data, "\"city\":")) != -1)
  42. {
  43. pos = pos + 8;
  44. strmid(city, data, pos, strfind(data, "\"", true, pos), MAX_COUNTRY_NAME);
  45. }
  46. if ((pos = strfind(data, "\"isp\":")) != -1)
  47. {
  48. pos = pos + 7;
  49. strmid(isp, data, pos, strfind(data, "\"", true, pos), MAX_COUNTRY_NAME);
  50. }
  51. if ((pos = strfind(data, "\"timezone\":")) != -1)
  52. {
  53. pos = pos + 12;
  54. strmid(timezone, data, pos, strfind(data, "\"", true, pos), MAX_COUNTRY_NAME);
  55. }
  56. if ((pos = strfind(data, "\"zip\":")) != -1)
  57. {
  58. pos = pos + 7;
  59. strmid(zip, data, pos, strfind(data, "\"", true, pos), 10);
  60. }
  61. if (pos != -1)
  62. {
  63. strpack(g_asLookupData[index][e_LookupCountry], country, MAX_COUNTRY_NAME char);
  64. strpack(g_asLookupData[index][e_LookupRegion], region, MAX_COUNTRY_NAME char);
  65. strpack(g_asLookupData[index][e_LookupCity], city, MAX_COUNTRY_NAME char);
  66. strpack(g_asLookupData[index][e_LookupISP], isp, MAX_COUNTRY_NAME char);
  67. strpack(g_asLookupData[index][e_LookupTimezone], timezone, MAX_COUNTRY_NAME char);
  68. strpack(g_asLookupData[index][e_LookupZipcode], zip, MAX_ZIP_LENGTH char);
  69. // Saving zip as a packed string because apparently strval wants to act funny.
  70. // Could be because it's 5am as I'm adding this shit to this include, will check it out later.
  71. #if defined OnLookupComplete
  72. CallLocalFunction("OnLookupComplete", "d", index);
  73. #endif
  74. }
  75. }
  76. }
  77. return 0;
  78. }
  79. public OnPlayerConnect(playerid)
  80. {
  81. new ipstr[64];
  82. GetPlayerIp(playerid, ipstr, 64);
  83. strpack(g_asLookupData[playerid][e_LookupCountry], "Unknown", MAX_COUNTRY_NAME char);
  84. strpack(g_asLookupData[playerid][e_LookupRegion], "Unknown", MAX_COUNTRY_NAME char);
  85. strpack(g_asLookupData[playerid][e_LookupCity], "Unknown", MAX_COUNTRY_NAME char);
  86. strpack(g_asLookupData[playerid][e_LookupISP], "Unknown", MAX_COUNTRY_NAME char);
  87. strpack(g_asLookupData[playerid][e_LookupTimezone], "Unknown", MAX_COUNTRY_NAME char);
  88. strpack(g_asLookupData[playerid][e_LookupZipcode], "Unknown", MAX_COUNTRY_NAME char);
  89. strins(ipstr, "ip-api.com/json/", 0);
  90. HTTP(playerid, HTTP_GET, ipstr, "", "HTTP_OnLookupResponse");
  91. #if defined IPL_OnPlayerConnect
  92. IPL_OnPlayerConnect(playerid);
  93. #endif
  94. return 1;
  95. }
  96. #if defined _ALS_OnPlayerConnect
  97. #undef OnPlayerConnect
  98. #else
  99. #define _ALS_OnPlayerConnect
  100. #endif
  101. #define OnPlayerConnect IPL_OnPlayerConnect
  102. #if defined IPL_OnPlayerConnect
  103. forward IPL_OnPlayerConnect(playerid);
  104. #endif
  105. stock GetPlayerCountry(playerid, country[], size = sizeof(country))
  106. {
  107. if (IsPlayerConnected(playerid))
  108. return strunpack(country, g_asLookupData[playerid][e_LookupCountry], size);
  109. else
  110. strunpack(country, !"Unknown", size);
  111. return 0;
  112. }
  113. stock GetPlayerRegion(playerid, region[], size = sizeof(region))
  114. {
  115. if (IsPlayerConnected(playerid))
  116. return strunpack(region, g_asLookupData[playerid][e_LookupRegion], size);
  117. else
  118. strunpack(region, !"Unknown", size);
  119. return 0;
  120. }
  121. stock GetPlayerCity(playerid, city[], size = sizeof(city))
  122. {
  123. if (IsPlayerConnected(playerid))
  124. return strunpack(city, g_asLookupData[playerid][e_LookupCity], size);
  125. else
  126. strunpack(city, !"Unknown", size);
  127. return 0;
  128. }
  129. stock GetPlayerISP(playerid, isp[], size = sizeof(isp))
  130. {
  131. if (IsPlayerConnected(playerid))
  132. return strunpack(isp, g_asLookupData[playerid][e_LookupISP], size);
  133. else
  134. strunpack(isp, !"Unknown", size);
  135. return 0;
  136. }
  137. stock GetPlayerTimezone(playerid, timezone[], size = sizeof(timezone))
  138. {
  139. if (IsPlayerConnected(playerid))
  140. return strunpack(timezone, g_asLookupData[playerid][e_LookupTimezone], size);
  141. else
  142. strunpack(timezone, !"Unknown", size);
  143. return 0;
  144. }
  145. stock GetPlayerZipcode(playerid, zipcode[], size = sizeof(zipcode)) // Returns as a string for now, read note in the callback above.
  146. {
  147. if (IsPlayerConnected(playerid))
  148. return strunpack(zipcode, g_asLookupData[playerid][e_LookupZipcode], size);
  149. else
  150. strunpack(zipcode, !"Unknown", size);
  151. return 0;
  152. }