split into library and applications
This commit is contained in:
parent
8972538d13
commit
05694d2611
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
/build/
|
@ -8,40 +8,7 @@ PKG_CHECK_MODULES(CURL REQUIRED libcurl)
|
||||
PKG_CHECK_MODULES(EVENT REQUIRED libevent libevent_pthreads)
|
||||
PKG_CHECK_MODULES(GLIB2 REQUIRED glib-2.0)
|
||||
|
||||
SET(TARGET "ncdc")
|
||||
|
||||
SET(SOURCES
|
||||
"include/ncdc/account.h"
|
||||
"include/ncdc/api.h"
|
||||
"include/ncdc/apisync.h"
|
||||
"include/ncdc/ncdc.h"
|
||||
"include/ncdc/refable.h"
|
||||
"src/account.c"
|
||||
"src/api.c"
|
||||
"src/apisync.c"
|
||||
"src/ncdc.c"
|
||||
"src/refable.c"
|
||||
)
|
||||
|
||||
ADD_DEFINITIONS("-Wall -Werror -std=c11 -D_GNU_SOURCE")
|
||||
|
||||
INCLUDE_DIRECTORIES("include"
|
||||
${JANSSON_INCLUDE_DIRS}
|
||||
${CURL_INCLUDE_DIRS}
|
||||
${EVENT_INCLUDE_DIRS}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
)
|
||||
LINK_DIRECTORIES(${JANSSON_LIBRARY_DIRS}
|
||||
${CURL_LIBRARY_DIRS}
|
||||
${EVENT_LIBRARY_DIRS}
|
||||
${GLIB2_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(${TARGET} ${SOURCES})
|
||||
TARGET_LINK_LIBRARIES(${TARGET}
|
||||
${JANSSON_LIBRARIES}
|
||||
${CURL_LIBRARIES}
|
||||
${EVENT_LIBRARIES}
|
||||
${GLIB2_LIBRARIES}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
)
|
||||
ADD_SUBDIRECTORY(libdc)
|
||||
ADD_SUBDIRECTORY(ncdc)
|
||||
|
@ -1,25 +0,0 @@
|
||||
#ifndef NCDC_ACCOUNT_H
|
||||
#define NCDC_ACCOUNT_H
|
||||
|
||||
#include <ncdc/ncdc.h>
|
||||
|
||||
struct ncdc_account_;
|
||||
typedef struct ncdc_account_ *ncdc_account_t;
|
||||
|
||||
ncdc_account_t ncdc_account_new(void);
|
||||
ncdc_account_t ncdc_account_new2(char const *email, char const *pass);
|
||||
|
||||
void ncdc_account_set_email(ncdc_account_t a, char const *email);
|
||||
char const *ncdc_account_email(ncdc_account_t a);
|
||||
|
||||
void ncdc_account_set_password(ncdc_account_t a, char const *password);
|
||||
char const *ncdc_account_password(ncdc_account_t a);
|
||||
|
||||
void ncdc_account_set_id(ncdc_account_t a, char const *id);
|
||||
char const *ncdc_account_id(ncdc_account_t a);
|
||||
|
||||
void ncdc_account_set_token(ncdc_account_t a, char const *token);
|
||||
char const *ncdc_account_token(ncdc_account_t a);
|
||||
bool ncdc_account_has_token(ncdc_account_t a);
|
||||
|
||||
#endif
|
@ -1,34 +0,0 @@
|
||||
#ifndef NCDC_API_H
|
||||
#define NCDC_API_H
|
||||
|
||||
#include <ncdc/ncdc.h>
|
||||
|
||||
#include <ncdc/apisync.h>
|
||||
#include <ncdc/account.h>
|
||||
|
||||
struct ncdc_api_;
|
||||
typedef struct ncdc_api_ *ncdc_api_t;
|
||||
|
||||
ncdc_api_t ncdc_api_new(void);
|
||||
|
||||
void ncdc_api_set_curl_multi(ncdc_api_t api, CURLM *curl);
|
||||
void ncdc_api_set_event_base(ncdc_api_t api, struct event_base *base);
|
||||
|
||||
/* call this function in case the MULTI has told us that some
|
||||
* transfer has finished.
|
||||
*/
|
||||
void ncdc_api_signal(ncdc_api_t api, CURL *easy, int code);
|
||||
|
||||
/* internal curl stuff
|
||||
*/
|
||||
ncdc_api_sync_t ncdc_api_call(ncdc_api_t api, char const *token,
|
||||
char const *method, json_t *j);
|
||||
json_t *ncdc_api_call_sync(ncdc_api_t api, char const *token,
|
||||
char const *method, json_t *j);
|
||||
|
||||
bool ncdc_api_authenticate(ncdc_api_t api, ncdc_account_t account);
|
||||
bool ncdc_api_userinfo(ncdc_api_t api, ncdc_account_t logion,
|
||||
ncdc_account_t user);
|
||||
|
||||
|
||||
#endif
|
@ -1,20 +0,0 @@
|
||||
#ifndef NCDC_API_ASYNC_H
|
||||
#define NCDC_API_ASYNC_H
|
||||
|
||||
#include <ncdc/ncdc.h>
|
||||
|
||||
struct ncdc_api_sync_;
|
||||
typedef struct ncdc_api_sync_ *ncdc_api_sync_t;
|
||||
|
||||
ncdc_api_sync_t ncdc_api_sync_new(CURLM *curl, CURL *easy);
|
||||
|
||||
FILE *ncdc_api_sync_stream(ncdc_api_sync_t sync);
|
||||
char const *ncdc_api_sync_data(ncdc_api_sync_t sync);
|
||||
size_t ncdc_api_sync_datalen(ncdc_api_sync_t sync);
|
||||
int ncdc_api_sync_code(ncdc_api_sync_t sync);
|
||||
struct curl_slist *ncdc_api_sync_list(ncdc_api_sync_t sync);
|
||||
|
||||
bool ncdc_api_sync_wait(ncdc_api_sync_t sync);
|
||||
void ncdc_api_sync_finish(ncdc_api_sync_t sync, int code);
|
||||
|
||||
#endif
|
@ -1,16 +0,0 @@
|
||||
#ifndef NCDC_REFABLE_H
|
||||
#define NCDC_REFABLE_H
|
||||
|
||||
#include <ncdc/ncdc.h>
|
||||
|
||||
typedef void (*cleanup_t)(void *);
|
||||
|
||||
typedef struct {
|
||||
int ref;
|
||||
cleanup_t cleanup;
|
||||
} ncdc_refable_t;
|
||||
|
||||
void *ncdc_ref(void *);
|
||||
void ncdc_unref(void *);
|
||||
|
||||
#endif
|
42
libdc/CMakeLists.txt
Normal file
42
libdc/CMakeLists.txt
Normal file
@ -0,0 +1,42 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
|
||||
|
||||
SET(TARGET "dc")
|
||||
|
||||
SET(DC_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include" CACHE STRING
|
||||
"Discord API include directories"
|
||||
)
|
||||
SET(DC_LIBRARIES "${TARGET}" CACHE STRING "Discord API libraries")
|
||||
|
||||
SET(SOURCES
|
||||
"include/dc/account.h"
|
||||
"include/dc/api.h"
|
||||
"include/dc/apisync.h"
|
||||
"include/dc/refable.h"
|
||||
"include/dc/util.h"
|
||||
"src/account.c"
|
||||
"src/api.c"
|
||||
"src/apisync.c"
|
||||
"src/refable.c"
|
||||
"src/util.c"
|
||||
)
|
||||
|
||||
INCLUDE_DIRECTORIES("include"
|
||||
${JANSSON_INCLUDE_DIRS}
|
||||
${CURL_INCLUDE_DIRS}
|
||||
${EVENT_INCLUDE_DIRS}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
)
|
||||
LINK_DIRECTORIES(${JANSSON_LIBRARY_DIRS}
|
||||
${CURL_LIBRARY_DIRS}
|
||||
${EVENT_LIBRARY_DIRS}
|
||||
${GLIB2_LIBRARY_DIRS}
|
||||
)
|
||||
|
||||
ADD_LIBRARY(${TARGET} SHARED ${SOURCES})
|
||||
TARGET_LINK_LIBRARIES(${TARGET}
|
||||
${JANSSON_LIBRARIES}
|
||||
${CURL_LIBRARIES}
|
||||
${EVENT_LIBRARIES}
|
||||
${GLIB2_LIBRARIES}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
)
|
26
libdc/include/dc/account.h
Normal file
26
libdc/include/dc/account.h
Normal file
@ -0,0 +1,26 @@
|
||||
#ifndef DC_ACCOUNT_H
|
||||
#define DC_ACCOUNT_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
struct dc_account_;
|
||||
typedef struct dc_account_ *dc_account_t;
|
||||
|
||||
dc_account_t dc_account_new(void);
|
||||
dc_account_t dc_account_new2(char const *email, char const *pass);
|
||||
|
||||
void dc_account_set_email(dc_account_t a, char const *email);
|
||||
char const *dc_account_email(dc_account_t a);
|
||||
|
||||
void dc_account_set_password(dc_account_t a, char const *password);
|
||||
char const *dc_account_password(dc_account_t a);
|
||||
|
||||
void dc_account_set_id(dc_account_t a, char const *id);
|
||||
char const *dc_account_id(dc_account_t a);
|
||||
|
||||
void dc_account_set_token(dc_account_t a, char const *token);
|
||||
char const *dc_account_token(dc_account_t a);
|
||||
bool dc_account_has_token(dc_account_t a);
|
||||
|
||||
#endif
|
37
libdc/include/dc/api.h
Normal file
37
libdc/include/dc/api.h
Normal file
@ -0,0 +1,37 @@
|
||||
#ifndef NCDC_API_H
|
||||
#define NCDC_API_H
|
||||
|
||||
#include <dc/apisync.h>
|
||||
#include <dc/account.h>
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <jansson.h>
|
||||
#include <event.h>
|
||||
|
||||
struct dc_api_;
|
||||
typedef struct dc_api_ *dc_api_t;
|
||||
|
||||
dc_api_t dc_api_new(void);
|
||||
|
||||
void dc_api_set_curl_multi(dc_api_t api, CURLM *curl);
|
||||
void dc_api_set_event_base(dc_api_t api, struct event_base *base);
|
||||
|
||||
/* call this function in case the MULTI has told us that some
|
||||
* transfer has finished.
|
||||
*/
|
||||
void dc_api_signal(dc_api_t api, CURL *easy, int code);
|
||||
|
||||
/* internal curl stuff
|
||||
*/
|
||||
dc_api_sync_t dc_api_call(dc_api_t api, char const *token,
|
||||
char const *method, json_t *j);
|
||||
json_t *dc_api_call_sync(dc_api_t api, char const *token,
|
||||
char const *method, json_t *j);
|
||||
|
||||
bool dc_api_authenticate(dc_api_t api, dc_account_t account);
|
||||
bool dc_api_userinfo(dc_api_t api, dc_account_t logion,
|
||||
dc_account_t user);
|
||||
|
||||
|
||||
#endif
|
23
libdc/include/dc/apisync.h
Normal file
23
libdc/include/dc/apisync.h
Normal file
@ -0,0 +1,23 @@
|
||||
#ifndef DC_API_ASYNC_H
|
||||
#define DC_API_ASYNC_H
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
struct dc_api_sync_;
|
||||
typedef struct dc_api_sync_ *dc_api_sync_t;
|
||||
|
||||
dc_api_sync_t dc_api_sync_new(CURLM *curl, CURL *easy);
|
||||
|
||||
FILE *dc_api_sync_stream(dc_api_sync_t sync);
|
||||
char const *dc_api_sync_data(dc_api_sync_t sync);
|
||||
size_t dc_api_sync_datalen(dc_api_sync_t sync);
|
||||
int dc_api_sync_code(dc_api_sync_t sync);
|
||||
struct curl_slist *dc_api_sync_list(dc_api_sync_t sync);
|
||||
|
||||
bool dc_api_sync_wait(dc_api_sync_t sync);
|
||||
void dc_api_sync_finish(dc_api_sync_t sync, int code);
|
||||
|
||||
#endif
|
14
libdc/include/dc/refable.h
Normal file
14
libdc/include/dc/refable.h
Normal file
@ -0,0 +1,14 @@
|
||||
#ifndef DC_REFABLE_H
|
||||
#define DC_REFABLE_H
|
||||
|
||||
typedef void (*dc_cleanup_t)(void *);
|
||||
|
||||
typedef struct {
|
||||
int ref;
|
||||
dc_cleanup_t cleanup;
|
||||
} dc_refable_t;
|
||||
|
||||
void *dc_ref(void *);
|
||||
void dc_unref(void *);
|
||||
|
||||
#endif
|
8
libdc/include/dc/util.h
Normal file
8
libdc/include/dc/util.h
Normal file
@ -0,0 +1,8 @@
|
||||
#ifndef NCDC_UTIL_H
|
||||
#define NCDC_UTIL_H
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
void ncdc_util_dump_json(json_t *j);
|
||||
|
||||
#endif
|
@ -1,13 +1,15 @@
|
||||
#include <ncdc/account.h>
|
||||
#include <ncdc/refable.h>
|
||||
#include <dc/account.h>
|
||||
#include <dc/refable.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct ncdc_account_
|
||||
struct dc_account_
|
||||
{
|
||||
ncdc_refable_t ref; /* do not move anything above ref */
|
||||
dc_refable_t ref; /* do not move anything above ref */
|
||||
|
||||
char *email;
|
||||
char *password;
|
||||
@ -21,7 +23,7 @@ struct ncdc_account_
|
||||
char *token;
|
||||
};
|
||||
|
||||
static void ncdc_account_free(ncdc_account_t ptr)
|
||||
static void dc_account_free(dc_account_t ptr)
|
||||
{
|
||||
return_if_true(ptr == NULL,);
|
||||
|
||||
@ -31,28 +33,28 @@ static void ncdc_account_free(ncdc_account_t ptr)
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
ncdc_account_t ncdc_account_new(void)
|
||||
dc_account_t dc_account_new(void)
|
||||
{
|
||||
ncdc_account_t ptr = calloc(1, sizeof(struct ncdc_account_));
|
||||
dc_account_t ptr = calloc(1, sizeof(struct dc_account_));
|
||||
|
||||
ptr->ref.cleanup = (cleanup_t)ncdc_account_free;
|
||||
ptr->ref.cleanup = (dc_cleanup_t)dc_account_free;
|
||||
|
||||
return ncdc_ref(ptr);
|
||||
return dc_ref(ptr);
|
||||
}
|
||||
|
||||
ncdc_account_t ncdc_account_new2(char const *email, char const *pass)
|
||||
dc_account_t dc_account_new2(char const *email, char const *pass)
|
||||
{
|
||||
ncdc_account_t ptr = ncdc_account_new();
|
||||
dc_account_t ptr = dc_account_new();
|
||||
|
||||
if (ptr != NULL) {
|
||||
ncdc_account_set_email(ptr, email);
|
||||
ncdc_account_set_password(ptr, pass);
|
||||
dc_account_set_email(ptr, email);
|
||||
dc_account_set_password(ptr, pass);
|
||||
}
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void ncdc_account_set_email(ncdc_account_t a, char const *email)
|
||||
void dc_account_set_email(dc_account_t a, char const *email)
|
||||
{
|
||||
return_if_true(a == NULL,);
|
||||
return_if_true(email == NULL,);
|
||||
@ -61,13 +63,13 @@ void ncdc_account_set_email(ncdc_account_t a, char const *email)
|
||||
a->email = strdup(email);
|
||||
}
|
||||
|
||||
char const *ncdc_account_email(ncdc_account_t a)
|
||||
char const *dc_account_email(dc_account_t a)
|
||||
{
|
||||
return_if_true(a == NULL, NULL);
|
||||
return a->email;
|
||||
}
|
||||
|
||||
void ncdc_account_set_password(ncdc_account_t a, char const *password)
|
||||
void dc_account_set_password(dc_account_t a, char const *password)
|
||||
{
|
||||
return_if_true(a == NULL,);
|
||||
return_if_true(password == NULL,);
|
||||
@ -76,13 +78,13 @@ void ncdc_account_set_password(ncdc_account_t a, char const *password)
|
||||
a->password = strdup(password);
|
||||
}
|
||||
|
||||
char const *ncdc_account_password(ncdc_account_t a)
|
||||
char const *dc_account_password(dc_account_t a)
|
||||
{
|
||||
return_if_true(a == NULL, NULL);
|
||||
return a->password;
|
||||
}
|
||||
|
||||
void ncdc_account_set_token(ncdc_account_t a, char const *token)
|
||||
void dc_account_set_token(dc_account_t a, char const *token)
|
||||
{
|
||||
return_if_true(a == NULL,);
|
||||
|
||||
@ -94,27 +96,27 @@ void ncdc_account_set_token(ncdc_account_t a, char const *token)
|
||||
}
|
||||
}
|
||||
|
||||
char const *ncdc_account_token(ncdc_account_t a)
|
||||
char const *dc_account_token(dc_account_t a)
|
||||
{
|
||||
return_if_true(a == NULL, NULL);
|
||||
return a->token;
|
||||
}
|
||||
|
||||
bool ncdc_account_has_token(ncdc_account_t a)
|
||||
bool dc_account_has_token(dc_account_t a)
|
||||
{
|
||||
return_if_true(a == NULL, false);
|
||||
return_if_true(a->token == NULL, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
void ncdc_account_set_id(ncdc_account_t a, char const *id)
|
||||
void dc_account_set_id(dc_account_t a, char const *id)
|
||||
{
|
||||
return_if_true(a == NULL,);
|
||||
free(a->id);
|
||||
a->id = strdup(id);
|
||||
}
|
||||
|
||||
char const *ncdc_account_id(ncdc_account_t a)
|
||||
char const *dc_account_id(dc_account_t a)
|
||||
{
|
||||
return_if_true(a == NULL,NULL);
|
||||
return a->id;
|
@ -1,14 +1,15 @@
|
||||
#include <ncdc/api.h>
|
||||
#include <ncdc/refable.h>
|
||||
#include <dc/api.h>
|
||||
#include <dc/refable.h>
|
||||
#include "internal.h"
|
||||
|
||||
#define DISCORD_URL "https://discordapp.com/api/v6"
|
||||
|
||||
#define DISCORD_USERAGENT "Mozilla/5.0 (X11; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0"
|
||||
#define DISCORD_API_AUTH "auth/login"
|
||||
|
||||
struct ncdc_api_
|
||||
struct dc_api_
|
||||
{
|
||||
ncdc_refable_t ref;
|
||||
dc_refable_t ref;
|
||||
|
||||
struct event_base *base;
|
||||
CURLM *curl;
|
||||
@ -18,7 +19,7 @@ struct ncdc_api_
|
||||
char *cookie;
|
||||
};
|
||||
|
||||
static void ncdc_api_free(ncdc_api_t ptr)
|
||||
static void dc_api_free(dc_api_t ptr)
|
||||
{
|
||||
return_if_true(ptr == NULL,);
|
||||
|
||||
@ -30,25 +31,25 @@ static void ncdc_api_free(ncdc_api_t ptr)
|
||||
free(ptr);
|
||||
}
|
||||
|
||||
ncdc_api_t ncdc_api_new(void)
|
||||
dc_api_t dc_api_new(void)
|
||||
{
|
||||
ncdc_api_t ptr = calloc(1, sizeof(struct ncdc_api_));
|
||||
dc_api_t ptr = calloc(1, sizeof(struct dc_api_));
|
||||
return_if_true(ptr == NULL, NULL);
|
||||
|
||||
ptr->ref.cleanup = (cleanup_t)ncdc_api_free;
|
||||
ptr->ref.cleanup = (dc_cleanup_t)dc_api_free;
|
||||
|
||||
ptr->syncs = g_hash_table_new_full(g_direct_hash, g_direct_equal,
|
||||
NULL, ncdc_unref
|
||||
NULL, dc_unref
|
||||
);
|
||||
if (ptr->syncs == NULL) {
|
||||
free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ncdc_ref(ptr);
|
||||
return dc_ref(ptr);
|
||||
}
|
||||
|
||||
void ncdc_api_set_curl_multi(ncdc_api_t api, CURLM *curl)
|
||||
void dc_api_set_curl_multi(dc_api_t api, CURLM *curl)
|
||||
{
|
||||
return_if_true(api == NULL,);
|
||||
return_if_true(curl == NULL,);
|
||||
@ -56,7 +57,7 @@ void ncdc_api_set_curl_multi(ncdc_api_t api, CURLM *curl)
|
||||
api->curl = curl;
|
||||
}
|
||||
|
||||
void ncdc_api_set_event_base(ncdc_api_t api, struct event_base *base)
|
||||
void dc_api_set_event_base(dc_api_t api, struct event_base *base)
|
||||
{
|
||||
return_if_true(api == NULL,);
|
||||
return_if_true(base == NULL,);
|
||||
@ -64,16 +65,16 @@ void ncdc_api_set_event_base(ncdc_api_t api, struct event_base *base)
|
||||
api->base = base;
|
||||
}
|
||||
|
||||
void ncdc_api_signal(ncdc_api_t api, CURL *easy, int code)
|
||||
void dc_api_signal(dc_api_t api, CURL *easy, int code)
|
||||
{
|
||||
ncdc_api_sync_t sync = NULL;
|
||||
dc_api_sync_t sync = NULL;
|
||||
|
||||
return_if_true(api == NULL,);
|
||||
return_if_true(easy == NULL,);
|
||||
|
||||
sync = g_hash_table_lookup(api->syncs, easy);
|
||||
if (sync != NULL) {
|
||||
ncdc_api_sync_finish(sync, code);
|
||||
dc_api_sync_finish(sync, code);
|
||||
g_hash_table_remove(api->syncs, easy);
|
||||
}
|
||||
}
|
||||
@ -99,7 +100,7 @@ static int debug_callback(CURL *handle, curl_infotype type,
|
||||
}
|
||||
#endif
|
||||
|
||||
static int header_callback(char *data, size_t sz, size_t num, ncdc_api_t api)
|
||||
static int header_callback(char *data, size_t sz, size_t num, dc_api_t api)
|
||||
{
|
||||
char *ptr = NULL;
|
||||
|
||||
@ -118,7 +119,7 @@ static int header_callback(char *data, size_t sz, size_t num, ncdc_api_t api)
|
||||
return sz * num;
|
||||
}
|
||||
|
||||
static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
static dc_api_sync_t dc_api_post(dc_api_t api,
|
||||
char const *url,
|
||||
char const *token,
|
||||
char const *data, int64_t len)
|
||||
@ -129,7 +130,7 @@ static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
|
||||
CURL *c = NULL;
|
||||
bool ret = false;
|
||||
ncdc_api_sync_t sync = NULL;
|
||||
dc_api_sync_t sync = NULL;
|
||||
struct curl_slist *l = NULL;
|
||||
char *tmp = NULL;
|
||||
int ptr = 0;
|
||||
@ -137,12 +138,12 @@ static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
c = curl_easy_init();
|
||||
goto_if_true(c == NULL, cleanup);
|
||||
|
||||
sync = ncdc_api_sync_new(api->curl, c);
|
||||
sync = dc_api_sync_new(api->curl, c);
|
||||
goto_if_true(c == NULL, cleanup);
|
||||
|
||||
curl_easy_setopt(c, CURLOPT_URL, url);
|
||||
curl_easy_setopt(c, CURLOPT_WRITEFUNCTION, fwrite);
|
||||
curl_easy_setopt(c, CURLOPT_WRITEDATA, ncdc_api_sync_stream(sync));
|
||||
curl_easy_setopt(c, CURLOPT_WRITEDATA, dc_api_sync_stream(sync));
|
||||
curl_easy_setopt(c, CURLOPT_HEADERFUNCTION, header_callback);
|
||||
curl_easy_setopt(c, CURLOPT_HEADERDATA, api);
|
||||
|
||||
@ -150,7 +151,7 @@ static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
curl_easy_setopt(c, CURLOPT_COOKIE, api->cookie);
|
||||
}
|
||||
|
||||
l = ncdc_api_sync_list(sync);
|
||||
l = dc_api_sync_list(sync);
|
||||
if (data != NULL) {
|
||||
curl_slist_append(l, "Content-Type: application/json");
|
||||
}
|
||||
@ -189,7 +190,7 @@ static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
g_hash_table_insert(api->syncs, c, ncdc_ref(sync));
|
||||
g_hash_table_insert(api->syncs, c, dc_ref(sync));
|
||||
curl_multi_socket_action(api->curl, CURL_SOCKET_TIMEOUT, 0, &ptr);
|
||||
|
||||
ret = true;
|
||||
@ -197,19 +198,19 @@ static ncdc_api_sync_t ncdc_api_post(ncdc_api_t api,
|
||||
cleanup:
|
||||
|
||||
if (!ret) {
|
||||
ncdc_unref(sync);
|
||||
dc_unref(sync);
|
||||
sync = NULL;
|
||||
}
|
||||
|
||||
return sync;
|
||||
}
|
||||
|
||||
ncdc_api_sync_t ncdc_api_call(ncdc_api_t api, char const *token,
|
||||
dc_api_sync_t dc_api_call(dc_api_t api, char const *token,
|
||||
char const *method, json_t *j)
|
||||
{
|
||||
char *data = NULL;
|
||||
char *url = NULL;
|
||||
ncdc_api_sync_t s = NULL;
|
||||
dc_api_sync_t s = NULL;
|
||||
|
||||
asprintf(&url, "%s/%s", DISCORD_URL, method);
|
||||
goto_if_true(url == NULL, cleanup);
|
||||
@ -219,7 +220,7 @@ ncdc_api_sync_t ncdc_api_call(ncdc_api_t api, char const *token,
|
||||
goto_if_true(data == NULL, cleanup);
|
||||
}
|
||||
|
||||
s = ncdc_api_post(api, url, token, data, -1);
|
||||
s = dc_api_post(api, url, token, data, -1);
|
||||
goto_if_true(s == NULL, cleanup);
|
||||
|
||||
cleanup:
|
||||
@ -233,37 +234,37 @@ cleanup:
|
||||
return s;
|
||||
}
|
||||
|
||||
json_t *ncdc_api_call_sync(ncdc_api_t api, char const *token,
|
||||
json_t *dc_api_call_sync(dc_api_t api, char const *token,
|
||||
char const *method, json_t *j)
|
||||
{
|
||||
ncdc_api_sync_t s = NULL;
|
||||
dc_api_sync_t s = NULL;
|
||||
json_t *reply = NULL;
|
||||
|
||||
s = ncdc_api_call(api, token, method, j);
|
||||
s = dc_api_call(api, token, method, j);
|
||||
goto_if_true(s == NULL, cleanup);
|
||||
|
||||
if (!ncdc_api_sync_wait(s)) {
|
||||
if (!dc_api_sync_wait(s)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("api_call_sync: %d\n", ncdc_api_sync_code(s));
|
||||
printf("api_call_sync: %d\n", dc_api_sync_code(s));
|
||||
#endif
|
||||
|
||||
reply = json_loadb(ncdc_api_sync_data(s),
|
||||
ncdc_api_sync_datalen(s),
|
||||
reply = json_loadb(dc_api_sync_data(s),
|
||||
dc_api_sync_datalen(s),
|
||||
0, NULL
|
||||
);
|
||||
|
||||
cleanup:
|
||||
|
||||
ncdc_unref(s);
|
||||
dc_unref(s);
|
||||
s = NULL;
|
||||
|
||||
return reply;
|
||||
}
|
||||
|
||||
static bool ncdc_api_error(json_t *j, int *code, char const **message)
|
||||
static bool dc_api_error(json_t *j, int *code, char const **message)
|
||||
{
|
||||
return_if_true(j == NULL, false);
|
||||
|
||||
@ -289,22 +290,22 @@ static bool ncdc_api_error(json_t *j, int *code, char const **message)
|
||||
return error;
|
||||
}
|
||||
|
||||
bool ncdc_api_authenticate(ncdc_api_t api, ncdc_account_t account)
|
||||
bool dc_api_authenticate(dc_api_t api, dc_account_t account)
|
||||
{
|
||||
json_t *j = json_object(), *reply = NULL, *token = NULL;
|
||||
bool ret = false;
|
||||
|
||||
json_object_set_new(j, "email",
|
||||
json_string(ncdc_account_email(account))
|
||||
json_string(dc_account_email(account))
|
||||
);
|
||||
json_object_set_new(j, "password",
|
||||
json_string(ncdc_account_password(account))
|
||||
json_string(dc_account_password(account))
|
||||
);
|
||||
|
||||
reply = ncdc_api_call_sync(api, NULL, DISCORD_API_AUTH, j);
|
||||
reply = dc_api_call_sync(api, NULL, DISCORD_API_AUTH, j);
|
||||
goto_if_true(reply == NULL, cleanup);
|
||||
|
||||
if (ncdc_api_error(j, NULL, NULL)) {
|
||||
if (dc_api_error(j, NULL, NULL)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -313,7 +314,7 @@ bool ncdc_api_authenticate(ncdc_api_t api, ncdc_account_t account)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ncdc_account_set_token(account, json_string_value(token));
|
||||
dc_account_set_token(account, json_string_value(token));
|
||||
ret = true;
|
||||
|
||||
cleanup:
|
||||
@ -331,8 +332,8 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool ncdc_api_userinfo(ncdc_api_t api, ncdc_account_t login,
|
||||
ncdc_account_t user)
|
||||
bool dc_api_userinfo(dc_api_t api, dc_account_t login,
|
||||
dc_account_t user)
|
||||
{
|
||||
char *url = NULL;
|
||||
json_t *reply = NULL;
|
||||
@ -342,9 +343,9 @@ bool ncdc_api_userinfo(ncdc_api_t api, ncdc_account_t login,
|
||||
return_if_true(login == NULL, false);
|
||||
return_if_true(user == NULL, false);
|
||||
|
||||
asprintf(&url, "users/%s", ncdc_account_id(user));
|
||||
asprintf(&url, "users/%s", dc_account_id(user));
|
||||
|
||||
reply = ncdc_api_call_sync(api, ncdc_account_token(login), url, NULL);
|
||||
reply = dc_api_call_sync(api, dc_account_token(login), url, NULL);
|
||||
goto_if_true(reply == NULL, cleanup);
|
||||
|
||||
/* TODO: parse json and store info in user
|
@ -1,9 +1,11 @@
|
||||
#include <ncdc/apisync.h>
|
||||
#include <ncdc/refable.h>
|
||||
#include <dc/apisync.h>
|
||||
#include <dc/refable.h>
|
||||
|
||||
struct ncdc_api_sync_
|
||||
#include "internal.h"
|
||||
|
||||
struct dc_api_sync_
|
||||
{
|
||||
ncdc_refable_t ref;
|
||||
dc_refable_t ref;
|
||||
|
||||
int code;
|
||||
|
||||
@ -19,7 +21,7 @@ struct ncdc_api_sync_
|
||||
struct curl_slist *list;
|
||||
};
|
||||
|
||||
static void ncdc_api_sync_free(ncdc_api_sync_t s)
|
||||
static void dc_api_sync_free(dc_api_sync_t s)
|
||||
{
|
||||
return_if_true(s == NULL,);
|
||||
|
||||
@ -46,13 +48,13 @@ static void ncdc_api_sync_free(ncdc_api_sync_t s)
|
||||
free(s);
|
||||
}
|
||||
|
||||
ncdc_api_sync_t ncdc_api_sync_new(CURLM *curl, CURL *easy)
|
||||
dc_api_sync_t dc_api_sync_new(CURLM *curl, CURL *easy)
|
||||
{
|
||||
ncdc_api_sync_t ptr = calloc(1, sizeof(struct ncdc_api_sync_));
|
||||
dc_api_sync_t ptr = calloc(1, sizeof(struct dc_api_sync_));
|
||||
return_if_true(ptr == NULL, NULL);
|
||||
|
||||
ptr->easy = easy;
|
||||
ptr->ref.cleanup = (cleanup_t)ncdc_api_sync_free;
|
||||
ptr->ref.cleanup = (dc_cleanup_t)dc_api_sync_free;
|
||||
|
||||
ptr->stream = open_memstream(&ptr->buffer, &ptr->bufferlen);
|
||||
if (ptr->stream == NULL) {
|
||||
@ -65,40 +67,40 @@ ncdc_api_sync_t ncdc_api_sync_new(CURLM *curl, CURL *easy)
|
||||
|
||||
ptr->list = curl_slist_append(NULL, "");
|
||||
|
||||
return ncdc_ref(ptr);
|
||||
return dc_ref(ptr);
|
||||
}
|
||||
|
||||
struct curl_slist *ncdc_api_sync_list(ncdc_api_sync_t sync)
|
||||
struct curl_slist *dc_api_sync_list(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, NULL);
|
||||
return sync->list;
|
||||
}
|
||||
|
||||
FILE *ncdc_api_sync_stream(ncdc_api_sync_t sync)
|
||||
FILE *dc_api_sync_stream(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, NULL);
|
||||
return sync->stream;
|
||||
}
|
||||
|
||||
char const *ncdc_api_sync_data(ncdc_api_sync_t sync)
|
||||
char const *dc_api_sync_data(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, NULL);
|
||||
return sync->buffer;
|
||||
}
|
||||
|
||||
size_t ncdc_api_sync_datalen(ncdc_api_sync_t sync)
|
||||
size_t dc_api_sync_datalen(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, 0L);
|
||||
return sync->bufferlen;
|
||||
}
|
||||
|
||||
int ncdc_api_sync_code(ncdc_api_sync_t sync)
|
||||
int dc_api_sync_code(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, 0L);
|
||||
return sync->code;
|
||||
}
|
||||
|
||||
bool ncdc_api_sync_wait(ncdc_api_sync_t sync)
|
||||
bool dc_api_sync_wait(dc_api_sync_t sync)
|
||||
{
|
||||
return_if_true(sync == NULL, false);
|
||||
|
||||
@ -113,7 +115,7 @@ bool ncdc_api_sync_wait(ncdc_api_sync_t sync)
|
||||
return (sync->stream == NULL && sync->buffer != NULL);
|
||||
}
|
||||
|
||||
void ncdc_api_sync_finish(ncdc_api_sync_t sync, int code)
|
||||
void dc_api_sync_finish(dc_api_sync_t sync, int code)
|
||||
{
|
||||
return_if_true(sync == NULL,);
|
||||
|
29
libdc/src/internal.h
Normal file
29
libdc/src/internal.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef DC_INTERNAL_H
|
||||
#define DC_INTERNAL_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <pthread.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include <jansson.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include <event.h>
|
||||
#include <event2/thread.h>
|
||||
|
||||
//#define DEBUG
|
||||
|
||||
#define return_if_true(v,r) do { if (v) return r; } while(0)
|
||||
#define goto_if_true(v,l) do { if (v) goto l; } while(0)
|
||||
|
||||
#endif
|
6
libdc/src/loop.c
Normal file
6
libdc/src/loop.c
Normal file
@ -0,0 +1,6 @@
|
||||
#include <dc/loop.h>
|
||||
|
||||
struct nc_loop_
|
||||
{
|
||||
nc_refable_t ref;
|
||||
};
|
27
libdc/src/refable.c
Normal file
27
libdc/src/refable.c
Normal file
@ -0,0 +1,27 @@
|
||||
#include <dc/refable.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
void *dc_ref(void *arg)
|
||||
{
|
||||
dc_refable_t *ptr = NULL;
|
||||
|
||||
return_if_true(arg == NULL,NULL);
|
||||
|
||||
ptr = (dc_refable_t *)arg;
|
||||
++ptr->ref;
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
void dc_unref(void *arg)
|
||||
{
|
||||
dc_refable_t *ptr = NULL;
|
||||
|
||||
return_if_true(arg == NULL,);
|
||||
|
||||
ptr = (dc_refable_t *)arg;
|
||||
if ((--ptr->ref) <= 0 && ptr->cleanup != NULL) {
|
||||
ptr->cleanup(arg);
|
||||
}
|
||||
}
|
12
libdc/src/util.c
Normal file
12
libdc/src/util.c
Normal file
@ -0,0 +1,12 @@
|
||||
#include <dc/util.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
void ncdc_util_dump_json(json_t *j)
|
||||
{
|
||||
return_if_true(j == NULL,);
|
||||
char *str = json_dumps(j, JSON_COMPACT);
|
||||
|
||||
printf("%s\n", str);
|
||||
free(str);
|
||||
}
|
22
ncdc/CMakeLists.txt
Normal file
22
ncdc/CMakeLists.txt
Normal file
@ -0,0 +1,22 @@
|
||||
CMAKE_MINIMUM_REQUIRED(VERSION 3.0)
|
||||
|
||||
SET(TARGET "ncdc")
|
||||
|
||||
SET(SOURCES
|
||||
"src/ncdc.c"
|
||||
)
|
||||
|
||||
INCLUDE_DIRECTORIES(
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/include
|
||||
${DC_INCLUDE_DIRS}
|
||||
${JANSSON_INCLUDE_DIRS}
|
||||
${CURL_INCLUDE_DIRS}
|
||||
${EVENT_INCLUDE_DIRS}
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
ADD_EXECUTABLE(${TARGET} ${SOURCES})
|
||||
TARGET_LINK_LIBRARIES(${TARGET}
|
||||
${DC_LIBRARIES}
|
||||
${GLIB2_LIBRARIES}
|
||||
)
|
@ -1,5 +1,5 @@
|
||||
#include <ncdc/ncdc.h>
|
||||
#include <ncdc/api.h>
|
||||
#include <dc/api.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
@ -15,8 +15,8 @@ struct event *timer = NULL;
|
||||
static bool done = false;
|
||||
static pthread_t looper;
|
||||
|
||||
char *ncdc_private_dir = NULL;
|
||||
char *ncdc_config_file = NULL;
|
||||
char *dc_private_dir = NULL;
|
||||
char *dc_config_file = NULL;
|
||||
|
||||
static GKeyFile *config = NULL;
|
||||
|
||||
@ -24,7 +24,7 @@ static GKeyFile *config = NULL;
|
||||
*/
|
||||
CURLM *curl = NULL;
|
||||
|
||||
ncdc_api_t api = NULL;
|
||||
dc_api_t api = NULL;
|
||||
|
||||
static void handle_multi_info(void);
|
||||
|
||||
@ -158,16 +158,16 @@ static bool init_everything(void)
|
||||
|
||||
/* initialise event
|
||||
*/
|
||||
api = ncdc_api_new();
|
||||
api = dc_api_new();
|
||||
return_if_true(api == NULL, false);
|
||||
|
||||
ncdc_api_set_event_base(api, base);
|
||||
ncdc_api_set_curl_multi(api, curl);
|
||||
dc_api_set_event_base(api, base);
|
||||
dc_api_set_curl_multi(api, curl);
|
||||
|
||||
config = g_key_file_new();
|
||||
return_if_true(config == NULL, false);
|
||||
|
||||
g_key_file_load_from_file(config, ncdc_config_file, 0, NULL);
|
||||
g_key_file_load_from_file(config, dc_config_file, 0, NULL);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -187,7 +187,7 @@ static void handle_multi_info(void)
|
||||
}
|
||||
}
|
||||
if (msg->msg == CURLMSG_DONE) {
|
||||
ncdc_api_signal(api, msg->easy_handle, msg->data.result);
|
||||
dc_api_signal(api, msg->easy_handle, msg->data.result);
|
||||
}
|
||||
} else {
|
||||
usleep(10 * 1000);
|
||||
@ -210,7 +210,7 @@ static void *loop_thread(void *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ncdc_account_t account_from_config(void)
|
||||
static dc_account_t account_from_config(void)
|
||||
{
|
||||
char const *email = NULL;
|
||||
char const *password = NULL;
|
||||
@ -221,8 +221,8 @@ static ncdc_account_t account_from_config(void)
|
||||
|
||||
return_if_true(email == NULL || password == NULL, NULL);
|
||||
|
||||
ptr = ncdc_account_new2(email, password);
|
||||
ncdc_account_set_id(ptr, "@me");
|
||||
ptr = dc_account_new2(email, password);
|
||||
dc_account_set_id(ptr, "@me");
|
||||
|
||||
return ptr;
|
||||
}
|
||||
@ -240,16 +240,16 @@ int main(int ac, char **av)
|
||||
return 3;
|
||||
}
|
||||
|
||||
asprintf(&ncdc_private_dir, "%s/.ncdc", getenv("HOME"));
|
||||
if (mkdir(ncdc_private_dir, 0755) < 0) {
|
||||
asprintf(&dc_private_dir, "%s/.ncdc", getenv("HOME"));
|
||||
if (mkdir(dc_private_dir, 0755) < 0) {
|
||||
if (errno != EEXIST) {
|
||||
fprintf(stderr, "failed to make %s: %s\n", ncdc_private_dir,
|
||||
fprintf(stderr, "failed to make %s: %s\n", dc_private_dir,
|
||||
strerror(errno));
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
asprintf(&ncdc_config_file, "%s/config", ncdc_private_dir);
|
||||
asprintf(&dc_config_file, "%s/config", dc_private_dir);
|
||||
|
||||
if (!init_everything()) {
|
||||
return 3;
|
||||
@ -260,18 +260,18 @@ int main(int ac, char **av)
|
||||
return 3;
|
||||
}
|
||||
|
||||
ncdc_account_t a = account_from_config();
|
||||
dc_account_t a = account_from_config();
|
||||
if (a == NULL) {
|
||||
fprintf(stderr, "no account specified in config file; sho-sho!\n");
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (!ncdc_api_authenticate(api, a)) {
|
||||
if (!dc_api_authenticate(api, a)) {
|
||||
fprintf(stderr, "authentication failed, wrong password?\n");
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (!ncdc_api_userinfo(api, a, a)) {
|
||||
if (!dc_api_userinfo(api, a, a)) {
|
||||
fprintf(stderr, "failed to get user information\n");
|
||||
return 3;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
#include <ncdc/refable.h>
|
||||
|
||||
void *ncdc_ref(void *arg)
|
||||
{
|
||||
ncdc_refable_t *ptr = NULL;
|
||||
|
||||
return_if_true(arg == NULL,NULL);
|
||||
|
||||
ptr = (ncdc_refable_t *)arg;
|
||||
++ptr->ref;
|
||||
|
||||
return arg;
|
||||
}
|
||||
|
||||
void ncdc_unref(void *arg)
|
||||
{
|
||||
ncdc_refable_t *ptr = NULL;
|
||||
|
||||
return_if_true(arg == NULL,);
|
||||
|
||||
ptr = (ncdc_refable_t *)arg;
|
||||
if ((--ptr->ref) <= 0 && ptr->cleanup != NULL) {
|
||||
ptr->cleanup(arg);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user