Skip to content

Commit 93d9712

Browse files
committed
restructuring; loading missing tweets
1 parent b395ddf commit 93d9712

File tree

7 files changed

+86
-140
lines changed

7 files changed

+86
-140
lines changed

Clojure-Websockets/src/cljs/birdwatch/communicator.cljs

+2-3
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@
6969
(defonce chsk-router
7070
(sente/start-chsk-router-loop! event-handler ch-chsk))
7171

72-
72+
; loop for sending messages about missing tweet to server
7373
(go-loop []
7474
(let [tid (<! c/tweet-missing-chan)]
75-
(chsk-send! [:cmd/missing {:id_str tid
76-
:uid (:uid @chsk-state)}])
75+
(chsk-send! [:cmd/missing {:id_str tid :uid (:uid @chsk-state)}])
7776
(recur)))

Clojure-Websockets/src/cljs/birdwatch/core.cljs

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66
[birdwatch.communicator :as comm]
77
[birdwatch.wordcount :as wc]
88
[birdwatch.ui :as ui]
9+
[birdwatch.ui-tweets :as ui-t]
910
[birdwatch.state :as state]
1011
[cljs.core.async :as async :refer [<! >! chan put! alts! timeout]]))
1112

1213
;;;; Main file of the BirdWatch application written in ClojureScript
1314

14-
;;; Application state in a single atom
15-
;;; Will be initialized with the map returned by util/initial-state.
16-
;;; Reset to a new clean slate when a new search is started.
15+
;;; The application state lives in a single atom in birdwatch.state and
16+
;;; will be initialized with the map returned by state/initial-state.
1717
(reset! state/app (state/initial-state))
1818

19-
;;; Om components for the application are initialized here. Their implementation lives in the ui namespace.
20-
(om/root ui/tweets-view state/app {:target (. js/document (getElementById "tweet-frame"))})
19+
;;; Om components for the application are initialized here.
20+
(om/root ui-t/tweets-view state/app {:target (. js/document (getElementById "tweet-frame"))})
2121
(om/root ui/count-view state/app {:target (. js/document (getElementById "tweet-count"))})
2222
(om/root ui/users-count-view state/app {:target (. js/document (getElementById "users-count"))})
2323
(om/root ui/total-count-view state/app {:target (. js/document (getElementById "total-tweet-count"))})

Clojure-Websockets/src/cljs/birdwatch/state.cljs

-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
"function returning fresh application state"
1414
{:count 0
1515
:n 10
16-
:retweets {}
1716
:tweets-map {}
1817
:search-text ""
1918
:page 1

Clojure-Websockets/src/cljs/birdwatch/tweets.cljs

+5-7
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,13 @@
99

1010
(enable-console-print!)
1111

12-
(defn add-to-tweets-map2 [app tweets-map tweet]
12+
(defn add-to-tweets-map [app tweets-map tweet]
1313
"adds tweet to tweets-map"
1414
(swap! app
1515
assoc-in [tweets-map (keyword (:id_str tweet))]
16-
tweet)
17-
;(print ((keyword (:id_str tweet)) (:tweets-map @app)))
18-
)
16+
tweet))
1917

20-
(defn add-to-tweets-map [app tweets-map tweet]
18+
(defn add-to-tweets-map2 [app tweets-map tweet]
2119
"adds tweet to tweets-map"
2220
(swap! app
2321
assoc-in [tweets-map (keyword (:id_str tweet))]
@@ -40,7 +38,7 @@
4038
(swap-when-larger app :by-retweets rt-id rt-count)
4139
(swap-when-larger app :by-favorites rt-id (:favorite_count rt))
4240
(util/swap-pmap app :by-rt-since-startup rt-id (inc (get (:by-rt-since-startup state) rt-id 0)))
43-
(when (> rt-count (:retweet_count (rt-id (:retweets state)))) (add-to-tweets-map app :retweets rt)))))
41+
(when (> rt-count (:retweet_count (rt-id (:tweets-map state)))) (add-to-tweets-map app :tweets-map rt)))))
4442

