diff --git a/1.11.2/build.gradle b/1.11.2/build.gradle new file mode 100644 index 0000000..b1fbb43 --- /dev/null +++ b/1.11.2/build.gradle @@ -0,0 +1,92 @@ + +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + mavenCentral() + } + dependencies { + classpath "net.minecraftforge.gradle:ForgeGradle:2.2-SNAPSHOT" + } +} + +plugins { + id "com.github.johnrengelman.shadow" version "1.2.4" +} + +apply plugin: 'net.minecraftforge.gradle.forge' + +version = mc_version + "-" + mod_version + +archivesBaseName = "MatterLink" + +sourceCompatibility = targetCompatibility = '1.8' + +dependencies { + compile project(':core') + compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0" +} + +shadowJar { + classifier '' + // configurations = [project.configurations.shadow] + + relocate "org.apache.http", "matterlink.repack.org.apache.http" + relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging" + dependencies { + include(project(":core")) + include(dependency("org.apache.httpcomponents:httpclient:4.3.3")) + include(dependency("org.apache.httpcomponents:httpcore:4.3.2")) + include(dependency('commons-logging:commons-logging:1.1.3')) + } + + exclude 'dummyThing' +} + +minecraft { + version = mc_version + "-" + forge_version + runDir = "run" + + mappings = mcp_mappings + + replaceIn 'MatterLink.kt' + replace '@VERSION@', mod_version +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(project(":core").sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version': project.version, 'mcversion': project.minecraft.version + } + + // copy everything else except the mcmod.info + from(project(":core").sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } + +} + +sourceJar { + classifier 'sources' + // copy all the minecraftforge specific classes + from sourceSets.main.allSource + + // copy everything else except the mcmod.info + from (project(":core").sourceSets.main.allSource) { + exclude 'mcmod.info' + } +} + + +reobf { + shadowJar { mappingType = 'SEARGE' } +} + +tasks.reobfShadowJar.mustRunAfter shadowJar \ No newline at end of file diff --git a/1.11.2/gradle.properties b/1.11.2/gradle.properties new file mode 100644 index 0000000..4bc3c4c --- /dev/null +++ b/1.11.2/gradle.properties @@ -0,0 +1,4 @@ +mc_version = 1.11.2 +mcp_mappings = stable_32 +forge_version = 13.20.1.2386 +forgegradle_version = 2.3-SNAPSHOT \ No newline at end of file diff --git a/1.11.2/src/main/kotlin/matterlink/EventWrapper.kt b/1.11.2/src/main/kotlin/matterlink/EventWrapper.kt new file mode 100644 index 0000000..4471a74 --- /dev/null +++ b/1.11.2/src/main/kotlin/matterlink/EventWrapper.kt @@ -0,0 +1,97 @@ +package matterlink + +import matterlink.bridge.ServerChatHandler +import matterlink.bridge.USER_ACTION +import matterlink.config.cfg +import matterlink.handlers.* +import net.minecraft.command.server.CommandBroadcast +import net.minecraft.command.server.CommandEmote +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.server.dedicated.DedicatedServer +import net.minecraft.tileentity.TileEntityCommandBlock +import net.minecraftforge.event.CommandEvent +import net.minecraftforge.event.ServerChatEvent +import net.minecraftforge.event.entity.living.LivingDeathEvent +import net.minecraftforge.event.entity.player.AchievementEvent +import net.minecraftforge.fml.common.FMLCommonHandler +import net.minecraftforge.fml.common.Mod +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.minecraftforge.fml.common.gameevent.PlayerEvent +import net.minecraftforge.fml.common.gameevent.TickEvent + +//FORGE-DEPENDENT +@Mod.EventBusSubscriber +object EventWrapper { + + //MC-VERSION & FORGE DEPENDENT + @SubscribeEvent + @JvmStatic + fun progressEvent(e: AchievementEvent) { + val name = e.entityPlayer.name + val text = "has earned the achievement ${e.achievement.statName.unformattedText}" + ProgressHandler.handleProgress(name, text) + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun chatEvent(e: ServerChatEvent) { + val user = e.username + val msg = e.message + ChatHandler.handleChat(user, msg) + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun commandEvent(e: CommandEvent) { + val sender = + when { + e.sender is EntityPlayer -> e.sender.name + e.sender is DedicatedServer -> cfg!!.relay.systemUser + e.sender is TileEntityCommandBlock -> "CommandBlock" + else -> return + } + val args = e.parameters.joinToString(" ") + val type = when { + e.command is CommandEmote -> USER_ACTION + e.command is CommandBroadcast -> "" + else -> return + } + CommandHandler.handleCommand(sender, args, type) + + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun deathEvent(e: LivingDeathEvent) { + if (e.entityLiving is EntityPlayer) { + DeathHandler.handleDeath( + e.entityLiving.name, + e.entityLiving.combatTracker.deathMessage.unformattedText + ) + } + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun joinEvent(e: PlayerEvent.PlayerLoggedInEvent) { + JoinLeaveHandler.handleJoin(e.player.name) + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun leaveEvent(e: PlayerEvent.PlayerLoggedOutEvent) { + JoinLeaveHandler.handleLeave(e.player.name) + } + + //FORGE-DEPENDENT + @SubscribeEvent + @JvmStatic + fun serverTickEvent(e: TickEvent.ServerTickEvent) { + ServerChatHandler.writeIncomingToChat(FMLCommonHandler.instance().minecraftServerInstance.tickCounter) + } +} \ No newline at end of file diff --git a/1.11.2/src/main/kotlin/matterlink/MatterLink.kt b/1.11.2/src/main/kotlin/matterlink/MatterLink.kt new file mode 100644 index 0000000..b2e7566 --- /dev/null +++ b/1.11.2/src/main/kotlin/matterlink/MatterLink.kt @@ -0,0 +1,74 @@ +package matterlink + +import matterlink.bridge.MessageHandler +import matterlink.bridge.command.BridgeCommandRegistry +import matterlink.bridge.command.HelpCommand +import matterlink.bridge.command.PlayerListCommand +import matterlink.command.CommandMatterlink +import net.minecraft.util.text.TextComponentString +import net.minecraftforge.fml.common.FMLCommonHandler +import net.minecraftforge.fml.common.Mod +import net.minecraftforge.fml.common.event.* +import org.apache.logging.log4j.Logger + +const val MODID = "matterlink" +const val NAME = "MatterLink" +const val VERSION = "@VERSION@" + +lateinit var logger: Logger + +@Mod( + modid = MODID, + name = NAME, version = VERSION, + serverSideOnly = true, + useMetadata = true, + acceptableRemoteVersions = "*", + modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter" +) +object MatterLink : IMatterLink() { + init { + instance = this + } + + @Mod.EventHandler + fun preInit(event: FMLPreInitializationEvent) { + logger = event.modLog + logger.info("Building bridge!") + + MatterLinkConfig(event.suggestedConfigurationFile) + } + + @Mod.EventHandler + fun init(event: FMLInitializationEvent) { + BridgeCommandRegistry.registerAll(PlayerListCommand, HelpCommand) + } + + @Mod.EventHandler + fun serverAboutToStart(event: FMLServerAboutToStartEvent) { + MessageHandler.start(clear = true) + } + + @Mod.EventHandler + fun serverStarting(event: FMLServerStartingEvent) { + logger.debug("Registering server commands") + event.registerServerCommand(CommandMatterlink()) + + connect() + } + + @Mod.EventHandler + fun serverStopping(event: FMLServerStoppingEvent) { + disconnect() + } + + //FORGE-DEPENDENT + override fun wrappedSendToPlayers(msg: String) { + FMLCommonHandler.instance().minecraftServerInstance.playerList.sendMessage(TextComponentString(msg)) + } + + //FORGE-DEPENDENT + override fun wrappedPlayerList(): Array { + return FMLCommonHandler.instance().minecraftServerInstance.playerList.onlinePlayerNames + } + +} diff --git a/1.11.2/src/main/kotlin/matterlink/MatterLinkConfig.kt b/1.11.2/src/main/kotlin/matterlink/MatterLinkConfig.kt new file mode 100644 index 0000000..3214c79 --- /dev/null +++ b/1.11.2/src/main/kotlin/matterlink/MatterLinkConfig.kt @@ -0,0 +1,128 @@ +package matterlink + +import matterlink.config.IMatterLinkConfig +import matterlink.config.cfg +import net.minecraftforge.common.config.Configuration +import java.io.File +import java.util.regex.Pattern + +class MatterLinkConfig(file: File) : IMatterLinkConfig() { + init { + logger.info("Reading bridge blueprints... from {}", file) + val config = Configuration(file) + + config.addCustomCategoryComment(CATEGORY_RELAY_OPTIONS, "Relay options") + relay = RelayOptions( + + systemUser = config.getString( + "systemUser", + CATEGORY_RELAY_OPTIONS, + relay.systemUser, + "Name of the server user (used by death and advancement messages and the /say command)" + ), + deathEvents = config.getBoolean( + "deathEvents", + CATEGORY_RELAY_OPTIONS, + relay.deathEvents, + "Relay player death messages" + ), + advancements = config.getBoolean( + "advancements", + CATEGORY_RELAY_OPTIONS, + relay.advancements, + "Relay player advancements" + ), + joinLeave = config.getBoolean( + "joinLeave", + CATEGORY_RELAY_OPTIONS, + relay.joinLeave, + "Relay when a player joins or leaves the game" + ) + ) + + config.addCustomCategoryComment(CATEGORY_COMMAND, "User commands") + command = CommandOptions( + enable = config.getBoolean( + "enable", + CATEGORY_COMMAND, + command.enable, + "Enable MC bridge commands" + ), + prefix = config.getString( + "prefix", + CATEGORY_COMMAND, + command.prefix, + "Prefix for MC bridge commands. Accepts a single character (not alphanumeric or /)", + Pattern.compile("^[^0-9A-Za-z/]$") + ) + ) + + config.addCustomCategoryComment(CATEGORY_FORMATTING_INCOMING, "Gateway -> Server" + + "Formatting options: " + + "Available variables: {username}, {text}, {gateway}, {channel}, {protocol}, {username:antiping}") + formatting = FormattingOptions( + chat = config.getString( + "chat", + CATEGORY_FORMATTING_INCOMING, + formatting.chat, + "Generic chat event, just talking" + ), + joinLeave = config.getString( + "joinLeave", + CATEGORY_FORMATTING_INCOMING, + formatting.joinLeave, + "Join and leave events from other gateways" + ), + action = config.getString( + "action", + CATEGORY_FORMATTING_INCOMING, + formatting.action, + "User actions (/me) sent by users from other gateways" + ) + ) + + config.addCustomCategoryComment(CATEGORY_FORMATTING_JOIN_LEAVE, "Server -> Gateway" + + "Formatting options: " + + "Available variables: {username}, {username:antiping}") + formattingJoinLeave = FormattingJoinLeave( + joinServer = config.getString( + "joinServer", + CATEGORY_FORMATTING_JOIN_LEAVE, + formattingJoinLeave.joinServer, + "user join message sent to other gateways, available variables: {username}, {username:antiping}" + ), + leaveServer = config.getString( + "leaveServer", + CATEGORY_FORMATTING_JOIN_LEAVE, + formattingJoinLeave.leaveServer, + "user leave message sent to other gateways, available variables: {username}, {username:antiping}" + ) + ) + + config.addCustomCategoryComment(CATEGORY_CONNECTION, "Connection settings") + connect = ConnectOptions( + url = config.getString( + "connectURL", + CATEGORY_CONNECTION, + connect.url, + "The URL or IP address of the bridge server" + ), + authToken = config.getString( + "authToken", + CATEGORY_CONNECTION, + connect.authToken, + "Auth token used to connect to the bridge server" + ), + gateway = config.getString( + "gateway", + CATEGORY_CONNECTION, + connect.gateway, + "MatterBridge gateway" + ) + ) + + if (config.hasChanged()) config.save() + + cfg = this + } +} \ No newline at end of file diff --git a/1.11.2/src/main/kotlin/matterlink/command/CommandMatterlink.kt b/1.11.2/src/main/kotlin/matterlink/command/CommandMatterlink.kt new file mode 100644 index 0000000..50b5131 --- /dev/null +++ b/1.11.2/src/main/kotlin/matterlink/command/CommandMatterlink.kt @@ -0,0 +1,53 @@ +package matterlink.command + +import com.google.common.collect.Lists +import matterlink.MODID +import matterlink.bridge.MessageHandler +import matterlink.bridge.ServerChatHandler +import matterlink.instance +import matterlink.logger +import net.minecraft.command.CommandBase +import net.minecraft.command.ICommandSender +import net.minecraft.server.MinecraftServer + + +class CommandMatterlink : CommandBase() { + private val aliases: List + + init { + aliases = Lists.newArrayList(MODID, "bridge", "BRIDGE") + } + + override fun getName(): String { + return "bridge" + } + + override fun getUsage(sender: ICommandSender): String { + return "bridge " + } + + override fun getAliases(): List { + return aliases + } + + override fun execute(server: MinecraftServer, sender: ICommandSender, args: Array) /*throws CommandException*/ { + if (args.isEmpty()) { + //throw new WrongUsageException("") + return + } + //TODO: check if sender is OP or test if normal users cannot send this + + + val cmd = args[0].toLowerCase() + when (cmd) { + "connect" -> { + instance.connect() + } + "disconnect" -> { + instance.disconnect() + } + } + } + + +} diff --git a/1.12.2/build.gradle b/1.12.2/build.gradle index e69de29..663d187 100644 --- a/1.12.2/build.gradle +++ b/1.12.2/build.gradle @@ -0,0 +1,91 @@ + +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + mavenCentral() + } + dependencies { + classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT" + } +} + +plugins { + id "com.github.johnrengelman.shadow" version "1.2.4" +} + +apply plugin: 'net.minecraftforge.gradle.forge' + +version = mc_version + "-" + mod_version + +archivesBaseName = "MatterLink" + +sourceCompatibility = targetCompatibility = '1.8' + +dependencies { + compile project(':core') + compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0" +} + +shadowJar { + classifier '' + // configurations = [project.configurations.shadow] + + relocate "org.apache.http", "matterlink.repack.org.apache.http" + relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging" + dependencies { + include(project(":core")) + include(dependency("org.apache.httpcomponents:httpclient:4.3.3")) + include(dependency("org.apache.httpcomponents:httpcore:4.3.2")) + include(dependency('commons-logging:commons-logging:1.1.3')) + } + + exclude 'dummyThing' +} + +minecraft { + version = mc_version + "-" + forge_version + runDir = "run" + + mappings = mcp_mappings + + replaceIn 'MatterLink.kt' + replace '@VERSION@', mod_version +} + +processResources { + // this will ensure that this task is redone when the versions change. + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + + // replace stuff in mcmod.info, nothing else + from(project(":core").sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + + // replace version and mcversion + expand 'version': project.version, 'mcversion': project.minecraft.version + } + + // copy everything else except the mcmod.info + from(project(":core").sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } + +} + +sourceJar { + classifier 'sources' + // copy all the minecraftforge specific classes + from sourceSets.main.allSource + + // copy everything else except the mcmod.info + from (project(":core").sourceSets.main.allSource) { + exclude 'mcmod.info' + } +} + +reobf { + shadowJar { mappingType = 'SEARGE' } +} + +tasks.reobfShadowJar.mustRunAfter shadowJar \ No newline at end of file diff --git a/1.12.2/gradle.properties b/1.12.2/gradle.properties index c4c2571..9be039d 100644 --- a/1.12.2/gradle.properties +++ b/1.12.2/gradle.properties @@ -1,4 +1,4 @@ -group = matterbridge mc_version = 1.12.2 mcp_mappings = snapshot_20171003 -forge_version = 14.23.1.2599 \ No newline at end of file +forge_version = 14.23.1.2599 +forgegradle_version = 2.3-SNAPSHOT \ No newline at end of file diff --git a/1.12.2/src/main/kotlin/matterlink/EventWrapper.kt b/1.12.2/src/main/kotlin/matterlink/EventWrapper.kt index 1a5ce30..c987464 100644 --- a/1.12.2/src/main/kotlin/matterlink/EventWrapper.kt +++ b/1.12.2/src/main/kotlin/matterlink/EventWrapper.kt @@ -13,6 +13,7 @@ import net.minecraftforge.event.CommandEvent import net.minecraftforge.event.ServerChatEvent import net.minecraftforge.event.entity.living.LivingDeathEvent import net.minecraftforge.event.entity.player.AdvancementEvent +import net.minecraftforge.fml.common.FMLCommonHandler import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.gameevent.PlayerEvent @@ -92,6 +93,6 @@ object EventWrapper { @SubscribeEvent @JvmStatic fun serverTickEvent(e: TickEvent.ServerTickEvent) { - ServerChatHandler.writeIncomingToChat() + ServerChatHandler.writeIncomingToChat(FMLCommonHandler.instance().minecraftServerInstance.tickCounter) } } \ No newline at end of file diff --git a/1.12.2/src/main/kotlin/matterlink/MatterLink.kt b/1.12.2/src/main/kotlin/matterlink/MatterLink.kt index fe431de..b2e7566 100644 --- a/1.12.2/src/main/kotlin/matterlink/MatterLink.kt +++ b/1.12.2/src/main/kotlin/matterlink/MatterLink.kt @@ -9,11 +9,14 @@ import net.minecraft.util.text.TextComponentString import net.minecraftforge.fml.common.FMLCommonHandler import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.event.* +import org.apache.logging.log4j.Logger const val MODID = "matterlink" const val NAME = "MatterLink" const val VERSION = "@VERSION@" +lateinit var logger: Logger + @Mod( modid = MODID, name = NAME, version = VERSION, diff --git a/Jenkinsfile b/Jenkinsfile index 99eaf83..6033692 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,21 @@ -node { - checkout scm - sh './gradlew :1.12.2:setupCiWorkspace :1.12.2:clean :1.12.2:build' - archive '1.12.2/build/libs/*jar' +pipeline { + agent any + stages { + stage("1.11.2") { + steps { + sh './gradlew :1.11.2:setupCiWorkspace' + sh './gradlew :1.11.2:clean' + sh './gradlew :1.11.2:build' + archive '1.11.2/build/libs/*jar' + } + } + stage("1.12.2") { + steps { + sh './gradlew :1.12.2:setupCiWorkspace' + sh './gradlew :1.12.2:clean' + sh './gradlew :1.12.2:build' + archive '1.12.2/build/libs/*jar' + } + } + } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 6327722..9212dad 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,12 @@ -buildscript { - repositories { - jcenter() - maven { url = "http://files.minecraftforge.net/maven" } - mavenCentral() - } - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' - } -} plugins { id "org.jetbrains.kotlin.jvm" version '1.2.21' - id "com.github.johnrengelman.shadow" version "1.2.4" id 'idea' } + subprojects { apply plugin: "kotlin" - apply plugin: 'idea' + apply plugin: "idea" idea { module { @@ -24,84 +14,18 @@ subprojects { } } - if(name != "core") { - apply plugin: 'net.minecraftforge.gradle.forge' - apply plugin: 'com.github.johnrengelman.shadow' - - version = mc_version + "-" + mod_version - - archivesBaseName = "MatterLink" - - sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly. - compileJava { - sourceCompatibility = targetCompatibility = '1.8' - } - - minecraft { - version = mc_version + "-" + forge_version - runDir = "../run" - - mappings = mcp_mappings - - replaceIn 'MatterLink.kt' - replace '@VERSION@', mod_version - } - - processResources { - // this will ensure that this task is redone when the versions change. - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - - // replace stuff in mcmod.info, nothing else - from(project(":core").sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - - // replace version and mcversion - expand 'version':project.version, 'mcversion':project.minecraft.version - } - - // copy everything else except the mcmod.info - from(project(":core").sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } - } - + if (name != "core") { repositories { jcenter() maven { + name = "unascribed" url = 'http://unascribed.com/maven/releases' } maven { - url "http://maven.shadowfacts.net/" + name = "shadowfacts" + url = "http://maven.shadowfacts.net/" } } - dependencies { - compile project(':core') - compile group: "net.shadowfacts", name: "Forgelin", version: "1.6.0" - } - - shadowJar { - classifier '' - // configurations = [project.configurations.shadow] - - relocate "org.apache.http", "matterlink.repack.org.apache.http" - relocate "org.apache.commons.logging", "matterlink.repack.org.apache.commons.logging" - dependencies { - include(project(":core")) - include(dependency("org.apache.httpcomponents:httpclient:4.3.3")) - include(dependency("org.apache.httpcomponents:httpcore:4.3.2")) - include(dependency('commons-logging:commons-logging:1.1.3')) - } - - exclude 'dummyThing' - } - - - reobf { - shadowJar { mappingType = 'SEARGE' } - } - - tasks.reobfShadowJar.mustRunAfter shadowJar } } \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle index b7d33de..51f784e 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -20,7 +20,7 @@ repositories { dependencies { compile 'org.apache.httpcomponents:httpclient:4.3.3' compile 'commons-logging:commons-logging:1.1.3' - compile group: "org.apache.logging.log4j", name: "log4j-api", version: '2.8.1' +// compile group: "org.apache.logging.log4j", name: "log4j-api", version: '2.8.1' compile 'com.google.code.gson:gson:2.8.0' compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" } diff --git a/core/src/main/kotlin/matterlink/IMatterLink.kt b/core/src/main/kotlin/matterlink/IMatterLink.kt index f6494e9..e5865aa 100644 --- a/core/src/main/kotlin/matterlink/IMatterLink.kt +++ b/core/src/main/kotlin/matterlink/IMatterLink.kt @@ -1,25 +1,39 @@ package matterlink import matterlink.bridge.MessageHandler -import org.apache.logging.log4j.Logger +//import org.apache.logging.log4j.Logger lateinit var instance: IMatterLink -lateinit var logger: Logger +//lateinit var logger: Logger abstract class IMatterLink { + var interrupted: Boolean = false + abstract fun wrappedSendToPlayers(msg: String) abstract fun wrappedPlayerList(): Array fun connect() { if (MessageHandler.start(clear = true)) { - logger.info("Connected to matterbridge relay") + println("Connected to matterbridge relay") } else { - logger.error("Connection to matterbridge relay failed.") + System.err.println("Connection to matterbridge relay failed.") } } fun disconnect () { MessageHandler.stop() } + + + fun reconnect(tick: Int) { + if(tick % 20 == 0 && interrupted) { + println("Trying to reconnect") + if (MessageHandler.start(clear = false)) { + println("Reconnected to matterbridge relay") + } else { + System.err.println("Reconnection to matterbridge relay failed.") + } + } + } } \ No newline at end of file diff --git a/core/src/main/kotlin/matterlink/bridge/HttpStreamConnection.kt b/core/src/main/kotlin/matterlink/bridge/HttpStreamConnection.kt index 68e4ef6..81682aa 100644 --- a/core/src/main/kotlin/matterlink/bridge/HttpStreamConnection.kt +++ b/core/src/main/kotlin/matterlink/bridge/HttpStreamConnection.kt @@ -1,6 +1,7 @@ package matterlink.bridge; -import matterlink.logger +import matterlink.instance +//import matterlink.logger import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClients import java.io.InputStream @@ -19,10 +20,11 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe override fun run() { - if(clear) { + instance.interrupted = false + if (clear) { val r = client.execute(clearGet) r.entity.content.bufferedReader().forEachLine { - logger.debug("skipping $it") + println("DEBUG: skipping $it") } } val response = client.execute(get) @@ -37,7 +39,7 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe if (chars > 0) { buffer += String(buf.dropLast(buf.count() - chars).toByteArray()) - logger.debug(buffer) + println("DEBUG: " + buffer) while (buffer.contains("\n")) { val line = buffer.substringBefore("\n") @@ -49,11 +51,15 @@ class HttpStreamConnection(getClosure: () -> HttpGet, clearClosure: () -> HttpGe } } } catch (e: SocketException) { -// MatterLink.logger.error("Bridge Connection interrupted...") + if (!cancelled) { + System.err.println("Bridge Connection interrupted...") + instance.interrupted = true + //TODO: mark connection as interrupted and try to reconnect + } } - logger.debug("closing stream") + println("DEBUG: closing stream") content.close() - logger.debug("thread finished") + println("DEBUG: thread finished") onClose() return } diff --git a/core/src/main/kotlin/matterlink/bridge/MessageHandler.kt b/core/src/main/kotlin/matterlink/bridge/MessageHandler.kt index 0a22668..f4d7aba 100644 --- a/core/src/main/kotlin/matterlink/bridge/MessageHandler.kt +++ b/core/src/main/kotlin/matterlink/bridge/MessageHandler.kt @@ -1,7 +1,7 @@ package matterlink.bridge import matterlink.config.cfg -import matterlink.logger +//import matterlink.logger import org.apache.http.client.methods.HttpGet import org.apache.http.client.methods.HttpPost import org.apache.http.client.methods.HttpRequestBase @@ -30,7 +30,7 @@ object MessageHandler { } private fun createThread(clear: Boolean = true): HttpStreamConnection { - logger.info("Attempting to open bridge connection.") + println("Attempting to open bridge connection.") return HttpStreamConnection( { HttpGet(cfg!!.connect.url + "/api/stream").apply { @@ -46,10 +46,10 @@ object MessageHandler { rcvQueue.add( ApiMessage.decode(it) ) - logger.debug("Received: " + it) +// println("Received: " + it) }, { - logger.info("Bridge connection closed!") + println("Bridge connection closed!") connected = false }, clear @@ -58,13 +58,13 @@ object MessageHandler { fun transmit(msg: ApiMessage) { if (connected && streamConnection.isAlive) { - logger.debug("Transmitting: " + msg) + println("Transmitting: " + msg) transmitMessage(msg) } } fun stop() { - logger.info("Closing bridge connection...") + println("Closing bridge connection...") // MessageHandler.transmit(ApiMessage(text="bridge closing", username="Server")) streamConnection.close() } @@ -93,14 +93,14 @@ object MessageHandler { val response = client.execute(post) val code = response.statusLine.statusCode if (code != 200) { - logger.error("Server returned $code for $post") + System.err.println("Server returned $code for $post") } sendErrors = 0 } catch (e: IOException) { - logger.error("sending message caused $e") + System.err.println("sending message caused $e") sendErrors++ if (sendErrors > 5) { - logger.error("caught too many errors, closing bridge") + System.err.println("caught too many errors, closing bridge") stop() } } diff --git a/core/src/main/kotlin/matterlink/bridge/ServerChatHandler.kt b/core/src/main/kotlin/matterlink/bridge/ServerChatHandler.kt index 536b49a..4c07e75 100644 --- a/core/src/main/kotlin/matterlink/bridge/ServerChatHandler.kt +++ b/core/src/main/kotlin/matterlink/bridge/ServerChatHandler.kt @@ -1,6 +1,6 @@ package matterlink.bridge -import matterlink.logger +//import matterlink.logger import matterlink.instance import matterlink.bridge.command.BridgeCommandRegistry import matterlink.config.cfg @@ -10,9 +10,10 @@ object ServerChatHandler { /** * This method must be called every server tick with no arguments. */ - fun writeIncomingToChat() { + fun writeIncomingToChat(tick: Int) { + instance.reconnect(tick) if (MessageHandler.rcvQueue.isNotEmpty()) - logger.debug("incoming: " + MessageHandler.rcvQueue.toString()) + println("incoming: " + MessageHandler.rcvQueue.toString()) val nextMessage = MessageHandler.rcvQueue.poll() if (nextMessage != null && nextMessage.gateway == cfg!!.connect.gateway) { @@ -29,11 +30,11 @@ object ServerChatHandler { val user = nextMessage.username val text = nextMessage.text val json = nextMessage.encode() - logger.debug("Threw out message with unhandled event: ${nextMessage.event}") - logger.debug(" Message contents:") - logger.debug(" User: $user") - logger.debug(" Text: $text") - logger.debug(" JSON: $json") + println("Threw out message with unhandled event: ${nextMessage.event}") + println(" Message contents:") + println(" User: $user") + println(" Text: $text") + println(" JSON: $json") return } } diff --git a/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt b/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt index f051fa9..f240354 100644 --- a/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt +++ b/core/src/main/kotlin/matterlink/bridge/command/BridgeCommandRegistry.kt @@ -1,7 +1,7 @@ package matterlink.bridge.command import matterlink.config.cfg -import matterlink.logger +//import matterlink.logger import java.util.* object BridgeCommandRegistry { @@ -23,7 +23,7 @@ object BridgeCommandRegistry { fun register(cmd: IBridgeCommand): Boolean { if (cmd.name.isBlank() || commandMap.containsKey(cmd.name)) { - logger.error("Failed to register command: '${cmd.name}'") + System.out.println("Failed to register command: '${cmd.name}'") return false } commandMap[cmd.name] = cmd diff --git a/core/src/main/kotlin/matterlink/handlers/ChatHandler.kt b/core/src/main/kotlin/matterlink/handlers/ChatHandler.kt index 90aa90e..48211df 100644 --- a/core/src/main/kotlin/matterlink/handlers/ChatHandler.kt +++ b/core/src/main/kotlin/matterlink/handlers/ChatHandler.kt @@ -2,7 +2,7 @@ package matterlink.handlers import matterlink.bridge.ApiMessage import matterlink.bridge.MessageHandler -import matterlink.logger +//import matterlink.logger object ChatHandler { fun handleChat(user: String, msg: String) { @@ -12,7 +12,7 @@ object ChatHandler { username = user, text = message )) - else -> logger.warn("dropped blank message by '$user'") + else -> println("WARN: dropped blank message by '$user'") } } } diff --git a/gradle.properties b/gradle.properties index f5b8419..551e3e5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -mod_version = 1.1.2 +mod_version = 1.2 diff --git a/settings.gradle b/settings.gradle index 5cc28de..de5082c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = 'MatterLink' -include 'core', '1.12.2' \ No newline at end of file +include 'core', '1.12.2', '1.11.2' \ No newline at end of file