diff options
author | turret <turret@duck.com> | 2025-09-29 00:12:05 -0500 |
---|---|---|
committer | turret <turret@duck.com> | 2025-09-29 00:12:05 -0500 |
commit | 535ff19dd942d9d53228200eea9096e7e59f76f8 (patch) | |
tree | b2109d68a00b42edf80f26791866b0a9f4de4461 | |
parent | 236887a2e380e57b31b2ad4efb3075a63199df3a (diff) | |
download | discord-bot-skeleton-535ff19dd942d9d53228200eea9096e7e59f76f8.tar.gz discord-bot-skeleton-535ff19dd942d9d53228200eea9096e7e59f76f8.tar.bz2 discord-bot-skeleton-535ff19dd942d9d53228200eea9096e7e59f76f8.zip |
abstract: add interaction responses
-rw-r--r-- | include/dbs/abstract.h | 8 | ||||
-rw-r--r-- | util/abstract.c | 102 |
2 files changed, 110 insertions, 0 deletions
diff --git a/include/dbs/abstract.h b/include/dbs/abstract.h new file mode 100644 index 0000000..62ec410 --- /dev/null +++ b/include/dbs/abstract.h @@ -0,0 +1,8 @@ +#ifndef __DBS_ABSTRACT_H +#define __DBS_ABSTRACT_H + +int interaction_reply(cJSON *i, char *content, int raw); +int interaction_defer_reply(cJSON *i, int hidden); +int interaction_edit_reply(cJSON *i, char *content, int raw); + +#endif diff --git a/util/abstract.c b/util/abstract.c new file mode 100644 index 0000000..032f668 --- /dev/null +++ b/util/abstract.c @@ -0,0 +1,102 @@ +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#include <cJSON.h> +#include <curl/curl.h> + +#include <dbs/abstract.h> +#include <dbs/api.h> +#include <dbs/init.h> +#include <dbs/log.h> +#include <dbs/util.h> + +extern char *app_id; + +int interaction_reply(cJSON *i, char *content, int raw) { + struct curl_slist *headers = curl_slist_append(NULL, "Content-type: application/json"); + char *i_id = js_getStr(i, "id"); + char *i_token = js_getStr(i, "token"); + char *url = malloc(strlen("/interactions///callback") + strlen(i_id) + strlen(i_token)); + long code; + + char *packet = NULL; + + cJSON *packet_js = cJSON_CreateObject(); + cJSON_AddNumberToObject(packet_js, "type", 4); + + if(raw) { + cJSON_AddItemToObject(packet_js, "data", cJSON_Parse(content)); + } else { + cJSON *message_js = cJSON_CreateObject(); + cJSON_AddStringToObject(message_js, "content", content); + cJSON_AddItemToObject(packet_js, "data", message_js); + } + + packet = cJSON_PrintUnformatted(packet_js); + cJSON_Delete(packet_js); + + sprintf(url, "/interactions/%s/%s/callback", i_id, i_token); + + close(api_patch(url, headers, packet, &code)); + free(url); + free(packet); + curl_slist_free_all(headers); + + return (code % 100) != 200; +} + +int interaction_defer_reply(cJSON *i, int hidden) { + struct curl_slist *headers = curl_slist_append(NULL, "Content-type: application/json"); + char *i_id = js_getStr(i, "id"); + char *i_token = js_getStr(i, "token"); + char *url = malloc(strlen("/interactions///callback") + strlen(i_id) + strlen(i_token) + 2); + long code; + + char *packet = NULL; + + cJSON *packet_js = cJSON_CreateObject(); + cJSON_AddNumberToObject(packet_js, "type", 5); + if(hidden) { + cJSON *data = cJSON_CreateObject(); + cJSON_AddNumberToObject(data, "flags", 1 << 6); + cJSON_AddItemToObject(packet_js, "data", data); + } + packet = cJSON_PrintUnformatted(packet_js); + cJSON_Delete(packet_js); + + sprintf(url, "/interactions/%s/%s/callback", i_id, i_token); + + close(api_post(url, headers, packet, &code)); + + free(url); + free(packet); + curl_slist_free_all(headers); + + return (code % 100) != 200; +} + +int interaction_edit_reply(cJSON *i, char *content, int raw) { + struct curl_slist *headers = curl_slist_append(NULL, "Content-type: application/json"); + char *i_token = js_getStr(i, "token"); + char *url = malloc(strlen("/webhooks///messages/@original") + strlen(app_id) + strlen(i_token) + 2); + long code; + + char *message = content; + + if(!raw) { + cJSON *message_js = cJSON_CreateObject(); + cJSON_AddStringToObject(message_js, "content", content); + message = cJSON_PrintUnformatted(message_js); + cJSON_Delete(message_js); + } + + sprintf(url, "/webhooks/%s/%s/messages/@original", app_id, i_token); + + close(api_patch(url, headers, message, &code)); + free(url); + if(!raw) free(message); + curl_slist_free_all(headers); + + return (code % 100) != 200; +} |