"User watchlists", "version" => "0.1.4", "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 NotLoggedIn You aren't logged in, so you can't edit your watchlist (only logged in users have a watchlist). * @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); header("x-problem: watchlists-disabled"); 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); header("x-problem: not-logged-in"); 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); header("x-problem: no-email-address-in-user-preferences"); 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 .= "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}[&page={pagename}][&returnto=url] Edit your watchlist * @apiName WatchlistEdit * @apiGroup Settings * @apiPermission User * * @apiParam {string} pagename The name of the page to operate on. * @apiParam {string} do The thing to do. Supported verbs: add, remove, clear. The first 2 require the page GET parameter to be specified, but the clear verb doesn't (as it clears the entire list). * @apiParam {string} returnto Optional. Specifies a URL to redirect to (with the http status code 302) upon success. * * @apiError WatchlistsDisabled Watchlists are disabled because the watchlists_enable setting is set to false. * @apiError NotLoggedIn You aren't logged in, so you can't edit your watchlist (only logged in users have a watchlist). * @apiError NoEmailAddress The currently logged in user doesn't have an email address specified in their account. * @apiError DoVerbNotRecognised The specified do verb was not recognised. Supported verbs: add, remove, clear (a canonical list is returned with this error). * * @apiError PageNotFoundOnWiki The page name specified was not found on the wiki, so it can't be watched. * @apiError PageNotFoundOnWatchlist The page name was not found in your watchlist. */ /* * ███████ ██████ ██ ████████ * ██ ██ ██ ██ ██ * █████ ██ ██ ██ ██ * ██ ██ ██ ██ ██ * ███████ ██████ ██ ██ */ add_action("watchlist-edit", function () { global $settings, $env, $pageindex; // The thing we should do. $do = slugify($_GET["do"] ?? "null"); // The location we should redirect to after doing it successfully, if anywhere $returnto = empty($_GET["returnto"]) ? null : $_GET["returnto"]; if(!$settings->watchlists_enable) { http_response_code(403); header("x-status: failed"); header("x-problem: watchlists-disabled"); 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); header("x-status: failed"); header("x-problem: not-logged-in"); 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); header("x-status: failed"); header("x-problem: no-email-address-in-user-preferences"); 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.
")); } // If the watchlist doesn't exist, create it // Note that saving this isn't essential - so we don't bother unless we perform some other action too. if(!isset($env->user_data->watchlist) || !is_array($env->user_data->watchlist)) $env->user_data->watchlist = []; switch($do) { case "add": if(empty($pageindex->{$env->page})) { http_response_code(404); header("x-status: failed"); header("x-problem: page-not-found-on-wiki"); exit(page_renderer::render_main("Page not found - Error - $settings->sitename", "Oops! The page name ".htmlentities($env->page)." couldn't be found on $settings->sitename. Try creating it and trying to add it to your watchlist again!
")); } if(in_array($env->page, $env->user_data->watchlist)) { http_response_code(422); header("x-status: failed"); header("x-problem: watchlist-page-already-present"); exit(page_renderer::render_main("Already on watchlist - Error - $settings->sitename", "The page with the name ".htmlentities($env->page)." is already on your watchlist, so it can't be added again.
")); } // Add the new page to the watchlist $env->user_data->watchlist[] = $env->page; // Sort the list $collator = new Collator(""); $collator->sort($env->user_data->watchlist, SORT_NATURAL | SORT_FLAG_CASE); // Save back to disk save_settings(); break; case "remove": $index = array_search($env->page, $env->user_data->watchlist); if($index === false) { http_response_code(400); header("x-status: failed"); header("x-problem: watchlist-item-not-found"); exit(page_renderer::render_main("Watchlist item not found - Error - $settings->sitename", "Oops! The page with the name ".htmlentities($env->page)." isn't currently on your watchlist, so it couldn't be removed. Perhaps you already removed it?
Try going back to your watchlist.
")); } array_splice($env->user_data->watchlist, $index, 1); save_settings(); break; case "clear": $env->user_data->watchlist = []; save_settings(); break; default: http_response_code(400); header("x-status: failed"); header("x-problem: watchlist-do-verb-not-recognised"); header("content-type: text/plain"); exit("Error: The do verb '$do' wasn't recognised. Current verbs supported: add, remove, clear"); } $message = "Your watchlist was updated successfully."; if(!empty($returnto)) { http_response_code(302); header("x-status: success"); header("location: $returnto"); $message .= " Click here to return to your previous page."; } else $message .= " Go back to your previous page, or review your watchlist."; exit(page_renderer::render_main("Watchlist update successful", "$message
")); }); if(!module_exists("page-edit")) { error_log("[PeppermintyWiki/$settings->sitename/feature-watchlist] Note: Without the page-edit module, the feature-watchlist module doesn't make much sense. If you don't want anonymous people to edit your wiki, try the 'anonedits' setting."); return false; } register_save_preprocessor(function($indexentry, $new_data, $old_data) { global $version, $commit, $env, $settings; $usernames = []; foreach($settings->users as $username => $user_data) { // Skip if this is the user that made the edit if($username == $env->user) continue; // If the user's watchlist is empty, then there's no point in checking it if(empty($user_data->watchlist)) continue; // If it's not in the watchlist, then we shouldn't send an email if(!in_array($env->page, $user_data->watchlist)) continue; $usernames[] = $username; } $chars_changed = strlen($new_data) - strlen($old_data); $chars_changed_text = ($chars_changed < 0 ? "removes " : "adds ") . "$chars_changed characters"; $url_stem = url_stem(); email_users( $usernames, "{$env->page} was updated by {$env->user} - $settings->sitename", "Hey there! {$env->page} was updated by {$env->user} at ".render_timestamp(time(), true, false).", which $chars_changed_text. View the latest revision here: {$url_stem}?page=".rawurlencode($env->page)." ---------- New page text ---------- $new_data ----------------------------------- --$settings->sitename, powered by Pepperminty Wiki $version-".substr($commit, 0, 7)." (P.S. Don't reply to this email, because it may not recieve a reply. Instead try contacting $settings->admindetails_name at $settings->admindetails_email, who is $settings->sitename's administrator if you have any issues.) " ); }); } ]); ?>