diff --git a/pom.xml b/pom.xml
index d56061d9..94ac6fd0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
xyz.zcraft
Seira
- 1.6.0
+ 1.6.1
25
diff --git a/src/main/java/xyz/zcraft/seira/bot/QQApi.java b/src/main/java/xyz/zcraft/seira/bot/QQApi.java
index a58f1aa5..bc4b0465 100644
--- a/src/main/java/xyz/zcraft/seira/bot/QQApi.java
+++ b/src/main/java/xyz/zcraft/seira/bot/QQApi.java
@@ -41,28 +41,24 @@ public static String getWSSEndpoint(AccessToken accessToken) {
}
}
- public static AccessToken getAccessToken(String appId, String appSecret) {
- try {
- JsonObject payload = new JsonObject();
- payload.addProperty("appId", appId);
- payload.addProperty("clientSecret", appSecret);
+ public static AccessToken getAccessToken(String appId, String appSecret) throws Exception {
+ JsonObject payload = new JsonObject();
+ payload.addProperty("appId", appId);
+ payload.addProperty("clientSecret", appSecret);
- HttpRequest request = HttpRequest.newBuilder()
- .header("Content-Type", "application/json")
- .uri(URI.create("https://bots.qq.com/app/getAppAccessToken"))
- .POST(HttpRequest.BodyPublishers.ofString(payload.toString()))
- .build();
+ HttpRequest request = HttpRequest.newBuilder()
+ .header("Content-Type", "application/json")
+ .uri(URI.create("https://bots.qq.com/app/getAppAccessToken"))
+ .POST(HttpRequest.BodyPublishers.ofString(payload.toString()))
+ .build();
- final JsonElement jsonElement = JsonParser.parseString(CLIENT.send(request, HttpResponse.BodyHandlers.ofString()).body());
+ final JsonElement jsonElement = JsonParser.parseString(CLIENT.send(request, HttpResponse.BodyHandlers.ofString()).body());
- return new AccessToken(
- jsonElement.getAsJsonObject().get("access_token").getAsString(),
- System.currentTimeMillis(),
- jsonElement.getAsJsonObject().get("expires_in").getAsLong()
- );
- } catch (IOException | InterruptedException e) {
- throw new RuntimeException(e);
- }
+ return new AccessToken(
+ jsonElement.getAsJsonObject().get("access_token").getAsString(),
+ System.currentTimeMillis(),
+ jsonElement.getAsJsonObject().get("expires_in").getAsLong()
+ );
}
public static void sendPrivateMessage(AccessToken accessToken, String openId, Message message) {
diff --git a/src/main/java/xyz/zcraft/seira/bot/QQBot.java b/src/main/java/xyz/zcraft/seira/bot/QQBot.java
index 1205f217..98a663be 100644
--- a/src/main/java/xyz/zcraft/seira/bot/QQBot.java
+++ b/src/main/java/xyz/zcraft/seira/bot/QQBot.java
@@ -34,6 +34,11 @@ public QQBot(AppConfig config) {
while (true) {
try {
+ if (tokenManager.isExpired()) {
+ LOG.warn("Waiting for token renewal");
+ continue;
+ }
+
LOG.info("Getting wss endpoint");
String wssEndpoint = QQApi.getWSSEndpoint(tokenManager.getToken());
LOG.info("Endpoint: {}", wssEndpoint);
diff --git a/src/main/java/xyz/zcraft/seira/util/TokenManager.java b/src/main/java/xyz/zcraft/seira/util/TokenManager.java
index c30ee860..6a83aab4 100644
--- a/src/main/java/xyz/zcraft/seira/util/TokenManager.java
+++ b/src/main/java/xyz/zcraft/seira/util/TokenManager.java
@@ -23,12 +23,17 @@ public TokenManager(String clientId, String clientSecret) {
}
public boolean isExpired() {
- return System.currentTimeMillis() - token.tokenGrantTime() >= (token.expiresIn() - 60) * 1000;
+ return (token == null) || (System.currentTimeMillis() - token.tokenGrantTime() >= (token.expiresIn() - 60) * 1000);
}
public void renew() {
- token = QQApi.getAccessToken(clientId, clientSecret);
- LOG.info("Token renewed, expire in {}", token.expiresIn());
+ try {
+ token = QQApi.getAccessToken(clientId, clientSecret);
+ LOG.info("Token renewed, expire in {}", token.expiresIn());
+ } catch (Exception e) {
+ token = null;
+ LOG.error("Failed to renew token, will retry in 60 sec", e);
+ }
timer.schedule(new java.util.TimerTask() {
@Override
@@ -38,6 +43,6 @@ public void run() {
renew();
}
}
- }, Math.min(token.expiresIn() - 60, 60) * 1000L);
+ }, Math.min((token != null ? token.expiresIn() : 0) - 60, 60) * 1000L);
}
}