From 27581183fd7279815d6572d863d76db98b9d0b9e Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Fri, 20 Jun 2025 14:35:12 +0200 Subject: [PATCH] Add a picture of me --- baked.c | 2 ++ baked.h | 1 + build.c | 2 ++ etc/hotreload.js | 33 +-------------------------------- etc/me.jpg | Bin 0 -> 29542 bytes main.c | 4 +++- routes.c | 19 ++++++++++++++++++- routes.h | 1 + tmpls/home.html | 3 +++ 9 files changed, 31 insertions(+), 34 deletions(-) create mode 100644 etc/me.jpg diff --git a/baked.c b/baked.c index d16ff89..d13b42c 100644 --- a/baked.c +++ b/baked.c @@ -18,6 +18,7 @@ INCBIN(favicon_ico, "./etc/favicon.ico"); #if MY_DEBUG INCBIN(hotreload_js, "./etc/hotreload.js"); #endif +INCBIN(me_jpg, "./etc/me.jpg"); INCBIN(blog_welcome_md, "./blog/welcome.md"); INCBIN(blog_weird_page_md, "./blog/weird-page.md"); @@ -48,6 +49,7 @@ void init_baked_resources(void) #if MY_DEBUG add_baked_resource("hotreload.js", hotreload_js_data, hotreload_js_size); #endif + add_baked_resource("me.jpg", me_jpg_data, me_jpg_size); add_baked_resource("blog-welcome.md", blog_welcome_md_data, blog_welcome_md_size); add_baked_resource("blog-weird-page.md", blog_weird_page_md_data, blog_weird_page_md_size); add_baked_resource("blog-curious-case-of-gebs.md", blog_curious_case_of_gebs_md_data, blog_curious_case_of_gebs_md_size); diff --git a/baked.h b/baked.h index 2074884..b666522 100644 --- a/baked.h +++ b/baked.h @@ -15,6 +15,7 @@ INCBIN_EXTERN(favicon_ico); #if MY_DEBUG INCBIN_EXTERN(hotreload_js); #endif +INCBIN_EXTERN(me_jpg); INCBIN_EXTERN(blog_welcome_md); INCBIN_EXTERN(blog_weird_page_md); diff --git a/build.c b/build.c index 829077a..71a180a 100644 --- a/build.c +++ b/build.c @@ -37,6 +37,8 @@ int main(int argc, char ** argv) "./etc/hotreload.js", "./etc/simple.css", + "./etc/favicon.ico", + "./etc/me.jpg", "./blog/welcome.md", "./blog/weird-page.md", diff --git a/etc/hotreload.js b/etc/hotreload.js index 34b1dd7..97e3aec 100644 --- a/etc/hotreload.js +++ b/etc/hotreload.js @@ -18,38 +18,7 @@ async function fetch_build_id() return json.build_id; } -(async function() { - build_id = await fetch_build_id(); -})(); - - -const asyncIntervals = []; - -const runAsyncInterval = async (cb, interval, intervalIndex) => { - await cb(); - if (asyncIntervals[intervalIndex]) { - setTimeout(() => runAsyncInterval(cb, interval, intervalIndex), interval); - } -}; - -const setAsyncInterval = (cb, interval) => { - if (cb && typeof cb === "function") { - const intervalIndex = asyncIntervals.length; - asyncIntervals.push(true); - runAsyncInterval(cb, interval, intervalIndex); - return intervalIndex; - } else { - throw new Error('Callback must be a function'); - } -}; - -const clearAsyncInterval = (intervalIndex) => { - if (asyncIntervals[intervalIndex]) { - asyncIntervals[intervalIndex] = false; - } -}; - -setAsyncInterval(async function () { +setInterval(async function() { let new_build_id = await fetch_build_id(); if (build_id !== new_build_id) { location.reload(true); diff --git a/etc/me.jpg b/etc/me.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ad0e0f0884834f89f9c8fa2f78b0efe4fe86def6 GIT binary patch literal 29542 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.count ); + printf("%s\n", reply); mg_printf(conn, "%s", reply); mg_send(conn, result->body.items, result->body.count); } @@ -103,12 +104,13 @@ void init_route_hashtable(void) shdefault(route_hashtable, &route_page_not_found); shput(route_hashtable, "/", &route_home); shput(route_hashtable, "/page-missing", &route_page_not_found); - shput(route_hashtable, "/simple.css", &route_simple_css); + shput(route_hashtable, "/simple.css", &route_simple_css); shput(route_hashtable, "/favicon.ico", &route_favicon); #if MY_DEBUG shput(route_hashtable, "/hotreload.js", &route_hotreload_js); shput(route_hashtable, "/build-id", &route_build_id); #endif + shput(route_hashtable, "/me.jpg", &route_me_jpg); shput(route_hashtable, "/blog", &route_blog); void put_blogs(Baked_Resource *resource) diff --git a/routes.c b/routes.c index eb6eeed..4ce1aff 100644 --- a/routes.c +++ b/routes.c @@ -158,6 +158,24 @@ ROUTE_HANDLER(simple_css) make_text(result, "css", 200, sb.items); } +ROUTE_HANDLER(me_jpg) +{ + char path[PATH_MAX] = {0}; + if (!get_baked_resource_path("me.jpg", path, sizeof(path))) { + make_internal_server_error(result); + return; + } + + String_Builder sb = {0}; + defer { sb_free(&sb); } + if (!sb_read_file(&sb, path)) { + make_internal_server_error(result); + return; + } + + make_binary(result, "image/jpeg", 200, sb.items, sb.count); +} + ROUTE_HANDLER(favicon) { char path[PATH_MAX] = {0}; @@ -172,7 +190,6 @@ ROUTE_HANDLER(favicon) make_internal_server_error(result); return; } - sb_finish(&sb); make_binary(result, "image/x-icon", 200, sb.items, sb.count); } diff --git a/routes.h b/routes.h index 3976c70..3a5f7d5 100644 --- a/routes.h +++ b/routes.h @@ -33,6 +33,7 @@ typedef struct { ROUTE_HANDLER(page_not_found); ROUTE_HANDLER(simple_css); ROUTE_HANDLER(favicon); +ROUTE_HANDLER(me_jpg); #if MY_DEBUG ROUTE_HANDLER(hotreload_js); ROUTE_HANDLER(build_id); diff --git a/tmpls/home.html b/tmpls/home.html index c0c1e22..158147b 100644 --- a/tmpls/home.html +++ b/tmpls/home.html @@ -52,6 +52,9 @@ +
+ literally me +