Created
December 23, 2020 05:20
-
-
Save seratch/a8080b352bbfe5d47ada3c3af1448203 to your computer and use it in GitHub Desktop.
Minecraft Forge 1.16 Mod that can call Slack APIs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
buildscript { | |
repositories { | |
maven { url = 'https://files.minecraftforge.net/maven' } | |
jcenter() | |
mavenCentral() | |
} | |
dependencies { | |
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true | |
} | |
} | |
apply plugin: 'net.minecraftforge.gradle' | |
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. | |
apply plugin: 'eclipse' | |
apply plugin: 'maven-publish' | |
version = '1.0' | |
group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html | |
archivesBaseName = 'slack_1.16.4' | |
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. | |
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) | |
minecraft { | |
// The mappings can be changed at any time, and must be in the following format. | |
// snapshot_YYYYMMDD Snapshot are built nightly. | |
// stable_# Stables are built at the discretion of the MCP team. | |
// Use non-default mappings at your own risk. they may not always work. | |
// Simply re-run your setup task after changing the mappings to update your workspace. | |
mappings channel: 'snapshot', version: '20201028-1.16.3' | |
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. | |
// accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') | |
// Default run configurations. | |
// These can be tweaked, removed, or duplicated as needed. | |
runs { | |
client { | |
workingDirectory project.file('run') | |
// Recommended logging data for a userdev environment | |
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' | |
// Recommended logging level for the console | |
property 'forge.logging.console.level', 'debug' | |
mods { | |
examplemod { | |
source sourceSets.main | |
} | |
} | |
} | |
server { | |
workingDirectory project.file('run') | |
// Recommended logging data for a userdev environment | |
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' | |
// Recommended logging level for the console | |
property 'forge.logging.console.level', 'debug' | |
mods { | |
examplemod { | |
source sourceSets.main | |
} | |
} | |
} | |
data { | |
workingDirectory project.file('run') | |
// Recommended logging data for a userdev environment | |
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' | |
// Recommended logging level for the console | |
property 'forge.logging.console.level', 'debug' | |
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. | |
args '--mod', 'examplemod', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') | |
mods { | |
examplemod { | |
source sourceSets.main | |
} | |
} | |
} | |
} | |
} | |
// Include resources generated by data generators. | |
sourceSets.main.resources { srcDir 'src/generated/resources' } | |
configurations { | |
embed | |
compile.extendsFrom(embed) | |
} | |
repositories { | |
maven { url = 'https://files.minecraftforge.net/maven' } | |
jcenter() | |
mavenCentral() | |
} | |
dependencies { | |
// Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed | |
// that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied. | |
// The userdev artifact is a special name and will get all sorts of transformations applied to it. | |
minecraft 'net.minecraftforge:forge:1.16.4-35.1.4' | |
embed 'com.slack.api:slack-api-client:1.4.1' | |
// You may put jars on which you depend on in ./libs or you may define them like so.. | |
// compile "some.group:artifact:version:classifier" | |
// compile "some.group:artifact:version" | |
// Real examples | |
// compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env | |
// compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env | |
// The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime. | |
// provided 'com.mod-buildcraft:buildcraft:6.0.8:dev' | |
// These dependencies get remapped to your current MCP mappings | |
// deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev' | |
// For more info... | |
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html | |
// http://www.gradle.org/docs/current/userguide/dependency_management.html | |
} | |
// Example for how to get properties into the manifest for reading by the runtime.. | |
jar { | |
from configurations.embed.collect { it.isDirectory() ? it : zipTree(it) } | |
manifest { | |
attributes([ | |
"Specification-Title": "slack_mod", | |
"Specification-Vendor": "com.github.seratch.slack_mod", | |
"Specification-Version": "1", // We are version 1 of ourselves | |
"Implementation-Title": project.name, | |
"Implementation-Version": "${version}", | |
"Implementation-Vendor" :"examplemodsareus", | |
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") | |
]) | |
} | |
} | |
// Example configuration to allow publishing using the maven-publish task | |
// This is the preferred method to reobfuscate your jar file | |
jar.finalizedBy('reobfJar') | |
// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing | |
//publish.dependsOn('reobfJar') | |
publishing { | |
publications { | |
mavenJava(MavenPublication) { | |
artifact jar | |
} | |
} | |
repositories { | |
maven { | |
url "file:///${project.projectDir}/mcmodsrepo" | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This is an example mods.toml file. It contains the data relating to the loading mods. | |
# There are several mandatory fields (#mandatory), and many more that are optional (#optional). | |
# The overall format is standard TOML format, v0.5.0. | |
# Note that there are a couple of TOML lists in this file. | |
# Find more information on toml format here: https://github.com/toml-lang/toml | |
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml | |
modLoader="javafml" #mandatory | |
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version | |
loaderVersion="[35,)" #mandatory This is typically bumped every Minecraft version by Forge. See our download page for lists of versions. | |
# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. | |
# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. | |
license="All rights reserved" | |
# A URL to refer people to when problems occur with this mod | |
issueTrackerURL="https://github.com/seratch/slack_mod/" #optional | |
# A list of mods - how many allowed here is determined by the individual mod loader | |
[[mods]] #mandatory | |
# The modid of the mod | |
modId="slack" #mandatory | |
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it | |
# ${file.jarVersion} will substitute the value of the Implementation-Version as read from the mod's JAR file metadata | |
# see the associated build.gradle script for how to populate this completely automatically during a build | |
version="${file.jarVersion}" #mandatory | |
# A display name for the mod | |
displayName="Slack Mod" #mandatory | |
# A URL to query for updates for this mod. See the JSON update specification <here> | |
# updateJSONURL="http://myurl.me/" #optional | |
# A URL for the "homepage" for this mod, displayed in the mod UI | |
# displayURL="http://example.com/" #optional | |
# A file name (in the root of the mod JAR) containing a logo for display | |
# logoFile="examplemod.png" #optional | |
# A text field displayed in the mod UI | |
credits="Thanks for this example mod goes to Java" #optional | |
# A text field displayed in the mod UI | |
authors="Love, Cheese and small house plants" #optional | |
# The description text for the mod (multi line!) (#mandatory) | |
description=''' | |
WIP | |
''' | |
# # A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. | |
# [[dependencies.examplemod]] #optional | |
# # the modid of the dependency | |
# modId="slack" #mandatory | |
# # Does this dependency have to exist - if not, ordering below must be specified | |
# mandatory=true #mandatory | |
# # The version range of the dependency | |
# versionRange="[35,)" #mandatory | |
# # An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory | |
# ordering="NONE" | |
# # Side this dependency is applied on - BOTH, CLIENT or SERVER | |
# side="BOTH" | |
# # Here's another dependency | |
# [[dependencies.examplemod]] | |
# modId="minecraft" | |
# mandatory=true | |
# # This version range declares a minimum of the current minecraft version up to but not including the next major version | |
# versionRange="[1.16.4,1.17)" | |
# ordering="NONE" | |
# side="BOTH" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"pack": { | |
"description": "slack mod resources", | |
"pack_format": 6, | |
"_comment": "A pack_format of 6 requires json lang files and some texture changes from 1.16.2. Note: we require v6 pack meta for all mods." | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.github.seratch.slack_mod; | |
import com.slack.api.Slack; | |
import com.slack.api.methods.response.chat.ChatPostMessageResponse; | |
import net.minecraftforge.common.MinecraftForge; | |
import net.minecraftforge.eventbus.api.SubscribeEvent; | |
import net.minecraftforge.fml.common.Mod; | |
import net.minecraftforge.fml.event.server.FMLServerStartingEvent; | |
import org.apache.logging.log4j.LogManager; | |
import org.apache.logging.log4j.Logger; | |
import java.util.Optional; | |
// The value here should match an entry in the META-INF/mods.toml file | |
@Mod("slack") | |
public class SlackMod { | |
private static final Logger LOGGER = LogManager.getLogger(); | |
private static final Slack SLACK = Slack.getInstance(); | |
public SlackMod() { | |
MinecraftForge.EVENT_BUS.register(this); | |
} | |
final String botToken = System.getenv("SLACK_BOT_TOKEN"); | |
final String channel = Optional.ofNullable(System.getenv("SLACK_CHANNEL_ID")).orElse("#random"); | |
@SubscribeEvent | |
public void onServerStarting(FMLServerStartingEvent event) { | |
try { | |
ChatPostMessageResponse response = SLACK.methods(botToken).chatPostMessage(r -> r | |
.channel(channel) | |
.text("Your Minecraft server started!")); | |
LOGGER.info("Slack chat.postMessage API call result (ok: {}, error: {})", | |
response.isOk(), response.getError()); | |
} catch (Exception e) { | |
LOGGER.error("Failed to call Slack chat.postMessage API", e); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment