aboutsummaryrefslogtreecommitdiffstats
path: root/net/net.c
blob: 9ed4653dcb416dc0144f4713245adebdb26134e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <cJSON.h>
#include <curl/curl.h>

#include <init.h>
#include <log.h>
#include <subsys.h>

extern int http_get(char *url);
char *gateway_url;

int net_subsystem(void)
{
    print(LOG_INFO "net: starting net subsystem");


    return 0;
}

void net_get_gateway_url()
{
    int fd = http_get("https://discord.com/api/gateway/bot");
    if(fd < 0) {
        print(LOG_ERR "net: failed to get gateway url (error %d)", -fd);
        goto assume;
    }

    char buf[512];
    int buf_length = read(fd, buf, 512);
    close(fd);

    cJSON *gateway_info = cJSON_ParseWithLength(buf, buf_length);
    cJSON *gateway_url_json = cJSON_GetObjectItemCaseSensitive(gateway_info, "url");
    if(!cJSON_IsString(gateway_url_json) || gateway_url_json->valuestring == NULL) {
        print(LOG_ERR "net: cannot get gateway url from api (token invalid?)");
        cJSON_Delete(gateway_info);
        goto assume;
    }

    char *gateway_url = calloc(strlen(gateway_url_json->valuestring) + 1, sizeof(char));
    strcpy(gateway_url, gateway_url_json->valuestring);
    print(LOG_DEBUG "net: using gateway url %s", gateway_url);

    free(gateway_url);
    cJSON_Delete(gateway_info);
    return;

assume:
    print(LOG_DEBUG "net: assuming gateway url wss://gateway.discord.gg");
    gateway_url = calloc(strlen("wss://gateway.discord.gg") + 1, sizeof(char));
    strcpy(gateway_url, "wss://gateway.discord.gg");
    return;
}
l1_initcall(net_get_gateway_url);

void net_initcall()
{
    start_subsystem(net_subsystem);
}
l2_initcall(net_initcall);