Greetings! I am a Programmer and I am currently experimenting with Basic Admin Essentials 2.0 module for my group.
What’s the problem and what do I need?
I want to make paste logs for my group, this command will be used at the interview centre so interviewers can catch cheaters.
How should the command work?
The command is similar to any logs in Basic Admin Essentials 2.0, it would create a new log for every server, it is the same like chatlogs but it will only create and put data if someone pasted into chat and sent it. If someone copy-pasted into chat and sent it in the UI it will look like this Username: what they said here.
Modules and loaders
You may find the loader here
You may find the module here
NOTE: The module won’t appear in toolbox so you have to enter in the command bar game:GetService("InsertService"):LoadAsset(563619835,true).Parent = workspace.
CONTACT ME
The best way to contact me is through Discord, but you can just reply, here’s my user: artyom.#7685
Thank you
If you helped me, thank you! Your help is much appreciated and you might be invited to our development team.
Nope, I can’t understand how to make it and I need your help, because I have the local script:
UserInputService.InputBegan:Connect(function(InputObject, Processed)
if InputObject.KeyCode == Enum.KeyCode.LeftControl or InputObject.KeyCode == Enum.KeyCode.RightControl and InputObject.KeyCode == Enum.KeyCode.V then
print("Someone copied and pasted into chat")
-- here should be the part about BAE
end
end)
An InputObject’s KeyCode property can’t be two things at once, that makes no sense.
What you can do is determine if they are already holding down control.
UserInputService.InputBegan:Connect(function(input, engine_processed)
local left_ctrl_key_down = UserInputService:IsKeyDown(Enum.KeyCode.LeftControl)
local right_ctrl_key_down = UserInputService:IsKeyDown(Enum.KeyCode.RightControl
if (left_ctrl_key_down or right_ctrl_key_down) and input.KeyCode == Enum.KeyCode.V then
print("Someone copied and pasted into chat")
-- here should be the part about BAE
end
end)
Do note that exploiters can easily bypass this and if it’s possible to change the copy-paste keybinds or add custom ones, this won’t account for that as well. By the way there is parentheses around left_ctrl_key_down or right_ctrl_key_down because and has higher precedence than or.
What I would do is when you detect someone used Control V connect a .chatted event to them and wait for the message. You can then use the message parameter to log what the player sent.
You can just bind an action like crouch to CTRL key and when they crouch constantly, you can know that they are copy pasting.
If you want it to be more clear, you can use tick() and UserInputService, check the V key until timeout. If you don’t use this, they can get warned wrongly. Keep in mind GameProcessedEvent needs to be true in order to this method to work.
Disagree—players will use it to actually be able to crouch.
You have to press v while the control key is held. If you release the control key you can’t use the shortcut anymore. It is not a matter of “if you release control and don’t press v in a certain amount of time the shortcut stops working”.
You need to get the currently focused text box using UserInputService:GetFocusedTextBox. If you want this solely for the chat box then just get it by
local client = game:GetService("Players").LocalPlayer
local chat_box = client.PlayerGui.Chat:FindFirstChild("ChatBar", true)
local old_text = chat_box.Text
chat_box:GetPropertyChangedSignal("Text"):Connect(function()
local new_text = chat_box.Text
if #new_text - #old_text > 1 then
print("Player copy-pasted")
end
old_text = new_text
end)
If it’s while the player is in a focused text box then yes this can work. But a crouch feature doesn’t fit all games.
local PlayerCommand = Message:gmatch("%w+")()
if not PlayerCommand then
return
else
PlayerCommand = PlayerCommand:lower()
end
local PlayerPrefix = Message:sub(1,1):lower()
local PlayerPermission = returnPermission(Player)
if PlayerPermission <= 0 then
-- Truncate the message for non-admins
-- If admins are sending excessively long messages in your game, you have a different problem.
Message = Message:sub(1,1000)
end
local Command = CommandsDictionary[PlayerCommand]
if Command then
local CommandName = Command[1]
local CommandPrefix = Command[2]
local CommandFunction = Command[3]
local CommandPermission = Command[4]
if (PlayerCommand == CommandName) then
if (PlayerPermission >= CommandPermission) then
local ActionCommandUsed = (CommandPrefix == sysTable.actionPrefix and PlayerPrefix == CommandPrefix) and Message:sub(2)
local RegularCommandUsed = ((#CommandPrefix == 0 and PlayerCommand:sub(1,1) == PlayerPrefix) and Message) or ((PlayerPrefix == CommandPrefix) and Message:sub(2))
local MessageWithoutPrefix = ActionCommandUsed or RegularCommandUsed or nil
if MessageWithoutPrefix then
local Arguments = {}
table.insert(Arguments, Player)
for Segment in string.gmatch(MessageWithoutPrefix, "%S+") do
if not Arguments[2] then
table.insert(Arguments,Segment:lower())
else
table.insert(Arguments,Segment)
end
end
local Success,Error = pcall(function()
CommandFunction(Arguments)
end)
if Success == true then
local cleanedMessage
local Cleaned,newData = cleanUserData(Message,Player,false)
if Cleaned and newData then
cleanedMessage = newData
elseif not Cleaned then
cleanedMessage = newData
end
if cleanedMessage then
pluginEvent:Fire("Admin Logs",{Player,newData})
else
addLog(sysTable.Logs,{Sender = Player,Bypass = true,Data = '(super safechat) executed "'..tostring(b[1] or "???")..'"',Tag = true})
return
end
addLog(sysTable.Logs,{Sender = Player,Data = cleanedMessage}) -- Store the filter instance once we can use it properly.
elseif Error ~= nil then
addLog(sysTable.debugLogs,'"'..Arguments[2]..'"| Error: '..Error)
essentialsEvent:FireClient(Player,'Message','Function Error','Name: "'..Arguments[2]..'"\n'..Error)
end
end
end
end
end
if Chatted == true then
local cleanedMessage
local function Redo()
local Succ,Msg = pcall(function()
cleanedMessage = chatService:FilterStringForBroadcast(Message,Player)
end)
if not Succ then
wait(1)
Redo()
end
end
Redo()
Player.Chatted:connect(function(Message)
onChatted(Message,Player,true)
end)
spawn(function()
pcall(function()
for otherPlayer,nameData in next,sysTable.localNames do
local filteredName
local Cleaned,newData = cleanUserData(nameData.Data,nameData.Sender,Player)
if Cleaned then
filteredName = newData
end
if filteredName then
for c,d in next,playerService:GetPlayers() do
essentialsEvent:FireClient(Player,'Local Name',otherPlayer,filteredName)
end
end
end
end)
end)
You actually don’t have to use the chatted events (I really need to stop using Dev forum at 4 am)
You could easily use the code @sjr04 has provided and get the copy pasted text using some string manipulation. Then its up to you with what you want to do with it send it to the server and have it be displayed in some GUI somewhere. Im pretty sure Basic Admin essential has a way to add a custom command in. So you could just add in your new custom command that GUI. Best of luck