1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* T3Bot. |
4
|
|
|
* |
5
|
|
|
* @author Frank Nägler <[email protected]> |
6
|
|
|
* |
7
|
|
|
* @link http://www.t3bot.de |
8
|
|
|
* @link http://wiki.typo3.org/T3Bot |
9
|
|
|
*/ |
10
|
|
|
namespace T3Bot\Controller; |
11
|
|
|
|
12
|
|
|
use Doctrine\DBAL\Configuration; |
13
|
|
|
use Doctrine\DBAL\DriverManager; |
14
|
|
|
use T3Bot\Slack\Message; |
15
|
|
|
use T3Bot\Traits\SlackTrait; |
16
|
|
|
|
17
|
|
|
/** |
18
|
|
|
* Class AbstractHookController. |
19
|
|
|
*/ |
20
|
|
|
abstract class AbstractHookController |
21
|
|
|
{ |
22
|
|
|
use SlackTrait; |
23
|
|
|
|
24
|
|
|
/** |
25
|
|
|
* @var array |
26
|
|
|
*/ |
27
|
|
|
protected $configuration; |
28
|
|
|
|
29
|
|
|
/** |
30
|
|
|
* GerritHookController constructor. |
31
|
|
|
* |
32
|
|
|
* @param array $configuration |
33
|
|
|
*/ |
34
|
22 |
|
public function __construct(array $configuration = []) |
35
|
|
|
{ |
36
|
22 |
|
$this->configuration = $configuration; |
37
|
22 |
|
} |
38
|
|
|
|
39
|
|
|
/** |
40
|
|
|
* public method to start processing the request. |
41
|
|
|
* |
42
|
|
|
* @param string $hook |
43
|
|
|
* @param string $input |
44
|
|
|
* |
45
|
|
|
* @throws \Doctrine\DBAL\DBALException |
46
|
|
|
*/ |
47
|
|
|
abstract public function process($hook, $input = 'php://input'); |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* @param Message $payload |
51
|
|
|
* @param string $channel |
52
|
|
|
* |
53
|
|
|
* @throws \Doctrine\DBAL\DBALException |
54
|
|
|
*/ |
55
|
3 |
|
protected function postToSlack(Message $payload, $channel) |
56
|
|
|
{ |
57
|
3 |
|
$data = $this->getBaseDataArray($payload->getText(), $channel); |
58
|
3 |
|
$attachments = $payload->getAttachments(); |
59
|
3 |
View Code Duplication |
if (count($attachments)) { |
|
|
|
|
60
|
3 |
|
$data['attachments'] = []; |
61
|
3 |
|
foreach ($attachments as $attachment) { |
62
|
3 |
|
$data['attachments'][] = $this->buildAttachment($attachment); |
63
|
|
|
} |
64
|
|
|
} |
65
|
3 |
|
if (!empty($this->configuration['slack']['botAvatar'])) { |
66
|
3 |
|
$data['icon_emoji'] = $this->configuration['slack']['botAvatar']; |
67
|
|
|
} |
68
|
3 |
|
$this->addMessageToQueue($data); |
69
|
3 |
|
} |
70
|
|
|
|
71
|
|
|
/** |
72
|
|
|
* @param array $data |
73
|
|
|
* |
74
|
|
|
* @throws \Doctrine\DBAL\DBALException |
75
|
|
|
*/ |
76
|
2 |
|
protected function addMessageToQueue(array $data) |
77
|
|
|
{ |
78
|
2 |
|
$config = new Configuration(); |
79
|
2 |
|
$db = DriverManager::getConnection($this->configuration['db'], $config); |
80
|
2 |
|
$db->insert('messages', ['message' => json_encode($data)]); |
81
|
2 |
|
} |
82
|
|
|
|
83
|
|
|
/** |
84
|
|
|
* @param string $haystack |
85
|
|
|
* @param string $needle |
86
|
|
|
* |
87
|
|
|
* @return bool |
88
|
|
|
*/ |
89
|
5 |
|
protected function endsWith($haystack, $needle) : bool |
90
|
|
|
{ |
91
|
|
|
// search forward starting from end minus needle length characters |
92
|
5 |
|
return $needle === '' || ( |
93
|
5 |
|
($temp = strlen($haystack) - strlen($needle)) >= 0 |
94
|
5 |
|
&& strpos($haystack, $needle, $temp) !== false |
95
|
|
|
); |
96
|
|
|
} |
97
|
|
|
} |
98
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.