some minor cleanups, argument renaming for clarity, etc
This commit is contained in:
parent
2ab1aaffe0
commit
cee04ee347
|
@ -11,7 +11,7 @@
|
|||
vwowrla.core.utils))
|
||||
|
||||
(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)
|
||||
(= entity-name source-name))
|
||||
(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
|
||||
been specified to ignore interactions between for the purposes of detecting
|
||||
an encounter trigger"
|
||||
[encounter :- Encounter
|
||||
parsed-line :- CombatEvent]
|
||||
[encounter :- Encounter
|
||||
event :- CombatEvent]
|
||||
(->> (:entities encounter)
|
||||
(filter
|
||||
(fn [[entity-name entity-props]]
|
||||
(seq (:ignore-interactions-with entity-props))))
|
||||
(filter
|
||||
(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)
|
||||
(boolean)))
|
||||
|
||||
(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)
|
||||
(contained-in? skill ignore-skill-list)))
|
||||
|
||||
|
@ -42,15 +42,15 @@
|
|||
"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
|
||||
for the purposes of triggering an encounter"
|
||||
[encounter :- Encounter
|
||||
parsed-line :- CombatEvent]
|
||||
[encounter :- Encounter
|
||||
event :- CombatEvent]
|
||||
(->> (:entities encounter)
|
||||
(filter
|
||||
(fn [[entity-name entity-props]]
|
||||
(seq (:ignore-skills entity-props))))
|
||||
(filter
|
||||
(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)
|
||||
(boolean)))
|
||||
|
||||
|
@ -58,7 +58,7 @@
|
|||
"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
|
||||
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]
|
||||
(if-let [encounter-name (or (find-defined-encounter-name target-name)
|
||||
(find-defined-encounter-name source-name))]
|
||||
|
@ -67,10 +67,10 @@
|
|||
(not (contained-in? skill non-combat-starting-skills)))
|
||||
(let [encounter (get defined-encounters encounter-name)]
|
||||
(cond
|
||||
(ignored-interaction-event? encounter parsed-line)
|
||||
(ignored-interaction-event? encounter event)
|
||||
nil
|
||||
|
||||
(ignored-skill-event? encounter parsed-line)
|
||||
(ignored-skill-event? encounter event)
|
||||
nil
|
||||
|
||||
; if either of these are defined, then their criteria MUST pass to
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
(keyword event)))
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -23,7 +23,7 @@
|
|||
data))
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -34,7 +34,7 @@
|
|||
data))
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -47,7 +47,7 @@
|
|||
data))
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -64,7 +64,7 @@
|
|||
data))
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -75,11 +75,11 @@
|
|||
data))
|
||||
|
||||
(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)
|
||||
|
||||
(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
|
||||
source-name
|
||||
target-name
|
||||
|
@ -94,28 +94,28 @@
|
|||
data))
|
||||
|
||||
(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 ?
|
||||
data)
|
||||
|
||||
(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))
|
||||
|
||||
(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))
|
||||
|
||||
(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)
|
||||
|
||||
(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)
|
||||
|
||||
(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
|
||||
:health (analysis/process-source-to-target-damage
|
||||
source-name
|
||||
|
@ -130,32 +130,32 @@
|
|||
data))
|
||||
|
||||
(defmethod handle-event :special-gained
|
||||
[{:keys [target-name special source timestamp] :as parsed} data]
|
||||
[{:keys [target-name special source timestamp] :as event} data]
|
||||
data)
|
||||
|
||||
(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)
|
||||
|
||||
(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)
|
||||
|
||||
(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)
|
||||
|
||||
(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))
|
||||
|
||||
|
||||
(defmethod handle-event :ignored
|
||||
[{:keys [line] :as parsed} data]
|
||||
[{:keys [line] :as event} data]
|
||||
#_(println "[WARN] *** IGNORED ***" line)
|
||||
data)
|
||||
|
||||
(defmethod handle-event :default
|
||||
[{:keys [line] :as parsed} data]
|
||||
[{:keys [line] :as event} data]
|
||||
(println "[WARN] *** UNRECOGNIZED ***" line)
|
||||
data)
|
||||
|
|
|
@ -790,3 +790,13 @@
|
|||
: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)))
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
[vwowrla.core.encounters.detection :refer [detect-encounter-end detect-encounter-triggered]]
|
||||
[vwowrla.core.encounters.analysis :refer [begin-encounter end-encounter]]
|
||||
[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
|
||||
vwowrla.core.schemas
|
||||
vwowrla.core.preparsing
|
||||
|
@ -19,61 +19,59 @@
|
|||
(not (nil? (:active-encounter data))))
|
||||
|
||||
(defn- ->ignored-event
|
||||
[parsed-line]
|
||||
(assoc parsed-line
|
||||
[event]
|
||||
(assoc event
|
||||
:id :ignored
|
||||
:logfmt :ignored))
|
||||
|
||||
(defn ->unrecognized-event
|
||||
[parsed-line]
|
||||
(assoc parsed-line
|
||||
[event]
|
||||
(assoc event
|
||||
:id :unknown
|
||||
:logfmt :unknown
|
||||
:event :unknown))
|
||||
|
||||
(s/defn parse-line :- CombatEvent
|
||||
[^String line
|
||||
[line :- s/Str
|
||||
options :- ParserOptions]
|
||||
(let [[timestamp stripped-line] (split-log-timestamp-and-content line)
|
||||
sanitized-line (-> stripped-line
|
||||
(undo-swstats-fixlogstring)
|
||||
(sanitize-entity-names))
|
||||
line-metadata {:timestamp (parse-log-timestamp timestamp options)
|
||||
event-metadata {:timestamp (parse-log-timestamp timestamp options)
|
||||
:line line}]
|
||||
(if-let [matcher (->> regex-matchers
|
||||
(filter #(re-matches (:regex %) sanitized-line))
|
||||
(first))]
|
||||
(let [regex-matches (rest (re-matches (:regex matcher) sanitized-line))
|
||||
args-fn (or (:args matcher) (fn [& _]))
|
||||
parsed-line (merge
|
||||
line-metadata
|
||||
(select-keys matcher [:logfmt :event :id])
|
||||
(apply args-fn regex-matches))]
|
||||
(if (= :ignored (:event parsed-line))
|
||||
(->ignored-event parsed-line)
|
||||
(process-parsed-line parsed-line (:log-owner-char-name options))))
|
||||
(->unrecognized-event line-metadata))))
|
||||
(if-let [matcher (find-matcher sanitized-line)]
|
||||
(let [matches (get-line-regex-matches sanitized-line matcher)
|
||||
args-fn (or (:args matcher) (fn [& _]))
|
||||
event (merge
|
||||
event-metadata
|
||||
(select-keys matcher [:logfmt :event :id])
|
||||
(apply args-fn matches))]
|
||||
(if (= :ignored (:event event))
|
||||
(->ignored-event event)
|
||||
(process-event event (:log-owner-char-name options))))
|
||||
(->unrecognized-event event-metadata))))
|
||||
|
||||
(s/defn handle-line
|
||||
[parsed-line :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(handle-event parsed-line data))
|
||||
[event :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(handle-event event data))
|
||||
|
||||
(s/defn ^:private active-encounter-processing
|
||||
[parsed-line :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(let [data (handle-line parsed-line data)]
|
||||
(if-let [encounter-end (detect-encounter-end parsed-line data)]
|
||||
(end-encounter parsed-line encounter-end data)
|
||||
[event :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(let [data (handle-line event data)]
|
||||
(if-let [encounter-end (detect-encounter-end event data)]
|
||||
(end-encounter event encounter-end data)
|
||||
data)))
|
||||
|
||||
(s/defn ^:private out-of-encounter-processing
|
||||
[parsed-line :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(if-let [encounter-name (detect-encounter-triggered parsed-line data)]
|
||||
[event :- CombatEvent
|
||||
data :- RaidAnalysis]
|
||||
(if-let [encounter-name (detect-encounter-triggered event data)]
|
||||
(->> data
|
||||
(begin-encounter encounter-name parsed-line)
|
||||
(handle-line parsed-line))
|
||||
(begin-encounter encounter-name event)
|
||||
(handle-line event))
|
||||
data))
|
||||
|
||||
(s/defn ^:private parse-log* :- (s/maybe RaidAnalysis)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
(ns vwowrla.core.preparsing
|
||||
(:import
|
||||
(java.util Calendar Date GregorianCalendar TimeZone))
|
||||
(java.util Calendar Date GregorianCalendar))
|
||||
(:require
|
||||
[clojure.string :as string]
|
||||
[clojure.java.io :as io]
|
||||
|
@ -14,7 +14,7 @@
|
|||
(def problem-entity-name-to-fixed-name
|
||||
(reduce
|
||||
(fn [m problem-name]
|
||||
(let [fixed-name (.replace problem-name "'s" "s")]
|
||||
(let [fixed-name (.replace ^String problem-name "'s" "s")]
|
||||
(-> m
|
||||
(assoc-in [:problem-to-fixed problem-name] fixed-name)
|
||||
(assoc-in [:fixed-to-problem fixed-name] problem-name))))
|
||||
|
@ -42,7 +42,7 @@
|
|||
[line :- s/Str]
|
||||
(.replace ^String line " 's" "'s"))
|
||||
|
||||
(s/defn parse-log-timestamp :- Date
|
||||
(s/defn parse-log-timestamp :- (s/maybe Date)
|
||||
[timestamp :- s/Str
|
||||
options :- ParserOptions]
|
||||
(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]
|
||||
(string/split line #" " 2))
|
||||
|
||||
(s/defn process-parsed-line :- CombatEvent
|
||||
[{:keys [source-name target-name source] :as parsed-line} :- CombatEvent
|
||||
(s/defn process-event :- CombatEvent
|
||||
[{:keys [source-name target-name source] :as event} :- CombatEvent
|
||||
log-owner-char-name :- s/Str]
|
||||
(merge
|
||||
parsed-line
|
||||
event
|
||||
(if source-name
|
||||
{:source-name (if (= "you" (string/lower-case source-name))
|
||||
log-owner-char-name
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
vwowrla.core.parser))
|
||||
|
||||
(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."
|
||||
{:log-owner-char-name "Blasticus"
|
||||
:year 2015
|
||||
:timezone (TimeZone/getDefault)
|
||||
:windows? false})]
|
||||
(is (and (map? parsed)
|
||||
(contains? parsed :timestamp)
|
||||
(contains? parsed :line)))))
|
||||
(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"
|
||||
:year 2015
|
||||
:timezone (TimeZone/getDefault)
|
||||
:windows? false})]
|
||||
(is (and (map? event)
|
||||
(contains? event :timestamp)
|
||||
(contains? event :line)))))
|
||||
|
|
Reference in a new issue