/** * How the fuck did I do this */ import BDV2 from "../modules/v2"; import V2C_SettingsTitle from "./settingsTitle"; import V2C_SettingsGroup from "./settingsGroup"; import dataStore from "../modules/dataStore"; import { defaultRPC, settingsRPC } from "../0globals"; import CustomRichPresence from "../modules/CustomRichPresence" import Select from "./select"; import timestampRender from "./timestampRender" import { remote } from "electron"; const React = BDV2.React; let V2C_PresenceSettingsModules export default class V2C_PresenceSettings extends React.Component { constructor(props) { super(props); this.state = { data: dataStore.getSettingGroup("rpc") || defaultRPC, assets: [] } this.preview = null this.isfetching = false if(this.state.data.application_id){ this.fetchAssets() } this.assetComponents = new Set() } updateWhenFetched(comp){ this.assetComponents.add(comp) } /** * * @param {InputText} setting */ onChange(setting, value){ let defaultSetting = RPCProps.find(e => e.id === setting.props.id) this.setState({ data: Object.assign(settingsRPC, this.state.data, { [defaultSetting.id]: !!value ? value : null }), assets: this.state.assets }) if(setting.props.id === "application_id"){ this.fetchAssets() } dataStore.setSettingGroup("rpc", settingsRPC); this.preview.forceUpdate() CustomRichPresence.set(settingsRPC) } fetchAssets(){ if(this.isfetching === true){ let app = this.state.data.application_id setTimeout(() => { if(this.state.data.application_id !== app){ return } this.fetchAssets() }, 5000); } if(!this.state.data.application_id){ this.setState({ data: this.state.data, assets: [] }) this.forceUpdate() this.assetComponents.forEach(e => e.forceUpdate()) return } this.isfetching = true CustomRichPresence.fetchAssets(this.state.data.application_id) .then(assets => { this.isfetching = false this.setState({ data: this.state.data, assets: Object.keys(assets).map(k => { let asset = assets[k] return { id: asset.id, name: asset.name, type: asset.type } }) }) this.forceUpdate() this.assetComponents.forEach(e => e.forceUpdate()) }).catch(() => { this.isfetching = false this.setState({ data: this.state.data, assets: [] }) this.forceUpdate() this.assetComponents.forEach(e => e.forceUpdate()) }) } updatePreview(data){ this.setState({ data }) } get modules(){ return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [ BDModules.get(e => e.contentColumn)[0], BDModules.get(e => e.marginBottom20)[0] ]) } render() { console.log("Rerendering rpc manager") let [ contentModule, marginModule ] = this.modules return (
{/** options */} {this.optionsComponents}
{/** preview */}
) } get optionsComponents(){ return this._optionsComponents || (this._optionsComponents = RPCProps.map(e => { if(e.type === "text"){ return }else if(e.type === "number"){ let array = []/* if(e.id === "timestamps.start"){ array.unshift( { DiscordNative.clipboard.copy(Date.now()+"") }} />) }*/ return array }else if(e.type === "choice"){ if(["assets.small", "assets.large"].includes(e.id)){ return { return { value: "asset-"+e.id, label: e.name } }))}/> }else{ return "Unknown choice." } } })) } } const RPCProps = [ { title: "Application ID", id: "application_id", type: "number", placeholder: "711416957718757418" }, { title: "Name", id: "name", type: "text", placeholder: "Lightcord" }, { title: "Details", id: "details", type: "text", placeholder: "Browsing Discord" }, { title: "State", id: "state", type: "text", placeholder: "Lightcord Client" }, { title: "Timestamp Start", id: "timestamps.start", type: "number", get placeholder(){ return Date.now() } }, { title: "LargeAsset", id: "assets.large", type: "choice" }, { title: "SmallAsset", id: "assets.small", type: "choice" }, ] let inputTextModules class InputText extends React.PureComponent { get modules(){ if(inputTextModules && inputTextModules[0])return inputTextModules return inputTextModules = [ BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], ] } constructor(props){ super(props) let setting = this.props.setting this.state = { data: this.props.manager.state.data[setting.id] } this.input = { this.setState({ data: value }) if(!this.lastEdited || this.lastEdited < Date.now() - 500){ this.props.manager.onChange(this, value) this.lastEdited = Date.now() }else if(!this.isTiming){ this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data) this.isTiming = null this.lastEdited = Date.now() }, 500); } }} type="text"/> } render(){ let setting = this.props.setting let [ rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, inputModule, sizeModule2, ] = this.modules return (
{setting.title}
{this.input}
) } } let InputNumberModules class InputNumber extends React.PureComponent { get modules(){ return InputNumberModules || (InputNumberModules = [ BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.inputMini)[0], BDModules.get(e => e.size16 && e.size20)[0], BDModules.get(e => e.colorTransparent)[0], ]) } constructor(props){ super(props) let setting = this.props.setting this.state = { data: this.props.manager.state.data[setting.id] } this.input = { value = value.replace(/[^\d]+/g, "") if(value == this.state.data){ input.setValue(value) return } if(!this.lastEdited || this.lastEdited < Date.now() - 500){ this.props.manager.onChange(this, value) this.lastEdited = Date.now() }else if(!this.isTiming){ this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data) this.isTiming = null this.lastEdited = Date.now() }, 500); } this.setState({ data: value }) }} type="text"/> } render(){ let setting = this.props.setting let [ rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule, ] = this.modules return (
{setting.title}
{this.input} {setting.id === "timestamps.start" ? { DiscordNative.clipboard.copy(Date.now()+"") }} color="brand"/> : null}
) } } let InputChoiceModules class InputChoice extends React.PureComponent { constructor(props){ super(props) let setting = this.props.setting this.state = { data: this.props.manager.state.data[setting.id] ? "asset-"+this.props.manager.state.data[setting.id] : "none" } this.props.manager.updateWhenFetched(this) } onChange(data){ let value = data.value if(!this.lastEdited || this.lastEdited < Date.now() - 500){ this.props.manager.onChange(this, value === "none" ? null : value.replace("asset-", "")) this.lastEdited = Date.now() }else if(!this.isTiming){ this.isTiming = setTimeout(() => { this.props.manager.onChange(this, this.state.data === "none" ? null : this.state.data.replace("asset-", "")) this.isTiming = null this.lastEdited = Date.now() }, 500); } this.setState({ data: value }) this.forceUpdate() } get modules(){ return InputChoiceModules || (InputChoiceModules = [ BDModules.get(e => e.removeKeybind)[0], BDModules.get(e => e.marginBottom20)[0], BDModules.get(e => e.defaultMarginh5)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e._horizontal)[0] ]) } render(){ let setting = this.props.setting let [ rowModule, marginModule, marginModule2, colorModule, sizeModule, flexModule ] = this.modules let options = this.props.manager.state.assets.map(e => { return { value: "asset-"+e.id, label: e.name } }) options.unshift({ value: "none", label: "No assets" }) return (
{setting.title}

{Messages.PINNED_MESSAGES_PRO_TIP}

{Messages.CONTEXT_MENU_HINT}
) } } let StatusModules class Status extends React.Component { get modules(){ return StatusModules || (StatusModules = [ BDModules.get(e => e.default && e.default.getPresence)[0], BDModules.get(e => e.pointerEvents)[0].pointerEvents ]) } render(){ let [ getPresence, pointerEvents ] = this.modules let status = getPresence.default.getPresence().status if(status === "invisible")status = "offline" return } } let timestampClass = "" let ProfileModules class Profile extends React.Component { get modules(){ return ProfileModules || (ProfileModules = [ BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages ]) } render(){ let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser() let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png") let [ flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages ] = this.modules let data = Object.assign({}, defaultRPC, this.props.preview.props.settings.state.data) timestampClass = timestampClass || activityModule1.timestamp let images = (() => { if(!data["assets.large"])return null let images = [] if(data["assets.large"]){ images.push() } if(data["assets.small"]){ images.push() } if(!images.length)return null return
{images}
})() return [
{user.username} #{user.discriminator}

{Messages.USER_ACTIVITY_HEADER_PLAYING}

{images}
{(() => { if(!data.name)return null return

{data.name}

})()} {(() => { if(!data.details)return null return
{data.details}
})()} {(() => { if(!data.state)return null return
{data.state}
})()} {(() => { if(!data["timestamps.start"])return null let timeComponent = timestampRender(Timestamp, Messages) return (
{React.createElement(timeComponent, { timestamps: { end: null, start: data["timestamps.start"] } })}
) })()}
{Messages.NOTE}
,
] } } class ConnectedAccounts extends React.Component { render(){ let accounts = [] let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0] let AccountModule1 = BDModules.get(e => e.default && e.default.getAccounts)[0].default let accs = AccountModule1.getAccounts().filter(e => e.visibility === 1) for(let acc of accs){ accounts.push() } if(accounts.length > 0){ return (
{accounts}
) } return null } } class ConnectedAccount extends React.Component { render(){ let [ flexModule1, stylingModule1, rootModule1, flowerModule1, anchorModule1, SocialConstants ] = [ BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.flowerStarContainer)[0], BDModules.get(e => e.anchor)[0], BDModules.get(e => e.default && e.default.get && e.default.map)[0].default ] let acc = this.props.acc let constantsSocial = SocialConstants.get(acc.type) return (
{`Logo
{acc.name}
{acc.verified ? (
) : null}
) } } class Badges extends React.Component { render(){ let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser() let rootModule = BDModules.get(e => e.topSectionStreaming)[0] let UserFlags = BDModules.get(e => e.UserFlags)[0].UserFlags let badges = [] let serialized = [] for(let flagName in UserFlags){ if(user.hasFlag(UserFlags[flagName]))serialized.push(flagName) } for(let flagName of serialized){ let searchable = `profileBadge${flagName.toLowerCase().replace(/_/g, " ").split(" ").map(e => e[0].toUpperCase()+e.slice(1)).join("")}` searchable = searchable.replace("HypesquadOnline", "HypeSquadOnline") if(!rootModule[searchable])continue badges.push() } if(user.hasPremiumSubscription){ badges.push() } return badges } } class Badge extends React.Component { render(){ let rootModule1 = BDModules.get(e => e.topSectionStreaming)[0] return (
) } } class Timestamp extends React.Component { render(){ return
{this.props.message}
} }