aboutsummarylogtreecommitdiffstats
path: root/api.c
diff options
context:
space:
mode:
authorAntony Kellermann2018-01-31 15:57:42 -0500
committerAntony Kellermann2018-01-31 15:57:42 -0500
commitae4dc32ef58d61a76a9591b47e0a4fe721d78fd7 (patch)
treecf2d7df6906b1d39853816d3152021e09eaaa740 /api.c
parent3fd8913733bbb57c38683fdb80aaf12d4719a734 (diff)
downloadaur-ae4dc32ef58d61a76a9591b47e0a4fe721d78fd7.tar.gz
Added support for news
Diffstat (limited to 'api.c')
-rw-r--r--api.c125
1 files changed, 112 insertions, 13 deletions
diff --git a/api.c b/api.c
index 7c6afbd8a559..ab98ef1285c1 100644
--- a/api.c
+++ b/api.c
@@ -31,7 +31,7 @@ size_t api_string_writefunc(void* ptr, size_t size, size_t nmemb, String* hStrin
return size * nmemb;
}
-String* api_curl_data(char* url) {
+String* api_curl_data(char* url, char* post_field) {
String* pString = api_string_init();
CURL* curl = curl_easy_init();
CURLcode res;
@@ -41,7 +41,16 @@ String* api_curl_data(char* url) {
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, api_string_writefunc);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &pString->data);
+ struct curl_slist* list = NULL;
+ if (url[12] == 'g') {
+ list = curl_slist_append(list, "Content-Type: application/json");
+ curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_field);
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(post_field));
+ }
res = curl_easy_perform(curl);
+ if (url[12] == 'g')
+ curl_slist_free_all(list);
curl_easy_cleanup(curl);
if (res != CURLE_OK)
return NULL;
@@ -62,7 +71,7 @@ double api_get_current_price(char* ticker_name_string) {
return -1;
}
-double api_get_1d_price(char* ticker_name_string){
+double api_get_1d_price(char* ticker_name_string) {
double val = iex_get_1d_price(ticker_name_string);
if (val != -1)
return val;
@@ -82,7 +91,7 @@ double iex_get_current_price(char* ticker_name_string) {
memcpy(&iex_api_string[37], ticker_name_string, ticker_name_len);
memcpy(&iex_api_string[37 + ticker_name_len], "/quote/latestPrice", 18);
- String* pString = api_curl_data(iex_api_string);
+ String* pString = api_curl_data(iex_api_string, NULL);
free(iex_api_string);
if (strcmp(pString->data, "Unknown symbol") == 0) {
api_string_destroy(&pString);
@@ -99,7 +108,7 @@ double alphavantage_get_current_price(char* ticker_name_string) {
memcpy(alphavantage_api_string, av_str, 160);
size_t av_len = strlen(alphavantage_api_string);
memcpy(&alphavantage_api_string[av_len], ticker_name_string, 10);
- String* pString = api_curl_data(alphavantage_api_string);
+ String* pString = api_curl_data(alphavantage_api_string, NULL);
if (pString->data[0] == '{') {
api_string_destroy(&pString);
memset(alphavantage_api_string, '\0', 160);
@@ -107,7 +116,7 @@ double alphavantage_get_current_price(char* ticker_name_string) {
memcpy(alphavantage_api_string, av_str, 160);
av_len = strlen(alphavantage_api_string);
memcpy(&alphavantage_api_string[av_len], ticker_name_string, 10);
- pString = api_curl_data(alphavantage_api_string);
+ pString = api_curl_data(alphavantage_api_string, NULL);
}
if (pString->data[0] == '{') {
free(alphavantage_api_string);
@@ -133,7 +142,7 @@ double coinmarketcap_get_current_price(char* ticker_name_string) {
char* coinmarketcap_api_string = calloc(64, sizeof(char));
memcpy(coinmarketcap_api_string, cmc_str, 40);
memcpy(&coinmarketcap_api_string[40], ticker_name_string, 20);
- String* pString = api_curl_data(coinmarketcap_api_string);
+ String* pString = api_curl_data(coinmarketcap_api_string, NULL);
if (pString->data[0] == '{') {
free(coinmarketcap_api_string);
api_string_destroy(&pString);
@@ -160,7 +169,7 @@ double iex_get_1d_price(char* ticker_name_string) {
memcpy(&iex_api_string[37], ticker_name_string, ticker_name_len);
memcpy(&iex_api_string[37 + ticker_name_len], "/previous?format=csv", 21);
- String* pString = api_curl_data(iex_api_string);
+ String* pString = api_curl_data(iex_api_string, NULL);
free(iex_api_string);
if (strcmp(pString->data, "Unknown symbol") == 0) {
@@ -180,13 +189,15 @@ double iex_get_1d_price(char* ticker_name_string) {
return ret;
}
-double alphavantage_get_1d_price(char* ticker_name_string){
+double alphavantage_get_1d_price(char* ticker_name_string) {
size_t ticker_name_len = strlen(ticker_name_string);
char* alphavantage_api_string = calloc(128, sizeof(char));
- memcpy(alphavantage_api_string, "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&apikey=DFUMLJ1ILOM2G7IH&datatype=csv&symbol=", 128);
+ memcpy(alphavantage_api_string,
+ "https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&apikey=DFUMLJ1ILOM2G7IH&datatype=csv&symbol=",
+ 128);
size_t prefix = strlen(alphavantage_api_string);
memcpy(&alphavantage_api_string[prefix], ticker_name_string, ticker_name_len);
- String* pString = api_curl_data(alphavantage_api_string);
+ String* pString = api_curl_data(alphavantage_api_string, NULL);
if (pString->data[0] == '{') {
free(alphavantage_api_string);
api_string_destroy(&pString);
@@ -206,12 +217,12 @@ double alphavantage_get_1d_price(char* ticker_name_string){
return ret;
}
-double coinmarketcap_get_1d_price(char* ticker_name_string){
+double coinmarketcap_get_1d_price(char* ticker_name_string) {
char* cmc_str = "https://api.coinmarketcap.com/v1/ticker/";
char* coinmarketcap_api_string = calloc(64, sizeof(char));
memcpy(coinmarketcap_api_string, cmc_str, 40);
memcpy(&coinmarketcap_api_string[40], ticker_name_string, 20);
- String* pString = api_curl_data(coinmarketcap_api_string);
+ String* pString = api_curl_data(coinmarketcap_api_string, NULL);
if (pString->data[0] == '{') {
free(coinmarketcap_api_string);
api_string_destroy(&pString);
@@ -237,7 +248,95 @@ double coinmarketcap_get_1d_price(char* ticker_name_string){
free(price_string);
free(percent_string);
api_string_destroy(&pString);
- return current_price - (current_price * (percent_change/100));
+ return current_price - (current_price * (percent_change / 100));
+}
+
+void news_print_top_three(char* ticker_name_string) {
+ char* qchar = calloc(64, 1);
+ sprintf(qchar, "&q=%s", ticker_name_string);
+ time_t now = time(NULL);
+ struct tm* ts;
+ char* yearchar = calloc(64, 1);
+ ts = localtime(&now);
+ ts->tm_mday -= 14;
+ mktime(ts);
+ strftime(yearchar, 64, "%Y-%m-%d", ts);
+ char* news_api_string = calloc(256, sizeof(char));
+ sprintf(news_api_string, "%s%s&from=%s",
+ "https://newsapi.org/v2/everything?sortBy=popularity&pageSize=3&language=en&apiKey=1163c352d041460381f0a8273e60a9d1",
+ qchar, yearchar);
+ free(yearchar);
+ free(qchar);
+ String* pString = api_curl_data(news_api_string, NULL);
+ json_print_news(pString->data);
+ free(news_api_string);
+ api_string_destroy(&pString);
+}
+
+void json_print_news(char* data) {
+ Json* jobj = json_tokener_parse(data);
+ Json* articles = json_object_object_get(jobj, "articles");
+ const char* author_string, * title_string, * source_string, * url_string;
+ char* date_string;
+ Json* article, * source, * author, * title, * source_name, * date, * url;
+ for (int i = 0; i < 3; i++) {
+ article = json_object_array_get_idx(articles, (size_t) i);
+ author = json_object_object_get(article, "author");
+ author_string = json_object_to_json_string(author);
+ title = json_object_object_get(article, "title");
+ title_string = json_object_to_json_string(title);
+ source = json_object_object_get(article, "source");
+ source_name = json_object_object_get(source, "name");
+ source_string = json_object_to_json_string(source_name);
+ date = json_object_object_get(article, "publishedAt");
+ date_string = (char*)json_object_to_json_string(date);
+ date_string[11] = '\"';
+ date_string[12] = '\0';
+ url = json_object_object_get(article, "url");
+ url_string = json_object_to_json_string(url);
+ char* url_final = calloc(strlen(url_string + 1), 1);
+ for (int k = 0, j = 0; j < strlen(url_string); k++, j++) {
+ if (url_string[j] == '\\' || url_string[j] == '\"')
+ j++;
+ url_final[k] = url_string[j];
+ }
+
+ const char* shorten = google_shorten_link(url_final);
+ if (author_string != NULL)
+ printf("Title: %s Source: %s Author: %s Date: %s Url: %s\n", title_string, source_string, author_string,
+ date_string, shorten);
+ else printf("Title: %s Source: %s Date: %s Url: %s\n", title_string, source_string, date_string, shorten);
+ free(url_final);
+ free((void*) shorten);
+ }
+ json_object_put(jobj);
+}
+
+const char* google_shorten_link(char* url_string) {
+ char* google_api_string = calloc(256, sizeof(char));
+ memcpy(google_api_string,
+ "https://www.googleapis.com/urlshortener/v1/url?key=AIzaSyAoMAvMPpc7U8lfrnGMk2ZKl966tU2pppU",
+ 256);
+ char* post_string = calloc(1024, 1);
+ sprintf(post_string, "{\"longUrl\": \"%s\"}", url_string);
+ String* pString = api_curl_data(google_api_string, post_string);
+ free(post_string);
+ free(google_api_string);
+ Json* jobj = json_tokener_parse(pString->data);
+ Json* short_url = json_object_object_get(jobj, "id");
+ const char* short_url_string = json_object_to_json_string(short_url);
+ char* copy = calloc(1024, 1);
+ strcpy(copy, short_url_string);
+ char* final = calloc(strlen(copy) + 1, 1);
+ for (int i = 0, j = 0; j < strlen(copy); i++, j++) {
+ if (copy[j] == '\\' || copy[j] == '\"')
+ j++;
+ final[i] = copy[j];
+ }
+ json_object_put(jobj);
+ free(copy);
+ api_string_destroy(&pString);
+ return final;
}
void api_string_destroy(String** phString) {