diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 300 |
1 files changed, 0 insertions, 300 deletions
diff --git a/src/main.c b/src/main.c deleted file mode 100644 index ad7c174..0000000 --- a/src/main.c +++ /dev/null @@ -1,300 +0,0 @@ -#include <stdlib.h> -#include <stdio.h> -#include <curl/curl.h> -#include <unistd.h> -#include <i18n.h> -#include <string.h> -#include <lib.c> -#include <cJSON.h> -#include <cJSON.c> -#define DC_API_PREFIX "https://discord.com/api/v8/" -#define DC_LOGIN_FORMAT "{\"login\":\"%s\",\"password\":\"%s\",\"undelete\":false,\"captcha_key\":null,\"login_source\":null,\"gift_code_sku_id\":null}" -#define DC_USER_AGENT "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36" -#define DC_DEBUG 0 -#define DC_COMMAND_LINE_LENGTH 2000 -#define cJSON_Izbrisi(item) do { item != NULL ? cJSON_Delete(item) : 0; } while (0) -#define DC_COMMAND_CHAR '/' -int main(int argc, char ** argv) { - srand(time(NULL)); - int returnstatus = 0; - int opt; - cJSON * guilds = 0; - char * email = getenv("DC_E"); - char * password = getenv("DC_P"); - while ((opt = getopt(argc, argv, "e:p:h")) != -1) { - switch (opt) { - case 'h': - fprintf(stdout, DC_I18N_USAGE); - break; - case 'e': - if (!email) { - email = malloc(strlen(optarg)+1); - strcpy(email, optarg); - } else - fprintf(stderr, DC_I18N_ARG_ALREADY_SET "\n", opt); - break; - case 'p': - if (!password) { - password = malloc(strlen(optarg)+1); - strcpy(password, optarg); - } else - fprintf(stderr, DC_I18N_ARG_ALREADY_SET "\n", opt); - break; - default: - fprintf(stderr, DC_I18N_UNREC_ARG "\n", opt); - } - } - if (!email || !password) { - fprintf(stderr, DC_I18N_MISSING_EP "\n"); - free(email); email = NULL; - free(password); password = NULL; - return 1; - } - CURL *curl; - CURLcode res; - curl = curl_easy_init(); - if (!curl) { - fprintf(stderr, "curl_easy_init() " DC_I18N_FAILED ".\n"); - return 1; - } - struct writefunc_string s; - init_writefunc_string(&s); - - char * data = malloc(strlen(DC_LOGIN_FORMAT)+strlen(email)+strlen(password)); - sprintf(data, DC_LOGIN_FORMAT, email, password); - struct curl_slist *headers = NULL; - headers = curl_slist_append(headers, "Content-Type: application/json"); - headers = curl_slist_append(headers, "User-Agent: " DC_USER_AGENT); - curl_easy_setopt(curl, CURLOPT_URL, DC_API_PREFIX "auth/login"); - curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writefunc); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &s); - res = curl_easy_perform(curl); - if (res != CURLE_OK) - fprintf(stderr, "curl_easy_perform() " DC_I18N_FAILED ": %s\n", curl_easy_strerror(res)); - cJSON * json = cJSON_Parse(s.ptr); - cJSON * token = cJSON_GetObjectItemCaseSensitive(json, "token"); - char * authorization = NULL; - if (cJSON_IsString(token) && (token->valuestring != NULL)) { - authorization = malloc(strlen(token->valuestring)+strlen("authorization: ")+1); - strcpy(authorization, "Authorization: "); - strcat(authorization, token->valuestring); - if(DC_DEBUG) fprintf(stderr, "d: %s\n", s.ptr); - cJSON_Izbrisi(json); - } else { - fprintf(stderr, DC_I18N_LOGIN_FAILED "\n", s.ptr); - cJSON_Izbrisi(json); - returnstatus = 3; - free(s.ptr); s.ptr = NULL; - goto returncleanly; - } - free(s.ptr); s.ptr = NULL; - init_writefunc_string(&s); - curl_easy_setopt(curl, CURLOPT_URL, DC_API_PREFIX "users/@me"); - curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L); - headers = curl_slist_append(headers, authorization); - res = curl_easy_perform(curl); - if (res != CURLE_OK) - fprintf(stderr, "curl_easy_perform() " DC_I18N_FAILED ": %s\n", curl_easy_strerror(res)); - json = cJSON_Parse(s.ptr); - token = cJSON_GetObjectItemCaseSensitive(json, "username"); - cJSON * token2 = cJSON_GetObjectItemCaseSensitive(json, "discriminator"); - char * handle = NULL; - if (cJSON_IsString(token) && (token->valuestring != NULL) - && cJSON_IsString(token2) && (token2->valuestring != NULL)) { - handle = malloc(strlen(token->valuestring)+1+strlen(token2->valuestring)+1); - strcpy(handle, token->valuestring); - strcat(handle, "#"); - strcat(handle, token2->valuestring); - fprintf(stdout, DC_I18N_LOGGED_IN "\n", handle); - } else { - fprintf(stderr, DC_I18N_LOGIN_FAILED "\n", s.ptr); - cJSON_Izbrisi(json); - returnstatus = 4; - free(s.ptr); s.ptr = NULL; - goto returncleanly; - } - free(s.ptr); s.ptr = NULL; - /* start command listener */ - char * fgetsret = NULL; - char cmd[DC_COMMAND_LINE_LENGTH+1]; - long long int setguild = 0; - long long int setchannel = 0; - char * joinedchannelname = NULL; - char * joinedchannelid = NULL; - char * tempstring = NULL; - while (1) { - fprintf(stderr, "%s%s> ", joinedchannelname ? "#" : "", joinedchannelname ? joinedchannelname : ""); - fflush(stderr); - fgetsret = fgets(cmd, DC_COMMAND_LINE_LENGTH, stdin); - if (fgetsret == NULL) { - fprintf(stderr, "fgets() " DC_I18N_FAILED "\n"); - returnstatus = 5; - goto returncleanly; - break; - } - if (cmd[0] == DC_COMMAND_CHAR) { - switch (cmd[1]) { - case 'g': - case 'G': - case 's': /* /guilds */ - case 'S': /* /guilds force-update */ - if (!guilds || (strchr(cmd, ' ') ? (strchr(cmd, ' ')+1)[0] == 'f' : 0)) { -#define DC_API_METHOD_GET(body) curl_easy_setopt(curl, CURLOPT_HTTPGET, 1L) -#define DC_API_METHOD_POST(body) curl_easy_setopt(curl, CURLOPT_POSTFIELDS, body) -#define DC_API(endpoint, method, body, output) do {\ - curl_easy_setopt(curl, CURLOPT_URL, endpoint); \ - DC_API_METHOD_##method(body); \ - free(s.ptr); s.ptr = NULL; \ - init_writefunc_string(&s); \ - res = curl_easy_perform(curl); \ - if (res != CURLE_OK) \ - fprintf(stderr, "curl_easy_perform() " DC_I18N_FAILED ": %s\n", curl_easy_strerror(res)); \ - cJSON_Izbrisi(output); \ - output = cJSON_Parse(s.ptr); } while (0) - DC_API(DC_API_PREFIX "users/@me/guilds", GET, "", guilds); - } - int i = 0; - cJSON * guild = NULL; - cJSON_ArrayForEach(guild, guilds) { - token = cJSON_GetObjectItem(guild, "name"); - fprintf(stdout, " %d. %s\n", i++, token->valuestring); - } - break; - case 'c': - case 'C': - case 'k': /* /channels <guild number> [force-update] */ - case 'K': - if (strchr(cmd, ' ') == NULL) { - fprintf(stderr, DC_I18N_GUILD_NOT_SET "\n"); - break; - } - setguild = strtoll(strchr(cmd, ' ')+1, NULL, 10); - if (!guilds || !cJSON_IsObject(guilds)) - DC_API(DC_API_PREFIX "users/@me/guilds", GET, "", guilds); - cJSON_ArrayForEach(guild, guilds) { - if (setguild-- == 0) { - cJSON * guildchannels = cJSON_GetObjectItem(guild, "channels"); - if (!cJSON_IsArray(guildchannels) || strchr(strchr(cmd,' ')+1,' ') ? 1 : 0) { -#define DC_UPDATE_CHANNELS(guild) do {\ - token = cJSON_GetObjectItem(guild, "id"); \ - tempstring = realloc(tempstring, strlen(token->valuestring)+strlen("guilds//channels")+1+ strlen(DC_API_PREFIX)); \ - sprintf(tempstring, DC_API_PREFIX "guilds/%s/channels", token->valuestring); \ - guildchannels = cJSON_CreateObject(); \ - DC_API(tempstring, GET, "", guildchannels); \ - cJSON_AddItemToObject(guild, "channels", guildchannels); \ - free(tempstring); tempstring = NULL; } while (0) - DC_UPDATE_CHANNELS(guild); - } - setguild = 0; - cJSON * guildchannel = NULL; - cJSON_ArrayForEach(guildchannel, guildchannels) { - token = cJSON_GetObjectItem(guildchannel, "name"); - token2 = cJSON_GetObjectItem(guildchannel, "topic"); - cJSON * type = cJSON_GetObjectItem(guildchannel, "type"); - if (type->valuedouble == 0) /* samo za besedilne kanale */ - fprintf(stdout, " %lld. #%s%s%s\n", setguild++, token->valuestring, token2->valuestring ? " - " : "", token2->valuestring ? token2->valuestring : ""); - } - break; - } - } - break; - case 'j': - case 'J': - case 'p': - case 'P': - if (strchr(cmd, ' ') == NULL) { - fprintf(stderr, DC_I18N_GUILD_NOT_SET "\n"); - break; - } - if (strchr(strchr(cmd, ' ')+1, ' ') == NULL) { - fprintf(stderr, DC_I18N_CHANNEL_NOT_SET "\n"); - break; - } - setguild = strtoll(strchr(cmd, ' ')+1, NULL, 10); - setchannel = strtoll(strchr(strchr(cmd, ' ')+1, ' ')+1, NULL, 10); - if (!guilds) - DC_API(DC_API_PREFIX "users/@me/guilds", GET, "", guilds); - cJSON_ArrayForEach(guild, guilds) { - if (setguild-- == 0) { - cJSON * guildchannels = cJSON_GetObjectItem(guild, "channels"); - if (!cJSON_IsArray(guildchannels)) - DC_UPDATE_CHANNELS(guild); - cJSON * guildchannel = NULL; - cJSON_ArrayForEach(guildchannel, guildchannels) { - cJSON * type = cJSON_GetObjectItem(guildchannel, "type"); - if (type->valueint != 0) setchannel++; - if (setchannel-- == 0) { - char * joinedchannel_pointer = (cJSON_GetObjectItem(guildchannel, "id")->valuestring); - joinedchannelid = realloc(joinedchannelid, strlen(joinedchannel_pointer)+1); - strcpy(joinedchannelid, joinedchannel_pointer); - joinedchannel_pointer = cJSON_GetObjectItem(guildchannel, "name")->valuestring; - joinedchannelname = realloc(joinedchannelname, strlen(joinedchannel_pointer)+1); - strcpy(joinedchannelname, joinedchannel_pointer); - } - } - } - } - char * queryparam = malloc(strlen(DC_API_PREFIX "channels//messages?limit=100")+strlen(joinedchannelid)+1); - sprintf(queryparam, DC_API_PREFIX "channels/%s/messages?limit=100", joinedchannelid); - DC_API(queryparam, GET, "", token); - if (!cJSON_IsArray(token)) { - fprintf(stderr, DC_I18N_MESSAGES_GET_FAIL "\n"); - free(queryparam); queryparam = NULL; - joinedchannelid = NULL; - joinedchannelname = NULL; - break; - } - cJSON * sporocilo = cJSON_GetArrayItem(token, cJSON_GetArraySize(token)-1); /* last item in array is the first chat */ - do { -#define cJSON_GetObjectItem2(root, name1, name2) (cJSON_GetObjectItem(root, name1) ? cJSON_GetObjectItem(cJSON_GetObjectItem(root, name1), name2) : NULL) - fprintf(stdout, "%.19s %s#%s: %s\n", - cJSON_GetObjectItem(sporocilo, "timestamp")->valuestring, - cJSON_GetObjectItem2(sporocilo, "author", "username")->valuestring, - cJSON_GetObjectItem2(sporocilo, "author", "discriminator")->valuestring, - cJSON_GetObjectItem(sporocilo, "content")->valuestring - ); - sporocilo = sporocilo->prev; - } while (sporocilo->prev->next != NULL); - free(queryparam); queryparam = NULL; - break; - case 'q': - case 'Q': - case 'i': - case 'I': - goto returncleanly; - default: - goto to_je_sporocilo; - } - } else { - to_je_sporocilo: - if (joinedchannelid == NULL) { - fprintf(stderr, DC_I18N_NOT_JOINED "\n"); - continue; - } - cJSON * message = cJSON_CreateObject(); - cJSON * nons = cJSON_CreateNumber(rand()); - cJSON_AddItemToObject(message, "nonce", nons); - cJSON * content = cJSON_CreateString(cmd); - cJSON_AddItemToObject(message, "content", content); - cJSON * tts = cJSON_CreateFalse(); - cJSON_AddItemToObject(message, "tts", tts); - char * jsonmessage = cJSON_Print(message); - char * target = malloc(strlen(joinedchannelid)+strlen("channels//messages")+strlen(DC_API_PREFIX)+1); - sprintf(target, DC_API_PREFIX "channels/%s/messages", joinedchannelid); - cJSON * jsonresponse = NULL; - DC_API(target, POST, jsonmessage, jsonresponse); - free(jsonmessage); jsonmessage = NULL; - free(target); target = NULL; - cJSON_Izbrisi(message); - cJSON_Izbrisi(jsonresponse); /* jsonresponse izgleda sploh nismo uporabili */ - } - } - returncleanly: - cJSON_Izbrisi(guilds); - curl_easy_cleanup(curl); - curl_slist_free_all(headers); - return 0; -} |