aboutsummaryrefslogtreecommitdiff
path: root/src/Routes/Settings.c
diff options
context:
space:
mode:
authorfrosty <gabriel@bwaaa.monster>2026-04-01 22:39:22 +0300
committerfrosty <gabriel@bwaaa.monster>2026-04-01 22:39:22 +0300
commit8176078105d3ce0331cf5deb3ff2e564d5221d05 (patch)
treeda0a33cf66b7c76c276e0cc3c2511f61b3558435 /src/Routes/Settings.c
parent614bd26cb34b9b340e327d4b80927353bb5a5d0a (diff)
downloadomnisearch-8176078105d3ce0331cf5deb3ff2e564d5221d05.tar.gz
feat: configure search engines in user settings
Diffstat (limited to 'src/Routes/Settings.c')
-rw-r--r--src/Routes/Settings.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/Routes/Settings.c b/src/Routes/Settings.c
index cfadd09..1ad85a7 100644
--- a/src/Routes/Settings.c
+++ b/src/Routes/Settings.c
@@ -1,4 +1,5 @@
#include "Settings.h"
+#include "../Scraping/Scraping.h"
#include "../Utility/Utility.h"
#include <beaker.h>
#include <stdlib.h>
@@ -29,6 +30,48 @@ int settings_handler(UrlParams *params) {
inner_counts[i] = 2;
}
+ char **user_engines = NULL;
+ int user_engine_count = 0;
+ int has_user_pref = (get_user_engines(&user_engines, &user_engine_count) == 0);
+
+ int enabled_count = 0;
+ for (int i = 0; i < ENGINE_COUNT; i++) {
+ if (ENGINE_REGISTRY[i].enabled)
+ enabled_count++;
+ }
+
+ char ***engine_data = NULL;
+ int *engine_inner = NULL;
+
+ if (enabled_count > 0) {
+ engine_data = malloc(sizeof(char **) * enabled_count);
+ engine_inner = malloc(sizeof(int) * enabled_count);
+
+ int idx = 0;
+ for (int i = 0; i < ENGINE_COUNT; i++) {
+ if (!ENGINE_REGISTRY[i].enabled)
+ continue;
+
+ int is_selected = !has_user_pref;
+ if (has_user_pref) {
+ for (int j = 0; j < user_engine_count; j++) {
+ if (strcmp(user_engines[j], ENGINE_REGISTRY[i].id) == 0) {
+ is_selected = 1;
+ break;
+ }
+ }
+ }
+
+ engine_data[idx] = malloc(sizeof(char *) * 3);
+ engine_data[idx][0] = (char *)ENGINE_REGISTRY[i].id;
+ engine_data[idx][1] = (char *)ENGINE_REGISTRY[i].name;
+ engine_data[idx][2] = is_selected ? "checked" : "";
+ engine_inner[idx] = 3;
+
+ idx++;
+ }
+ }
+
TemplateContext ctx = new_context();
beaker_set_locale(&ctx, locale);
context_set(&ctx, "query", query);
@@ -36,9 +79,26 @@ int settings_handler(UrlParams *params) {
context_set(&ctx, "locale", locale);
context_set_array_of_arrays(&ctx, "locales", locale_data, locale_count, inner_counts);
+ if (enabled_count > 0) {
+ context_set_array_of_arrays(&ctx, "enabled_engines", engine_data,
+ enabled_count, engine_inner);
+ context_set(&ctx, "has_enabled_engines", "1");
+ }
+
for (int i = 0; i < locale_count; i++) {
free(locale_data[i]);
}
+ if (engine_data) {
+ for (int i = 0; i < enabled_count; i++)
+ free(engine_data[i]);
+ free(engine_data);
+ }
+ free(engine_inner);
+ if (has_user_pref) {
+ for (int i = 0; i < user_engine_count; i++)
+ free(user_engines[i]);
+ free(user_engines);
+ }
char *rendered_html = render_template("settings.html", &ctx);
send_response(rendered_html);