From 2f23b32fa7ae0e60b80462a571c4cfc1aa413aa3 Mon Sep 17 00:00:00 2001 From: partisan Date: Thu, 15 Aug 2024 13:31:15 +0200 Subject: [PATCH] added working settings page --- README.md | 20 +++-- main.go | 5 +- static/css/black.css | 74 ++++++++++++++++++ static/css/latte.css | 100 ++++++++++++++++++++++++ static/css/mocha.css | 100 ++++++++++++++++++++++++ static/css/night.css | 74 ++++++++++++++++++ static/css/style-settings.css | 62 +++++++++++++++ static/css/style.css | 19 ----- static/images/black.webp | Bin 0 -> 10936 bytes static/images/dark.webp | Bin 9050 -> 9692 bytes static/images/latte.webp | Bin 0 -> 9016 bytes static/images/light.webp | Bin 10008 -> 10608 bytes static/images/mocha.webp | Bin 0 -> 9566 bytes static/images/night.webp | Bin 0 -> 10006 bytes templates/search.html | 2 +- templates/settings.html | 138 ++++++++++++++++++---------------- user-settings.go | 64 +++++++++++++++- 17 files changed, 561 insertions(+), 97 deletions(-) create mode 100644 static/css/black.css create mode 100644 static/css/latte.css create mode 100644 static/css/mocha.css create mode 100644 static/css/night.css create mode 100644 static/css/style-settings.css create mode 100644 static/images/black.webp create mode 100644 static/images/latte.webp create mode 100644 static/images/mocha.webp create mode 100644 static/images/night.webp diff --git a/README.md b/README.md index 5bc3b1c..af1d11e 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,17 @@ A self-hosted private and anonymous [metasearch engine](https://en.wikipedia.org ## Comparison to other search engines -| Name | Works without JavaScript | Music search | Torrent search | API | Scalable | Not Resource Hungry | Dynamic Page Loading | -| ------------- | ------------------ | --------------------------- | ----------------- | ------ | ------------------- | ---------------------------------------------- | ---------------------- | -| Whoogle [1] | ✅ | ❓ | ❌ | ❌ | ❌ | ❓ Moderate | ❓ Not specified | -| Araa-Search | ✅ | ❌ | ✅ | ✅ [2] | ❌ | ❌ Very resource hungry | ❌ | -| LibreY | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ Moderate 200-400mb~ | ❌ | -| 4get | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ Moderate 200-400mb~ | ❌ | -| Warp | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ about 15-20MiB at idle, 17-22MiB when searching | ✅ | +| Feature | Whoogle | Araa-Search | LibreY | 4get | *Warp* | +| :----------------------------------- | ------------------ | ------------------------- | ------------------------ | ------------------------ | ---------------------------------------------------- | +| Works without JavaScript | ✅ | ✅ | ✅ | ✅ | ✅ | +| Music search | ❓ | ❌ | ❌ | ✅ | ✅ | +| Torrent search | ❌ | ✅ | ✅ | ❌ | ✅ | +| API | ❌ | ✅ | ✅ | ✅ | ✅ | +| Scalable | ❌ | ❌ | ❌ | ❌ | ✅ | +| Not Resource Hungry | ❓ Moderate | ❌ Very resource hungry | ❌ Moderate 200-400mb~ | ❌ Moderate 200-400mb~ | ✅ about 15-20MiB at idle, 17-22MiB when searching | +| Dynamic Page Loading | ❓ Not specified | ❌ | ❌ | ❌ | ✅ | +| User themable | ❌ | ✅ | ❌ | ❌ | ✅ | +| It has dildo as logo, unironically | ❌ | ❌ | ❌ | ✅ | ❌ | [1]: I was not able to check this since their site does not work, same for the community instances. @@ -70,4 +74,4 @@ chmod +x ./run.sh ./run.sh ``` -*Its that easy!* \ No newline at end of file +*Its that easy!* diff --git a/main.go b/main.go index 392aab8..65c272b 100755 --- a/main.go +++ b/main.go @@ -169,9 +169,8 @@ func runServer() { http.HandleFunc("/search", handleSearch) http.HandleFunc("/img_proxy", handleImageProxy) http.HandleFunc("/node", handleNodeRequest) - http.HandleFunc("/settings", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "templates/settings.html") - }) + http.HandleFunc("/settings", handleSettings) + http.HandleFunc("/save-settings", handleSaveSettings) http.HandleFunc("/opensearch.xml", func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/opensearchdescription+xml") http.ServeFile(w, r, "static/opensearch.xml") diff --git a/static/css/black.css b/static/css/black.css new file mode 100644 index 0000000..9661246 --- /dev/null +++ b/static/css/black.css @@ -0,0 +1,74 @@ +:root { + --html-bg: #000000; + --font-fg: #fafafa; + --fg: #BABCBE; + + --search-bg: #000000; + --search-bg-input: #000000; + --search-bg-input-border: #5f6368; + --search-select: #282828; + + --border: #707070; + + --link: #8ab4f8; + --link-visited: #c58af9; + + --snip-border: #303134; + --snip-background: #282828; + --snip-text: #f1f3f4; + + --settings-border: #5f6368; + --button: #000000; + + --footer-bg: #161616; + --footer-font: #999da2; + + --highlight: #bcc0c3; + + --blue: #8ab4f8; + + --green: #31b06e; + + --search-button: #BABCBE; + + --image-view: #161616; + --image-view-titlebar: #161616; + --view-image-color: #000000; + --image-select: #303030; + --fff: #fff; + + --publish-info: #7f869e; + + color-scheme: dark; +} + +.calc-btn:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2 { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc-btn { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); +} + +.view-image-search { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.view-image-search:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} diff --git a/static/css/latte.css b/static/css/latte.css new file mode 100644 index 0000000..b217da7 --- /dev/null +++ b/static/css/latte.css @@ -0,0 +1,100 @@ +:root { + --rosewater: #f5e0dc; + --flamingo: #f2cdcd; + --pink: #f5c2e7; + --mauve: #cba6f7; + --red: #f38ba8; + --maroon: #eba0ac; + --peach: #fab387; + --yellow: #f9e2af; + --green: #a6e3a1; + --teal: #94e2d5; + --sky: #89dceb; + --sapphire: #74c7ec; + --blue: #89b4fa; + --lavender: #b4befe; + --text: #cdd6f4; + --subtext1: #bac2de; + --subtext0: #a6adc8; + --overlay2: #9399b2; + --overlay1: #7f849c; + --overlay0: #6c7086; + --surface2: #585b70; + --surface1: #45475a; + --surface0: #313244; + --base: #1e1e2e; + --mantle: #181825; + --crust: #11111b; + + --html-bg: var(--base); + --font-fg: var(--text); + --fg: var(--subtext0); + + --search-bg: var(--mantle); + --search-bg-input: var(--surface1); + --search-bg-input-border: var(--overlay0); + --search-select: var(--surface0); + + --border: var(--overlay0); + + --link: var(--blue); + --link-visited: var(--mauve); + + --snip-border: var(--surface1); + --snip-background: var(--surface0); + --snip-text: var(--text); + + --settings-border: var(--overlay1); + --button: var(--surface1); + + --footer-bg: var(--mantle); + --footer-font: var(--overlay1); + + --highlight: var(--subtext1); + + --blue: var(--blue); + --green: var(--green); + + --search-button: var(--subtext0); + + --image-view: var(--mantle); + --image-view-titlebar: var(--mantle); + --view-image-color: var(--crust); + --image-select: var(--surface1); + --fff: var(--text); + + --publish-info: var(--overlay2); + + color-scheme: dark; +} + +.calc-btn:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2 { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc-btn { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); +} + +.view-image-search { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.view-image-search:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} diff --git a/static/css/mocha.css b/static/css/mocha.css new file mode 100644 index 0000000..543332f --- /dev/null +++ b/static/css/mocha.css @@ -0,0 +1,100 @@ +:root { + --rosewater: #dc8a78; + --flamingo: #dd7878; + --pink: #ea76cb; + --mauve: #8839ef; + --red: #d20f39; + --maroon: #e64553; + --peach: #fe640b; + --yellow: #df8e1d; + --green: #40a02b; + --teal: #179299; + --sky: #04a5e5; + --sapphire: #209fb5; + --blue: #1e66f5; + --lavender: #7287fd; + --text: #4c4f69; + --subtext1: #5c5f77; + --subtext0: #6c6f85; + --overlay2: #7c7f93; + --overlay1: #8c8fa1; + --overlay0: #9ca0b0; + --surface2: #acb0be; + --surface1: #bcc0cc; + --surface0: #ccd0da; + --base: #eff1f5; + --mantle: #e6e9ef; + --crust: #dce0e8; + + --html-bg: var(--base); + --font-fg: var(--text); + --fg: var(--subtext0); + + --search-bg: var(--mantle); + --search-bg-input: var(--surface1); + --search-bg-input-border: var(--overlay0); + --search-select: var(--surface0); + + --border: var(--overlay0); + + --link: var(--blue); + --link-visited: var(--mauve); + + --snip-border: var(--surface1); + --snip-background: var(--surface0); + --snip-text: var(--text); + + --settings-border: var(--overlay1); + --button: var(--surface1); + + --footer-bg: var(--mantle); + --footer-font: var(--overlay1); + + --highlight: var(--subtext1); + + --blue: var(--blue); + --green: var(--green); + + --search-button: var(--subtext0); + + --image-view: var(--mantle); + --image-view-titlebar: var(--mantle); + --view-image-color: var(--crust); + --image-select: var(--surface1); + --fff: var(--text); + + --publish-info: var(--overlay2); + + color-scheme: light; +} + +.calc-btn:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.12); +} + +.calc-btn-2:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.12); +} + +.calc-btn-2 { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.14); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc-btn { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.14); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15); +} + +.view-image-search { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.10), 0 1px 2px rgba(0, 0, 0, 0.14); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.view-image-search:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.15), 0 10px 10px rgba(0, 0, 0, 0.12); +} diff --git a/static/css/night.css b/static/css/night.css new file mode 100644 index 0000000..0676672 --- /dev/null +++ b/static/css/night.css @@ -0,0 +1,74 @@ +:root { + --html-bg: #171b25; + --font-fg: #ebecf7; + --fg: #ebecf7; + + --search-bg: #0c0d0f; + --search-bg-input: #2e3443; + --search-bg-input-border: rgb(46, 52, 67); + --search-select: #3a445c; + + --border: rgb(46, 52, 67); + + --link: #a7b1fc; + --link-visited: #ad71bc; + + --snip-border: rgb(46, 52, 67); + --snip-background: #1e222d; + --snip-text: #f1f3f4; + + --settings-border: #5f6368; + --button: #0c0d0f; + + --footer-bg: #0c0d0f; + --footer-font: #ebecf7; + + --highlight: #ebecf7; + + --blue: #8ab4f8; + + --green: #31b06e; + + --image-view: #0c0d0f; + --image-view-titlebar: #0c0d0f; + --view-image-color: #000000; + --image-select: #303030; + --fff: #fff; + + --search-button: #BABCBE; + + --publish-info: #7f869e; + + color-scheme: dark; +} + +.calc-btn:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} + +.calc-btn-2 { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc-btn { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.calc { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5); +} + +.view-image-search { + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); + transition: all 0.3s cubic-bezier(.25, .8, .25, 1); +} + +.view-image-search:hover { + box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22); +} diff --git a/static/css/style-settings.css b/static/css/style-settings.css new file mode 100644 index 0000000..0dda333 --- /dev/null +++ b/static/css/style-settings.css @@ -0,0 +1,62 @@ + +/* settings.html */ + +.theme-link { + display: block; + text-decoration: none; + color: inherit; + width: 48%; + margin-bottom: 10px; + height: 150px; + position: relative; /* Make it possible to position the tooltip */ +} + +.theme-link img { + width: 100%; + height: 100%; + object-fit: cover; + border-radius: 4px; + border: 1px solid var(--snip-border); + transition: border-color 0.3s ease; +} + +/* .theme-link:hover img { + border-color: var(--highlight); +} */ + +.theme-tooltip { + display: none; /* Hidden by default */ + position: absolute; + bottom: 10px; /* Position at the bottom of the image */ + left: 50%; + transform: translateX(-50%); + background-color: rgba(0, 0, 0, 0.7); /* Semi-transparent background */ + color: #fff; + padding: 5px 10px; + border-radius: 4px; + font-size: 14px; + white-space: nowrap; +} + +.theme-link:hover .theme-tooltip { + display: block; /* Show tooltip on hover */ +} + +.themes-settings-menu { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + background: var(--snip-background); + color: var(--fg); + border-radius: 4px; + padding: 10px; + gap: 10px; +} + +@media (max-width: 600px) { + .theme-link { + width: 100%; + } +} + +/* --- */ diff --git a/static/css/style.css b/static/css/style.css index 48d9127..e9cd93c 100644 --- a/static/css/style.css +++ b/static/css/style.css @@ -838,23 +838,6 @@ form.torrent-sort { display: initial; } -.themes-settings-menu { - background: var(--snip-background); - color: var(--fg); - border-radius: 4px; - height: 100%; - margin: 5px; - display: flex; - flex-wrap: wrap; - justify-content: space-between; -} - -.themes-settings-menu>div { - width: calc(50% - 10px); - margin: 5px; -} - - .view-image-search { border: 1px solid var(--snip-border); margin: 0; @@ -1873,8 +1856,6 @@ body, h1, p, a, input, button { } -/* --- */ - /* Ensuring dark theme compliance */ @media (prefers-color-scheme: dark) { .leaflet-control-locate, diff --git a/static/images/black.webp b/static/images/black.webp new file mode 100644 index 0000000000000000000000000000000000000000..44386b541e2f571eb93eb1a16261f75f72690fd3 GIT binary patch literal 10936 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 diff --git a/static/images/mocha.webp b/static/images/mocha.webp new file mode 100644 index 0000000000000000000000000000000000000000..d6369586f9f1661140bcc3d3601910b4d288ccc8 GIT binary patch literal 9566 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 literal 0 HcmV?d00001 diff --git a/static/images/night.webp b/static/images/night.webp new file mode 100644 index 0000000000000000000000000000000000000000..332926842c48257868d19250bdfd0dd182a5f60c GIT binary patch literal 10006 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 literal 0 HcmV?d00001 diff --git a/templates/search.html b/templates/search.html index aa425a2..1300d4e 100755 --- a/templates/search.html +++ b/templates/search.html @@ -59,7 +59,7 @@

Settings

- +

Current theme: {{.Theme}}

diff --git a/templates/settings.html b/templates/settings.html index d106af3..73843f6 100644 --- a/templates/settings.html +++ b/templates/settings.html @@ -6,77 +6,85 @@ Settings - Ocásek + -
-

Ocásek

-
- - - + -
-
- - -
-
- - -
-
- - -
-
- - -
-
-
- - + +
+ +
+
+

Theme

+
+ + + +
+

Safe Search

+ +
+ +
+

Preferred Language

+ +
+ +
+

|

+
-
- - -
-
-
- -
-
-

SETTINGS ARE NOT IMPLEMENTED YET

-

Theme

- -
- -

Language

- -
- - - -

Privacy

- -
- -

- -
-
- +
diff --git a/user-settings.go b/user-settings.go index 80b8b04..9b7b5ee 100755 --- a/user-settings.go +++ b/user-settings.go @@ -1,6 +1,9 @@ package main -import "net/http" +import ( + "html/template" + "net/http" +) type UserSettings struct { Theme string @@ -57,4 +60,63 @@ func saveUserSettings(w http.ResponseWriter, settings UserSettings) { Secure: true, // Ensure cookie is sent over HTTPS only SameSite: http.SameSiteNoneMode, // Set SameSite to None }) + + printDebug("settings saved: %v", settings) +} + +func handleSaveSettings(w http.ResponseWriter, r *http.Request) { + if r.Method == "POST" { + // Load current settings + settings := loadUserSettings(r) + + // Update only the settings that were submitted in the form + if theme := r.FormValue("theme"); theme != "" { + settings.Theme = theme + } + if lang := r.FormValue("lang"); lang != "" { + settings.Language = lang + } + if safe := r.FormValue("safe"); safe != "" { + settings.SafeSearch = safe + } + + // Save the updated settings + saveUserSettings(w, settings) + + // Redirect back to the previous page or settings page + http.Redirect(w, r, r.FormValue("past"), http.StatusSeeOther) + } +} + +func handleSettings(w http.ResponseWriter, r *http.Request) { + // Load user settings + settings = loadUserSettings(r) + + data := struct { + LanguageOptions []LanguageOption + CurrentLang string + Theme string + Safe string + }{ + LanguageOptions: languageOptions, + CurrentLang: settings.Language, + Theme: settings.Theme, + Safe: settings.SafeSearch, + } + + printDebug("Rendering settings with data: %+v", data) + + tmpl, err := template.ParseFiles("templates/settings.html") + if err != nil { + printErr("Error parsing template: %s", err) + http.Error(w, "Internal Server Error", 500) + return + } + + err = tmpl.Execute(w, data) + if err != nil { + printErr("Error executing template: %s", err) + http.Error(w, "Internal Server Error", 500) + return + } }