diff --git a/static/images/integrations/intercom/001.png b/static/images/integrations/intercom/001.png index 336351cf9b..858a085129 100644 Binary files a/static/images/integrations/intercom/001.png and b/static/images/integrations/intercom/001.png differ diff --git a/zerver/webhooks/intercom/doc.md b/zerver/webhooks/intercom/doc.md index f5a29b5bad..4a4c132aea 100644 --- a/zerver/webhooks/intercom/doc.md +++ b/zerver/webhooks/intercom/doc.md @@ -1,32 +1,19 @@ -{!create-stream.md!} +Get Intercom notifications in Zulip! -{!create-bot-construct-url.md!} +1. {!create-stream.md!} -Intercom will use the `intercom` stream by default if no stream is given -in the URL. Make sure the selected stream exists in Zulip. +1. {!create-bot-construct-url-indented.md!} -**Follow these steps:** +1. Go to your Intercom account's **Settings** page and click on **Developers** + on the left sidebar. Click on **Developer Hub** and click **New app**. -1. Go to the Integrations Page of your Intercom Console. +1. Set **App name** to a name of your choice, such as `Zulip Webhook`. Set + **Workspace** to the Intercom workspace of your choice, and click + **Create app**. -2. Find and select the `Zapier` integration option. - -3. Create an account on `Zapier` if you haven't -already. Click on **Explore Intercom on Zapier!**. - -4. Select **Make A ZAP**. Choose `Intercom `in the apps section and -`Webhooks` in the built-in apps section. - -5. Authenticate with your Intercom account to connect it with -`Zapier`. - -6. Select the actions which will trigger the webhook. - -7. Select **POST** on the page that says **Webhooks by Zapier Action**, and -click **Continue**. - -8. In the **URL** field, enter the URL constructed above. Select `JSON` -for **Payload Type** and click **Continue**: +1. Click on **Webhooks** on the left sidebar. Set **Your request endpoint URL** + to the URL constructed above. Select the topics you'd like to be notified + about, and click **Save**. {!congrats.md!} diff --git a/zerver/webhooks/intercom/fixtures/company_created.json b/zerver/webhooks/intercom/fixtures/company_created.json new file mode 100644 index 0000000000..b4bb1a1fe4 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/company_created.json @@ -0,0 +1,33 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "company", + "id": "5c96b2c0d1c4c1a2d455b937", + "company_id": "5c96b2c0d1c4c1a2d455b936-qualification-company", + "app_id": "i6wc9ipe", + "name": "Kandra Labs", + "plan_id": null, + "remote_created_at": null, + "created_at": "2019-03-23T22:27:12.078Z", + "updated_at": "2019-03-23T22:27:12.147Z", + "last_request_at": "2019-03-23T22:20:52.453Z", + "monthly_spend": 0, + "session_count": 0, + "user_count": 1, + "tag_ids": [], + "custom_attributes": {} + } + }, + "links": {}, + "id": "notif_1126b848-48b0-4bbb-8106-3df9d42f1a90", + "topic": "company.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553380032, + "created_at": 1553380032, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/contact_added_email.json b/zerver/webhooks/intercom/fixtures/contact_added_email.json new file mode 100644 index 0000000000..5c53ce4c97 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/contact_added_email.json @@ -0,0 +1,78 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "contact", + "id": "5c96b122177026171b401e20", + "user_id": "8f9ef493-c5f9-4817-895d-874c3704ea49", + "anonymous": true, + "email": "jerryguitarist@gmail.com", + "phone": null, + "name": null, + "pseudonym": "Azure Bus from St. John's", + "avatar": { + "type": "avatar", + "image_url": null + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": { + "type": "location_data", + "city_name": "St. John's", + "continent_code": "NA", + "country_name": "Canada", + "postal_code": "A1B", + "region_name": "Newfoundland and Labrador", + "timezone": "America/St_Johns", + "country_code": "CAN", + "latitude": null, + "longitude": null + }, + "last_request_at": "2019-03-23T22:20:52.453+00:00", + "created_at": "2019-03-23T22:20:18.253+00:00", + "remote_created_at": null, + "signed_up_at": null, + "updated_at": "2019-03-23T22:21:46.437+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + } + }, + "links": {}, + "id": "notif_0cdd6657-8227-439f-899e-957646831785", + "topic": "contact.added_email", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553379706, + "created_at": 1553379706, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/contact_created.json b/zerver/webhooks/intercom/fixtures/contact_created.json new file mode 100644 index 0000000000..e32f7fb064 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/contact_created.json @@ -0,0 +1,78 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "contact", + "id": "5c96b122177026171b401e20", + "user_id": "8f9ef493-c5f9-4817-895d-874c3704ea49", + "anonymous": true, + "email": "aaron@zulip.com", + "phone": null, + "name": null, + "pseudonym": "Azure Bus from St. John's", + "avatar": { + "type": "avatar", + "image_url": "https://static.intercomassets.com/app/pseudonym_avatars_2019/azure-bus.png" + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": { + "type": "location_data", + "city_name": "St. John's", + "continent_code": "NA", + "country_name": "Canada", + "postal_code": "A1B", + "region_name": "Newfoundland and Labrador", + "timezone": "America/St_Johns", + "country_code": "CAN", + "latitude": null, + "longitude": null + }, + "last_request_at": "2019-03-23T22:20:52.453+00:00", + "created_at": "2019-03-23T22:20:18.253+00:00", + "remote_created_at": null, + "signed_up_at": null, + "updated_at": "2019-03-23T22:20:52.000Z", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + } + }, + "links": {}, + "id": "notif_dc69e41e-58c6-49d0-8d36-69669db7fc67", + "topic": "contact.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553379652, + "created_at": 1553379652, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/contact_signed_up.json b/zerver/webhooks/intercom/fixtures/contact_signed_up.json new file mode 100644 index 0000000000..a198357e52 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/contact_signed_up.json @@ -0,0 +1,92 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "user", + "id": "5c96bcd732ba0a1531c0264c", + "user_id": null, + "anonymous": false, + "email": "iago@zulip.com", + "phone": null, + "name": null, + "pseudonym": "Lilac Raindrop from St. John's", + "avatar": { + "type": "avatar", + "image_url": null + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": { + "type": "location_data", + "city_name": "St. John's", + "continent_code": "NA", + "country_name": "Canada", + "postal_code": "A1B", + "region_name": "Newfoundland and Labrador", + "timezone": "America/St_Johns", + "country_code": "CAN", + "latitude": null, + "longitude": null + }, + "last_request_at": "2019-03-23T23:14:41.517+00:00", + "created_at": "2019-03-23T23:10:15.062+00:00", + "remote_created_at": "2019-03-26T23:04:14.500+00:00", + "signed_up_at": "2019-03-26T23:04:14.500+00:00", + "updated_at": "2019-03-26T23:04:14.634+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [ + { + "type": "tag", + "id": "2525085" + } + ] + }, + "segments": { + "type": "segment.list", + "segments": [ + { + "type": "segment", + "id": "5ac7ad3ed9cd4bd75b1575e0" + }, + { + "type": "segment", + "id": "5ac7ad3ed9cd4bd75b1575e1" + } + ] + }, + "custom_attributes": {}, + "referrer": "http://localhost:9991/devlogin/", + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + } + }, + "links": {}, + "id": "notif_ed7d1f52-8a8e-4389-b715-ab7d5c027354", + "topic": "contact.signed_up", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553641454, + "created_at": 1553641454, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/contact_tag_created.json b/zerver/webhooks/intercom/fixtures/contact_tag_created.json new file mode 100644 index 0000000000..2ba4b81915 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/contact_tag_created.json @@ -0,0 +1,113 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"contact_tag", + "created_at":1553291522, + "tag":{ + "type":"tag", + "id":"2525085", + "name":"developer" + }, + "contact":{ + "type":"contact", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "anonymous":true, + "email":"jerryguitarist@gmail.com", + "phone":"+17093452342", + "name":"Eeshan Garg", + "pseudonym":"Rose Poodle from St. John's", + "avatar":{ + "type":"avatar", + "image_url":"https://img.fullcontact.com/static/85ce413bcdac4cec3cfdb3a8da530f8b_8a853b478c3122d7e4ec9e14f81d9a3d9ea9da198d85c1985efc2403fa6bdb0c" + }, + "app_id":"i6wc9ipe", + "companies":{ + "type":"company.list", + "companies":[ + { + "type":"company", + "company_id":"5c9555b50af2951cc897b79a-qualification-company", + "id":"5c9555b50af2951cc897b79b", + "name":"Kandra Labs" + } + ] + }, + "location_data":{ + "type":"location_data", + "city_name":"St. John's", + "continent_code":"NA", + "country_name":"Canada", + "postal_code":"A1B", + "region_name":"Newfoundland and Labrador", + "timezone":"America/St_Johns", + "country_code":"CAN", + "latitude":null, + "longitude":null + }, + "last_request_at":"2019-03-22T21:42:36.634+00:00", + "created_at":"2019-03-22T21:29:47.980+00:00", + "remote_created_at":null, + "signed_up_at":null, + "updated_at":"2019-03-22T21:52:02.210+00:00", + "session_count":0, + "social_profiles":{ + "type":"social_profile.list", + "social_profiles":[ + { + "type":"social_profile", + "name":"github", + "id":null, + "username":"eeshangarg", + "url":"https://github.com/eeshangarg" + } + ] + }, + "unsubscribed_from_emails":false, + "marked_email_as_spam":false, + "has_hard_bounced":false, + "tags":{ + "type":"tag.list", + "tags":[ + { + "type":"tag", + "id":"2525085" + } + ] + }, + "segments":{ + "type":"segment.list", + "segments":[ + + ] + }, + "custom_attributes":{ + + }, + "referrer":null, + "utm_campaign":null, + "utm_content":null, + "utm_medium":null, + "utm_source":null, + "utm_term":null, + "do_not_track":null, + "last_seen_ip":null, + "user_agent_data":null + } + } + }, + "links":{ + + }, + "id":"notif_cac9735a-d7a1-4425-8b8b-c45cdf915892", + "topic":"contact.tag.created", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291522, + "created_at":1553291522, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/contact_tag_deleted.json b/zerver/webhooks/intercom/fixtures/contact_tag_deleted.json new file mode 100644 index 0000000000..3e15639ce5 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/contact_tag_deleted.json @@ -0,0 +1,110 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"contact_tag", + "created_at":1553291644, + "tag":{ + "type":"tag", + "id":"2525085", + "name":"developer" + }, + "contact":{ + "type":"contact", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "anonymous":true, + "email":"jerryguitarist@gmail.com", + "phone":"+17093452342", + "name":"Eeshan Garg", + "pseudonym":"Rose Poodle from St. John's", + "avatar":{ + "type":"avatar", + "image_url":"https://img.fullcontact.com/static/85ce413bcdac4cec3cfdb3a8da530f8b_8a853b478c3122d7e4ec9e14f81d9a3d9ea9da198d85c1985efc2403fa6bdb0c" + }, + "app_id":"i6wc9ipe", + "companies":{ + "type":"company.list", + "companies":[ + { + "type":"company", + "company_id":"5c9555b50af2951cc897b79a-qualification-company", + "id":"5c9555b50af2951cc897b79b", + "name":"Kandra Labs" + } + ] + }, + "location_data":{ + "type":"location_data", + "city_name":"St. John's", + "continent_code":"NA", + "country_name":"Canada", + "postal_code":"A1B", + "region_name":"Newfoundland and Labrador", + "timezone":"America/St_Johns", + "country_code":"CAN", + "latitude":null, + "longitude":null + }, + "last_request_at":"2019-03-22T21:42:36.634+00:00", + "created_at":"2019-03-22T21:29:47.980+00:00", + "remote_created_at":null, + "signed_up_at":null, + "updated_at":"2019-03-22T21:54:04.618+00:00", + "session_count":0, + "social_profiles":{ + "type":"social_profile.list", + "social_profiles":[ + { + "type":"social_profile", + "name":"github", + "id":null, + "username":"eeshangarg", + "url":"https://github.com/eeshangarg" + } + ] + }, + "unsubscribed_from_emails":false, + "marked_email_as_spam":false, + "has_hard_bounced":false, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "segments":{ + "type":"segment.list", + "segments":[ + + ] + }, + "custom_attributes":{ + + }, + "referrer":null, + "utm_campaign":null, + "utm_content":null, + "utm_medium":null, + "utm_source":null, + "utm_term":null, + "do_not_track":null, + "last_seen_ip":null, + "user_agent_data":null + } + } + }, + "links":{ + + }, + "id":"notif_5cecbde1-e2f4-46dc-8f6a-378ddd22b1f7", + "topic":"contact.tag.deleted", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291644, + "created_at":1553291644, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_assigned.json b/zerver/webhooks/intercom/fixtures/conversation_admin_assigned.json new file mode 100644 index 0000000000..d980e47a41 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_assigned.json @@ -0,0 +1,103 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"conversation", + "id":"21322009097", + "created_at":1553290933, + "updated_at":1553291111, + "user":{ + "type":"lead", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com", + "do_not_track":null + }, + "assignee":{ + "type":"admin", + "id":"1957471", + "name":"Tim Abbott", + "email":"tim@zulip.com" + }, + "conversation_message":{ + "type":"conversation_message", + "id":"331499307", + "url":"http://localhost:9991/api/", + "subject":"", + "body":"

Hello

", + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7" + }, + "attachments":[ + + ] + }, + "conversation_parts":{ + "type":"conversation_part.list", + "conversation_parts":[ + { + "type":"conversation_part", + "id":"2824382500", + "part_type":"assignment", + "body":"

Hey Eeshan! How can I help?

", + "created_at":1553291111, + "updated_at":1553291111, + "notified_at":1553291111, + "assigned_to":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg" + }, + "author":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg" + }, + "attachments":[ + + ], + "external_id":null + } + ], + "total_count":1 + }, + "open":true, + "state":"open", + "snoozed_until":null, + "read":false, + "metadata":{ + + }, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "tags_added":{ + "type":"tag.list", + "tags":[ + + ] + }, + "links":{ + "conversation_web":"https://app.intercom.io/a/apps/i6wc9ipe/conversations/21322009097" + } + } + }, + "links":{ + + }, + "id":"notif_b577ea09-0998-45cf-ade1-df4d102a58ec", + "topic":"conversation.admin.assigned", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291112, + "created_at":1553291112, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_closed.json b/zerver/webhooks/intercom/fixtures/conversation_admin_closed.json new file mode 100644 index 0000000000..8d6243de05 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_closed.json @@ -0,0 +1,99 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"conversation", + "id":"21322009097", + "created_at":1553290933, + "updated_at":1553291389, + "user":{ + "type":"lead", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com", + "do_not_track":null + }, + "assignee":{ + "type":"admin", + "id":"1957471", + "name":"Cordelia Lear", + "email":"cordelia@zulip.com" + }, + "conversation_message":{ + "type":"conversation_message", + "id":"331499307", + "url":"http://localhost:9991/api/", + "subject":"", + "body":"

Hello

", + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7" + }, + "attachments":[ + + ] + }, + "conversation_parts":{ + "type":"conversation_part.list", + "conversation_parts":[ + { + "type":"conversation_part", + "id":"2824395628", + "part_type":"close", + "body":null, + "created_at":1553291389, + "updated_at":1553291389, + "notified_at":1553291389, + "assigned_to":null, + "author":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg" + }, + "attachments":[ + + ], + "external_id":null + } + ], + "total_count":1 + }, + "open":false, + "state":"closed", + "snoozed_until":null, + "read":true, + "metadata":{ + + }, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "tags_added":{ + "type":"tag.list", + "tags":[ + + ] + }, + "links":{ + "conversation_web":"https://app.intercom.io/a/apps/i6wc9ipe/conversations/21322009097" + } + } + }, + "links":{ + + }, + "id":"notif_2bc4bf3a-0064-4fb0-9e17-dc44d91bcb9b", + "topic":"conversation.admin.closed", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291390, + "created_at":1553291390, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_noted.json b/zerver/webhooks/intercom/fixtures/conversation_admin_noted.json new file mode 100644 index 0000000000..2151c8e01d --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_noted.json @@ -0,0 +1,87 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330067382", + "created_at": 1553378082, + "updated_at": 1553378536, + "user": { + "type": "lead", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com", + "do_not_track": null + }, + "assignee": { + "type": "admin", + "id": "1957471", + "name": "Cordelia Lear", + "email": "cordelia@zulip.com" + }, + "conversation_message": { + "type": "conversation_message", + "id": "331786931", + "url": "http://localhost:9991/api/", + "subject": "", + "body": "

Hey! I'd like to set up a new account

", + "author": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [ + { + "type": "conversation_part", + "id": "2826904904", + "part_type": "note", + "body": "

Talk to Tim about this user's query.

", + "created_at": 1553378536, + "updated_at": 1553378536, + "notified_at": 1553378536, + "assigned_to": null, + "author": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg" + }, + "attachments": [], + "external_id": null + } + ], + "total_count": 1 + }, + "open": true, + "state": "open", + "snoozed_until": null, + "read": true, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [] + }, + "tags_added": { + "type": "tag.list", + "tags": [] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330067382" + } + } + }, + "links": {}, + "id": "notif_2087a079-b2de-408b-8f30-8d56695fe2d9", + "topic": "conversation.admin.noted", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553378537, + "created_at": 1553378537, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_opened.json b/zerver/webhooks/intercom/fixtures/conversation_admin_opened.json new file mode 100644 index 0000000000..d6d307f88a --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_opened.json @@ -0,0 +1,91 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330229536", + "created_at": 1553380785, + "updated_at": 1553380931, + "user": { + "type": "lead", + "id": "5c96b58c27e3772c4751b2a3", + "user_id": "ced6189f-e3b0-40b6-ab3a-9fdb27f4b3b0", + "name": "Cordelia Lear", + "email": "eg3800@mun.ca", + "do_not_track": null + }, + "assignee": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com" + }, + "conversation_message": { + "type": "conversation_message", + "id": "331793703", + "url": "http://localhost:9991/integrations/", + "subject": "", + "body": "

Hello

", + "author": { + "type": "user", + "id": "5c96b58c27e3772c4751b2a3" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [ + { + "type": "conversation_part", + "id": "2826953202", + "part_type": "open", + "body": null, + "created_at": 1553380931, + "updated_at": 1553380931, + "notified_at": 1553380931, + "assigned_to": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg" + }, + "author": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg" + }, + "attachments": [], + "external_id": null + } + ], + "total_count": 1 + }, + "open": true, + "state": "open", + "snoozed_until": null, + "read": true, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [] + }, + "tags_added": { + "type": "tag.list", + "tags": [] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330229536" + } + } + }, + "links": {}, + "id": "notif_d8906f30-db91-466e-9be2-4715fce4ab8b", + "topic": "conversation.admin.opened", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553380932, + "created_at": 1553380932, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_replied.json b/zerver/webhooks/intercom/fixtures/conversation_admin_replied.json new file mode 100644 index 0000000000..2b5be57cb3 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_replied.json @@ -0,0 +1,103 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"conversation", + "id":"21322009097", + "created_at":1553290933, + "updated_at":1553291111, + "user":{ + "type":"lead", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com", + "do_not_track":null + }, + "assignee":{ + "type": "admin", + "id": "1957471", + "name": "Cordelia Lear", + "email": "cordelia@zulip.com" + }, + "conversation_message":{ + "type":"conversation_message", + "id":"331499307", + "url":"http://localhost:9991/api/", + "subject":"", + "body":"

Hello

", + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7" + }, + "attachments":[ + + ] + }, + "conversation_parts":{ + "type":"conversation_part.list", + "conversation_parts":[ + { + "type":"conversation_part", + "id":"2824382500", + "part_type":"assignment", + "body":"

Hey Eeshan! How can I help?

", + "created_at":1553291111, + "updated_at":1553291111, + "notified_at":1553291111, + "assigned_to":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg" + }, + "author":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg" + }, + "attachments":[ + + ], + "external_id":null + } + ], + "total_count":1 + }, + "open":true, + "state":"open", + "snoozed_until":null, + "read":false, + "metadata":{ + + }, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "tags_added":{ + "type":"tag.list", + "tags":[ + + ] + }, + "links":{ + "conversation_web":"https://app.intercom.io/a/apps/i6wc9ipe/conversations/21322009097" + } + } + }, + "links":{ + + }, + "id":"notif_44d1f763-d3ad-4927-8e5c-da6cd6ca78d2", + "topic":"conversation.admin.replied", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291112, + "created_at":1553291112, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_single_created.json b/zerver/webhooks/intercom/fixtures/conversation_admin_single_created.json new file mode 100644 index 0000000000..07697b8ee9 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_single_created.json @@ -0,0 +1,69 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330075292", + "created_at": 1553378181, + "updated_at": 1553378181, + "user": { + "type": "lead", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com", + "do_not_track": null + }, + "assignee": { + "type": "admin", + "id": "1957471", + "name": "Cordelia Lear", + "email": "cordelia@zulip.com" + }, + "conversation_message": { + "type": "conversation_message", + "id": "331787154", + "url": null, + "subject": "Hello", + "body": "

Hi Eeshan, What's up

", + "author": { + "type": "admin", + "id": "1957471" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [], + "total_count": 0 + }, + "open": false, + "state": "closed", + "snoozed_until": null, + "read": false, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [] + }, + "tags_added": { + "type": "tag.list", + "tags": [] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330075292" + } + } + }, + "links": {}, + "id": "notif_ca44c80b-1eaa-411c-b10f-046890017eea", + "topic": "conversation.admin.single.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553378181, + "created_at": 1553378181, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_snoozed.json b/zerver/webhooks/intercom/fixtures/conversation_admin_snoozed.json new file mode 100644 index 0000000000..9be003e855 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_snoozed.json @@ -0,0 +1,87 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330067382", + "created_at": 1553378082, + "updated_at": 1553378413, + "user": { + "type": "lead", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com", + "do_not_track": null + }, + "assignee": { + "type": "admin", + "id": "1957471", + "name": "Cordelia Lear", + "email": "cordelia@zulip.com" + }, + "conversation_message": { + "type": "conversation_message", + "id": "331786931", + "url": "http://localhost:9991/api/", + "subject": "", + "body": "

Hey! I'd like to set up a new account

", + "author": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [ + { + "type": "conversation_part", + "id": "2826902108", + "part_type": "snoozed", + "body": null, + "created_at": 1553378413, + "updated_at": 1553378413, + "notified_at": 1553378413, + "assigned_to": null, + "author": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg" + }, + "attachments": [], + "external_id": null + } + ], + "total_count": 1 + }, + "open": true, + "state": "snoozed", + "snoozed_until": 1553513400, + "read": true, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [] + }, + "tags_added": { + "type": "tag.list", + "tags": [] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330067382" + } + } + }, + "links": {}, + "id": "notif_0530a65a-8052-4f67-9070-a50f1363dc68", + "topic": "conversation.admin.snoozed", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553378414, + "created_at": 1553378414, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_admin_unsnoozed.json b/zerver/webhooks/intercom/fixtures/conversation_admin_unsnoozed.json new file mode 100644 index 0000000000..e2f0f56d6b --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_admin_unsnoozed.json @@ -0,0 +1,87 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330067382", + "created_at": 1553378082, + "updated_at": 1553378474, + "user": { + "type": "lead", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com", + "do_not_track": null + }, + "assignee": { + "type": "admin", + "id": "1957471", + "name": "Cordelia Lear", + "email": "cordelia@zulip.com" + }, + "conversation_message": { + "type": "conversation_message", + "id": "331786931", + "url": "http://localhost:9991/api/", + "subject": "", + "body": "

Hey! I'd like to set up a new account

", + "author": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [ + { + "type": "conversation_part", + "id": "2826903472", + "part_type": "unsnoozed", + "body": null, + "created_at": 1553378474, + "updated_at": 1553378474, + "notified_at": 1553378474, + "assigned_to": null, + "author": { + "type": "admin", + "id": "1957471", + "name": "Eeshan Garg" + }, + "attachments": [], + "external_id": null + } + ], + "total_count": 1 + }, + "open": true, + "state": "open", + "snoozed_until": null, + "read": true, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [] + }, + "tags_added": { + "type": "tag.list", + "tags": [] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330067382" + } + } + }, + "links": {}, + "id": "notif_f0f76ee2-f2c0-4526-90cd-caebecfc5ec5", + "topic": "conversation.admin.unsnoozed", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553378475, + "created_at": 1553378475, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_part_tag_created.json b/zerver/webhooks/intercom/fixtures/conversation_part_tag_created.json new file mode 100644 index 0000000000..47e234d9e2 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_part_tag_created.json @@ -0,0 +1,98 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "conversation", + "id": "21330067382", + "created_at": 1553378082, + "updated_at": 1553378536, + "user": { + "type": "lead", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com", + "do_not_track": null + }, + "assignee": { + "type": "nobody_admin", + "id": null + }, + "conversation_message": { + "type": "conversation_message", + "id": "331786931", + "url": "http://localhost:9991/api/", + "subject": "", + "body": "

Hey! I'd like to set up a new account

", + "author": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7" + }, + "attachments": [] + }, + "conversation_parts": { + "type": "conversation_part.list", + "conversation_parts": [ + { + "type": "conversation_part", + "id": "331786931", + "part_type": "comment", + "body": "

Hey! I'd like to set up a new account

", + "created_at": 1553378082, + "updated_at": 1553378744, + "notified_at": 1553378082, + "assigned_to": null, + "author": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7", + "name": "Eeshan Garg", + "email": "jerryguitarist@gmail.com" + }, + "attachments": [], + "external_id": null + } + ], + "total_count": 1 + }, + "open": true, + "state": "open", + "snoozed_until": null, + "read": true, + "metadata": {}, + "tags": { + "type": "tag.list", + "tags": [ + { + "type": "tag", + "id": "2525085", + "name": "developer" + } + ] + }, + "tags_added": { + "type": "tag.list", + "tags": [ + { + "type": "tag", + "id": "2525085", + "name": "developer" + } + ] + }, + "links": { + "conversation_web": "https://app.intercom.io/a/apps/i6wc9ipe/conversations/21330067382" + } + } + }, + "links": {}, + "id": "notif_11aef68a-8049-4f29-bbd9-48a7adfc8f30", + "topic": "conversation_part.tag.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553378744, + "created_at": 1553378744, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_user_created.json b/zerver/webhooks/intercom/fixtures/conversation_user_created.json new file mode 100644 index 0000000000..e041d039b3 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_user_created.json @@ -0,0 +1,79 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"conversation", + "id":"21321941764", + "created_at":1553290198, + "updated_at":1553290198, + "user":{ + "type":"lead", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "name":"Rose Poodle from St. John's", + "email":"", + "do_not_track":null + }, + "assignee":{ + "type":"nobody_admin", + "id":null + }, + "conversation_message":{ + "type":"conversation_message", + "id":"331494375", + "url":"http://localhost:9991/api/", + "subject":"", + "body":"

