From 3cbdc11111cd15ca3a37de121f211d0bf3c63273 Mon Sep 17 00:00:00 2001 From: wullie Date: Mon, 3 Nov 2025 22:48:10 +0000 Subject: [PATCH] Upload files to "src" --- src/WrenVM.c | 138 ++++++++++++++++++++++++++++++++++++++++++++ src/discordBot.c | 64 ++++++++++++++++++++ src/main.c | 11 ++++ src/messageParser.c | 12 ++++ 4 files changed, 225 insertions(+) create mode 100644 src/WrenVM.c create mode 100644 src/discordBot.c create mode 100644 src/main.c create mode 100644 src/messageParser.c diff --git a/src/WrenVM.c b/src/WrenVM.c new file mode 100644 index 0000000..1ee68e1 --- /dev/null +++ b/src/WrenVM.c @@ -0,0 +1,138 @@ +#include "godsBot.h" + +// creating the VM + +static WrenVM* vm = NULL; + +// writer +static void writeFn(WrenVM* vm, const char* text){ + + (void)vm; + printf("[Wren] %s\n", text); + +} + +// error handling +static void errorFn(WrenVM* vm, WrenErrorType type, const char* module, int line, const char* msg){ + + (void)vm; + + // displays different errors based on what it get + switch (type){ + + case WREN_ERROR_COMPILE: + fprintf(stderr,"[Error Compiling Wren] %s:%d: %s\n", module, line, msg); + break; + + case WREN_ERROR_RUNTIME: + fprintf(stderr, "[Error In Runtime] %s\n", msg); + break; + + case WREN_ERROR_STACK_TRACE: + fprintf(stderr, "[Wren Stack Trace] %s:%d: %s\n"); + break; + } + +} + +// VM Init +void WrenVmInit(void){ + if (vm) return; + // configs + WrenConfiguration config; + wrenInitConfiguration(&config); + config.writeFn = writeFn; + config.errorFn = errorFn; + + // new vm + vm = wrenNewVM(&config); + + // load scripts + FILE* f = fopen("scripts/commands.wren", "r"); + + // checking if the file can be found + if(!f){ + fprintf(stderr, "Faild to open command file\n"); + return; + } + + // get file length + fseek(f, 0, SEEK_END); + long length = ftell(f); + rewind(f); + + // lock it in memory + char* src = malloc(length + 1); + fread(src, 1, length, f); + src[length] = '\0'; + fclose(f); + + // interpreter + WrenInterpretResult result = wrenInterpret(vm, "commands", src); + free(src); + + // checking if the vm could load the scripts + if(result != WREN_RESULT_SUCCESS){ + fprintf(stderr, "Fail to Load script(s)\n"); + } + else{ + printf("loaded script(s)\n"); + } + +} + + +// handles the command file and passes it to wren +char* WrenCommandHandler(const char* cmd, const char* args){ + + // checks if the vm has been set correctly if not exit out + if(!vm){ + fprintf(stderr, "Vm is not Initialized\n"); + return strdup("Vm was not initialized"); + } + + + // loads commands + wrenEnsureSlots(vm, 1); + wrenGetVariable(vm, "commands", "Commands", 0); + WrenHandle* classHandle = wrenGetSlotHandle(vm, 0); + + // interprets the command + char sig[64]; + snprintf(sig, sizeof(sig), "%s()", cmd); + WrenHandle* methodHandle = wrenMakeCallHandle(vm, sig); + + // Set Wren slot to 1 + wrenEnsureSlots(vm, 1); + wrenSetSlotHandle(vm, 0, classHandle); + + // interpets resluts of input? + WrenInterpretResult result = wrenCall(vm, methodHandle); + + if(result != WREN_RESULT_SUCCESS){ + + fprintf(stderr, "Wren: rror running method"); + wrenReleaseHandle(vm, classHandle); + wrenReleaseHandle(vm, methodHandle); + return strdup("Wren command error"); + } + + const char* out = wrenGetSlotString(vm, 0); + char* reply = strdup(out ? out: "No return"); + + wrenReleaseHandle(vm, classHandle); + wrenReleaseHandle(vm, methodHandle); + + return reply; +} + + +// releses the memory of the vm +void WrenVmFree(void){ + + if(vm){ + wrenFreeVM(vm); + vm = NULL; + } + +} diff --git a/src/discordBot.c b/src/discordBot.c new file mode 100644 index 0000000..fd5cece --- /dev/null +++ b/src/discordBot.c @@ -0,0 +1,64 @@ +#include "godsBot.h" + + +// one the bot logs in it runs this first +static void on_ready(struct discord *client, const struct discord_ready *event){ + + printf("bot logged in as: %s#%s\n", event->user->username, event->user->discriminator); + +} + +// handle messages +void on_message(struct discord *client, const struct discord_message *msg){ + + // check if message should go through + if (!parseMessage(msg)) return; + + // split the messge into commands and aguments + + // get command + char *content = strdup(msg->content +1); + char *space = strchr(content, ' '); + char *cmd = content; + + // get args + char *args = ""; + + if(space){ + *space = '\0'; + args = space +1; + } + + // send and recive from wren + char *response = WrenCommandHandler(cmd, args); + struct discord_create_message params = { .content = response }; + discord_create_message(client, msg->channel_id, ¶ms, NULL); + + // manage memory + free(content); + free(response); + +} + +// run da bot +void discordBotRunner(void){ + + // load bot config from config.json and set intents + struct discord *client = discord_config_init("config.json"); + discord_set_on_ready(client, &on_ready); + discord_set_on_message_create(client, &on_message); + + discord_add_intents( + client, + DISCORD_GATEWAY_MESSAGE_CONTENT | + DISCORD_GATEWAY_GUILD_MESSAGES | + DISCORD_GATEWAY_DIRECT_MESSAGES + ); + + printf("starting bot\n"); + + // clean up + discord_run(client); + discord_cleanup(client); + +} diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..af1932c --- /dev/null +++ b/src/main.c @@ -0,0 +1,11 @@ +#include "godsBot.h" + +// runner ig +int main(void){ + + WrenVmInit(); + discordBotRunner(); + WrenVmFree(); + + return 0; +} diff --git a/src/messageParser.c b/src/messageParser.c new file mode 100644 index 0000000..099cebf --- /dev/null +++ b/src/messageParser.c @@ -0,0 +1,12 @@ +#include "godsBot.h" + +bool parseMessage(const struct discord_message *msg){ + + if(!msg) return false; + if(!msg->author) return false; + if(msg->author->bot) return false; + if(!msg->content) return false; + if(msg->content[0] != '$') return false; + return true; + +}