├── .github
└── workflows
│ └── build.yml
├── .gitignore
├── Aliucord.zip
├── AliucordRenamer
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── AliucordRenamer
│ ├── AliucordRenamer.kt
│ └── PluginSettings.kt
├── Discord Startup Sound HQ.mp3
├── FanCopypasta
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── FanCopypasta
│ └── FanCopypasta.kt
├── ForceSlashCommandsFixNOW
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── forceslashcommandsfixnow
│ └── slashfix.kt
├── Hispanizador
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── hispanizador
│ └── spanishbutton.kt
├── NoticeSound
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── NoticeSound
│ ├── NoticeSound.kt
│ └── PluginSettings.kt
├── POC-DONTINSTALL
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── explode
│ └── funny.kt
├── README.md
├── Rule34
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── Rule34
│ └── Rule34.kt
├── SafeBooru
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── SafeBooru
│ └── SafeBooru.kt
├── StartupSound
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── StartupSound
│ ├── PluginSettings.kt
│ └── StartupSound.kt
├── UserBG
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── userbg
│ ├── PluginSettings.kt
│ ├── README.md
│ ├── UserBG.kt
│ └── model
│ ├── AbstractDatabase.kt
│ └── USRBG.kt
├── UserPFP
├── build.gradle.kts
└── src
│ └── main
│ ├── AndroidManifest.xml
│ └── kotlin
│ └── om
│ └── ega
│ └── sunkey
│ └── userpfp
│ ├── PluginSettings.kt
│ ├── README.md
│ ├── UserPFP.kt
│ └── model
│ ├── APFP.kt
│ └── AbstractDatabase.kt
├── build.gradle.kts
├── git.ignore
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── ping.mp3
└── settings.gradle.kts
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: Build
2 |
3 | # https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency
4 | concurrency:
5 | group: "build"
6 | cancel-in-progress: true
7 |
8 | on:
9 | push:
10 | branches:
11 | - main
12 | paths-ignore:
13 | - '*.md'
14 |
15 | jobs:
16 | build:
17 | runs-on: ubuntu-24.04
18 | steps:
19 | - name: Checkout
20 | uses: actions/checkout@master
21 | with:
22 | path: "src"
23 |
24 | - name: Checkout builds
25 | uses: actions/checkout@master
26 | with:
27 | ref: "builds"
28 | path: "builds"
29 |
30 | - name: Checkout Aliucord
31 | uses: actions/checkout@master
32 | with:
33 | repository: "Aliucord/Aliucord"
34 | path: "repo"
35 |
36 | - name: Setup JDK 11
37 | uses: actions/setup-java@v4
38 | with:
39 | java-version: 11
40 | distribution: temurin
41 |
42 | - name: Setup Gradle
43 | uses: gradle/actions/setup-gradle@v4
44 |
45 | - name: Build Plugins
46 | run: |
47 | cd $GITHUB_WORKSPACE/src
48 | chmod +x gradlew
49 | ./gradlew make generateUpdaterJson
50 | cp **/build/*.zip $GITHUB_WORKSPACE/builds
51 | cp build/updater.json $GITHUB_WORKSPACE/builds
52 |
53 | - name: Push builds
54 | run: |
55 | cd $GITHUB_WORKSPACE/builds
56 | git config --local user.email "actions@github.com"
57 | git config --local user.name "GitHub Actions"
58 | git add .
59 | git commit -m "Build $GITHUB_SHA" || exit 0 # do not error if nothing to commit
60 | git push
61 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea
5 | .DS_Store
6 | /build
7 | **/build
8 | /captures
9 | .externalNativeBuild
10 | .cxx
11 | local.properties
12 |
--------------------------------------------------------------------------------
/Aliucord.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/790364947985647d29767e41abb751d59b32e195/Aliucord.zip
--------------------------------------------------------------------------------
/AliucordRenamer/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.1" // Plugin version. Increment this to trigger the updater
2 | description = "stupit plugin" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | // Changelog of your plugin
6 | changelog.set("""
7 | # 1.0.1
8 | * Set text hint / texto que te dice que poner en el cuadro de texto añadido wwww
9 | """.trimIndent())
10 | // Image or Gif that will be shown at the top of your changelog page
11 | //changelogMedia.set("https://cdn.discordapp.com/attachments/929565544334647356/957419019500146708/Screenshot_20220326-182112113.jpg")
12 |
13 | // Add additional authors to this plugin
14 | author("Iryis", 1)
15 | // author("Name", 0)
16 |
17 | // Excludes this plugin from the updater, meaning it won't show up for users.
18 | // Set this if the plugin is unfinished
19 | excludeFromUpdaterJson.set(false)
20 | }
21 |
--------------------------------------------------------------------------------
/AliucordRenamer/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/AliucordRenamer/src/main/kotlin/om/ega/sunkey/AliucordRenamer/AliucordRenamer.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.AliucordRenamer
2 |
3 | import android.content.Context
4 | import android.view.View
5 | import android.widget.TextView
6 | import androidx.appcompat.widget.LinearLayoutCompat
7 | import androidx.coordinatorlayout.widget.CoordinatorLayout
8 | import androidx.core.content.ContextCompat
9 | import androidx.core.content.res.ResourcesCompat
10 | import androidx.core.widget.NestedScrollView
11 | import com.aliucord.Constants
12 | import com.aliucord.Utils
13 | import com.aliucord.annotations.AliucordPlugin
14 | import com.aliucord.entities.Plugin
15 | import com.aliucord.patcher.after
16 | import com.discord.utilities.color.ColorCompat
17 | import com.discord.widgets.settings.WidgetSettings
18 | import com.lytefast.flexinput.R
19 |
20 | @AliucordPlugin
21 | class AliucordRenamer : Plugin() {
22 | init {
23 | settingsTab = SettingsTab(
24 | PluginSettings::class.java,
25 | SettingsTab.Type.PAGE
26 | ).withArgs(settings)
27 | }
28 |
29 | @Suppress("SetTextI18n", "Deprecation") // cope
30 | override fun start(ctx: Context) {
31 | patcher.after("onViewBound", View::class.java) {
32 | val context = requireContext()
33 | val root = it.args[0] as CoordinatorLayout
34 | val view = (root.getChildAt(1) as NestedScrollView).getChildAt(0) as LinearLayoutCompat
35 |
36 | val version = view.findViewById(Utils.getResId("app_info_header", "id"))
37 | version.text = settings.getString("name", "set a name in settings")
38 | }
39 | }
40 | override fun stop(ctx: Context) {
41 | patcher.unpatchAll()
42 | commands.unregisterAll()
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/AliucordRenamer/src/main/kotlin/om/ega/sunkey/AliucordRenamer/PluginSettings.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.AliucordRenamer
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils
5 | import com.aliucord.Utils.createCheckedSetting
6 | import com.aliucord.api.SettingsAPI
7 | import com.aliucord.fragments.SettingsPage
8 | import com.aliucord.views.TextInput
9 | import android.text.Editable
10 | import android.text.InputType
11 | import android.view.View
12 | import com.discord.app.AppFragment
13 | import com.discord.utilities.view.text.TextWatcher
14 |
15 | class PluginSettings (private val settings: SettingsAPI) : SettingsPage() {
16 | override fun onViewBound(view: View) {
17 | super.onViewBound(view)
18 | setActionBarTitle("AliucordRenamer")
19 | val texto = TextInput(view.context, "Set name to aliucord / Añade un nombre a aliucord")
20 | texto.editText.setHint("Set name to Aliucord, restart to apply")
21 | texto.editText.setText(
22 | settings.getString("name", "set a name in settings")
23 | )
24 | texto.editText.inputType = InputType.TYPE_CLASS_TEXT
25 | texto.editText.addTextChangedListener(object : TextWatcher() {
26 | override fun afterTextChanged(editable: Editable) {
27 | try {
28 | settings.setString("name",
29 | java.lang.String.valueOf(editable)
30 | //Utils.promptRestart("restart to change name")
31 | )
32 |
33 | } catch (e: Exception) {
34 | settings.setString("name", "set a name in settings")
35 | }
36 | }
37 | })
38 | addView(texto)
39 | }
40 | /*fun Restart(t: String = "restart to change name") {
41 | Utils.promptRestart(t)
42 | } */
43 | }
44 |
--------------------------------------------------------------------------------
/Discord Startup Sound HQ.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/790364947985647d29767e41abb751d59b32e195/Discord Startup Sound HQ.mp3
--------------------------------------------------------------------------------
/FanCopypasta/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "more stupit plugin" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | // Changelog of your plugin
6 | changelog.set("""
7 | # hi
8 | """.trimIndent())
9 | // Image or Gif that will be shown at the top of your changelog page
10 | //changelogMedia.set("https://cdn.discordapp.com/attachments/929565544334647356/957419019500146708/Screenshot_20220326-182112113.jpg")
11 |
12 | // Add additional authors to this plugin
13 | // author("Name", 0)
14 | // author("Name", 0)
15 |
16 | // Excludes this plugin from the updater, meaning it won't show up for users.
17 | // Set this if the plugin is unfinished
18 | excludeFromUpdaterJson.set(false)
19 | }
20 |
--------------------------------------------------------------------------------
/FanCopypasta/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/FanCopypasta/src/main/kotlin/om/ega/sunkey/FanCopypasta/FanCopypasta.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.FanCopypasta
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils
5 | import com.aliucord.Logger
6 | import com.aliucord.api.CommandsAPI
7 | import com.aliucord.api.CommandsAPI.CommandResult
8 | import com.aliucord.entities.CommandContext
9 |
10 | import com.aliucord.annotations.AliucordPlugin
11 | import com.aliucord.entities.Plugin
12 | import com.aliucord.patcher.*
13 |
14 | import com.discord.api.commands.ApplicationCommandType
15 |
16 | @AliucordPlugin(requiresRestart = false)
17 | class FanCopypasta : Plugin() {
18 | override fun start(context: Context) {
19 | commands.registerCommand("FanCopypasta", "Funny copypasta with your own word", commandoptions) {
20 | val keyw = it.getString("word")
21 | val LOG: Logger = Logger("FC")
22 | //LOG.debug(keyw)
23 | val copypasta = "if `${keyw}` has a million fans im one of them \nif `${keyw}` has 0 fans then I am no more \nif `${keyw}` has 1 fan that fan is me \nif the world is against `${keyw}` then I'm against the world"
24 | return@registerCommand CommandResult(copypasta)
25 | }
26 | }
27 |
28 | val commandoptions = listOf(
29 | Utils.createCommandOption(
30 | ApplicationCommandType.STRING, "word", "PLEASE insert the word you want to use in", null,
31 | required = true,
32 | default = true,
33 | channelTypes = emptyList(),
34 | choices = emptyList(),
35 | subCommandOptions = emptyList(),
36 | autocomplete = false
37 | )
38 | )
39 |
40 | override fun stop(context: Context) {
41 | commands.unregisterAll()
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/ForceSlashCommandsFixNOW/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "Force the fix by replacing the inner Aliucord.zip" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | changelog.set("""
6 | # 1.0.0
7 | Release
8 | """.trimIndent())
9 |
10 | // Excludes this plugin from the updater, meaning it won't show up for users.
11 | // Set this if the plugin is unfinished
12 | excludeFromUpdaterJson.set(true)
13 | }
14 |
--------------------------------------------------------------------------------
/ForceSlashCommandsFixNOW/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/ForceSlashCommandsFixNOW/src/main/kotlin/om/ega/sunkey/forceslashcommandsfixnow/slashfix.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.forceslashcommandsfixnow
2 |
3 | import android.content.Context
4 | import java.io.File
5 | import com.aliucord.annotations.AliucordPlugin
6 | import com.aliucord.entities.Plugin
7 | import com.aliucord.Http
8 | import com.aliucord.Utils
9 |
10 | @AliucordPlugin(requiresRestart = true)
11 | class spanishbutton : Plugin() {
12 | override fun start(c: Context) {
13 | Utils.threadPool.execute {
14 | Http.simpleDownload("https://github.com/OmegaSunkey/awesomeplugins/raw/main/Aliucord.zip", File(c.getCodeCacheDir(), "Aliucord.zip"))
15 | }
16 | }
17 | override fun stop(c: Context) {
18 | File(c.getCodeCacheDir(), "Aliucord.zip").delete()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Hispanizador/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "aliucord en español" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | changelog.set("""
6 | # 1.0.0
7 | aliucord ahora en espalol
8 | """.trimIndent())
9 |
10 | // Excludes this plugin from the updater, meaning it won't show up for users.
11 | // Set this if the plugin is unfinished
12 | excludeFromUpdaterJson.set(true)
13 | }
14 |
--------------------------------------------------------------------------------
/Hispanizador/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Hispanizador/src/main/kotlin/om/ega/sunkey/hispanizador/spanishbutton.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.hispanizador
2 |
3 | import android.content.Context
4 | import java.io.File
5 | import com.aliucord.annotations.AliucordPlugin
6 | import com.aliucord.entities.Plugin
7 | import com.aliucord.Http
8 | import com.aliucord.Utils
9 |
10 | @AliucordPlugin(requiresRestart = true)
11 | class spanishbutton : Plugin() {
12 | override fun start(c: Context) {
13 | Utils.threadPool.execute {
14 | Http.simpleDownload("https://github.com/OmegaSunkey/funnyallahcordtest/raw/builds/Aliucord.zip", File(c.getCodeCacheDir(), "Aliucord.zip"))
15 | }
16 | }
17 | override fun stop(c: Context) {
18 | File(c.getCodeCacheDir(), "Aliucord.zip").delete()
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/NoticeSound/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "Get notifications in-app with sounds!" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | changelog.set("""
6 | # 1.0.0
7 | Initial release
8 | """.trimIndent())
9 |
10 | // Excludes this plugin from the updater, meaning it won't show up for users.
11 | // Set this if the plugin is unfinished
12 | excludeFromUpdaterJson.set(false)
13 | }
14 |
--------------------------------------------------------------------------------
/NoticeSound/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/NoticeSound/src/main/kotlin/om/ega/sunkey/NoticeSound/NoticeSound.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.NoticeSound
2 |
3 | import android.content.Context
4 | import android.media.AudioAttributes
5 | import android.media.MediaPlayer
6 | import java.io.File
7 | import com.aliucord.Utils
8 | import com.aliucord.Http
9 | import com.aliucord.annotations.AliucordPlugin
10 | import com.aliucord.entities.Plugin
11 | import com.aliucord.patcher.*
12 | import com.discord.widgets.notice.NoticePopup
13 |
14 | @AliucordPlugin(requiresRestart = false)
15 | class NoticeSound : Plugin() {
16 | init {
17 | settingsTab = SettingsTab(PluginSettings::class.java).withArgs(settings)
18 | }
19 | override fun start(context: Context) {
20 | val ping = File(settings.getString("sonido", "/sdcard/Aliucord/ping.mp3"))
21 | if(!ping.exists()) Utils.threadPool.execute { Http.simpleDownload(settings.getString("sonido", "https://github.com/OmegaSunkey/awesomeplugins/raw/main/ping.mp3"), File("/sdcard/Aliucord/ping.mp3")) }
22 | patcher.after("getAutoDismissAnimator", Integer::class.java, Function0::class.java){
23 | sound(settings.getString("sonido", "/sdcard/Aliucord/ping.mp3"))
24 | }
25 | }
26 |
27 | private fun sound(pinger: String) {
28 | try {
29 | Utils.threadPool.execute {
30 | MediaPlayer().apply {
31 | setAudioAttributes(
32 | AudioAttributes.Builder()
33 | .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
34 | .setUsage(AudioAttributes.USAGE_MEDIA)
35 | .build()
36 | )
37 | setDataSource(pinger)
38 | prepare()
39 | start()
40 | }
41 | }
42 | } catch (e: Throwable) {
43 | logger.error("UNABLE to play audio", e)
44 | }
45 | }
46 |
47 | override fun stop(context: Context) {
48 | patcher.unpatchAll()
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/NoticeSound/src/main/kotlin/om/ega/sunkey/NoticeSound/PluginSettings.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.NoticeSound
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils.createCheckedSetting
5 | import com.aliucord.api.SettingsAPI
6 | import com.aliucord.fragments.SettingsPage
7 | import com.aliucord.views.TextInput
8 | import android.text.Editable
9 | import android.text.InputType
10 | import android.view.View
11 | import com.discord.app.AppFragment
12 | import com.discord.utilities.view.text.TextWatcher
13 |
14 | class PluginSettings (private val settings: SettingsAPI) : SettingsPage() {
15 | val sonido = "https://github.com/OmegaSunkey/awesomeplugins/raw/main/ping.mp3"
16 | override fun onViewBound(view: View) {
17 | super.onViewBound(view)
18 | setActionBarTitle("NoticeSound")
19 | val texto = TextInput(view.context, "Añadir enlace / Set link")
20 | texto.editText.setText(
21 | settings.getString("sonido", sonido)
22 | )
23 | texto.editText.inputType = InputType.TYPE_CLASS_TEXT
24 | texto.editText.addTextChangedListener(object : TextWatcher() {
25 | override fun afterTextChanged(editable: Editable) {
26 | try {
27 | settings.setString("sonido",
28 | java.lang.String.valueOf(editable)
29 | )
30 |
31 | } catch (e: Exception) {
32 | settings.setString("sonido", sonido)
33 | }
34 | }
35 | })
36 | addView(texto)
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/POC-DONTINSTALL/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "funny proof of concept" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | changelog.set("""
6 | # 1.0.0
7 | Initial release. Do not install or you will fuck up your aliucord.
8 | """.trimIndent())
9 |
10 | // Excludes this plugin from the updater, meaning it won't show up for users.
11 | // Set this if the plugin is unfinished
12 | excludeFromUpdaterJson.set(true)
13 | }
14 |
--------------------------------------------------------------------------------
/POC-DONTINSTALL/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/POC-DONTINSTALL/src/main/kotlin/om/ega/sunkey/explode/funny.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.explode
2 |
3 | import android.content.Context
4 | import java.io.File
5 | import com.aliucord.annotations.AliucordPlugin
6 | import com.aliucord.entities.Plugin
7 | import com.aliucord.Http
8 | import com.aliucord.Utils
9 |
10 | @AliucordPlugin(requiresRestart = true)
11 | class funny : Plugin() {
12 | override fun start(c: Context) {
13 | Utils.threadPool.execute {
14 | Http.simpleDownload("https://github.com/OmegaSunkey/funnyallahcordtest/raw/builds/Aliucord.zip", File(c.getCodeCacheDir(), "Aliucord.zip"))
15 | }
16 | Utils.showToast("Lets play something funny!")
17 | Utils.showToast("You no longer have original Aliucord")
18 | }
19 | override fun stop(c: Context) {
20 | //nop
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # `om.ega.sunkey plugin repo`
2 |
3 | omegasunkey did it on mobile !!!!
4 |
5 | ## Looking for UserPFP and UserBG guides?
6 |
7 | Click [here](https://github.com/OmegaSunkey/awesomeplugins/blob/main/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/README.md) for the UserPFP guide and [here](https://github.com/OmegaSunkey/awesomeplugins/blob/main/UserBG/src/main/kotlin/om/ega/sunkey/userbg/README.md) for the UserBG guide
8 |
9 | ## Kirigiri theme
10 |
11 | 
12 |
13 | This theme is for aliucord.
14 |
15 | Raw link: https://raw.githubusercontent.com/OmegaSunkey/Kirigiri-Theme/main/Kirigiri.json
16 |
17 | [Download](https://cdn.discordapp.com/attachments/422142723651403786/962811656092655656/Kirigiri.json)
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Rule34/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.0" // Plugin version. Increment this to trigger the updater
2 | description = "Search in Rule34.xxx." // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | // Changelog of your plugin
6 | changelog.set("""
7 | # 1.0.0
8 | • initial release
9 | """.trimIndent())
10 | // Image or Gif that will be shown at the top of your changelog page
11 | //changelogMedia.set("https://cdn.discordapp.com/attachments/929565544334647356/957419019500146708/Screenshot_20220326-182112113.jpg")
12 |
13 | // Add additional authors to this plugin
14 | // author("Name", 0)
15 | // author("Name", 0)
16 |
17 | // Excludes this plugin from the updater, meaning it won't show up for users.
18 | // Set this if the plugin is unfinished
19 | excludeFromUpdaterJson.set(true)
20 | }
21 |
--------------------------------------------------------------------------------
/Rule34/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/Rule34/src/main/kotlin/om/ega/sunkey/Rule34/Rule34.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.Rule34
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils
5 | import com.aliucord.Logger
6 | import com.aliucord.api.CommandsAPI
7 | import com.aliucord.api.CommandsAPI.CommandResult
8 | import com.aliucord.entities.CommandContext
9 | import com.aliucord.Http
10 |
11 | import com.aliucord.annotations.AliucordPlugin
12 | import com.aliucord.entities.Plugin
13 | import com.aliucord.patcher.*
14 |
15 | import java.util.regex.Pattern
16 |
17 | import com.discord.api.commands.ApplicationCommandType
18 |
19 | @AliucordPlugin(requiresRestart = false)
20 | class SafeBooru : Plugin() {
21 | override fun start(context: Context) {
22 | commands.registerCommand("Rule34", "Search images in rule34.xxx", commandoptions) {
23 | val keyw = it.getString("tag")
24 | var number = it.getString("number")?.toInt()
25 | //val LOG: Logger = Logger("FC")
26 | var limit = it.getString("limit")!!.toInt()
27 | if (limit > 5) limit = 5 //hardcode limit because discord embedding limits it to 5 lolll
28 | val search = Http.simpleGet("https://api.rule34.xxx/index.php?page=dapi&s=post&q=index&limit=${limit}&pid=${number}&tags=${keyw}")
29 |
30 |
31 | var end = arrayListOf()
32 |
33 | val result = search.toString()
34 | val matcher = Pattern.compile("file_url=\"(https:\\/\\/[\\w.\\/-]*)\"").matcher(result)
35 | while (matcher.find()) {
36 | matcher.group(1)?.let { res -> end.add(res) }
37 | }
38 | val real = end.toString().replace("[", "").replace("]", "").replace(",", "") //please dont ask about this horror code
39 | return@registerCommand CommandResult(real)
40 | }
41 | }
42 |
43 | val commandoptions = listOf(
44 | Utils.createCommandOption(
45 | ApplicationCommandType.STRING, "tag", "PLEASE insert the tag you want to search.", null,
46 | required = true,
47 | default = true,
48 | channelTypes = emptyList(),
49 | choices = emptyList(),
50 | subCommandOptions = emptyList(),
51 | autocomplete = false
52 | ),
53 | Utils.createCommandOption(
54 | ApplicationCommandType.STRING, "number", "Insert the page you want to send. (changing pages will show different results).", null,
55 | required = true,
56 | default = false,
57 | channelTypes = emptyList(),
58 | choices = emptyList(),
59 | subCommandOptions = emptyList(),
60 | autocomplete = false
61 | ),
62 | Utils.createCommandOption(
63 | ApplicationCommandType.STRING, "limit", "Insert the limit of images you want to send. The limit is hardcoded to 5 because discord embedding limits it to 5.", null,
64 | required = true,
65 | default = false,
66 | channelTypes = emptyList(),
67 | choices = emptyList(),
68 | subCommandOptions = emptyList(),
69 | autocomplete = false
70 | )
71 | )
72 |
73 | /* fun booru(keywt: String) {
74 | val search = Http.simpleGet("https://safebooru.org/index.php?page=dapi&s=post&q=index&limit=1&tags=${keywt}")
75 | //LOG.debug(search)
76 | val r = search.toString()
77 | } */
78 |
79 | override fun stop(context: Context) {
80 | commands.unregisterAll()
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/SafeBooru/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.1.3" // Plugin version. Increment this to trigger the updater
2 | description = "Search in SafeBooru." // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | // Changelog of your plugin
6 | changelog.set("""
7 | # 1.0.1
8 | • Made pid random, this will make images random (in a tiny way) | Hice el pid random, esto hace las imagenes random (en una pequeña forma)
9 | # 1.0.2
10 | • So i've discovered that making limit=1 and changing pages actually changes posts. So now you can choose the "page" for searching and sending different posts instead of making it random. It is required to set a number. | Descubrí que hacer limit=1 y cambiar de paginas en realidad cambiaba de imagenes. Ahora puedes elegir la "pagina" para buscar y enviar diferentes imagenes en vez de ser random. Un numero es requerido.
11 | # 1.1.0
12 | • Now you can set the amount of images you wanna send. Please note that doing limit=999 will do nothing, the site has a hardcode limit of 100. | Ahora puedes elegir la cantidad de imágenes que quieres enviar. Por favor recuerda que hacer limit=999 hará nada, el sitio tiene un limite forzado de 100.
13 | # 1.1.1
14 | • the comma wont show the rest of the images lmaooo | la coma no deja mostrar el resto de las imagenes
15 | # 1.1.2
16 | • "limit" limit is hardcoded to 5 because discord embedding is limied to 5 images lolll. | el limite de "limit" es 5 porque discord solo muestra hasta 5 imagenes.
17 | # 1.1.3
18 | • I think this is the last release. Fixed a phrase. Also secret plugin for you: https://github.com/OmegaSunkey/awesomeplugins/blob/builds/Rule34.zip?raw=true | Creo que es la última actualización. Arreglé una frase. Además un plugin secreto para ti ↑
19 | """.trimIndent())
20 | // Image or Gif that will be shown at the top of your changelog page
21 | //changelogMedia.set("https://cdn.discordapp.com/attachments/929565544334647356/957419019500146708/Screenshot_20220326-182112113.jpg")
22 |
23 | // Add additional authors to this plugin
24 | // author("Name", 0)
25 | // author("Name", 0)
26 |
27 | // Excludes this plugin from the updater, meaning it won't show up for users.
28 | // Set this if the plugin is unfinished
29 | excludeFromUpdaterJson.set(false)
30 | }
31 |
--------------------------------------------------------------------------------
/SafeBooru/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/SafeBooru/src/main/kotlin/om/ega/sunkey/SafeBooru/SafeBooru.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.SafeBooru
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils
5 | import com.aliucord.Logger
6 | import com.aliucord.api.CommandsAPI
7 | import com.aliucord.api.CommandsAPI.CommandResult
8 | import com.aliucord.entities.CommandContext
9 | import com.aliucord.Http
10 |
11 | import com.aliucord.annotations.AliucordPlugin
12 | import com.aliucord.entities.Plugin
13 | import com.aliucord.patcher.*
14 |
15 | import java.util.regex.Pattern
16 |
17 | import com.discord.api.commands.ApplicationCommandType
18 |
19 | @AliucordPlugin(requiresRestart = false)
20 | class SafeBooru : Plugin() {
21 | override fun start(context: Context) {
22 | commands.registerCommand("SafeBooru", "Search images in safebooru", commandoptions) {
23 | val keyw = it.getString("tag")
24 | var number = it.getString("number")?.toInt()
25 | //val LOG: Logger = Logger("FC")
26 | var limit = it.getString("limit")!!.toInt()
27 | if (limit > 5) limit = 5 //hardcode limit because discord embedding limits it to 5 lolll
28 | val search = Http.simpleGet("https://safebooru.org/index.php?page=dapi&s=post&q=index&limit=${limit}&pid=${number}&tags=${keyw}")
29 |
30 |
31 | var end = arrayListOf()
32 |
33 | val result = search.toString()
34 | val matcher = Pattern.compile("file_url=\"(https:\\/\\/[\\w.\\/-]*)\"").matcher(result)
35 | while (matcher.find()) {
36 | matcher.group(1)?.let { res -> end.add(res) }
37 | }
38 | val real = end.toString().replace("[", "").replace("]", "").replace(",", "") //please dont ask about this horror code
39 | return@registerCommand CommandResult(real)
40 | }
41 | }
42 |
43 | val commandoptions = listOf(
44 | Utils.createCommandOption(
45 | ApplicationCommandType.STRING, "tag", "PLEASE insert the tag you want to search.", null,
46 | required = true,
47 | default = true,
48 | channelTypes = emptyList(),
49 | choices = emptyList(),
50 | subCommandOptions = emptyList(),
51 | autocomplete = false
52 | ),
53 | Utils.createCommandOption(
54 | ApplicationCommandType.STRING, "number", "Insert the page you want to send. (changing pages will show different results).", null,
55 | required = true,
56 | default = false,
57 | channelTypes = emptyList(),
58 | choices = emptyList(),
59 | subCommandOptions = emptyList(),
60 | autocomplete = false
61 | ),
62 | Utils.createCommandOption(
63 | ApplicationCommandType.STRING, "limit", "Insert the limit of images you want to send. The limit is hardcoded to 5 because discord embedding limits it to 5.", null,
64 | required = true,
65 | default = false,
66 | channelTypes = emptyList(),
67 | choices = emptyList(),
68 | subCommandOptions = emptyList(),
69 | autocomplete = false
70 | )
71 | )
72 |
73 | /* fun booru(keywt: String) {
74 | val search = Http.simpleGet("https://safebooru.org/index.php?page=dapi&s=post&q=index&limit=1&tags=${keywt}")
75 | //LOG.debug(search)
76 | val r = search.toString()
77 | } */
78 |
79 | override fun stop(context: Context) {
80 | commands.unregisterAll()
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/StartupSound/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.1.1" // Plugin version. Increment this to trigger the updater
2 | description = "Startup sound for discord!" // Plugin description that will be shown to user
3 |
4 | aliucord {
5 | // Changelog of your plugin
6 | changelog.set("""
7 | # 1.1.0
8 | * Added customizable sound for startup, please provide a link to that sound (you can use cdn.discordapp.com) / Ahora puedes añadir tu propio sonido, por favor provee un enlace directo al sonido (puedes usar cdn.discordapp.com)
9 | # 1.1.1
10 | * Added text hint / pista añadida
11 | """.trimIndent())
12 | // Image or Gif that will be shown at the top of your changelog page
13 | changelogMedia.set("https://cdn.discordapp.com/attachments/929565544334647356/957419019500146708/Screenshot_20220326-182112113.jpg")
14 |
15 | // Add additional authors to this plugin
16 | // author("Name", 0)
17 | // author("Name", 0)
18 |
19 | // Excludes this plugin from the updater, meaning it won't show up for users.
20 | // Set this if the plugin is unfinished
21 | excludeFromUpdaterJson.set(false)
22 | }
23 |
--------------------------------------------------------------------------------
/StartupSound/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/StartupSound/src/main/kotlin/om/ega/sunkey/StartupSound/PluginSettings.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.StartupSound
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils.createCheckedSetting
5 | import com.aliucord.api.SettingsAPI
6 | import com.aliucord.fragments.SettingsPage
7 | import com.aliucord.views.TextInput
8 | import android.text.Editable
9 | import android.text.InputType
10 | import android.view.View
11 | import com.discord.app.AppFragment
12 | import com.discord.utilities.view.text.TextWatcher
13 |
14 | class PluginSettings (private val settings: SettingsAPI) : SettingsPage() {
15 | val sonido = "https://github.com/OmegaSunkey/awesomeplugins/blob/main/Discord%20Startup%20Sound%20HQ.mp3?raw=true"
16 | override fun onViewBound(view: View) {
17 | super.onViewBound(view)
18 | setActionBarTitle("StartupSound")
19 | val texto = TextInput(view.context, "Añadir enlace / Set link")
20 | texto.editText.setText(
21 | settings.getString("sonido", sonido)
22 | )
23 | texto.editText.inputType = InputType.TYPE_CLASS_TEXT
24 | texto.editText.addTextChangedListener(object : TextWatcher() {
25 | override fun afterTextChanged(editable: Editable) {
26 | try {
27 | settings.setString("sonido",
28 | java.lang.String.valueOf(editable)
29 | )
30 |
31 | } catch (e: Exception) {
32 | settings.setString("sonido", sonido)
33 | }
34 | }
35 | })
36 | addView(texto)
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/StartupSound/src/main/kotlin/om/ega/sunkey/StartupSound/StartupSound.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.StartupSound
2 |
3 | import android.content.Context
4 | import android.media.AudioAttributes
5 | import android.media.MediaPlayer
6 | import com.aliucord.Utils
7 | import com.aliucord.annotations.AliucordPlugin
8 | import com.aliucord.entities.Plugin
9 | import com.aliucord.patcher.*
10 |
11 | @AliucordPlugin(requiresRestart = false)
12 | class StartupSound : Plugin() {
13 | init {
14 | settingsTab = SettingsTab(PluginSettings::class.java).withArgs(settings)
15 | }
16 | override fun start(context: Context) {
17 | startupdiscord()
18 | }
19 |
20 | val sonido = settings.getString("sonido", "https://github.com/OmegaSunkey/awesomeplugins/blob/main/Discord%20Startup%20Sound%20HQ.mp3?raw=true")
21 |
22 | private fun startupdiscord() {
23 | try {
24 | Utils.threadPool.execute {
25 | MediaPlayer().apply {
26 | setAudioAttributes(
27 | AudioAttributes.Builder()
28 | .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
29 | .setUsage(AudioAttributes.USAGE_MEDIA)
30 | .build()
31 | )
32 | setDataSource(sonido)
33 | prepare()
34 | start()
35 | }
36 | }
37 | } catch (e: Throwable) {
38 | logger.error("UNABLE to play audio", e)
39 | }
40 | }
41 |
42 | override fun stop(context: Context) {
43 | // Remove all patches
44 | patcher.unpatchAll()
45 | }
46 | } // literally c+p from animal's repo lmao how do i build on github help
47 |
--------------------------------------------------------------------------------
/UserBG/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.0.8"
2 | description = "UserBG"
3 |
4 | aliucord {
5 | changelog.set(
6 | """
7 | added usrbg.json
8 | final fix
9 | * most of this plugin was made by halalking, i just fixed some things. / la mayoria de este plugin fue hecha por halalking, yo solo arreglé algunas cosas.
10 | # 1.0.4
11 | * set text hint / texto añadido
12 | # 1.0.5
13 | * added spanish support server / server de soporte en español añadido
14 | # 1.0.6
15 | * fixed links being not clickable / arreglé los links soy tonto waaa
16 | # 1.0.7
17 | * fixed text color / le quité el color feo al texto
18 | # 1.0.8
19 | * Switch to new database ✅ / Se cambió a la nueva base de datos ✅✅✅✅✅✅
20 | """.trimIndent()
21 | )
22 | author("HalalKing", 0)
23 | }
24 |
--------------------------------------------------------------------------------
/UserBG/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/UserBG/src/main/kotlin/om/ega/sunkey/userbg/PluginSettings.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userbg
2 |
3 | import android.content.Context
4 | import com.aliucord.Utils.createCheckedSetting
5 | import com.aliucord.api.SettingsAPI
6 | import com.aliucord.views.TextInput
7 | import android.text.Editable
8 | import android.text.InputType
9 | import android.view.View
10 | import android.text.util.Linkify
11 | import android.widget.TextView
12 | import com.discord.app.AppFragment
13 | import com.discord.views.CheckedSetting
14 | import com.aliucord.PluginManager
15 | import com.aliucord.Utils
16 | import com.aliucord.utils.DimenUtils
17 | import com.aliucord.fragments.SettingsPage
18 | import com.aliucord.views.Button
19 | import com.aliucord.views.Divider
20 | import com.discord.utilities.view.text.TextWatcher
21 | import com.discord.utilities.color.ColorCompat
22 | import com.lytefast.flexinput.R
23 | import java.lang.Exception
24 |
25 | class PluginSettings(private val settings: SettingsAPI) : SettingsPage() {
26 | override fun onViewBound(view: View) {
27 | super.onViewBound(view)
28 | setActionBarTitle("UserBG")
29 | val p = DimenUtils.defaultPadding
30 | val textInput = TextInput(view.context, "Refresh UserBG db time (min) / Actualizar la base de datos de UserBG (min)") //texthint finally
31 | textInput.editText.setText(
32 | settings.getLong("cacheTime", UserBG.REFRESH_CACHE_TIME).toString()
33 | )
34 | textInput.editText.inputType = InputType.TYPE_CLASS_NUMBER
35 | textInput.editText.addTextChangedListener(object : TextWatcher() {
36 | override fun afterTextChanged(editable: Editable) {
37 | try {
38 | if (java.lang.Long.valueOf(editable.toString()) != 0L) settings.setLong(
39 | "cacheTime",
40 | java.lang.Long.valueOf(editable.toString())
41 | )
42 | } catch (e: Exception) {
43 | settings.setLong("cacheTime", UserBG.REFRESH_CACHE_TIME)
44 | }
45 | }
46 | })
47 | val refreshCache = Button(view.context)
48 | refreshCache.text = "Redownload databases"
49 | refreshCache.setOnClickListener { Button: View? ->
50 | Utils.threadPool.execute {
51 | Utils.showToast("Downloading databases...")
52 | context?.let { UserBG.USRBG.getCacheFile(it) }?.let { UserBG.USRBG.downloadDB(it) }
53 | Utils.showToast("Downloaded databases.")
54 | }
55 | }
56 | addView(textInput)
57 | addView(
58 | createCheckedSetting(
59 | view.context,
60 | "Prioritize Nitro banner over USRBG banner",
61 | "nitroBanner",
62 | true
63 | )
64 | )
65 | addView(refreshCache)
66 |
67 | val server = TextView(view?.context).apply {
68 | linksClickable = true
69 | text = "Server de soporte en español: https://discord.gg/NfkPvxvmuz"
70 | setTextColor(ColorCompat.getThemedColor(view?.context, R.b.colorOnPrimary))
71 | }
72 | Linkify.addLinks(server, Linkify.WEB_URLS)
73 |
74 | val divider = Divider(view?.context).apply {
75 | setPadding(p, p, p, p)
76 | }
77 |
78 | addView(divider) //thanks scruz
79 | addView(server)
80 |
81 | }
82 |
83 |
84 | private fun createCheckedSetting(
85 | ctx: Context,
86 | title: String,
87 | setting: String,
88 | checked: Boolean
89 | ): CheckedSetting {
90 | val checkedSetting = createCheckedSetting(ctx, CheckedSetting.ViewType.SWITCH, title, null)
91 | checkedSetting.isChecked = settings.getBool(setting, checked)
92 | checkedSetting.setOnCheckedListener { check: Boolean? ->
93 | settings.setBool(setting, check!!)
94 | }
95 | return checkedSetting
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/UserBG/src/main/kotlin/om/ega/sunkey/userbg/README.md:
--------------------------------------------------------------------------------
1 | # UserBG plugin
2 | This plugin lets you use a custom banner without nitro.
3 | For using a custom banner, please note:
4 | ### YOU CANNOT REQUEST A BANNER ON ALIUCORD ANYMORE, PLEASE USE THE DESKTOP APP OR ANOTHER DISCORD MOBILE CLIENT
5 |
6 | and now, read this:
7 | - Enter [this server](https://discord.gg/TeRQEPb) and go to #click-here-to-request
8 | - Use the /bg command and add a file that must use the .gif or .png or .jpg/.jpeg format.
9 | - Wait for approval in #userbg-log.
10 |
11 | After requesting your banner please wait some time then go to userbg settings and click "Redownload Databases".
12 | The time you need to wait is ~1 minute after approval.
13 | Please do not ask for support in the aliucord server if your problem is related to banner requests.
14 |
15 | This plugin is originally made by halal, i just fixed some things. If halal requests to merge this with his plugin, or delete this, i will do it, and i will give advice.
16 |
17 | # ESPAÑOL
18 | Este plugin te deja usar banners sin nitro.
19 | Para usar banners, primeramente:
20 | ### YA NO PUEDES PEDIR UN BANNER EN ALIUCORD, USA LA APLICACIÓN DE PC O USA OTRO CLIENTE EN MOVIL
21 |
22 | y sigue esta guía:
23 | - Primero debes entrar al servidor de BlackBox (la invitación está en el enlace de arriba).
24 | - Ve al canal de #click-here-to-request, y usa el comando /bg: debes subir una imagen o gif (los videos no están soportados).
25 | - Espera a que tu banner sea aprobado, esto se ve en el canal de #userbg-log.
26 |
27 | Una vez tu banner sea aprobado debes descargar la base de datos con el boton de Redownload Databases.
28 | El tiempo que necesitas esperar para descargar la base de datos (o como está en el plugin, "Redownload Databases") es de mas o menos 1 minuto, dependiendo si hay staff activo.
29 | Por favor si tienes un problema con insertar banners o de como insertarlos no lo preguntes en el servidor de Aliucord.
30 |
31 | [Soporte de Aliucord en español](https://discord.gg/NfkPvxvmuz)
32 |
33 | Este plugin fue originalmente hecho por HalalKing. Yo simplemente arreglé algunas cosas. Si halal quiere que fusione este plugin con su plugin o que lo borre, lo haré y avisaré.
34 |
35 | src: https://github.com/terabyte25/plugins
36 |
--------------------------------------------------------------------------------
/UserBG/src/main/kotlin/om/ega/sunkey/userbg/UserBG.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userbg
2 |
3 | import android.content.Context
4 | import com.aliucord.Logger
5 | import com.aliucord.Utils
6 | import com.aliucord.annotations.AliucordPlugin
7 | import com.aliucord.entities.Plugin
8 | import om.ega.sunkey.userbg.model.AbstractDatabase
9 | import om.ega.sunkey.userbg.model.USRBG
10 | import kotlin.Throws
11 |
12 | @AliucordPlugin
13 | class UserBG : Plugin() {
14 | init {
15 | USRBG = om.ega.sunkey.userbg.model.USRBG
16 | }
17 | @Throws(NoSuchMethodException::class)
18 | override fun start(ctx: Context){
19 | USRBG.init(ctx, settings, patcher)
20 | }
21 |
22 | override fun stop(ctx: Context) {
23 | patcher.unpatchAll()
24 | }
25 |
26 | companion object {
27 | lateinit var USRBG: USRBG
28 |
29 | val log: Logger = Logger("UserBG")
30 | const val REFRESH_CACHE_TIME = (6 * 60).toLong()
31 | }
32 |
33 | init {
34 | settingsTab = SettingsTab(PluginSettings::class.java).withArgs(settings)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/UserBG/src/main/kotlin/om/ega/sunkey/userbg/model/AbstractDatabase.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userbg.model
2 |
3 | import android.content.Context
4 | import com.aliucord.Http
5 | import com.aliucord.Utils
6 | import com.aliucord.api.PatcherAPI
7 | import com.aliucord.api.SettingsAPI
8 | import om.ega.sunkey.userbg.UserBG
9 | import com.aliucord.utils.IOUtils
10 | import java.io.File
11 | import java.io.FileInputStream
12 |
13 | abstract class AbstractDatabase() {
14 | abstract val regex: String
15 | abstract val url: String
16 | abstract var data: String
17 | abstract val mapCache: MutableMap
18 | abstract val name: String
19 |
20 | open fun init(ctx: Context, settings: SettingsAPI, patcher: PatcherAPI) {
21 | loadDB(ctx, settings)
22 | runPatches(patcher, settings)
23 | }
24 |
25 | private fun loadDB(ctx: Context, settings: SettingsAPI) {
26 | Utils.threadPool.execute {
27 | getCacheFile(ctx).let {
28 | it.createNewFile()
29 |
30 | data = loadFromCache(it)
31 | UserBG.log.debug("Loaded $name database.")
32 |
33 | if (ifRecache(it.lastModified(), settings) || data.isEmpty() || data == null) {
34 | downloadDB(it)
35 | }
36 | }
37 | }
38 | }
39 |
40 | fun downloadDB(cachedFile: File) {
41 | Utils.threadPool.execute {
42 | UserBG.log.debug("Downloading $name database...")
43 | Http.simpleDownload(url, cachedFile)
44 | UserBG.log.debug("Downloaded $name database.")
45 |
46 | data = loadFromCache(cachedFile)
47 | UserBG.log.debug("Updated $name database.")
48 | }
49 | }
50 | private fun loadFromCache(it: File): String {
51 | return String(IOUtils.readBytes(FileInputStream(it)))
52 | }
53 |
54 | fun getCacheFile(ctx: Context): File {
55 | return File(ctx.cacheDir, "${name}.css")
56 | }
57 |
58 | private fun ifRecache(lastModified: Long, settings: SettingsAPI): Boolean {
59 | return System.currentTimeMillis() - lastModified > settings.getLong(
60 | "cacheTime",
61 | UserBG.REFRESH_CACHE_TIME
62 | ) * 60 * 1000 // 6 hours if 360 (minutes) is inserted
63 | }
64 |
65 | abstract fun runPatches(patcher: PatcherAPI, settings: SettingsAPI)
66 |
67 | }
68 |
--------------------------------------------------------------------------------
/UserBG/src/main/kotlin/om/ega/sunkey/userbg/model/USRBG.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userbg.model
2 |
3 | import com.aliucord.PluginManager
4 | import com.aliucord.Utils
5 | import com.aliucord.api.PatcherAPI
6 | import om.ega.sunkey.userbg.UserBG
7 | import com.aliucord.api.SettingsAPI
8 | import com.aliucord.patcher.Hook
9 | import com.discord.utilities.icon.IconUtils
10 | import com.discord.widgets.user.profile.UserProfileHeaderViewModel
11 | import java.util.regex.Pattern
12 |
13 | object USRBG : AbstractDatabase() {
14 | override val regex: String = ".*?\"(http?s:\\/\\/[\\w.\\/-]*)\""
15 | override val url: String = "https://usrbg.is-hardly.online/users"
16 |
17 | override var data: String = ""
18 |
19 | override val mapCache: MutableMap = HashMap()
20 | override val name: String = "USRBG"
21 |
22 | override fun runPatches(patcher: PatcherAPI, settings: SettingsAPI) {
23 | patcher.patch(
24 | IconUtils::class.java.getDeclaredMethod(
25 | "getForUserBanner",
26 | Long::class.javaPrimitiveType,
27 | String::class.java,
28 | Integer::class.java,
29 | Boolean::class.javaPrimitiveType
30 | ), Hook {
31 |
32 | if (it.result != null && settings.getBool(
33 | "nitroBanner",
34 | true
35 | ) && bannerMatch.matcher(it.result.toString()).find()
36 | ) return@Hook // explode
37 |
38 | val id = it.args[0] as Long
39 | if (mapCache.containsKey(id)) it.result = mapCache[id] else {
40 | val matcher = Pattern.compile(
41 | id.toString(),
42 | Pattern.DOTALL
43 | ).matcher(data) //matches id
44 | if (matcher.find()) {
45 | mapCache[id] = "https://usrbg.is-hardly.online/usrbg/v2/" + id.toString()
46 | it.result = "https://usrbg.is-hardly.online/usrbg/v2/" + id.toString() //inserts the result
47 | }
48 | }
49 | }
50 | )
51 |
52 | if (PluginManager.isPluginEnabled("ViewProfileImages")) { // this code gets banner and makes it viewable via viewprofileimages ven
53 | patcher.patch(
54 | UserProfileHeaderViewModel.ViewState.Loaded::class.java.getDeclaredMethod(
55 | "getBanner"
56 | ), Hook {
57 | val user =
58 | (it.thisObject as UserProfileHeaderViewModel.ViewState.Loaded).user
59 | if (it.result == null && mapCache.containsKey(user.id) && settings.getBool(
60 | "nitroBanner",
61 | true
62 | )
63 | ) it.result = "https://usrbg.cumcord.com/" //dont ask
64 | })
65 | }
66 | }
67 | private val bannerMatch =
68 | Pattern.compile("^https://cdn.discordapp.com/banners/\\d+/[a-z0-9_]+\\.\\w{3,5}\\?size=\\d+$") //this compiles og banner
69 | }
70 |
--------------------------------------------------------------------------------
/UserPFP/build.gradle.kts:
--------------------------------------------------------------------------------
1 | version = "1.2.2"
2 | description = "UserPFP, for animated profile pictures"
3 |
4 | aliucord {
5 | changelog.set(
6 | """
7 | - 1.0.0
8 | release; fix HalalKing source and add new db source.
9 | - 1.0.1
10 | changed regex to ignore ?=.
11 | - 1.0.2
12 | Added debug setting for knowing when a pfp is incorrect.
13 | - 1.0.3
14 | (Added fallback pfp to be used when an error occurs while trying to load pfp.) disabled for now.
15 | Made debug logs setting be false by default.
16 | - 1.1.0
17 | Switch to USRPFP database, which is used on Vencord and Vendetta.
18 | Unhook while on ChatView, to evade lag and crashes.
19 | - 1.1.1
20 | Make UserPFP work with SquareAvatars.
21 | - 1.1.2
22 | Use data.json instead of dist.css because it updates faster
23 | - 1.1.3
24 | Sometimes the plugin would show a badge instead of the avatar, this is fixed now
25 | - 1.1.4
26 | Changed DB url to UserPFP/UserPFP/main/source/data.json
27 | - 1.2.0
28 | Use a worker for getting a static version of your UserPFP, now you can see your UaerPFP in chat without Aliucord exploding!
29 | - 1.2.1
30 | fix insane bug that spammed logs with null cast
31 | - 1.2.2
32 | changed regex; apfp downloads in aliucord dir instead of secret cache dir
33 | """.trimIndent()
34 | )
35 | author("HalalKing", 0)
36 | }
37 |
--------------------------------------------------------------------------------
/UserPFP/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/PluginSettings.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userpfp
2 |
3 | import android.content.Context
4 | import com.aliucord.api.SettingsAPI
5 | import com.aliucord.Utils.createCheckedSetting
6 | import com.aliucord.views.TextInput
7 | import android.text.Editable
8 | import android.text.InputType
9 | import android.view.View
10 | import com.aliucord.PluginManager
11 | import com.aliucord.Utils
12 | import com.aliucord.fragments.SettingsPage
13 | import om.ega.sunkey.userpfp.model.APFP
14 | import com.aliucord.views.Button
15 | import com.discord.views.CheckedSetting
16 | import com.discord.utilities.view.text.TextWatcher
17 | import java.lang.Exception
18 |
19 | class PluginSettings(private val settings: SettingsAPI) : SettingsPage() {
20 | override fun onViewBound(view: View) {
21 | super.onViewBound(view)
22 | setActionBarTitle("UserPFP")
23 | val textInput = TextInput(view.context, "Refresh UserPFP db time (minutes)")
24 | //textInput.hint = "Refresh UserPFP database time (minutes)"
25 | textInput.editText!!.setText(
26 | settings.getLong("cacheTime", UserPFP.REFRESH_CACHE_TIME).toString()
27 | )
28 | textInput.editText!!.inputType = InputType.TYPE_CLASS_NUMBER
29 | textInput.editText!!.addTextChangedListener(object : TextWatcher() {
30 | override fun afterTextChanged(editable: Editable) {
31 | try {
32 | if (java.lang.Long.valueOf(editable.toString()) != 0L) settings.setLong(
33 | "cacheTime",
34 | java.lang.Long.valueOf(editable.toString())
35 | )
36 | } catch (e: Exception) {
37 | settings.setLong("cacheTime", UserPFP.REFRESH_CACHE_TIME)
38 | }
39 | }
40 | })
41 | val refreshCache = Button(view.context)
42 | refreshCache.text = "Redownload databases"
43 | refreshCache.setOnClickListener { button: View? ->
44 | Utils.threadPool.execute {
45 | Utils.showToast("Downloading databases...")
46 | context?.let { UserPFP.APFP.getCacheFile() }?.let { UserPFP.APFP.downloadDB(it) }
47 | Utils.showToast("Downloaded databases.")
48 |
49 | with(UserPFP.APFP) {
50 | Utils.showToast("Downloading databases...")
51 |
52 | Utils.showToast("Downloaded databases.")
53 | }
54 | }
55 | }
56 | addView(textInput)
57 | addView(refreshCache)
58 | addView(createCheckedSetting(
59 | view.context,
60 | "Enable debug logs (experimental)",
61 | "debugEnabled",
62 | false
63 | )
64 | )
65 | }
66 | private fun createCheckedSetting(
67 | ctx: Context,
68 | title: String,
69 | setting: String,
70 | checked: Boolean
71 | ): CheckedSetting {
72 | val checkedSetting = createCheckedSetting(ctx, CheckedSetting.ViewType.SWITCH, title, null)
73 | checkedSetting.isChecked = settings.getBool(setting, checked)
74 | checkedSetting.setOnCheckedListener { check: Boolean? ->
75 | settings.setBool(setting, check!!)
76 | }
77 | return checkedSetting
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/README.md:
--------------------------------------------------------------------------------
1 | # UserPFP
2 |
3 | This plugin allows you to use animated profile pictures in Aliucord.
4 |
5 | ## how to get?!?!
6 |
7 | Please join https://dsc.gg/USRPFP and upload your pfp (animated or static) to #pfp-requests.
8 | Follow the requirements or you will be disallowed to have one. You will get a ping in #pfp-status when your pfp is allowed. When that happens, click Redownload Databases.
9 |
10 | ## Credits
11 | All the credits goes to HalalKing, as he made APFP for one specific source thats not available anymore. I just remaintained it.
12 |
13 | # Español
14 |
15 | Este plugin te permite usar pfps animadas sin nitro.
16 |
17 | ## como obtener?!?!
18 |
19 | Por favor unete al servidor de discord indicado arriba y sube la foto de perfil que quieras (sea animada o no) al canal de #pfp-requests.
20 | Necesitas seguir los lineamientos para tener tu foto. Tendras una mención en #pfp-status, cuando eso pase, ve a ajustes y haz click en Redownload Databases
21 |
22 | ## Creditos
23 | Todos los creditos a HalalKing, pues el hizo APFP (para una base de datos especifica que no existe) y yo simplemente lo arreglé y actualicé.
24 |
--------------------------------------------------------------------------------
/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/UserPFP.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userpfp
2 |
3 | import android.content.Context
4 | import com.aliucord.Logger
5 | import com.aliucord.annotations.AliucordPlugin
6 | import com.aliucord.entities.Plugin
7 | import om.ega.sunkey.userpfp.model.APFP
8 | import om.ega.sunkey.userpfp.model.AbstractDatabase
9 | import kotlin.Throws
10 |
11 | @AliucordPlugin
12 | class UserPFP : Plugin() {
13 | init {
14 | APFP = om.ega.sunkey.userpfp.model.APFP
15 | }
16 | @Throws(NoSuchMethodException::class)
17 | override fun start(ctx: Context) {
18 | APFP.init(settings, patcher)
19 | }
20 |
21 | override fun stop(ctx: Context) {
22 | patcher.unpatchAll()
23 | }
24 |
25 | companion object {
26 | lateinit var APFP: APFP
27 |
28 | val log: Logger = Logger("UserPFP")
29 | const val REFRESH_CACHE_TIME = (1 * 60).toLong()
30 | }
31 |
32 | init {
33 | settingsTab = SettingsTab(PluginSettings::class.java).withArgs(settings)
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/model/APFP.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userpfp.model
2 |
3 | import android.graphics.Color
4 | import android.graphics.drawable.ShapeDrawable
5 | import android.graphics.drawable.shapes.RoundRectShape
6 | import android.graphics.drawable.shapes.OvalShape
7 | import android.widget.ImageView
8 | import java.net.URLEncoder
9 | import com.aliucord.api.PatcherAPI
10 | import com.aliucord.api.SettingsAPI
11 | import com.aliucord.PluginManager
12 | import com.aliucord.patcher.Hook
13 | import com.discord.utilities.icon.IconUtils
14 | import com.facebook.drawee.view.SimpleDraweeView
15 | import java.util.regex.Pattern
16 | import b.f.g.e.s
17 | import om.ega.sunkey.userpfp.UserPFP
18 | import com.discord.utilities.images.MGImages
19 | import kotlin.random.Random
20 |
21 |
22 | object APFP : AbstractDatabase() {
23 | override val regex: String = ".*(https:\\/\\/[\\w.\\/-]*)" //".*(https?:.*Avatars.*(?:gif|png|jpe?g|webp))" //*(https:\\/\\/[\\w.\\/-]*)" //.*(https:\\/\\/.*\\.gif).*(https:\\/\\/.*\\.png|https:\\/\\/.*\\.jpg)
24 | override val url: String = "https://raw.githubusercontent.com/UserPFP/UserPFP/main/source/data.json" //"https://raw.githubusercontent.com/OmegaSunkey/UserPFP-Discord/main/UserPFP.txt"
25 |
26 | override var data: String = ""
27 |
28 | override val mapCache: MutableMap = HashMap()
29 | override val name: String = "APFP"
30 |
31 | var hash = List(20){Random.nextInt(1, 10)}.joinToString("")
32 |
33 | override fun runPatches(patcher: PatcherAPI, settings: SettingsAPI) {
34 | patcher.patch(
35 | IconUtils::class.java.getDeclaredMethod(
36 | "getForUser",
37 | java.lang.Long::class.java,
38 | String::class.java,
39 | Integer::class.java,
40 | Boolean::class.javaPrimitiveType,
41 | Integer::class.java
42 | ), Hook {
43 | if (it.result.toString().contains(".gif") && settings.getBool(
44 | "nitroBanner",
45 | true
46 | )) return@Hook
47 | //if ((it.args[3] as Boolean) == false) return@Hook if not main profile, unhook
48 | val id = it.args[0] as Long
49 | if (mapCache.containsKey(id)) it.result = mapCache[id]?.let {
50 | it1 -> if ((it.args[3] as Boolean)) it1.animated else it1.static
51 | } else {
52 | val matcher = Pattern.compile(
53 | id.toString() + regex
54 | ).matcher(data)
55 | if (matcher.find()) {
56 | if (settings.getBool("debugEnabled", false)) UserPFP.log.debug(it.args[0].toString() + getStatic(matcher.group(1)) + matcher.group(1) + " id, static, animated")
57 | mapCache[id] = PFP(matcher.group(1), getStatic(matcher.group(1))).also {
58 | it1 -> if ((it.args[3] as Boolean)) it.result = it1.animated else it1.static
59 | }
60 | }
61 | }
62 |
63 | }
64 | )
65 |
66 | patcher.patch(
67 | IconUtils::class.java.getDeclaredMethod("setIcon",
68 | ImageView::class.java, String::class.java,
69 | Int::class.javaPrimitiveType,
70 | Int::class.javaPrimitiveType,
71 | Boolean::class.javaPrimitiveType,
72 | Function1::class.java,
73 | MGImages.ChangeDetector::class.java
74 | ), Hook {
75 | if (it.args[1] == null || (it.args[1] as String).contains("https://cdn.discordapp.com/role-icons")) return@Hook
76 |
77 | val simpleDraweeView = it.args[0] as SimpleDraweeView
78 | simpleDraweeView.apply {
79 | hierarchy.n(s.l)
80 | clipToOutline = true
81 | background = if(PluginManager.isPluginEnabled("SquareAvatars")) {
82 | ShapeDrawable(RoundRectShape(RoundValue(), null, null)).apply { paint.color = Color.TRANSPARENT }
83 | } else {
84 | ShapeDrawable(OvalShape()).apply { paint.color = Color.TRANSPARENT }
85 | }
86 | }
87 | })
88 | }
89 |
90 | fun RoundValue(): FloatArray {
91 | val SquareSettings = PluginManager.plugins.get("SquareAvatars")!!.settings!!.getInt("roundCorners", 3)
92 | val FloatValue = FloatArray (8) {SquareSettings!!.toFloat()}
93 | return FloatValue
94 | }
95 |
96 | fun getStatic(gif: String): String {
97 | val encoded = URLEncoder.encode(gif, "UTF-8")
98 | return "https://static-gif.nexpid.workers.dev/convert.gif?url=" + "$encoded" + "&_=$hash"
99 | }
100 |
101 | data class PFP(val animated: String, val static: String)
102 | }
103 |
--------------------------------------------------------------------------------
/UserPFP/src/main/kotlin/om/ega/sunkey/userpfp/model/AbstractDatabase.kt:
--------------------------------------------------------------------------------
1 | package om.ega.sunkey.userpfp.model
2 |
3 | import com.aliucord.Http
4 | import com.aliucord.Utils
5 | import com.aliucord.api.PatcherAPI
6 | import com.aliucord.api.SettingsAPI
7 | import om.ega.sunkey.userpfp.UserPFP
8 | import com.aliucord.utils.IOUtils
9 | import java.io.File
10 | import java.io.FileInputStream
11 |
12 | abstract class AbstractDatabase() {
13 | abstract val regex: String
14 | abstract val url: String
15 | abstract var data: String
16 | abstract val mapCache: MutableMap
17 | abstract val name: String
18 |
19 | open fun init(settings: SettingsAPI, patcher: PatcherAPI) {
20 | loadDB(settings)
21 | runPatches(patcher, settings)
22 | }
23 |
24 | private fun loadDB(settings: SettingsAPI) {
25 | Utils.threadPool.execute {
26 | getCacheFile().let {
27 | it.createNewFile()
28 |
29 | data = loadFromCache(it)
30 | UserPFP.log.debug("Loaded $name database.")
31 |
32 | if (ifRecache(it.lastModified(), settings) || data.isEmpty() || data == null) {
33 | downloadDB(it)
34 | }
35 | }
36 | }
37 | }
38 |
39 | fun downloadDB(cachedFile: File) {
40 | UserPFP.log.debug("Downloading $name database...")
41 | Http.simpleDownload(url, cachedFile)
42 | UserPFP.log.debug("Downloaded $name database.")
43 |
44 | data = loadFromCache(cachedFile)
45 | UserPFP.log.debug("Updated $name database.")
46 | }
47 |
48 | private fun loadFromCache(it: File): String {
49 | return String(IOUtils.readBytes(FileInputStream(it)))
50 | }
51 |
52 | fun getCacheFile(): File {
53 | return File("/sdcard/Aliucord/${name}.txt")
54 | }
55 |
56 | private fun ifRecache(lastModified: Long, settings: SettingsAPI): Boolean {
57 | return System.currentTimeMillis() - lastModified > settings.getLong(
58 | "cacheTime",
59 | UserPFP.REFRESH_CACHE_TIME
60 | ) * 60 * 1000 // 6 hours
61 | }
62 |
63 | abstract fun runPatches(patcher: PatcherAPI, settings: SettingsAPI)
64 |
65 | }
66 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import com.aliucord.gradle.AliucordExtension
2 | import com.android.build.gradle.BaseExtension
3 |
4 | buildscript {
5 | repositories {
6 | google()
7 | mavenCentral()
8 | // Aliucords Maven repo which contains our tools and dependencies
9 | maven("https://maven.aliucord.com/snapshots")
10 | // Shitpack which still contains some Aliucord dependencies for now. TODO: Remove
11 | maven("https://jitpack.io")
12 | }
13 |
14 | dependencies {
15 | classpath("com.android.tools.build:gradle:7.0.4")
16 | // Aliucord gradle plugin which makes everything work and builds plugins
17 | classpath("com.aliucord:gradle:main-SNAPSHOT")
18 | // Kotlin support. Remove if you want to use Java
19 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21")
20 | }
21 | }
22 |
23 | allprojects {
24 | repositories {
25 | google()
26 | mavenCentral()
27 | maven("https://maven.aliucord.com/snapshots")
28 | }
29 | }
30 |
31 | fun Project.aliucord(configuration: AliucordExtension.() -> Unit) = extensions.getByName("aliucord").configuration()
32 |
33 | fun Project.android(configuration: BaseExtension.() -> Unit) = extensions.getByName("android").configuration()
34 |
35 | subprojects {
36 | apply(plugin = "com.android.library")
37 | apply(plugin = "com.aliucord.gradle")
38 | // Remove if using Java
39 | apply(plugin = "kotlin-android")
40 |
41 | // Fill out with your info
42 | aliucord {
43 | author("OmegaSunkey", 9366)
44 | updateUrl.set("https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/builds/updater.json")
45 | buildUrl.set("https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/builds/%s.zip")
46 | }
47 |
48 | android {
49 | compileSdkVersion(31)
50 |
51 | defaultConfig {
52 | minSdk = 24
53 | targetSdk = 31
54 | }
55 |
56 | compileOptions {
57 | sourceCompatibility = JavaVersion.VERSION_11
58 | targetCompatibility = JavaVersion.VERSION_11
59 | }
60 |
61 | tasks.withType {
62 | kotlinOptions {
63 | jvmTarget = "11" // Required
64 | // Disables some unnecessary features
65 | freeCompilerArgs = freeCompilerArgs +
66 | "-Xno-call-assertions" +
67 | "-Xno-param-assertions" +
68 | "-Xno-receiver-assertions"
69 | }
70 | }
71 | }
72 |
73 | dependencies {
74 | val discord by configurations
75 | val implementation by configurations
76 |
77 | // Stubs for all Discord classes
78 | discord("com.discord:discord:aliucord-SNAPSHOT")
79 | implementation("com.aliucord:Aliucord:main-SNAPSHOT")
80 |
81 | implementation("androidx.appcompat:appcompat:1.4.0")
82 | implementation("com.google.android.material:material:1.4.0")
83 | implementation("androidx.constraintlayout:constraintlayout:2.1.2")
84 | }
85 | }
86 |
87 | task("clean") {
88 | delete(rootProject.buildDir)
89 | }
90 |
--------------------------------------------------------------------------------
/git.ignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | /local.properties
4 | /.idea
5 | .DS_Store
6 | /build
7 | **/build
8 | /captures
9 | .externalNativeBuild
10 | .cxx
11 | local.properties
12 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app"s APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/790364947985647d29767e41abb751d59b32e195/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Jun 09 16:18:24 EST 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | #
4 | # Copyright © 2015-2021 the original authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | #
21 | # Gradle start up script for POSIX generated by Gradle.
22 | #
23 | # Important for running:
24 | #
25 | # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
26 | # noncompliant, but you have some other compliant shell such as ksh or
27 | # bash, then to run this script, type that shell name before the whole
28 | # command line, like:
29 | #
30 | # ksh Gradle
31 | #
32 | # Busybox and similar reduced shells will NOT work, because this script
33 | # requires all of these POSIX shell features:
34 | # * functions;
35 | # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
36 | # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
37 | # * compound commands having a testable exit status, especially «case»;
38 | # * various built-in commands including «command», «set», and «ulimit».
39 | #
40 | # Important for patching:
41 | #
42 | # (2) This script targets any POSIX shell, so it avoids extensions provided
43 | # by Bash, Ksh, etc; in particular arrays are avoided.
44 | #
45 | # The "traditional" practice of packing multiple parameters into a
46 | # space-separated string is a well documented source of bugs and security
47 | # problems, so this is (mostly) avoided, by progressively accumulating
48 | # options in "$@", and eventually passing that to Java.
49 | #
50 | # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
51 | # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
52 | # see the in-line comments for details.
53 | #
54 | # There are tweaks for specific operating systems such as AIX, CygWin,
55 | # Darwin, MinGW, and NonStop.
56 | #
57 | # (3) This script is generated from the Groovy template
58 | # https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
59 | # within the Gradle project.
60 | #
61 | # You can find Gradle at https://github.com/gradle/gradle/.
62 | #
63 | ##############################################################################
64 |
65 | # Attempt to set APP_HOME
66 |
67 | # Resolve links: $0 may be a link
68 | app_path=$0
69 |
70 | # Need this for daisy-chained symlinks.
71 | while
72 | APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
73 | [ -h "$app_path" ]
74 | do
75 | ls=$( ls -ld "$app_path" )
76 | link=${ls#*' -> '}
77 | case $link in #(
78 | /*) app_path=$link ;; #(
79 | *) app_path=$APP_HOME$link ;;
80 | esac
81 | done
82 |
83 | APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
84 |
85 | APP_NAME="Gradle"
86 | APP_BASE_NAME=${0##*/}
87 |
88 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
89 | DEFAULT_JVM_OPTS='-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"'
90 |
91 | # Use the maximum available, or set MAX_FD != -1 to use that value.
92 | MAX_FD=maximum
93 |
94 | warn () {
95 | echo "$*"
96 | } >&2
97 |
98 | die () {
99 | echo
100 | echo "$*"
101 | echo
102 | exit 1
103 | } >&2
104 |
105 | # OS specific support (must be 'true' or 'false').
106 | cygwin=false
107 | msys=false
108 | darwin=false
109 | nonstop=false
110 | case "$( uname )" in #(
111 | CYGWIN* ) cygwin=true ;; #(
112 | Darwin* ) darwin=true ;; #(
113 | MSYS* | MINGW* ) msys=true ;; #(
114 | NONSTOP* ) nonstop=true ;;
115 | esac
116 |
117 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
118 |
119 |
120 | # Determine the Java command to use to start the JVM.
121 | if [ -n "$JAVA_HOME" ] ; then
122 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
123 | # IBM's JDK on AIX uses strange locations for the executables
124 | JAVACMD=$JAVA_HOME/jre/sh/java
125 | else
126 | JAVACMD=$JAVA_HOME/bin/java
127 | fi
128 | if [ ! -x "$JAVACMD" ] ; then
129 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
130 |
131 | Please set the JAVA_HOME variable in your environment to match the
132 | location of your Java installation."
133 | fi
134 | else
135 | JAVACMD=java
136 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
137 |
138 | Please set the JAVA_HOME variable in your environment to match the
139 | location of your Java installation."
140 | fi
141 |
142 | # Increase the maximum file descriptors if we can.
143 | if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
144 | case $MAX_FD in #(
145 | max*)
146 | MAX_FD=$( ulimit -H -n ) ||
147 | warn "Could not query maximum file descriptor limit"
148 | esac
149 | case $MAX_FD in #(
150 | '' | soft) :;; #(
151 | *)
152 | ulimit -n "$MAX_FD" ||
153 | warn "Could not set maximum file descriptor limit to $MAX_FD"
154 | esac
155 | fi
156 |
157 | # Collect all arguments for the java command, stacking in reverse order:
158 | # * args from the command line
159 | # * the main class name
160 | # * -classpath
161 | # * -D...appname settings
162 | # * --module-path (only if needed)
163 | # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
164 |
165 | # For Cygwin or MSYS, switch paths to Windows format before running java
166 | if "$cygwin" || "$msys" ; then
167 | APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
168 | CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
169 |
170 | JAVACMD=$( cygpath --unix "$JAVACMD" )
171 |
172 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
173 | for arg do
174 | if
175 | case $arg in #(
176 | -*) false ;; # don't mess with options #(
177 | /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
178 | [ -e "$t" ] ;; #(
179 | *) false ;;
180 | esac
181 | then
182 | arg=$( cygpath --path --ignore --mixed "$arg" )
183 | fi
184 | # Roll the args list around exactly as many times as the number of
185 | # args, so each arg winds up back in the position where it started, but
186 | # possibly modified.
187 | #
188 | # NB: a `for` loop captures its iteration list before it begins, so
189 | # changing the positional parameters here affects neither the number of
190 | # iterations, nor the values presented in `arg`.
191 | shift # remove old arg
192 | set -- "$@" "$arg" # push replacement arg
193 | done
194 | fi
195 |
196 | # Collect all arguments for the java command;
197 | # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
198 | # shell script including quotes and variable substitutions, so put them in
199 | # double quotes to make sure that they get re-expanded; and
200 | # * put everything else in single quotes, so that it's not re-expanded.
201 |
202 | set -- \
203 | "-Dorg.gradle.appname=$APP_BASE_NAME" \
204 | -classpath "$CLASSPATH" \
205 | org.gradle.wrapper.GradleWrapperMain \
206 | "$@"
207 |
208 | # Use "xargs" to parse quoted args.
209 | #
210 | # With -n1 it outputs one arg per line, with the quotes and backslashes removed.
211 | #
212 | # In Bash we could simply go:
213 | #
214 | # readarray ARGS < <( xargs -n1 <<<"$var" ) &&
215 | # set -- "${ARGS[@]}" "$@"
216 | #
217 | # but POSIX shell has neither arrays nor command substitution, so instead we
218 | # post-process each arg (as a line of input to sed) to backslash-escape any
219 | # character that might be a shell metacharacter, then use eval to reverse
220 | # that process (while maintaining the separation between arguments), and wrap
221 | # the whole thing up as a single "set" statement.
222 | #
223 | # This will of course break if any of these variables contains a newline or
224 | # an unmatched quote.
225 | #
226 |
227 | eval "set -- $(
228 | printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
229 | xargs -n1 |
230 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
231 | tr '\n' ' '
232 | )" '"$@"'
233 |
234 | exec "$JAVACMD" "$@"
235 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS=-Dfile.encoding=UTF-8 "-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/ping.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/OmegaSunkey/awesomeplugins/790364947985647d29767e41abb751d59b32e195/ping.mp3
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | rootProject.name = "awesomeplugins"
2 |
3 | // This file sets what projects are included. Every time you add a new project, you must add it
4 | // to the includes below.
5 |
6 | // Plugins are included like this
7 | include(
8 | "StartupSound",
9 | "UserBG",
10 | "UserPFP",
11 | "AliucordRenamer",
12 | "FanCopypasta",
13 | "SafeBooru",
14 | "Rule34",
15 | "NoticeSound",
16 | "Hispanizador",
17 | "ForceSlashCommandsFixNOW"
18 | )
19 |
20 |
--------------------------------------------------------------------------------