/**
  * Allows user to announce or unannounce a discussion.
  *
  * If the discussion isn't announced, this announces it.
  * If it is already announced, this unannounces it.
  * Announced discussions stay at the top of the discussions
  * list regardless of how long ago the last comment was.
  *
  * @since 2.0.0
  * @access public
  *
  * @param int $DiscussionID Unique discussion ID.
  * @param string $TransientKey Single-use hash to prove intent.
  */
 public function announce($DiscussionID = '', $Target = '')
 {
     $Discussion = $this->DiscussionModel->getID($DiscussionID);
     if (!$Discussion) {
         throw notFoundException('Discussion');
     }
     $this->permission('Vanilla.Discussions.Announce', true, 'Category', $Discussion->PermissionCategoryID);
     if ($this->Form->authenticatedPostBack()) {
         // Save the property.
         $CacheKeys = array($this->DiscussionModel->getAnnouncementCacheKey(), $this->DiscussionModel->getAnnouncementCacheKey(val('CategoryID', $Discussion)));
         $this->DiscussionModel->SQL->cache($CacheKeys);
         $this->DiscussionModel->SetProperty($DiscussionID, 'Announce', (int) $this->Form->getFormValue('Announce', 0));
         if ($Target) {
             $this->RedirectUrl = url($Target);
         }
     } else {
         if (!$Discussion->Announce) {
             $Discussion->Announce = 2;
         }
         $this->Form->setData($Discussion);
     }
     $Discussion = (array) $Discussion;
     $Category = CategoryModel::categories($Discussion['CategoryID']);
     $this->setData('Discussion', $Discussion);
     $this->setData('Category', $Category);
     $this->title(t('Announce'));
     $this->render();
 }
 /**
  * Allows user to close or re-open a discussion.
  *
  * If the discussion isn't closed, this closes it. If it is already 
  * closed, this re-opens it. Closed discussions may not have new 
  * comments added to them.
  * 
  * @since 2.0.0
  * @access public
  *
  * @param int $DiscussionID Unique discussion ID.
  * @param string $TransientKey Single-use hash to prove intent.
  */
 public function Close($DiscussionID = '', $TransientKey = '')
 {
     $this->_DeliveryType = DELIVERY_TYPE_BOOL;
     $Session = Gdn::Session();
     $State = '1';
     if (is_numeric($DiscussionID) && $DiscussionID > 0 && $Session->UserID > 0 && $Session->ValidateTransientKey($TransientKey)) {
         $Discussion = $this->DiscussionModel->GetID($DiscussionID);
         if ($Discussion) {
             if ($Session->CheckPermission('Vanilla.Discussions.Close', TRUE, 'Category', $Discussion->PermissionCategoryID)) {
                 $State = $this->DiscussionModel->SetProperty($DiscussionID, 'Closed');
             } else {
                 $State = $Discussion->Closed;
                 $this->Form->AddError('ErrPermission');
             }
         }
     }
     // Redirect to the front page
     if ($this->_DeliveryType === DELIVERY_TYPE_ALL) {
         $Target = GetIncomingValue('Target', 'discussions');
         Redirect($Target);
     }
     $State = $State == '1' ? TRUE : FALSE;
     $this->SetJson('State', $State);
     $this->SetJson('LinkText', T($State ? 'Reopen' : 'Close'));
     $this->InformMessage(T('Your changes have been saved.'));
     $this->Render();
 }
 /**
  * Allows user to announce or unannounce a discussion.
  *
  * If the discussion isn't announced, this announces it.
  * If it is already announced, this unannounces it.
  * Announced discussions stay at the top of the discussions
  * list regardless of how long ago the last comment was.
  *
  * @since 2.0.0
  * @access public
  *
  * @param int $DiscussionID Unique discussion ID.
  * @param string $TransientKey Single-use hash to prove intent.
  */
 public function Announce($DiscussionID = '', $Target = '')
 {
     $Discussion = $this->DiscussionModel->GetID($DiscussionID);
     if (!$Discussion) {
         throw NotFoundException('Discussion');
     }
     $this->Permission('Vanilla.Discussions.Announce', TRUE, 'Category', $Discussion->PermissionCategoryID);
     if ($this->Form->AuthenticatedPostBack()) {
         // Save the property.
         $CacheKeys = array('Announcements', 'Announcements_' . GetValue('CategoryID', $Discussion));
         $this->DiscussionModel->SQL->Cache($CacheKeys);
         $this->DiscussionModel->SetProperty($DiscussionID, 'Announce', (int) $this->Form->GetFormValue('Announce', 0));
         if ($Target) {
             $this->RedirectUrl = Url($Target);
         }
     } else {
         if (!$Discussion->Announce) {
             $Discussion->Announce = 2;
         }
         $this->Form->SetData($Discussion);
     }
     $Discussion = (array) $Discussion;
     $Category = CategoryModel::Categories($Discussion['CategoryID']);
     $this->SetData('Discussion', $Discussion);
     $this->SetData('Category', $Category);
     $this->Title(T('Announce'));
     $this->Render();
 }
 /**
  * @param PostController $Sender
  * @param array $Args
  * @return mixed
  */
 public function PostController_Comment_Create($Sender, $Args = array())
 {
     if ($Sender->Form->AuthenticatedPostBack()) {
         $Sender->Form->SetModel($Sender->CommentModel);
         // Grab the discussion for use later.
         $DiscussionID = $Sender->Form->GetFormValue('DiscussionID');
         $DiscussionModel = new DiscussionModel();
         $Discussion = $DiscussionModel->GetID($DiscussionID);
         // Check to see if the discussion is supposed to be in private...
         $WhisperConversationID = GetValueR('Attributes.WhisperConversationID', $Discussion);
         if ($WhisperConversationID === TRUE) {
             // There isn't a conversation so we want to create one.
             $Sender->Form->SetFormValue('Whisper', TRUE);
             $WhisperUserIDs = GetValueR('Attributes.WhisperUserIDs', $Discussion);
             $Sender->Form->SetFormValue('RecipientUserID', $WhisperUserIDs);
         } elseif ($WhisperConversationID) {
             // There is already a conversation.
             $Sender->Form->SetFormValue('Whisper', TRUE);
             $Sender->Form->SetFormValue('ConversationID', $WhisperConversationID);
         }
         $Whisper = $Sender->Form->GetFormValue('Whisper') && GetIncomingValue('Type') != 'Draft';
         $WhisperTo = trim($Sender->Form->GetFormValue('To'));
         $ConversationID = $Sender->Form->GetFormValue('ConversationID');
         // If this isn't a whisper then post as normal.
         if (!$Whisper) {
             return call_user_func_array(array($Sender, 'Comment'), $Args);
         }
         $ConversationModel = new ConversationModel();
         $ConversationMessageModel = new ConversationMessageModel();
         if ($ConversationID > 0) {
             $Sender->Form->SetModel($ConversationMessageModel);
         } else {
             // We have to remove the blank conversation ID or else the model won't validate.
             $FormValues = $Sender->Form->FormValues();
             unset($FormValues['ConversationID']);
             $FormValues['Subject'] = GetValue('Name', $Discussion);
             $Sender->Form->FormValues($FormValues);
             $Sender->Form->SetModel($ConversationModel);
             $ConversationModel->Validation->ApplyRule('DiscussionID', 'Required');
         }
         $ID = $Sender->Form->Save($ConversationMessageModel);
         if ($Sender->Form->ErrorCount() > 0) {
             $Sender->ErrorMessage($Sender->Form->Errors());
         } else {
             if ($WhisperConversationID === TRUE) {
                 $Discussion->Attributes['WhisperConversationID'] = $ID;
                 $DiscussionModel->SetProperty($DiscussionID, 'Attributes', serialize($Discussion->Attributes));
             }
             $LastCommentID = GetValue('LastCommentID', $Discussion);
             $MessageID = GetValue('LastMessageID', $ConversationMessageModel, FALSE);
             // Randomize the querystring to force the browser to refresh.
             $Rand = mt_rand(10000, 99999);
             if ($LastCommentID) {
                 // Link to the last comment.
                 $HashID = $MessageID ? 'w' . $MessageID : $LastCommentID;
                 $Sender->RedirectUrl = Url("discussion/comment/{$LastCommentID}?rand={$Rand}#Comment_{$HashID}", TRUE);
             } else {
                 // Link to the discussion.
                 $Hash = $MessageID ? "Comment_w{$MessageID}" : 'Item_1';
                 $Name = rawurlencode(GetValue('Name', $Discussion, 'x'));
                 $Sender->RedirectUrl = Url("discussion/{$DiscussionID}/{$Name}?rand={$Rand}#{$Hash}", TRUE);
             }
         }
         $Sender->Render();
     } else {
         return call_user_func_array(array($Sender, 'Comment'), $Args);
     }
 }
 public function DiscussionController_afterDiscussionBody_handler($Sender)
 {
     $Discussion = $Sender->EventArguments['Discussion'];
     $EventDate = $Sender->EventArguments['Discussion']->DiscussionEventDate;
     if ($EventDate) {
         $Guests = $Discussion->DiscussionEventGuests;
         if ($Guests) {
             $Guests = json_decode($Guests, true);
         }
         $DiscussionModel = new DiscussionModel();
         $Session = Gdn::Session();
         if ($Session->isValid()) {
             $UserId = $Session->User->UserID;
         } else {
             $UserId = false;
         }
         if (!$this->Form) {
             $this->Form = new Gdn_Form();
         }
         if ($this->Form->authenticatedPostBack()) {
             $Data = $this->Form->FormValues();
             if ($Data['Type'] == 'Subscribe') {
                 if (!$Guests) {
                     $Guests = array();
                 }
                 if (!array_key_exists($UserId, $Guests) && array_key_exists('Remark', $Data)) {
                     $Guests[$UserId] = $Data['Remark'];
                     $DiscussionModel->SetProperty($Discussion->DiscussionID, 'DiscussionEventGuests', json_encode($Guests));
                 }
             } else {
                 if ($Data['Type'] == 'Unsubscribe') {
                     if (array_key_exists($UserId, $Guests)) {
                         unset($Guests[$UserId]);
                         $DiscussionModel->SetProperty($Discussion->DiscussionID, 'DiscussionEventGuests', json_encode($Guests));
                     }
                 }
             }
         }
         self::displayEventGuests($Guests);
         echo $this->Form->Open();
         echo $this->Form->Errors();
         if ($UserId) {
             if (!$Guests || !array_key_exists($UserId, $Guests)) {
                 $this->Form->AddHidden('Type', 'Subscribe', true);
                 echo $Sender->Form->label(t('Remark'), 'DiscussionEventRemark'), ' ';
                 echo $this->Form->TextBox('Remark');
                 echo $this->Form->getHidden();
                 echo $this->Form->Close(t('Subscribe'));
             } else {
                 $this->Form->AddHidden('Type', 'Unsubscribe', true);
                 echo $this->Form->getHidden();
                 echo $this->Form->Close(t('Unsubscribe'));
             }
         }
     }
 }