public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Slack WebHook payloads, please see 
            // 'https://api.slack.com/outgoing-webhooks'
            NameValueCollection entry = context.GetDataOrDefault<NameValueCollection>();

            // We can trace to see what is going on.
            Trace.WriteLine(entry.ToString());

            // Switch over the IDs we used when configuring this WebHook 
            switch (context.Id)
            {
                case "disco":
                    var text = entry.Get("text");
                    if (string.IsNullOrEmpty(text) == false)
                    {
                        text = text.Trim().ToLowerInvariant();
                        _topicService.AddMessageToTopic(new TopicMessageModel()
                        {
                            Message = entry.Get("text").RemoveHtml(),
                            Sender = entry.Get("user_name"),
                            Disco = _globalSettings.DiscoTriggers.Any(discoTrigger => text.Contains(discoTrigger))
                        });
                    }
                    break;
            }
            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about BitBucket WebHook payloads, please see 
            // 'https://confluence.atlassian.com/bitbucket/event-payloads-740262817.html#EventPayloads-Push'
            JObject entry = context.GetDataOrDefault<JObject>();

            // Extract the action -- for Bitbucket we have only one.
            string action = context.Actions.First();
            switch (action)
            {
                case "repo:push":
                    // Extract information about the repository
                    var repository = entry["repository"].ToObject<BitbucketRepository>();

                    // Information about the user causing the event
                    var actor = entry["actor"].ToObject<BitbucketUser>();

                    // Information about the specific changes
                    foreach (var change in entry["push"]["changes"])
                    {
                        // The previous commit
                        BitbucketTarget oldTarget = change["old"]["target"].ToObject<BitbucketTarget>();

                        // The new commit
                        BitbucketTarget newTarget = change["new"]["target"].ToObject<BitbucketTarget>();
                    }
                    break;

                default:
                    Trace.WriteLine(entry.ToString());
                    break;
            }

            return Task.FromResult(true);
        }
        /// <inheritdoc />
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string action = context.Actions.First();
            JObject data = context.GetDataOrDefault<JObject>();

            // map eventType to corresponding payload
            switch (action)
            {
                case "workitem.updated": return ExecuteAsync(context, data.ToObject<WorkItemUpdatedPayload>());
                case "workitem.restored": return ExecuteAsync(context, data.ToObject<WorkItemRestoredPayload>());
                case "workitem.deleted": return ExecuteAsync(context, data.ToObject<WorkItemDeletedPayload>());
                case "workitem.created": return ExecuteAsync(context, data.ToObject<WorkItemCreatedPayload>());
                case "workitem.commented": return ExecuteAsync(context, data.ToObject<WorkItemCommentedOnPayload>());
                case "message.posted": return ExecuteAsync(context, data.ToObject<TeamRoomMessagePostedPayload>());
                case "tfvc.checkin": return ExecuteAsync(context, data.ToObject<CodeCheckedInPayload>());
                case "build.complete": return ExecuteAsync(context, data.ToObject<BuildCompletedPayload>());
                case "git.push": return ExecuteAsync(context, data.ToObject<GitPushPayload>());
                case "git.pullrequest.created": return ExecuteAsync(context, data.ToObject<GitPullRequestCreatedPayload>());
                case "git.pullrequest.updated": return ExecuteAsync(context, data.ToObject<GitPullRequestUpdatedPayload>());
                default:
                    string msg = string.Format(CultureInfo.CurrentCulture, VstsReceiverResources.Handler_NonMappedEventType, action);
                    context.RequestContext.Configuration.DependencyResolver.GetLogger().Warn(msg);
                    return ExecuteAsync(context, data);
            }
        }
