Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2891257
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
9 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/src/applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php b/src/applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php
index 0a04a29380..9a5f5b0ec5 100644
--- a/src/applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php
+++ b/src/applications/transactions/feed/PhabricatorApplicationTransactionFeedStory.php
@@ -1,51 +1,56 @@
<?php
/**
* @concrete-extensible
*/
class PhabricatorApplicationTransactionFeedStory
extends PhabricatorFeedStory {
public function getPrimaryObjectPHID() {
return $this->getValue('objectPHID');
}
public function getRequiredObjectPHIDs() {
return array(
$this->getPrimaryTransactionPHID(),
);
}
public function getRequiredHandlePHIDs() {
$phids = array();
$phids[] = array($this->getValue('objectPHID'));
$phids[] = $this->getPrimaryTransaction()->getRequiredHandlePHIDs();
return array_mergev($phids);
}
protected function getPrimaryTransactionPHID() {
return head($this->getValue('transactionPHIDs'));
}
protected function getPrimaryTransaction() {
return $this->getObject($this->getPrimaryTransactionPHID());
}
public function renderView() {
$view = new PhabricatorFeedStoryView();
$view->setViewed($this->getHasViewed());
$href = $this->getHandle($this->getPrimaryObjectPHID())->getURI();
$view->setHref($view);
$xaction_phids = $this->getValue('transactionPHIDs');
$xaction = $this->getObject(head($xaction_phids));
$xaction->setHandles($this->getHandles());
$view->setTitle($xaction->getTitleForFeed());
$view->setOneLineStory(true);
return $view;
}
+ public function renderText() {
+ // TODO: This is grotesque; the feed notification handler relies on it.
+ return strip_tags($this->renderView()->render());
+ }
+
}
diff --git a/src/infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.php b/src/infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.php
index 3a252cfc5e..2eddba29ad 100644
--- a/src/infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.php
+++ b/src/infrastructure/daemon/bot/handler/PhabricatorBotDifferentialNotificationHandler.php
@@ -1,56 +1,19 @@
<?php
/**
- * @group irc
+ * @deprecated
*/
final class PhabricatorBotDifferentialNotificationHandler
-extends PhabricatorBotHandler {
-
- private $skippedOldEvents;
+ extends PhabricatorBotHandler {
public function receiveMessage(PhabricatorBotMessage $message) {
- return;
- }
-
- public function runBackgroundTasks() {
- $iterator = new PhabricatorTimelineIterator('ircdiffx', array('difx'));
- $show = $this->getConfig('notification.actions');
-
- if (!$this->skippedOldEvents) {
- // Since we only want to post notifications about new events, skip
- // everything that's happened in the past when we start up so we'll
- // only process real-time events.
- foreach ($iterator as $event) {
- // Ignore all old events.
- }
- $this->skippedOldEvents = true;
- return;
- }
-
- foreach ($iterator as $event) {
- $data = $event->getData();
- if (!$data || ($show !== null && !in_array($data['action'], $show))) {
- continue;
- }
-
- $actor_phid = $data['actor_phid'];
- $phids = array($actor_phid);
- $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
- $verb = DifferentialAction::getActionPastTenseVerb($data['action']);
-
- $actor_name = $handles[$actor_phid]->getName();
- $message_body =
- "{$actor_name} {$verb} revision D".$data['revision_id'].".";
-
- $channels = $this->getConfig('notification.channels', array());
- foreach ($channels as $channel) {
- $this->writeMessage(
- id(new PhabricatorBotMessage())
- ->setCommand('MESSAGE')
- ->setTarget($channel)
- ->setBody($message_body));
- }
+ static $notified;
+ if (!$notified) {
+ phlog(
+ 'PhabricatorBotDifferentialNotificationHandler is deprecated, use '.
+ 'PhabricatorBotFeedNotificationHandler instead.');
+ $notified = true;
}
}
}
diff --git a/src/infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php b/src/infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php
index abec6a5664..eb4c5c6151 100644
--- a/src/infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php
+++ b/src/infrastructure/daemon/bot/handler/PhabricatorBotFeedNotificationHandler.php
@@ -1,163 +1,167 @@
<?php
/**
* Watches the feed and puts notifications into channel(s) of choice
*
* @group irc
*/
final class PhabricatorBotFeedNotificationHandler
extends PhabricatorBotHandler {
private $startupDelay = 30;
private $lastSeenChronoKey = 0;
private function shouldShowStory($story) {
$story_class = $story['class'];
$story_text = $story['text'];
$show = $this->getConfig('notification.types');
if ($show) {
$obj_type = str_replace('PhabricatorFeedStory', '', $story_class);
if (!in_array(strtolower($obj_type), $show)) {
return false;
}
}
$verbosity = $this->getConfig('notification.verbosity', 3);
$verbs = array();
switch ($verbosity) {
case 2:
$verbs[] = array(
'commented',
'added',
'changed',
'resigned',
'explained',
'modified',
'attached',
'edited',
'joined',
'left',
'removed'
);
// fallthrough
case 1:
$verbs[] = array(
'updated',
'accepted',
'requested',
'planned',
'claimed',
'summarized',
'commandeered',
'assigned'
);
// fallthrough
case 0:
$verbs[] = array(
'created',
'closed',
'raised',
'committed',
'reopened',
'deleted'
);
break;
case 3:
default:
return true;
break;
}
$verbs = '/('.implode('|', array_mergev($verbs)).')/';
if (preg_match($verbs, $story_text)) {
return true;
}
return false;
}
public function receiveMessage(PhabricatorBotMessage $message) {
return;
}
public function runBackgroundTasks() {
if ($this->startupDelay > 0) {
// the event loop runs every 1s so delay enough to fully conenct
$this->startupDelay--;
return;
}
if ($this->lastSeenChronoKey == 0) {
// Since we only want to post notifications about new stories, skip
// everything that's happened in the past when we start up so we'll
// only process real-time stories.
$latest = $this->getConduit()->callMethodSynchronous(
'feed.query',
array(
'limit'=>1
));
foreach ($latest as $story) {
if ($story['chronologicalKey'] > $this->lastSeenChronoKey) {
$this->lastSeenChronoKey = $story['chronologicalKey'];
}
}
return;
}
$config_max_pages = $this->getConfig('notification.max_pages', 5);
$config_page_size = $this->getConfig('notification.page_size', 10);
$last_seen_chrono_key = $this->lastSeenChronoKey;
$chrono_key_cursor = 0;
// Not efficient but works due to feed.query API
for ($max_pages = $config_max_pages; $max_pages > 0; $max_pages--) {
$stories = $this->getConduit()->callMethodSynchronous(
'feed.query',
array(
'limit'=>$config_page_size,
'after'=>$chrono_key_cursor,
'view'=>'text'
));
foreach ($stories as $story) {
if ($story['chronologicalKey'] == $last_seen_chrono_key) {
// Caught up on feed
return;
}
if ($story['chronologicalKey'] > $this->lastSeenChronoKey) {
// Keep track of newest seen story
$this->lastSeenChronoKey = $story['chronologicalKey'];
}
if (!$chrono_key_cursor ||
$story['chronologicalKey'] < $chrono_key_cursor) {
// Keep track of oldest story on this page
$chrono_key_cursor = $story['chronologicalKey'];
}
if (!$story['text'] ||
!$this->shouldShowStory($story)) {
continue;
}
$channels = $this->getConfig('join');
- foreach ($channels as $channel) {
+ foreach ($channels as $channel_name) {
+
+ $channel = id(new PhabricatorBotChannel())
+ ->setName($channel_name);
+
$this->writeMessage(
id(new PhabricatorBotMessage())
->setCommand('MESSAGE')
->setTarget($channel)
->setBody($story['text']));
}
}
}
}
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sun, Jan 19, 14:55 (3 w, 2 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1125709
Default Alt Text
(9 KB)
Attached To
Mode
rP Phorge
Attached
Detach File
Event Timeline
Log In to Comment