protected function applyFinalEffects(PhabricatorLiskDAO $object, array $xactions)
 {
     $message_count = 0;
     foreach ($xactions as $xaction) {
         switch ($xaction->getTransactionType()) {
             case PhabricatorTransactions::TYPE_COMMENT:
                 $message_count++;
                 break;
         }
     }
     // update everyone's participation status on the last xaction -only-
     $xaction = end($xactions);
     $xaction_phid = $xaction->getPHID();
     $behind = ConpherenceParticipationStatus::BEHIND;
     $up_to_date = ConpherenceParticipationStatus::UP_TO_DATE;
     $participants = $object->getParticipants();
     $user = $this->getActor();
     $time = time();
     foreach ($participants as $phid => $participant) {
         if ($phid != $user->getPHID()) {
             if ($participant->getParticipationStatus() != $behind) {
                 $participant->setBehindTransactionPHID($xaction_phid);
                 $participant->setSeenMessageCount($object->getMessageCount() - $message_count);
             }
             $participant->setParticipationStatus($behind);
             $participant->setDateTouched($time);
         } else {
             $participant->setSeenMessageCount($object->getMessageCount());
             $participant->setBehindTransactionPHID($xaction_phid);
             $participant->setParticipationStatus($up_to_date);
             $participant->setDateTouched($time);
         }
         $participant->save();
     }
     if ($xactions) {
         $data = array('type' => 'message', 'threadPHID' => $object->getPHID(), 'messageID' => last($xactions)->getID(), 'subscribers' => array($object->getPHID()));
         PhabricatorNotificationClient::tryToPostMessage($data);
     }
     return $xactions;
 }
 private function sendNotification($chrono_key, array $subscribed_phids)
 {
     $data = array('key' => (string) $chrono_key, 'type' => 'notification', 'subscribers' => $subscribed_phids);
     PhabricatorNotificationClient::tryToPostMessage($data);
 }