protected function run() { $argv = $this->getArgv(); if (count($argv) !== 1) { throw new Exception(pht('Usage: %s %s', __CLASS__, '<json_config_file>')); } $json_raw = Filesystem::readFile($argv[0]); try { $config = phutil_json_decode($json_raw); } catch (PhutilJSONParserException $ex) { throw new PhutilProxyException(pht("File '%s' is not valid JSON!", $argv[0]), $ex); } $nick = idx($config, 'nick', 'phabot'); $handlers = idx($config, 'handlers', array()); $protocol_adapter_class = idx($config, 'protocol-adapter', 'PhabricatorIRCProtocolAdapter'); $this->pollFrequency = idx($config, 'poll-frequency', 1); $this->config = $config; foreach ($handlers as $handler) { $obj = newv($handler, array($this)); $this->handlers[] = $obj; } $ca_bundle = idx($config, 'https.cabundle'); if ($ca_bundle) { HTTPSFuture::setGlobalCABundleFromPath($ca_bundle); } $conduit_uri = idx($config, 'conduit.uri'); if ($conduit_uri) { $conduit_token = idx($config, 'conduit.token'); // Normalize the path component of the URI so users can enter the // domain without the "/api/" part. $conduit_uri = new PhutilURI($conduit_uri); $conduit_host = (string) $conduit_uri->setPath('/'); $conduit_uri = (string) $conduit_uri->setPath('/api/'); $conduit = new ConduitClient($conduit_uri); if ($conduit_token) { $conduit->setConduitToken($conduit_token); } else { $conduit_user = idx($config, 'conduit.user'); $conduit_cert = idx($config, 'conduit.cert'); $response = $conduit->callMethodSynchronous('conduit.connect', array('client' => __CLASS__, 'clientVersion' => '1.0', 'clientDescription' => php_uname('n') . ':' . $nick, 'host' => $conduit_host, 'user' => $conduit_user, 'certificate' => $conduit_cert)); } $this->conduit = $conduit; } // Instantiate Protocol Adapter, for now follow same technique as // handler instantiation $this->protocolAdapter = newv($protocol_adapter_class, array()); $this->protocolAdapter->setConfig($this->config)->connect(); $this->runLoop(); $this->protocolAdapter->disconnect(); }
<?php use Rych\Silex\Provider\PlatesServiceProvider; require_once __DIR__ . '/vendor/autoload.php'; $app = new Silex\Application(require_once __DIR__ . '/config.php'); require_once $app['libphutil_path'] . '/libphutil/src/__phutil_library_init__.php'; $_client = new ConduitClient($app['phabricator_url']); $_client->setConduitToken($app['api_token']); $_escaper = new Escaper(); $_template = new Template(__DIR__ . '/_tpl', $_escaper); /* HOME redirect to /{year}/{date} */ $app->get('/', function () use($app) { $url = $app['request']->getBaseUrl() . '/' . date('Y') . '/' . date('n'); return $app->redirect($url); }); /* MAIN */ $app->get('/{year}/{month}', function ($year, $month) use($app, $_client, $_template) { $data['base_path'] = $app['request']->getBaseUrl(); $data['year'] = $year; $data['month'] = $month; $data['users'] = $_client->callMethodSynchronous('user.query', []); $data['days'] = cal_days_in_month(CAL_GREGORIAN, $month, $year); return $_template->render('index', $data); }); /* API to get json data */ $app->get('/api', function () use($app, $_client) { $users = $_client->callMethodSynchronous('user.query', []); $colors = ['#80E680', '#4D4DFF', '#E066A3', '#DB4D4D', '#FF944D', '#A38566', '#FFFF66']; $projectColors = []; foreach ($users as &$user) { $open_tasks = $_client->callMethodSynchronous('maniphest.query', ['status' => 'status-open', 'ownerPHIDs' => [$user['phid']]]);