Skip to content

Commit

Permalink
feat: v2.1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
Azn9 committed Jul 17, 2024
1 parent 4f5a759 commit 0c2f084
Show file tree
Hide file tree
Showing 43 changed files with 715 additions and 79 deletions.
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ antlr = "4.13.1"
commons-io = "2.15.1"
commons-lang = "3.14.0"
commons-text = "1.11.0"
discord-ipc = "0.2.2"
discord-ipc = "0.2.4"
docker = "3.2.13"
foojay-resolver-convention = "0.8.0" # Also update manually in settings.gradle.kts
gitversion = "3.0.0"
Expand Down Expand Up @@ -50,7 +50,7 @@ antlr-runtime = { group = "org.antlr", name = "antlr4-runtime", version.ref = "a
commons-io = { group = "commons-io", name = "commons-io", version.ref = "commons-io" }
commons-lang = { group = "org.apache.commons", name = "commons-lang3", version.ref = "commons-lang" }
commons-text = { group = "org.apache.commons", name = "commons-text", version.ref = "commons-text" }
discord-ipc = { group = "com.github.cbyrneee", name = "azn9_KDiscordIPC", version.ref = "discord-ipc" }
discord-ipc = { group = "dev.cbyrne", name = "azn9_KDiscordIPC", version.ref = "discord-ipc" }
docker = { group = "com.github.docker-java", name = "docker-java", version.ref = "docker" }
gradle-shadow = { group = "gradle.plugin.com.github.jengelman.gradle.plugins", name = "shadow", version.ref = "shadow" }
guava = { group = "com.google.guava", name = "guava", version.ref = "guava" }
Expand Down
6 changes: 6 additions & 0 deletions plugin/changelog.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
## v2.1.2
- Cancel some functionalities of the plugin if Almighty Alpaca's old version is detected as it raises exceptions
- Add notifications when an issue that may/will prevent the plugin from working is detected
- Fix error "IPC error: ErrorEventData(code=1000, message=Request has been terminated..."
- Fix error "Throwable: unknown runnable: dev.azn9.plugins.discord.time.TimeService"

## v2.1.1
- Re-enable the need to restart the IDE when updating or disabling the plugin to avoid issues like `getService(T::class.java) must not be null`

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,22 @@

package dev.azn9.plugins.discord

import com.intellij.ide.plugins.PluginManager
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.extensions.PluginDescriptor

object DiscordPlugin {
val LOG: Logger = Logger.getInstance("Discord")

fun isAlmightyAlpacasPluginPresent() : Boolean {
for (plugin: PluginDescriptor? in PluginManager.getPlugins()) {
when (plugin?.pluginId?.idString) {
"com.almightyalpaca.intellij.plugins.discord" -> {
return true
}
}
}

return false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.project.guessModuleDir
import com.intellij.openapi.wm.IdeFocusManager
import com.intellij.serviceContainer.AlreadyDisposedException
import com.intellij.xdebugger.XDebuggerManager
import dev.azn9.plugins.discord.DiscordPlugin
import dev.azn9.plugins.discord.extensions.VcsInfoExtension
Expand All @@ -52,7 +53,13 @@ val dataService: DataService
class DataService {
suspend fun getData(mode: Renderer.Mode): Data? = tryOrNull {
mode.runCatching { getData() }
.onFailure { DiscordPlugin.LOG.warnLazy(it) { "Failed to get data" } }
.onFailure { e ->
if (e is AlreadyDisposedException) {
return@onFailure
}

DiscordPlugin.LOG.warnLazy(e) { "Failed to get data" }
}
.getOrNull()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,21 @@

package dev.azn9.plugins.discord.diagnose

import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import dev.azn9.plugins.discord.utils.tryOrDefault
import com.intellij.ide.plugins.PluginManager
import com.intellij.openapi.application.ApplicationNamesInfo
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.extensions.PluginDescriptor
import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import dev.azn9.plugins.discord.utils.tryOrDefault
import dev.cbyrne.kdiscordipc.core.socket.SocketProvider
import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.async
import org.apache.commons.lang3.SystemUtils
import java.io.File
import java.io.IOException
import java.nio.charset.StandardCharsets

val diagnoseService: DiagnoseService
Expand Down Expand Up @@ -107,15 +109,31 @@ class DiagnoseService : DisposableCoroutineScope {
"DiscordDevelopment.exe"
)

val hasIpcFile = (0..9).map { "discord-ipc-$it" }.any {
val ipcFile = (0..9).map { "discord-ipc-$it" }
.map { File("\\\\?\\pipe\\$it") }.firstOrNull { file ->
try {
file.exists()
} catch (e: Exception) {
false
}
}

if (ipcFile != null) {
try {
File("\\\\?\\pipe\\$it").exists()
} catch (e: Exception) {
false
val socket = SocketProvider.systemDefault()
socket.connect(ipcFile)
socket.close()
} catch (e: IOException) {
return Discord.ADMINISTRATOR
} catch (e: Throwable) {
// Ignore
}

if (!ipcFile.canWrite() || !ipcFile.canRead()) {
return Discord.ADMINISTRATOR
}
}

if (hasIpcFile) {
// We found an IPC file and seems to have access to it
return Discord.OTHER
}

Expand Down Expand Up @@ -149,6 +167,7 @@ class DiagnoseService : DisposableCoroutineScope {
"com.tsunderebug.discordintellij" -> matches++
"com.my.fobes.intellij.discord" -> matches++
"com.almightyalpaca.intellij.plugins.discord" -> matches++
"io.github.pandier.intellijdiscordrp" -> matches++
}
}

Expand Down Expand Up @@ -187,6 +206,7 @@ class DiagnoseService : DisposableCoroutineScope {
BROWSER("It seems like Discord is running in the browser. The plugin will not be able to connect to the Discord client!"),
CLOSED("Could not detect a running Discord client!"),
RUNNING_WITHOUT_RICH_PRESENCE_ENABLED("It seems like Discord is running, but Rich Presence is not enabled!"),
ADMINISTRATOR("It seems like Discord is running in administrator, this will prevent the plugin from connecting to your Discord client!"),
OTHER("")
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import dev.cbyrne.kdiscordipc.core.event.impl.ErrorEvent
import dev.cbyrne.kdiscordipc.core.event.impl.ReadyEvent
import dev.cbyrne.kdiscordipc.data.activity.*
import kotlinx.coroutines.*
import org.intellij.markdown.flavours.gfm.table.GitHubTableMarkerProvider.Companion.contains
import java.io.ByteArrayOutputStream
import java.util.Base64
import javax.imageio.ImageIO
Expand Down Expand Up @@ -142,7 +143,11 @@ class DiscordIpcConnection(override val appId: Long, private val userCallback: U
}

private fun onError(event: ErrorEvent) {
DiscordPlugin.LOG.errorLazy { "IPC error: ${event.data}" }
if (event.data.code == 1000) { // "Request has been terminated Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.)"
return
}

DiscordPlugin.LOG.warnLazy { "IPC error: ${event.data}" }
}

private fun onCurrentUserUpdate(event: CurrentUserUpdateEvent) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@

package dev.azn9.plugins.discord.settings

import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.service
import dev.azn9.plugins.discord.settings.options.OptionHolder
import dev.azn9.plugins.discord.settings.options.types.*
import dev.azn9.plugins.discord.settings.values.*
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.service
import org.jdom.Element

val settings: ApplicationSettings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@

package dev.azn9.plugins.discord.settings

import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import dev.azn9.plugins.discord.settings.options.OptionHolder
import dev.azn9.plugins.discord.settings.options.types.BooleanValue
import dev.azn9.plugins.discord.settings.options.types.StringValue
import dev.azn9.plugins.discord.settings.options.types.ThemeValue
import dev.azn9.plugins.discord.settings.values.ProjectShowValue
import com.intellij.openapi.components.PersistentStateComponent
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import org.jdom.Element

val Project.settings: ProjectSettings
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,20 @@

package dev.azn9.plugins.discord.postLoad

import com.intellij.notification.NotificationGroupManager
import com.intellij.notification.NotificationType
import com.intellij.notification.Notifications
import com.intellij.openapi.application.ApplicationNamesInfo
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import dev.azn9.plugins.discord.DiscordPlugin
import dev.azn9.plugins.discord.diagnose.DiagnoseService
import dev.azn9.plugins.discord.diagnose.diagnoseService
import dev.azn9.plugins.discord.settings.values.ApplicationType
import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.future.asCompletableFuture
import kotlinx.coroutines.launch

class DiagnosePreloadingActivity : StartupActivity.Background, StartupActivity.DumbAware, DisposableCoroutineScope {
Expand All @@ -42,8 +48,95 @@ class DiagnosePreloadingActivity : StartupActivity.Background, StartupActivity.D

DiscordPlugin.LOG.info("Application identifiers: ${ApplicationType.IDE.applicationName}, ${ApplicationType.IDE_EDITION.applicationName}")

diagnoseService.discord
diagnoseService.plugins
diagnoseService.ide
if (DiscordPlugin.isAlmightyAlpacasPluginPresent()) {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification(
"Discord Integration V2",
"Detected plugin 'Discord Integration' by Almighty Alpaca. Please uninstall this old plugin as it will prevent this one from working!",
NotificationType.ERROR
)
.setImportant(true)
.run(Notifications.Bus::notify)
return
}

diagnoseService.discord.asCompletableFuture().thenAcceptAsync { discord ->
when (discord) {
DiagnoseService.Discord.SNAP -> {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification("Discord Integration V2", "Discord detected as snap package, this will prevent the plugin from connecting to Discord!", NotificationType.ERROR)
.setImportant(true)
.run(Notifications.Bus::notify)
}
DiagnoseService.Discord.FLATPAK -> {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification("Discord Integration V2", "Discord detected a flatpak package, this may prevent the plugin from connecting to Discord!", NotificationType.WARNING)
.setImportant(true)
.run(Notifications.Bus::notify)
}
DiagnoseService.Discord.RUNNING_WITHOUT_RICH_PRESENCE_ENABLED -> {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification("Discord Integration V2", "Discord detected but rich presence is not enabled, this will prevent the plugin from connecting to Discord!", NotificationType.WARNING)
.setImportant(true)
.run(Notifications.Bus::notify)
}
DiagnoseService.Discord.BROWSER -> {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification("Discord Integration V2", "Discord detected in a web browser, this will prevent the plugin from connecting to Discord!", NotificationType.ERROR)
.setImportant(true)
.run(Notifications.Bus::notify)
}
DiagnoseService.Discord.ADMINISTRATOR -> {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification("Discord Integration V2", "Discord detected running as administrator, this will prevent the plugin from connecting to Discord!", NotificationType.ERROR)
.setImportant(true)
.run(Notifications.Bus::notify)
}

else -> {}
}
}
diagnoseService.plugins.asCompletableFuture().thenAcceptAsync { plugins ->
if (plugins == DiagnoseService.Plugins.ONE) {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification(
"Discord Integration V2",
"An other Discord notification plugin has been detected, please uninstall it as it may prevent Discord Integration V2 from working correctly!",
NotificationType.WARNING
)
.setImportant(true)
.run(Notifications.Bus::notify)
} else if (plugins == DiagnoseService.Plugins.MULTIPLE) {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification(
"Discord Integration V2",
"Multiple other Discord notification plugins has been detected, please uninstall them as they may prevent Discord Integration V2 from working correctly!",
NotificationType.WARNING
)
.setImportant(true)
.run(Notifications.Bus::notify)
}
}
diagnoseService.ide.asCompletableFuture().thenAcceptAsync { ide ->
if (ide != DiagnoseService.Ide.OTHER) {
NotificationGroupManager.getInstance()
.getNotificationGroup("dev.azn9.plugins.discord.notification.error")
.createNotification(
"Discord Integration V2",
"${ApplicationNamesInfo.getInstance().fullProductName} is running as a Snap package. This will most likely prevent the plugin from connection to your Discord client!",
NotificationType.WARNING
)
.setImportant(true)
.run(Notifications.Bus::notify)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package dev.azn9.plugins.discord.postLoad

import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import dev.azn9.plugins.discord.DiscordPlugin
import dev.azn9.plugins.discord.notifications.ApplicationUpdateNotification
import dev.azn9.plugins.discord.notifications.ProjectShowNotification
Expand All @@ -25,8 +27,6 @@ import dev.azn9.plugins.discord.settings.settings
import dev.azn9.plugins.discord.settings.values.ProjectShow
import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import dev.azn9.plugins.discord.utils.Plugin
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
Expand All @@ -36,6 +36,10 @@ class NotificationPostStartupActivity : StartupActivity.Background, StartupActiv

override fun runActivity(project: Project) {
launch {
if (DiscordPlugin.isAlmightyAlpacasPluginPresent()) {
return@launch
}

checkUpdate()
checkAskShowProject(project)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import dev.azn9.plugins.discord.render.renderService
import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import dev.azn9.plugins.discord.DiscordPlugin
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
Expand All @@ -30,6 +31,10 @@ class RenderPreloadingActivity : StartupActivity.Background, StartupActivity.Dum

override fun runActivity(project: Project) {
launch {
if (DiscordPlugin.isAlmightyAlpacasPluginPresent()) {
return@launch
}

renderService.startRenderClock()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import dev.azn9.plugins.discord.time.timeService
import dev.azn9.plugins.discord.utils.DisposableCoroutineScope
import com.intellij.openapi.project.Project
import com.intellij.openapi.startup.StartupActivity
import dev.azn9.plugins.discord.DiscordPlugin
import kotlinx.coroutines.Job
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.launch
Expand All @@ -30,6 +31,10 @@ class TimePreloadingActivity : StartupActivity.Background, StartupActivity.DumbA

override fun runActivity(project: Project) {
launch {
if (DiscordPlugin.isAlmightyAlpacasPluginPresent()) {
return@launch
}

timeService.load()
}
}
Expand Down
Loading

0 comments on commit 0c2f084

Please sign in to comment.