public BwoinkPanel(BwoinkSystem bwoinkSys, NetUserId userId)
        {
            RobustXamlLoader.Load(this);
            _bwoinkSystem = bwoinkSys;
            ChannelId     = userId;

            OnVisibilityChanged += c =>
            {
                if (c.Visible)
                {
                    Unread = 0;
                }
            };
            SenderLineEdit.OnTextEntered += Input_OnTextEntered;
        }
        public BwoinkWindow(BwoinkSystem bs)
        {
            RobustXamlLoader.Load(this);
            IoCManager.InjectDependencies(this);
            _bwoinkSystem = bs;

            _adminManager.AdminStatusUpdated += FixButtons;
            FixButtons();

            ChannelSelector.OnSelectionChanged += sel =>
            {
                _currentPlayer = sel;
                if (sel is not null)
                {
                    SwitchToChannel(sel.SessionId);
                    Title = $"{sel.CharacterName} / {sel.Username}";
                }

                foreach (var li in ChannelSelector.PlayerItemList)
                {
                    li.Text = FormatTabTitle(li);
                }
            };

            ChannelSelector.DecoratePlayer += (PlayerInfo pl, ItemList.Item li) =>
            {
                li.Text = FormatTabTitle(li, pl);
            };

            ChannelSelector.Comparison = (a, b) =>
            {
                var aChannelExists = _bwoinkSystem.TryGetChannel(a.SessionId, out var ach);
                var bChannelExists = _bwoinkSystem.TryGetChannel(b.SessionId, out var bch);
                if (!aChannelExists && !bChannelExists)
                {
                    return(0);
                }

                if (!aChannelExists)
                {
                    return(1);
                }

                if (!bChannelExists)
                {
                    return(-1);
                }

                return(bch !.LastMessage.CompareTo(ach !.LastMessage));
            };

            // ew
            Ban.OnPressed += _ =>
            {
                var bw = new BanWindow();
                bw.OnPlayerSelectionChanged(_currentPlayer);
                bw.Open();
            };

            Kick.OnPressed += _ =>
            {
                if (!TryConfirm(Kick))
                {
                    return;
                }

                // TODO: Reason field
                if (_currentPlayer is not null)
                {
                    _console.ExecuteCommand($"kick \"{_currentPlayer.Username}\"");
                }
            };

            Teleport.OnPressed += _ =>
            {
                if (_currentPlayer is not null)
                {
                    _console.ExecuteCommand($"tpto \"{_currentPlayer.Username}\"");
                }
            };

            Respawn.OnPressed += _ =>
            {
                if (!TryConfirm(Respawn))
                {
                    return;
                }

                if (_currentPlayer is not null)
                {
                    _console.ExecuteCommand($"respawn \"{_currentPlayer.Username}\"");
                }
            };
        }