Beispiel #4
0
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Slack WebHook payloads, please see 
            // 'https://api.slack.com/outgoing-webhooks'
            NameValueCollection entry = context.GetDataOrDefault<NameValueCollection>();

            // We can trace to see what is going on.
            Trace.WriteLine(entry.ToString());

            // Switch over the IDs we used when configuring this WebHook 
            switch (context.Id)
            {
                case "trigger":
                    // Information can be returned using a SlackResponse
                    var triggerReply = new SlackResponse("Hello trigger!");
                    context.Response = context.Request.CreateResponse(triggerReply);
                    break;

                case "slash":
                    // Information can be returned in a plain text response
                    context.Response = context.Request.CreateResponse();
                    context.Response.Content = new StringContent("Hello slash command!");
                    break;
            }

            return Task.FromResult(true);
        }
        /// <inheritdoc />
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string action = context.Actions.First();
            JObject data = context.GetDataOrDefault<JObject>();

            // Check if a payload is available
            JToken payload;
            if (data == null || !data.TryGetValue(PayloadPropertyName, out payload))
            {
                string msg = string.Format(CultureInfo.CurrentCulture, MyGetReceiverResources.Receiver_NoPayload, PayloadPropertyName);
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Error(msg);
                context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, msg);
                return Task.FromResult(true);
            }

            // Cast to correct payload type
            switch (action)
            {
                case "PackageAddedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<PackageAddedPayload>());
                case "PackageDeletedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<PackageDeletedPayload>());
                case "PackageListedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<PackageListedPayload>());
                case "PackagePinnedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<PackagePinnedPayload>());
                case "PackagePushedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<PackagePushedPayload>());
                case "BuildQueuedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<BuildQueuedPayload>());
                case "BuildStartedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<BuildStartedPayload>());
                case "BuildFinishedWebHookEventPayloadV1": return ExecuteAsync(receiver, context, payload.ToObject<BuildFinishedPayload>());
            }

            return ExecuteUnknownPayloadAsync(receiver, context, (JObject)payload);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            ZendeskPost post = context.GetDataOrDefault<ZendeskPost>();

            // Implementation logic goes here
            return Task.FromResult(true);
        }
        public override async Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            var client = Dependencies.Client;
            var notifications = context.GetDataOrDefault<IEnumerable<InstagramNotification>>();

            var repo = new UserRepository();
            var user = await repo.GetUser("steve");
            var config = Dependencies.GetConfig(context.Request.RequestUri);

            var media = new Tags(config, new InstaSharp.Models.Responses.OAuthResponse
            {
                AccessToken = user.InstagramAccessToken,
                User = new InstaSharp.Models.UserInfo
                {
                    Username = "******"
                }
            });

            var result = await media.Recent(notifications.First().ObjectId);

            foreach (var image in result.Data)
            {
                hubContext.Value.Clients.All.showImage(image.Images.LowResolution.Url, image.User.Username, image.Caption.Text);
            }
            
            return;
        }
        /// <inheritdoc />
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string  action = context.Actions.First();
            JObject data   = context.GetDataOrDefault <JObject>();

            // map eventType to corresponding payload
            switch (action)
            {
            case "workitem.updated": return(ExecuteAsync(context, data.ToObject <WorkItemUpdatedPayload>()));

            case "workitem.restored": return(ExecuteAsync(context, data.ToObject <WorkItemRestoredPayload>()));

            case "workitem.deleted": return(ExecuteAsync(context, data.ToObject <WorkItemDeletedPayload>()));

            case "workitem.created": return(ExecuteAsync(context, data.ToObject <WorkItemCreatedPayload>()));

            case "workitem.commented": return(ExecuteAsync(context, data.ToObject <WorkItemCommentedOnPayload>()));

            case "message.posted": return(ExecuteAsync(context, data.ToObject <TeamRoomMessagePostedPayload>()));

            case "tfvc.checkin": return(ExecuteAsync(context, data.ToObject <CodeCheckedInPayload>()));

            case "build.complete": return(ExecuteAsync(context, data.ToObject <BuildCompletedPayload>()));

            default:
                string msg = string.Format(CultureInfo.CurrentCulture, VstsReceiverResources.Handler_NonMappedEventType, action);
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Warn(msg);
                return(ExecuteAsync(context, data));
            }
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about GitHub WebHook payloads, please see 
            // 'https://developer.github.com/webhooks/'
            JObject entry = context.GetDataOrDefault<JObject>();

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Dropbox WebHook payloads, please see 
            // 'https://www.dropbox.com/developers/reference/webhooks'
            JObject entry = context.GetDataOrDefault<JObject>();

            return Task.FromResult(true);
        }
