-- This is pcalled because the SetCore methods may not be released yet.
pcall(function()
	PlayerBlockedEvent = StarterGui:GetCore("PlayerBlockedEvent")
	PlayerMutedEvent = StarterGui:GetCore("PlayerMutedEvent")
	PlayerUnBlockedEvent = StarterGui:GetCore("PlayerUnblockedEvent")
	PlayerUnMutedEvent = StarterGui:GetCore("PlayerUnmutedEvent")
end)

function SendSystemMessageToSelf(message)
	local currentChannel = ChatWindow:GetCurrentChannel()

	if currentChannel then
		local messageData = {
			ID = -1,
			FromSpeaker = nil,
			SpeakerUserId = 0,
			OriginalChannel = currentChannel.Name,
			IsFiltered = true,
			MessageLength = string.len(message),
			MessageLengthUtf8 = utf8.len(utf8.nfcnormalize(message)),
			Message = trimTrailingSpaces(message),
			MessageType = ChatConstants.MessageTypeSystem,
			Time = os.time(),
			ExtraData = nil,
		}

		currentChannel:AddMessageToChannel(messageData)
	end
end

function MutePlayer(player)
	local mutePlayerRequest = DefaultChatSystemChatEvents:FindFirstChild("MutePlayerRequest")
	if mutePlayerRequest then
		return mutePlayerRequest:InvokeServer(player.Name)
	end
	return false
end

if PlayerBlockedEvent then
	PlayerBlockedEvent.Event:connect(function(player)
		if MutePlayer(player) then
			local playerName

			if ChatSettings.PlayerDisplayNamesEnabled then
				playerName = player.DisplayName
			else
				playerName = player.Name
			end

			SendSystemMessageToSelf(
				ChatLocalization:Get(
					"GameChat_ChatMain_SpeakerHasBeenBlocked",
					string.format("Speaker '%s' has been blocked.", playerName),
					{ RBX_NAME = playerName }
				)
			)
		end
	end)
end

if FFlagUserHandleFriendJoinNotifierOnClient then
	local function ShowFriendJoinNotification()
		if ChatSettings.ShowFriendJoinNotification ~= nil then
			return ChatSettings.ShowFriendJoinNotification
		end
		return false
	end

	if ShowFriendJoinNotification() then
		Players.PlayerAdded:Connect(function(newPlayer)
			local success, isFriends = pcall(function()
				return newPlayer:IsFriendsWith(LocalPlayer.UserId)
			end)

			if success and isFriends then
				local joinedFriendName = newPlayer.Name
				if ChatSettings.PlayerDisplayNamesEnabled then
					joinedFriendName = newPlayer.DisplayName
				end

				local msg = ChatLocalization:FormatMessageToSend("GameChat_FriendChatNotifier_JoinMessage",
					string.format("Your friend %s has joined the game.", joinedFriendName),
					"RBX_NAME",
					joinedFriendName)

				SendSystemMessageToSelf(msg)
			end
		end)
	end
end

if PlayerMutedEvent then
	PlayerMutedEvent.Event:connect(function(player)
		if MutePlayer(player) then
			local playerName

			if ChatSettings.PlayerDisplayNamesEnabled then
				playerName = player.DisplayName
			else
				playerName = player.Name
			end

			SendSystemMessageToSelf(
				ChatLocalization:Get(
					"GameChat_ChatMain_SpeakerHasBeenMuted",
					string.format("Speaker '%s' has been muted.", playerName),
					{ RBX_NAME = playerName }
				)
			)
		end
	end)
end

function UnmutePlayer(player)
	local unmutePlayerRequest = DefaultChatSystemChatEvents:FindFirstChild("UnMutePlayerRequest")
	if unmutePlayerRequest then
		return unmutePlayerRequest:InvokeServer(player.Name)
	end
	return false
end

if PlayerUnBlockedEvent then
	PlayerUnBlockedEvent.Event:connect(function(player)
		if UnmutePlayer(player) then
			local playerName

			if ChatSettings.PlayerDisplayNamesEnabled then
				playerName = player.DisplayName
			else
				playerName = player.Name
			end

			SendSystemMessageToSelf(
				ChatLocalization:Get(
					"GameChat_ChatMain_SpeakerHasBeenUnBlocked",
					string.format("Speaker '%s' has been unblocked.", playerName),
					{ RBX_NAME = playerName }
				)
			)
		end
	end)
end

if PlayerUnMutedEvent then
	PlayerUnMutedEvent.Event:connect(function(player)
		if UnmutePlayer(player) then
			local playerName

			if ChatSettings.PlayerDisplayNamesEnabled then
				playerName = player.DisplayName
			else
				playerName = player.Name
			end

			SendSystemMessageToSelf(
				ChatLocalization:Get(
					"GameChat_ChatMain_SpeakerHasBeenUnMuted",
					string.format("Speaker '%s' has been unmuted.", playerName),
					{ RBX_NAME = playerName }
				)
			)
		end
	end)
end