weather.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <curl/curl.h>
  5. #include <json-c/json_object.h>
  6. #include <json-c/json_tokener.h>
  7. #include "../lib/util.h"
  8. #include "../aslstatus.h"
  9. #include "../components_config.h"
  10. #define IP_API_KEY "4da6304cf5bfa3eb484b7a579f47aee8"
  11. typedef struct {
  12. char *response;
  13. size_t size;
  14. } DATA;
  15. typedef struct {
  16. float lat;
  17. float lon;
  18. } location;
  19. size_t data_callback(void *data, size_t size, size_t n_mb, void *userdata_p) {
  20. size_t real_size = size * n_mb;
  21. DATA *userdata = (DATA *) userdata_p;
  22. char *ptr;
  23. if ((ptr = realloc(userdata->response, userdata->size + real_size + 1)) == NULL) {
  24. fprintf(stderr, "Error reallocating memory");
  25. return 0;
  26. }
  27. userdata->response = ptr;
  28. memcpy(&(userdata->response[userdata->size]), data, real_size);
  29. userdata->size += real_size;
  30. userdata->response[userdata->size] = 0;
  31. return real_size;
  32. }
  33. void weather(char *out, char __unused *_a, uint32_t __unused _i, void __unused *_p) {
  34. CURL *curl;
  35. CURLcode curl_result;
  36. DATA data = {0};
  37. json_object *root, *lat, *lon, *openweather_temp;
  38. location loc = {0};
  39. char openweather_URL[1000];
  40. if (!(curl = curl_easy_init()))
  41. ERRRET(out);
  42. curl_easy_setopt(curl, CURLOPT_URL, "http://ip-api.com/json/");
  43. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback);
  44. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &data);
  45. if ((curl_result = curl_easy_perform(curl)) != CURLE_OK)
  46. ERRRET(out);
  47. if ((root = json_tokener_parse(data.response)) == NULL)
  48. ERRRET(out);
  49. if (!(json_object_object_get_ex(root, "lat", &lat) && json_object_object_get_ex(root, "lon", &lon)))
  50. ERRRET(out);
  51. loc.lat = (float) json_object_get_double(lat);
  52. loc.lon = (float) json_object_get_double(lon);
  53. sprintf(openweather_URL, "http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&appid=%s&units=%s",
  54. loc.lat, loc.lon, IP_API_KEY, "imperial");
  55. data.size = 0;
  56. curl_easy_setopt(curl, CURLOPT_URL, openweather_URL);
  57. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, data_callback);
  58. curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *) &data);
  59. if ((curl_result = curl_easy_perform(curl)) != CURLE_OK)
  60. ERRRET(out);
  61. if ((root = json_tokener_parse(data.response)) == NULL)
  62. ERRRET(out);
  63. if (!(json_object_object_get_ex(root, "main", &root)))
  64. ERRRET(out);
  65. if (!(json_object_object_get_ex(root, "temp", &openweather_temp)))
  66. ERRRET(out);
  67. sprintf(out, "%.2f\n", json_object_get_double(openweather_temp));
  68. free((data.response));
  69. curl_easy_cleanup(curl);
  70. }