aboutsummaryrefslogtreecommitdiff
path: root/client/libacron/acronc/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'client/libacron/acronc/main.c')
-rw-r--r--client/libacron/acronc/main.c169
1 files changed, 169 insertions, 0 deletions
diff --git a/client/libacron/acronc/main.c b/client/libacron/acronc/main.c
new file mode 100644
index 0000000..282f6e3
--- /dev/null
+++ b/client/libacron/acronc/main.c
@@ -0,0 +1,169 @@
+/*
+ * Created by yuuta on 7/20/22.
+ */
+
+#include "libac.h"
+
+#include <stdio.h>
+#include <unistd.h>
+
+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 %lu milliseconds (%lu 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);
+ }
+ }
+}
+
+int main(int argc, char **argv) {
+ int r;
+ libac_config_t config = {
+#ifdef DEBUG
+ .out = stderr,
+#else
+ .out = NULL,
+#endif
+ .tok = NULL
+ };
+ if ((r = ac_init(&config))) return r;
+ void *connection;
+ ac_connection_parameters_t parameters = {
+ .url = "ws://localhost:25575/ws?id=1&token=123"
+ };
+ if ((r = ac_connect(parameters, &connection))) {
+ ac_free();
+ return r;
+ }
+ ac_obj_t *obj;
+ ac_config_t conf = {
+ .name = "acronc"
+ };
+ 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))) {
+ ac_disconnect(connection);
+ ac_free();
+ return r;
+ }
+ while (!(r = ac_receive(connection, &obj))) {
+ 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);
+ }
+ ac_disconnect(connection);
+ ac_free();
+ return r;
+} \ No newline at end of file