/**
  * Sends a notification after adding an user.
  * @param User $oUser
  * @param Boolean $bByEmail
  * @return bool allow other hooked methods to be executed. Always true.
  */
 public function onAddNewAccount($oUser, $bByEmail)
 {
     wfProfileIn('BS::' . __METHOD__);
     if ($oUser->isAllowed('bot')) {
         return true;
     }
     EchoEvent::create(array('type' => 'bs-newuser', 'extra' => array('user' => $oUser->getName(), 'username' => $oUser->getName(), 'userlink' => true, 'realname' => BsCore::getUserDisplayName($oUser))));
     wfProfileOut('BS::' . __METHOD__);
     return true;
 }
 /**
  * Adds a user based greeting to the text mail
  * @param Message $message
  * @param User $oUser
  * @return String
  */
 public function userBasedDecorateIntro($message, $oUser)
 {
     $sRealname = BsCore::getUserDisplayName($oUser);
     $sReturn = wfMessage('bs-email-greeting-receiver')->params($oUser->getName(), $sRealname)->inLanguage($oUser->getOption('language'))->text();
     return $sReturn . "\n\n" . $message->text();
 }
 function onSuperListBuildDataSets(&$aRows)
 {
     if (!count($aRows)) {
         return true;
     }
     $aPageIds = array_keys($aRows);
     $dbr = wfGetDB(DB_READ);
     $aTables = array('bs_responsible_editors', 'user');
     $aJoinConditions = array('user' => array('JOIN', 're_user_id=user_id'));
     $sField = "re_page_id, re_position, user_id";
     $sCondition = "re_page_id IN (" . implode(',', $aPageIds) . ")";
     $aOptions = array('ORDER BY' => 're_page_id, re_position');
     $res = $dbr->select($aTables, $sField, $sCondition, __METHOD__, $aOptions, $aJoinConditions);
     $aData = array();
     $aUserIds = array();
     while ($row = $res->fetchObject()) {
         $oUser = User::newFromId($row->user_id);
         if ($oUser === null) {
             continue;
         }
         $aUserIds[$row->re_page_id][] = $row->user_id;
         $aData[$row->re_page_id][] = '<li>' . '<a class="bs-re-superlist-editor" href="#">' . BsCore::getUserDisplayName($oUser) . '</a>' . '</li>';
     }
     foreach ($aRows as $iKey => $aRowSet) {
         if (array_key_exists($iKey, $aData)) {
             $aRows[$iKey]['responsible_editors'] = Html::rawElement('ul', array('data-articleId' => $iKey, 'data-editorIds' => FormatJson::encode($aUserIds[$iKey])), implode('', $aData[$iKey]));
         }
     }
     return true;
 }
 /**
  * Send email notification to next user(s) on review list.
  * @param BsReviewProcess $oReviewProcess Review process users should be notified for.
  * @return Status
  */
 public function emailNotifyNextUsers($oReviewProcess)
 {
     $aNextUsers = $oReviewProcess->getNextUsers();
     // Identify owner
     $oOwner = User::newFromId($oReviewProcess->getOwner());
     $sOwnerRealName = BsCore::getUserDisplayName($oOwner);
     $oTitle = Title::newFromID($oReviewProcess->pid);
     $sTitleText = $oTitle->getPrefixedText();
     $sLink = BsLinkProvider::makeLink($oTitle, $oTitle->getFullURL());
     foreach ($aNextUsers as $aReviewer) {
         // dirty workaround, sometimes id comes as username
         if (is_numeric($aReviewer['id'])) {
             $oReviewer = User::newFromId($aReviewer['id']);
         } else {
             $oReviewer = User::newFromName($aReviewer['id']);
         }
         if (!BsConfig::getVarForUser('MW::Review::EmailNotifyReviewer', $oReviewer->getName())) {
             continue;
         }
         // Identify reviewer
         //PW(10.03.2015): Echo notifications
         $sReviewerMail = $oReviewer->getEmail();
         if (!$sReviewerMail) {
             continue;
         }
         $sReviewerLang = $oReviewer->getOption('language');
         $sSubject = wfMessage('bs-review-mail-invite-header', $sTitleText)->inLanguage($sReviewerLang)->text();
         $sMsg = wfMessage('bs-review-mail-invite-body', $sOwnerRealName, $oOwner->getName(), $sTitleText)->inLanguage($sReviewerLang)->text();
         $sMsg .= "\n\n" . $sLink;
         if ($aReviewer['comment']) {
             $sMsg .= "\n" . wfMessage('bs-review-mail-comment', $aReviewer['comment'])->inLanguage($sReviewerLang)->text();
         }
         //Send mail to next user in queue
         BsMailer::getInstance('MW')->send($oReviewer, $sSubject, $sMsg);
     }
 }
 /**
  * This functions resets a interupted workflow.
  */
 function reset($sComment = '')
 {
     $dbw = wfGetDB(DB_MASTER);
     // Get Review-ID and owner id
     $res = $dbw->select('bs_review', array('rev_id', 'rev_owner'), "rev_pid=" . $this->pid, __METHOD__, array('ORDER BY' => 'rev_id DESC'));
     $row = $dbw->fetchRow($res);
     $dbw->freeResult($res);
     $review_id = $row['rev_id'];
     $owner_id = $row['rev_owner'];
     $tbl = $dbw->tableName('bs_review');
     global $wgDBtype;
     if ($wgDBtype == 'oracle') {
         $dbw->query("UPDATE {$tbl} SET rev_startdate=to_char(SYSDATE, 'YYYYMMDDHH24MISS'), rev_enddate=to_char(SYSDATE + interval '7 days', 'YYYYMMDDHH24MISS') WHERE rev_pid={$this->pid}");
     } elseif ($wgDBtype == 'postgres') {
         $dbw->query("UPDATE {$tbl} SET rev_startdate=to_char(current_timestamp, 'YYYYMMDDHH24MISS'), rev_enddate=to_char(current_timestamp + interval '7 days', 'YYYYMMDDHH24MISS') WHERE rev_pid={$this->pid}");
     } else {
         $dbw->query("UPDATE {$tbl} SET rev_startdate=NOW(), rev_enddate=DATE_ADD(NOW(), INTERVAL 7 DAY) WHERE rev_pid={$this->pid}");
     }
     $tbl = $dbw->tableName('bs_review_steps');
     $aUsersVoted = array();
     $iLastVotedId = 0;
     $iVoteAmount = 0;
     //Get all steps that have not been processed yet
     $res = $dbw->select('bs_review_steps', array('revs_user_id', 'revs_sort_id', 'revs_comment'), array('revs_status > -1', 'revs_review_id = ' . $review_id), __METHOD__, array('ORDER BY revs_sort_id'));
     while ($row = $dbw->fetchRow($res)) {
         $aUsersVoted[] = $row;
         $iLastVotedId = $row['revs_sort_id'];
         $iVoteAmount++;
     }
     $iVoteAmount++;
     $dbw->query("UPDATE {$tbl} SET revs_sort_id=revs_sort_id+{$iVoteAmount} WHERE revs_review_id = {$review_id} AND revs_sort_id > {$iLastVotedId}");
     $dbw->query("UPDATE {$tbl} SET revs_status = -2 WHERE revs_review_id = {$review_id} AND revs_status = 1");
     $dbw->query("UPDATE {$tbl} SET revs_status = -3 WHERE revs_review_id = {$review_id} AND revs_status = 0");
     $data = array('revs_review_id' => $review_id, 'revs_user_id' => $owner_id, 'revs_status' => -1, 'revs_sort_id' => ++$iLastVotedId, 'revs_comment' => "<u>" . BsCore::getUserDisplayName() . ": </u>" . $sComment);
     foreach ($this->_aInjections as $oInjection) {
         $oInjection->createStepDefault($data);
     }
     $dbw->insert('bs_review_steps', $data);
     //Append the unprocessed steps to the list of steps
     $lastUserId = 0;
     foreach ($aUsersVoted as $aUser) {
         if ($aUser['revs_user_id'] == $lastUserId) {
             continue;
         }
         $lastUserId = $aUser['revs_user_id'];
         $lastInitialComment = $aUser['revs_comment'];
         //We remove the contributed parts of the comment and leave only
         //the initial part. Hacky hacky hacky...
         $matches = array();
         preg_match('#.*?/em>(.*?) &rArr;.*?#si', $lastInitialComment, $matches);
         if (isset($matches[1])) {
             $lastInitialComment = trim($matches[1]);
         }
         $data = array('revs_review_id' => $review_id, 'revs_user_id' => $aUser['revs_user_id'], 'revs_status' => -1, 'revs_sort_id' => ++$iLastVotedId, 'revs_comment' => $lastInitialComment);
         foreach ($this->_aInjections as $oInjection) {
             $oInjection->createStepDefault($data);
         }
         $dbw->insert('bs_review_steps', $data);
     }
 }
 /**
  * Callback from preg_replace, replaces the mention with a link to the user page
  * @param array $sMatch
  * @return String The link to the user page
  */
 public static function replaceUsernameInMessage($sMatch)
 {
     $oUser = User::newFromName($sMatch[1]);
     return Linker::link($oUser->getUserPage(), BsCore::getUserDisplayName($oUser));
 }