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",
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 = () => {
if (fs.existsSync($api.data + 'style.css'))

View File

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

View File

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

View File

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

View File

@ -39,10 +39,10 @@ function scCSS() {
document.body.appendChild(css);
}
exports.meta = {
exports.manifest = {
author: "Cynosphere",
name: "Guild Count",
desc: "Shows guild count under online count."
description: "Shows guild count under online count."
}
exports.start = () => {
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.
Re-ported by Cynthia to EndPwn.
*/
exports.meta = {
exports.manifest = {
author: "Cynosphere, YellowAfterlife",
name: "IMGXIS",
desc: "A better way to view images."
description: "A better way to view images."
}
exports.start = function(){
var globalPanner;

View File

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

View File

@ -1,7 +1,7 @@
exports.meta = {
exports.manifest = {
author: "dr1ft",
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(){
var s = wc.findFunc('playSound')[1].exports;

View File

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

View File

@ -1,7 +1,7 @@
exports.meta = {
author: "BlockBuilder57, Cynosphere",
exports.manifest = {
author: "Adryd, BlockBuilder57, Cynosphere",
name: "Sailboat",
desc: "Login as bot accounts."
description: "Login as bot accounts."
}
exports.replacements = {
'/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 = {
meta: {
manifest: {
author: "Cynosphere",
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: {
'r.isPremium=n':'r.isPremium=true'