Skip to content

Commit 41dac02

Browse files
committed
First commit
1 parent 3df8857 commit 41dac02

File tree

13 files changed

+505
-1
lines changed

13 files changed

+505
-1
lines changed

.gitignore

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
# User-specific stuff
2+
.idea/
3+
4+
*.iml
5+
*.ipr
6+
*.iws
7+
8+
# IntelliJ
9+
out/
10+
11+
# Compiled class file
12+
*.class
13+
14+
# Log file
15+
*.log
16+
17+
# BlueJ files
18+
*.ctxt
19+
20+
# Package Files #
21+
*.jar
22+
*.war
23+
*.nar
24+
*.ear
25+
*.zip
26+
*.tar.gz
27+
*.rar
28+
29+
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
30+
hs_err_pid*
31+
32+
*~
33+
34+
# temporary files which can be created if a process still has a handle open of a deleted file
35+
.fuse_hidden*
36+
37+
# KDE directory preferences
38+
.directory
39+
40+
# Linux trash folder which might appear on any partition or disk
41+
.Trash-*
42+
43+
# .nfs files are created when an open file is removed but is still being accessed
44+
.nfs*
45+
46+
# General
47+
.DS_Store
48+
.AppleDouble
49+
.LSOverride
50+
51+
# Icon must end with two \r
52+
Icon
53+
54+
# Thumbnails
55+
._*
56+
57+
# Files that might appear in the root of a volume
58+
.DocumentRevisions-V100
59+
.fseventsd
60+
.Spotlight-V100
61+
.TemporaryItems
62+
.Trashes
63+
.VolumeIcon.icns
64+
.com.apple.timemachine.donotpresent
65+
66+
# Directories potentially created on remote AFP share
67+
.AppleDB
68+
.AppleDesktop
69+
Network Trash Folder
70+
Temporary Items
71+
.apdisk
72+
73+
# Windows thumbnail cache files
74+
Thumbs.db
75+
Thumbs.db:encryptable
76+
ehthumbs.db
77+
ehthumbs_vista.db
78+
79+
# Dump file
80+
*.stackdump
81+
82+
# Folder config file
83+
[Dd]esktop.ini
84+
85+
# Recycle Bin used on file shares
86+
$RECYCLE.BIN/
87+
88+
# Windows Installer files
89+
*.cab
90+
*.msi
91+
*.msix
92+
*.msm
93+
*.msp
94+
95+
# Windows shortcuts
96+
*.lnk
97+
98+
target/
99+
100+
pom.xml.tag
101+
pom.xml.releaseBackup
102+
pom.xml.versionsBackup
103+
pom.xml.next
104+
105+
release.properties
106+
dependency-reduced-pom.xml
107+
buildNumber.properties
108+
.mvn/timing.properties
109+
.mvn/wrapper/maven-wrapper.jar
110+
.flattened-pom.xml
111+
112+
# Common working directory
113+
run/

