*/ require_once('UserMailer.php'); // using MailAddress $wgExtensionFunctions[] = "wfExtensionSpecialWikilist"; $wgExtensionCredits['specialpage'][] = array( 'name' => 'Wikilist', 'version' => '2007/05/15', 'author' => 'Austin Che', 'url' => 'http://openwetware.org/wiki/User:Austin/Extensions/Wikilist', 'description' => 'Enables emailing all users linked on a page', ); if (!isset($wgWikilistEmailHost)) $wgWikilistEmailHost = false; if (!isset($wgWikilistNamespace)) $wgWikilistNamespace = NS_MAIN; // default is to use very clean email addresses // you can set $wgWikilistEmailPrefix to something like "wikilist+" function wfExtensionSpecialWikilist() { global $wgMessageCache, $wgSpecialPages; $wgMessageCache->addMessages(array('wikilist' => 'E-mail Wiki List', 'wikilistemail' => 'E-mail', 'wikilistlist' => 'List', 'wikilisttext' => 'Email all users linked from this page.', 'wikilistnumusers' => '$1 users on list', 'wikilistsent' => 'Email sent to users on list.', 'wikilistnotexist' => 'List does not exist.', )); $wgSpecialPages['Wikilist'] = array('SpecialPage', 'Wikilist'); } function wfSpecialWikilist($par) { global $wgUser, $wgOut, $wgRequest, $wgEnableEmail, $wgEnableUserEmail, $wgWikilistEmailHost; if (!$wgEnableEmail || !$wgEnableUserEmail || !$wgWikilistEmailHost) { $wgOut->showErrorPage( "nosuchspecialpage", "nospecialpagetext" ); return; } if (!$wgUser->canSendEmail()) { wfDebug( "User can't send.\n" ); $wgOut->showErrorPage( "mailnologin", "mailnologintext" ); return; } $target = isset($par) ? $par : $wgRequest->getVal('target'); if ($target) { $page = Title::newFromURL($target); if (!$page->exists()) { $wgOut->addHTML(wfMsg('wikilistnotexist')); $page = ""; } } if (! $page) { WikiList::enterListName(); return; } $list = new WikiList($page); $list->execute(); } class WikiList { var $list, $body, $subject, $listAddress, $rev, $recipients; /** * @param Title $page */ function WikiList($page) { global $wgRequest, $wgWikilistEmailHost, $wgWikilistEmailPrefix; $this->list = $page; $this->rev = Revision::newFromTitle($page); $this->body = $wgRequest->getText('body'); $this->subject = $wgRequest->getText('subject'); $this->recipients = array(); if (! is_null($this->rev)) $this->recipients = $this->extractRecipients($page); $this->listAddress = $this->getListName() . "@" . $wgWikilistEmailHost; if ($wgWikilistEmailPrefix) $this->listAddress = $wgWikilistEmailPrefix . $this->listAddress; } function getListID() { return $this->list->getArticleID(); } function getListDisplayName() { // friendly human readable name return $this->list->getPrefixedText(); } function getListName() { if ($this->isNamedList()) return strtolower($this->list->getDBkey()); // get name with spaces replaced by underscores else return $this->getListID(); } function isNamedList() { global $wgWikilistNamespace; // do checks that if we send to list name we would likely receive it properly // Has to be in right namespace plus list name should be all lower case other than first character // could perhaps do more checks here if want to follow RFCs more closely // but can probably let users figure out what works return ($this->list->getNamespace() == $wgWikilistNamespace && ! preg_match("/^.(.*)[A-Z]/", $this->list->getDBkey())); } function execute() { global $wgRequest, $wgUser; $action = $wgRequest->getVal('action'); if ($action == "showusers") $this->showUsers(); else if ($action == "submit" && $wgRequest->wasPosted() && $wgUser->matchEditToken($wgRequest->getVal('editToken'))) { $this->doSubmit(); } else $this->enterMailMessage(); } function enterListName() { global $wgOut; $title = Title::makeTitle(NS_SPECIAL, "Wikilist"); $action = $title->escapeLocalUrl(); $list = wfMsg("wikilistlist"); $wgOut->addHTML("
\n" ); } function extractRecipients($list) { // $list is Title object $dbr =& wfGetDB(DB_SLAVE); list($pagelinks, $page, $redirect) = $dbr->tableNamesN('pagelinks','page','redirect'); $userns = NS_USER; $id = $list->getArticleID(); $sql = "SELECT DISTINCT pl_title, page_id, page_is_redirect FROM $pagelinks LEFT OUTER JOIN ($page) ON ($page.page_title=$pagelinks.pl_title AND $page.page_namespace=pl_namespace) WHERE pl_from=$id AND pl_namespace=$userns ORDER BY pl_title"; $res = $dbr->query($sql); $users = array(); while (($u = $dbr->fetchObject($res))) { $username = $u->pl_title; // check if it is redirect page if ($u->page_is_redirect) { $redirect_page = $dbr->selectField($redirect, "rd_title", "rd_namespace=$userns AND rd_from=" . $u->page_id); if ($redirect_page) $username = $redirect_page; } // only add if valid user // this also takes care of things like [[User:Foo/bar]] $user = User::newFromName($username); if (!is_null($user) && $user->canReceiveEmail()) { $username = $user->getName(); // use display form (spaces not underscores) $users[$username] = $username; // avoids adding the same user multiple times } } $dbr->freeResult($res); return $users; } function printListInfo($showNumUsers=false) { global $wgOut, $wgUser; $skin = $wgUser->getSkin(); $wgOut->addHTML(wfMsg("wikilistlist") . ": " . $skin->makeLinkObj($this->list) . ""); $title = Title::makeTitle(NS_SPECIAL, "Wikilist"); $target = "target=" . urlencode($this->list->getPrefixedDBkey()); if ($showNumUsers) { $numusers = $skin->makeLinkObj($title, wfMsg("wikilistnumusers", count($this->recipients)), $target . "&action=showusers"); $wgOut->addHTML(" (" . $numusers . ")"); } else { $wgOut->addHTML(" (" . $skin->makeLinkObj($title, wfMsg("wikilistemail"), $target) . ")"); } } function getFromUser() { global $wgUser; return new MailAddress($wgUser->getEmail(), $wgUser->getRealName()); } function showUsers() { global $wgOut, $wgUser; $skin = $wgUser->getSkin(); $this->printListInfo(); $wgOut->addHTML(""); $this->showUsers(); } } ?>