about summary refs log tree commit diff stats
path: root/lib/Octans/Puzzle.rakumod
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Octans/Puzzle.rakumod')
-rw-r--r--lib/Octans/Puzzle.rakumod78
1 files changed, 47 insertions, 31 deletions
diff --git a/lib/Octans/Puzzle.rakumod b/lib/Octans/Puzzle.rakumod
index a35c409..96a4870 100644
--- a/lib/Octans/Puzzle.rakumod
+++ b/lib/Octans/Puzzle.rakumod
@@ -4,7 +4,7 @@ use WWW;
 
 # get-puzzle returns the @puzzle along with it's @gray-squares.
 sub get-puzzle (
-    Str $url,
+    Str $path,
 
     # @puzzle will hold the puzzle grid.
     @puzzle,
@@ -13,42 +13,58 @@ sub get-puzzle (
     # marks them with an asterisk ("*") after the character.
     @gray-squares
 ) is export {
-    # $toot_url will hold the url that we'll call to get the toot data.
-    my Str $toot_url;
-
-    # User can pass 2 types of links, either it will be the one when they
-    # view it from their local instance or the one they get from Algot's
-    # profile. We set $toot_url from it.
-    if $url.match("web/statuses") -> $match {
-        $toot_url = $match.replace-with("api/v1/statuses");
+    # @raw_puzzle will hold the puzzle before parsing.
+    my @raw-puzzle;
+
+    # Read the puzzle from file if it exists.
+    if $path.IO.f {
+        @raw-puzzle = $path.IO.lines.words;
     } else {
-        $toot_url = "https://mastodon.art/api/v1/statuses/" ~ $url.split("/")[*-1];
+        # $url will hold the url that we'll call to get the toot data.
+        my Str $url;
+
+        # User can pass 2 types of links, either it will be the one
+        # when they view it from their local instance or the one they
+        # get from Algot's profile. We set $url from it.
+        if $path.match("web/statuses") -> $match {
+            $url = $match.replace-with("api/v1/statuses");
+        } else {
+            $url = "https://mastodon.art/api/v1/statuses/" ~ $path.split("/")[*-1];
+        }
+
+        # jget just get's the url & decodes the json. We access the
+        # description field of 1st media attachment.
+        if (jget($url)<media_attachments>[0]<description> ~~
+
+            # This regex gets the puzzle in $match.
+            / [[(\w [\*]?) \s*] ** 4] ** 4 $/) -> $match {
+
+            @raw-puzzle = $match[0];
+        }
     }
+    parse-puzzle(@raw-puzzle, @puzzle, @gray-squares);
+}
 
+# parse-puzzle parses the puzzle from @raw-puzzle. It's assumed to be
+# a 4x4 grid.
+sub parse-puzzle (
+    @raw-puzzle, @puzzle, @gray-squares
+) is export {
     # @gray-squares should be empty.
     @gray-squares = ();
 
-    # jget just get's the url & decodes the json. We access the
-    # description field of 1st media attachment.
-    if (jget($toot_url)<media_attachments>[0]<description> ~~
-
-        # This regex gets the puzzle in $match.
-        / [[(\w [\*]?) \s*] ** 4] ** 4 $/) -> $match {
-
-        # We have each character of the puzzle stored in $match. It's
-        # assumed that it'll be a 4x4 grid.
-        for 0 .. 3 -> $y {
-            for 0 .. 3 -> $x {
-                with $match[0][($y * 4) + $x].Str.lc -> $char {
-
-                    # If it ends with an asterisk then we push the
-                    # position to @gray-squares.
-                    if $char.ends-with("*") {
-                        @puzzle[$y][$x] = $char.comb[0];
-                        push @gray-squares, [$y, $x];
-                    } else {
-                        @puzzle[$y][$x] = $char;
-                    }
+    # We have each character of the puzzle stored in @raw-puzzle.
+    for 0 .. 3 -> $y {
+        for 0 .. 3 -> $x {
+            with @raw-puzzle[($y * 4) + $x].Str.lc -> $char {
+
+                # If it ends with an asterisk then we push the
+                # position to @gray-squares.
+                if $char.ends-with("*") {
+                    @puzzle[$y][$x] = $char.comb[0];
+                    push @gray-squares, [$y, $x];
+                } else {
+                    @puzzle[$y][$x] = $char;
                 }
             }
         }