From cee04ee3471f09ddda44218e65230054946415c0 Mon Sep 17 00:00:00 2001 From: gered Date: Sun, 28 Feb 2016 15:31:26 -0500 Subject: [PATCH] some minor cleanups, argument renaming for clarity, etc --- .../src/vwowrla/core/encounters/detection.clj | 22 +++---- .../src/vwowrla/core/events/handlers.clj | 40 ++++++------ .../src/vwowrla/core/events/matchers.clj | 10 +++ vwowrla.core/src/vwowrla/core/parser.clj | 64 +++++++++---------- vwowrla.core/src/vwowrla/core/preparsing.clj | 12 ++-- .../test/vwowrla/core/parser_test.clj | 16 ++--- 6 files changed, 86 insertions(+), 78 deletions(-) diff --git a/vwowrla.core/src/vwowrla/core/encounters/detection.clj b/vwowrla.core/src/vwowrla/core/encounters/detection.clj index 9cc2987..037d1cf 100644 --- a/vwowrla.core/src/vwowrla/core/encounters/detection.clj +++ b/vwowrla.core/src/vwowrla/core/encounters/detection.clj @@ -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 diff --git a/vwowrla.core/src/vwowrla/core/events/handlers.clj b/vwowrla.core/src/vwowrla/core/events/handlers.clj index b134c46..d312230 100644 --- a/vwowrla.core/src/vwowrla/core/events/handlers.clj +++ b/vwowrla.core/src/vwowrla/core/events/handlers.clj @@ -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) diff --git a/vwowrla.core/src/vwowrla/core/events/matchers.clj b/vwowrla.core/src/vwowrla/core/events/matchers.clj index 8ff3d01..75fc4fd 100644 --- a/vwowrla.core/src/vwowrla/core/events/matchers.clj +++ b/vwowrla.core/src/vwowrla/core/events/matchers.clj @@ -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))) diff --git a/vwowrla.core/src/vwowrla/core/parser.clj b/vwowrla.core/src/vwowrla/core/parser.clj index 7e70670..df7e14c 100644 --- a/vwowrla.core/src/vwowrla/core/parser.clj +++ b/vwowrla.core/src/vwowrla/core/parser.clj @@ -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) diff --git a/vwowrla.core/src/vwowrla/core/preparsing.clj b/vwowrla.core/src/vwowrla/core/preparsing.clj index 6112f46..116c4c9 100644 --- a/vwowrla.core/src/vwowrla/core/preparsing.clj +++ b/vwowrla.core/src/vwowrla/core/preparsing.clj @@ -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 diff --git a/vwowrla.core/test/vwowrla/core/parser_test.clj b/vwowrla.core/test/vwowrla/core/parser_test.clj index d3ca894..1aa1cdd 100644 --- a/vwowrla.core/test/vwowrla/core/parser_test.clj +++ b/vwowrla.core/test/vwowrla/core/parser_test.clj @@ -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)))))