Page MenuHomePhorge

No OneTemporary

diff --git a/src/applications/conduit/method/paste/info/ConduitAPI_paste_info_Method.php b/src/applications/conduit/method/paste/info/ConduitAPI_paste_info_Method.php
index 31831450ba..45cbde1882 100644
--- a/src/applications/conduit/method/paste/info/ConduitAPI_paste_info_Method.php
+++ b/src/applications/conduit/method/paste/info/ConduitAPI_paste_info_Method.php
@@ -1,60 +1,61 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class ConduitAPI_paste_info_Method extends ConduitAPIMethod {
public function getMethodDescription() {
return "Retrieve an array of information about a paste.";
}
public function defineParamTypes() {
return array(
'paste_id' => 'required id',
);
}
public function defineReturnType() {
return 'nonempty dict';
}
public function defineErrorTypes() {
return array(
'ERR_BAD_PASTE' => 'No such paste exists',
);
}
protected function execute(ConduitAPIRequest $request) {
$paste_id = $request->getValue('paste_id');
$paste = id(new PhabricatorPaste())->load($paste_id);
if (!$paste) {
throw new ConduitException('ERR_BAD_PASTE');
}
$result = array(
'id' => $paste->getID(),
'phid' => $paste->getPHID(),
'authorPHID' => $paste->getAuthorPHID(),
'filePHID' => $paste->getFilePHID(),
'title' => $paste->getTitle(),
'dateCreated' => $paste->getDateCreated(),
+ 'uri' => PhabricatorEnv::getProductionURI('/P'.$paste->getID()),
);
return $result;
}
}
diff --git a/src/applications/conduit/method/paste/info/__init__.php b/src/applications/conduit/method/paste/info/__init__.php
index 1a92ec47f0..eafc577b4e 100644
--- a/src/applications/conduit/method/paste/info/__init__.php
+++ b/src/applications/conduit/method/paste/info/__init__.php
@@ -1,16 +1,17 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/conduit/method/base');
phutil_require_module('phabricator', 'applications/conduit/protocol/exception');
phutil_require_module('phabricator', 'applications/paste/storage/paste');
+phutil_require_module('phabricator', 'infrastructure/env');
phutil_require_module('phutil', 'utils');
phutil_require_source('ConduitAPI_paste_info_Method.php');
diff --git a/src/infrastructure/daemon/irc/handler/objectname/PhabricatorIRCObjectNameHandler.php b/src/infrastructure/daemon/irc/handler/objectname/PhabricatorIRCObjectNameHandler.php
index 312ea02ffe..4b8e45bd95 100644
--- a/src/infrastructure/daemon/irc/handler/objectname/PhabricatorIRCObjectNameHandler.php
+++ b/src/infrastructure/daemon/irc/handler/objectname/PhabricatorIRCObjectNameHandler.php
@@ -1,140 +1,160 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* Looks for Dxxxx, Txxxx and links to them.
*
* @group irc
*/
class PhabricatorIRCObjectNameHandler extends PhabricatorIRCHandler {
/**
* Map of PHIDs to the last mention of them (as an epoch timestamp); prevents
* us from spamming chat when a single object is discussed.
*/
private $recentlyMentioned = array();
public function receiveMessage(PhabricatorIRCMessage $message) {
switch ($message->getCommand()) {
case 'PRIVMSG':
$channel = $message->getChannel();
if (!$channel) {
break;
}
$message = $message->getMessageText();
$matches = null;
$phids = array();
$pattern =
'@'.
'(?<!/)(?:^|\b)'. // Negative lookbehind prevent matching "/D123".
- '(D|T)(\d+)'.
+ '(D|T|P)(\d+)'.
'(?:\b|$)'.
'@';
$revision_ids = array();
$task_ids = array();
+ $paste_ids = array();
$commit_names = array();
if (preg_match_all($pattern, $message, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
switch ($match[1]) {
case 'D':
$revision_ids[] = $match[2];
break;
case 'T':
$task_ids[] = $match[2];
break;
+ case 'P':
+ $paste_ids[] = $match[2];
+ break;
}
}
}
$pattern =
'@'.
'(?<!/)(?:^|\b)'.
'(r[A-Z]+[0-9a-z]{1,40})'.
'(?:\b|$)'.
'@';
if (preg_match_all($pattern, $message, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$commit_names[] = $match[1];
}
}
$output = array();
if ($revision_ids) {
$revisions = $this->getConduit()->callMethodSynchronous(
'differential.find',
array(
'query' => 'revision-ids',
'guids' => $revision_ids,
));
foreach ($revisions as $revision) {
$output[$revision['phid']] =
'D'.$revision['id'].' '.$revision['name'].' - '.
$revision['uri'];
}
}
if ($task_ids) {
foreach ($task_ids as $task_id) {
$task = $this->getConduit()->callMethodSynchronous(
'maniphest.info',
array(
'task_id' => $task_id,
));
$output[$task['phid']] = 'T'.$task['id'].': '.$task['title'].
' (Priority: '.$task['priority'].') - '.$task['uri'];
}
}
+ if ($paste_ids) {
+ foreach ($paste_ids as $paste_id) {
+ $paste = $this->getConduit()->callMethodSynchronous(
+ 'paste.info',
+ array(
+ 'paste_id' => $paste_id,
+ ));
+ // Eventually I'd like to show the username of the paster as well,
+ // however that will need something like a user.username_from_phid
+ // since we (ideally) want to keep the bot to Conduit calls...and
+ // not call to Phabricator-specific stuff (like actually loading
+ // the User object and fetching his/her username.)
+ $output[$paste['phid']] = 'P'.$paste['id'].': '.$paste['uri'];
+ }
+ }
+
if ($commit_names) {
$commits = $this->getConduit()->callMethodSynchronous(
'diffusion.getcommits',
array(
'commits' => $commit_names,
));
foreach ($commits as $commit) {
if (isset($commit['error'])) {
continue;
}
$output[$commit['commitPHID']] = $commit['uri'];
}
}
foreach ($output as $phid => $description) {
// Don't mention the same object more than once every 10 minutes, so
// we avoid spamming the chat over and over again for discsussions of
// a specific revision, for example.
$quiet_until = idx($this->recentlyMentioned, $phid, 0) + (60 * 10);
if (time() < $quiet_until) {
continue;
}
$this->recentlyMentioned[$phid] = time();
$this->write('PRIVMSG', "{$channel} :{$description}");
}
break;
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Jan 19 2025, 19:12 (5 w, 20 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1127837
Default Alt Text
(8 KB)

Event Timeline