Skip to content

Commit 1870954

Browse files
committed
Rate limit
1 parent b880043 commit 1870954

File tree

5 files changed

+88
-5
lines changed

5 files changed

+88
-5
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package com.javadiscord.jdi;
2+
3+
public class RateLimit {
4+
private String bucket;
5+
private int limit;
6+
private int remaining;
7+
private long reset;
8+
private int resetAfter;
9+
private boolean globalRateLimit;
10+
11+
public RateLimit() {}
12+
13+
public String getBucket() {
14+
return bucket;
15+
}
16+
17+
public void setBucket(String bucket) {
18+
this.bucket = bucket;
19+
}
20+
21+
public int getLimit() {
22+
return limit;
23+
}
24+
25+
public void setLimit(int limit) {
26+
this.limit = limit;
27+
}
28+
29+
public int getRemaining() {
30+
return remaining;
31+
}
32+
33+
public void setRemaining(int remaining) {
34+
this.remaining = remaining;
35+
}
36+
37+
public long getReset() {
38+
return reset;
39+
}
40+
41+
public void setReset(long reset) {
42+
this.reset = reset;
43+
}
44+
45+
public int getResetAfter() {
46+
return resetAfter;
47+
}
48+
49+
public void setResetAfter(int resetAfter) {
50+
this.resetAfter = resetAfter;
51+
}
52+
53+
public boolean isGlobalRateLimit() {
54+
return globalRateLimit;
55+
}
56+
57+
public void setGlobalRateLimit(boolean globalRateLimit) {
58+
this.globalRateLimit = globalRateLimit;
59+
}
60+
}

api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.net.URI;
44
import java.net.http.HttpClient;
5+
import java.net.http.HttpHeaders;
56
import java.net.http.HttpRequest;
67
import java.net.http.HttpResponse;
78
import java.util.Map;
@@ -10,6 +11,8 @@
1011
import java.util.concurrent.atomic.AtomicBoolean;
1112
import java.util.stream.Stream;
1213

14+
import com.javadiscord.jdi.RateLimit;
15+
1316
import org.apache.logging.log4j.LogManager;
1417
import org.apache.logging.log4j.Logger;
1518

@@ -27,6 +30,8 @@ public class DiscordRequestDispatcher implements Runnable {
2730
private int numberOfRequestsSent;
2831
private long timeSinceLastRequest;
2932

33+
private RateLimit rateLimit = new RateLimit();
34+
3035
public DiscordRequestDispatcher(String botToken) {
3136
this.botToken = botToken;
3237
this.httpClient = HttpClient.newBuilder().build();
@@ -51,6 +56,14 @@ public void run() {
5156
long currentTime = System.currentTimeMillis();
5257
long elapsed = currentTime - timeSinceLastRequest;
5358

59+
if (rateLimit.getRemaining() == 0 && elapsed < rateLimit.getResetAfter()) {
60+
try {
61+
Thread.sleep(rateLimit.getResetAfter() - elapsed);
62+
} catch (InterruptedException e) {
63+
/* Ignore */
64+
}
65+
}
66+
5467
if (elapsed < 1000 && numberOfRequestsSent >= 50) {
5568
try {
5669
Thread.sleep(1000 - elapsed);
@@ -119,6 +132,17 @@ private void sendRequest(DiscordRequestBuilder discordRequestBuilder) {
119132
HttpResponse<String> response =
120133
httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
121134

135+
HttpHeaders headers = response.headers();
136+
headers.firstValue("x-ratelimit-bucket").ifPresent(val -> rateLimit.setBucket(val));
137+
headers.firstValue("x-ratelimit-limit")
138+
.ifPresent(val -> rateLimit.setLimit(Integer.parseInt(val)));
139+
headers.firstValue("x-ratelimit-remaining")
140+
.ifPresent(val -> rateLimit.setRemaining(Integer.parseInt(val)));
141+
headers.firstValue("x-ratelimit-reset")
142+
.ifPresent(val -> rateLimit.setReset(Long.parseLong(val)));
143+
headers.firstValue("x-ratelimit-reset-after")
144+
.ifPresent(val -> rateLimit.setResetAfter(Integer.parseInt(val)));
145+
122146
numberOfRequestsSent++;
123147
timeSinceLastRequest = System.currentTimeMillis();
124148

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/Gateway.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
@JsonIgnoreProperties(ignoreUnknown = true)
77
public record Gateway(
8-
String url,
9-
int shards,
8+
@JsonProperty("url") String url,
9+
@JsonProperty("shards") int shards,
1010
@JsonProperty("session_start_limit") SessionStartLimit sessionStartLimit
1111
) {}

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/SessionStartLimit.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
@JsonIgnoreProperties(ignoreUnknown = true)
77
public record SessionStartLimit(
8-
int total,
9-
int remaining,
8+
@JsonProperty("total") int total,
9+
@JsonProperty("remaining") int remaining,
1010
@JsonProperty("reset_after") long resetAfter,
1111
@JsonProperty("max_concurrency") int maxConcurrency
1212
) {}

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManagerProxy.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public void start(ConnectionMediator connectionMediator) {
1414
}
1515

1616
public void restart(ConnectionMediator connectionMediator) {
17-
1817
webSocketManager.restart(connectionMediator);
1918
}
2019

0 commit comments

Comments
 (0)