예제 #1
0
 /**
  * Worklist entries longpoll, retrieves new entries by simulating server pushes
  * to the status page. Refer to client side code at js/status.js to clarify.
  */
 public function longpoll()
 {
     $this->view = new JsonView();
     $ret = array();
     try {
         $since = $_POST['since'];
         $entry = new EntryModel();
         $ret = array();
         // this is a 30 seconds timeout long poll, so let's loop up to 25 times
         // with 1 sec delays at the end of each iteration
         $fromTime = (int) $since;
         for ($i = 0; $i < 25; $i++) {
             $toTime = strtotime(Model::now());
             $seconds_ago = abs($toTime - $fromTime);
             // we are searching for new worklist entries
             $entries = $entry->latest($seconds_ago, 90);
             if ($entries) {
                 $now = 0;
                 foreach ($entries as $entry) {
                     if (!$now) {
                         $now = strtotime(Model::now());
                     }
                     $date = strtotime($entry->date);
                     $relativeDate = Utils::relativeTime($date - $now);
                     $mention_regex = '/(^|\\s)@([a-zA-Z0-9][a-zA-Z0-9-]+)/';
                     $task_regex = '/(^|\\s)\\*\\*#(\\d+)\\*\\*/';
                     $content = preg_replace($mention_regex, '\\1[\\2](./user/\\2)', $entry->entry);
                     $content = preg_replace($task_regex, '\\1[\\\\#\\2](./\\2)', $content);
                     // proccesed entries are returned as markdown-processed html
                     $content = Markdown::defaultTransform($content);
                     $ret[] = array('id' => $entry->id, 'date' => $date, 'relativeDate' => $relativeDate, 'content' => $content);
                 }
                 // if we found new entries, no need to keep looping so we can return data inmediatly
                 break;
             }
             sleep(1);
         }
         $ret = array('success' => true, 'data' => $ret);
     } catch (Exception $e) {
         $ret = array('success' => false, 'message' => $e->getMessage());
     }
     $this->write('output', $ret);
 }