diff --git a/README.markdown b/README.markdown
index fd34c6fba..32a67c48f 100644
--- a/README.markdown
+++ b/README.markdown
@@ -97,6 +97,7 @@ Documentation
- [Bitbucket webhooks](docs/bitbucket-webhooks.markdown)
- [Github webhooks](docs/github-webhooks.markdown)
- [Gitlab webhooks](docs/gitlab-webhooks.markdown)
+- [Hipchat](docs/hipchat.markdown)
- [Slack](docs/slack.markdown)
#### More
diff --git a/app/Controller/Config.php b/app/Controller/Config.php
index 57f586ae3..bb6e860a9 100644
--- a/app/Controller/Config.php
+++ b/app/Controller/Config.php
@@ -44,7 +44,7 @@ class Config extends Base
$values += array('subtask_restriction' => 0, 'subtask_time_tracking' => 0, 'subtask_forecast' => 0);
}
else if ($redirect === 'integrations') {
- $values += array('integration_slack_webhook' => 0);
+ $values += array('integration_slack_webhook' => 0, 'integration_hipchat' => 0);
}
if ($this->config->save($values)) {
diff --git a/app/Core/HttpClient.php b/app/Core/HttpClient.php
index 968601529..e1d90858b 100644
--- a/app/Core/HttpClient.php
+++ b/app/Core/HttpClient.php
@@ -47,8 +47,9 @@ class HttpClient
}
$headers = array(
- 'Connection: close',
'User-Agent: '.self::HTTP_USER_AGENT,
+ 'Content-Type: application/json',
+ 'Connection: close',
);
$context = stream_context_create(array(
diff --git a/app/Integration/Hipchat.php b/app/Integration/Hipchat.php
new file mode 100644
index 000000000..036925f7f
--- /dev/null
+++ b/app/Integration/Hipchat.php
@@ -0,0 +1,53 @@
+project->getbyId($project_id);
+
+ $event['event_name'] = $event_name;
+ $event['author'] = $this->user->getFullname($this->session['user']);
+
+ $html = '
';
+ $html .= ''.$project['name'].'
';
+ $html .= $this->projectActivity->getTitle($event);
+
+ if ($this->config->get('application_url')) {
+ $html .= '
';
+ $html .= t('view the task on Kanboard').'';
+ }
+
+ $payload = array(
+ 'message' => $html,
+ 'color' => 'yellow',
+ );
+
+ $url = sprintf(
+ '%s/v2/room/%s/notification?auth_token=%s',
+ $this->config->get('integration_hipchat_api_url'),
+ $this->config->get('integration_hipchat_room_id'),
+ $this->config->get('integration_hipchat_room_token')
+ );
+
+ $this->httpClient->post($url, $payload);
+ }
+}
diff --git a/app/Locale/da_DK/translations.php b/app/Locale/da_DK/translations.php
index 9af5dcb88..a13aa3afe 100644
--- a/app/Locale/da_DK/translations.php
+++ b/app/Locale/da_DK/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/de_DE/translations.php b/app/Locale/de_DE/translations.php
index dda991c7d..1ec93d44c 100644
--- a/app/Locale/de_DE/translations.php
+++ b/app/Locale/de_DE/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/es_ES/translations.php b/app/Locale/es_ES/translations.php
index a857493fb..33c062c6f 100644
--- a/app/Locale/es_ES/translations.php
+++ b/app/Locale/es_ES/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/fi_FI/translations.php b/app/Locale/fi_FI/translations.php
index ae2382246..856914ade 100644
--- a/app/Locale/fi_FI/translations.php
+++ b/app/Locale/fi_FI/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/fr_FR/translations.php b/app/Locale/fr_FR/translations.php
index e24258922..d389b0e17 100644
--- a/app/Locale/fr_FR/translations.php
+++ b/app/Locale/fr_FR/translations.php
@@ -825,8 +825,13 @@ return array(
'Reference currency' => 'Devise de référence',
'The currency rate have been added successfully.' => 'Le taux de change a été ajouté avec succès.',
'Unable to add this currency rate.' => 'Impossible d\'ajouter ce taux de change',
- 'Send notifications to a Slack channel' => 'Envoyer des notifications sur un channel Slack',
+ 'Send notifications to a Slack channel' => 'Envoyer les notifications sur un salon de discussion Slack',
'Webhook URL' => 'URL du webhook',
'Help on Slack integration' => 'Aide sur l\'intégration avec Slack',
'%s remove the assignee of the task %s' => '%s a enlevé la personne assignée à la tâche %s',
+ 'Send notifications to Hipchat' => 'Envoyer les notifications vers Hipchat',
+ 'API URL' => 'URL de l\'api',
+ 'Room API ID or name' => 'Nom ou identifiant du salon de discussion',
+ 'Room notification token' => 'Jeton de sécurité du salon de discussion',
+ 'Help on Hipchat integration' => 'Aide sur l\'intégration avec Hipchat',
);
diff --git a/app/Locale/hu_HU/translations.php b/app/Locale/hu_HU/translations.php
index 70ab88986..297924173 100644
--- a/app/Locale/hu_HU/translations.php
+++ b/app/Locale/hu_HU/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/it_IT/translations.php b/app/Locale/it_IT/translations.php
index 5924ed0c1..e8d4c4d1f 100644
--- a/app/Locale/it_IT/translations.php
+++ b/app/Locale/it_IT/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/ja_JP/translations.php b/app/Locale/ja_JP/translations.php
index f7d225af9..52d5413d5 100644
--- a/app/Locale/ja_JP/translations.php
+++ b/app/Locale/ja_JP/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/nl_NL/translations.php b/app/Locale/nl_NL/translations.php
index 0efbc7f3f..b53f9c83c 100644
--- a/app/Locale/nl_NL/translations.php
+++ b/app/Locale/nl_NL/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/pl_PL/translations.php b/app/Locale/pl_PL/translations.php
index 97c185c3b..42a3dff73 100644
--- a/app/Locale/pl_PL/translations.php
+++ b/app/Locale/pl_PL/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/pt_BR/translations.php b/app/Locale/pt_BR/translations.php
index bca271427..b18f2143f 100644
--- a/app/Locale/pt_BR/translations.php
+++ b/app/Locale/pt_BR/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/ru_RU/translations.php b/app/Locale/ru_RU/translations.php
index 8b84fc1f6..b77960d36 100644
--- a/app/Locale/ru_RU/translations.php
+++ b/app/Locale/ru_RU/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/sr_Latn_RS/translations.php b/app/Locale/sr_Latn_RS/translations.php
index a04a31afe..0514faa4e 100644
--- a/app/Locale/sr_Latn_RS/translations.php
+++ b/app/Locale/sr_Latn_RS/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/sv_SE/translations.php b/app/Locale/sv_SE/translations.php
index b5e6a6297..dede73642 100644
--- a/app/Locale/sv_SE/translations.php
+++ b/app/Locale/sv_SE/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/th_TH/translations.php b/app/Locale/th_TH/translations.php
index f45b24cb7..86a4f79cb 100644
--- a/app/Locale/th_TH/translations.php
+++ b/app/Locale/th_TH/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/tr_TR/translations.php b/app/Locale/tr_TR/translations.php
index d46e71a42..eb9717983 100644
--- a/app/Locale/tr_TR/translations.php
+++ b/app/Locale/tr_TR/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Locale/zh_CN/translations.php b/app/Locale/zh_CN/translations.php
index b6be113d7..70175e5fb 100644
--- a/app/Locale/zh_CN/translations.php
+++ b/app/Locale/zh_CN/translations.php
@@ -827,4 +827,9 @@ return array(
// 'Webhook URL' => '',
// 'Help on Slack integration' => '',
// '%s remove the assignee of the task %s' => '',
+ // 'Send notifications to Hipchat' => '',
+ // 'API URL' => '',
+ // 'Room API ID or name' => '',
+ // 'Room notification token' => '',
+ // 'Help on Hipchat integration' => '',
);
diff --git a/app/Schema/Mysql.php b/app/Schema/Mysql.php
index dc0b8b428..f0e0d6b2b 100644
--- a/app/Schema/Mysql.php
+++ b/app/Schema/Mysql.php
@@ -6,7 +6,16 @@ use PDO;
use Core\Security;
use Model\Link;
-const VERSION = 58;
+const VERSION = 59;
+
+function version_59($pdo)
+{
+ $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)');
+ $rq->execute(array('integration_hipchat', '0'));
+ $rq->execute(array('integration_hipchat_api_url', 'https://api.hipchat.com'));
+ $rq->execute(array('integration_hipchat_room_id', ''));
+ $rq->execute(array('integration_hipchat_room_token', ''));
+}
function version_58($pdo)
{
diff --git a/app/Schema/Postgres.php b/app/Schema/Postgres.php
index ea7b84d13..f7a0453da 100644
--- a/app/Schema/Postgres.php
+++ b/app/Schema/Postgres.php
@@ -6,7 +6,16 @@ use PDO;
use Core\Security;
use Model\Link;
-const VERSION = 39;
+const VERSION = 40;
+
+function version_40($pdo)
+{
+ $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)');
+ $rq->execute(array('integration_hipchat', '0'));
+ $rq->execute(array('integration_hipchat_api_url', 'https://api.hipchat.com'));
+ $rq->execute(array('integration_hipchat_room_id', ''));
+ $rq->execute(array('integration_hipchat_room_token', ''));
+}
function version_39($pdo)
{
diff --git a/app/Schema/Sqlite.php b/app/Schema/Sqlite.php
index 1ffd94057..3ad045e6f 100644
--- a/app/Schema/Sqlite.php
+++ b/app/Schema/Sqlite.php
@@ -6,7 +6,16 @@ use Core\Security;
use PDO;
use Model\Link;
-const VERSION = 57;
+const VERSION = 58;
+
+function version_58($pdo)
+{
+ $rq = $pdo->prepare('INSERT INTO settings VALUES (?, ?)');
+ $rq->execute(array('integration_hipchat', '0'));
+ $rq->execute(array('integration_hipchat_api_url', 'https://api.hipchat.com'));
+ $rq->execute(array('integration_hipchat_room_id', ''));
+ $rq->execute(array('integration_hipchat_room_token', ''));
+}
function version_57($pdo)
{
diff --git a/app/ServiceProvider/ClassProvider.php b/app/ServiceProvider/ClassProvider.php
index 5f6298aa7..6a12ea5a9 100644
--- a/app/ServiceProvider/ClassProvider.php
+++ b/app/ServiceProvider/ClassProvider.php
@@ -75,6 +75,7 @@ class ClassProvider implements ServiceProviderInterface
'GitlabWebhook',
'GithubWebhook',
'BitbucketWebhook',
+ 'Hipchat',
'SlackWebhook',
)
);
diff --git a/app/Subscriber/ProjectActivitySubscriber.php b/app/Subscriber/ProjectActivitySubscriber.php
index d2e851665..42314637f 100644
--- a/app/Subscriber/ProjectActivitySubscriber.php
+++ b/app/Subscriber/ProjectActivitySubscriber.php
@@ -42,14 +42,32 @@ class ProjectActivitySubscriber extends Base implements EventSubscriberInterface
$values
);
- if ($this->config->get('integration_slack_webhook') == 1) {
- $this->slackWebhook->notify(
- $values['task']['project_id'],
- $values['task']['id'],
- $event_name,
- $values
- );
- }
+ $this->sendSlackNotification($event_name, $values);
+ $this->sendHipchatNotification($event_name, $values);
+ }
+ }
+
+ private function sendSlackNotification($event_name, array $values)
+ {
+ if ($this->config->get('integration_slack_webhook') == 1) {
+ $this->slackWebhook->notify(
+ $values['task']['project_id'],
+ $values['task']['id'],
+ $event_name,
+ $values
+ );
+ }
+ }
+
+ private function sendHipchatNotification($event_name, array $values)
+ {
+ if ($this->config->get('integration_hipchat') == 1) {
+ $this->hipchat->notify(
+ $values['task']['project_id'],
+ $values['task']['id'],
+ $event_name,
+ $values
+ );
}
}
diff --git a/app/Template/config/integrations.php b/app/Template/config/integrations.php
index 104ebc167..6f90e0ab4 100644
--- a/app/Template/config/integrations.php
+++ b/app/Template/config/integrations.php
@@ -6,6 +6,22 @@
= $this->formCsrf() ?>
+