commit 19d3a194270537e8ba78754493a7685b7807c085 Author: Fey Naomi Schrewe Date: Sat Sep 6 23:23:57 2025 +0200 chore: initial commit diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..c81738b --- /dev/null +++ b/deps.edn @@ -0,0 +1,20 @@ +{:deps {com.yetanalytics/flint {:mvn/version "0.3.0" + :exclusions [org.clojure/clojuresript]} + ring/ring {:mvn/version "1.14.2"} + ring-logger/ring-logger {:mvn/version "1.1.1"} + metosin/reitit {:mvn/version "0.9.1"} + org.babashka/http-client {:mvn/version "0.4.22"} + com.taoensso/telemere {:mvn/version "1.1.0"} + com.taoensso/telemere-slf4j {:mvn/version "1.1.0"} + hiccup/hiccup {:mvn/version "2.0.0"} + cheshire/cheshire {:mvn/version "6.1.0"} + io.github.paintparty/bling {:mvn/version "0.8.8"}} + :aliases {:repl/conjure + {:extra-deps {nrepl/nrepl {:mvn/version "1.0.0"} + cider/cider-nrepl {:mvn/version "0.42.1"}} + :main-opts ["--main" "nrepl.cmdline" + "--middleware" "[cider.nrepl/cider-middleware]" + "--interactive"]} + :uberdeps {:replace-deps {uberdeps/uberdeps {:mvn/version "1.4.0"}} + :replace-paths [] + :main-opts ["-m" "uberdeps.uberjar"]}}} diff --git a/src/core.clj b/src/core.clj new file mode 100644 index 0000000..17f7db1 --- /dev/null +++ b/src/core.clj @@ -0,0 +1,61 @@ +(ns core + (:require [wikidata :as wd] + [cheshire.core :as json] + [reitit.ring :as ring] + [ring.adapter.jetty] + [ring.middleware.reload] + [ring.logger :refer [wrap-with-logger]] + [clojure.java.io :refer [reader]] + [bling.core :as bling] + [bling.hifi] + [hiccup2.core :as h] + [taoensso.telemere :as tel])) + +(def known-species (atom {})) +(def observations (atom [])) + +(defn add-observation* [bird time] + (swap! observations #(conj % {:bird bird :time time})) + (bling/callout {:type :info} (str "Saw bird " (get-in bird [:name :en])))) + +(defn add-observation [bird time] + (let [?species (@known-species bird)] + (if (not ?species) + (let [species (wd/get-bird bird)] + (swap! known-species #(assoc % bird species)) + (add-observation* species time)) + (add-observation* ?species time)))) + +(defn add-observations [birds time] + (doseq [bird birds] (add-observation bird time))) + +(defn post-observation [request] + (let [body (json/parse-stream (reader (:body request)) true) + birds (:birds body) + now (java.time.LocalDateTime/now)] + (add-observations birds now) + {:status 200})) + +(defn list-observation [_] + (let [since (.minusDays (java.time.LocalDateTime/now) 1) + observations (map first (vals (group-by #(get-in % [:bird :latin]) (filter #(.isBefore since (:time %)) @observations)))) + template-observation (fn [{bird :bird}] [:li (str (get-in bird [:name :en]) " (" (:latin bird) ")")])] + {:status 200 + :body (str (h/html {:mode :html} + [:html [:body + [:section + [:h1 "Birds today"] + [:ul + (map template-observation observations)]]]]))})) + +(def router + (wrap-with-logger + (ring/ring-handler + (ring/router + [["/" {:get list-observation}] + ["/observation" {:post post-observation}]]) + (ring/create-default-handler)))) + +(ring.middleware.reload/wrap-reload (ring.adapter.jetty/run-jetty #'router {:port 8080})) + + diff --git a/src/wikidata.clj b/src/wikidata.clj new file mode 100644 index 0000000..2bbc52f --- /dev/null +++ b/src/wikidata.clj @@ -0,0 +1,29 @@ +(ns wikidata + (:require [com.yetanalytics.flint :as f]) + (:require [babashka.http-client :as http]) + (:require [cheshire.core :as json])) + +(def wikidata-query-url "https://query.wikidata.org/sparql") + +(defn- query [latin] + (-> `{:prefixes {:wdt "" + :wd "" + :bd "" + :wikibase ""} + :select [~'?name] + :where [[~'?bird :wdt/P31 :wd/Q16521] + [~'?bird :wdt/P225 ~latin] + [~'?bird :wdt/P1843 ~'?name] + [:service :wikibase/label [[:bd/serviceParam :wikibase/language "en,de,fr"]]]] + } + (f/format-query :pretty true))) + + +(defn get-bird [latin] + (let [bindings (-> (http/get wikidata-query-url {:query-params {:query (query latin) :format "json"}}) + (:body) + (json/parse-string true) + (:results) + (:bindings))] + {:name (apply hash-map (flatten (map (fn [{name :name}] [(keyword (:xml:lang name)) (:value name)]) bindings))) :latin latin})) +