private async void Overlay_OnWebSocketConnectedOccurred(object sender, EventArgs e)
        {
            IOverlayEndpointService overlay = (IOverlayEndpointService)sender;

            this.OnOverlayConnectedOccurred(overlay, new EventArgs());

            Logger.Log("Client connected to Overlay Endpoint - " + overlay.Name);

            overlay.StartBatching();
            foreach (OverlayWidgetModel widget in ChannelSession.Settings.OverlayWidgets.Where(ow => ow.OverlayName.Equals(overlay.Name)))
            {
                try
                {
                    if (widget.IsEnabled)
                    {
                        await widget.ShowItem();

                        await widget.LoadCachedData();

                        await widget.UpdateItem();
                    }
                }
                catch (Exception ex) { Logger.Log(ex); }
            }
            await overlay.EndBatching();
        }
        private async Task WidgetsBackgroundUpdate(CancellationToken token)
        {
            token.ThrowIfCancellationRequested();

            UserViewModel user = ChannelSession.GetCurrentUser();

            foreach (var widgetGroup in ChannelSession.Settings.OverlayWidgets.GroupBy(ow => ow.OverlayName))
            {
                IOverlayEndpointService overlay = this.GetOverlay(widgetGroup.Key);
                if (overlay != null)
                {
                    overlay.StartBatching();
                    foreach (OverlayWidgetModel widget in widgetGroup)
                    {
                        try
                        {
                            if (!widget.Item.IsInitialized)
                            {
                                await widget.Initialize();
                            }

                            if (widget.IsEnabled)
                            {
                                if (!widget.Item.IsEnabled)
                                {
                                    await widget.Enable();
                                }
                                else if (widget.SupportsRefreshUpdating && widget.RefreshTime > 0 && (this.updateSeconds % widget.RefreshTime) == 0)
                                {
                                    await widget.UpdateItem();
                                }
                            }
                            else
                            {
                                if (widget.Item.IsEnabled)
                                {
                                    await widget.Disable();
                                }
                            }
                        }
                        catch (Exception ex) { Logger.Log(ex); }
                    }
                    await overlay.EndBatching();
                }
            }

            this.updateSeconds++;
        }