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); } }