diff --git a/project.clj b/project.clj index 988511c..12ab4be 100644 --- a/project.clj +++ b/project.clj @@ -4,9 +4,14 @@ :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0" :url "https://www.eclipse.org/legal/epl-2.0/"} :dependencies [[org.clojure/clojure "1.10.0"] - [com.kohlschutter.junixsocket/junixsocket-demo "2.2.0"] - [seesaw "1.5.0"] - [org.clojure/data.json "0.2.6"]] + [com.kohlschutter.junixsocket/junixsocket-common "2.3.2"] + [com.kohlschutter.junixsocket/junixsocket-native-common "2.3.2"] + [cljfx "1.7.10"] + [org.clojure/data.json "0.2.6"] + [org.clojure/tools.logging "1.1.0"] + [org.clojure/core.cache "1.0.207"] + [org.clojure/core.async "1.3.610"] + [clj.qrgen "0.4.0"]] :main ^:skip-aot whisper.core :target-path "target/%s" :profiles {:uberjar {:aot :all}}) diff --git a/src/whisper/core.clj b/src/whisper/core.clj index 5fb48fb..e2aedef 100644 --- a/src/whisper/core.clj +++ b/src/whisper/core.clj @@ -1,15 +1,65 @@ (ns whisper.core "Whisper Namespace" + (:require [clojure.tools.logging :as log] + [clojure.data.json :as json] + [clojure.core.async :as async + :refer [ (count users) 1) + (log/info "Alert, multi account not supported yet. picking first on list")) + (swap! user (first users)))) (defn -main "packs and shows main window with signald version string" [& args] - (main-loop "whisper is online")) + + ;; TODO: removeme + (add-str-flag (json/read-str "\"loading....\"")) + + ;; paint main chat window + (paint-main) + + ;; register callbacks between the UI and signald + (assoc-callback-type "version" (fn [x] (add-str-flag (get-version-from-version-message x)))) + (assoc-callback-type "linking_uri" (fn [x] (paint-linking x))) + (assoc-callback-type "linking_successful" (fn [_] + (paint-linking nil))) + (assoc-callback-type "linking_error" (fn [_] + (paint-linking nil) + (add-str-flag "Linking returned Error"))) + + ;; update ui loop + (let [sigd (get-signald-sock sockpath)] + (if (nil? sigd) + ;; TODO: change this to call add-json-flag + (add-str-flag "No signald connection.") + + ;; else, we have connection to signald + (let [sigd-input (io/writer (.getOutputStream sigd)) + sigd-output (BufferedReader. (InputStreamReader. (.getInputStream sigd))) + sigd-loop (thread (callback-loop sigd-output))] + + ;; handle login basically + (assoc-callback-type "account_list" (fn [x] (if (< (count x) 1) + (do (make-link-data-req sigd-input) + (make-list-accounts-req sigd-input)) + (handle-users x)))) + + ;; find avail accounts + (make-list-accounts-req sigd-input) + + ;; finally, block on signald loop till return + (lifecycle #(or (fx/keyword->lifecycle %) + (fx/fn->lifecycle-with-context %))})) + +(def aux-renderer (fx/create-renderer)) + +(defn paint-main + [] + (fx/mount-renderer main-context main-renderer)) + +(defn paint-linking + [obj] + (if (nil? obj) + ;; if no obj, turn off window + (aux-renderer {:fx/type qrcode-ui + :showing false + :image (WritableImage. 1 1) + :message "lol"}) + + ;; else gen qr + (let [uri (str (get-in obj ["data" "uri"])) + image (io/file (qr/from uri))] + (aux-renderer {:fx/type qrcode-ui + :showing true + :image (Image. (FileInputStream. image))}))))