diff --git a/module_index.json b/module_index.json index f3f4fb7..5f80c86 100755 --- a/module_index.json +++ b/module_index.json @@ -135,7 +135,7 @@ "version": "0.11", "author": "Starbeamrainbowlabs", "description": "Adds proper search functionality to Pepperminty Wiki using an inverted index to provide a full text search engine. If pages don't show up, then you might have hit a stop word. If not, try requesting the `invindex-rebuild` action to rebuild the inverted index from scratch.", - "lastupdate": 1576440066, + "lastupdate": 1576615079, "optional": false, "extra_data": [] }, @@ -189,6 +189,16 @@ "optional": false, "extra_data": [] }, + { + "id": "feature-watchlist", + "name": "User watchlists", + "version": "0.1", + "author": "Starbeamrainbowlabs", + "description": "Adds per-user watchlists. When a page on a user's watchlist is edited, a notification email is sent.", + "lastupdate": 1577024516, + "optional": false, + "extra_data": [] + }, { "id": "page-credits", "name": "Credits", diff --git a/modules/feature-watchlist.php b/modules/feature-watchlist.php new file mode 100644 index 0000000..62f7758 --- /dev/null +++ b/modules/feature-watchlist.php @@ -0,0 +1,121 @@ + "User watchlists", + "version" => "0.1", + "author" => "Starbeamrainbowlabs", + "description" => "Adds per-user watchlists. When a page on a user's watchlist is edited, a notification email is sent.", + "id" => "feature-watchlist", + "code" => function() { + /** + * @api {get} ?action=watchlist&foormat=format Get your watchlist + * @apiName Watchlist + * @apiGroup Settings + * @apiPermission User + * + * @apiParam {string} format The format to return the watchlist in. + * + * @apiError WatchlistsDisabled Watchlists are disabled because the watchlists_enable setting is set to false. + * @apiError NoEmailAddress The currently logged in user doesn't have an email address specified in their account. + */ + + /* + * ██ ██ █████ ████████ ██████ ██ ██ ██ ██ ███████ ████████ + * ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + * ██ █ ██ ███████ ██ ██ ███████ ██ ██ ███████ ██ + * ██ ███ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ + * ███ ███ ██ ██ ██ ██████ ██ ██ ███████ ██ ███████ ██ + */ + add_action("watchlist", function() { + global $settings, $env; + + if(!$settings->watchlists_enable) { + http_response_code(403); + exit(page_renderer::render_main("Watchlists disabled - $settings->sitename", "

Sorry, but watchlists are currently disabled on $settings->sitename. Contact your moderators to learn - their details are at the bottom of every page.

")); + } + + if(!$env->is_logged_in) { + http_response_code(401); + exit(page_renderer::render_main("Not logged in - $settings->sitename", "

Only logged in users can have watchlists. Try logging in.")); + } + + if(empty($env->user_data->emailAddress)) { + http_response_code(422); + exit(page_renderer::render_main("No email address specified -$settings->sitename", "

You are logged in, but have not specified an email address to send notifications to. Try specifying one in your user preferences and then coming back here.

")); + } + + $format = $_GET["format"] ?? "html"; + + $watchlist = []; + if(!empty($env->user_data->watchlist)) + $watchlist = $env->user_data->watchlist; + + $mime_type = "text/html"; + $content = ""; + switch ($format) { + case "html": + $content .= "

Watchlist

"; + if(!empty($watchlist)) { + $content .= ""; + $content .= "

You can also clear your entire list and start again.

"; + } + else { + $content .= "

You don't have any pages on your watchlist. Try visiting some pages and adding them to your watchlist and then coming back here.

"; + } + $content = page_renderer::render_main("Watchlist - $settings->sitename", $content); + break; + + case "text": + $mime_type = "text/plain"; + foreach($watchlist as $pagename) + $content .= "$pagename\n"; + break; + + case "json": + $mime_type = "application/json"; + $content = json_encode($watchlist); + break; + + default: + http_response_code(400); + header("content-type: text/plain"); + exit("Sorry, the format '$format' wasn't recognised. This action currently supports these formats: html, json, text"); + break; + } + + header("content-type: $mime_type"); + header("content-length: " . strlen($content)); + exit($content); + }); + + + /** + * @api {get} ?action=watchlist-edit&do={do_verb} Edit your watchlist + * @apiName WatchlistEdit + * @apiGroup Settings + * @apiPermission User + * + * TODO: Finish filling this out + * @apiParam {string} string The string to hash. + * @apiParam {boolean} raw Whether to return the hashed password as a raw string instead of as part of an HTML page. + * + * @apiError ParamNotFound The string parameter was not specified. + */ + + /* + * ███████ ██████ ██ ████████ + * ██ ██ ██ ██ ██ + * █████ ██ ██ ██ ██ + * ██ ██ ██ ██ ██ + * ███████ ██████ ██ ██ + */ + add_action("watchlist-edit", function () { + // TODO: Fill this in + }); + } +]); + +?> diff --git a/peppermint.guiconfig.json b/peppermint.guiconfig.json index 390c106..4dc154c 100644 --- a/peppermint.guiconfig.json +++ b/peppermint.guiconfig.json @@ -96,6 +96,7 @@ "new_password_length": { "type": "number", "description": "The length of newly-generated passwords. This is currently used in the user table when creating new accounts.", "default": 32}, "require_login_view": { "type": "checkbox", "description": "Whether to require that users login before they do anything else. Best used with the data_storage_dir option.", "default": false}, "data_storage_dir": { "type": "text", "description": "The directory in which to store all files, except the main index.php.", "default": "." }, + "watchlists_enable": { "type": "checkbox", "description": "Whether the watchlists feature should be enabled or not.", "default": true }, "delayed_indexing_time": { "type": "number", "description": "The amount of time, in seconds, that pages should be blocked from being indexed by search engines after their last edit. Aka delayed indexing.", "default": 0}, "nav_links": { "type": "nav", "description": "

An array of links and display text to display at the top of the site.
Format: \"Display Text\": \"Link\"

You can also use strings here and they will be printed as-is, except the following special strings:

", "default": [ "user-status",