Skip to content

Commit b52a5e4

Browse files
committed
Rate limiting
1 parent f9bf28e commit b52a5e4

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

pages/api/sendmessage.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { NextApiRequest, NextApiResponse } from "next"
22
import fetch from "node-fetch"
33
import { config } from "../../utils/config"
44
import { parseUser } from "../../utils/parse-user"
5+
import { DiscordUser } from "../../utils/types"
56

67

78
export default async function api(req: NextApiRequest, res: NextApiResponse) {
@@ -17,10 +18,25 @@ export default async function api(req: NextApiRequest, res: NextApiResponse) {
1718
}
1819
}
1920

21+
if (ratelimit(user))
22+
return res.status(429).send("Please wait before clicking again")
23+
2024
const fetched = await fetch(`${config.discordUri}/testmessage/${user.id}`, {
2125
headers: { Authorization: `${config.discordSecret}`, "Content-Type": "application/json" },
2226
method: "POST"
2327
})
2428

2529
res.status(fetched.status).send(await fetched.text())
2630
}
31+
32+
const map = new Map<string, number>()
33+
function ratelimit(user: DiscordUser): boolean {
34+
if (map.get(user.id) ?? 0 > Date.now())
35+
return true
36+
37+
map.set(user.id, Date.now() + 3000)
38+
setTimeout(() => {
39+
map.delete(user.id)
40+
}, 3000)
41+
return false
42+
}

pages/tools/reminders.tsx

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ const erorrModalStyle: ReactModal.Styles = {
5252
}
5353
}
5454

55-
export default class Reminders extends Component<Props, { reminders: Reminder[], createReminderOpen: boolean }> {
55+
export default class Reminders extends Component<Props, { reminders: Reminder[], createReminderOpen: boolean, disabledTest: boolean }> {
5656
constructor(props: Props) {
5757
super(props)
5858
this.state = {
5959
reminders: this.props.reminders,
60-
createReminderOpen: false
60+
createReminderOpen: false,
61+
disabledTest: false
6162
}
6263
}
6364

@@ -86,8 +87,31 @@ export default class Reminders extends Component<Props, { reminders: Reminder[],
8687
})}
8788
/>)}
8889
<div className="flex flex-wrap gap-2">
89-
<span className="bg-blue-600 text-slate-50 w-fit px-3 py-1 text-center rounded-lg mt-2 cursor-pointer" onClick={() => sendTest()}>Send test message</span>
90-
<span className="bg-green-600 text-slate-50 w-fit px-3 py-1 text-center rounded-lg mt-2 cursor-pointer" onClick={() => this.setState({ createReminderOpen: true })}>Create reminder</span>
90+
<button
91+
className="bg-blue-600 disabled:bg-gray-900 text-slate-50 disabled:text-slate-400 w-fit px-3 py-1 text-center rounded-lg mt-2 cursor-pointer"
92+
onClick={() => {
93+
this.setState({
94+
disabledTest: true
95+
})
96+
97+
sendTest()
98+
99+
setTimeout(() => {
100+
this.setState({
101+
disabledTest: false
102+
})
103+
}, 5000)
104+
}}
105+
disabled={this.state.disabledTest}
106+
>
107+
Send test message
108+
</button>
109+
<button
110+
className="bg-green-600 text-slate-50 w-fit px-3 py-1 text-center rounded-lg mt-2 cursor-pointer"
111+
onClick={() => this.setState({ createReminderOpen: true })}
112+
>
113+
Create reminder
114+
</button>
91115
<CreateReminder
92116
isOpen={this.state.createReminderOpen}
93117
requestClose={() => this.setState({ createReminderOpen: false })}

0 commit comments

Comments
 (0)