├── HEADER.txt
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── src
├── main
│ ├── resources
│ │ ├── dis4irc-versioning.txt
│ │ └── logback.xml
│ └── kotlin
│ │ └── io
│ │ └── zachbr
│ │ └── dis4irc
│ │ ├── bridge
│ │ ├── message
│ │ │ ├── PlatformType.kt
│ │ │ ├── PlatformSource.kt
│ │ │ ├── Destination.kt
│ │ │ ├── PlatformSender.kt
│ │ │ ├── DiscordContentBase.kt
│ │ │ ├── PlatformMessage.kt
│ │ │ └── BridgeMessage.kt
│ │ ├── command
│ │ │ ├── api
│ │ │ │ └── Executor.kt
│ │ │ ├── CommandManager.kt
│ │ │ └── executors
│ │ │ │ ├── PinnedMessagesCommand.kt
│ │ │ │ └── StatsCommand.kt
│ │ ├── pier
│ │ │ ├── Pier.kt
│ │ │ ├── irc
│ │ │ │ ├── Extensions.kt
│ │ │ │ ├── IrcExtrasListener.kt
│ │ │ │ ├── IrcConnectionListener.kt
│ │ │ │ ├── IrcMessageListener.kt
│ │ │ │ ├── IrcJoinQuitListener.kt
│ │ │ │ ├── IrcPier.kt
│ │ │ │ └── IrcMessageFormatter.kt
│ │ │ └── discord
│ │ │ │ ├── DiscordMsgListener.kt
│ │ │ │ ├── DiscordJoinQuitListener.kt
│ │ │ │ ├── Extensions.kt
│ │ │ │ └── DiscordPier.kt
│ │ ├── mutator
│ │ │ ├── mutators
│ │ │ │ ├── StripAntiPingCharacters.kt
│ │ │ │ └── TranslateFormatting.kt
│ │ │ ├── api
│ │ │ │ └── Mutator.kt
│ │ │ └── MutatorManager.kt
│ │ ├── ChannelMappingManager.kt
│ │ ├── StatisticsManager.kt
│ │ ├── ConfigurationData.kt
│ │ └── Bridge.kt
│ │ ├── util
│ │ ├── WrappingLongArray.kt
│ │ ├── Versioning.kt
│ │ ├── StringUtil.kt
│ │ ├── DiscordSpoilerExtension.kt
│ │ └── AtomicFileUtil.kt
│ │ ├── config
│ │ ├── Configuration.kt
│ │ └── ConfigurationUtils.kt
│ │ └── Dis4IRC.kt
└── test
│ └── kotlin
│ └── io
│ └── zachbr
│ └── dis4irc
│ └── bridge
│ ├── pier
│ ├── irc
│ │ ├── IrcPierTest.kt
│ │ └── IrcEncodedCutterTest.kt
│ └── discord
│ │ └── DiscordPierTest.kt
│ ├── message
│ └── MessageTest.kt
│ ├── util
│ └── WrappingLongArrayTest.kt
│ └── mutator
│ └── mutators
│ └── TranslateFormattingTest.kt
├── settings.gradle.kts
├── Dockerfile
├── .github
└── workflows
│ ├── gradle.yml
│ └── container-publish.yml
├── LICENSE.md
├── docs
├── Registering-A-Discord-Application.md
└── Getting-Started.md
├── gradlew.bat
├── README.md
├── .gitignore
├── CHANGELOG.md
└── gradlew
/HEADER.txt:
--------------------------------------------------------------------------------
1 | This file is part of ${name}.
2 |
3 | Copyright (c) ${name} contributors
4 |
5 | MIT License
6 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/zachbr/Dis4IRC/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/src/main/resources/dis4irc-versioning.txt:
--------------------------------------------------------------------------------
1 | Name: ${projectName}
2 | Version: ${projectVersion}
3 | Suffix: ${projectSuffix}
4 | Source-Repo: ${projectSourceRepo}
5 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | mavenCentral()
4 | maven("https://plugins.gradle.org/m2/")
5 | maven("https://maven.neoforged.net/releases/")
6 | }
7 | }
8 | rootProject.name = "Dis4IRC"
9 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM eclipse-temurin:21-jre-alpine
2 | COPY build/libs/Dis4IRC-*.jar /opt/dis4irc/app.jar
3 | RUN mkdir /data
4 | WORKDIR /data
5 | VOLUME ["/data"]
6 | ENV JAVA_OPTS="-Xmx512m"
7 | ENTRYPOINT ["sh","-c","exec java $JAVA_OPTS -jar /opt/dis4irc/app.jar"]
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/message/PlatformType.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.message
10 |
11 | enum class PlatformType {
12 | /**
13 | * Discord platform
14 | */
15 | DISCORD,
16 | /**
17 | * IRC platform
18 | */
19 | IRC
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/resources/logback.xml:
--------------------------------------------------------------------------------
1 |
8 |
9 |
10 |
11 |
12 | [%d{HH:mm:ss}] [%logger] [%level] - %msg%n
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/message/PlatformSource.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.message
10 |
11 | sealed interface PlatformSource {
12 | val channelName: String
13 | }
14 |
15 | data class IrcSource(
16 | override val channelName: String
17 | ) : PlatformSource
18 |
19 | data class DiscordSource(
20 | override val channelName: String,
21 | val channelId: Long
22 | ) : PlatformSource
23 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/command/api/Executor.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.command.api
10 |
11 | import io.zachbr.dis4irc.bridge.message.PlatformMessage
12 |
13 | interface Executor {
14 | /**
15 | * Perform some action when a command is executed
16 | *
17 | * @return your desired output or null if you desire no output
18 | */
19 | fun onCommand(command: PlatformMessage): String?
20 | }
21 |
--------------------------------------------------------------------------------
/.github/workflows/gradle.yml:
--------------------------------------------------------------------------------
1 | name: Java CI
2 |
3 | on: [push, pull_request]
4 |
5 | jobs:
6 | build:
7 |
8 | runs-on: ubuntu-latest
9 |
10 | steps:
11 | - uses: actions/checkout@v4
12 | - uses: actions/setup-java@v4
13 | with:
14 | distribution: 'temurin'
15 | java-version: '21'
16 | cache: 'gradle'
17 | - name: Build with Gradle
18 | run: ./gradlew build --no-daemon
19 | - name: Upload build artifacts
20 | uses: actions/upload-artifact@v4
21 | with:
22 | name: dis4irc-jar
23 | path: build/libs/Dis4IRC-*.jar
24 | if-no-files-found: error
25 |
--------------------------------------------------------------------------------
/src/test/kotlin/io/zachbr/dis4irc/bridge/pier/irc/IrcPierTest.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.pier.irc
10 |
11 | import org.junit.jupiter.api.Assertions.assertEquals
12 | import org.junit.jupiter.api.Test
13 |
14 | class IrcPierTest {
15 | @Test
16 | fun testAntiPing() {
17 | assertEquals("k\u200Bit\u200Bte\u200Bn", IrcMessageFormatter.rebuildWithAntiPing("kitten"))
18 | assertEquals("k\u200Bit\u200Bte\u200Bn \u200B\uD83C\uDF57\u200B", IrcMessageFormatter.rebuildWithAntiPing("kitten \uD83C\uDF57"))
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/message/Destination.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.message
10 |
11 | enum class Destination {
12 | /**
13 | * Only send back to the source
14 | */
15 | ORIGIN,
16 | /**
17 | * Only send to the opposite side of the bridge
18 | */
19 | OPPOSITE,
20 | /**
21 | * Send to both sides of the bridge
22 | */
23 | BOTH,
24 | /**
25 | * Only send to IRC
26 | */
27 | IRC,
28 | /**
29 | * Only send to Discord
30 | */
31 | DISCORD
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/message/PlatformSender.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.message
10 |
11 | sealed interface PlatformSender {
12 | val displayName: String
13 | }
14 |
15 | data class IrcSender(
16 | override val displayName: String,
17 | val nickServAccount: String?
18 | ) : PlatformSender
19 |
20 | data class DiscordSender(
21 | override val displayName: String,
22 | val userId: Long
23 | ) : PlatformSender
24 |
25 | object BridgeSender : PlatformSender {
26 | override val displayName: String = "Bridge"
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/kotlin/io/zachbr/dis4irc/bridge/message/DiscordContentBase.kt:
--------------------------------------------------------------------------------
1 | /*
2 | * This file is part of Dis4IRC.
3 | *
4 | * Copyright (c) Dis4IRC contributors
5 | *
6 | * MIT License
7 | */
8 |
9 | package io.zachbr.dis4irc.bridge.message
10 |
11 | sealed interface DiscordContentBase {
12 | var contents: String
13 | val attachments: List
14 | val embeds: List