README.md

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,21 @@
11
# LittleHooks
2-
Discord webhooks integration as a Spigot plugin. Requires plugin LittleLink.
2+
Discord webhooks integration as a Spigot plugin. Extremely light weight.
3+
4+
> Requires plugin [LittleLink](https://github.com/Pequla/LittleLink)
5+
6+
## Configuration
7+
8+
The default configuration:
9+
```yaml
10+
webhook-url: url
11+
color:
12+
system: 65535
13+
join: 65280
14+
leave: 16711680
15+
death: 8388736
16+
```
17+
18+
- `webhook-url` is the webhook url. You can obtain it in the channel settings under the integrations/webhooks tab. Please note that this link allows you to send messages to that channel so keep it safe and secure
19+
- `color` represents the decimal or hexadecimal color code of the discord message embed. All the sub options represent the name of the event the color will be used in
20+
21+
> `color.system` color code is used in the non player related events. ex: server loading or server stopping

pom.xml

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<groupId>com.pequla</groupId>
8+
<artifactId>little-hooks</artifactId>
9+
<version>1.0</version>
10+
<packaging>jar</packaging>
11+
12+
<name>LittleHooks</name>
13+
14+
<description>Discord webhook integration for your minecraft server</description>
15+
<properties>
16+
<java.version>17</java.version>
17+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18+
</properties>
19+
<url>https://pequla.com</url>
20+
21+
<build>
22+
<plugins>
23+
<plugin>
24+
<groupId>org.apache.maven.plugins</groupId>
25+
<artifactId>maven-compiler-plugin</artifactId>
26+
<version>3.8.1</version>
27+
<configuration>
28+
<source>${java.version}</source>
29+
<target>${java.version}</target>
30+
</configuration>
31+
</plugin>
32+
<plugin>
33+
<groupId>org.apache.maven.plugins</groupId>
34+
<artifactId>maven-shade-plugin</artifactId>
35+
<version>3.2.4</version>
36+
<executions>
37+
<execution>
38+
<phase>package</phase>
39+
<goals>
40+
<goal>shade</goal>
41+
</goals>
42+
<configuration>
43+
<createDependencyReducedPom>false</createDependencyReducedPom>
44+
</configuration>
45+
</execution>
46+
</executions>
47+
</plugin>
48+
</plugins>
49+
<resources>
50+
<resource>
51+
<directory>src/main/resources</directory>
52+
<filtering>true</filtering>
53+
</resource>
54+
</resources>
55+
</build>
56+
57+
<repositories>
58+
<repository>
59+
<id>spigotmc-repo</id>
60+
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
61+
</repository>
62+
<repository>
63+
<id>sonatype</id>
64+
<url>https://oss.sonatype.org/content/groups/public/</url>
65+
</repository>
66+
</repositories>
67+
68+
<dependencies>
69+
<dependency>
70+
<groupId>org.spigotmc</groupId>
71+
<artifactId>spigot-api</artifactId>
72+
<version>1.19-R0.1-SNAPSHOT</version>
73+
<scope>provided</scope>
74+
</dependency>
75+
<dependency>
76+
<groupId>com.pequla</groupId>
77+
<artifactId>little-link</artifactId>
78+
<version>1.4</version>
79+
<scope>provided</scope>
80+
</dependency>
81+
<dependency>
82+
<groupId>org.projectlombok</groupId>
83+
<artifactId>lombok</artifactId>
84+
<version>1.18.24</version>
85+
<scope>provided</scope>
86+
</dependency>
87+
</dependencies>
88+
89+
<distributionManagement>
90+
<repository>
91+
<id>github</id>
92+
<name>GitHub Pequla Apache Maven Packages</name>
93+
<url>https://maven.pkg.github.com/Pequla/LittleHooks</url>
94+
</repository>
95+
</distributionManagement>
96+
</project>
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
package com.pequla.link;
2+
3+
import com.pequla.link.model.*;
4+
import com.pequla.link.service.DataService;
5+
import org.bukkit.ChatColor;
6+
import org.bukkit.Server;
7+
import org.bukkit.entity.Player;
8+
import org.bukkit.event.EventHandler;
9+
import org.bukkit.event.EventPriority;
10+
import org.bukkit.event.Listener;
11+
import org.bukkit.event.entity.PlayerDeathEvent;
12+
import org.bukkit.event.player.PlayerJoinEvent;
13+
import org.bukkit.event.player.PlayerQuitEvent;
14+
15+
import java.net.URI;
16+
import java.net.http.HttpRequest;
17+
import java.net.http.HttpResponse;
18+
import java.nio.charset.StandardCharsets;
19+
import java.time.Instant;
20+
import java.util.List;
21+
22+
public class GameHandler implements Listener {
23+
24+
private final LittleHooks plugin;
25+
private final LittleLink core;
26+
27+
public GameHandler(LittleHooks plugin, LittleLink core) {
28+
this.plugin = plugin;
29+
this.core = core;
30+
}
31+
32+
@EventHandler
33+
public void handlePlayerJoin(PlayerJoinEvent event) {
34+
Player player = event.getPlayer();
35+
DataModel data = core.getPlayerData().get(player.getUniqueId());
36+
Server server = plugin.getServer();
37+
38+
sendMessage(player, EmbedModel.builder()
39+
.color(plugin.getConfig().getInt("color.join"))
40+
.author(EmbedAuthor.builder()
41+
.name(data.getNickname())
42+
.icon_url(data.getAvatar())
43+
.build())
44+
.description(bold(event.getJoinMessage()))
45+
.fields(List.of(EmbedField.builder()
46+
.name("Online:")
47+
.value(server.getOnlinePlayers().size() + "/" + server.getMaxPlayers())
48+
.inline(false)
49+
.build()))
50+
.footer(EmbedFooter.builder()
51+
.text(data.getId())
52+
.build())
53+
.timestamp(Instant.now().toString())
54+
.build());
55+
}
56+
57+
@EventHandler(priority = EventPriority.LOWEST)
58+
public void handlePlayerQuit(PlayerQuitEvent event) {
59+
Player player = event.getPlayer();
60+
DataModel data = core.getPlayerData().get(player.getUniqueId());
61+
Server server = plugin.getServer();
62+
63+
sendMessage(player, EmbedModel.builder()
64+
.color(plugin.getConfig().getInt("color.leave"))
65+
.author(EmbedAuthor.builder()
66+
.name(data.getNickname())
67+
.icon_url(data.getAvatar())
68+
.build())
69+
.description(bold(event.getQuitMessage()))
70+
.fields(List.of(EmbedField.builder()
71+
.name("Online:")
72+
.value((server.getOnlinePlayers().size() - 1) + "/" + server.getMaxPlayers())
73+
.inline(false)
74+
.build()))
75+
.footer(EmbedFooter.builder()
76+
.text(data.getId())
77+
.build())
78+
.timestamp(Instant.now().toString())
79+
.build());
80+
}
81+
82+
@EventHandler
83+
public void handlePlayerDeath(PlayerDeathEvent event) {
84+
Player player = event.getEntity();
85+
DataModel data = core.getPlayerData().get(player.getUniqueId());
86+
87+
sendMessage(player, EmbedModel.builder()
88+
.color(plugin.getConfig().getInt("color.death"))
89+
.author(EmbedAuthor.builder()
90+
.name(data.getNickname())
91+
.icon_url(data.getAvatar())
92+
.build())
93+
.description(bold(event.getDeathMessage()))
94+
.footer(EmbedFooter.builder()
95+
.text(data.getId())
96+
.build())
97+
.timestamp(Instant.now().toString())
98+
.build());
99+
}
100+
101+
private String getMinecraftAvatarUrl(Player player) {
102+
return "https://visage.surgeplay.com/face/" + player.getUniqueId().toString().replace("-", "");
103+
}
104+
105+
private String bold(String str) {
106+
return "**" + ChatColor.stripColor(str) + "**";
107+
}
108+
109+
private void sendMessage(Player player, EmbedModel model) {
110+
try {
111+
String url = plugin.getConfig().getString("webhook-url");
112+
if (url == null) throw new RuntimeException("Webhook URL not found");
113+
114+
DataService service = DataService.getInstance();
115+
String json = service.getMapper().writeValueAsString(MessageModel.builder()
116+
.username(player.getName())
117+
.avatar_url(getMinecraftAvatarUrl(player))
118+
.embeds(List.of(model))
119+
.build());
120+
121+
new Thread(()->{
122+
try {
123+
HttpRequest request = HttpRequest.newBuilder()
124+
.uri(URI.create(url))
125+
.header("Content-Type", "application/json")
126+
.POST(HttpRequest.BodyPublishers.ofString(json, StandardCharsets.UTF_8))
127+
.build();
128+
129+
HttpResponse<String> rsp = service.getClient().send(request, HttpResponse.BodyHandlers.ofString());
130+
if (rsp.statusCode() != 204)
131+
throw new RuntimeException("Server responded with HTTP " + rsp.statusCode());
132+
} catch (Exception e) {
133+
plugin.getLogger().severe("Webhook could not be sent! " + e.getMessage());
134+
}
135+
136+
}).start();
137+
} catch (Exception e) {
138+
plugin.getLogger().severe("Webhook could not be sent! " + e.getMessage());
139+
}
140+
}
141+
}

0 commit comments

Comments
 (0)