about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lib/Lacerta/CLI.rakumod102
1 files changed, 51 insertions, 51 deletions
diff --git a/lib/Lacerta/CLI.rakumod b/lib/Lacerta/CLI.rakumod
index 3ce42b0..cc74879 100644
--- a/lib/Lacerta/CLI.rakumod
+++ b/lib/Lacerta/CLI.rakumod
@@ -2,88 +2,88 @@ use Terminal::Spinners;
 use Text::Table::Simple;
 
 #| parses WhatsApp export
-unit sub MAIN (
+multi sub MAIN (
     Str $input where *.IO.f = "input", #= input log file to parse
     Str $profile-name = "Andinus", #= your WhatsApp profile name
-);
+) is export {
+    #| Parses the WhatsApp logs.
+    grammar WhatsApp {
+        token TOP { <Text> || <Notice> }
 
-#| Parses the WhatsApp logs.
-grammar WhatsApp {
-    token TOP { <Text> || <Notice> }
+        token Notice { <date> ', ' <time> ' - ' <message> }
+        token Text { <date> ', ' <time> ' - ' <name> ': ' <message> }
 
-    token Notice { <date> ', ' <time> ' - ' <message> }
-    token Text { <date> ', ' <time> ' - ' <name> ': ' <message> }
-
-    token date { (\d+) ** 3 % '/' }
-    token time { (\d+) ** 2 % ':' }
-    token name { [[\w|\s]+ | '+' \d+ [\d+|\s]+] }
-    token number { '+' \d+ [\d+|\s]+ }
-    token message { .* }
-}
+        token date { (\d+) ** 3 % '/' }
+        token time { (\d+) ** 2 % ':' }
+        token name { [[\w|\s]+ | '+' \d+ [\d+|\s]+] }
+        token number { '+' \d+ [\d+|\s]+ }
+        token message { .* }
+    }
 
-my WhatsApp @logs;
+    my WhatsApp @logs;
 
-{
+    my Instant $timed = now;
     Spinner.new(:type<bounce2>).await: Promise.start: {
         @logs = $input.IO.lines.race.map({WhatsApp.parse($_)}).grep(so *);
-    }
-    put "Parsed {@logs.elems} logs in " ~ (now - ENTER now) ~ "s";
-}
+    };
+    put "Parsed {@logs.elems} logs in " ~ (now - $timed) ~ "s";
 
-{
     my List @data;
     my List @given-data;
     my List @most-spoken-data;
     my Int $no-of-spoken = 8;
 
+    $timed = now;
     Spinner.new(:type<bounce>).await: Promise.start: {
         my Promise @promises;
         for @logs.grep(*<Text>).map(*<Text>).map(*<name>.Str).unique -> $name {
+            # Messages that weren't sent are logged under "ERROR" name.
             next if $name eq "ERROR";
+
+            # Promise for each names.
             push @promises, start with @logs.grep(*<Text>).map(*<Text>).grep(*<name> eq $name) {
-                @data.push(
-                    (
-                        $name,
-                        .elems,
-                        .map(*<message>.words).sum,
-                        .grep(*<message> eq ($name eq $profile-name
-                                             ?? "You deleted this message"
-                                             !! "This message was deleted")).elems,
-                        .grep(*<message> eq "<Media omitted>").elems,
-                        .map(*<time>[0][0].Int).Bag.max(*.values).key,
-                        @logs.grep(*<Notice>).grep(
-                            *<Notice><message>
-                            eq ($name eq $profile-name ?? "You left" !! "$name left")
-                        ).elems,
-                    )
+                push @data,
+                (
+                    $name,
+                    .elems,
+                    .map(*<message>.words).sum,
+                    .grep(*<message> eq ($name eq $profile-name
+                                         ?? "You deleted this message" !! "This message was deleted")).elems,
+                    .grep(*<message> eq "<Media omitted>").elems,
+                    .map(*<time>[0][0].Int).Bag.max(*.values).key,
+                    @logs.grep(*<Notice>).grep(*<Notice><message>
+                                               eq ($name eq $profile-name ?? "You left" !! "$name left")).elems,
                 );
                 with .map(*<message>).map(*.lc).cache {
-                    @given-data.push(
-                        (
-                            $name,
-                            .grep(*.contains: "fuck").elems,
-                        )
+                    push @given-data,
+                    (
+                        $name,
+                        .grep(*.contains: "fuck").elems,
                     );
-                    @most-spoken-data.push(
-                        (
-                            $name,
-                            .grep(* ne "<media omitted>")
-                             .grep(* ne ($name eq $profile-name
-                                         ?? "you deleted this message"
-                                         !! "this message was deleted")
-                                  ).map(*.words).Bag.grep(*.key.chars >= 4)
-                             .sort(*.values).reverse.map({"{$_.key} ({$_.value})"}).head($no-of-spoken).Slip,
-                        )
+
+                    push @most-spoken-data,
+                    (
+                        $name,
+                        .grep(* ne "<media omitted>")
+                         .grep(* ne ($name eq $profile-name
+                                     ?? "you deleted this message"
+                                     !! "this message was deleted")).map(*.words).Bag
+                         .grep(*.key.chars >= 4).sort(*.values).reverse
+                         .map({"{$_.key} ({$_.value})"}).head($no-of-spoken).Slip,
                     );
                 }
             }
         }
         await @promises;
     }
-    put "Generated data in " ~ (now - ENTER now) ~ "s" ~ "\n";
+    put "Generated data in " ~ (now - $timed) ~ "s" ~ "\n";
 
     my List %options = headers => (corner_marker => "*", bottom_border => "-");
     .say for lol2table(<Name Messages Words Deleted Media ActiveHour Left>, @data, |%options);
     .say for lol2table(<Name FucksGiven>, @given-data, |%options);
     .say for lol2table((|<Name MostSpoken-#1>, |("#" X~ (2..$no-of-spoken))), @most-spoken-data, |%options);
 }
+
+multi sub MAIN(
+    Bool :$version #= print version
+) is export { put "Lacerta v" ~ $?DISTRIBUTION.meta<version>; }