-
Notifications
You must be signed in to change notification settings - Fork 0
/
info.clj
81 lines (68 loc) · 2.85 KB
/
info.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
(ns bf3.info
(:require [clojure.string :as s]
[clojure.core.cache :as cache]
[clojure.core.memoize :as mem]
[clj-time.core :as time]
[clj-time.format :as time-format])
(:use [bf3.db]
[bf3.bl :only [server-ids]])
(:import java.net.URL))
(def ^{:dynamic true} *cache-time* (* 2 60 1000))
(def ^{:dynamic true} *short-cache-time* (* 30 1000))
(def ^{:dynamic true} *long-cache-time* (* 60 60 1000))
(defn merge-live-infos [infos]
(reduce (fn [l1 l2]
(let [m (merge l1 l2)
online (fn [u t] (if (not-empty u) (assoc u :online t) u))
u2 (map #(online % true) (get l2 :users []))
u2-ids (into #{} (map :personaId u2))
u1-ids (map :personaId (get l1 :users []))
u1 (->> (get l1 :users [])
(filter (fn [u] (not (contains? u2-ids (:personaId u)))))
(map #(online % false)))]
(merge m {:users
(filter not-empty
(concat [] u1 u2))})))
infos))
(def merge-infos (mem/memo-ttl merge-live-infos *long-cache-time*))
(defn- get-battle-info [battles]
(when (and (not-empty battles)
(map? (first battles)))
(let [live-infos (map :live battles)
mergedinfo (merge-infos live-infos)
lastb (last battles)
start (if (:lastupdate lastb) (:lastupdate lastb)
(:time lastb))
end (->> battles first :time)]
(merge (first battles)
(when (map? mergedinfo) mergedinfo)
{:time {:start start
:end end}
:live live-infos}))))
(defn- parse-battle-infos
([logs]
(->> logs
(filter (fn [b] (and (not-empty (:users b)))
(some (fn [[team score]] (not= 0 (:max score))) (:stats b))))
(#(partition-by
(fn [b] (str (:gameId b) (:currentMap b) (:gameMode b) (:mapVariant b)
(:vehicles b) (:mapMode b)
(some (fn [[t s]] (apply = (vals (select-keys s [:max :current]))))
(:stats b)))) %))
(filter #(< 15 (count %))))))
(comment
(some (fn [[team score]]
(and (re-find #"conquest" (s/lower-case (str (:name b))))
(or (= 0 (:current score))
(= 1 (:current score)))))
(:stats b)))
(defn- get-battles
([logs]
(pmap get-battle-info (parse-battle-infos logs))))
(defn- get-battle-infos
([& {:keys [weeks logs] :or {weeks 0}}]
(if logs (get-battles logs)
(pmap (fn [id] (filter #(not-empty (:live %))
(get-battles (get-battles-by-server id :weeks weeks))))
(vals server-ids)))))
(def battle-info (mem/memo-ttl get-battle-infos *short-cache-time*))