示例#1
0
 /**
  * @test
  */
 public function ensureSendResponseHandlingForMessageResponse()
 {
     /** @var Payload $payload */
     $payload = new Payload(['text' => 'test message', 'channel' => '#fntest']);
     /** @var RealTimeClient $client */
     $client = $this->prophesize(RealTimeClient::class);
     /* @noinspection PhpParamsInspection */
     $client->postMessage(Argument::any())->willReturn(true);
     $message = new Message(['icon_emoji' => 'foo']);
     $attachment = new Message\Attachment(['title' => 'Test']);
     $attachment->setTitle('Test');
     $attachment->setTitleLink('http://www.google.de');
     $attachment->setText('Test');
     $attachment->setFallback('Test');
     $attachment->setAuthorName('Test');
     $attachment->setAuthorLink('http://www.google.de');
     $attachment->setAuthorIcon('foo');
     $attachment->setImageUrl('http://www.google.de');
     $attachment->setThumbUrl('http://www.google.de');
     $message->setText('Test');
     $message->addAttachment($attachment);
     /** @var AbstractCommand $stub */
     $stub = $this->getMockForAbstractClass(AbstractCommand::class, [$payload, $client->reveal()]);
     $stub->sendResponse($message);
     static::assertEquals('foo', $message->getIconEmoji());
     $message->setIconEmoji('bar');
     static::assertEquals('bar', $message->getIconEmoji());
     $message->setAttachments([$attachment]);
     static::assertEquals([$attachment], $message->getAttachments());
 }
示例#2
0
 /**
  * @param array $data
  * @example $data:
  * [
  *  "type": "channel_created",
  *  "channel": {
  *      "id": "C024BE91L",
  *      "name": "fun",
  *      "created": 1360782804,
  *      "creator": "U024BE7LH"
  *  }
  * ]
  */
 public function processChannelCreated(array $data)
 {
     $channel = $data['channel'];
     $message = new Message();
     $message->setText(sprintf('<@%s> opened channel #%s, join it <#%s>', $channel['creator'], $channel['name'], $channel['id']));
     $this->sendResponse($message, null, $GLOBALS['config']['slack']['channels']['channelCreated']);
 }
示例#3
0
 /**
  * public method to start processing the request.
  *
  * @param string $hook
  * @param string $input
  *
  * Input example:
  * {
  *   "securityToken": "a valid security token",
  *   "color": [info|ok|warning|danger|notice|#HEXCODE],
  *   "title": "Title of the message"
  *   "text": "Text of the message"
  * }
  *
  * @throws \Doctrine\DBAL\DBALException
  */
 public function process($hook, $input = 'php://input')
 {
     if (empty($GLOBALS['config']['webhook'][$hook])) {
         return;
     }
     $hookConfiguration = $GLOBALS['config']['webhook'][$hook];
     $entityBody = file_get_contents($input);
     $json = json_decode($entityBody);
     if ($hookConfiguration['securityToken'] !== $json->securityToken) {
         return;
     }
     switch ($json->color) {
         case 'info':
             $color = Message\Attachment::COLOR_INFO;
             break;
         case 'ok':
             $color = Message\Attachment::COLOR_GOOD;
             break;
         case 'warning':
             $color = Message\Attachment::COLOR_WARNING;
             break;
         case 'danger':
             $color = Message\Attachment::COLOR_DANGER;
             break;
         case 'notice':
             $color = Message\Attachment::COLOR_NOTICE;
             break;
         default:
             $color = $json->color;
             break;
     }
     $message = new Message();
     $message->setText(' ');
     $attachment = new Message\Attachment();
     $attachment->setColor($color);
     $attachment->setTitle($json->title);
     $attachment->setText($json->text);
     $attachment->setFallback($json->text);
     $message->addAttachment($attachment);
     foreach ($hookConfiguration['channels'] as $channel) {
         $this->postToSlack($message, $channel);
     }
 }
示例#4
0
 /**
  * @param Message $payload
  * @param string  $channel
  *
  * @throws \Doctrine\DBAL\DBALException
  */
 protected function postToSlack(Message $payload, $channel)
 {
     $data = [];
     $data['unfurl_links'] = false;
     $data['unfurl_media'] = false;
     $data['parse'] = 'none';
     $data['text'] = $payload->getText();
     $data['channel'] = $channel;
     $attachments = $payload->getAttachments();
     if (count($attachments)) {
         $data['attachments'] = array();
     }
     /** @var \T3Bot\Slack\Message\Attachment $attachment */
     foreach ($attachments as $attachment) {
         $data['attachments'][] = Attachment::fromData(['title' => $attachment->getTitle(), 'title_link' => $attachment->getTitleLink(), 'text' => $attachment->getText(), 'fallback' => $attachment->getFallback(), 'color' => $attachment->getColor(), 'pretext' => $attachment->getPretext(), 'author_name' => $attachment->getAuthorName(), 'author_icon' => $attachment->getAuthorIcon(), 'author_link' => $attachment->getAuthorLink(), 'image_url' => $attachment->getImageUrl(), 'thumb_url' => $attachment->getThumbUrl()]);
     }
     if (!empty($GLOBALS['config']['slack']['botAvatar'])) {
         /* @noinspection PhpUndefinedFieldInspection */
         $data['icon_emoji'] = $GLOBALS['config']['slack']['botAvatar'];
     }
     // since the bot is a real bot, we can't push directly to slack
     // lets put the message into our messages pool
     $this->addMessageToQueue($data);
 }
示例#5
0
 /**
  * build a review message.
  *
  * @param \stdClass $item the review item
  *
  * @return Message
  */
 protected function buildReviewMessage($item)
 {
     $created = substr($item->created, 0, 19);
     $branch = $item->branch;
     $text = '';
     $message = new Message();
     $attachment = new Message\Attachment();
     switch ($GLOBALS['config']['projectPhase']) {
         case self::PROJECT_PHASE_STABILISATION:
             $attachment->setColor(Message\Attachment::COLOR_WARNING);
             $attachment->setPretext(':warning: *stabilisation phase*');
             break;
         case self::PROJECT_PHASE_SOFT_FREEZE:
             $attachment->setColor(Message\Attachment::COLOR_DANGER);
             $attachment->setPretext(':no_entry: *soft merge freeze*');
             break;
         case self::PROJECT_PHASE_CODE_FREEZE:
             $attachment->setColor(Message\Attachment::COLOR_DANGER);
             $attachment->setPretext(':no_entry: *merge freeze*');
             break;
         case self::PROJECT_PHASE_FEATURE_FREEZE:
             $attachment->setColor(Message\Attachment::COLOR_DANGER);
             $attachment->setPretext(':no_entry: *FEATURE FREEZE*');
             break;
         case self::PROJECT_PHASE_DEVELOPMENT:
         default:
             $attachment->setColor(Message\Attachment::COLOR_NOTICE);
             break;
     }
     $attachment->setTitle($item->subject);
     $attachment->setTitleLink('https://review.typo3.org/' . $item->_number);
     $text .= 'Branch: ' . $this->bold($branch) . ' | :calendar: ' . $this->bold($created) . ' | ID: ' . $this->bold($item->_number) . "\n";
     $text .= '<https://review.typo3.org/' . $item->_number . '|:arrow_right: Goto Review>';
     $attachment->setText($text);
     $attachment->setFallback($text);
     $message->setText(' ');
     $message->addAttachment($attachment);
     return $message;
 }
 /**
  * public method to start processing the request
  *
  * @param string $hook
  */
 public function process($hook)
 {
     $entityBody = file_get_contents('php://input');
     $json = json_decode($entityBody);
     if ($GLOBALS['config']['gerrit']['webhookToken'] != $json->token) {
         exit;
     }
     if ($json->project !== 'Packages/TYPO3.CMS') {
         // only core patches please...
         exit;
     }
     $patchId = (int) str_replace('http://review.typo3.org/', '', $json->{'change-url'});
     $patchSet = intval($json->patchset);
     $branch = $json->branch;
     switch ($hook) {
         case 'patchset-created':
             if ($patchSet == 1 && $branch == 'master') {
                 foreach ($GLOBALS['config']['gerrit'][$hook]['channels'] as $channel) {
                     $item = $this->queryGerrit('change:' . $patchId);
                     $item = $item[0];
                     $created = substr($item->created, 0, 19);
                     $message = new Message();
                     $message->setText(' ');
                     $attachment = new Message\Attachment();
                     $attachment->setColor(Message\Attachment::COLOR_NOTICE);
                     $attachment->setTitle('[NEW] ' . $item->subject);
                     $attachment->setAuthorName($item->owner->name);
                     $text = "Branch: *{$branch}* | :calendar: _{$created}_ | ID: {$item->_number}\n";
                     $text .= ":link: <https://review.typo3.org/{$item->_number}|Review now>";
                     $attachment->setText($text);
                     $attachment->setFallback($text);
                     $message->addAttachment($attachment);
                     $payload = json_decode($message->getJSON());
                     $payload->channel = $channel;
                     $this->postToSlack($payload);
                 }
             }
             break;
         case 'change-merged':
             foreach ($GLOBALS['config']['gerrit'][$hook]['channels'] as $channel) {
                 $item = $this->queryGerrit('change:' . $patchId);
                 $item = $item[0];
                 $created = substr($item->created, 0, 19);
                 $message = new Message();
                 $message->setText(' ');
                 $attachment = new Message\Attachment();
                 $attachment->setColor(Message\Attachment::COLOR_GOOD);
                 $attachment->setTitle(':white_check_mark: [MERGED] ' . $item->subject);
                 $attachment->setAuthorName($item->owner->name);
                 $text = "Branch: {$branch} | :calendar: {$created} | ID: {$item->_number}\n";
                 $text .= ":link: <https://review.typo3.org/{$item->_number}|Goto Review>";
                 $attachment->setText($text);
                 $attachment->setFallback($text);
                 $message->addAttachment($attachment);
                 $payload = json_decode($message->getJSON());
                 $payload->channel = $channel;
                 $this->postToSlack($payload);
             }
             break;
         default:
             exit;
             break;
     }
 }
示例#7
0
 /**
  * public method to start processing the request.
  *
  * @param string $hook
  * @param string $input
  *
  * @throws \Doctrine\DBAL\DBALException
  */
 public function process($hook, $input = 'php://input')
 {
     $entityBody = file_get_contents($input);
     $json = json_decode($entityBody);
     if ($GLOBALS['config']['gerrit']['webhookToken'] !== $json->token) {
         return;
     }
     if ($json->project !== 'Packages/TYPO3.CMS') {
         // only core patches please...
         return;
     }
     $patchId = (int) str_replace('https://review.typo3.org/', '', $json->{'change-url'});
     $patchSet = property_exists($json, 'patchset') ? (int) $json->patchset : 0;
     $commit = $json->commit;
     $branch = $json->branch;
     switch ($hook) {
         case 'patchset-created':
             if ($patchSet === 1 && $branch === 'master') {
                 /** @var array $item */
                 $item = $this->queryGerrit('change:' . $patchId);
                 $item = $item[0];
                 /* @var \stdClass $item */
                 $created = substr($item->created, 0, 19);
                 $message = new Message();
                 $message->setText(' ');
                 $attachment = new Message\Attachment();
                 $attachment->setColor(Message\Attachment::COLOR_NOTICE);
                 $attachment->setTitle('[NEW] ' . $item->subject);
                 $text = "Branch: *{$branch}* | :calendar: _{$created}_ | ID: {$item->_number}\n";
                 $text .= ":link: <https://review.typo3.org/{$item->_number}|Review now>";
                 $attachment->setText($text);
                 $attachment->setFallback($text);
                 $message->addAttachment($attachment);
                 foreach ($GLOBALS['config']['gerrit'][$hook]['channels'] as $channel) {
                     $this->postToSlack($message, $channel);
                 }
             }
             break;
         case 'change-merged':
             /** @var array $item */
             $item = $this->queryGerrit('change:' . $patchId);
             $item = $item[0];
             /* @var \stdClass $item */
             $created = substr($item->created, 0, 19);
             $message = new Message();
             $message->setText(' ');
             $attachment = new Message\Attachment();
             $attachment->setColor(Message\Attachment::COLOR_GOOD);
             $attachment->setTitle(':white_check_mark: [MERGED] ' . $item->subject);
             $text = "Branch: {$branch} | :calendar: {$created} | ID: {$item->_number}\n";
             $text .= ":link: <https://review.typo3.org/{$item->_number}|Goto Review>";
             $attachment->setText($text);
             $attachment->setFallback($text);
             $message->addAttachment($attachment);
             foreach ($GLOBALS['config']['gerrit'][$hook]['channels'] as $channel) {
                 $this->postToSlack($message, $channel);
             }
             $files = $this->getFilesForPatch($patchId, $commit);
             $rstFiles = array();
             if (is_array($files)) {
                 foreach ($files as $fileName => $changeInfo) {
                     if ($this->endsWith(strtolower($fileName), '.rst')) {
                         $rstFiles[$fileName] = $changeInfo;
                     }
                 }
             }
             if (count($rstFiles) > 0) {
                 $message = new Message();
                 $message->setText(' ');
                 foreach ($rstFiles as $fileName => $changeInfo) {
                     $attachment = new Message\Attachment();
                     $status = !empty($changeInfo['status']) ? $changeInfo['status'] : null;
                     switch ($status) {
                         case 'A':
                             $attachment->setColor(Message\Attachment::COLOR_GOOD);
                             $attachment->setTitle('A new documentation file has been added');
                             break;
                         case 'D':
                             $attachment->setColor(Message\Attachment::COLOR_WARNING);
                             $attachment->setTitle('A documentation file has been removed');
                             break;
                         default:
                             $attachment->setColor(Message\Attachment::COLOR_WARNING);
                             $attachment->setTitle('A documentation file has been updated');
                             break;
                     }
                     $text = ':link: <https://git.typo3.org/Packages/TYPO3.CMS.git/blob/HEAD:/' . $fileName . '|' . $fileName . '>';
                     $attachment->setText($text);
                     $attachment->setFallback($text);
                     $message->addAttachment($attachment);
                 }
                 foreach ($GLOBALS['config']['gerrit']['rst-merged']['channels'] as $channel) {
                     $this->postToSlack($message, $channel);
                 }
             }
             break;
     }
 }