@@ -29,35 +29,37 @@ class Slack extends Plugin
2929
3030 private static $ availableParameters = array (
3131 self ::SLACK_CHANNEL_ID_PARAMETER => true ,
32- ScheduledReports::EVOLUTION_GRAPH_PARAMETER => false ,
33- ScheduledReports::DISPLAY_FORMAT_PARAMETER => true ,
32+ ScheduledReports::EVOLUTION_GRAPH_PARAMETER => false ,
33+ ScheduledReports::DISPLAY_FORMAT_PARAMETER => true ,
3434 );
3535
3636 private static $ managedReportTypes = array (
3737 self ::SLACK_TYPE => 'plugins/Slack/images/slack.png '
3838 );
3939
4040 private static $ managedReportFormats = array (
41- ReportRenderer::PDF_FORMAT => 'plugins/Morpheus/icons/dist/plugins/pdf.png ' ,
42- ReportRenderer::CSV_FORMAT => 'plugins/Morpheus/images/export.png ' ,
43- ReportRenderer::TSV_FORMAT => 'plugins/Morpheus/images/export.png ' ,
41+ ReportRenderer::PDF_FORMAT => 'plugins/Morpheus/icons/dist/plugins/pdf.png ' ,
42+ ReportRenderer::CSV_FORMAT => 'plugins/Morpheus/images/export.png ' ,
43+ ReportRenderer::TSV_FORMAT => 'plugins/Morpheus/images/export.png ' ,
4444 );
4545
4646 public function registerEvents ()
4747 {
4848 return [
49- 'ScheduledReports.getReportParameters ' => 'getReportParameters ' ,
49+ 'ScheduledReports.getReportParameters ' => 'getReportParameters ' ,
5050 'ScheduledReports.validateReportParameters ' => 'validateReportParameters ' ,
51- 'ScheduledReports.getReportMetadata ' => 'getReportMetadata ' ,
52- 'ScheduledReports.getReportTypes ' => 'getReportTypes ' ,
53- 'ScheduledReports.getReportFormats ' => 'getReportFormats ' ,
54- 'ScheduledReports.getRendererInstance ' => 'getRendererInstance ' ,
55- 'ScheduledReports.getReportRecipients ' => 'getReportRecipients ' ,
56- 'ScheduledReports.processReports ' => 'processReports ' ,
57- 'ScheduledReports.allowMultipleReports ' => 'allowMultipleReports ' ,
58- 'ScheduledReports.sendReport ' => 'sendReport ' ,
51+ 'ScheduledReports.getReportMetadata ' => 'getReportMetadata ' ,
52+ 'ScheduledReports.getReportTypes ' => 'getReportTypes ' ,
53+ 'ScheduledReports.getReportFormats ' => 'getReportFormats ' ,
54+ 'ScheduledReports.getRendererInstance ' => 'getRendererInstance ' ,
55+ 'ScheduledReports.getReportRecipients ' => 'getReportRecipients ' ,
56+ 'ScheduledReports.processReports ' => 'processReports ' ,
57+ 'ScheduledReports.allowMultipleReports ' => 'allowMultipleReports ' ,
58+ 'ScheduledReports.sendReport ' => 'sendReport ' ,
5959 'Template.reportParametersScheduledReports ' => 'templateReportParametersScheduledReports ' ,
6060 'Translate.getClientSideTranslationKeys ' => 'getClientSideTranslationKeys ' ,
61+ 'CustomAlerts.validateReportParameters ' => 'validateCustomAlertReportParameters ' ,
62+ 'CustomAlerts.sendNewAlerts ' => 'sendNewAlerts ' ,
6163 ];
6264 }
6365
@@ -108,7 +110,7 @@ public function validateReportParameters(&$parameters, $reportType)
108110
109111 public function getReportMetadata (&$ availableReportMetadata , $ reportType , $ idSite )
110112 {
111- if (! self ::isSlackEvent ($ reportType )) {
113+ if (!self ::isSlackEvent ($ reportType )) {
112114 return ;
113115 }
114116
@@ -140,7 +142,7 @@ public function getReportParameters(&$availableParameters, $reportType)
140142
141143 public function processReports (&$ processedReports , $ reportType , $ outputType , $ report )
142144 {
143- if (! self ::isSlackEvent ($ reportType )) {
145+ if (!self ::isSlackEvent ($ reportType )) {
144146 return ;
145147 }
146148
@@ -153,7 +155,7 @@ public function processReports(&$processedReports, $reportType, $outputType, $re
153155
154156 public function getRendererInstance (&$ reportRenderer , $ reportType , $ outputType , $ report )
155157 {
156- if (! self ::isSlackEvent ($ reportType )) {
158+ if (!self ::isSlackEvent ($ reportType )) {
157159 return ;
158160 }
159161
@@ -202,7 +204,7 @@ public function sendReport(
202204 $ period ,
203205 $ force
204206 ) {
205- if (! self ::isSlackEvent ($ reportType )) {
207+ if (!self ::isSlackEvent ($ reportType )) {
206208 return ;
207209 }
208210 $ logger = StaticContainer::get (LoggerInterface::class);
@@ -275,6 +277,75 @@ public function uninstall()
275277 return ;
276278 }
277279
280+ public function validateCustomAlertReportParameters ($ parameters , $ alertMedium )
281+ {
282+ if ($ alertMedium === self ::SLACK_TYPE && empty ($ parameters [self ::SLACK_CHANNEL_ID_PARAMETER ])) {
283+ throw new \Exception (Piwik::translate ('Slack_SlackChannelIdRequiredErrorMessage ' ));
284+ }
285+ }
286+
287+ public function sendNewAlerts ($ triggeredAlerts ): void
288+ {
289+ if (!empty ($ triggeredAlerts )) {
290+ $ enrichTriggerAlerts = new EnrichTriggeredAlerts ();
291+ $ triggeredAlerts = $ enrichTriggerAlerts ->enrichTriggeredAlerts ($ triggeredAlerts );
292+ $ settings = StaticContainer::get (SystemSettings::class);
293+ $ token = $ settings ->slackOauthToken ->getValue ();
294+ if (empty ($ token )) {
295+ return ;
296+ }
297+ $ slackApi = new SlackApi ($ token );
298+ $ groupedAlerts = $ this ->groupAlertsByChannelId ($ triggeredAlerts );
299+ foreach ($ groupedAlerts as $ slackChannelId => $ alert ) {
300+ if (!$ slackApi ->sendMessage (implode ("\n" , $ alert ['message ' ]), $ slackChannelId )) {
301+ $ logger = StaticContainer::get (LoggerInterface::class);
302+ $ logger ->debug ('Slack alert failed for following alerts: ' . implode ("\n" , $ alert ['name ' ]));
303+ }
304+ }
305+ }
306+ }
307+
308+ private function groupAlertsByChannelId (array $ alerts ): array
309+ {
310+ $ groupedAlerts = [];
311+ foreach ($ alerts as $ alert ) {
312+ if (!in_array (self ::SLACK_TYPE , $ alert ['report_mediums ' ]) || empty ($ alert ['slack_channel_id ' ])) {
313+ continue ;
314+ }
315+ $ metric = !empty ($ alert ['reportMetric ' ]) ? $ alert ['reportMetric ' ] : $ alert ['metric ' ];
316+ $ reportName = !empty ($ alert ['reportName ' ]) ? $ alert ['reportName ' ] : $ alert ['report ' ];
317+ $ groupedAlerts [$ alert ['slack_channel_id ' ]]['message ' ][] = $ this ->getAlertMessage ($ alert , $ metric , $ reportName );
318+ $ groupedAlerts [$ alert ['slack_channel_id ' ]]['name ' ][] = $ alert ['name ' ];
319+ }
320+
321+ return $ groupedAlerts ;
322+ }
323+
324+ public function getAlertMessage (array $ alert , string $ metric , string $ reportName ): string
325+ {
326+ return Piwik::translate ('Slack_SlackAlertContent ' , [$ alert ['name ' ], $ alert ['siteName ' ], $ metric , $ reportName , $ this ->transformAlertCondition ($ alert )]);
327+ }
328+
329+ private function transformAlertCondition (array $ alert ): string
330+ {
331+ switch ($ alert ['metric_condition ' ]) {
332+ case 'less_than ' :
333+ return Piwik::translate ('CustomAlerts_ValueIsLessThan ' , [$ alert ['metric_matched ' ], $ alert ['value_new ' ]]);
334+ case 'greater_than ' :
335+ return Piwik::translate ('CustomAlerts_ValueIsGreaterThan ' , [$ alert ['metric_matched ' ], $ alert ['value_new ' ]]);
336+ case 'decrease_more_than ' :
337+ return Piwik::translate ('CustomAlerts_ValueDecreasedMoreThan ' , [$ alert ['metric_matched ' ], $ alert ['value_old ' ] ?? '- ' , $ alert ['value_new ' ]]);
338+ case 'increase_more_than ' :
339+ return Piwik::translate ('CustomAlerts_ValueIncreasedMoreThan ' , [$ alert ['metric_matched ' ], $ alert ['value_old ' ] ?? '- ' , $ alert ['value_new ' ]]);
340+ case 'percentage_decrease_more_than ' :
341+ return Piwik::translate ('CustomAlerts_ValuePercentageDecreasedMoreThan ' , [$ alert ['metric_matched ' ], $ alert ['value_old ' ] ?? '- ' , $ alert ['value_new ' ]]);
342+ case 'percentage_increase_more_than ' :
343+ return Piwik::translate ('CustomAlerts_ValuePercentageIncreasedMoreThan ' , [$ alert ['metric_matched ' ], $ alert ['value_old ' ] ?? '- ' , $ alert ['value_new ' ]]);
344+ }
345+
346+ return '' ;
347+ }
348+
278349 private function reportAlreadySent ($ report , Period $ period )
279350 {
280351 $ key = ScheduledReports::OPTION_KEY_LAST_SENT_DATERANGE . $ report ['idreport ' ];
0 commit comments