Hi everyone, I’ve made a report gui using discord’s webhooks.
As you may know, discord doesn’t allow Roblox requests anymore, so I used a proxy in order to get through.
And, it turned out to be good.
Here it is in action:
To set everything up, open the Read me folder and the script inside of it.
The folder should be in game; yes; a literal game DataModel.
If you’re going to use this in your game, please add credit. Thank you!
If you have any issues/feedback, make sure to reply and I will read them. report_gui.rbxl (88.2 KB)
Its in OpenAndClose script; path: StarterGui.ThemeProvider.TopBarFrame.RightFrame.MoreMenu.OpenReportGui.OpenAndClose
Line 19 for horizontal tween, line 27 for vertical.
On line 26, there’s a wait(0.3) function, you can remove that too.
You shouldn’t be using discord like this. Discord isn’t meant for logging. You should rather use a service which is for logging. Doing this could get your webhook taken down, or even worse, your account.
Many developers have used Discord to report players from servers; and the script that sends the information about the report is not desinged for logging. I’m using Player properties just to get what’s useful - account age(if the reported player is an alt) and the server link(so a mod could be able to join).
I don’t know where logging takes place, excluding sending Player’s account age to a channel.
Kinda late, but yes, it’s possible! Store the avatar’s property and send within the JSON payload.
Here’s how:
Add a thumbnail variable to the post script located in SSS; should look like this:
local img = "https://www.roblox.com/headshot-thumbnail/image?userId="..player.UserId.."&width=420&height=420&format=png"
Change the :createEmbed function in the WebhookService script to this:
function webhookService:createEmbed(url, title, message, image, content)
local data = {
['avatar_url'] = image,
['content'] = content,
['embeds'] = {{
['author'] = {
['name'] = title
},
['description'] = message,
['type'] = "rich",
["color"] = tonumber(0xffffff)
}}
}
local finalData = https:JSONEncode(data)
https:PostAsync(url, finalData)
end
And there it is! Don’t forget to change the image property in the post script:
(replace lines in the script with the snippet below(paste at ws:createEmbed(), should be around line 55))
Wouldn’t it be logical to just use a return statement instead of kicking the player if they spam the event? God knows, they might have slow internet, and spam the button because they’re impatient, and then they’ll get kicked for spamming it too much
Wouldn’t it be logical to just use a return statement
Don’t you want an exploiter to get kicked out of the game(banned, if using datastores) once they spam the remoteevent? Why use a return statement instead of kicking the bad guy out? That’s the same as not allowing a criminal get into the bank’s vault when he’s killing all of the employees
and spam the button because they’re impatient
First of all, they wont be able to spam it, since the script disables it instantly after player sends a remote event; tested it with an autoclick with a delay of 3ms
Second, “they’re impatient”, this really sounds like a player’s problem
Who in their right mind will spam the button after they read the info section? Furthermore, the person with a slow internet knows that they have slow internet, and they surely have been punished in the past(assuming that they’ve been spamming various buttons on various games); they would learn their lesson and wait for everything to load first, either wait for the button to send a remoteevent; not mentioning that you have to have potato iq to spam the button, where it clearly said not to(info section)
and then they’ll get kicked for spamming it too much
Even if it happens, it would probably be once in 2 years; i haven’t seen anyone be that dumb and clueless when it comes to spamming buttons. Sure, there are children on roblox, but, would they really take the risk? They might be 9; hell, 5, but the chance of joining the game where it uses this exact report gui, and clicking it afterwards, is nearly 0.
Cooldown is already built into it; if the bad guy tries to remove it, he’ll get kicked afterwards
If the bad guy tries to remove the script where it kicks him, he will also get kicked too, since the script that does the sending the event job also checks for script changes. Kind of a recursive loop;
If the bad guy tries to remove these 2 scripts at the same time, he wont get kicked, but the report gui will not work, even the event wont work since it is connected to the server script cooldown check
tl;dr cooldown exists, and it’s able to hold off 95% of all exploiters
The string evidence works exact same as reason, you can simply edit the contents of both scripts(server script that sends the event; localscript that sends a request to fire a remoteevent) and rename some buttons(self-explanatory)
Is there a way to make it so the evidence field requires a user to submit some sort of link in order for the submission to be accepted? I want to ensure users submit video evidence of scripting.
Yes, it’s possible!
You should use string.find() and look for https://;
To do this, you have to check the evidence variable for having https:// in the Submit local script, under submit button.
Example:
local evidence = (...).Selector.Text
linkCheck = function()
if string.find(evidence, "https://") then
return true
else
return false
end
end
--// some code here
if evidence.Text and linkCheck() then
-- send web req
end