mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-27 01:02:42 +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',
|
||||
'PhabricatorIRCHandler' => 'infrastructure/daemon/irc/handler/base',
|
||||
'PhabricatorIRCMessage' => 'infrastructure/daemon/irc/message',
|
||||
'PhabricatorIRCObjectNameHandler' => 'infrastructure/daemon/irc/handler/objectname',
|
||||
'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/irc/handler/protocol',
|
||||
'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/javelin',
|
||||
'PhabricatorLintEngine' => 'infrastructure/lint/engine',
|
||||
|
@ -752,6 +753,7 @@ phutil_register_library_map(array(
|
|||
'PhabricatorFileViewController' => 'PhabricatorFileController',
|
||||
'PhabricatorGoodForNothingWorker' => 'PhabricatorWorker',
|
||||
'PhabricatorIRCBot' => 'PhabricatorDaemon',
|
||||
'PhabricatorIRCObjectNameHandler' => 'PhabricatorIRCHandler',
|
||||
'PhabricatorIRCProtocolHandler' => 'PhabricatorIRCHandler',
|
||||
'PhabricatorJavelinLinter' => 'ArcanistLinter',
|
||||
'PhabricatorLintEngine' => 'PhutilLintEngine',
|
||||
|
|
|
@ -200,7 +200,11 @@ final class PhabricatorIRCBot extends PhabricatorDaemon {
|
|||
|
||||
private function routeMessage(PhabricatorIRCMessage $message) {
|
||||
foreach ($this->handlers as $handler) {
|
||||
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('phutil', 'conduit/client');
|
||||
phutil_require_module('phutil', 'error');
|
||||
phutil_require_module('phutil', 'filesystem');
|
||||
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;
|
||||
}
|
||||
|
||||
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