From 170c4cb559b2b71724f2d0fb0ed076ef23fe23f2 Mon Sep 17 00:00:00 2001 From: Aidan Date: Mon, 30 Nov 2020 22:04:43 -0800 Subject: [PATCH] add storage system, also parse groups --- project.clj | 3 +- src/whisper/core.clj | 61 ++++++++++++++++++++++++++--------------- src/whisper/signald.clj | 17 +++++++++++- src/whisper/storage.clj | 59 +++++++++++++++++++++++++++++++++++++++ src/whisper/ui.clj | 7 +++-- 5 files changed, 121 insertions(+), 26 deletions(-) create mode 100644 src/whisper/storage.clj diff --git a/project.clj b/project.clj index 12ab4be..cf07531 100644 --- a/project.clj +++ b/project.clj @@ -11,7 +11,8 @@ [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"]] + [clj.qrgen "0.4.0"] + [codax "1.3.1"]] :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 0b3942a..5f1d152 100644 --- a/src/whisper/core.clj +++ b/src/whisper/core.clj @@ -9,8 +9,12 @@ (:import (java.io BufferedReader InputStreamReader)) (:use [whisper.ui] - [whisper.signald])) + [whisper.signald] + [whisper.storage])) +;; TODO: config management +;; TODO: make config dir +(def dbpath "/tmp/temp_db") (def sockpath "/var/run/signald/signald.sock") (def user (atom {})) @@ -23,6 +27,15 @@ (reset! user (first users))) (disassoc-callback-type "account_list")) +(defn digest-group-or-contact-list + [list db] + ;; Should we iter in a background thread? + (doseq [contact list] + (let [id (get-id-from-contact-or-group contact) + name (get contact "name")] + (store-contact db id contact) + (add-json-contact {:id id :name name})))) + (defn -main "packs and shows main window with signald version string" [& args] @@ -30,27 +43,30 @@ ;; 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"))) - (assoc-callback-type "unexpected_error" (fn [x] (add-str-flag (str "Unexpected error: " - (get-in x ["data" "message"]))))) - (assoc-callback-type "contacts_list" (fn [x] (let [contacts (get x "data")] - ;; Should we iter in a background thread? - (doseq [contact contacts] - ;; TODO: sync with storage - (add-json-contact contact))))) - ;; prep to read signald - (let [sigd (get-signald-sock sockpath)] - (if (nil? sigd) - (add-str-flag "No signald connection.") + ;; also open storage + (let [sigd (get-signald-sock sockpath) + db (init-db dbpath)] - ;; else, we have connection to signald + ;; check if signald conn failed + (if (nil? sigd) + (add-str-flag "No signald connection.")) + + ;; 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"))) + (assoc-callback-type "unexpected_error" (fn [x] (add-str-flag (str "Unexpected error: " + (get-in x ["data" "message"]))))) + (assoc-callback-type "contacts_list" (fn [x] (digest-group-or-contact-list + (get-in x ["data"]) db))) + (assoc-callback-type "group_list" (fn [x] (digest-group-or-contact-list + (get-in x ["data" "groups"]) db))) + + ;; get io channels for signald (let [sigd-input (io/writer (.getOutputStream sigd)) sigd-output (BufferedReader. (InputStreamReader. (.getInputStream sigd))) sigd-loop (thread (callback-loop sigd-output))] @@ -88,10 +104,11 @@ (do (make-subscribe-req sigd-input new-user) (make-contact-sync-req sigd-input new-user) - (make-contact-list-req sigd-input new-user)))))) + (make-contact-list-req sigd-input new-user) + (make-group-list-req sigd-input new-user)))))) ;; find avail accounts (make-list-accounts-req sigd-input) ;; finally, block on signald loop till return - (