aboutsummaryrefslogtreecommitdiff
path: root/client/libacron/apps/helloworld/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/libacron/apps/helloworld/main.c')
-rw-r--r--client/libacron/apps/helloworld/main.c370
1 files changed, 0 insertions, 370 deletions
diff --git a/client/libacron/apps/helloworld/main.c b/client/libacron/apps/helloworld/main.c
deleted file mode 100644
index c112fcb..0000000
--- a/client/libacron/apps/helloworld/main.c
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * Created by yuuta on 7/20/22.
- */
-
-#include "libac.h"
-#include "net.h"
-
-#include <stdio.h>
-
-#ifndef WIN32
-
-#include <signal.h>
-#include <errno.h>
-#include <string.h>
-
-#endif
-
-#ifdef __STDC_NO_THREADS__
-# ifdef WIN32
-#define THREAD_WIN32
-#include <windows.h>
-static HANDLE mtx_conn;
-
-int lock(void) { \
-DWORD _dwlck = WaitForSingleObject(mtx_conn, 0); \
-if (_dwlck == WAIT_FAILED) { _dwlck = GetLastError(); } \
-if (_dwlck) { fprintf(stderr, "Cannot lock the mutex: %d.\n", _dwlck); return _dwlck; } \
-return 0; \
-}
-
-int unlock(void) { \
-if (!ReleaseMutex(mtx_conn)) { \
-int r = GetLastError(); \
-fprintf(stderr, "Cannot release the mutex: %d.\n", r); \
-return r; \
-} \
-return 0; \
-}
-
-# else
-#error "Either C11 threading or Win32 API is required for concurrency."
-# endif
-#else
-
-#define THREAD_C11
-
-#include <threads.h>
-
-static mtx_t mtx_conn;
-
-int lock(void) {
- \
-if (mtx_lock(&mtx_conn) != thrd_success) {
- \
-fprintf(stderr, "Cannot lock the mutex.\n"); \
-return 1; \
-
- } \
-return 0; \
-
-}
-
-int unlock(void) {
- \
-if (mtx_unlock(&mtx_conn) != thrd_success) {
- \
-fprintf(stderr, "Cannot release the mutex.\n"); \
-return 1; \
-
- } \
-return 0; \
-
-}
-
-#endif
-
-static const char *world_name(const enum ac_world world) {
- switch (world) {
- case overworld:
- return "overworld";
- case nether:
- return "nether";
- case end:
- return "end";
- default:
- return "unknown world";
- }
-}
-
-static void handle_event(const ac_event_t *event) {
- switch (event->type) {
- case AC_EVENT_LAGGING: {
- ac_event_lagging_t *o = (ac_event_lagging_t *) event;
- printf("Server lagging: running %ld milliseconds (%ld ticks) behind.\n",
- o->ms,
- o->ticks);
- break;
- }
- case AC_EVENT_ENTITY_DEATH: {
- ac_event_entity_death_t *o = (ac_event_entity_death_t *) event;
- printf("Entity '%s' died at %s(%.2f, %.2f, %.2f): %s.\n",
- o->entity.name,
- world_name(o->entity.world),
- o->entity.pos.x,
- o->entity.pos.y,
- o->entity.pos.z,
- o->message);
- break;
- }
- case AC_EVENT_PLAYER_MESSAGE: {
- ac_event_player_message_t *o = (ac_event_player_message_t *) event;
- printf("Player '%s' said at %s(%.2f, %.2f, %.2f): %s.\n",
- o->player.name,
- world_name(o->player.world),
- o->player.pos.x,
- o->player.pos.y,
- o->player.pos.z,
- o->text);
- break;
- }
- case AC_EVENT_PLAYER_DISCONNECT: {
- ac_event_player_disconnect_t *o = (ac_event_player_disconnect_t *) event;
- printf("Player '%s' disconnected at %s(%.2f, %.2f, %.2f): %s.\n",
- o->player.name,
- world_name(o->player.world),
- o->player.pos.x,
- o->player.pos.y,
- o->player.pos.z,
- o->reason);
- break;
- }
- case AC_EVENT_PLAYER_JOIN: {
- ac_event_player_join_t *o = (ac_event_player_join_t *) event;
- printf("Player '%s' joined at %s(%.2f, %.2f, %.2f).\n",
- o->player.name,
- world_name(o->player.world),
- o->player.pos.x,
- o->player.pos.y,
- o->player.pos.z);
- break;
- }
- default: {
- printf("Received an unrecognized event of type '%u'.\n",
- event->type);
- }
- }
-}
-
-static void handle_response(const ac_response_t *response) {
- switch (response->type) {
- case AC_RESPONSE_OK: {
- ac_response_ok_t *o = (ac_response_ok_t *) response;
- printf("Request %d OK.\n",
- o->id);
- break;
- }
- case AC_RESPONSE_ERROR: {
- ac_response_error_t *o = (ac_response_error_t *) response;
- printf("Request %d failed: %s (%d).\n",
- o->id,
- o->message,
- o->code);
- break;
- }
- case AC_RESPONSE_CMD_OUT: {
- ac_response_cmd_out_t *o = (ac_response_cmd_out_t *) response;
- printf("Request %d output by %s: %s.\n",
- o->id,
- o->sender,
- o->out);
- break;
- }
- case AC_RESPONSE_CMD_RESULT: {
- ac_response_cmd_result_t *o = (ac_response_cmd_result_t *) response;
- printf("Request %d is done: %s (%d).\n",
- o->id,
- o->success ? "Success" : "Failed",
- o->result);
- break;
- }
- default: {
- printf("Received an unrecognized response of type '%u'.\n",
- response->type);
- }
- }
-}
-
-#ifndef WIN32
-
-static void intr(int signum) {}
-
-#endif
-
-static int on_send(const void *sock,
- const void *buffer,
- const size_t len) {
- int r;
- printf("Writing %lu bytes.\n", len);
- if ((r = net_send(sock, buffer, len))) {
- fprintf(stderr, "Cannot write %lu bytes to server: %s (%d).\n",
- len,
- net_strerror(r),
- r);
- }
- return r;
-}
-
-static int say(void *connection) {
- int r;
- ac_config_t conf = {
- .name = "helloworld"
- };
- ac_request_cmd_t req = {
- .type = AC_REQUEST_CMD,
- .id = 100,
- .config = &conf,
- .cmd = "say Hi"
- };
- if ((r = ac_request(connection, (ac_request_t *) &req))) {
- return r;
- }
- return 0;
-}
-
-int main(int argc, char **argv) {
- int r;
- if ((r = net_init())) {
- return r;
- }
-#if defined(THREAD_WIN32)
- if (!(mtx_conn = CreateMutex(NULL, TRUE, NULL))) {
- r = GetLastError();
- fprintf(stderr, "Cannot create mutex: %d.\n", r);
- return r;
- }
-#elif defined(THREAD_C11)
- if (mtx_init(&mtx_conn, mtx_plain) != thrd_success) {
- fprintf(stderr, "Cannot create mutex.\n");
- return 1;
- }
-#endif
-
-#ifdef WIN32
- fprintf(stderr, "Warning: ^C handler on Windows is not yet available.\n");
-#else
- struct sigaction sa;
- sa.sa_handler = intr;
- sigemptyset(&sa.sa_mask);
- sa.sa_flags = 0;
- if (sigaction(SIGINT, &sa, NULL) ||
- sigaction(SIGTERM, &sa, NULL)) {
- const int e = errno;
- fprintf(stderr, "Cannot set SIGINT or SIGTERM handlers: %s (%d).\n",
- strerror(e),
- e);
- return e;
- }
-#endif
- libac_config_t config = {
-#ifdef DEBUG
- .out = stderr,
-#else
- .out = NULL,
-#endif
- .tok = NULL
- };
- if ((r = ac_init(&config))) return r;
- void *connection;
- SOCKET sock;
- ac_connection_parameters_t parameters = {
- .host = "localhost",
- .port = 25575,
- .id = "1",
- .token = "123",
- .version = 0,
- .sock = NULL,
- .on_send = on_send
- };
- if ((r = net_connect(parameters.host, parameters.port, &sock))) {
- fprintf(stderr, "Cannot connect to server: %s (%d).\n",
- net_strerror(r),
- r);
- ac_free();
- net_free();
- return r;
- }
- parameters.sock = &sock;
- if ((r = ac_connect(parameters, &connection))) {
- net_close(&sock);
- ac_free();
- net_free();
- return r;
- }
- ac_obj_t *obj;
- int nr;
- uint8_t buffer[1000U];
- size_t bytes;
- enum ac_connection_state state;
- printf("Waiting until the connection is established.\n");
- bool ready = false;
- while (1) {
- if ((nr = net_read(&sock, buffer, sizeof(buffer), &bytes, 10))) {
- if (nr == NET_TIMEOUT) {
- printf("Receive timeout.\n");
- continue;
- } else {
- goto end;
- }
- }
- if ((r = lock())) { goto end; }
- if ((r = ac_receive(connection, buffer, bytes, &obj))) {
- if ((r = unlock())) { goto end; }
- goto end;
- }
- if (!ready) {
- /* Wait until ready. */
- if ((r = ac_get_state(connection, &state))) {
- if ((r = unlock())) { goto end; }
- goto end;
- }
- switch (state) {
- case AC_STATE_INIT:
- continue;
- case AC_STATE_READY:
- printf("Connection is established.\n");
- ready = true;
- say(connection);
- if ((r = unlock())) { goto end; }
- continue;
- default:
- fprintf(stderr, "Unexpected state.\n");
- if ((r = unlock())) { goto end; }
- goto end;
- }
- }
- if ((r = unlock())) { goto end; }
-
- if (!obj) {
- continue;
- }
- if (AC_IS_EVENT(obj->type)) {
- handle_event((ac_event_t *) obj);
- } else if (AC_IS_RESPONSE(obj->type)) {
- handle_response((ac_response_t *) obj);
- }
- ac_object_free(obj);
- }
- end:
- if (nr) {
- if (nr == NET_CLOSED) {
- fprintf(stderr, "Connection is closed while reading from the server.\n");
- } else {
- fprintf(stderr, "Cannot receive from server: %s (%d).\n",
- net_strerror(nr),
- nr);
- }
- }
- if ((r = lock())) { goto end; }
- ac_disconnect(connection, false);
- if ((r = unlock())) { goto end; }
- net_close(&sock);
- ac_free();
- net_free();
-#if defined(THREAD_WIN32)
- CloseHandle(mtx_conn);
-#elif defined(THREAD_C11)
- mtx_destroy(&mtx_conn);
-#endif
- return r;
-} \ No newline at end of file