diff --git a/.github/README.md.sha256 b/.github/README.md.sha256
index ebad115d75..d71c50f91c 100644
--- a/.github/README.md.sha256
+++ b/.github/README.md.sha256
@@ -1 +1 @@
-87828c8747d7ddab7f5617287553c11a296487e8c7df4881d6bf2210faae96c9
\ No newline at end of file
+7b7fd89b960a597a68ba5ae3def6618e5f5da9002c0fe695cbd50eadedf78e4c
\ No newline at end of file
diff --git a/README.md b/README.md
index d7bd03082e..8a257b7e45 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,75 @@
![](https://javacord.org/img/javacord3_banner.png)
# Javacord [![Latest version](https://shields.javacord.org/github/release/Javacord/Javacord.svg?label=Version&colorB=brightgreen&style=flat-square)](https://github.com/Javacord/Javacord/releases/latest) [![Latest JavaDocs](https://shields.javacord.org/badge/JavaDoc-Latest-yellow.svg?style=flat-square)](https://docs.javacord.org/api/v/latest/) [![Javacord Wiki](https://shields.javacord.org/badge/Wiki-Home-red.svg?style=flat-square)](https://javacord.org/wiki/) [![Javacord Discord server](https://shields.javacord.org/discord/151037561152733184.svg?colorB=%237289DA&label=Discord&style=flat-square)](https://discord.gg/0qJ2jjyneLEgG7y3)
+
An easy to use multithreaded library for creating Discord bots in Java.
-## Feature Coverage
+Javacord is a modern library that focuses on simplicity and speed ????.
+By reducing itself to standard Java classes and features like [`Optional`](https://javacord.org/wiki/essential-knowledge/working-with-optionals/)s and [`CompletableFuture`](https://javacord.org/wiki/essential-knowledge/working-with-futures/)s, it is extremely easy to use for every Java developer, as it does not require you to learn any new frameworks or complex abstractions.
+It has rich [documentation](#-documentation) and an [awesome community on Discord](#-support) that loves to help with any specific problems and questions.
+
+## ???? Basic Usage
+
+The following example logs the bot in and replies to every "!ping" message with "Pong!".
+
+```java
+public class MyFirstBot {
+
+ public static void main(String[] args) {
+ // Insert your bot's token here
+ String token = "your token";
+
+ DiscordApi api = new DiscordApiBuilder().setToken(token).login().join();
+
+ // Add a listener which answers with "Pong!" if someone writes "!ping"
+ api.addMessageCreateListener(event -> {
+ if (event.getMessageContent().equalsIgnoreCase("!ping")) {
+ event.getChannel().sendMessage("Pong!");
+ }
+ });
+
+ // Print the invite url of your bot
+ System.out.println("You can invite the bot by using the following url: " + api.createBotInvite());
+ }
-Javacord supports every action a Discord bot is able to perform.
-Some of these features include, but are not limited to:
+}
+```
-- sending messages
-- attaching files
-- event listening
-- user management
-- server administration
-- *... **and many others***
+
-**Sending voice will be added in an upcoming release**.
-New features introduced by Discord are typically added in less than one week, depending on scale.
+More sophisticated examples can be found at the [end of the README](#-more-examples).
+You can also check out the [example bot](https://github.com/Javacord/Example-Bot) for a fully functional bot.
-## Download / Installation
+## ???? Download / Installation
The recommended way to get Javacord is to use a build manager, like Gradle or Maven.
-If you are not familiar with build managers, you can follow this [Setup Guide](#ide-setup)
-or download Javacord directly from [GitHub](https://github.com/Javacord/Javacord/releases/latest).
+If you are not familiar with build managers, you can follow this [setup guide](#-ide-setup) or download Javacord directly from [GitHub](https://github.com/Javacord/Javacord/releases/latest).
### Javacord Dependency
#### Gradle
+
```groovy
repositories { mavenCentral() }
-dependencies { implementation 'org.javacord:javacord:3.0.5' }
+dependencies { implementation 'org.javacord:javacord:3.0.6' }
```
#### Maven
+
```xml
org.javacord
javacord
- 3.0.5
+ 3.0.6
pom
```
+#### Sbt
+
+```scala
+libraryDependencies ++= Seq("org.javacord" % "javacord" % "3.0.6")
+```
+
### Optional Logger Dependency
Any Log4j-2-compatible logging framework can be used to provide a more sophisticated logging experience
@@ -51,100 +80,156 @@ For example, Log4j Core in Gradle
```groovy
dependencies { runtimeOnly 'org.apache.logging.log4j:log4j-core:2.11.0' }
```
-Take a look at the [Logger Configuration](https://javacord.org/wiki/basic-tutorials/logger-configuration/) wiki article for further information.
+Take a look at the [logger configuration](https://javacord.org/wiki/basic-tutorials/logger-configuration/) wiki article for further information.
-## IDE Setup
+## ???? IDE Setup
If you have never used Gradle or Maven before, you should take a look at one of the setup tutorials:
* **[IntelliJ & Gradle](https://javacord.org/wiki/getting-started/intellij-gradle/)** _(recommended)_
* **[IntelliJ & Maven](https://javacord.org/wiki/getting-started/intellij-maven/)**
* **[Eclipse & Maven](https://javacord.org/wiki/getting-started/eclipse-maven/)**
-## Support
+## ???? Support
Javacord's Discord community is an excellent resource if you have questions about the library.
-* **[The Javacord Server](https://discord.gg/0qJ2jjyneLEgG7y3)**
+* **[The Javacord server](https://discord.gg/0qJ2jjyneLEgG7y3)**
-## Documentation
+## ???? Documentation
-* The [Javacord Wiki](https://javacord.org/wiki/) is a great place to get started
-* Additional documentation can be found in the [JavaDoc](https://docs.javacord.org/api/v/latest/)
+* The [Javacord wiki](https://javacord.org/wiki/) is a great place to get started.
+* Additional documentation can be found in the [JavaDoc](https://docs.javacord.org/api/v/latest/).
-## Logging in
+## ???? How to Create a Bot User and Get Its Token
-Logging in is very simple
-```java
-public class MyFirstBot {
+* **[Creating a Bot User Account](https://javacord.org/wiki/essential-knowledge/creating-a-bot-account/)**
- public static void main(String[] args) {
- // Insert your bot's token here
- String token = "your token";
+## ???? Version Numbers
- DiscordApi api = new DiscordApiBuilder().setToken(token).login().join();
+The version number has a 3-digit format: `major.minor.trivial`
+* `major`: Increased extremely rarely to mark a major release (usually a rewrite affecting very huge parts of the library).
+* `minor`: Any backward incompatible change to the api.
+* `trivial`: A backward compatible change to the **api**. This is usually an important bugfix (or a bunch of smaller ones)
+ or a backwards compatible feature addition.
+
+## ???? Deprecation Policy
- // Add a listener which answers with "Pong!" if someone writes "!ping"
- api.addMessageCreateListener(event -> {
- if (event.getMessageContent().equalsIgnoreCase("!ping")) {
- event.getChannel().sendMessage("Pong!");
- }
- });
+A method or class that is marked as deprecated can be removed with the next minor release (but it will usually stay for
+several minor releases). A minor release might remove a class or method without having it deprecated, but we will do our
+best to deprecate it before removing it. We are unable to guarantee this though, because we might have to remove / replace
+something due to changes made by Discord, which we are unable to control. Usually you can expect a deprecated method or
+class to stay for at least 6 months before it finally gets removed, but this is not guaranteed.
- // Print the invite url of your bot
- System.out.println("You can invite the bot by using the following url: " + api.createBotInvite());
+## ???? Large Bots Using Javacord
+
+Javacord is used by many large bots. Here are just a few of them:
+* [**Yunite**](https://yunite.xyz/): A bot for Fortnite which runs on over 30,000 servers with over five million users.
+* [**Beemo**](https://beemo.gg/): A bot that prevents raids of many large servers such as [discord.gg/LeagueOfLegends](https://discord.gg/LeagueOfLegends), [discord.gg/VALORANT](https://discord.gg/VALORANT), and many more.
+
+If you own a large bot that uses Javacord, feel free to add it to the list in a pull request!
+
+## ???? More Examples
+
+### Using the MessageBuilder ????
+
+
+
+The following example uses the built-in `MessageBuilder`. It is very useful to construct complex messages with images, code-blocks, embeds, or attachments.
+
+```java
+new MessageBuilder()
+ .append("Look at these ")
+ .append("awesome", MessageDecoration.BOLD, MessageDecoration.UNDERLINE)
+ .append(" animal pictures! ????")
+ .appendCode("java", "System.out.println(\"Sweet!\");")
+ .addAttachment(new File("C:/Users/JohnDoe/Pictures/kitten.jpg"))
+ .addAttachment(new File("C:/Users/JohnDoe/Pictures/puppy.jpg"))
+ .setEmbed(new EmbedBuilder()
+ .setTitle("WOW")
+ .setDescription("Really cool pictures!")
+ .setColor(Color.ORANGE))
+ .send(channel);
+```
+
+### Listeners in Their Own Class ????
+
+All the examples use inline listeners for simplicity. For better readability it is also possible to have listeners in their own class:
+
+```java
+public class MyListener implements MessageCreateListener {
+
+ @Override
+ public void onMessageCreate(MessageCreateEvent event) {
+ Message message = event.getMessage();
+ if (message.getContent().equalsIgnoreCase("!ping")) {
+ event.getChannel().sendMessage("Pong!");
+ }
}
}
```
-
-You can also login non-blocking asynchronously
```java
-public class MyFirstBot {
+api.addListener(new MyListener());
+```
- public static void main(String[] args) {
- // Insert your bot's token here
- String token = "your token";
+For commands, you have the option of using one of the many existing command frameworks such as
+* [**Command Framework**](https://github.com/Vampire/command-framework) by [@Vampire](https://github.com/Vampire)
+* [**Sdcf4j**](https://github.com/Bastian/sdcf4j) by [@Bastian](https://github.com/Bastian)
- new DiscordApiBuilder().setToken(token).login().thenAccept(api -> {
- // Add a listener which answers with "Pong!" if someone writes "!ping"
- api.addMessageCreateListener(event -> {
- if (event.getMessageContent().equalsIgnoreCase("!ping")) {
- event.getChannel().sendMessage("Pong!");
- }
- });
-
- // Print the invite url of your bot
- System.out.println("You can invite the bot by using the following url: " + api.createBotInvite());
- })
- // Log any exceptions that happened
- .exceptionally(ExceptionLogger.get());
- }
+or even write your own!
+
+### Attach Listeners to Objects ????
+
+You can even attach listeners to objects.
+Let's say you have a very sensitive bot.
+As soon as someone reacts with a ???? within the first 30 minutes of message creation, it deletes its own message.
+```java
+api.addMessageCreateListener(event -> {
+ if (event.getMessageContent().equalsIgnoreCase("!ping")) {
+ event.getChannel().sendMessage("Pong!").thenAccept(message -> {
+ // Attach a listener directly to the message
+ message.addReactionAddListener(reactionEvent -> {
+ if (reactionEvent.getEmoji().equalsEmoji("????")) {
+ reactionEvent.deleteMessage();
+ }
+ }).removeAfter(30, TimeUnit.MINUTES);
+ });
+ }
}
```
+The result then looks like this:
-Check out the [Example Bot](https://github.com/Javacord/Example-Bot) to learn more.
+
-## How to create a bot user and get its token
+### Creating a Temporary Voice Channel ????????
-* **[Creating a Bot User Account](https://javacord.org/wiki/essential-knowledge/creating-a-bot-account/)**
+This example creates a temporary voice channel that gets deleted when the last user leaves it or if nobody joins it within the first 30 seconds after creation.
-## Version numbers
+```java
+Server server = ...;
+ServerVoiceChannel channel = new ServerVoiceChannelBuilder(server)
+ .setName("tmp-channel")
+ .setUserlimit(10)
+ .create()
+ .join();
+
+// Delete the channel if the last user leaves
+channel.addServerVoiceChannelMemberLeaveListener(event -> {
+ if (event.getChannel().getConnectedUserIds().isEmpty()) {
+ event.getChannel().delete();
+ }
+});
-The version number has a 3-digit format: `major.minor.trivial`
-* `major`: Increased extremely rarely to mark a major release (usually a rewrite affecting very huge parts of the library).
- You can expect this digit to not change for several years.
-* `minor`: Any backwards incompatible change to the api. You can expect this digit to change about 1-3 times per year.
-* `trivial`: A backwards compatible change to the **api**. This is usually an important bugfix (or a bunch of smaller ones)
- or a backwards compatible feature addition. You can expect this digit to change 1-2 times per month.
-
-## Deprecation policy
+// Delete the channel if no user joined in the first 30 seconds
+api.getThreadPool().getScheduler().schedule(() -> {
+ if (channel.getConnectedUserIds().isEmpty()) {
+ channel.delete();
+ }
+}, 30, TimeUnit.SECONDS);
+```
-A method or class that is marked as deprecated can be removed with the next minor release (but it will usually stay for
-several minor releases). A minor release might remove a class or method without having it deprecated, but we will do our
-best to deprecate it before removing it. We are unable to guarantee this though, because we might have to remove / replace
-something due to changes made by Discord, which we are unable to control. Usually you can expect a deprecated method or
-class to stay for at least 6 months before it finally gets removed, but this is not guaranteed.
+> **Note**: You should also make sure to remove the channels on bot shutdown (or startup)
-## Discord Server
+## ???? License
-Join the [Javacord Server](https://discord.gg/0qJ2jjyneLEgG7y3) for support, status updates, or just chatting with other users.
+Javacord is distributed under the [Apache license version 2.0](./LICENSE).
diff --git a/gradle.properties b/gradle.properties
index 899abb2904..c599dd7b1e 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,2 +1,2 @@
org.gradle.caching = true
-version = 3.0.6-SNAPSHOT
+version = 3.0.6