Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ object Authors {
val Accelerator = Author("Accelerator", 150234173024501762L)
val Derlan = Author("Derlan", 821545900807028757L)
val Link = Author("Link", 725923756555501658L)
val Wing = Author("Wing", 298295889720770563L)
val ArjixWasTaken = Author("ArjixWasTaken", 674710789138939916L)
}

Expand Down
13 changes: 13 additions & 0 deletions plugins/FuckOffDiscord/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.aliucord.gradle.repo.Authors
import com.aliucord.gradle.repo.author

plugins {
id("com.aliucord.plugins-repo")
}

version = "1.0.1"
description = "Fuck off Discord"

aliucord {
author(Authors.HalalKing)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.aliucord.plugins

import android.content.Context
import android.view.View
import com.aliucord.Utils
import com.aliucord.annotations.AliucordPlugin
import com.aliucord.entities.Plugin
import kotlin.Throws
import com.discord.widgets.user.Badge
import com.aliucord.patcher.after
import com.aliucord.patcher.instead
import com.aliucord.plugins.ReflectionExtensions.binding
import com.discord.models.guild.Guild
import com.discord.widgets.emoji.WidgetEmojiSheet
import com.discord.widgets.stickers.WidgetGuildStickerSheet
import com.google.android.material.button.MaterialButton

@AliucordPlugin
class FuckOffDiscord : Plugin() {
@Throws(NoSuchMethodException::class)
override fun start(context: Context) {
ReflectionExtensions.init();

patcher.instead<Badge>("getShowPremiumUpSell") { false }

patcher.after<WidgetEmojiSheet>("configureButtons", Boolean::class.java, Boolean::class.java, Guild::class.java) {
binding.root.findViewById<MaterialButton>(Utils.getResId("premium_btn", "id")).apply {
visibility = View.GONE
}
}

patcher.after<WidgetGuildStickerSheet>("configureButtons", Boolean::class.java, Boolean::class.java, Guild::class.java) {
binding.root.findViewById<MaterialButton>(Utils.getResId("guild_sticker_sheet_premium_btn", "id")).apply {
visibility = View.GONE
}
}
}

override fun stop(context: Context) {
patcher.unpatchAll()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.aliucord.plugins

import com.discord.databinding.WidgetEmojiSheetBinding
import com.discord.databinding.WidgetGuildStickerSheetBinding
import com.discord.widgets.emoji.WidgetEmojiSheet
import com.discord.widgets.stickers.WidgetGuildStickerSheet
import java.lang.reflect.Field
import java.lang.reflect.Method

object ReflectionExtensions {
private lateinit var guildStickerBinding: Method
private lateinit var emojiBinding: Method

fun init() {
guildStickerBinding = WidgetGuildStickerSheet::class.java.getDeclaredMethod("getBinding").apply { isAccessible = true }
emojiBinding = WidgetEmojiSheet::class.java.getDeclaredMethod("getBinding").apply { isAccessible = true }
}

val WidgetGuildStickerSheet.binding: WidgetGuildStickerSheetBinding
get() = guildStickerBinding.invoke(this) as WidgetGuildStickerSheetBinding

val WidgetEmojiSheet.binding: WidgetEmojiSheetBinding
get() = emojiBinding.invoke(this) as WidgetEmojiSheetBinding
}
13 changes: 13 additions & 0 deletions plugins/FullBio/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.aliucord.gradle.repo.Authors
import com.aliucord.gradle.repo.author

plugins {
id("com.aliucord.plugins-repo")
}

version = "1.0.2"
description = "Shows Full bio in user profiles"

aliucord {
author(Authors.HalalKing)
}
45 changes: 45 additions & 0 deletions plugins/FullBio/src/main/java/com/aliucord/plugins/FullBio.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.aliucord.plugins

import android.content.Context
import android.widget.TextView
import com.aliucord.Utils
import com.aliucord.annotations.AliucordPlugin
import com.aliucord.entities.Plugin
import com.aliucord.patcher.Hook
import com.aliucord.plugins.ReflectionExtensions.binding
import com.discord.utilities.view.text.LinkifiedTextView
import com.discord.widgets.settings.profile.SettingsUserProfileViewModel
import com.discord.widgets.settings.profile.WidgetEditUserOrGuildMemberProfile
import com.discord.widgets.user.usersheet.WidgetUserSheet
import com.discord.widgets.user.usersheet.WidgetUserSheetViewModel

// This class is never used so your IDE will likely complain. Let's make it shut up!
@AliucordPlugin
class FullBio : Plugin() {
@Throws(NoSuchMethodException::class) // Called when your plugin is started. This is the place to register command, add patches, etc
override fun start(context: Context) {
ReflectionExtensions.init()

patcher.patch(WidgetEditUserOrGuildMemberProfile::class.java.getDeclaredMethod("configureBio", SettingsUserProfileViewModel.ViewState.Loaded::class.java), Hook {
val binding = (it.thisObject as WidgetEditUserOrGuildMemberProfile).binding
setMax(binding.root.findViewById<LinkifiedTextView>(Utils.getResId("bio_preview_text", "id")))
setMax(binding.root.findViewById<LinkifiedTextView>(Utils.getResId("bio_editor_text_input_field", "id")))
})

patcher.patch(WidgetUserSheet::class.java.getDeclaredMethod("configureAboutMe", WidgetUserSheetViewModel.ViewState.Loaded::class.java), Hook {
val binding = (it.thisObject as WidgetUserSheet).binding
setMax(binding.root.findViewById<LinkifiedTextView>(Utils.getResId("about_me_text", "id")))
})
}

private fun setMax(text: TextView?) {
text?.apply {
maxLines = Integer.MAX_VALUE
}
}

// Called when your plugin is stopped
override fun stop(context: Context) {
patcher.unpatchAll()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.aliucord.plugins

import com.discord.databinding.WidgetSettingsUserProfileBinding
import com.discord.databinding.WidgetUserSheetBinding
import com.discord.widgets.settings.profile.WidgetEditUserOrGuildMemberProfile
import com.discord.widgets.user.usersheet.WidgetUserSheet
import java.lang.reflect.Method

object ReflectionExtensions {
private lateinit var settingsBioBinding: Method
private lateinit var userBioBinding: Method

fun init() {
settingsBioBinding = WidgetEditUserOrGuildMemberProfile::class.java.getDeclaredMethod("getBinding").apply { isAccessible = true }
userBioBinding = WidgetUserSheet::class.java.getDeclaredMethod("getBinding").apply { isAccessible = true }
}

val WidgetEditUserOrGuildMemberProfile.binding: WidgetSettingsUserProfileBinding
get() = settingsBioBinding.invoke(this) as WidgetSettingsUserProfileBinding

val WidgetUserSheet.binding: WidgetUserSheetBinding
get() = userBioBinding.invoke(this) as WidgetUserSheetBinding
}
13 changes: 13 additions & 0 deletions plugins/MarqueeEverywhere/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.aliucord.gradle.repo.Authors
import com.aliucord.gradle.repo.author

plugins {
id("com.aliucord.plugins-repo")
}

version = "1.1.2"
description = "Applies marquees to every channel name"

aliucord {
author(Authors.HalalKing)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
package com.aliucord.plugins

import android.content.Context
import android.os.Bundle
import android.text.TextUtils
import android.view.View
import android.widget.TextView
import com.aliucord.PluginManager
import com.aliucord.Utils
import com.aliucord.annotations.AliucordPlugin
import com.aliucord.api.SettingsAPI
import com.aliucord.entities.Plugin
import com.aliucord.patcher.after
import com.aliucord.plugins.ReflectionExtensions.binding
import com.aliucord.widgets.BottomSheet
import com.discord.views.CheckedSetting
import com.discord.views.UsernameView
import com.discord.widgets.channels.list.WidgetChannelsListAdapter
import com.discord.widgets.channels.list.items.ChannelListItem
import com.discord.widgets.channels.memberlist.adapter.ChannelMembersListAdapter
import com.discord.widgets.channels.memberlist.adapter.ChannelMembersListViewHolderHeader
import com.discord.widgets.channels.memberlist.adapter.ChannelMembersListViewHolderMember

// This class is never used so your IDE will likely complain. Let's make it shut up!
@AliucordPlugin
class MarqueeEverywhere : Plugin() {
init {
settingsTab = SettingsTab(PluginSettings::class.java, SettingsTab.Type.BOTTOM_SHEET).withArgs(settings)
}

@Throws(NoSuchMethodException::class) // Called when your plugin is started. This is the place to register command, add patches, etc
override fun start(context: Context) {
ReflectionExtensions.init()

if (settings.getBool("channelNames", true)) {
patcher.after<WidgetChannelsListAdapter.ItemChannelText>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_item_channel_name", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelVoice>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_item_voice_channel_name", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelStageVoice>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("stage_channel_item_voice_channel_name", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelCategory>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_item_category_name", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelPrivate>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_list_item_private_name", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelThread>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_item_thread_name", "id")))
}
}

if (settings.getBool("memberNames", true)) {
patcher.after<ChannelMembersListViewHolderHeader>("bind", ChannelMembersListAdapter.Item.Header::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channel_members_list_item_header_text", "id")))
}

patcher.after<ChannelMembersListViewHolderMember>("bind", ChannelMembersListAdapter.Item.Member::class.java, Function0::class.java) {
setMarquee(binding.root.findViewById<UsernameView>(Utils.getResId("channel_members_list_item_name", "id")).findViewById(Utils.getResId("username_text", "id")))
}
}

if (settings.getBool("userStatus", true)) {
patcher.after<ChannelMembersListViewHolderMember>("bind", ChannelMembersListAdapter.Item.Member::class.java, Function0::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channel_members_list_item_game", "id")))
}

patcher.after<WidgetChannelsListAdapter.ItemChannelPrivate>("onConfigure", Int::class.java, ChannelListItem::class.java) {
setMarquee(binding.root.findViewById(Utils.getResId("channels_list_item_private_desc", "id")))
}
}
}

private fun setMarquee(text: TextView?) {
text?.apply {
ellipsize = TextUtils.TruncateAt.MARQUEE
marqueeRepeatLimit = -1
isSelected = true
}
}

// Called when your plugin is stopped
override fun stop(context: Context) {
patcher.unpatchAll()
}

class PluginSettings(val settings: SettingsAPI) : BottomSheet() {
override fun onViewCreated(view: View, bundle: Bundle?) {
super.onViewCreated(view, bundle)

context?.let {
addView(createCheckedSetting(it, "Channel names", "Channel names (including names of DMs) should scroll", "channelNames"))
addView(createCheckedSetting(it, "Member names", "Member names should scroll", "memberNames"))
addView(createCheckedSetting(it, "User status", "User statuses should scroll", "userStatus"))
}
}

private fun createCheckedSetting(ctx: Context, title: String, subtext: String, setting: String, default: Boolean = true): CheckedSetting {
return Utils.createCheckedSetting(ctx, CheckedSetting.ViewType.SWITCH, title, subtext).apply {
isChecked = settings.getBool(setting, default)
setOnCheckedListener {
settings.setBool(setting, it)
PluginManager.stopPlugin("MarqueeEverywhere")
PluginManager.startPlugin("MarqueeEverywhere")
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.aliucord.plugins

import com.discord.databinding.*
import com.discord.widgets.channels.list.WidgetChannelsListAdapter
import com.discord.widgets.channels.memberlist.adapter.ChannelMembersListViewHolderHeader
import com.discord.widgets.channels.memberlist.adapter.ChannelMembersListViewHolderMember
import java.lang.reflect.Field

object ReflectionExtensions {
private lateinit var textChannelBinding: Field
private lateinit var privateChannelBinding: Field
private lateinit var categoryChannelBinding: Field
private lateinit var stageChannelBinding: Field
private lateinit var threadChannelBinding: Field
private lateinit var voiceChannelBinding: Field
private lateinit var roleHeaderBinding: Field
private lateinit var memberBinding: Field

fun init() {
textChannelBinding = WidgetChannelsListAdapter.ItemChannelText::class.java.getDeclaredField("binding").apply { isAccessible = true }
privateChannelBinding = WidgetChannelsListAdapter.ItemChannelPrivate::class.java.getDeclaredField("binding").apply { isAccessible = true }
categoryChannelBinding = WidgetChannelsListAdapter.ItemChannelCategory::class.java.getDeclaredField("binding").apply { isAccessible = true }
stageChannelBinding = WidgetChannelsListAdapter.ItemChannelStageVoice::class.java.getDeclaredField("binding").apply { isAccessible = true }
threadChannelBinding = WidgetChannelsListAdapter.ItemChannelThread::class.java.getDeclaredField("binding").apply { isAccessible = true }
voiceChannelBinding = WidgetChannelsListAdapter.ItemChannelVoice::class.java.getDeclaredField("binding").apply { isAccessible = true }
roleHeaderBinding = ChannelMembersListViewHolderHeader::class.java.getDeclaredField("binding").apply { isAccessible = true }
memberBinding = ChannelMembersListViewHolderMember::class.java.getDeclaredField("binding").apply { isAccessible = true }
}

val WidgetChannelsListAdapter.ItemChannelText.binding: WidgetChannelsListItemChannelBinding
get() = textChannelBinding[this] as WidgetChannelsListItemChannelBinding

val WidgetChannelsListAdapter.ItemChannelStageVoice.binding: WidgetChannelsListItemChannelStageVoiceBinding
get() = stageChannelBinding[this] as WidgetChannelsListItemChannelStageVoiceBinding

val WidgetChannelsListAdapter.ItemChannelPrivate.binding: WidgetChannelsListItemChannelPrivateBinding
get() = privateChannelBinding[this] as WidgetChannelsListItemChannelPrivateBinding

val WidgetChannelsListAdapter.ItemChannelCategory.binding: WidgetChannelsListItemCategoryBinding
get() = categoryChannelBinding[this] as WidgetChannelsListItemCategoryBinding

val WidgetChannelsListAdapter.ItemChannelThread.binding: WidgetChannelsListItemThreadBinding
get() = threadChannelBinding[this] as WidgetChannelsListItemThreadBinding

val WidgetChannelsListAdapter.ItemChannelVoice.binding: WidgetChannelsListItemChannelVoiceBinding
get() = voiceChannelBinding[this] as WidgetChannelsListItemChannelVoiceBinding

val ChannelMembersListViewHolderHeader.binding: WidgetChannelMembersListItemHeaderBinding
get() = roleHeaderBinding[this] as WidgetChannelMembersListItemHeaderBinding

val ChannelMembersListViewHolderMember.binding: WidgetChannelMembersListItemUserBinding
get() = memberBinding[this] as WidgetChannelMembersListItemUserBinding
}
13 changes: 13 additions & 0 deletions plugins/NoReactions/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import com.aliucord.gradle.repo.Authors
import com.aliucord.gradle.repo.author

plugins {
id("com.aliucord.plugins-repo")
}

version = "1.0.1"
description = "No Reactions"

aliucord {
author(Authors.HalalKing)
}
Loading