Hello everyone!

", + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7" + }, + "attachments":[ + + ] + }, + "conversation_parts":{ + "type":"conversation_part.list", + "conversation_parts":[ + + ], + "total_count":0 + }, + "open":true, + "state":"open", + "snoozed_until":null, + "read":true, + "metadata":{ + + }, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "tags_added":{ + "type":"tag.list", + "tags":[ + + ] + }, + "links":{ + "conversation_web":"https://app.intercom.io/a/apps/i6wc9ipe/conversations/21321941764" + } + } + }, + "links":{ + + }, + "id":"notif_3ac27816-d27c-45fd-a65a-bbaf021cf780", + "topic":"conversation.user.created", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553290198, + "created_at":1553290198, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/conversation_user_replied.json b/zerver/webhooks/intercom/fixtures/conversation_user_replied.json new file mode 100644 index 0000000000..6e40d1191a --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/conversation_user_replied.json @@ -0,0 +1,100 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"conversation", + "id":"21322009097", + "created_at":1553290933, + "updated_at":1553291307, + "user":{ + "type":"lead", + "id":"5c9553cb27e377f24eed49f7", + "user_id":"75067020-1204-495c-8edc-abb7d88bdd43", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com", + "do_not_track":null + }, + "assignee":{ + "type":"admin", + "id":"1957471", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com" + }, + "conversation_message":{ + "type":"conversation_message", + "id":"331499307", + "url":"http://localhost:9991/api/", + "subject":"", + "body":"

Hello

", + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7" + }, + "attachments":[ + + ] + }, + "conversation_parts":{ + "type":"conversation_part.list", + "conversation_parts":[ + { + "type":"conversation_part", + "id":"2824391734", + "part_type":"comment", + "body":"

Well, I need some help getting access to a developer account.

", + "created_at":1553291307, + "updated_at":1553291307, + "notified_at":1553291307, + "assigned_to":null, + "author":{ + "type":"user", + "id":"5c9553cb27e377f24eed49f7", + "name":"Eeshan Garg", + "email":"jerryguitarist@gmail.com" + }, + "attachments":[ + + ], + "external_id":null + } + ], + "total_count":1 + }, + "open":true, + "state":"open", + "snoozed_until":null, + "read":true, + "metadata":{ + + }, + "tags":{ + "type":"tag.list", + "tags":[ + + ] + }, + "tags_added":{ + "type":"tag.list", + "tags":[ + + ] + }, + "links":{ + "conversation_web":"https://app.intercom.io/a/apps/i6wc9ipe/conversations/21322009097" + } + } + }, + "links":{ + + }, + "id":"notif_2c71fff0-65ef-46be-bbfe-dbf637bbff15", + "topic":"conversation.user.replied", + "delivery_status":"pending", + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553291308, + "created_at":1553291308, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/event_created.json b/zerver/webhooks/intercom/fixtures/event_created.json new file mode 100644 index 0000000000..756ab59ca2 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/event_created.json @@ -0,0 +1,27 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "event", + "event_name": "invited-friend", + "id": "84ca8d44-8f2e-11e3-bbc6-6d72c14baf72", + "intercom_user_id": "5c9aabdf2ddf20549a41453a", + "user_id": "12", + "email": "jerryguitarist@gmail.com", + "metadata": {}, + "created_at": 1391691571, + "ext_metadata": {} + } + }, + "links": {}, + "id": "notif_da25b9d8-797b-4858-ac4a-4a2e9bbecee4", + "topic": "event.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553642228, + "created_at": 1553642228, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/ping.json b/zerver/webhooks/intercom/fixtures/ping.json new file mode 100644 index 0000000000..8896313257 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/ping.json @@ -0,0 +1,22 @@ +{ + "type":"notification_event", + "app_id":"i6wc9ipe", + "data":{ + "type":"notification_event_data", + "item":{ + "type":"ping", + "message":"something something interzen" + } + }, + "links":{ + + }, + "id":null, + "topic":"ping", + "delivery_status":null, + "delivery_attempts":1, + "delivered_at":0, + "first_sent_at":1553288147, + "created_at":1553288147, + "self":null +} diff --git a/zerver/webhooks/intercom/fixtures/user_created.json b/zerver/webhooks/intercom/fixtures/user_created.json index cf912f8a4b..64bbc4da3c 100644 --- a/zerver/webhooks/intercom/fixtures/user_created.json +++ b/zerver/webhooks/intercom/fixtures/user_created.json @@ -1,77 +1,74 @@ { "type": "notification_event", - "app_id": "vsahmbmw", + "app_id": "i6wc9ipe", "data": { "type": "notification_event_data", "item": { - "type": "user_tag", - "user": { - "type": "user", - "id": "5a364a4a4716ab4dc29e87ba", - "user_id": "5", - "anonymous": false, - "email": "john.doe@gmail.com", - "phone": 9876543211, - "name": "John Doe", - "pseudonym": null, - "avatar": { - "type": "avatar", - "image_url": null - }, - "app_id": "vsahmbmw", - "companies": { - "type": "company.list", - "companies": [] - }, - "location_data": {}, - "last_request_at": null, - "last_seen_ip": null, - "created_at": "2017-12-17T10:43:22.000Z", - "remote_created_at": null, - "signed_up_at": null, - "updated_at": "2017-12-17T10:43:22.496Z", - "session_count": 0, - "social_profiles": { - "type": "social_profile.list", - "social_profiles": [] - }, - "unsubscribed_from_emails": false, - "marked_email_as_spam": false, - "has_hard_bounced": false, - "user_agent_data": null, - "tags": { - "type": "tag.list", - "tags": [ - { - "type": "tag", - "id": "1449318" - } - ] - }, - "segments": { - "type": "segment.list", - "segments": [] - }, - "custom_attributes": {} + "type": "user", + "id": "5c9ab3e78cd7330140ce5033", + "user_id": "25", + "anonymous": false, + "email": "aaron@zulip.com", + "phone": "2345570987", + "name": "Aaron Smith", + "pseudonym": null, + "avatar": { + "type": "avatar", + "image_url": null }, - "tag": { - "type": "tag", - "id": "1449318", - "name": "CSV Import - 2017-12-17 10:42:59 UTC" + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [ + { + "type": "company", + "company_id": "366", + "id": "5c9ab3e78cd7330140ce5034", + "name": "Zulip" + } + ] }, - "created_at": 1513507402, - "admin": { - "type": "admin" - } + "location_data": {}, + "last_request_at": null, + "created_at": "2019-03-26T23:21:11.907+00:00", + "remote_created_at": "2014-02-18T13:48:51.000+00:00", + "signed_up_at": "2014-02-18T13:48:51.000+00:00", + "updated_at": "2019-03-26T23:21:11.904+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null } }, "links": {}, - "id": "notif_1a6fd8a0-e317-11e7-b721-d77135370663", - "topic": "user.tag.created", + "id": "notif_61f436a9-6a2e-4f9b-9e85-68043477da63", + "topic": "user.created", "delivery_status": "pending", "delivery_attempts": 1, "delivered_at": 0, - "first_sent_at": 1513507402, - "created_at": 1513507402, + "first_sent_at": 1553642472, + "created_at": 1553642471, "self": null } diff --git a/zerver/webhooks/intercom/fixtures/user_deleted.json b/zerver/webhooks/intercom/fixtures/user_deleted.json new file mode 100644 index 0000000000..483e95188b --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/user_deleted.json @@ -0,0 +1,22 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "user", + "id": "5c9553cb27e377f24eed49f7", + "user_id": "75067020-1204-495c-8edc-abb7d88bdd43", + "email": "jerryguitarist@gmail.com" + } + }, + "links": {}, + "id": "notif_03e00e17-30d8-4c8a-91a4-6486a3df66e0", + "topic": "user.deleted", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553379090, + "created_at": 1553379090, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/user_email_updated.json b/zerver/webhooks/intercom/fixtures/user_email_updated.json new file mode 100644 index 0000000000..75ed9df2a5 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/user_email_updated.json @@ -0,0 +1,78 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "contact", + "id": "5c96b122177026171b401e20", + "user_id": "8f9ef493-c5f9-4817-895d-874c3704ea49", + "anonymous": true, + "email": "aaron@zulip.com", + "phone": null, + "name": null, + "pseudonym": "Azure Bus from St. John's", + "avatar": { + "type": "avatar", + "image_url": "https://static.intercomassets.com/app/pseudonym_avatars_2019/azure-bus.png" + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": { + "type": "location_data", + "city_name": "St. John's", + "continent_code": "NA", + "country_name": "Canada", + "postal_code": "A1B", + "region_name": "Newfoundland and Labrador", + "timezone": "America/St_Johns", + "country_code": "CAN", + "latitude": null, + "longitude": null + }, + "last_request_at": "2019-03-23T22:20:52.453+00:00", + "created_at": "2019-03-23T22:20:18.253+00:00", + "remote_created_at": null, + "signed_up_at": null, + "updated_at": "2019-03-23T22:20:59.490+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + } + }, + "links": {}, + "id": "notif_687f7dfc-afd2-48ce-b31a-7a087d2ebf71", + "topic": "user.email.updated", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553379706, + "created_at": 1553379706, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/user_tag_created.json b/zerver/webhooks/intercom/fixtures/user_tag_created.json new file mode 100644 index 0000000000..ce15d98397 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/user_tag_created.json @@ -0,0 +1,92 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "user_tag", + "user": { + "type": "user", + "id": "5c9aabdf2ddf20549a41453a", + "user_id": "12", + "anonymous": false, + "email": "jerryguitarist@gmail.com", + "phone": null, + "name": "eeshangarg", + "pseudonym": null, + "avatar": { + "type": "avatar", + "image_url": "https://img.fullcontact.com/static/85ce413bcdac4cec3cfdb3a8da530f8b_8a853b478c3122d7e4ec9e14f81d9a3d9ea9da198d85c1985efc2403fa6bdb0c" + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": {}, + "last_request_at": null, + "created_at": "2019-03-26T22:46:55.851+00:00", + "remote_created_at": "2019-03-03T00:00:00.000+00:00", + "signed_up_at": "2019-03-03T00:00:00.000+00:00", + "updated_at": "2019-03-26T22:46:56.045+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [ + { + "type": "social_profile", + "name": "github", + "id": null, + "username": "eeshangarg", + "url": "https://github.com/eeshangarg" + } + ] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [ + { + "type": "tag", + "id": "2525085" + } + ] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + }, + "tag": { + "type": "tag", + "id": "2525085", + "name": "developer" + }, + "created_at": 1553640416, + "admin": { + "type": "admin" + } + } + }, + "links": {}, + "id": "notif_800ae4f0-e326-41e7-a4e9-c4e7a97d45f4", + "topic": "user.tag.created", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553640416, + "created_at": 1553640416, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/user_tag_deleted.json b/zerver/webhooks/intercom/fixtures/user_tag_deleted.json new file mode 100644 index 0000000000..3e0c9b3dc1 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/user_tag_deleted.json @@ -0,0 +1,92 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "user_tag", + "user": { + "type": "user", + "id": "5c9aabdf2ddf20549a41453a", + "user_id": "12", + "anonymous": false, + "email": "jerryguitarist@gmail.com", + "phone": null, + "name": "eeshangarg", + "pseudonym": null, + "avatar": { + "type": "avatar", + "image_url": "https://img.fullcontact.com/static/85ce413bcdac4cec3cfdb3a8da530f8b_8a853b478c3122d7e4ec9e14f81d9a3d9ea9da198d85c1985efc2403fa6bdb0c" + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [] + }, + "location_data": {}, + "last_request_at": null, + "created_at": "2019-03-26T22:46:55.851+00:00", + "remote_created_at": "2019-03-03T00:00:00.000+00:00", + "signed_up_at": "2019-03-03T00:00:00.000+00:00", + "updated_at": "2019-03-26T22:48:23.743+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [ + { + "type": "social_profile", + "name": "github", + "id": null, + "username": "eeshangarg", + "url": "https://github.com/eeshangarg" + } + ] + }, + "unsubscribed_from_emails": false, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [ + { + "type": "tag", + "id": "2525085" + } + ] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + }, + "tag": { + "type": "tag", + "id": "2535149", + "name": "CSV Import - 2019-03-26 22:46:04 UTC" + }, + "created_at": 1553640503, + "admin": { + "type": "admin" + } + } + }, + "links": {}, + "id": "notif_89864fe7-ef26-4b32-b410-160871aa7fb9", + "topic": "user.tag.deleted", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553640503, + "created_at": 1553640503, + "self": null +} diff --git a/zerver/webhooks/intercom/fixtures/user_unsubscribed.json b/zerver/webhooks/intercom/fixtures/user_unsubscribed.json new file mode 100644 index 0000000000..b2c0b7c574 --- /dev/null +++ b/zerver/webhooks/intercom/fixtures/user_unsubscribed.json @@ -0,0 +1,93 @@ +{ + "type": "notification_event", + "app_id": "i6wc9ipe", + "data": { + "type": "notification_event_data", + "item": { + "type": "contact", + "id": "5c96b122177026171b401e20", + "user_id": "8f9ef493-c5f9-4817-895d-874c3704ea49", + "anonymous": true, + "email": "jerryguitarist@gmail.com", + "phone": "+17982347588", + "name": "Eeshan Garg", + "pseudonym": "Azure Bus from St. John's", + "avatar": { + "type": "avatar", + "image_url": "https://img.fullcontact.com/static/85ce413bcdac4cec3cfdb3a8da530f8b_8a853b478c3122d7e4ec9e14f81d9a3d9ea9da198d85c1985efc2403fa6bdb0c" + }, + "app_id": "i6wc9ipe", + "companies": { + "type": "company.list", + "companies": [ + { + "type": "company", + "company_id": "5c96b2c0d1c4c1a2d455b936-qualification-company", + "id": "5c96b2c0d1c4c1a2d455b937", + "name": "Kandra Labs" + } + ] + }, + "location_data": { + "type": "location_data", + "city_name": "St. John's", + "continent_code": "NA", + "country_name": "Canada", + "postal_code": "A1B", + "region_name": "Newfoundland and Labrador", + "timezone": "America/St_Johns", + "country_code": "CAN", + "latitude": null, + "longitude": null + }, + "last_request_at": "2019-03-23T22:20:52.453+00:00", + "created_at": "2019-03-23T22:20:18.253+00:00", + "remote_created_at": null, + "signed_up_at": null, + "updated_at": "2019-03-23T22:28:55.055+00:00", + "session_count": 0, + "social_profiles": { + "type": "social_profile.list", + "social_profiles": [ + { + "type": "social_profile", + "name": "github", + "id": null, + "username": "eeshangarg", + "url": "https://github.com/eeshangarg" + } + ] + }, + "unsubscribed_from_emails": true, + "marked_email_as_spam": false, + "has_hard_bounced": false, + "tags": { + "type": "tag.list", + "tags": [] + }, + "segments": { + "type": "segment.list", + "segments": [] + }, + "custom_attributes": {}, + "referrer": null, + "utm_campaign": null, + "utm_content": null, + "utm_medium": null, + "utm_source": null, + "utm_term": null, + "do_not_track": null, + "last_seen_ip": null, + "user_agent_data": null + } + }, + "links": {}, + "id": "notif_71d6309c-0655-4793-86e5-19141d36642b", + "topic": "user.unsubscribed", + "delivery_status": "pending", + "delivery_attempts": 1, + "delivered_at": 0, + "first_sent_at": 1553380135, + "created_at": 1553380135, + "self": null +} diff --git a/zerver/webhooks/intercom/tests.py b/zerver/webhooks/intercom/tests.py index 16e6245523..dacf2d420c 100644 --- a/zerver/webhooks/intercom/tests.py +++ b/zerver/webhooks/intercom/tests.py @@ -1,3 +1,5 @@ +from mock import MagicMock, patch + from zerver.lib.test_classes import WebhookTestCase class IntercomWebHookTests(WebhookTestCase): @@ -5,15 +7,261 @@ class IntercomWebHookTests(WebhookTestCase): URL_TEMPLATE = "/api/v1/external/intercom?&api_key={api_key}&stream={stream}" FIXTURE_DIR_NAME = 'intercom' - def test_user_created_message(self) -> None: - expected_topic = u"user tag created" - expected_message = ('*10:43:22 2017-12-17* **user tag created**: \n' - ' - User Name: John Doe\n' - ' - User Email: john.doe@gmail.com\n' - ' - User Phone: 9876543211') + @patch('zerver.webhooks.intercom.view.check_send_webhook_message') + def test_ping_ignore(self, check_send_webhook_message_mock: MagicMock) -> None: + self.url = self.build_webhook_url() + payload = self.get_body('ping') + result = self.client_post(self.url, payload, content_type="application/json") + self.assertFalse(check_send_webhook_message_mock.called) + self.assert_json_success(result) - self.send_and_test_stream_message('user_created', expected_topic, expected_message, - content_type="application/x-www-form-urlencoded") + def test_company_created(self) -> None: + expected_topic = "Companies" + expected_message = """ +New company **Kandra Labs** created: +* **User count**: 1 +* **Monthly spending**: 0 +""".strip() + self.send_and_test_stream_message( + 'company_created', + expected_topic, + expected_message + ) + + def test_contact_added_email(self) -> None: + expected_topic = "Contact: Azure Bus from St. John's" + expected_message = "New email jerryguitarist@gmail.com added to contact." + self.send_and_test_stream_message( + 'contact_added_email', + expected_topic, + expected_message + ) + + def test_contact_created(self) -> None: + expected_topic = "Contact: Azure Bus from St. John's" + expected_message = """ +New contact created: +* **Name (or pseudonym)**: Azure Bus from St. John's +* **Email**: aaron@zulip.com +* **Location**: St. John's, Newfoundland and Labrador, Canada +""".strip() + self.send_and_test_stream_message( + 'contact_created', + expected_topic, + expected_message + ) + + def test_contact_signed_up(self) -> None: + expected_topic = "User: Lilac Raindrop from St. John's" + expected_message = """ +Contact signed up: +* **Email**: iago@zulip.com +* **Location**: St. John's, Newfoundland and Labrador, Canada +""".strip() + self.send_and_test_stream_message( + 'contact_signed_up', + expected_topic, + expected_message + ) + + def test_contact_tag_created(self) -> None: + expected_topic = "Contact: Eeshan Garg" + expected_message = "Contact tagged with the `developer` tag." + self.send_and_test_stream_message( + 'contact_tag_created', + expected_topic, + expected_message + ) + + def test_contact_tag_deleted(self) -> None: + expected_topic = "Contact: Eeshan Garg" + expected_message = "The tag `developer` was removed from the contact." + self.send_and_test_stream_message( + 'contact_tag_deleted', + expected_topic, + expected_message + ) + + def test_conversation_admin_assigned(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = "Tim Abbott assigned to conversation." + self.send_and_test_stream_message( + 'conversation_admin_assigned', + expected_topic, + expected_message + ) + + def test_conversation_admin_opened(self) -> None: + expected_topic = "Lead: Cordelia Lear" + expected_message = "Eeshan Garg opened the conversation." + self.send_and_test_stream_message( + 'conversation_admin_opened', + expected_topic, + expected_message + ) + + def test_conversation_admin_closed(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = "Cordelia Lear closed the conversation." + self.send_and_test_stream_message( + 'conversation_admin_closed', + expected_topic, + expected_message + ) + + def test_conversation_admin_snoozed(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = "Cordelia Lear snoozed the conversation." + self.send_and_test_stream_message( + 'conversation_admin_snoozed', + expected_topic, + expected_message + ) + + def test_conversation_admin_unsnoozed(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = "Cordelia Lear unsnoozed the conversation." + self.send_and_test_stream_message( + 'conversation_admin_unsnoozed', + expected_topic, + expected_message + ) + + def test_conversation_admin_replied(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = """ +Cordelia Lear replied to the conversation: + +``` quote +Hey Eeshan! How can I help? +``` +""".strip() + self.send_and_test_stream_message( + 'conversation_admin_replied', + expected_topic, + expected_message + ) + + def test_conversation_admin_noted(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = """ +Cordelia Lear added a note to the conversation: + +``` quote +Talk to Tim about this user's query. +``` +""".strip() + self.send_and_test_stream_message( + 'conversation_admin_noted', + expected_topic, + expected_message + ) + + def test_conversation_admin_single_created(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = """ +Cordelia Lear initiated a conversation: + +``` quote +Hi Eeshan, What's up +``` +""".strip() + self.send_and_test_stream_message( + 'conversation_admin_single_created', + expected_topic, + expected_message + ) + + def test_conversation_user_created(self) -> None: + expected_topic = "Lead: Rose Poodle from St. John's" + expected_message = """ +Rose Poodle from St. John's initiated a conversation: + +``` quote +Hello everyone! +``` +""".strip() + self.send_and_test_stream_message( + 'conversation_user_created', + expected_topic, + expected_message + ) + + def test_conversation_user_replied(self) -> None: + expected_topic = "Lead: Eeshan Garg" + expected_message = """ +Eeshan Garg replied to the conversation: + +``` quote +Well, I need some help getting access to a developer account. +``` +""".strip() + self.send_and_test_stream_message( + 'conversation_user_replied', + expected_topic, + expected_message + ) + + def test_event_created(self) -> None: + expected_topic = "Events" + expected_message = "New event **invited-friend** created." + self.send_and_test_stream_message( + 'event_created', + expected_topic, + expected_message + ) + + def test_user_created(self) -> None: + expected_topic = "User: Aaron Smith" + expected_message = """ +New user created: +* **Name**: Aaron Smith +* **Email**: aaron@zulip.com +""".strip() + + self.send_and_test_stream_message( + 'user_created', + expected_topic, + expected_message + ) + + def test_user_deleted(self) -> None: + self.send_and_test_stream_message( + 'user_deleted', + 'User: jerryguitarist@gmail.com', + 'User deleted.' + ) + + def test_user_email_updated(self) -> None: + self.send_and_test_stream_message( + 'user_email_updated', + 'Contact: Azure Bus from St. John\'s', + 'User\'s email was updated to aaron@zulip.com.' + ) + + def test_user_tag_created(self) -> None: + self.send_and_test_stream_message( + 'user_tag_created', + 'User: eeshangarg', + 'The tag `developer` was added to the user.' + ) + + def test_user_tag_deleted(self) -> None: + expected_topic = 'User: eeshangarg' + expected_message = 'The tag `CSV Import - 2019-03-26 22:46:04 UTC` was removed from the user.' + + self.send_and_test_stream_message( + 'user_tag_deleted', + expected_topic, + expected_message + ) + + def test_user_unsubscribed(self) -> None: + self.send_and_test_stream_message( + 'user_unsubscribed', + 'Contact: Eeshan Garg', + 'User unsubscribed from emails.' + ) def get_body(self, fixture_name: str) -> str: return self.webhook_fixture_data('intercom', fixture_name, file_type="json") diff --git a/zerver/webhooks/intercom/view.py b/zerver/webhooks/intercom/view.py index 33f3e961c7..e1e8e5369b 100644 --- a/zerver/webhooks/intercom/view.py +++ b/zerver/webhooks/intercom/view.py @@ -1,29 +1,297 @@ -import datetime -from typing import Any, Dict +from functools import partial +from html.parser import HTMLParser +from typing import Any, Dict, Tuple, Callable, List from django.http import HttpRequest, HttpResponse from zerver.decorator import api_key_only_webhook_view from zerver.lib.request import REQ, has_request_variables from zerver.lib.response import json_success -from zerver.lib.webhooks.common import check_send_webhook_message +from zerver.lib.webhooks.common import check_send_webhook_message, \ + UnexpectedWebhookEventType from zerver.models import UserProfile + +COMPANY_CREATED = """ +New company **{name}** created: +* **User count**: {user_count} +* **Monthly spending**: {monthly_spend} +""".strip() + +CONTACT_EMAIL_ADDED = "New email {email} added to contact." + +CONTACT_CREATED = """ +New contact created: +* **Name (or pseudonym)**: {name} +* **Email**: {email} +* **Location**: {location_info} +""".strip() + +CONTACT_SIGNED_UP = """ +Contact signed up: +* **Email**: {email} +* **Location**: {location_info} +""".strip() + +CONTACT_TAG_CREATED = "Contact tagged with the `{name}` tag." + +CONTACT_TAG_DELETED = "The tag `{name}` was removed from the contact." + +CONVERSATION_ADMIN_ASSIGNED = "{name} assigned to conversation." + +CONVERSATION_ADMIN_TEMPLATE = "{admin_name} {action} the conversation." + +CONVERSATION_ADMIN_REPLY_TEMPLATE = """ +{admin_name} {action} the conversation: + +``` quote +{content} +``` +""".strip() + +CONVERSATION_ADMIN_INITIATED_CONVERSATION = """ +{admin_name} initiated a conversation: + +``` quote +{content} +``` +""".strip() + +EVENT_CREATED = "New event **{event_name}** created." + +USER_CREATED = """ +New user created: +* **Name**: {name} +* **Email**: {email} +""".strip() + +class MLStripper(HTMLParser): + def __init__(self) -> None: + self.reset() + self.strict = False + self.convert_charrefs = True + self.fed = [] # type: List[str] + + def handle_data(self, d: str) -> None: + self.fed.append(d) + + def get_data(self) -> str: + return ''.join(self.fed) + +def strip_tags(html: str) -> str: + s = MLStripper() + s.feed(html) + return s.get_data() + +def get_topic_for_contacts(user: Dict[str, Any]) -> str: + topic = "{type}: {name}".format( + type=user['type'].capitalize(), + name=user.get('name') or user.get('pseudonym') or user.get('email') + ) + + return topic + +def get_company_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + body = COMPANY_CREATED.format(**payload['data']['item']) + return ('Companies', body) + +def get_contact_added_email_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item'] + body = CONTACT_EMAIL_ADDED.format(email=user['email']) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_contact_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + contact = payload['data']['item'] + body = CONTACT_CREATED.format( + name=contact.get('name') or contact.get('pseudonym'), + email=contact['email'], + location_info="{city_name}, {region_name}, {country_name}".format( + **contact['location_data'] + ) + ) + topic = get_topic_for_contacts(contact) + return (topic, body) + +def get_contact_signed_up_message(payload: Dict[str, Any]) -> Tuple[str, str]: + contact = payload['data']['item'] + body = CONTACT_SIGNED_UP.format( + email=contact['email'], + location_info="{city_name}, {region_name}, {country_name}".format( + **contact['location_data'] + ) + ) + topic = get_topic_for_contacts(contact) + return (topic, body) + +def get_contact_tag_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + body = CONTACT_TAG_CREATED.format(**payload['data']['item']['tag']) + contact = payload['data']['item']['contact'] + topic = get_topic_for_contacts(contact) + return (topic, body) + +def get_contact_tag_deleted_message(payload: Dict[str, Any]) -> Tuple[str, str]: + body = CONTACT_TAG_DELETED.format(**payload['data']['item']['tag']) + contact = payload['data']['item']['contact'] + topic = get_topic_for_contacts(contact) + return (topic, body) + +def get_conversation_admin_assigned_message(payload: Dict[str, Any]) -> Tuple[str, str]: + body = CONVERSATION_ADMIN_ASSIGNED.format(**payload['data']['item']['assignee']) + user = payload['data']['item']['user'] + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_conversation_admin_message( + payload: Dict[str, Any], + action: str +) -> Tuple[str, str]: + assignee = payload['data']['item']['assignee'] + user = payload['data']['item']['user'] + body = CONVERSATION_ADMIN_TEMPLATE.format( + admin_name=assignee.get('name'), + action=action + ) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_conversation_admin_reply_message( + payload: Dict[str, Any], + action: str +) -> Tuple[str, str]: + assignee = payload['data']['item']['assignee'] + user = payload['data']['item']['user'] + note = payload['data']['item']['conversation_parts']['conversation_parts'][0] + content = strip_tags(note['body']) + body = CONVERSATION_ADMIN_REPLY_TEMPLATE.format( + admin_name=assignee.get('name'), + action=action, + content=content + ) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_conversation_admin_single_created_message( + payload: Dict[str, Any]) -> Tuple[str, str]: + assignee = payload['data']['item']['assignee'] + user = payload['data']['item']['user'] + conversation_body = payload['data']['item']['conversation_message']['body'] + content = strip_tags(conversation_body) + body = CONVERSATION_ADMIN_INITIATED_CONVERSATION.format( + admin_name=assignee.get('name'), + content=content + ) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_conversation_user_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item']['user'] + conversation_body = payload['data']['item']['conversation_message']['body'] + content = strip_tags(conversation_body) + body = CONVERSATION_ADMIN_INITIATED_CONVERSATION.format( + admin_name=user.get('name'), + content=content + ) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_conversation_user_replied_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item']['user'] + note = payload['data']['item']['conversation_parts']['conversation_parts'][0] + content = strip_tags(note['body']) + body = CONVERSATION_ADMIN_REPLY_TEMPLATE.format( + admin_name=user.get('name'), + action='replied to', + content=content + ) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_event_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + event = payload['data']['item'] + body = EVENT_CREATED.format(**event) + return ('Events', body) + +def get_user_created_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item'] + body = USER_CREATED.format(**user) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_user_deleted_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item'] + topic = get_topic_for_contacts(user) + return (topic, 'User deleted.') + +def get_user_email_updated_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item'] + body = 'User\'s email was updated to {}.'.format(user['email']) + topic = get_topic_for_contacts(user) + return (topic, body) + +def get_user_tagged_message( + payload: Dict[str, Any], + action: str +) -> Tuple[str, str]: + user = payload['data']['item']['user'] + tag = payload['data']['item']['tag'] + topic = get_topic_for_contacts(user) + body = 'The tag `{tag_name}` was {action} the user.'.format( + tag_name=tag['name'], + action=action + ) + return (topic, body) + +def get_user_unsubscribed_message(payload: Dict[str, Any]) -> Tuple[str, str]: + user = payload['data']['item'] + body = 'User unsubscribed from emails.' + topic = get_topic_for_contacts(user) + return (topic, body) + +EVENT_TO_FUNCTION_MAPPER = { + 'company.created': get_company_created_message, + 'contact.added_email': get_contact_added_email_message, + 'contact.created': get_contact_created_message, + 'contact.signed_up': get_contact_signed_up_message, + 'contact.tag.created': get_contact_tag_created_message, + 'contact.tag.deleted': get_contact_tag_deleted_message, + 'conversation.admin.assigned': get_conversation_admin_assigned_message, + 'conversation.admin.closed': partial(get_conversation_admin_message, action='closed'), + 'conversation.admin.opened': partial(get_conversation_admin_message, action='opened'), + 'conversation.admin.snoozed': partial(get_conversation_admin_message, action='snoozed'), + 'conversation.admin.unsnoozed': partial(get_conversation_admin_message, action='unsnoozed'), + 'conversation.admin.replied': partial(get_conversation_admin_reply_message, action='replied to'), + 'conversation.admin.noted': partial(get_conversation_admin_reply_message, action='added a note to'), + 'conversation.admin.single.created': get_conversation_admin_single_created_message, + 'conversation.user.created': get_conversation_user_created_message, + 'conversation.user.replied': get_conversation_user_replied_message, + 'event.created': get_event_created_message, + 'user.created': get_user_created_message, + 'user.deleted': get_user_deleted_message, + 'user.email.updated': get_user_email_updated_message, + 'user.tag.created': partial(get_user_tagged_message, action='added to'), + 'user.tag.deleted': partial(get_user_tagged_message, action='removed from'), + 'user.unsubscribed': get_user_unsubscribed_message, + # Note that we do not have a payload for visitor.signed_up + # but it should be identical to contact.signed_up + 'visitor.signed_up': get_contact_signed_up_message, +} + +def get_event_handler(event_type: str) -> Callable[..., Tuple[str, str]]: + handler = EVENT_TO_FUNCTION_MAPPER.get(event_type) # type: Any + if handler is None: + raise UnexpectedWebhookEventType("Intercom", event_type) + return handler + @api_key_only_webhook_view('Intercom') @has_request_variables def api_intercom_webhook(request: HttpRequest, user_profile: UserProfile, - payload: Dict[str, Any] = REQ(argument_type='body')) -> HttpResponse: - topic = payload['topic'] - topic = topic.replace('.', ' ') + payload: Dict[str, Any]=REQ(argument_type='body')) -> HttpResponse: + event_type = payload['topic'] + if event_type == 'ping': + return json_success() - created_at = datetime.datetime.fromtimestamp(int(payload['created_at'])).strftime('%H:%M:%S %Y-%m-%d') - body = '*{created_at}* **{topic}**: \n'.format(topic=topic, created_at=created_at) - - if payload['data']['item']['type'] == 'user_tag': - data = payload['data']['item']['user'] - body += ' - User Name: {}\n' \ - ' - User Email: {}\n' \ - ' - User Phone: {}\n'.format(data['name'], data['email'], data['phone']) + topic, body = get_event_handler(event_type)(payload) check_send_webhook_message(request, user_profile, topic, body) return json_success()