summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhil Burton <philbeansburton@gmail.com>2015-12-09 14:01:49 +0000
committerPhil Burton <philbeansburton@gmail.com>2015-12-09 14:01:49 +0000
commita787e9fdd23def5a0b0502f90c04027e2bdb6f39 (patch)
tree83985744832f1fa8a5d6a02d924c0a840c3102ff
parenta1a294d5ac75f74e615134faa76841e660cf823f (diff)
parent83102b75ce9876cf247814f857ee44483b5a19e6 (diff)
Merge branch 'refactor' into 'master'
Refactor Refactor everything into functions so we can easily test/maintain/improve individual components of this program. Add lots of doc-blocking to the functions for extra information. Unless there are any complaints I will merge this fairly quickly. See merge request !3
-rw-r--r--config.ini.example1
-rw-r--r--search.php317
2 files changed, 227 insertions, 91 deletions
diff --git a/config.ini.example b/config.ini.example
index 4e77b94..2f4e8aa 100644
--- a/config.ini.example
+++ b/config.ini.example
@@ -1,3 +1,4 @@
url = http://www.blaupload.co.uk
password = password (not required)
command = blaup
+pagesize = pagesize (not required [default will be 3])
diff --git a/search.php b/search.php
index c3e2d6d..04e12f4 100644
--- a/search.php
+++ b/search.php
@@ -1,9 +1,21 @@
<?php
- $version = 1.2;
-
+/**
+ * Load and parse the config file, setting any defaults here if non-required
+ * fields are not set
+ *
+ * @return string[]
+ * @author Phil Burton <phil@pgburton.com>
+ * @throws Exception when file is not readable
+ * @throws Exception when ini file fails to parse
+ * @throws Exception when url not found in ini file
+ * @throws Exception when command not found in ini file
+ * @throws Exception when pagesize is set incorrectly
+ */
+function getConfig()
+{
$config = false;
-try {
+
if (!is_readable("config.ini")) {
throw new Exception('File config.ini does not exist');
}
@@ -16,119 +28,242 @@ try {
if (!isset($config["command"])) {
throw new Exception('`command` not found in ini file');
}
+
+ // Set default page size if it's not in the config
+ if (!isset($config["pagesize"])) {
+ $config["pagesize"] = 3;
+ } elseif (!is_int((int)$config["pagesize"]) || $config["pagesize"] < 1) {
+ throw new Exception('Page size ' . $config["pagesize"] . ' not valid in config');
+ }
// hash the password
if (isset($config['password'])) {
- $hash = hash("sha256", $config['password']);
+ $config['hash'] = hash("sha256", $config['password']);
}
- $curl = curl_init($config["url"]. "?format=json");
- if (isset($hash)) {
- curl_setopt($curl, CURLOPT_HTTPHEADER, array("Cookie: password=$hash"));
+ return $config;
+}
+
+/**
+ * Use curl to find get the json file for a url
+ * Using the sha256 hashed password if it's been set in the config
+ *
+ * @param string[] $config
+ * @return StdClass[]
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function getJsonFromUrl($config)
+{
+ $curl = curl_init($config["url"] . "?format=json");
+ if (isset($config["hash"])) {
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array("Cookie: password=" . $config["hash"]));
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$output = json_decode(curl_exec($curl));
curl_close($curl);
- $search = read_stdin();
-
- if (empty($search)) {
- throw new Exception("Please enter a search term");
+ if (!isset($output)) {
+ throw new Exception(
+ "Could not retrive JSON from http server `"
+ . $config["url"]
+ . "?format=json` using password="
+ . (isset($config["hash"]) ? "true" : "false")
+ );
}
+ return $output;
+}
- $args = explode(" ", $search);
- $page = 1;
- $out = [];
- if ($args[0] == "-v" || $args[0] == "--version") {
- $out[] = "blaupload-search v" . $version;
- } elseif ($args[0] == "-h" || $args[0] == "--help") {
- $help = "Usage: !" . $config["command"] . " [query] #[page] | ";
- $help .= "e.g: !" . $config["command"] . " intense | ";
- $help .= "!" . $config["command"] . " intense marcus | ";
- $help .= "!" . $config["command"] . " intense marcus #2 (returns the second page of results)";
- $out[] = $help;
+/**
+ * Return the help text
+ *
+ * @param StdClass[] $config
+ * @return string
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function getHelp($config)
+{
+ return "Usage: !" . $config["command"] . " [query] #[page] | "
+ . "e.g: !" . $config["command"] . " intense | "
+ . "!" . $config["command"] . " intense marcus | "
+ . "!" . $config["command"] . " intense marcus #2 (returns the second page of results)";
+}
+
+/**
+ * Get the version string
+ *
+ * @param stdClass[] $config
+ * @return string
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function getVersion($config)
+{
+ return $config["command"] . " v" . "2.0";
+}
+
+/**
+ * Output the given string, adding a new line at the end
+ * If pieces is an array, use the glue to implode and output a single string
+ *
+ * EXIT
+ *
+ * @param string|string[] $pieces
+ * @param string $glue
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function output($pieces, $glue = " - ")
+{
+ if (!is_array($pieces)) {
+ echo $pieces . "\n";
} else {
+ echo implode($glue, $pieces) . "\n";
+ }
- // Check to see if user specified pagination
- $pages = array_filter($args, function($elem) {
- if (strpos($elem, "#") === 0) {
- return true;
- }
- return false;
- });
- // reset the indexes after the array filter
- $pages = array_merge($pages);
+ exit;
+}
- if (count($pages) > 1) {
- throw new Exception("Too many page choices. Enter only one `#<page>`");
- }
+/**
+ * Read stdin and return as a string
+ *
+ * @return string
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function read_stdin()
+{
+ $fr = fopen("php://stdin", "r");
+ $input = fgets($fr, 128);
+ $input = rtrim($input);
+ fclose($fr);
+ return $input;
+}
+
+/**
+ * Get the start and end index positions for the required page and
+ * page size
+ *
+ * @param int $page
+ * @param int $pagesize
+ * @return int[]
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function getPaginationBounds($page, $pagesize)
+{
+ return [
+ "start" => ($page - 1) * $pagesize,
+ "end" => (($page - 1) * $pagesize) + ($pagesize - 1)
+ ];
+}
+
+/**
+ * Loop through the stdin and parse the arguments given
+ * If we hit a "special" argument then run the specific code and exit
+ * Otherwise we set the page and search terms and return them as an array
+ *
+ * @param $config
+ * @return mixed[]
+ * @author Phil Burton <phil@pgburton.com>
+ */
+function getFormattedArguments($config)
+{
+ $args = explode(" ", read_stdin());
- if (!empty($pages)) {
- // Set the page
- $page = substr($pages[0], 1);
+ if (!isset($args) || empty($args)) {
+ throw new Exception("No arguments found");
+ }
+ // Loop the raw arguments and create our formated argument array
+ $formatArgs = [];
+ $formatArgs["search"] = [];
+ foreach ($args as $arg) {
+ // Switch to check for special arguments
+ // output should exit but incase it errors we double break
+ switch ($arg) {
+ case "--version":
+ case "-v": // Flow through
+ output(getVersion($config));
+ break 2;
+ case "--help":
+ case "-h": // Flow through
+ output(getHelp($config));
+ break 2;
}
- if (!is_int((int)$page) || $page <= 0) {
- throw new Exception("Page `" . $page . "` is not valid");
+
+ // Check to see if we have a page specified
+ if (strpos($arg, "#") === 0) {
+ $formatArgs["page"] = substr($arg, 1);
+ continue;
}
+ // If we reach here, then the argument is a search term
+ $formatArgs["search"][] = $arg;
+ }
- // remove the pagination from the search args
- $pos = array_search("#" . $page, $args);
- if ($pos) {
- $args[$pos] = null;
- }
+ // If we reach this point we must have at least one search term
+ if (empty($formatArgs["search"])) {
+ throw new Exception("Please Enter a search term");
+ }
- // Really slow search
- $results = [];
- foreach ($output as $upload) {
- $match = false;
- foreach ($args as $arg) {
- if (!is_null($arg) && stripos($upload->filename, $arg) === false) {
- $match = false;
- break;
- }
- $match = true;
- }
- if ($match) {
- $results[] = $config["url"] . "/" . rawurlencode($upload->filename);
+ if (!isset($formatArgs["page"])) {
+ $formatArgs["page"] = 1;
+ } elseif (!is_int((int)$formatArgs["page"]) || $formatArgs["page"] < 1) {
+ throw new Exception("Page number `" . $formatArgs["page"] . "` is not valid");
+ }
+
+ return $formatArgs;
+}
+
+/*********************************
+ * ENTRY POINT FOR FUNCTION HERE *
+ *********************************/
+try {
+ $config = getConfig();
+ $content = getJsonFromUrl($config);
+ $arguments = getFormattedArguments($config);
+
+ // parse the arguments
+ $page = $arguments["page"];
+
+ $out = [];
+
+ // Really slow search
+ $results = [];
+ foreach ($content as $upload) {
+ $match = false;
+ foreach ($arguments["search"] as $arg) {
+ if (!is_null($arg) && stripos($upload->filename, $arg) === false) {
+ $match = false;
+ break;
}
+ $match = true;
+ }
+ if ($match) {
+ $results[] = $config["url"] . "/" . rawurlencode($upload->filename);
}
+ }
- // Return results
- if (empty($results)) {
- echo "No results found\n";
- } else {
- $count = count($results);
- $i = 0;
-
- $start = ($page-1)*3;
- $end = $start+2;
- if ($start > ($count-1)) {
- throw new Exception("No results for this page");
- }
- foreach($results as $result) {
- if ($i < $start || $i > $end) {
- $i++;
- continue;
- }
- $out[] = $i+1 . ": " . $result;
- $i++;
- }
- if ($count > 3) {
- $out[] = "results (" . $count . ")";
- }
+ if (empty($results)) {
+ output("No results found");
+ }
+
+ $count = count($results);
+ $i = 0;
+ $bounds = getPaginationBounds($page, $config["pagesize"]);
+
+ if ($bounds["start"] > ($count - 1)) {
+ throw new Exception("No results for this page");
+ }
+
+ foreach ($results as $result) {
+ if ($i < $bounds["start"] || $i > $bounds["end"]) {
+ $i++;
+ continue;
}
+ $out[] = $i + 1 . ": " . $result;
+ $i++;
}
- echo implode(" - ", $out) . "\n";
+ if ($count > 3) {
+ $out[] = "results (" . $count . ")";
+ }
-} catch (Exception $e) {
- echo $e->getMessage() . "\n";die();
-}
+ output($out, " - ");
-function read_stdin()
-{
- $fr=fopen("php://stdin","r"); // open our file pointer to read from stdin
- $input = fgets($fr,128); // read a maximum of 128 characters
- $input = rtrim($input); // trim any trailing spaces.
- fclose ($fr); // close the file handle
- return $input; // return the text entered
+} catch (Exception $e) {
+ output($e->getMessage());
}