some minor cleanups, argument renaming for clarity, etc

This commit is contained in:
Gered 2016-02-28 15:31:26 -05:00
parent 2ab1aaffe0
commit cee04ee347
6 changed files with 86 additions and 78 deletions

View file

@ -11,7 +11,7 @@
vwowrla.core.utils)) vwowrla.core.utils))
(defn- ignore-interaction? (defn- ignore-interaction?
[entity-name ignore-entity-list {:keys [target-name source-name] :as parsed-line}] [entity-name ignore-entity-list {:keys [target-name source-name] :as event}]
(and (or (= entity-name target-name) (and (or (= entity-name target-name)
(= entity-name source-name)) (= entity-name source-name))
(or (contained-in? target-name ignore-entity-list) (or (contained-in? target-name ignore-entity-list)
@ -21,20 +21,20 @@
"returns true if the given parsed combat log line is between entities that have "returns true if the given parsed combat log line is between entities that have
been specified to ignore interactions between for the purposes of detecting been specified to ignore interactions between for the purposes of detecting
an encounter trigger" an encounter trigger"
[encounter :- Encounter [encounter :- Encounter
parsed-line :- CombatEvent] event :- CombatEvent]
(->> (:entities encounter) (->> (:entities encounter)
(filter (filter
(fn [[entity-name entity-props]] (fn [[entity-name entity-props]]
(seq (:ignore-interactions-with entity-props)))) (seq (:ignore-interactions-with entity-props))))
(filter (filter
(fn [[entity-name entity-props]] (fn [[entity-name entity-props]]
(ignore-interaction? entity-name (:ignore-interactions-with entity-props) parsed-line))) (ignore-interaction? entity-name (:ignore-interactions-with entity-props) event)))
(seq) (seq)
(boolean))) (boolean)))
(defn- ignore-skill? (defn- ignore-skill?
[entity-name ignore-skill-list {:keys [source-name skill] :as parsed-line}] [entity-name ignore-skill-list {:keys [source-name skill] :as event}]
(and (= entity-name source-name) (and (= entity-name source-name)
(contained-in? skill ignore-skill-list))) (contained-in? skill ignore-skill-list)))
@ -42,15 +42,15 @@
"returns true if the given parsed combat log line is for an encounter entity "returns true if the given parsed combat log line is for an encounter entity
that is using a skill that has been specifically indicated should be ignored that is using a skill that has been specifically indicated should be ignored
for the purposes of triggering an encounter" for the purposes of triggering an encounter"
[encounter :- Encounter [encounter :- Encounter
parsed-line :- CombatEvent] event :- CombatEvent]
(->> (:entities encounter) (->> (:entities encounter)
(filter (filter
(fn [[entity-name entity-props]] (fn [[entity-name entity-props]]
(seq (:ignore-skills entity-props)))) (seq (:ignore-skills entity-props))))
(filter (filter
(fn [[entity-name entity-props]] (fn [[entity-name entity-props]]
(ignore-skill? entity-name (:ignore-skills entity-props) parsed-line))) (ignore-skill? entity-name (:ignore-skills entity-props) event)))
(seq) (seq)
(boolean))) (boolean)))
@ -58,7 +58,7 @@
"determines if the parsed combat log line is for an event involving any specific encounter entities which "determines if the parsed combat log line is for an event involving any specific encounter entities which
should cause an encounter to begin, returning the name of the encounter if it should begin, or nil if no should cause an encounter to begin, returning the name of the encounter if it should begin, or nil if no
encounter begin was detected" encounter begin was detected"
[{:keys [target-name source-name damage aura-name type skill] :as parsed-line} :- CombatEvent [{:keys [target-name source-name damage aura-name type skill] :as event} :- CombatEvent
data :- RaidAnalysis] data :- RaidAnalysis]
(if-let [encounter-name (or (find-defined-encounter-name target-name) (if-let [encounter-name (or (find-defined-encounter-name target-name)
(find-defined-encounter-name source-name))] (find-defined-encounter-name source-name))]
@ -67,10 +67,10 @@
(not (contained-in? skill non-combat-starting-skills))) (not (contained-in? skill non-combat-starting-skills)))
(let [encounter (get defined-encounters encounter-name)] (let [encounter (get defined-encounters encounter-name)]
(cond (cond
(ignored-interaction-event? encounter parsed-line) (ignored-interaction-event? encounter event)
nil nil
(ignored-skill-event? encounter parsed-line) (ignored-skill-event? encounter event)
nil nil
; if either of these are defined, then their criteria MUST pass to ; if either of these are defined, then their criteria MUST pass to

View file

@ -7,7 +7,7 @@
(keyword event))) (keyword event)))
(defmethod handle-event :skill-damage-to-target (defmethod handle-event :skill-damage-to-target
[{:keys [source-name skill target-name damage damage-type absorbed resisted blocked crit? timestamp] :as parsed} data] [{:keys [source-name skill target-name damage damage-type absorbed resisted blocked crit? timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -23,7 +23,7 @@
data)) data))
(defmethod handle-event :skill-avoided-by-target (defmethod handle-event :skill-avoided-by-target
[{:keys [source-name target-name skill avoidance-method timestamp] :as parsed} data] [{:keys [source-name target-name skill avoidance-method timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -34,7 +34,7 @@
data)) data))
(defmethod handle-event :damage-reflected (defmethod handle-event :damage-reflected
[{:keys [source-name target-name damage damage-type timestamp] :as parsed} data] [{:keys [source-name target-name damage damage-type timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -47,7 +47,7 @@
data)) data))
(defmethod handle-event :melee-damage-to-target (defmethod handle-event :melee-damage-to-target
[{:keys [source-name target-name damage damage-type hit-type absorbed resisted blocked crit? timestamp] :as parsed} data] [{:keys [source-name target-name damage damage-type hit-type absorbed resisted blocked crit? timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -64,7 +64,7 @@
data)) data))
(defmethod handle-event :melee-avoided-by-target (defmethod handle-event :melee-avoided-by-target
[{:keys [source-name target-name avoidance-method timestamp] :as parsed} data] [{:keys [source-name target-name avoidance-method timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -75,11 +75,11 @@
data)) data))
(defmethod handle-event :skill-interrupted-by-target (defmethod handle-event :skill-interrupted-by-target
[{:keys [source-name target-name skill timestamp] :as parsed} data] [{:keys [source-name target-name skill timestamp] :as event} data]
data) data)
(defmethod handle-event :dot-damages-target (defmethod handle-event :dot-damages-target
[{:keys [source-name skill target-name damage damage-type absorbed resisted timestamp] :as parsed} data] [{:keys [source-name skill target-name damage damage-type absorbed resisted timestamp] :as event} data]
(analysis/process-source-to-target-damage (analysis/process-source-to-target-damage
source-name source-name
target-name target-name
@ -94,28 +94,28 @@
data)) data))
(defmethod handle-event :cast-begins (defmethod handle-event :cast-begins
[{:keys [source-name skill spell? timestamp] :as parsed} data] [{:keys [source-name skill spell? timestamp] :as event} data]
; don't think we really care about this ? ; don't think we really care about this ?
data) data)
(defmethod handle-event :skill-performed-on-target (defmethod handle-event :skill-performed-on-target
[{:keys [source-name target-name skill spell? extra timestamp] :as parsed} data] [{:keys [source-name target-name skill spell? extra timestamp] :as event} data]
(analysis/process-source-to-target-cast source-name target-name skill timestamp data)) (analysis/process-source-to-target-cast source-name target-name skill timestamp data))
(defmethod handle-event :cast (defmethod handle-event :cast
[{:keys [source-name skill spell? timestamp] :as parsed} data] [{:keys [source-name skill spell? timestamp] :as event} data]
(analysis/process-entity-cast source-name skill timestamp data)) (analysis/process-entity-cast source-name skill timestamp data))
(defmethod handle-event :skill-heals-target (defmethod handle-event :skill-heals-target
[{:keys [source-name skill crit? target-name amount timestamp] :as parsed} data] [{:keys [source-name skill crit? target-name amount timestamp] :as event} data]
data) data)
(defmethod handle-event :resource-gained (defmethod handle-event :resource-gained
[{:keys [target-name amount resource-type source-name skill timestamp] :as parsed} data] [{:keys [target-name amount resource-type source-name skill timestamp] :as event} data]
data) data)
(defmethod handle-event :resource-lost (defmethod handle-event :resource-lost
[{:keys [target-name amount resource-type source-name skill timestamp] :as parsed} data] [{:keys [target-name amount resource-type source-name skill timestamp] :as event} data]
(condp = resource-type (condp = resource-type
:health (analysis/process-source-to-target-damage :health (analysis/process-source-to-target-damage
source-name source-name
@ -130,32 +130,32 @@
data)) data))
(defmethod handle-event :special-gained (defmethod handle-event :special-gained
[{:keys [target-name special source timestamp] :as parsed} data] [{:keys [target-name special source timestamp] :as event} data]
data) data)
(defmethod handle-event :aura-gained (defmethod handle-event :aura-gained
[{:keys [target-name aura-name aura-type stacks timestamp] :as parsed} data] [{:keys [target-name aura-name aura-type stacks timestamp] :as event} data]
data) data)
(defmethod handle-event :aura-lost (defmethod handle-event :aura-lost
[{:keys [target-name aura-name faded? stacks timestamp] :as parsed} data] [{:keys [target-name aura-name faded? stacks timestamp] :as event} data]
data) data)
(defmethod handle-event :other-damage (defmethod handle-event :other-damage
[{:keys [target-name damage damage-type resisted absorbed source timestamp] :as parsed} data] [{:keys [target-name damage damage-type resisted absorbed source timestamp] :as event} data]
data) data)
(defmethod handle-event :death (defmethod handle-event :death
[{:keys [source-name timestamp] :as parsed} data] [{:keys [source-name timestamp] :as event} data]
(analysis/process-entity-death source-name timestamp data)) (analysis/process-entity-death source-name timestamp data))
(defmethod handle-event :ignored (defmethod handle-event :ignored
[{:keys [line] :as parsed} data] [{:keys [line] :as event} data]
#_(println "[WARN] *** IGNORED ***" line) #_(println "[WARN] *** IGNORED ***" line)
data) data)
(defmethod handle-event :default (defmethod handle-event :default
[{:keys [line] :as parsed} data] [{:keys [line] :as event} data]
(println "[WARN] *** UNRECOGNIZED ***" line) (println "[WARN] *** UNRECOGNIZED ***" line)
data) data)

View file

@ -790,3 +790,13 @@
:source-name %1)} :source-name %1)}
]) ])
(defn find-matcher
[^String line]
(->> regex-matchers
(filter #(re-matches (:regex %) line))
(first)))
(defn get-line-regex-matches
[^String line matcher]
(rest (re-matches (:regex matcher) line)))

View file

@ -8,7 +8,7 @@
[vwowrla.core.encounters.detection :refer [detect-encounter-end detect-encounter-triggered]] [vwowrla.core.encounters.detection :refer [detect-encounter-end detect-encounter-triggered]]
[vwowrla.core.encounters.analysis :refer [begin-encounter end-encounter]] [vwowrla.core.encounters.analysis :refer [begin-encounter end-encounter]]
[vwowrla.core.events.handlers :refer [handle-event]] [vwowrla.core.events.handlers :refer [handle-event]]
[vwowrla.core.events.matchers :refer [regex-matchers]]) [vwowrla.core.events.matchers :refer [find-matcher get-line-regex-matches]])
(:use (:use
vwowrla.core.schemas vwowrla.core.schemas
vwowrla.core.preparsing vwowrla.core.preparsing
@ -19,61 +19,59 @@
(not (nil? (:active-encounter data)))) (not (nil? (:active-encounter data))))
(defn- ->ignored-event (defn- ->ignored-event
[parsed-line] [event]
(assoc parsed-line (assoc event
:id :ignored :id :ignored
:logfmt :ignored)) :logfmt :ignored))
(defn ->unrecognized-event (defn ->unrecognized-event
[parsed-line] [event]
(assoc parsed-line (assoc event
:id :unknown :id :unknown
:logfmt :unknown :logfmt :unknown
:event :unknown)) :event :unknown))
(s/defn parse-line :- CombatEvent (s/defn parse-line :- CombatEvent
[^String line [line :- s/Str
options :- ParserOptions] options :- ParserOptions]
(let [[timestamp stripped-line] (split-log-timestamp-and-content line) (let [[timestamp stripped-line] (split-log-timestamp-and-content line)
sanitized-line (-> stripped-line sanitized-line (-> stripped-line
(undo-swstats-fixlogstring) (undo-swstats-fixlogstring)
(sanitize-entity-names)) (sanitize-entity-names))
line-metadata {:timestamp (parse-log-timestamp timestamp options) event-metadata {:timestamp (parse-log-timestamp timestamp options)
:line line}] :line line}]
(if-let [matcher (->> regex-matchers (if-let [matcher (find-matcher sanitized-line)]
(filter #(re-matches (:regex %) sanitized-line)) (let [matches (get-line-regex-matches sanitized-line matcher)
(first))] args-fn (or (:args matcher) (fn [& _]))
(let [regex-matches (rest (re-matches (:regex matcher) sanitized-line)) event (merge
args-fn (or (:args matcher) (fn [& _])) event-metadata
parsed-line (merge (select-keys matcher [:logfmt :event :id])
line-metadata (apply args-fn matches))]
(select-keys matcher [:logfmt :event :id]) (if (= :ignored (:event event))
(apply args-fn regex-matches))] (->ignored-event event)
(if (= :ignored (:event parsed-line)) (process-event event (:log-owner-char-name options))))
(->ignored-event parsed-line) (->unrecognized-event event-metadata))))
(process-parsed-line parsed-line (:log-owner-char-name options))))
(->unrecognized-event line-metadata))))
(s/defn handle-line (s/defn handle-line
[parsed-line :- CombatEvent [event :- CombatEvent
data :- RaidAnalysis] data :- RaidAnalysis]
(handle-event parsed-line data)) (handle-event event data))
(s/defn ^:private active-encounter-processing (s/defn ^:private active-encounter-processing
[parsed-line :- CombatEvent [event :- CombatEvent
data :- RaidAnalysis] data :- RaidAnalysis]
(let [data (handle-line parsed-line data)] (let [data (handle-line event data)]
(if-let [encounter-end (detect-encounter-end parsed-line data)] (if-let [encounter-end (detect-encounter-end event data)]
(end-encounter parsed-line encounter-end data) (end-encounter event encounter-end data)
data))) data)))
(s/defn ^:private out-of-encounter-processing (s/defn ^:private out-of-encounter-processing
[parsed-line :- CombatEvent [event :- CombatEvent
data :- RaidAnalysis] data :- RaidAnalysis]
(if-let [encounter-name (detect-encounter-triggered parsed-line data)] (if-let [encounter-name (detect-encounter-triggered event data)]
(->> data (->> data
(begin-encounter encounter-name parsed-line) (begin-encounter encounter-name event)
(handle-line parsed-line)) (handle-line event))
data)) data))
(s/defn ^:private parse-log* :- (s/maybe RaidAnalysis) (s/defn ^:private parse-log* :- (s/maybe RaidAnalysis)

View file

@ -1,6 +1,6 @@
(ns vwowrla.core.preparsing (ns vwowrla.core.preparsing
(:import (:import
(java.util Calendar Date GregorianCalendar TimeZone)) (java.util Calendar Date GregorianCalendar))
(:require (:require
[clojure.string :as string] [clojure.string :as string]
[clojure.java.io :as io] [clojure.java.io :as io]
@ -14,7 +14,7 @@
(def problem-entity-name-to-fixed-name (def problem-entity-name-to-fixed-name
(reduce (reduce
(fn [m problem-name] (fn [m problem-name]
(let [fixed-name (.replace problem-name "'s" "s")] (let [fixed-name (.replace ^String problem-name "'s" "s")]
(-> m (-> m
(assoc-in [:problem-to-fixed problem-name] fixed-name) (assoc-in [:problem-to-fixed problem-name] fixed-name)
(assoc-in [:fixed-to-problem fixed-name] problem-name)))) (assoc-in [:fixed-to-problem fixed-name] problem-name))))
@ -42,7 +42,7 @@
[line :- s/Str] [line :- s/Str]
(.replace ^String line " 's" "'s")) (.replace ^String line " 's" "'s"))
(s/defn parse-log-timestamp :- Date (s/defn parse-log-timestamp :- (s/maybe Date)
[timestamp :- s/Str [timestamp :- s/Str
options :- ParserOptions] options :- ParserOptions]
(if-let [matches (re-matches #"^(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{2}):(\d{2})\.(\d{3})$" timestamp)] (if-let [matches (re-matches #"^(\d{1,2})\/(\d{1,2}) (\d{1,2}):(\d{2}):(\d{2})\.(\d{3})$" timestamp)]
@ -58,11 +58,11 @@
[line :- s/Str] [line :- s/Str]
(string/split line #" " 2)) (string/split line #" " 2))
(s/defn process-parsed-line :- CombatEvent (s/defn process-event :- CombatEvent
[{:keys [source-name target-name source] :as parsed-line} :- CombatEvent [{:keys [source-name target-name source] :as event} :- CombatEvent
log-owner-char-name :- s/Str] log-owner-char-name :- s/Str]
(merge (merge
parsed-line event
(if source-name (if source-name
{:source-name (if (= "you" (string/lower-case source-name)) {:source-name (if (= "you" (string/lower-case source-name))
log-owner-char-name log-owner-char-name

View file

@ -6,11 +6,11 @@
vwowrla.core.parser)) vwowrla.core.parser))
(deftest barebones-line-parse-results (deftest barebones-line-parse-results
(let [parsed (parse-line "1/2 3:45:00.000 Test combat log line with 2 spaces in content part." (let [event (parse-line "1/2 3:45:00.000 Test combat log line with 2 spaces in content part."
{:log-owner-char-name "Blasticus" {:log-owner-char-name "Blasticus"
:year 2015 :year 2015
:timezone (TimeZone/getDefault) :timezone (TimeZone/getDefault)
:windows? false})] :windows? false})]
(is (and (map? parsed) (is (and (map? event)
(contains? parsed :timestamp) (contains? event :timestamp)
(contains? parsed :line))))) (contains? event :line)))))