revenge-bundle-next/lib/utils/src/discord.ts

67 lines
1.9 KiB
TypeScript
Raw Normal View History

import { getAssetByName } from '@revenge-mod/assets'
import { TokensModuleId } from '@revenge-mod/discord/common'
2025-05-08 18:52:57 +07:00
import { byDependencies, byProps } from '@revenge-mod/modules/finders/filters'
import { lookupModule } from '@revenge-mod/modules/finders/lookup'
2025-06-03 16:24:58 +07:00
import {
ReactJsxRuntimeModuleId,
ReactModuleId,
ReactNativeModuleId,
} from '@revenge-mod/react'
2025-05-08 18:52:57 +07:00
import type { FC } from 'react'
// [React, ReactJsxRuntime, (Tokens), (BaseIconImage), (Asset), 2]
2025-05-08 18:52:57 +07:00
// Asset = relativeDep(1)
2025-06-03 16:24:58 +07:00
const IconComponentFilter = [
ReactModuleId,
ReactJsxRuntimeModuleId,
TokensModuleId,
undefined,
undefined,
2,
]
2025-05-08 18:52:57 +07:00
// Generated IconComponents that have multiple assets, there is no specific length, so the filter has to be generated on-the-fly.
// [React, ReactNative, ReactJsxRuntime, (Tokens), (BaseIconImage), (...Assets), 2]
// ...Assets = relativeDep(1..n)
const MultiIconComponentFilterBase = [
ReactModuleId,
ReactNativeModuleId,
ReactJsxRuntimeModuleId,
TokensModuleId,
undefined,
]
// TODO(utils/discord/lookupGeneratedIconComponent): Make this into a filter?
2025-06-03 16:24:58 +07:00
export function lookupGeneratedIconComponent<N extends string>(
compName: N,
...assetNames: string[]
) {
const icon = lookupModule(byProps(compName))[0]?.[compName]
2025-05-08 18:52:57 +07:00
if (icon) return icon
let filter = IconComponentFilter
2025-05-08 18:52:57 +07:00
if (assetNames.length) {
const mids = []
2025-05-08 18:52:57 +07:00
for (const name of assetNames) {
const mid = getAssetByName(name)?.moduleId
if (!mid) return
mids.push(mid)
}
filter = [...MultiIconComponentFilterBase, ...mids, 2]
} else {
const mid = getAssetByName(compName)?.moduleId
if (!mid) return
IconComponentFilter[4] = mid
}
return lookupModule(byDependencies<{ [K in N]: FC }>(filter), {
initialized: false,
uninitialized: true,
})[0]?.[compName]
2025-05-08 18:52:57 +07:00
}