1
0
Fork 0
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:
epriestley 2011-05-17 14:40:25 -07:00
parent f1d43bc3c5
commit 28146171ce
6 changed files with 109 additions and 1 deletions

View file

@ -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',

View file

@ -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);
}
}
}

View file

@ -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');

View file

@ -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;
}
}
}

View file

@ -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');

View file

@ -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;
}
}