mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-23 07:12:41 +01:00
Add an "IRC Object Name" handler for D12345
Summary: I need to add some more conduit methods / info to make this at all useful but here's some basics. Test Plan: Hung out in #phabot-test Reviewed By: mroch Reviewers: mroch, codeblock, aran, jungejason, tuomaspelkonen CC: aran, mroch, epriestley Differential Revision: 300
This commit is contained in:
parent
f1d43bc3c5
commit
28146171ce
6 changed files with 109 additions and 1 deletions
|
@ -325,6 +325,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorIRCBot' => 'infrastructure/daemon/irc/bot',
|
'PhabricatorIRCBot' => 'infrastructure/daemon/irc/bot',
|
||||||
'PhabricatorIRCHandler' => 'infrastructure/daemon/irc/handler/base',
|
'PhabricatorIRCHandler' => 'infrastructure/daemon/irc/handler/base',
|
||||||
'PhabricatorIRCMessage' => 'infrastructure/daemon/irc/message',
|
'PhabricatorIRCMessage' => 'infrastructure/daemon/irc/message',
|
||||||
|
'PhabricatorIRCObjectNameHandler' => 'infrastructure/daemon/irc/handler/objectname',
|
||||||
'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/irc/handler/protocol',
|
'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/irc/handler/protocol',
|
||||||
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/javelin',
|
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/javelin',
|
||||||
'PhabricatorLintEngine' => 'infrastructure/lint/engine',
|
'PhabricatorLintEngine' => 'infrastructure/lint/engine',
|
||||||
|
@ -752,6 +753,7 @@ phutil_register_library_map(array(
|
||||||
'PhabricatorFileViewController' => 'PhabricatorFileController',
|
'PhabricatorFileViewController' => 'PhabricatorFileController',
|
||||||
'PhabricatorGoodForNothingWorker' => 'PhabricatorWorker',
|
'PhabricatorGoodForNothingWorker' => 'PhabricatorWorker',
|
||||||
'PhabricatorIRCBot' => 'PhabricatorDaemon',
|
'PhabricatorIRCBot' => 'PhabricatorDaemon',
|
||||||
|
'PhabricatorIRCObjectNameHandler' => 'PhabricatorIRCHandler',
|
||||||
'PhabricatorIRCProtocolHandler' => 'PhabricatorIRCHandler',
|
'PhabricatorIRCProtocolHandler' => 'PhabricatorIRCHandler',
|
||||||
'PhabricatorJavelinLinter' => 'ArcanistLinter',
|
'PhabricatorJavelinLinter' => 'ArcanistLinter',
|
||||||
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
||||||
|
|
|
@ -200,7 +200,11 @@ final class PhabricatorIRCBot extends PhabricatorDaemon {
|
||||||
|
|
||||||
private function routeMessage(PhabricatorIRCMessage $message) {
|
private function routeMessage(PhabricatorIRCMessage $message) {
|
||||||
foreach ($this->handlers as $handler) {
|
foreach ($this->handlers as $handler) {
|
||||||
$handler->receiveMessage($message);
|
try {
|
||||||
|
$handler->receiveMessage($message);
|
||||||
|
} catch (Exception $ex) {
|
||||||
|
phlog($ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ phutil_require_module('phabricator', 'infrastructure/daemon/base');
|
||||||
phutil_require_module('phabricator', 'infrastructure/daemon/irc/message');
|
phutil_require_module('phabricator', 'infrastructure/daemon/irc/message');
|
||||||
|
|
||||||
phutil_require_module('phutil', 'conduit/client');
|
phutil_require_module('phutil', 'conduit/client');
|
||||||
|
phutil_require_module('phutil', 'error');
|
||||||
phutil_require_module('phutil', 'filesystem');
|
phutil_require_module('phutil', 'filesystem');
|
||||||
phutil_require_module('phutil', 'utils');
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
<?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 {
|
||||||
|
|
||||||
|
public function receiveMessage(PhabricatorIRCMessage $message) {
|
||||||
|
|
||||||
|
switch ($message->getCommand()) {
|
||||||
|
case 'PRIVMSG':
|
||||||
|
$channel = $message->getChannel();
|
||||||
|
if (!$channel) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$message = $message->getMessageText();
|
||||||
|
$matches = null;
|
||||||
|
$phids = array();
|
||||||
|
if (preg_match_all('/(?:^|\b)D(\d+)(?:\b|$)/', $message, $matches)) {
|
||||||
|
if ($matches[1]) {
|
||||||
|
$revisions = $this->getConduit()->callMethodSynchronous(
|
||||||
|
'differential.find',
|
||||||
|
array(
|
||||||
|
'query' => 'revision-ids',
|
||||||
|
'guids' => $matches[1],
|
||||||
|
));
|
||||||
|
|
||||||
|
// TODO: This is utter hacks until phid.find or similar lands.
|
||||||
|
foreach ($revisions as $revision) {
|
||||||
|
$phids[$revision['phid']] =
|
||||||
|
'D'.$revision['id'].' '.$revision['name'].' - '.
|
||||||
|
PhabricatorEnv::getProductionURI('/D'.$revision['id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach ($phids as $phid => $description) {
|
||||||
|
$this->write('PRIVMSG', "{$channel} :{$description}");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* This file is automatically generated. Lint this module to rebuild it.
|
||||||
|
* @generated
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_module('phabricator', 'infrastructure/daemon/irc/handler/base');
|
||||||
|
phutil_require_module('phabricator', 'infrastructure/env');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('PhabricatorIRCObjectNameHandler.php');
|
|
@ -40,4 +40,30 @@ final class PhabricatorIRCMessage {
|
||||||
return $this->command;
|
return $this->command;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getChannel() {
|
||||||
|
switch ($this->getCommand()) {
|
||||||
|
case 'PRIVMSG':
|
||||||
|
$matches = null;
|
||||||
|
$raw = $this->getRawData();
|
||||||
|
if (preg_match('/^(\S+)\s/', $raw, $matches)) {
|
||||||
|
return $matches[1];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMessageText() {
|
||||||
|
switch ($this->getCommand()) {
|
||||||
|
case 'PRIVMSG':
|
||||||
|
$matches = null;
|
||||||
|
$raw = $this->getRawData();
|
||||||
|
if (preg_match('/^\S+\s+:?(.*)$/', $raw, $matches)) {
|
||||||
|
return rtrim($matches[1], "\r\n");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue