/** * @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()); }
/** * @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']); }
/** * 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); } }
/** * @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); }
/** * 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; } }
/** * 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; } }