diff --git a/scripts/build.ts b/scripts/build.ts index 37b086d..8906c25 100644 --- a/scripts/build.ts +++ b/scripts/build.ts @@ -33,6 +33,9 @@ export default async function build(dev = Dev, log = true) { if (log) console.info(chalk.cyanBright('\u{1F5BB} Assets generated')) if (log) console.info(chalk.gray('\u{1F5CE} Compiling JS...')) + const COMMIT = (await $`git rev-parse HEAD`.text()).trim().substring(0, 7) + const REPO = 'revenge-mod/revenge-bundle-next' + const bundle = await rolldown({ input: 'src/index.ts', platform: 'neutral', @@ -48,10 +51,17 @@ export default async function build(dev = Dev, log = true) { '.webp': 'dataurl', }, define: { - __BUILD_VERSION__: JSON.stringify(pkg.version), - __BUILD_COMMIT__: JSON.stringify( - (await $`git rev-parse HEAD`.text()).trim().substring(0, 7), + __BUILD_DISCORD_SERVER_URL__: JSON.stringify( + 'https://discord.com/invite/ddcQf3s2Uq', ), + __BUILD_SOURCE_REPOSITORY_URL__: JSON.stringify( + `https://github.com/${REPO}`, + ), + __BUILD_LICENSE_URL__: JSON.stringify( + `https://raw.githubusercontent.com/${REPO}/${COMMIT}/LICENSE`, + ), + __BUILD_VERSION__: JSON.stringify(pkg.version), + __BUILD_COMMIT__: JSON.stringify(COMMIT), __BUILD_BRANCH__: JSON.stringify( (await $`git rev-parse --abbrev-ref HEAD`.text()).trim(), ), diff --git a/src/constants.ts b/src/constants.ts index dd6571f..f205688 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,3 @@ -export const GitHubOrganizationURL = 'https://github.com/revenge-mod' -export const DiscordServerURL = 'https://discord.com/invite/ddcQf3s2Uq' +export const LicenseFallbackURL = 'https://www.gnu.org/licenses/gpl-3.0.txt' export const BuildEnvironment = __DEV__ ? 'development' : 'production' +export const FullVersion = `${__BUILD_VERSION__}-${__BUILD_COMMIT__}-${__BUILD_BRANCH__}` diff --git a/src/plugins/init/settings/constants.ts b/src/plugins/init/settings/constants.ts index 342036c..41c9389 100644 --- a/src/plugins/init/settings/constants.ts +++ b/src/plugins/init/settings/constants.ts @@ -10,7 +10,8 @@ export const Setting = { // SUBSETTINGS RevengeDiscord: 'RevengeDiscord', - RevengeGitHub: 'RevengeGitHub', + RevengeSourceRepository: 'RevengeSourceRepository', + RevengeLicense: 'RevengeLicense', Reload: 'Reload', RevengeVersion: 'RevengeVersion', diff --git a/src/plugins/init/settings/definitions/RevengeDiscordSetting.tsx b/src/plugins/init/settings/definitions/RevengeDiscordSetting.tsx index 8407f8a..62c5681 100644 --- a/src/plugins/init/settings/definitions/RevengeDiscordSetting.tsx +++ b/src/plugins/init/settings/definitions/RevengeDiscordSetting.tsx @@ -1,6 +1,5 @@ import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' import { Linking } from 'react-native' -import { DiscordServerURL } from '~/constants' import { Setting } from '../constants' import type { SettingsItem } from '@revenge-mod/discord/modules/settings' @@ -8,8 +7,9 @@ const RevengeDiscordSetting: SettingsItem = { parent: Setting.Revenge, IconComponent: () => , title: () => 'Discord Server', + useDescription: () => __BUILD_DISCORD_SERVER_URL__, onPress: () => { - Linking.openURL(DiscordServerURL) + Linking.openURL(__BUILD_DISCORD_SERVER_URL__) }, type: 'pressable', } diff --git a/src/plugins/init/settings/definitions/RevengeGitHubSetting.tsx b/src/plugins/init/settings/definitions/RevengeGitHubSetting.tsx deleted file mode 100644 index d39d1d7..0000000 --- a/src/plugins/init/settings/definitions/RevengeGitHubSetting.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' -import { Linking } from 'react-native' -import { GitHubOrganizationURL } from '~/constants' -import { Setting } from '../constants' -import type { SettingsItem } from '@revenge-mod/discord/modules/settings' - -const RevengeGitHubSetting: SettingsItem = { - parent: Setting.Revenge, - IconComponent: () => ( - - ), - title: () => 'GitHub', - onPress: () => { - Linking.openURL(GitHubOrganizationURL) - }, - type: 'pressable', -} - -export default RevengeGitHubSetting diff --git a/src/plugins/init/settings/definitions/RevengeLicenseSetting.tsx b/src/plugins/init/settings/definitions/RevengeLicenseSetting.tsx new file mode 100644 index 0000000..ad535b1 --- /dev/null +++ b/src/plugins/init/settings/definitions/RevengeLicenseSetting.tsx @@ -0,0 +1,79 @@ +import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' +import { AlertActionCreators } from '@revenge-mod/discord/actions' +import { Design } from '@revenge-mod/discord/design' +import { useEffect, useState } from 'react' +import { ScrollView, useWindowDimensions } from 'react-native' +import { LicenseFallbackURL } from '~/constants' +import { Setting } from '../constants' +import type { SettingsItem } from '@revenge-mod/discord/modules/settings' + +const RevengeLicenseSetting: SettingsItem = { + parent: Setting.Revenge, + IconComponent: () => , + title: () => 'License', + onPress: () => { + AlertActionCreators.openAlert('revenge-license', ) + }, + type: 'pressable', +} + +export default RevengeLicenseSetting + +const trimStart = (text: string) => text.replaceAll(/^ +/gm, '') + +function LicenseAlert() { + const { height } = useWindowDimensions() + const [license, setLicense] = useState(null) + + useEffect(() => { + fetch(__BUILD_LICENSE_URL__) + .then(response => { + if (!response.ok) { + throw new Error( + `Failed to fetch license: ${response.statusText}`, + ) + } + return response.text() + }) + .then(trimStart) + .then(setLicense) + .catch(() => { + // Fallback to the hardcoded license URL + fetch(LicenseFallbackURL) + .then(response => response.text()) + .then(trimStart) + .then(setLicense) + .catch(error => { + console.error( + 'Failed to fetch fallback license:', + error, + ) + setLicense('Failed to load license.') + }) + }) + }, []) + + return ( + + + {license ?? 'Fetching...'} + + + } + actions={ + + } + /> + ) +} diff --git a/src/plugins/init/settings/definitions/RevengeSetting.tsx b/src/plugins/init/settings/definitions/RevengeSetting.tsx index f2c5cb2..ae6277c 100644 --- a/src/plugins/init/settings/definitions/RevengeSetting.tsx +++ b/src/plugins/init/settings/definitions/RevengeSetting.tsx @@ -1,4 +1,5 @@ import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' +import { FullVersion } from '~/constants' import RevengeIcon from '~assets/RevengeIcon' import { RouteNames, Setting } from '../constants' import type { SettingsItem } from '@revenge-mod/discord/modules/settings' @@ -8,8 +9,7 @@ const RevengeSetting: SettingsItem = { type: 'route', IconComponent: () => , title: () => 'Revenge', - useTrailing: () => - `${__BUILD_VERSION__}-${__BUILD_COMMIT__}-${__BUILD_BRANCH__}`, + useTrailing: () => FullVersion, screen: { route: RouteNames[Setting.Revenge], getComponent: () => require('../screens/RevengeSettingScreen').default, diff --git a/src/plugins/init/settings/definitions/RevengeSourceRepositorySetting.tsx b/src/plugins/init/settings/definitions/RevengeSourceRepositorySetting.tsx new file mode 100644 index 0000000..953c9ee --- /dev/null +++ b/src/plugins/init/settings/definitions/RevengeSourceRepositorySetting.tsx @@ -0,0 +1,17 @@ +import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' +import { Linking } from 'react-native' +import { Setting } from '../constants' +import type { SettingsItem } from '@revenge-mod/discord/modules/settings' + +const RevengeSourceRepositorySetting: SettingsItem = { + parent: Setting.Revenge, + IconComponent: () => , + title: () => 'Source Code', + useDescription: () => __BUILD_SOURCE_REPOSITORY_URL__, + onPress: () => { + Linking.openURL(__BUILD_SOURCE_REPOSITORY_URL__) + }, + type: 'pressable', +} + +export default RevengeSourceRepositorySetting diff --git a/src/plugins/init/settings/definitions/RevengeVersionSetting.tsx b/src/plugins/init/settings/definitions/RevengeVersionSetting.tsx index 82ce0ce..0778e3c 100644 --- a/src/plugins/init/settings/definitions/RevengeVersionSetting.tsx +++ b/src/plugins/init/settings/definitions/RevengeVersionSetting.tsx @@ -1,5 +1,5 @@ import TableRowAssetIcon from '@revenge-mod/components/TableRowAssetIcon' -import { BuildEnvironment } from '~/constants' +import { BuildEnvironment, FullVersion } from '~/constants' import RevengeIcon from '~assets/RevengeIcon' import { Setting } from '../constants' import type { SettingsItem } from '@revenge-mod/discord/modules/settings' @@ -8,8 +8,7 @@ const RevengeVersionSetting: SettingsItem = { parent: Setting.Revenge, IconComponent: () => , title: () => 'Revenge', - useDescription: () => - `${__BUILD_VERSION__}-${__BUILD_COMMIT__}-${__BUILD_BRANCH__} (${BuildEnvironment})`, + useDescription: () => `${FullVersion} (${BuildEnvironment})`, type: 'static', } diff --git a/src/plugins/init/settings/register.ts b/src/plugins/init/settings/register.ts index c1c378f..72e4a66 100644 --- a/src/plugins/init/settings/register.ts +++ b/src/plugins/init/settings/register.ts @@ -11,9 +11,10 @@ import ReactVersionSetting from './definitions/ReactVersionSetting' import ReloadSetting from './definitions/ReloadSetting' import RevengeCustomPageSetting from './definitions/RevengeCustomPageSetting' import RevengeDiscordSetting from './definitions/RevengeDiscordSetting' -import RevengeGitHubSetting from './definitions/RevengeGitHubSetting' +import RevengeLicenseSetting from './definitions/RevengeLicenseSetting' import RevengePluginsSetting from './definitions/RevengePluginsSetting' import RevengeSetting from './definitions/RevengeSetting' +import RevengeSourceRepositorySetting from './definitions/RevengeSourceRepositorySetting' import RevengeVersionSetting from './definitions/RevengeVersionSetting' registerSettingsItems({ @@ -22,7 +23,8 @@ registerSettingsItems({ // [MobileSetting.REVENGE_THEMES]: RevengeThemesSetting, // [MobileSetting.REVENGE_FONTS]: RevengeFontsSetting, [Setting.RevengeCustomPage]: RevengeCustomPageSetting, - [Setting.RevengeGitHub]: RevengeGitHubSetting, + [Setting.RevengeSourceRepository]: RevengeSourceRepositorySetting, + [Setting.RevengeLicense]: RevengeLicenseSetting, [Setting.RevengeDiscord]: RevengeDiscordSetting, [Setting.Reload]: ReloadSetting, [Setting.RevengeVersion]: RevengeVersionSetting, diff --git a/src/plugins/init/settings/screens/RevengeSettingScreen.tsx b/src/plugins/init/settings/screens/RevengeSettingScreen.tsx index 70abc1f..26f9425 100644 --- a/src/plugins/init/settings/screens/RevengeSettingScreen.tsx +++ b/src/plugins/init/settings/screens/RevengeSettingScreen.tsx @@ -11,7 +11,8 @@ export default function RevengeSettingScreen() { settings: [ Setting.RevengeVersion, Setting.RevengeDiscord, - Setting.RevengeGitHub, + Setting.RevengeSourceRepository, + Setting.RevengeLicense, ], subLabel: ( <> diff --git a/src/plugins/preinit/logging/index.ts b/src/plugins/preinit/logging/index.ts index 9461596..8a5ced3 100644 --- a/src/plugins/preinit/logging/index.ts +++ b/src/plugins/preinit/logging/index.ts @@ -1,7 +1,7 @@ import { AppStartPerformance } from '@revenge-mod/discord/preinit' import { InternalPluginFlags, registerPlugin } from '@revenge-mod/plugins/_' import { PluginFlags } from '@revenge-mod/plugins/constants' -import { BuildEnvironment } from '~/constants' +import { BuildEnvironment, FullVersion } from '~/constants' AppStartPerformance.mark('👊', 'Plugins register') @@ -33,7 +33,7 @@ registerPlugin( performance.now() - tsInit, ) logger.log( - `👊 Revenge. Discord, your way. (${__BUILD_VERSION__}-${__BUILD_COMMIT__}-${__BUILD_BRANCH__} (${BuildEnvironment}))`, + `👊 Revenge. Discord, your way. (${FullVersion} (${BuildEnvironment}))`, ) }, }, diff --git a/src/preinit.ts b/src/preinit.ts index e525c33..1b6eb4f 100644 --- a/src/preinit.ts +++ b/src/preinit.ts @@ -6,7 +6,7 @@ import { onModuleInitialized, } from '@revenge-mod/modules/metro/subscriptions' import { getErrorStack } from '@revenge-mod/utils/error' -import { BuildEnvironment } from './constants' +import { BuildEnvironment, FullVersion } from './constants' const IndexModuleId = 0 @@ -66,7 +66,7 @@ function onError(e: unknown) { const Device = DeviceModule.getConstants() alert( - `Failed to load Revenge (${__BUILD_VERSION__}-${__BUILD_COMMIT__}-${__BUILD_BRANCH__} (${BuildEnvironment}))\n` + + `Failed to load Revenge (${FullVersion} (${BuildEnvironment}))\n` + `Discord: ${Client.Version} (${Client.Build})\n` + `Device: ${Device.deviceManufacturer} ${Device.deviceModel}\n\n` + getErrorStack(e), diff --git a/types.d.ts b/types.d.ts index 7fd8eb7..a8e6245 100644 --- a/types.d.ts +++ b/types.d.ts @@ -2,6 +2,9 @@ declare global { const __DEV__: boolean + const __BUILD_DISCORD_SERVER_URL__: string + const __BUILD_SOURCE_REPOSITORY_URL__: string + const __BUILD_LICENSE_URL__: string const __BUILD_COMMIT__: string const __BUILD_BRANCH__: string const __BUILD_VERSION__: string