summary refs log tree commit diff
path: root/downloadAvatar.c
diff options
context:
space:
mode:
Diffstat (limited to 'downloadAvatar.c')
-rw-r--r--downloadAvatar.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/downloadAvatar.c b/downloadAvatar.c
new file mode 100644
index 0000000..45a39ac
--- /dev/null
+++ b/downloadAvatar.c
@@ -0,0 +1,120 @@
+#define _POSIX_C_SOURCE 200112L
+
+#include "cptc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <curl/curl.h>
+#include <curl/easy.h>
+
+
+static size_t write_function(void *contents, size_t size, size_t nmemb, void *userp)
+{
+    size_t realsize = size * nmemb;
+    struct {char *buf; size_t size;} *mem = userp;
+
+    mem->buf = realloc(mem->buf, mem->size + realsize + 1);
+    if (!mem->buf)
+    {
+        perror("realloc()");
+        return 0;
+    }
+
+    memcpy(&(mem->buf[mem->size]), contents, realsize);
+    mem->size += realsize;
+    mem->buf[mem->size] = 0;
+
+    return realsize;
+}
+
+char *CPTC_downloadAvatar(long long uid, const char *filenamebuf)
+{
+    char *avatar, link[256], auth[128], *ret;
+    CURL *curl;
+    CURLcode res;
+    FILE *fp;
+    struct {char *buf; size_t size;} buffer;
+    buffer.buf = malloc(1);
+    buffer.size = 0;
+
+    curl = curl_easy_init();
+    if (curl)
+    {
+        snprintf(link, sizeof(link), "https://discord.com/api/v9/users/%lld", uid);
+        snprintf(auth, sizeof(auth), "Authorization: %s", CPTC_token);
+
+        curl_easy_setopt(curl, CURLOPT_URL, link);
+        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_function);
+        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
+        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_slist_append(NULL, auth));
+
+        res = curl_easy_perform(curl);
+        if (res != CURLE_OK)
+        {
+            fprintf(stderr, "curl_easy_perform(): %s\n", curl_easy_strerror(res));
+            curl_easy_cleanup(curl);
+            free(buffer.buf);
+            return NULL;
+        }
+
+        curl_easy_cleanup(curl);
+    } else
+    {
+        free(buffer.buf);
+        return NULL;
+    }
+    avatar = strstr(buffer.buf, "avatar\":\"") + 9;
+    if (!(avatar - 9))
+    {
+        fprintf(stderr, "User %lld has no avatar\n", uid);
+        free(buffer.buf);
+        return NULL;
+    }
+    *strchr(avatar, '"') = '\0';
+
+    fp = fopen(filenamebuf, "w");
+    if (!fp)
+    {
+        perror("fopen()");
+        free(buffer.buf);
+        return NULL;
+    }
+
+    curl = curl_easy_init();
+    if (curl)
+    {
+        snprintf(link, sizeof(link), "https://cdn.discordapp.com/avatars/%lld/%s.png", uid, avatar);
+
+        curl_easy_setopt(curl, CURLOPT_URL, link);
+        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+        curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, curl_slist_append(NULL, auth));
+
+        res = curl_easy_perform(curl);
+        if (res != CURLE_OK)
+        {
+            fprintf(stderr, "curl_easy_perform(): %s\n", curl_easy_strerror(res));
+            curl_easy_cleanup(curl);
+            fclose(fp);
+            free(buffer.buf);
+            return NULL;
+        }
+
+        curl_easy_cleanup(curl);
+    } else
+    {
+        fclose(fp);
+        free(buffer.buf);
+        return NULL;
+    }
+
+    fclose(fp);
+    ret = malloc(strlen(filenamebuf) + 1);
+    memcpy(ret, filenamebuf, strlen(filenamebuf) + 1);
+    free(buffer.buf);
+    return ret;
+}