4543
(defn add-tweet [tweet app]
4644
"increment counter, add tweet to tweets map and to sorted sets by id and by followers"
@@ -59,7 +57,7 @@
5957

6058
(go-loop []
6159
(let [mt (<! c/missing-tweet-found-chan)]
62-
(add-to-tweets-map2 state/app :tweets-map mt)
60+
(add-to-tweets-map state/app :tweets-map mt)
6361
(recur)))
6462

6563
(go-loop []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
(ns birdwatch.ui-tweets
2+
(:require-macros [cljs.core.async.macros :refer [go go-loop]])
3+
(:require [om.core :as om :include-macros true]
4+
[om.dom :as dom :include-macros true]
5+
[birdwatch.util :as util]
6+
[birdwatch.channels :as c]
7+
[birdwatch.communicator :as comm]
8+
[birdwatch.state :as state]
9+
[cljs.core.async :as async :refer [<! chan put! timeout]]))
10+
11+
(enable-console-print!)
12+
13+
(defn twitter-intent [tweet intent icon]
14+
"generate link with button customized for specific tweet and intent"
15+
(dom/a #js {:href (str "https://twitter.com/intent/" intent (:id_str tweet))}
16+
(dom/img #js {:src (str "/images/" icon)})))
17+
18+
(defn tweet-view [raw-tweet owner]
19+
"rendering single tweet card"
20+
(reify
21+
om/IRender
22+
(render [this]
23+
(if (:user raw-tweet)
24+
(let [tweet (util/format-tweet raw-tweet)
25+
user (:user tweet)
26+
screen-name (:screen_name user)
27+
href (str "http://www.twitter.com/" screen-name)
28+
media (:media (:entities tweet))]
29+
(dom/div #js {:className "tweet"}
30+
(dom/span nil (dom/a #js {:href href :target "_blank"}
31+
(dom/img #js {:className "thumbnail" :src (:profile_image_url user)})))
32+
(dom/a #js {:href href :target "_blank"}
33+
(dom/span #js {:className "username" :src (:profile_image_url user)} (:name user)))
34+
(dom/span #js {:className "username_screen"} (str " @" screen-name))
35+
(dom/div #js {:className "pull-right timeInterval"} (util/from-now (:created_at tweet)))
36+
(dom/div #js {:className "tweettext"}
37+
(dom/div #js {:dangerouslySetInnerHTML #js {:__html (:html-text tweet)}})
38+
(dom/div #js {:className "pull-left timeInterval"}
39+
(str (util/number-format (:followers_count user)) " followers"))
40+
(dom/div #js {:className "pull-right timeInterval"}
41+
(str (util/rt-count-since-startup tweet)
42+
(util/rt-count tweet)
43+
(util/fav-count tweet))))
44+
(when (> (count media) 0)
45+
(dom/div #js {:className "tweet-image"}
46+
(dom/a #js {:href (:url (get media 0)) :target "_blank"}
47+
(dom/img #js {:src (str (:media_url (get media 0)) ":small")}))))
48+
(dom/div #js {:className "intent"}
49+
(twitter-intent tweet "tweet?in_reply_to=" "reply.png")
50+
(twitter-intent tweet "retweet?tweet_id=" "retweet.png")
51+
(twitter-intent tweet "favorite?tweet_id=" "favorite.png"))))
52+
(do
53+
(put! c/tweet-missing-chan (:id_str raw-tweet))
54+
(print "retrieving tweet" (:id_str raw-tweet))
55+
(dom/div #js {:className "tweet"} "loading..." (:id_str raw-tweet)))))))
56+
57+
(defn tweets-view [app owner]
58+
"rendering tweet list"
59+
(reify
60+
om/IRender
61+
(render [this]
62+
(let [tweets (util/tweets-by-order2 (:sorted app) app (:n app) (- (:page app) 1))]
63+
(apply dom/div nil (om/build-all tweet-view tweets))))))

Clojure-Websockets/src/cljs/birdwatch/ui.cljs

-119
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,6 @@
3131
(render [this]
3232
(dom/span nil "Indexed: " (dom/strong nil (:total-tweet-count app)) " tweets"))))
3333

34-
(def find-tweets {:by-id (util/tweets-by-order :tweets-map :by-id)
35-
:by-followers (util/tweets-by-order :tweets-map :by-followers)
36-
:by-retweets (util/tweets-by-order :retweets :by-retweets)
37-
:by-favorites (util/tweets-by-order :retweets :by-favorites)
38-
:by-rt-since-startup (util/tweets-by-order :retweets :by-rt-since-startup)})
39-
40-
(def find-tweets2 {:by-id (util/tweet-ids-by-order :tweets-map :by-id)
41-
:by-followers (util/tweet-ids-by-order :tweets-map :by-followers)
42-
:by-retweets (util/tweet-ids-by-order :retweets :by-retweets)
43-
:by-favorites (util/tweet-ids-by-order :retweets :by-favorites)
44-
:by-rt-since-startup (util/tweet-ids-by-order :retweets :by-rt-since-startup)})
45-
4634
(defn sort-button-js [app key]
4735
"generates JS for sort button for both updating sort order and showing active button"
4836
#js {:onClick (fn [e] (om/update! app [:sorted] key))
@@ -80,113 +68,6 @@
8068
(dom/button #js {:className "btn btn-primary" :onClick #(comm/start-search)}
8169
(dom/span #js {:className "glyphicon glyphicon-search"})))))))
8270

83-
(defn twitter-intent [tweet intent icon]
84-
"generate link with button customized for specific tweet and intent"
85-
(dom/a #js {:href (str "https://twitter.com/intent/" intent (:id_str tweet))}
86-
(dom/img #js {:src (str "/images/" icon)})))
87-
88-
#_(defn tweet-view [tid owner]
89-
"rendering single tweet card"
90-
(print tid)
91-
(let [raw-tweet ((first tid) (:tweets-map @state/app))]
92-
(reify
93-
om/IRender
94-
(render [this]
95-
(if (:user raw-tweet)
96-
(let [tweet (util/format-tweet raw-tweet)
97-
user (:user tweet)
98-
screen-name (:screen_name user)
99-
href (str "http://www.twitter.com/" screen-name)
100-
media (:media (:entities tweet))]
101-
(dom/div #js {:className "tweet"}
102-
(dom/span nil (dom/a #js {:href href :target "_blank"}
103-
(dom/img #js {:className "thumbnail" :src (:profile_image_url user)})))
104-
(dom/a #js {:href href :target "_blank"}
105-
(dom/span #js {:className "username" :src (:profile_image_url user)} (:name user)))
106-
(dom/span #js {:className "username_screen"} (str " @" screen-name))
107-
(dom/div #js {:className "pull-right timeInterval"} (util/from-now (:created_at tweet)))
108-
(dom/div #js {:className "tweettext"}
109-
(dom/div #js {:dangerouslySetInnerHTML #js {:__html (:html-text tweet)}})
110-
(dom/div #js {:className "pull-left timeInterval"}
111-
(str (util/number-format (:followers_count user)) " followers"))
112-
(dom/div #js {:className "pull-right timeInterval"}
113-
(str (util/rt-count-since-startup tweet)
114-
(util/rt-count tweet)
115-
(util/fav-count tweet))))
116-
(when (> (count media) 0)
117-
(dom/div #js {:className "tweet-image"}
118-
(dom/a #js {:href (:url (get media 0)) :target "_blank"}
119-
(dom/img #js {:src (str (:media_url (get media 0)) ":small")}))))
120-
(dom/div #js {:className "intent"}
121-
(twitter-intent tweet "tweet?in_reply_to=" "reply.png")
122-
(twitter-intent tweet "retweet?tweet_id=" "retweet.png")
123-
(twitter-intent tweet "favorite?tweet_id=" "favorite.png"))))
124-
(do
125-
(print "hello")
126-
;(print ((keyword (:id_str raw-tweet)) (:tweets-map @state/app)))
127-
;(put! c/tweet-missing-chan tid)
128-
;(dom/div #js {:className "tweet"} "loading... " tid)
129-
130-
))))))
131-
132-
133-
134-
(defn tweet-view [raw-tweet-entry owner]
135-
"rendering single tweet card"
136-
(print "raw-tweet")
137-
(print raw-tweet-entry)
138-
(let [raw-tweet ((keyword (:id_str raw-tweet-entry)) (:tweets-map @state/app))]
139-
(reify
140-
om/IRender
141-
(render [this]
142-
(if (:user raw-tweet)
143-
(let [tweet (util/format-tweet raw-tweet)
144-
user (:user tweet)
145-
screen-name (:screen_name user)
146-
href (str "http://www.twitter.com/" screen-name)
147-
media (:media (:entities tweet))]
148-
(dom/div #js {:className "tweet"}
149-
(dom/span nil (dom/a #js {:href href :target "_blank"}
150-
(dom/img #js {:className "thumbnail" :src (:profile_image_url user)})))
151-
(dom/a #js {:href href :target "_blank"}
152-
(dom/span #js {:className "username" :src (:profile_image_url user)} (:name user)))
153-
(dom/span #js {:className "username_screen"} (str " @" screen-name))
154-
(dom/div #js {:className "pull-right timeInterval"} (util/from-now (:created_at tweet)))
155-
(dom/div #js {:className "tweettext"}
156-
(dom/div #js {:dangerouslySetInnerHTML #js {:__html (:html-text tweet)}})
157-
(dom/div #js {:className "pull-left timeInterval"}
158-
(str (util/number-format (:followers_count user)) " followers"))
159-
(dom/div #js {:className "pull-right timeInterval"}
160-
(str (util/rt-count-since-startup tweet)
161-
(util/rt-count tweet)
162-
(util/fav-count tweet))))
163-
(when (> (count media) 0)
164-
(dom/div #js {:className "tweet-image"}
165-
(dom/a #js {:href (:url (get media 0)) :target "_blank"}
166-
(dom/img #js {:src (str (:media_url (get media 0)) ":small")}))))
167-
(dom/div #js {:className "intent"}
168-
(twitter-intent tweet "tweet?in_reply_to=" "reply.png")
169-
(twitter-intent tweet "retweet?tweet_id=" "retweet.png")
170-
(twitter-intent tweet "favorite?tweet_id=" "favorite.png"))))
171-
(do
172-
(print "hello")
173-
;(print ((keyword (:id_str raw-tweet)) (:tweets-map @state/app)))
174-
(put! c/tweet-missing-chan (:id_str raw-tweet-entry))
175-
(dom/div #js {:className "tweet"} "loading... " (:id_str raw-tweet-entry))))))))
176-
177-
(defn tweets-view [app owner]
178-
"rendering tweet list"
179-
(reify
180-
om/IRender
181-
(render [this]
182-
(let [tweets (((:sorted app) find-tweets) app (:n app) (- (:page app) 1))]
183-
(print "load tweets")
184-
(print (count tweets))
185-
(print tweets)
186-
(apply dom/div nil (om/build-all
187-
tweet-view
188-
tweets))))))
189-
19071
(defn pag-items [app page-change-chan]
19172
"function creating pagination items"
19273
(map #(dom/li #js {:className (if (= % (:page app)) "active" "") :onClick (fn [e] (put! page-change-chan %))}

Clojure-Websockets/src/cljs/birdwatch/util.cljs

+11-5
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
(defn entity-count [tweet sym s]
5454
"gets count of specified entity from either tweet, or, when exists, original (retweeted) tweet"
5555
(let [rt-id (if (contains? tweet :retweeted_status) (:id_str (:retweeted_status tweet)) (:id_str tweet))
56-
count (sym ((keyword rt-id) (:retweets @state/app)))]
56+
count (sym ((keyword rt-id) (:tweets-map @state/app)))]
5757
(if (not (nil? count)) (str (number-format count) s) "")))
5858

5959
(defn rt-count [tweet] (entity-count tweet :retweet_count " RT | "))
@@ -69,12 +69,18 @@
6969
"swaps item in priority-map"
7070
(swap! app assoc priority-map (assoc (priority-map @app) id n)))
7171

72+
7273
(defn tweets-by-order [tweets-map order]
7374
"find top n tweets by specified order"
7475
(fn [app n skip]
75-
(vec (map (fn [m] ((keyword (first m))(tweets-map app))) (take n (drop (* n skip) (order app)))))))
76+
(let [tw-map tweets-map ord order]
77+
(vec (map (fn [m] ((keyword (first m))(tw-map app))) (take n (drop (* n skip) (ord app))))))))
7678

77-
(defn tweet-ids-by-order [tweets-map order]
79+
(defn tweets-by-order2 [order app n skip]
7880
"find top n tweets by specified order"
79-
(fn [app n skip]
80-
(take n (drop (* n skip) (order app)))))
81+
;(print order)
82+
(vec
83+
(filter identity
84+
(map
85+
(fn [m] ((first m) (:tweets-map app)))
86+
(take n (drop (* n skip) (order app)))))))

0 commit comments

Comments
 (0)