aboutsummaryrefslogtreecommitdiffstats
path: root/example/ping.c
blob: 79cb9154df6f666490babfbbb27842ab20b9f884 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

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

#include <dbs/api.h>
#include <dbs/event.h>
#include <dbs/init.h>
#include <dbs/log.h>
#include <dbs/util.h>

extern char *app_id;
extern double api_latency;

static void ping(cJSON *i)
{
    struct curl_slist *headers = curl_slist_append(NULL, "Content-type: application/json");
    headers = curl_slist_append(headers, "User-Agent: DiscordBot (DBS, dev)");

    char *i_id = js_getStr(i, "id");
    char *i_token = js_getStr(i, "token");
    char *url = malloc(strlen("/interactions/") + strlen(i_id) + strlen("/") + strlen(i_token) + strlen("/messages/@original") + 2);

    sprintf(url, "/interactions/%s/%s/callback", i_id, i_token);
    char *defer_message = "{\"type\":5}";

    struct timeval sent;
    struct timeval done;

    long code;
    gettimeofday(&sent, NULL);
    close(api_post(url, headers, defer_message, &code));
    gettimeofday(&done, NULL);

    char *response = malloc(128);
    snprintf(response, 128, "{\"embeds\":[{\"title\": \"PONG!\", \"description\": \"Measured API Latency: %.4fms\\nWS Latency: %.4fms\"}]}",
            (done.tv_sec - sent.tv_sec) * 1000.0f + (done.tv_usec - sent.tv_usec) / 1000.0f,
            api_latency);
    sprintf(url, "/webhooks/%s/%s/messages/@original", app_id, i_token);
    headers = curl_slist_append(NULL, "Content-type: application/json");
    headers = curl_slist_append(headers, "User-Agent: DiscordBot (DBS, dev)");

    close(api_patch(url, headers, response, &code));

    free(response);
    free(url);
}

static void hi(cJSON *i)
{

    char *i_id = js_getStr(i, "id");
    char *i_token = js_getStr(i, "token");
    char *url = malloc(strlen("/interactions/") + strlen(i_id) + strlen("/") + strlen(i_token) + strlen("/callback") + 2);
    sprintf(url, "/interactions/%s/%s/callback", i_id, i_token);

    char *message = "{\"type\": 4,\"data\":{\"type\":4,\"flags\": 0,\"content\":\"hello world!\"}}";
    long code;

    struct curl_slist *headers = curl_slist_append(NULL, "Content-type: application/json");
    headers = curl_slist_append(headers, "User-Agent: DiscordBot (DBS, dev)");
    close(api_post(url, headers, message, &code));

    free(url);
}

int interaction_create(cJSON *ev_data)
{
    int i_type = js_getInt(ev_data, "type");
    cJSON *i = cJSON_GetObjectItemCaseSensitive(ev_data, "data");

    switch(i_type) {
    case 1: ; /* PING */
        break;
    case 2: ; /* APPLICATION_COMMAND */
        int cmd_type = js_getInt(i, "type");
        if(cmd_type == -1) cmd_type = 1;
        char *cmd_name = js_getStr(i, "name");
        if(strcmp(cmd_name, "ping") == 0) {
            ping(ev_data);
            return 0;
        } else if(strcmp(cmd_name, "hi") == 0) {
            hi(ev_data);
            return 0;
        }
        break;
    case 3: ; /* MESSAGE_COMPONENT */
        break;
    case 4: ; /* APPLICATION_COMMAND_AUTOCOMPLETE */
        break;
    case 5: ; /* MODAL_SUBMIT */
        break;
    default:
        break;
    }

    char *payload = cJSON_Print(ev_data);
    print("inter_create: payload (see below)\n%s", payload);
    free(payload);

    return 1;
}
declare_event(INTERACTION_CREATE, interaction_create);