aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
AgeCommit message (Collapse)Author
2020-05-01use log end timestamp instead of startDaniel
They are usually within minutes of each other, but this has two advantages: 1. The output is consistent with the filename (and probably the file creation date, if it has been preserved) 2. Due to 1., this means we can use the filename to get the timestamp faster than parsing the file.
2020-05-01fix timestamp handlingDaniel
As it turns out, the "local timestamp" as advertised by arcdps is a bit misleading, because the timestamp is still in UTC. The "local" refers to the fact that it can lag behind the server timestamp a bit (but usually they seem to be within +-1 of each other), not that the timestamp is in the local timezone. This makes date handling a bit harder for raidgrep, but thanks to chrono, not by much. The idea is that we simply deal with Utc pretty much everywhere, except at the user boundary. This means that 1. Input timestamps for -before and -after are converted to Utc right after input 2. When outputting, we convert to a local timestamp first This makes the output consistent with the filenames now (and the "wall time" that the player saw).
2020-04-29add more help text about the boss namesDaniel
Everybody calls bosses by different names (Soulless Horror vs Desmina, Super Kodan Brothers, ...), so it might be good to have a list ready in the help message. Other names can still be used, but those are the end-user documented ones now.
2020-04-29update evtclib to 0.2.0Daniel
2020-04-25add -include and -excludeDaniel
2020-04-25use free functions instead of Filter::newDaniel
Having a ::new on each of the filter types was a bit weird, especially because we returned Box<dyn ...> instead of Self (and clippy rightfully complained). With this patch, we now have a bunch of normal functions, and we don't show to the outside how a filter is actually implemented (or what struct is behind it).
2020-04-25only try regex if word doesn't start with -Daniel
Since our predicates start with -, this sounds like a good heuristic to prevent something like "raidgrep -- -player" from silently succeeding but not doing what the user had intended. In this case, we want the parse error to show and not treat "-player" as a regex.
2020-04-25cosmetic fixesDaniel
2020-04-25better CLI args/parser integrationDaniel
First, this commit adds a shortcut if only a single argument is given that can be parsed as a regex. This is to retain the old behaviour of "raidgrep NAME" just working, without needing to specify -player or anything. Secondly, this also re-wraps arguments with spaces (unless there's only one argument in total). This means that the following should work: raidgrep -- -player "Godric Gobbledygook" instead of either raidgrep -- '-player "Godric Gobbledygook"' raidgrep -- -player '"Godric Gobbledygook"' (notice the extra quotes).
2020-04-21remove unused importsDaniel
2020-04-21add predicate documentation to the help textDaniel
Sadly, structopt always displays this, despite the documentation stating that it should be hidden when the user uses -h (instead of --help). It seems like this is a bug in clap, which might get fixed with clap 3.0.
2020-04-21use readline/rustyline instead of stdin.read_lineDaniel
This gives us a history, nicer editing capabilities and the possibility to add completion in the future.
2020-04-21add a small replDaniel
2020-04-21better error outputsDaniel
2020-04-20hook up new expression parser to command line argsDaniel
This method is not perfect yet, because 1. The items are not documented as they were before 2. You need to separate the args with --, otherwise Clap tries to parse them as optional flags This should be fixed (especially the documentation part) before merging into master.
2020-04-17split off player filters and log filtersDaniel
As it turns out, we can easily re-use the existing Filter machinery to generalize over LogFilters (which operate on LogResults) and PlayerFilters (which operate on Players). The feature trait_aliases is not strictly needed but makes the function signatures a bit nicer and easier to read, and it reduces the chances of an error (e.g. by using Filter<&PartialEvtc, ...>).
2020-04-15new filter pipelineDaniel
This is the groundwork for introducing more complex filter queries like `find` has. Filters can be arbitrarily combined with and/or/not and support an "early filter" mode. So far, the filters have been translated pretty mechanically to match the current command line arguments, so now new syntax has been introduced. The NameFilter is not yet in its final version. The goal is to support something like PlayerAll/PlayerExists and have a PlayerFilter that works on single players instead of the complete log, but that might introduce some code duplication as we then need a PlayerFilterAnd, PlayerFilterOr, ... Some digging has to be done into whether we can reduce that duplication without devolving into madness or resorting to macros. Maybe some type-level generic hackery could be done? Maybe an enum instead of dynamic traits should be used, at least for the base functions?
2020-04-09replace match on bool with if/elseDaniel
2020-04-09use log crate instead of own debug! macroDaniel
This also does away with the scary unsafe{} blocks just to set/get the DEBUG flag.
2020-04-06implement guild display & filtering optionsDaniel
Filtering based on guilds is slow, as it will have to retrieve every guild name from the GW2 API, and it has to parse every log file instead of bailing early. Therefore, guilds are not searched by default, and have to be explicitely turned on with --guilds. In addition, this means that raidgrep will now need network access when --guilds is passed, which was not the case before.
2020-04-04add new bosses (wing 7 & strikes)Daniel
2020-04-04update dependenciesDaniel
2019-06-03[WIP] rewrite output logic as a pipelineDaniel
2019-05-31add option to filter based on bossDaniel
2019-05-24lazily parse log eventsDaniel
A lot of time is spent parsing the actual log events, especially when they are zipped, as they have to be decompressed first. This results in huge run-time hits, especially for files where we could determine very early if we actually need it. For example, player names are saved in the header, which can be examined very quickly. If we can determine at that stage that a log file will not appear in the result set, we don't need to parse all the log events. This patch relies on the partial parsing support of evtclib to do exactly that. It parses only the header with the player names, and only if there's a match, it will proceed to parse the events and do more filtering. In the future, we can extend this even more, for example we can also check the boss ID that way, since we can also access that in the header. On the downside, we now have the zip handling logic replicated in raidgrep, as we want a "common" interface to extract the actual data stream. But this logic could be pushed back to evtclib after polishing it a bit. There are some problems with Rust's borrow checking though, which is why it looks a bit convoluted.
2019-05-18add support for weekday filteringDaniel
2019-05-18add support for -l to only output the file nameDaniel
2019-05-18add support for -v to invert matchesDaniel
2019-02-16lint fixesDaniel
2019-02-16introduce CommaSeparatedListDaniel
This gives a common interface for command line flags which take multiple values, possibly with negation. This might come in useful if we add filtering by boss, e.g. "--boss !deimos" to ignore all deimos logs.
2019-02-16add support for .zevtc filesDaniel
2018-10-15clippyDaniel
2018-10-15add time based filteringDaniel
This accepts timestamps in the following formats: * Human-readable, like "15d", taken relative to the current time. * rfc3339-like "2018-03-14 13:13:00" More formats might be added in the future.
2018-10-15formattingDaniel
2018-10-15add "kill" as synonym for successDaniel
2018-10-15properly use encounter ID to get the nameDaniel
The previous method was nice because it "just worked" for most of the bosses, but with the introduction of W6 shenanigans (CA being a gadget, and Largos Twins being two bosses), the method was a bit unreliable. Now, the encounter ID that is saved by ArcDPS is used, and a predefined list of encounter names is consulted, which makes this work better for most bosses and allows us to change the name when appropriate (Nightmare Oratuss -> Siax)
2018-10-15use threadpool instead of par_iterDaniel
The way the parallel iterator splits the items, we get results from different bosses intermixed. The expected way to do it would be to search all logs related to a single boss first, before moving on, which is not what rayon did. Additionally, it forced us to collect the list of files into a vector first, before we could start the actual search. Using the scoped pool directly solves both of these problems, but the error handling suffered a bit, as we now use unwrap instead of returning a Result from the closure. But since we handle individual items, and might not want to stop just because a single item was faulty, this behaviour might be better.
2018-09-14add flag to enable debug outputDaniel
2018-09-14handle logs which do not have a boss agentDaniel
2018-09-10use unwrap! instead of if letDaniel
2018-09-10move filtering into own submoduleDaniel
2018-09-10add a flag to disable colored outputDaniel
2018-09-07add filtering by outcomeDaniel
2018-09-07more readability for SearchField checkingDaniel
2018-09-07more comments & formattingDaniel
2018-09-07better fight outcome detectionDaniel
2018-09-07add fight outcome to outputDaniel
2018-09-07parallelize log searchingDaniel
2018-09-07move output formatting to submoduleDaniel
2018-09-06initial commitDaniel