/**
* 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 ()
}
}
let DividerModules = []
class Divider extends React.PureComponent {
get modules(){
return DividerModules&&DividerModules[0] ? DividerModules : (DividerModules = [
BDModules.get(e => e.divider && Object.keys(e).length === 1)[0],
BDModules.get(e => e.dividerDefault)[0]
])
}
render(){
let [
divider,
dividerDefault
] = this.modules
return
}
}
class DiscordButton extends React.Component {
render(){
let rowModule = BDModules.get(e => e.removeKeybind)[0]
let marginModule = BDModules.get(e => e.marginBottom20)[0]
let flexModule = BDModules.get(e => e._horizontal)[0]
return ()
}
}
class RpcPreview extends React.Component {
constructor(props = {}){
super(props)
this.state = {
active: "profile"
}
this.tabs = []
this.props.settings.preview = this
}
changeTab(tab){
let ancientTab = this.state.active
if(ancientTab === tab.props.id)return
this.tabs.forEach(e => {
e.setActive(false)
})
tab.setActive(true)
this.setState({
active: tab.props.id
})
}
render(){
let preview = new this.preview({
preview: this
})
preview.setState(this.state.rpc)
return ()
}
isActive(tab){
return this.state.active === tab
}
get preview(){
if(this.state.active === "profile")return Profile
return Popout
}
}
class Tab extends React.Component {
constructor(props){
super(props)
this.state = {
active: props.preview.isActive(props.id)
}
props.preview.tabs.push(this)
}
setActive(isActive){
this.setState({
active: !!isActive
})
}
render(){
let className = `lc-navItem`
if(this.state.active){
className += ` lc-navItemActive`
}else{
className += ` lc-navItemInactive`
}
return ({
this.props.preview.changeTab(this)
}}>
{this.props.title}
)
}
}
let popoutModule
class Popout extends React.Component {
get modules(){
return popoutModule || (popoutModule = [
BDModules.get(e => e.userPopout)[0],
BDModules.get(e => e._horizontal)[0],
BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0],
BDModules.get(e => e.bot)[0],
BDModules.get(e => e.activityUserPopout)[0],
BDModules.get(e => e.muted && e.wrapper && e.base)[0],
BDModules.get(e => e.size32)[0],
BDModules.get(e => e.themeGhostHairlineChannels)[0],
BDModules.get(e => e.note && Object.keys(e).length === 1)[0],
BDModules.get(e => e.pro && e.inline)[0],
BDModules.get(e => e.colorStandard)[0],
BDModules.get(e => e.default && e.default.Messages)[0].default.Messages,
BDModules.get(e => e.pointerEvents)[0],
BDModules.get(e => e.default && e.default.getCurrentUser)[0].default
])
}
render(){
let [
rootModule1,
flexModule1,
stylingModule1,
nameTagModule1,
activityModule1,
textModule1,
sizeModule1,
scrollerModule1,
noteModule1,
protipModule1,
colorModule1,
Messages,
avatarModule1,
userModule1
] = this.modules
let user = userModule1.getCurrentUser()
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png")
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 ()
}
}
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 [
,
]
}
}
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 ()
}
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 (
{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}
}
}