{"id":26241118,"url":"https://github.com/robertograham/fortnite-2-xmpp","last_synced_at":"2025-04-23T04:37:35.557Z","repository":{"id":57734644,"uuid":"168567381","full_name":"RobertoGraham/fortnite-2-xmpp","owner":"RobertoGraham","description":"Java 11+ client for Fortnite's XMPP services","archived":false,"fork":false,"pushed_at":"2019-02-07T15:34:16.000Z","size":53,"stargazers_count":6,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-29T22:11:22.364Z","etag":null,"topics":["api","api-client","client","epic-games","fortnite","fortnite-api","java","launcher","xmpp","xmpp-client"],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RobertoGraham.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-01-31T17:35:12.000Z","updated_at":"2023-01-27T00:07:01.000Z","dependencies_parsed_at":"2022-09-26T22:10:50.236Z","dependency_job_id":null,"html_url":"https://github.com/RobertoGraham/fortnite-2-xmpp","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobertoGraham%2Ffortnite-2-xmpp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobertoGraham%2Ffortnite-2-xmpp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobertoGraham%2Ffortnite-2-xmpp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobertoGraham%2Ffortnite-2-xmpp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RobertoGraham","download_url":"https://codeload.github.com/RobertoGraham/fortnite-2-xmpp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250372607,"owners_count":21419719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","api-client","client","epic-games","fortnite","fortnite-api","java","launcher","xmpp","xmpp-client"],"created_at":"2025-03-13T08:19:29.375Z","updated_at":"2025-04-23T04:37:35.534Z","avatar_url":"https://github.com/RobertoGraham.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Maven Central](https://img.shields.io/maven-central/v/io.github.robertograham/fortnite-2-xmpp.svg?label=Maven%20Central\u0026style=flat-square)](https://search.maven.org/search?q=g:%22io.github.robertograham%22%20AND%20a:%22fortnite-2-xmpp%22)\n\n# fortnite-2-xmpp\n\nA Java 11+ client for Fortnite's XMPP services\n\n## Features\n\n* Ability to send chat messages and process inbound chat messages\n* Ability to process friends list received after connecting\n* Ability to process friends' presence updates\n\n## Installation\n\n### Maven\n\n```xml\n\u003cproperties\u003e\n  ...\n  \u003c!-- Use the latest version whenever possible. --\u003e\n  \u003cfortnite-2-xmpp.version\u003e1.0.0\u003c/fortnite-2.version\u003e\n  ...\n\u003c/properties\u003e\n\n\u003cdependencies\u003e\n  ...\n  \u003cdependency\u003e\n    \u003cgroupId\u003eio.github.robertograham\u003c/groupId\u003e\n    \u003cartifactId\u003efortnite-2-xmpp\u003c/artifactId\u003e\n    \u003cversion\u003e${fortnite-2-xmpp.version}\u003c/version\u003e\n  \u003c/dependency\u003e\n  ...\n\u003c/dependencies\u003e\n```\n\n## Usage\n\n### Instantiating a client\n\nThis is the simplest way to instantiate a client:\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n            .build();\n        final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n            .build();\n    }\n}\n```\n\nBy default fortnite-2-xmpp will not debug raw XMPP traffic but this can be enabled like so:\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n            .build();\n        final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n            .setDebugXmppConnections(true)\n            .build();\n    }\n}\n```\n\nThe platform and application the authenticated user is using can be spoofed like so:\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n            .build();\n        final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n            .setApplication(Application.FORTNITE_CLIENT)\n            .setPlatform(Platform.NINTENDO_SWITCH)\n            .build();\n    }\n}\n``` \n\n### Cleaning up\n\nWhen you no longer need your client instance, remember to close your XMPP connections with a call to `FortniteXmpp.close()`. Usage examples further in this document will make \nthis call implicitly using `try`-with-resources statements.\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n            .build();\n        final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n            .build();\n        fortniteXmpp.close();\n        fortnite.close();\n    }\n}\n```\n\n### Listeners\n\nRegister an `OnFriendsListReceivedListener` that prints the `Account` representation of every friend\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\nimport java.io.IOException;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        try (\n            final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n                .build();\n            final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n                .setOnFriendsListReceivedListener((final var accountIds, final var friend) -\u003e {\n                    try {\n                        fortnite.account()\n                            .findAllByAccountIds(accountIds.toArray(String[]::new))\n                            .ifPresent((final var accounts) -\u003e accounts.forEach(System.out::println));\n                    } catch (final IOException exception) {\n                        // findAllByAccountIds unexpected response\n                    }\n                })\n                .build()\n        ) {\n        }\n    }\n}\n```\n\nRegister an `OnFriendPresenceReceivedListener` that stores friends and their presence details in a `Map`\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.domain.Session;\nimport io.github.robertograham.fortnite2.xmpp.domain.enumeration.Status;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\nimport java.util.AbstractMap.SimpleEntry;\nimport java.util.HashMap;\nimport java.util.Map.Entry;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        final var accountIdToStatusSessionEntryMap = new HashMap\u003cString, Entry\u003cStatus, Session\u003e\u003e();\n        try (\n            final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n                .build();\n            final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n                .setOnFriendPresenceReceivedListener((final var accountId, final var status, final var sessionOptional, final var friend) -\u003e\n                    accountIdToStatusSessionEntryMap.put(accountId, new SimpleEntry\u003c\u003e(status, sessionOptional.orElse(null)))\n                )\n                .build()\n        ) {\n            while (accountIdToStatusSessionEntryMap.isEmpty())\n                System.out.println(\"Awaiting presence\");\n            accountIdToStatusSessionEntryMap.forEach((final var accountId, final var statusToSessionEntry) -\u003e\n                System.out.printf(\"%s[%s]: %s\\n\", accountId, statusToSessionEntry.getKey(), statusToSessionEntry.getValue())\n            );\n        }\n    }\n}\n```\n\n### Chat API\n\nRegister an `OnChatMessageReceivedListener`, send a message to the authenticated account and wait for the message to be self-received\n\n```java\nimport io.github.robertograham.fortnite2.implementation.DefaultFortnite;\nimport io.github.robertograham.fortnite2.xmpp.implementation.DefaultFortniteXmpp;\n\nimport java.io.IOException;\n\npublic final class Main {\n\n    public static void main(final String[] args) {\n        try (\n            final var fortnite = DefaultFortnite.Builder.newInstance(\"epicGamesEmailAddress\", \"epicGamesPassword\")\n                .build();\n            final var fortniteXmpp = DefaultFortniteXmpp.Builder.newInstance(fortnite)\n                .setOnChatMessageReceivedListener((final var accountId, final var messageBody, final var chat) -\u003e\n                    System.out.printf(\"New message from %s!%n\", accountId)\n                )\n                .build()\n        ) {\n            final var sessionAccount = fortnite.account()\n                .findOneBySessionAccountId()\n                .orElseThrow();\n            fortniteXmpp.chat()\n                .sendMessageToAccount(sessionAccount, \"WE LOVE FORTNITE WE LOVE FORTNITE\");\n            while (fortniteXmpp.chat()\n                .findAllMessagesReceivedFromAccount(sessionAccount)\n                .isEmpty()) ;\n            fortniteXmpp.chat()\n                .findAllMessagesReceivedFromAccount(sessionAccount)\n                .forEach(System.out::println);\n        } catch (final IOException exception) {\n            // findOneBySessionAccountId unexpected response\n            // OR sendMessageToAccount failed\n        }\n    }\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertograham%2Ffortnite-2-xmpp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobertograham%2Ffortnite-2-xmpp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobertograham%2Ffortnite-2-xmpp/lists"}