From 3107d1144e5877612dde2c38494b938aaa67a2fa Mon Sep 17 00:00:00 2001 From: rtm516 Date: Thu, 27 Jun 2024 12:59:33 +0100 Subject: [PATCH] Add force unfollow to fix friend error 1011 --- .../mcxboxbroadcast/core/FriendManager.java | 50 ++++++++++++++++--- .../core/models/friend/BlockRequest.java | 4 ++ .../{ => friend}/FriendModifyResponse.java | 2 +- .../{ => friend}/FriendStatusResponse.java | 2 +- 4 files changed, 50 insertions(+), 8 deletions(-) create mode 100644 core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/BlockRequest.java rename core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/{ => friend}/FriendModifyResponse.java (69%) rename core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/{ => friend}/FriendStatusResponse.java (85%) diff --git a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/FriendManager.java b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/FriendManager.java index 5a1da18..e3ecc5a 100644 --- a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/FriendManager.java +++ b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/FriendManager.java @@ -3,8 +3,9 @@ import com.google.gson.JsonParseException; import com.rtm516.mcxboxbroadcast.core.configs.FriendSyncConfig; import com.rtm516.mcxboxbroadcast.core.exceptions.XboxFriendsException; -import com.rtm516.mcxboxbroadcast.core.models.FriendModifyResponse; -import com.rtm516.mcxboxbroadcast.core.models.FriendStatusResponse; +import com.rtm516.mcxboxbroadcast.core.models.friend.BlockRequest; +import com.rtm516.mcxboxbroadcast.core.models.friend.FriendModifyResponse; +import com.rtm516.mcxboxbroadcast.core.models.friend.FriendStatusResponse; import com.rtm516.mcxboxbroadcast.core.models.session.FollowerResponse; import java.io.IOException; @@ -311,15 +312,18 @@ private void internalProcess() { if (modifyResponse.code() == 1028) { logger.error("Friend list full, unable to add " + entry.getValue() + " (" + entry.getKey() + ") as a friend"); - break; } else if (modifyResponse.code() == 1011) { // The friend wasn't added successfully so remove them from the list // This seems to happen in some cases, I assume from the user blocking us or having account restrictions toAdd.remove(entry.getKey()); - // TODO Remove these people from following us (block and unblock) - } - logger.warn("Failed to add " + entry.getValue() + " (" + entry.getKey() + ") as a friend: (" + response.statusCode() + ") " + response.body()); + // Remove these people from following us (block and unblock) + forceUnfollow(entry.getKey()); + + logger.warn("Removed " + entry.getValue() + " (" + entry.getKey() + ") as a friend due to account restrictions"); + } else { + logger.warn("Failed to add " + entry.getValue() + " (" + entry.getKey() + ") as a friend: (" + response.statusCode() + ") " + response.body()); + } } } catch (IOException | InterruptedException e) { logger.error("Failed to add " + entry.getValue() + " (" + entry.getKey() + ") as a friend: " + e.getMessage()); @@ -377,4 +381,38 @@ private void internalProcess() { } }); } + + /** + * Force a user to unfollow us + * This works by blocking and unblocking them + * + * @param xuid The XUID of the user to target + */ + public void forceUnfollow(String xuid) { + HttpRequest blockRequest = HttpRequest.newBuilder() + .uri(Constants.BLOCK) + .header("Authorization", sessionManager.getTokenHeader()) + .PUT(HttpRequest.BodyPublishers.ofString(Constants.GSON.toJson(new BlockRequest(xuid)))) + .build(); + + try { + HttpResponse blockResponse = httpClient.send(blockRequest, HttpResponse.BodyHandlers.discarding()); + if (blockResponse.statusCode() != 200) { + throw new RuntimeException("Failed to block user: " + blockResponse.statusCode()); + } + + HttpRequest unblockRequest = HttpRequest.newBuilder() + .uri(Constants.BLOCK) + .header("Authorization", sessionManager.getTokenHeader()) + .method("DELETE", HttpRequest.BodyPublishers.ofString(Constants.GSON.toJson(new BlockRequest(xuid)))) + .build(); + + HttpResponse unblockResponse = httpClient.send(blockRequest, HttpResponse.BodyHandlers.discarding()); + if (unblockResponse.statusCode() != 200) { + throw new RuntimeException("Failed to unblock user: " + blockResponse.statusCode()); + } + } catch (IOException | InterruptedException e) { + logger.error("Failed to force unfollow user: " + e.getMessage()); + } + } } diff --git a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/BlockRequest.java b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/BlockRequest.java new file mode 100644 index 0000000..4e940e0 --- /dev/null +++ b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/BlockRequest.java @@ -0,0 +1,4 @@ +package com.rtm516.mcxboxbroadcast.core.models.friend; + +public record BlockRequest (String xuid) { +} diff --git a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendModifyResponse.java b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendModifyResponse.java similarity index 69% rename from core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendModifyResponse.java rename to core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendModifyResponse.java index da9490f..d092aac 100644 --- a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendModifyResponse.java +++ b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendModifyResponse.java @@ -1,4 +1,4 @@ -package com.rtm516.mcxboxbroadcast.core.models; +package com.rtm516.mcxboxbroadcast.core.models.friend; public record FriendModifyResponse( int code, diff --git a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendStatusResponse.java b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendStatusResponse.java similarity index 85% rename from core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendStatusResponse.java rename to core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendStatusResponse.java index ffb0f86..34adaa4 100644 --- a/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/FriendStatusResponse.java +++ b/core/src/main/java/com/rtm516/mcxboxbroadcast/core/models/friend/FriendStatusResponse.java @@ -1,4 +1,4 @@ -package com.rtm516.mcxboxbroadcast.core.models; +package com.rtm516.mcxboxbroadcast.core.models.friend; import java.time.Instant;