Roblox to Discord report GUI

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:
RobloxStudioBeta_bwmszQPfTr

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)

Hope you enjoy!

17 Likes

Would definitely use it in the future, thanks but i want to know where can i edit the Tween? it seems too slow when you opened the GUI itself.

(can’t use this file since I’m on mobile)

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.

Not sure if you’re writing this in Script or LocalScript but i see that you use wait() on it there.

I’d suggest changing it to task.wait() since wait() is deprecated and it runs at 30 frames per seconds.

1 Like

Im just gonna say that is the COOLEST report sysyem

  1. Im a big fan of topbar things
  2. Its so neatly organized
  3. It even shows the account age and server link

Nice job :+1:

1 Like

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.

2 Likes

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.

Question: Is it possible to edit the embed in the script so the report message looks different/includes a player’s avatar?

Looks fantastic and works fantastic! Thanks OP.

1 Like

Kinda late, but yes, it’s possible! Store the avatar’s property and send within the JSON payload.
Here’s how:

  1. 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"
  1. 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))

ws:createEmbed(
	url,
	"Mod call",
	"Report caught!\n" ..
		"**" ..
		player.Name ..
		"**" ..
		" called a mod.\nReported player: **" .. 
		tostring(arg2) ..
		"**" ..
		"\nServer link: " ..
		"your game link" .. getjobid()
		..
		"\nEvidence: " 
		.. 
		arg3
		..
		"\n"..arg2.. "'s Account Age: ".. defineaccage() .. " days",
	img,
	"<@&985008802795511938>"
)

How do I make it so instead of evidence section it says “Reason”

Couldn’t this be abused? Even if you had cooldowns, an exploiter could potentially spam fire the event it’s using to send the request

There is an Anti-Spam which instantly kicks you if you spam the event

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

There could be a cool-down which we should be able to change (seconds) and then after that ends the player may send another report.

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