Beispiel #11
0
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            string action = context.Actions.First();

            JObject data = context.GetDataOrDefault<JObject>();

            return AssignPendingToCommit(data);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            var action = context.Actions.First();
            var obj = context.GetDataOrDefault<JObject>();

            Storages.GetJObjectStorage().Save("github", obj);

            return Task.FromResult(true);
        }
Beispiel #13
0
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            string action = context.Actions.First();

            JObject data = context.GetDataOrDefault<JObject>();

            WebApiApplication.GitHubMessage = (string)data["comment"]["body"];

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            // Get JSON from WebHook
            JObject data = context.GetDataOrDefault<JObject>();

            // Get the action for this WebHook coming from the action query parameter in the URI
            string action = context.Actions.FirstOrDefault();

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Get Form data from WebHook
            // For more information about MailChimp WebHooks, please see 'https://apidocs.mailchimp.com/webhooks/'
            NameValueCollection data = context.GetDataOrDefault<NameValueCollection>();

            // Get the action for this WebHook coming from the action query parameter in the URI
            string action = context.Actions.FirstOrDefault();

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            // make sure we're only processing the intended type of hook
            if("GitHub".Equals(receiver, System.StringComparison.CurrentCultureIgnoreCase))
            {
                string action = context.Actions.First();
                JObject incoming = context.GetDataOrDefault<JObject>();
            }

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            // make sure we're only processing the intended type of hook
            if("Dropbox".Equals(receiver, System.StringComparison.CurrentCultureIgnoreCase))
            {
                // todo: replace this placeholder functionality with your own code
                string action = context.Actions.First();
                JObject incoming = context.GetDataOrDefault<JObject>();
            }

            return Task.FromResult(true);
        }
Beispiel #18
0
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Get data from WebHook
            CustomNotifications data = context.GetDataOrDefault<CustomNotifications>();

            // Get data from each notification in this WebHook
            foreach (IDictionary<string, object> notification in data.Notifications)
            {
                // Process data
            }

            return Task.FromResult(true);
        }
Beispiel #19
0
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Azure Kudu WebHook payloads, please see 
            // 'https://github.com/projectkudu/kudu/wiki/Web-hooks'
            KuduNotification notification = context.GetDataOrDefault<KuduNotification>();

            // Get the notification message
            string message = notification.Message;

            // Get the notification author
            string author = notification.Author;

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if ("GitHub".Equals(receiver,StringComparison.CurrentCultureIgnoreCase))
            {
                string action = context.Actions.First();
                var message = context.GetDataOrDefault<GitHubMessage>();
                message.SetActivityType();

                var activityToSave = message.ConvertToActivity();
                repository.AddNewActivity(activityToSave);                
            }

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Convert to POCO type
            KuduNotification notification = context.GetDataOrDefault<KuduNotification>();

            // Get the notification message
            string message = notification.Message;

            // Get the notification author
            string author = notification.Author;

            Trace.TraceInformation($"Author: {author}, message: {message}");

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Azure Alert WebHook payloads, please see 
            // 'https://azure.microsoft.com/en-us/documentation/articles/insights-webhooks-alerts/'
            AzureAlertNotification notification = context.GetDataOrDefault<AzureAlertNotification>();

            // Get the notification status
            string status = notification.Status;

            // Get the notification name
            string name = notification.Context.Name;

            // Get the name of the metric that caused the event
            string author = notification.Context.Condition.MetricName;

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Slack WebHook payloads, please see 
            // 'https://api.slack.com/outgoing-webhooks'
            NameValueCollection entry = context.GetDataOrDefault<NameValueCollection>();

            // We can trace to see what is going on.
            Trace.WriteLine(entry.ToString());

            // Switch over the IDs we used when configuring this WebHook 
            switch (context.Id)
            {
                case "trigger":
                    MatchCollection matches = Regex.Matches(entry["text"], pattern);
                    var spreadsheetService = new GoogleDocService();
                    foreach (Match match in matches)
                    {
                        var insertItem = new Bill
                        {
                            Money = match.Groups["money"].Value,
                            ShopName = match.Groups["shopname"].Value,
                            Date = DateTime.ParseExact(DateTime.Today.Year + "/" + match.Groups["date"].Value, "yyyy/MM/dd", CultureInfo.InvariantCulture),
                            UserName = match.Groups["username"].Value
                        };
                        spreadsheetService.Insert(insertItem);
                    }

                    // Information can be returned using a SlackResponse
                    var triggerReply = new SlackResponse(
                        "Update Google SpreadSheet(RTBS 체크카드 사용 내역서)" + 
                        Environment.NewLine + 
                        "누적 " + spreadsheetService.GetTotalMoney() + "원");
                    context.Response = context.Request.CreateResponse(triggerReply);
                    break;

                case "slash":
                    // Information can be returned in a plain text response
                    context.Response = context.Request.CreateResponse();
                    context.Response.Content = new StringContent("Hello slash command!");
                    break;
            }

            return Task.FromResult(true);
        }
