primitive chat client, bug fixes

This commit is contained in:
michaelr 2016-03-04 17:17:46 +02:00
parent 14df49232b
commit 1de94e4d5d
3 changed files with 95 additions and 15 deletions

View File

@ -4,11 +4,44 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="css/style.css" rel="stylesheet" type="text/css">
<style type="text/css">
input[type=text] {
width: 530px;
margin-bottom: 5px;
}
label {
width: 80px;
display: inline-block;
}
</style>
</head>
<body>
<div id="app">
<h2>Figwheel template</h2>
<p>Checkout your developer console.</p>
<!--<div id="app">-->
<!--<h2>Figwheel template</h2>-->
<!--<p>Checkout your developer console.</p>-->
<!--</div>-->
<div>
<label for="rpc-url">RPC URL</label>
<input id="rpc-url" type="text" value="http://localhost:4546" />
<button id="connect-button">Connect</button>
</div>
<div>
<div>
<label for="chat">Chat:</label>
</div>
<textarea id="chat" rows="20" cols="150"></textarea>
</div>
<div>
<label for="msg">Message:</label>
<input id="msg" type="text" />
</div>
<div>
<label for="my-identity">My Identity</label>
<input id="my-identity" readonly=readonly type="text" />
</div>
<div>
<label for="to-identity">To Identity</label>
<input id="to-identity" type="text" />
</div>
<script src="js/compiled/cljs_tests.js" type="text/javascript"></script>
</body>

View File

@ -1,6 +1,15 @@
(ns cljs-tests.core
(:require [cljs-tests.protocol.api :as p]
[cljs-tests.utils.logging :as log]))
[cljs-tests.utils.logging :as log]
[goog.dom :as g]
[goog.dom.forms :as f]
[goog.events :as e]
[goog.events.EventType]
[goog.events.KeyCodes]
[goog.events.KeyHandler]
[goog.events.KeyHandler.EventType :as key-handler-events])
(:import [goog.events EventType]
[goog.events KeyCodes]))
(enable-console-print!)
@ -10,6 +19,41 @@
;; (swap! app-state update-in [:__figwheel_counter] inc)
)
(defn start []
(let [rpc-url (-> (g/getElement "rpc-url")
(f/getValue))
{identity :identity}
(p/init-protocol
{:ethereum-rpc-url rpc-url
:handler (fn [{:keys [from payload event-type] :as event}]
(log/info "Event:" (clj->js event))
(case event-type
:new-msg (let [{content :content} payload
chat-area (g/getElement "chat")
chat (f/getValue chat-area)
chat (str chat (subs from 0 5) ": " content "\n")]
(f/setValue chat-area chat))
(log/info "Don't know how to handle" (clj->js event-type))))})]
(-> (g/getElement "my-identity")
(f/setValue identity))
(e/listen (-> (g/getElement "msg")
(goog.events.KeyHandler.))
key-handler-events/KEY
(fn [e]
(when (= (.-keyCode e) KeyCodes/ENTER)
(let [msg (-> (g/getElement "msg")
(f/getValue))
to-identity (-> (g/getElement "to-identity")
(f/getValue))]
(p/send-user-msg {:to to-identity
:content msg})))))))
(let [button (g/getElement "connect-button")]
(e/listen button EventType/CLICK
(fn [e]
(g/setProperties button #js {:disabled "disabled"})
(start))))
(comment

View File

@ -11,6 +11,9 @@
(defn from-ascii [s]
(.fromAscii js/Web3.prototype s))
(defn to-ascii [s]
(.toAscii js/Web3.prototype s))
(defn whisper [web3]
(.-shh web3))
@ -28,10 +31,10 @@
(defn invoke-handler [event-type params]
((state/handler) (assoc params :event-type event-type)))
(defn handle-ack [msg-id]
(log/info "Got ack for message:" msg-id)
(state/remove-pending-message msg-id)
(invoke-handler :msg-acked {:msg-id msg-id}))
(defn handle-ack [{:keys [ack-msg-id]}]
(log/info "Got ack for message:" ack-msg-id)
(state/remove-pending-message ack-msg-id)
(invoke-handler :msg-acked {:msg-id ack-msg-id}))
(defn post-msg [web3 msg]
(let [js-msg (clj->js msg)]
@ -56,11 +59,11 @@
(defn send-ack [web3 to msg-id]
(log/info "Acking message:" msg-id "To:" to)
(->> (make-msg {:from (state/my-identity)
:to to
:payload {:type :ack
:msg-id msg-id}})
(post-msg web3)))
(let [[_ msg] (make-msg {:from (state/my-identity)
:to to
:payload {:type :ack
:ack-msg-id msg-id}})]
(post-msg web3 msg)))
(defn handle-user-msg [web3 from {:keys [msg-id] :as payload}]
(send-ack web3 from msg-id)
@ -77,10 +80,10 @@
(if (= to (state/my-identity))
(let [{msg-type :type
msg-id :msg-id
:as payload} (->> (from-ascii payload)
:as payload} (->> (to-ascii payload)
(read-string))]
(case msg-type
:ack (handle-ack msg-id)
:ack (handle-ack payload)
:user-msg (handle-user-msg web3 from payload)))
(log/warn "My identity:" (state/my-identity) "Message To:" to "Message is encrypted for someone else, ignoring"))))