public async Task HandleEventAsync(object?sender, UnturnedPlayerChattingEvent @event)
        {
            var isAdmin = @event.Player.SteamPlayer.isAdmin;
            var isGold  = @event.Player.SteamPlayer.isPro;

            if (!m_Configuration.GetSection("override:color:admin").Get <bool>() && isAdmin || Provider.hideAdmins)
            {
                return;
            }

            if (!m_Configuration.GetSection("override:color:gold").Get <bool>() && isGold)
            {
                return;
            }

            var id          = @event.Player.SteamId.ToString();
            var displayName = @event.Player.SteamPlayer.playerID.characterName;

            var role = await m_PermissionExtensions.GetOrderedPermissionRoleData(id, KnownActorTypes.Player);

            if (role == null)
            {
                m_Logger.LogDebug("Role for player {Name}({Id}) not found", displayName, id);
                return;
            }

            m_Logger.LogDebug("Found role {RoleDisplayName}({RoleId}) for player {PlayerName}({PlayerId})",
                              role.DisplayName, role.Id, displayName, id);

            if (role.Data !.TryGetValue("color", out var unparsedColor) && unparsedColor is string @string)
            {
                var color = ColorTranslator.FromHtml(@string);

                if (!color.IsEmpty)
                {
                    m_Logger.LogDebug("Change color {UColor} to {SColor}", @event.Color, color);
                    @event.Color = color.ToUnityColor();
                    return;
                }
            }

            unparsedColor ??= "<unknown>";
            m_Logger.LogDebug("Cannot translate color {UnparsedColor} to System.Drawing.Color", unparsedColor);

            var eventIsCancelled = @event.IsCancelled;
            var eventColor       = @event.Color.ToSystemColor();

            CallRocketPlayerChatted(@event.Player, @event.Mode, @event.Message, ref eventColor,
                                    ref eventIsCancelled);

            @event.IsCancelled = eventIsCancelled;
            @event.Color       = eventColor.ToUnityColor();
        }
        public async Task HandleEventAsync(object?sender, UnturnedUserConnectingEvent @event)
        {
            var role = await m_PermissionExtensions.GetOrderedPermissionRoleData(@event.User.Id, @event.User.Type);

            if (role == null)
            {
                m_Logger.LogDebug("Role for player {FullName} not found", @event.User.FullActorName);
                return;
            }

            m_Logger.LogDebug("Found role {RoleDisplayName}({RoleId}) for player {FullName}",
                              role.DisplayName, role.Id, @event.User.FullActorName);

            var prefix = role.Data?.ContainsKey("prefix") ?? false ? role.Data["prefix"] : string.Empty;
            var suffix = role.Data?.ContainsKey("suffix") ?? false ? role.Data["suffix"] : string.Empty;

            string pendingName = prefix + @event.User.DisplayName + suffix;

            m_Logger.LogDebug("Change name {DisplayName} to {PendingName}", @event.User.DisplayName, pendingName);
            @event.User.SteamPending.playerID.characterName = pendingName;
        }