Beispiel #24
0
        /// <inheritdoc />
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            string  action = context.Actions.First();
            JObject data   = context.GetDataOrDefault <JObject>();

            // Check if a payload is available
            JToken payload;

            if (data == null || !data.TryGetValue(PayloadPropertyName, out payload))
            {
                string msg = string.Format(CultureInfo.CurrentCulture, MyGetReceiverResources.Receiver_NoPayload, PayloadPropertyName);
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Error(msg);
                context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, msg);
                return(Task.FromResult(true));
            }

            // Cast to correct payload type
            switch (action)
            {
            case "PackageAddedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <PackageAddedPayload>()));

            case "PackageDeletedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <PackageDeletedPayload>()));

            case "PackageListedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <PackageListedPayload>()));

            case "PackagePinnedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <PackagePinnedPayload>()));

            case "PackagePushedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <PackagePushedPayload>()));

            case "BuildQueuedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <BuildQueuedPayload>()));

            case "BuildStartedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <BuildStartedPayload>()));

            case "BuildFinishedWebHookEventPayloadV1": return(ExecuteAsync(receiver, context, payload.ToObject <BuildFinishedPayload>()));
            }

            return(ExecuteUnknownPayloadAsync(receiver, context, (JObject)payload));
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            // Get data from WebHook
            CustomNotifications data = context.GetDataOrDefault<CustomNotifications>();

            // Get data from each notification in this WebHook
            foreach (IDictionary<string, object> notification in data.Notifications)
            {
                Storages.GetObjectStorage().Save(
                    "custom",
                    //data.Id, 
                    Serialize(notification));
            }

            //var action = context.Actions.First();
            //var obj = context.GetDataOrDefault<Object>();

            return Task.FromResult(true);
        }
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if ("GitHub".Equals(receiver, StringComparison.CurrentCultureIgnoreCase))
            {
                QueueManager queue = null;
                try
                {
                    queue = new QueueManager();
                    string actions = string.Join(", ", context.Actions);
                    JObject incoming = context.GetDataOrDefault<JObject>();

                    queue.WriteToQueueStorage("githubqueue", actions, incoming.ToString());
                }
                catch (Exception ex)
                {
                    queue?.WriteToQueueStorage("githubqueue", "error", ex.Message);
                }
            }
            return Task.FromResult<object>(null);
        }
        public override async Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Get the WebHook client
            InstagramWebHookClient client = Dependencies.Client;

            // Convert the incoming data to a collection of InstagramNotifications
            var notifications = context.GetDataOrDefault<IEnumerable<InstagramNotification>>();
            foreach (var notification in notifications)
            {
                // Use WebHook client to get detailed information about the posted media
                var entries = await client.GetRecentGeoMedia(context.Id, notification.ObjectId);
                foreach (JToken entry in entries)
                {
                    // Get direct links and sizes of media
                    var thumbnail = entry["images"]["thumbnail"].ToObject<InstagramMedia>();
                    var lowres = entry["images"]["low_resolution"].ToObject<InstagramMedia>();
                    var std = entry["images"]["standard_resolution"].ToObject<InstagramMedia>();
                }
            }
        }
        public override async Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Convert the incoming data to a collection of InstagramNotifications
            var notifications = context.GetDataOrDefault<InstagramNotificationCollection>();

            // Get the config used by InstaSharp client
            InstagramConfig config = Dependencies.InstagramConfig;

            // Access media references in notifications
            foreach (var notification in notifications)
            {
                // If we have an access token then get the media using InstaSharp.
                OAuthResponse auth;
                if (Dependencies.Tokens.TryGetValue(notification.UserId, out auth))
                {
                    var media = new Media(config, auth);
                    MediaResponse mediaResponse = await media.Get(notification.Data.MediaId);
                }
            }
        }
        public override Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // For more information about Stripe WebHook payloads, please see 
            // 'https://stripe.com/docs/webhooks'
            StripeEvent entry = context.GetDataOrDefault<StripeEvent>();

            // We can trace to see what is going on.
            Trace.WriteLine(entry.ToString());

            // Switch over the event types if you want to
            switch (entry.Type)
            {
                default:
                    // Information can be returned in a plain text response
                    context.Response = context.Request.CreateResponse();
                    context.Response.Content = new StringContent(string.Format("Hello {0} event!", entry.Type));
                    break;
            }

            return Task.FromResult(true);
        }
        public override async Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Get the WebHook client
            InstagramWebHookClient client = Dependencies.Client;

            // Convert the incoming data to a collection of InstagramNotifications
            var notifications = context.GetDataOrDefault<IEnumerable<InstagramNotification>>();
            foreach (var notification in notifications)
            {
                logger.Debug("Received notification: " + notification.ObjectId);

                // Use WebHook client to get detailed information about the posted media
                var entries = await client.GetRecentGeoMedia(context.Id, notification.ObjectId);
                foreach (JToken entry in entries)
                {
                    logger.Debug("Object: " + entry.ToString());

                    InstagramPost post = entry.ToObject<InstagramPost>();
                    
                    // Image information 
                    if (post.Images != null)
                    {
                        InstagramMedia thumbnail = post.Images.Thumbnail;
                        InstagramMedia lowRes = post.Images.LowResolution;
                        InstagramMedia stdRes = post.Images.StandardResolution;

                        var InstImage = new InstagramImage();
                        InstImage.Address = stdRes.Address.ToString();
                        InstImage.Height = stdRes.Height;
                        InstImage.Width = stdRes.Width;
                        
                        SaveImage(InstImage);

                        logger.Debug("Saved image: " + InstImage.Address);
                    }
                }
            }
        }
        public override async Task ExecuteAsync(string generator, WebHookHandlerContext context)
        {
            // Get the WebHook client
            InstagramWebHookClient client = Dependencies.Client;

            // Convert the incoming data to a collection of InstagramNotifications
            var notifications = context.GetDataOrDefault<InstagramNotificationCollection>();
            foreach (var notification in notifications)
            {
                // Use WebHook client to get detailed information about the posted media
                JArray entries = await client.GetRecentGeoMedia(context.Id, notification.ObjectId);
                foreach (JToken entry in entries)
                {
                    InstagramPost post = entry.ToObject<InstagramPost>();

                    // Image information
                    if (post.Images != null)
                    {
                        InstagramMedia thumbnail = post.Images.Thumbnail;
                        InstagramMedia lowRes = post.Images.LowResolution;
                        InstagramMedia stdRes = post.Images.StandardResolution;
                    }

                    // Video information
                    if (post.Videos != null)
                    {
                        InstagramMedia lowBandwidth = post.Videos.LowBandwidth;
                        InstagramMedia lowRes = post.Videos.LowResolution;
                        InstagramMedia stdRes = post.Videos.StandardResolution;
                    }

                    // Get direct links and sizes of media
                    Uri link = post.Link;
                }
            }
        }
        public override  Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            var entry = context.GetDataOrDefault<JObject>();

            // Extract the action -- for Bitbucket we have only one.
            var action = context.Actions.First();
            switch (action)
            {
                case "repo:push":
                    // Extract information about the repository
                    var repository = entry["repository"].ToObject<BitbucketRepository>();

                    // Information about the user causing the event
                    var actor = entry["actor"].ToObject<BitbucketUser>();

                    // Information about the specific changes
                    foreach (var change in entry["push"]["changes"])
                    {
                        // The previous commit
                        var oldTarget = change["old"]["target"].ToObject<BitbucketTarget>();

                        // The new commit
                        var newTarget = change["new"]["target"].ToObject<BitbucketTarget>();
                    }
                    break;
                case "issue:created":
                    var issue = entry["issue"].ToObject<BitbucketIssue>();
                    _repository.Create(issue).Wait();
                    break;
                default:
                    Trace.WriteLine(entry.ToString());
                    break;
            }

            return Task.FromResult(true);
        }
        /// <inheritdoc />
        public override Task ExecuteAsync(string receiver, WebHookHandlerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            var data = context.GetDataOrDefault <JObject>();

            //check if data is available
            if (data == null)
            {
                var message = "The WebHook request must contain a valid JSON payload.";
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Error(message);
                context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, message);
                return(Task.FromResult(true));
            }

            //the unix timestamp in milliseconds when the webhook was created. This allows detecting delayed webhooks if necessary.
            var createdAt = data.Value <long?>(PusherConstants.EventRequestCreatedAtPropertyName);

            if (!createdAt.HasValue)
            {
                var message = string.Format(CultureInfo.CurrentCulture, "The WebHook request must contain a '{0}' JSON property containing the unix timestamp in milliseconds when the webhook was created.", PusherConstants.EventRequestCreatedAtPropertyName);
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Error(message);
                context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, message);
                return(Task.FromResult(true));
            }

            var events = data.Value <JArray>(PusherConstants.EventRequestPropertyContainerName);

            //check if data has events property
            if (events == null)
            {
                var message = string.Format(CultureInfo.CurrentCulture, "The WebHook request must contain a '{0}' JSON property containing the events payload.", PusherConstants.EventRequestPropertyContainerName);
                context.RequestContext.Configuration.DependencyResolver.GetLogger().Error(message);
                context.Response = context.Request.CreateErrorResponse(HttpStatusCode.BadRequest, message);
                return(Task.FromResult(true));
            }

            //iterate over events, needed for batch events support, see https://blog.pusher.com/batch-webhooks/
            foreach (JObject @event in events)
            {
                var eventName = @event.Value <string>(PusherConstants.EventNamePropertyName);

                switch (eventName)
                {
                case "channel_occupied":
                    var channelOccupiedPayload = @event.ToObject <ChannelOccupiedPayload>();
                    channelOccupiedPayload.CreatedAt = createdAt.Value;
                    ChannelOccupied(context, channelOccupiedPayload);
                    break;

                case "channel_vacated":
                    var channelVacatedPayload = @event.ToObject <ChannelVacatedPayload>();
                    channelVacatedPayload.CreatedAt = createdAt.Value;
                    ChannelVacated(context, channelVacatedPayload);
                    break;

                case "member_added":
                    var memberAddedPayload = @event.ToObject <MemberAddedPayload>();
                    memberAddedPayload.CreatedAt = createdAt.Value;
                    MemberAdded(context, memberAddedPayload);
                    break;

                case "member_removed":
                    var memberRemovedPayload = @event.ToObject <MemberRemovedPayload>();
                    memberRemovedPayload.CreatedAt = createdAt.Value;
                    MemberRemoved(context, memberRemovedPayload);
                    break;

                case "client_event":
                    var clientEventPayload = @event.ToObject <ClientEventPayload>();
                    clientEventPayload.CreatedAt = createdAt.Value;
                    ClientEvent(context, clientEventPayload);
                    break;

                default:
                    var message = string.Format(CultureInfo.CurrentCulture, "The property 'name' contains unmapped value '{0}'.", eventName);
                    context.RequestContext.Configuration.DependencyResolver.GetLogger().Warn(message);
                    UnknownEvent(context, @event);
                    break;
                }
            }

            return(Task.FromResult(true));
        }