add settings api, move everything to proposed manifest format

This commit is contained in:
Cynthia Foxwell 2018-05-14 06:42:48 -06:00
parent a46ddb6c23
commit e49c518ef3
12 changed files with 242 additions and 26 deletions

View file

@ -10,10 +10,10 @@ bdwatcher = null, bdtag = null, setupCSS = function (n) {
})) }))
}; };
exports.meta = { exports.manifest = {
author: "dr1ft", author: "dr1ft",
name: "BeautifulDiscord Port", name: "BeautifulDiscord Port",
desc: "Allows CSS to be imported and updated on the fly." description: "Allows CSS to be imported and updated on the fly."
}, },
exports.start = () => { exports.start = () => {
if (fs.existsSync($api.data + 'style.css')) if (fs.existsSync($api.data + 'style.css'))

View file

@ -16,10 +16,10 @@ function setupCharCount() {
} }
exports = { exports = {
meta: { manifest: {
author: "Cynosphere", author: "Cynosphere",
name: "Character Counter", name: "Character Counter",
desc: "Counts characters in the chatbox." description: "Counts characters in the chatbox."
}, },
start: function(){ start: function(){
let charcount_mo = new MutationObserver(setupCharCount); let charcount_mo = new MutationObserver(setupCharCount);

View file

@ -1,7 +1,7 @@
exports.meta = { exports.manifest = {
author: "Cynosphere, Jiiks", author: "Cynosphere, Jiiks",
name: "Double Click Edit", name: "Double Click Edit",
desc: "Double click messages to edit them." description: "Double click messages to edit them."
} }
exports.start = function(){ exports.start = function(){
document.addEventListener("dblclick", ev => { document.addEventListener("dblclick", ev => {

View file

@ -1,14 +1,13 @@
exportsexports = { exportsexports = {
meta: { manifest: {
author: "Cynosphere, Adryd", author: "Cynosphere, Adryd",
name: "Mentions Fixer", name: "Mentions Fixer",
desc: "See hidden channel mentions and remove #deleted-channel." description: "See hidden channel mentions and remove #deleted-channel."
}, },
replacements: { replacements: {
'/t\\.type===(.+)\\.ChannelTypes\\.GUILD_TEXT&&(.+)\\.default\\.can\\((.+)\\.Permissions\\.VIEW_CHANNEL,n,t\\)/':'true', '/t\\.type===(.+)\\.ChannelTypes\\.GUILD_TEXT&&(.+)\\.default\\.can\\((.+)\\.Permissions\\.VIEW_CHANNEL,n,t\\)/':'true',
'/"#deleted-channel"/':'"<#"+e[1]+">"', '/"#deleted-channel"/':'"<#"+e[1]+">"',
'/"@deleted-role"/':'"<@&"+e[1]+">"', '/"@deleted-role"/':'"<@&"+e[1]+">"',
'/guildId:null!=t\\?t\\.guild_id:null,/':'guildId:null!=t.guild_id?t.guild_id:"@me",', '/guildId:null!=t\\?t\\.guild_id:null,/':'guildId:null!=t.guild_id?t.guild_id:"@me",'
'/"#deleted-channel"/':'"<#"+e[1]+">"'
} }
} }

View file

@ -39,10 +39,10 @@ function scCSS() {
document.body.appendChild(css); document.body.appendChild(css);
} }
exports.meta = { exports.manifest = {
author: "Cynosphere", author: "Cynosphere",
name: "Guild Count", name: "Guild Count",
desc: "Shows guild count under online count." description: "Shows guild count under online count."
} }
exports.start = () => { exports.start = () => {
scCSS(); scCSS();

View file

@ -3,10 +3,10 @@ IMGXIS made by YellowAfterlife. http://yellowafterlife.itch.io/imgxis (mirror: h
Ported by Jane (maybejane/statefram) and Cynthia (BoxOfFlex/Cynosphere) to a private client mod. Ported by Jane (maybejane/statefram) and Cynthia (BoxOfFlex/Cynosphere) to a private client mod.
Re-ported by Cynthia to EndPwn. Re-ported by Cynthia to EndPwn.
*/ */
exports.meta = { exports.manifest = {
author: "Cynosphere, YellowAfterlife", author: "Cynosphere, YellowAfterlife",
name: "IMGXIS", name: "IMGXIS",
desc: "A better way to view images." description: "A better way to view images."
} }
exports.start = function(){ exports.start = function(){
var globalPanner; var globalPanner;

View file

@ -1,8 +1,8 @@
exports = { exports = {
meta: { manifest: {
author: "Cynosphere, Adryd", author: "Cynosphere",
name: "Restore Local Storage", name: "Restore Local Storage",
desc: "Restore window.localStorage." description: "Restore window.localStorage."
}, },
replacements: { replacements: {
'try{delete window.localStorage}catch(e){}':'' 'try{delete window.localStorage}catch(e){}':''

View file

@ -1,7 +1,7 @@
exports.meta = { exports.manifest = {
author: "dr1ft", author: "dr1ft",
name: "Notification Sound Replacer", name: "Notification Sound Replacer",
desc: "Replaces notification sound with an unused sound thats nicer." description: "Replaces notification sound with an unused sound thats nicer."
} }
exports.start = function(){ exports.start = function(){
var s = wc.findFunc('playSound')[1].exports; var s = wc.findFunc('playSound')[1].exports;

View file

@ -1,8 +1,8 @@
exportsexports = { exportsexports = {
meta: { manifest: {
author: "Cynosphere, janeptrv", author: "Cynosphere, janeptrv",
name: "osu! Typing", name: "osu! Typing",
desc: "Adds typing sounds from osu!." description: "Adds typing sounds from osu!."
}, },
start: function(){ start: function(){
var sounds = []; var sounds = [];

View file

@ -1,7 +1,7 @@
exports.meta = { exports.manifest = {
author: "BlockBuilder57, Cynosphere", author: "Adryd, BlockBuilder57, Cynosphere",
name: "Sailboat", name: "Sailboat",
desc: "Login as bot accounts." description: "Login as bot accounts."
} }
exports.replacements = { exports.replacements = {
'/i.default.Store.pauseEmittingChanges\\(\\),t.user.bot/':'false', '/i.default.Store.pauseEmittingChanges\\(\\),t.user.bot/':'false',

217
plugins/settingsapi.js Normal file
View file

@ -0,0 +1,217 @@
//Stolen from StackOverflow :^)
let convertToText = function(obj) {
var string = [];
if (obj == undefined) {
return String(obj);
} else if (typeof(obj) == "object" && (obj.join == undefined)) {
for (prop in obj) {
if (obj.hasOwnProperty(prop))
string.push(prop + ": " + convertToText(obj[prop]));
};
return "{" + string.join(",") + "}";
} else if (typeof(obj) == "object" && !(obj.join == undefined)) {
for(prop in obj) {
string.push(convertToText(obj[prop]));
}
return "[" + string.join(",") + "]";
} else if (typeof(obj) == "function") {
string.push(obj.toString())
} else {
string.push(JSON.stringify(obj))
}
return string.join(",");
}
exports = {
manifest: {
author: "Cynosphere, BlockBuilder57",
name: "Settings API",
description: "Hijack the settings menu in any way you feel."
},
replacements: {
'/function z\\(\\){return\\[{(.+)}]}/':'window.$settingsapi={sections:[{$1}]};function z(){return window.$settingsapi.sections;}',
},
start: function(){
var buttons = $api.util.findFuncExports('button-', 'colorBlack');
var checkboxes = $api.util.findFuncExports('checkboxEnabled');
var misc = $api.util.findFuncExports('statusRed-', 'inputDefault');
var misc2 = $api.util.findFuncExports('multiInputField');
var headers = $api.util.findFuncExports('h5-', 'h5');
var panels = wc.findFunc('flexChild-')[0].exports;
var panels2 = $api.util.findFuncExports('errorMessage-', 'inputWrapper');
let sections = window.$settingsapi.sections;
window.$settingsapi = {
sections: sections,
ourSections: [],
_callbacks: {},
_panels: {},
addSection: function(name,label,callback,color){
let data = {};
data.section = name || `SAPI_${Math.floor(Math.random()*10000)}`;
data.label = label;
data.color = color || undefined;
data.element = $api.util.findConstructor('FormSection', 'FormSection').FormSection;
$settingsapi.ourSections.push(data);
$settingsapi.sections.splice($settingsapi.sections.length-4,0,data);
$settingsapi._callbacks[name] = callback;
},
exportSections: function(){
let out = "";
for(i in $settingsapi._sections){
out = out + convertToText($settingsapi._sections[i]);
}
return out;
},
//All of these allow us to use Discord's elements.
elements: {
createVerticalPanel: function() {
return createElement("div")
.withClass(panels2.vertical, 'epButtonPanel')
},
createHorizontalPanel: function() {
return createElement("div")
.withClass(panels.horizontal, 'epButtonPanel')
},
createButton: function(name) {
return createElement('button')
.withContents(name)
.withClass(
buttons.button,
buttons.lookFilled,
buttons.colorBrand,
buttons.sizeSmall,
buttons.grow,
'epMargin'
);
},
createWarnButton: function(name) {
return createElement('button')
.withContents(name)
.withClass(
buttons.button,
buttons.lookOutlined,
buttons.colorYellow,
buttons.sizeSmall,
buttons.grow,
'epMargin'
);
},
createDangerButton: function(name) {
return createElement('button')
.withContents(name)
.withClass(
buttons.button,
buttons.lookOutlined,
buttons.colorRed,
buttons.sizeSmall,
buttons.grow,
'epMargin'
);
},
createH2: function(text) {
return createElement("h2")
.withClass(
headers.h2,
headers.title,
headers.size16,
headers.height20,
headers.weightSemiBold,
headers.defaultColor,
'epMargin'
)
.withText(text);
},
createH5: function(text) {
return createElement("h5")
.withClass(
headers.h5,
headers.title,
headers.size12,
headers.height16,
headers.weightSemiBold
)
.withText(text);
},
createInput: function(v) {
return createElement("input")
.withClass(
misc.inputDefault,
misc.input,
misc.size16,
'epMargin'
)
.modify(x => x.value = v)
},
updateSwitch: function(s, w) {
if (s.checked) {
w.classList.remove(checkboxes.valueUnchecked.split(' ')[0]);
w.classList.add(checkboxes.valueChecked.split(' ')[0])
}
else {
w.classList.remove(checkboxes.valueChecked.split(' ')[0]);
w.classList.add(checkboxes.valueUnchecked.split(' ')[0])
}
},
createSwitch: function(c, i) {
if (c === undefined) c = () => { };
if (i === undefined) i = false;
var s, w = createElement('div')
.withClass(
checkboxes.switch,
checkboxes.switchEnabled,
checkboxes.size,
checkboxes.sizeDefault,
checkboxes.themeDefault
)
.withChildren(
s = createElement("input")
.withClass(
checkboxes.checkbox,
checkboxes.checkboxEnabled
)
.modify(x => x.type = 'checkbox')
.modify(x => x.checked = i)
.modify(x => x.onchange = () => {
updateSwitch(s, w);
c(s.checked);
})
)
$settingsapi.elements.updateSwitch(s, w);
return w;
}
}
}
//Example settings tab
/*$settingsapi.addSection("TESTING","test owo",function(pnl){
$settingsapi.elements.createH2("Hello World!").appendTo(pnl);
});*/
$api.events.hook("USER_SETTINGS_MODAL_SET_SECTION", function(e){
if ($settingsapi._panels[e.section]) $settingsapi._panels[e.section].remove();
for(let i in $settingsapi.ourSections){
let data = $settingsapi.ourSections[i];
if(e.section == data.section){
var pane = $(".content-column.default");
if (!pane) return;
$settingsapi._panels[data.section] = createElement('div')
.withClass('flex-vertical')
.appendTo(pane);
$settingsapi._callbacks[data.section]($settingsapi._panels[data.section]);
}
}
});
}
}

View file

@ -1,8 +1,8 @@
exports = { exports = {
meta: { manifest: {
author: "Cynosphere", author: "Cynosphere",
name: "Spotify Premium Spoof", name: "Spotify Premium Spoof",
desc: "Spoofs premium check and allows listen along without premium." description: "Spoofs premium check and allows listen along without premium."
}, },
replacements: { replacements: {
'r.isPremium=n':'r.isPremium=true' 'r.isPremium=n':'r.isPremium=true'