您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
the best client mod for blacket.
// ==UserScript== // @name BetterBlacket // @description the best client mod for blacket. // @version 3.0.8.5 // @icon https://blacket.org/content/logo.png // @author Death / VillainsRule // @namespace https://bb.villainsrule.xyz // @match *://blacket.org/* // @match *://blacket.xotic.org/* // @match *://blacket.monkxy.com/* // @match *://dashboard.iblooket.com/* // @match *://b.blooketis.life/* // @match *://b.fart.services/* // @grant none // @run-at document-start // ==/UserScript== /* eslint-disable */ var __defProp = Object.defineProperty; var __typeError = (msg) => { throw TypeError(msg); }; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); var _subscriptions; function bind(fn, thisArg) { return function wrap() { return fn.apply(thisArg, arguments); }; } const { toString } = Object.prototype; const { getPrototypeOf } = Object; const { iterator, toStringTag } = Symbol; const kindOf = /* @__PURE__ */ ((cache) => (thing) => { const str = toString.call(thing); return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase()); })(/* @__PURE__ */ Object.create(null)); const kindOfTest = (type) => { type = type.toLowerCase(); return (thing) => kindOf(thing) === type; }; const typeOfTest = (type) => (thing) => typeof thing === type; const { isArray } = Array; const isUndefined = typeOfTest("undefined"); function isBuffer(val) { return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor) && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val); } const isArrayBuffer = kindOfTest("ArrayBuffer"); function isArrayBufferView(val) { let result; if (typeof ArrayBuffer !== "undefined" && ArrayBuffer.isView) { result = ArrayBuffer.isView(val); } else { result = val && val.buffer && isArrayBuffer(val.buffer); } return result; } const isString = typeOfTest("string"); const isFunction = typeOfTest("function"); const isNumber = typeOfTest("number"); const isObject = (thing) => thing !== null && typeof thing === "object"; const isBoolean = (thing) => thing === true || thing === false; const isPlainObject = (val) => { if (kindOf(val) !== "object") { return false; } const prototype2 = getPrototypeOf(val); return (prototype2 === null || prototype2 === Object.prototype || Object.getPrototypeOf(prototype2) === null) && !(toStringTag in val) && !(iterator in val); }; const isDate = kindOfTest("Date"); const isFile = kindOfTest("File"); const isBlob = kindOfTest("Blob"); const isFileList = kindOfTest("FileList"); const isStream = (val) => isObject(val) && isFunction(val.pipe); const isFormData = (thing) => { let kind; return thing && (typeof FormData === "function" && thing instanceof FormData || isFunction(thing.append) && ((kind = kindOf(thing)) === "formdata" || // detect form-data instance kind === "object" && isFunction(thing.toString) && thing.toString() === "[object FormData]")); }; const isURLSearchParams = kindOfTest("URLSearchParams"); const [isReadableStream, isRequest, isResponse, isHeaders] = ["ReadableStream", "Request", "Response", "Headers"].map(kindOfTest); const trim = (str) => str.trim ? str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ""); function forEach(obj, fn, { allOwnKeys = false } = {}) { if (obj === null || typeof obj === "undefined") { return; } let i; let l; if (typeof obj !== "object") { obj = [obj]; } if (isArray(obj)) { for (i = 0, l = obj.length; i < l; i++) { fn.call(null, obj[i], i, obj); } } else { const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj); const len = keys.length; let key; for (i = 0; i < len; i++) { key = keys[i]; fn.call(null, obj[key], key, obj); } } } function findKey(obj, key) { key = key.toLowerCase(); const keys = Object.keys(obj); let i = keys.length; let _key; while (i-- > 0) { _key = keys[i]; if (key === _key.toLowerCase()) { return _key; } } return null; } const _global = (() => { if (typeof globalThis !== "undefined") return globalThis; return typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : global; })(); const isContextDefined = (context) => !isUndefined(context) && context !== _global; function merge() { const { caseless } = isContextDefined(this) && this || {}; const result = {}; const assignValue = (val, key) => { const targetKey = caseless && findKey(result, key) || key; if (isPlainObject(result[targetKey]) && isPlainObject(val)) { result[targetKey] = merge(result[targetKey], val); } else if (isPlainObject(val)) { result[targetKey] = merge({}, val); } else if (isArray(val)) { result[targetKey] = val.slice(); } else { result[targetKey] = val; } }; for (let i = 0, l = arguments.length; i < l; i++) { arguments[i] && forEach(arguments[i], assignValue); } return result; } const extend = (a, b, thisArg, { allOwnKeys } = {}) => { forEach(b, (val, key) => { if (thisArg && isFunction(val)) { a[key] = bind(val, thisArg); } else { a[key] = val; } }, { allOwnKeys }); return a; }; const stripBOM = (content) => { if (content.charCodeAt(0) === 65279) { content = content.slice(1); } return content; }; const inherits = (constructor, superConstructor, props, descriptors2) => { constructor.prototype = Object.create(superConstructor.prototype, descriptors2); constructor.prototype.constructor = constructor; Object.defineProperty(constructor, "super", { value: superConstructor.prototype }); props && Object.assign(constructor.prototype, props); }; const toFlatObject = (sourceObj, destObj, filter2, propFilter) => { let props; let i; let prop; const merged = {}; destObj = destObj || {}; if (sourceObj == null) return destObj; do { props = Object.getOwnPropertyNames(sourceObj); i = props.length; while (i-- > 0) { prop = props[i]; if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) { destObj[prop] = sourceObj[prop]; merged[prop] = true; } } sourceObj = filter2 !== false && getPrototypeOf(sourceObj); } while (sourceObj && (!filter2 || filter2(sourceObj, destObj)) && sourceObj !== Object.prototype); return destObj; }; const endsWith = (str, searchString, position) => { str = String(str); if (position === void 0 || position > str.length) { position = str.length; } position -= searchString.length; const lastIndex = str.indexOf(searchString, position); return lastIndex !== -1 && lastIndex === position; }; const toArray = (thing) => { if (!thing) return null; if (isArray(thing)) return thing; let i = thing.length; if (!isNumber(i)) return null; const arr = new Array(i); while (i-- > 0) { arr[i] = thing[i]; } return arr; }; const isTypedArray = /* @__PURE__ */ ((TypedArray) => { return (thing) => { return TypedArray && thing instanceof TypedArray; }; })(typeof Uint8Array !== "undefined" && getPrototypeOf(Uint8Array)); const forEachEntry = (obj, fn) => { const generator = obj && obj[iterator]; const _iterator = generator.call(obj); let result; while ((result = _iterator.next()) && !result.done) { const pair = result.value; fn.call(obj, pair[0], pair[1]); } }; const matchAll = (regExp, str) => { let matches; const arr = []; while ((matches = regExp.exec(str)) !== null) { arr.push(matches); } return arr; }; const isHTMLForm = kindOfTest("HTMLFormElement"); const toCamelCase = (str) => { return str.toLowerCase().replace( /[-_\s]([a-z\d])(\w*)/g, function replacer(m, p1, p2) { return p1.toUpperCase() + p2; } ); }; const hasOwnProperty = (({ hasOwnProperty: hasOwnProperty2 }) => (obj, prop) => hasOwnProperty2.call(obj, prop))(Object.prototype); const isRegExp = kindOfTest("RegExp"); const reduceDescriptors = (obj, reducer) => { const descriptors2 = Object.getOwnPropertyDescriptors(obj); const reducedDescriptors = {}; forEach(descriptors2, (descriptor, name) => { let ret; if ((ret = reducer(descriptor, name, obj)) !== false) { reducedDescriptors[name] = ret || descriptor; } }); Object.defineProperties(obj, reducedDescriptors); }; const freezeMethods = (obj) => { reduceDescriptors(obj, (descriptor, name) => { if (isFunction(obj) && ["arguments", "caller", "callee"].indexOf(name) !== -1) { return false; } const value = obj[name]; if (!isFunction(value)) return; descriptor.enumerable = false; if ("writable" in descriptor) { descriptor.writable = false; return; } if (!descriptor.set) { descriptor.set = () => { throw Error("Can not rewrite read-only method '" + name + "'"); }; } }); }; const toObjectSet = (arrayOrString, delimiter) => { const obj = {}; const define = (arr) => { arr.forEach((value) => { obj[value] = true; }); }; isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter)); return obj; }; const noop = () => { }; const toFiniteNumber = (value, defaultValue) => { return value != null && Number.isFinite(value = +value) ? value : defaultValue; }; function isSpecCompliantForm(thing) { return !!(thing && isFunction(thing.append) && thing[toStringTag] === "FormData" && thing[iterator]); } const toJSONObject = (obj) => { const stack = new Array(10); const visit = (source, i) => { if (isObject(source)) { if (stack.indexOf(source) >= 0) { return; } if (!("toJSON" in source)) { stack[i] = source; const target = isArray(source) ? [] : {}; forEach(source, (value, key) => { const reducedValue = visit(value, i + 1); !isUndefined(reducedValue) && (target[key] = reducedValue); }); stack[i] = void 0; return target; } } return source; }; return visit(obj, 0); }; const isAsyncFn = kindOfTest("AsyncFunction"); const isThenable = (thing) => thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch); const _setImmediate = ((setImmediateSupported, postMessageSupported) => { if (setImmediateSupported) { return setImmediate; } return postMessageSupported ? ((token, callbacks) => { _global.addEventListener("message", ({ source, data }) => { if (source === _global && data === token) { callbacks.length && callbacks.shift()(); } }, false); return (cb) => { callbacks.push(cb); _global.postMessage(token, "*"); }; })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb); })( typeof setImmediate === "function", isFunction(_global.postMessage) ); const asap = typeof queueMicrotask !== "undefined" ? queueMicrotask.bind(_global) : typeof process !== "undefined" && process.nextTick || _setImmediate; const isIterable = (thing) => thing != null && isFunction(thing[iterator]); const utils$1 = { isArray, isArrayBuffer, isBuffer, isFormData, isArrayBufferView, isString, isNumber, isBoolean, isObject, isPlainObject, isReadableStream, isRequest, isResponse, isHeaders, isUndefined, isDate, isFile, isBlob, isRegExp, isFunction, isStream, isURLSearchParams, isTypedArray, isFileList, forEach, merge, extend, trim, stripBOM, inherits, toFlatObject, kindOf, kindOfTest, endsWith, toArray, forEachEntry, matchAll, isHTMLForm, hasOwnProperty, hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection reduceDescriptors, freezeMethods, toObjectSet, toCamelCase, noop, toFiniteNumber, findKey, global: _global, isContextDefined, isSpecCompliantForm, toJSONObject, isAsyncFn, isThenable, setImmediate: _setImmediate, asap, isIterable }; function AxiosError$1(message, code, config, request, response) { Error.call(this); if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } else { this.stack = new Error().stack; } this.message = message; this.name = "AxiosError"; code && (this.code = code); config && (this.config = config); request && (this.request = request); if (response) { this.response = response; this.status = response.status ? response.status : null; } } utils$1.inherits(AxiosError$1, Error, { toJSON: function toJSON() { return { // Standard message: this.message, name: this.name, // Microsoft description: this.description, number: this.number, // Mozilla fileName: this.fileName, lineNumber: this.lineNumber, columnNumber: this.columnNumber, stack: this.stack, // Axios config: utils$1.toJSONObject(this.config), code: this.code, status: this.status }; } }); const prototype$1 = AxiosError$1.prototype; const descriptors = {}; [ "ERR_BAD_OPTION_VALUE", "ERR_BAD_OPTION", "ECONNABORTED", "ETIMEDOUT", "ERR_NETWORK", "ERR_FR_TOO_MANY_REDIRECTS", "ERR_DEPRECATED", "ERR_BAD_RESPONSE", "ERR_BAD_REQUEST", "ERR_CANCELED", "ERR_NOT_SUPPORT", "ERR_INVALID_URL" // eslint-disable-next-line func-names ].forEach((code) => { descriptors[code] = { value: code }; }); Object.defineProperties(AxiosError$1, descriptors); Object.defineProperty(prototype$1, "isAxiosError", { value: true }); AxiosError$1.from = (error, code, config, request, response, customProps) => { const axiosError = Object.create(prototype$1); utils$1.toFlatObject(error, axiosError, function filter2(obj) { return obj !== Error.prototype; }, (prop) => { return prop !== "isAxiosError"; }); AxiosError$1.call(axiosError, error.message, code, config, request, response); axiosError.cause = error; axiosError.name = error.name; customProps && Object.assign(axiosError, customProps); return axiosError; }; const httpAdapter = null; function isVisitable(thing) { return utils$1.isPlainObject(thing) || utils$1.isArray(thing); } function removeBrackets(key) { return utils$1.endsWith(key, "[]") ? key.slice(0, -2) : key; } function renderKey(path, key, dots) { if (!path) return key; return path.concat(key).map(function each(token, i) { token = removeBrackets(token); return !dots && i ? "[" + token + "]" : token; }).join(dots ? "." : ""); } function isFlatArray(arr) { return utils$1.isArray(arr) && !arr.some(isVisitable); } const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { return /^is[A-Z]/.test(prop); }); function toFormData$1(obj, formData, options) { if (!utils$1.isObject(obj)) { throw new TypeError("target must be an object"); } formData = formData || new FormData(); options = utils$1.toFlatObject(options, { metaTokens: true, dots: false, indexes: false }, false, function defined(option, source) { return !utils$1.isUndefined(source[option]); }); const metaTokens = options.metaTokens; const visitor = options.visitor || defaultVisitor; const dots = options.dots; const indexes = options.indexes; const _Blob = options.Blob || typeof Blob !== "undefined" && Blob; const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); if (!utils$1.isFunction(visitor)) { throw new TypeError("visitor must be a function"); } function convertValue(value) { if (value === null) return ""; if (utils$1.isDate(value)) { return value.toISOString(); } if (!useBlob && utils$1.isBlob(value)) { throw new AxiosError$1("Blob is not supported. Use a Buffer instead."); } if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { return useBlob && typeof Blob === "function" ? new Blob([value]) : Buffer.from(value); } return value; } function defaultVisitor(value, key, path) { let arr = value; if (value && !path && typeof value === "object") { if (utils$1.endsWith(key, "{}")) { key = metaTokens ? key : key.slice(0, -2); value = JSON.stringify(value); } else if (utils$1.isArray(value) && isFlatArray(value) || (utils$1.isFileList(value) || utils$1.endsWith(key, "[]")) && (arr = utils$1.toArray(value))) { key = removeBrackets(key); arr.forEach(function each(el, index2) { !(utils$1.isUndefined(el) || el === null) && formData.append( // eslint-disable-next-line no-nested-ternary indexes === true ? renderKey([key], index2, dots) : indexes === null ? key : key + "[]", convertValue(el) ); }); return false; } } if (isVisitable(value)) { return true; } formData.append(renderKey(path, key, dots), convertValue(value)); return false; } const stack = []; const exposedHelpers = Object.assign(predicates, { defaultVisitor, convertValue, isVisitable }); function build(value, path) { if (utils$1.isUndefined(value)) return; if (stack.indexOf(value) !== -1) { throw Error("Circular reference detected in " + path.join(".")); } stack.push(value); utils$1.forEach(value, function each(el, key) { const result = !(utils$1.isUndefined(el) || el === null) && visitor.call( formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers ); if (result === true) { build(el, path ? path.concat(key) : [key]); } }); stack.pop(); } if (!utils$1.isObject(obj)) { throw new TypeError("data must be an object"); } build(obj); return formData; } function encode$1(str) { const charMap = { "!": "%21", "'": "%27", "(": "%28", ")": "%29", "~": "%7E", "%20": "+", "%00": "\0" }; return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) { return charMap[match]; }); } function AxiosURLSearchParams(params, options) { this._pairs = []; params && toFormData$1(params, this, options); } const prototype = AxiosURLSearchParams.prototype; prototype.append = function append(name, value) { this._pairs.push([name, value]); }; prototype.toString = function toString2(encoder) { const _encode = encoder ? function(value) { return encoder.call(this, value, encode$1); } : encode$1; return this._pairs.map(function each(pair) { return _encode(pair[0]) + "=" + _encode(pair[1]); }, "").join("&"); }; function encode(val) { return encodeURIComponent(val).replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",").replace(/%20/g, "+").replace(/%5B/gi, "[").replace(/%5D/gi, "]"); } function buildURL(url, params, options) { if (!params) { return url; } const _encode = options && options.encode || encode; if (utils$1.isFunction(options)) { options = { serialize: options }; } const serializeFn = options && options.serialize; let serializedParams; if (serializeFn) { serializedParams = serializeFn(params, options); } else { serializedParams = utils$1.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode); } if (serializedParams) { const hashmarkIndex = url.indexOf("#"); if (hashmarkIndex !== -1) { url = url.slice(0, hashmarkIndex); } url += (url.indexOf("?") === -1 ? "?" : "&") + serializedParams; } return url; } class InterceptorManager { constructor() { this.handlers = []; } /** * Add a new interceptor to the stack * * @param {Function} fulfilled The function to handle `then` for a `Promise` * @param {Function} rejected The function to handle `reject` for a `Promise` * * @return {Number} An ID used to remove interceptor later */ use(fulfilled, rejected, options) { this.handlers.push({ fulfilled, rejected, synchronous: options ? options.synchronous : false, runWhen: options ? options.runWhen : null }); return this.handlers.length - 1; } /** * Remove an interceptor from the stack * * @param {Number} id The ID that was returned by `use` * * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise */ eject(id2) { if (this.handlers[id2]) { this.handlers[id2] = null; } } /** * Clear all interceptors from the stack * * @returns {void} */ clear() { if (this.handlers) { this.handlers = []; } } /** * Iterate over all the registered interceptors * * This method is particularly useful for skipping over any * interceptors that may have become `null` calling `eject`. * * @param {Function} fn The function to call for each interceptor * * @returns {void} */ forEach(fn) { utils$1.forEach(this.handlers, function forEachHandler(h) { if (h !== null) { fn(h); } }); } } const transitionalDefaults = { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }; const URLSearchParams$1 = typeof URLSearchParams !== "undefined" ? URLSearchParams : AxiosURLSearchParams; const FormData$1 = typeof FormData !== "undefined" ? FormData : null; const Blob$1 = typeof Blob !== "undefined" ? Blob : null; const platform$1 = { isBrowser: true, classes: { URLSearchParams: URLSearchParams$1, FormData: FormData$1, Blob: Blob$1 }, protocols: ["http", "https", "file", "blob", "url", "data"] }; const hasBrowserEnv = typeof window !== "undefined" && typeof document !== "undefined"; const _navigator = typeof navigator === "object" && navigator || void 0; const hasStandardBrowserEnv = hasBrowserEnv && (!_navigator || ["ReactNative", "NativeScript", "NS"].indexOf(_navigator.product) < 0); const hasStandardBrowserWebWorkerEnv = (() => { return typeof WorkerGlobalScope !== "undefined" && // eslint-disable-next-line no-undef self instanceof WorkerGlobalScope && typeof self.importScripts === "function"; })(); const origin = hasBrowserEnv && window.location.href || "http://localhost"; const utils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, hasBrowserEnv, hasStandardBrowserEnv, hasStandardBrowserWebWorkerEnv, navigator: _navigator, origin }, Symbol.toStringTag, { value: "Module" })); const platform = { ...utils, ...platform$1 }; function toURLEncodedForm(data, options) { return toFormData$1(data, new platform.classes.URLSearchParams(), Object.assign({ visitor: function(value, key, path, helpers) { if (platform.isNode && utils$1.isBuffer(value)) { this.append(key, value.toString("base64")); return false; } return helpers.defaultVisitor.apply(this, arguments); } }, options)); } function parsePropPath(name) { return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map((match) => { return match[0] === "[]" ? "" : match[1] || match[0]; }); } function arrayToObject(arr) { const obj = {}; const keys = Object.keys(arr); let i; const len = keys.length; let key; for (i = 0; i < len; i++) { key = keys[i]; obj[key] = arr[key]; } return obj; } function formDataToJSON(formData) { function buildPath(path, value, target, index2) { let name = path[index2++]; if (name === "__proto__") return true; const isNumericKey = Number.isFinite(+name); const isLast = index2 >= path.length; name = !name && utils$1.isArray(target) ? target.length : name; if (isLast) { if (utils$1.hasOwnProp(target, name)) { target[name] = [target[name], value]; } else { target[name] = value; } return !isNumericKey; } if (!target[name] || !utils$1.isObject(target[name])) { target[name] = []; } const result = buildPath(path, value, target[name], index2); if (result && utils$1.isArray(target[name])) { target[name] = arrayToObject(target[name]); } return !isNumericKey; } if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { const obj = {}; utils$1.forEachEntry(formData, (name, value) => { buildPath(parsePropPath(name), value, obj, 0); }); return obj; } return null; } function stringifySafely(rawValue, parser, encoder) { if (utils$1.isString(rawValue)) { try { (parser || JSON.parse)(rawValue); return utils$1.trim(rawValue); } catch (e) { if (e.name !== "SyntaxError") { throw e; } } } return (encoder || JSON.stringify)(rawValue); } const defaults = { transitional: transitionalDefaults, adapter: ["xhr", "http", "fetch"], transformRequest: [function transformRequest(data, headers) { const contentType = headers.getContentType() || ""; const hasJSONContentType = contentType.indexOf("application/json") > -1; const isObjectPayload = utils$1.isObject(data); if (isObjectPayload && utils$1.isHTMLForm(data)) { data = new FormData(data); } const isFormData2 = utils$1.isFormData(data); if (isFormData2) { return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data; } if (utils$1.isArrayBuffer(data) || utils$1.isBuffer(data) || utils$1.isStream(data) || utils$1.isFile(data) || utils$1.isBlob(data) || utils$1.isReadableStream(data)) { return data; } if (utils$1.isArrayBufferView(data)) { return data.buffer; } if (utils$1.isURLSearchParams(data)) { headers.setContentType("application/x-www-form-urlencoded;charset=utf-8", false); return data.toString(); } let isFileList2; if (isObjectPayload) { if (contentType.indexOf("application/x-www-form-urlencoded") > -1) { return toURLEncodedForm(data, this.formSerializer).toString(); } if ((isFileList2 = utils$1.isFileList(data)) || contentType.indexOf("multipart/form-data") > -1) { const _FormData = this.env && this.env.FormData; return toFormData$1( isFileList2 ? { "files[]": data } : data, _FormData && new _FormData(), this.formSerializer ); } } if (isObjectPayload || hasJSONContentType) { headers.setContentType("application/json", false); return stringifySafely(data); } return data; }], transformResponse: [function transformResponse(data) { const transitional2 = this.transitional || defaults.transitional; const forcedJSONParsing = transitional2 && transitional2.forcedJSONParsing; const JSONRequested = this.responseType === "json"; if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) { return data; } if (data && utils$1.isString(data) && (forcedJSONParsing && !this.responseType || JSONRequested)) { const silentJSONParsing = transitional2 && transitional2.silentJSONParsing; const strictJSONParsing = !silentJSONParsing && JSONRequested; try { return JSON.parse(data); } catch (e) { if (strictJSONParsing) { if (e.name === "SyntaxError") { throw AxiosError$1.from(e, AxiosError$1.ERR_BAD_RESPONSE, this, null, this.response); } throw e; } } } return data; }], /** * A timeout in milliseconds to abort a request. If set to 0 (default) a * timeout is not created. */ timeout: 0, xsrfCookieName: "XSRF-TOKEN", xsrfHeaderName: "X-XSRF-TOKEN", maxContentLength: -1, maxBodyLength: -1, env: { FormData: platform.classes.FormData, Blob: platform.classes.Blob }, validateStatus: function validateStatus(status) { return status >= 200 && status < 300; }, headers: { common: { "Accept": "application/json, text/plain, */*", "Content-Type": void 0 } } }; utils$1.forEach(["delete", "get", "head", "post", "put", "patch"], (method) => { defaults.headers[method] = {}; }); const ignoreDuplicateOf = utils$1.toObjectSet([ "age", "authorization", "content-length", "content-type", "etag", "expires", "from", "host", "if-modified-since", "if-unmodified-since", "last-modified", "location", "max-forwards", "proxy-authorization", "referer", "retry-after", "user-agent" ]); const parseHeaders = (rawHeaders) => { const parsed = {}; let key; let val; let i; rawHeaders && rawHeaders.split("\n").forEach(function parser(line) { i = line.indexOf(":"); key = line.substring(0, i).trim().toLowerCase(); val = line.substring(i + 1).trim(); if (!key || parsed[key] && ignoreDuplicateOf[key]) { return; } if (key === "set-cookie") { if (parsed[key]) { parsed[key].push(val); } else { parsed[key] = [val]; } } else { parsed[key] = parsed[key] ? parsed[key] + ", " + val : val; } }); return parsed; }; const $internals = Symbol("internals"); function normalizeHeader(header) { return header && String(header).trim().toLowerCase(); } function normalizeValue(value) { if (value === false || value == null) { return value; } return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); } function parseTokens(str) { const tokens2 = /* @__PURE__ */ Object.create(null); const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g; let match; while (match = tokensRE.exec(str)) { tokens2[match[1]] = match[2]; } return tokens2; } const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); function matchHeaderValue(context, value, header, filter2, isHeaderNameFilter) { if (utils$1.isFunction(filter2)) { return filter2.call(this, value, header); } if (isHeaderNameFilter) { value = header; } if (!utils$1.isString(value)) return; if (utils$1.isString(filter2)) { return value.indexOf(filter2) !== -1; } if (utils$1.isRegExp(filter2)) { return filter2.test(value); } } function formatHeader(header) { return header.trim().toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => { return char.toUpperCase() + str; }); } function buildAccessors(obj, header) { const accessorName = utils$1.toCamelCase(" " + header); ["get", "set", "has"].forEach((methodName) => { Object.defineProperty(obj, methodName + accessorName, { value: function(arg1, arg2, arg3) { return this[methodName].call(this, header, arg1, arg2, arg3); }, configurable: true }); }); } let AxiosHeaders$1 = class AxiosHeaders2 { constructor(headers) { headers && this.set(headers); } set(header, valueOrRewrite, rewrite) { const self2 = this; function setHeader(_value, _header, _rewrite) { const lHeader = normalizeHeader(_header); if (!lHeader) { throw new Error("header name must be a non-empty string"); } const key = utils$1.findKey(self2, lHeader); if (!key || self2[key] === void 0 || _rewrite === true || _rewrite === void 0 && self2[key] !== false) { self2[key || _header] = normalizeValue(_value); } } const setHeaders = (headers, _rewrite) => utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); if (utils$1.isPlainObject(header) || header instanceof this.constructor) { setHeaders(header, valueOrRewrite); } else if (utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { setHeaders(parseHeaders(header), valueOrRewrite); } else if (utils$1.isObject(header) && utils$1.isIterable(header)) { let obj = {}, dest, key; for (const entry of header) { if (!utils$1.isArray(entry)) { throw TypeError("Object iterator must return a key-value pair"); } obj[key = entry[0]] = (dest = obj[key]) ? utils$1.isArray(dest) ? [...dest, entry[1]] : [dest, entry[1]] : entry[1]; } setHeaders(obj, valueOrRewrite); } else { header != null && setHeader(valueOrRewrite, header, rewrite); } return this; } get(header, parser) { header = normalizeHeader(header); if (header) { const key = utils$1.findKey(this, header); if (key) { const value = this[key]; if (!parser) { return value; } if (parser === true) { return parseTokens(value); } if (utils$1.isFunction(parser)) { return parser.call(this, value, key); } if (utils$1.isRegExp(parser)) { return parser.exec(value); } throw new TypeError("parser must be boolean|regexp|function"); } } } has(header, matcher) { header = normalizeHeader(header); if (header) { const key = utils$1.findKey(this, header); return !!(key && this[key] !== void 0 && (!matcher || matchHeaderValue(this, this[key], key, matcher))); } return false; } delete(header, matcher) { const self2 = this; let deleted = false; function deleteHeader(_header) { _header = normalizeHeader(_header); if (_header) { const key = utils$1.findKey(self2, _header); if (key && (!matcher || matchHeaderValue(self2, self2[key], key, matcher))) { delete self2[key]; deleted = true; } } } if (utils$1.isArray(header)) { header.forEach(deleteHeader); } else { deleteHeader(header); } return deleted; } clear(matcher) { const keys = Object.keys(this); let i = keys.length; let deleted = false; while (i--) { const key = keys[i]; if (!matcher || matchHeaderValue(this, this[key], key, matcher, true)) { delete this[key]; deleted = true; } } return deleted; } normalize(format) { const self2 = this; const headers = {}; utils$1.forEach(this, (value, header) => { const key = utils$1.findKey(headers, header); if (key) { self2[key] = normalizeValue(value); delete self2[header]; return; } const normalized = format ? formatHeader(header) : String(header).trim(); if (normalized !== header) { delete self2[header]; } self2[normalized] = normalizeValue(value); headers[normalized] = true; }); return this; } concat(...targets) { return this.constructor.concat(this, ...targets); } toJSON(asStrings) { const obj = /* @__PURE__ */ Object.create(null); utils$1.forEach(this, (value, header) => { value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(", ") : value); }); return obj; } [Symbol.iterator]() { return Object.entries(this.toJSON())[Symbol.iterator](); } toString() { return Object.entries(this.toJSON()).map(([header, value]) => header + ": " + value).join("\n"); } getSetCookie() { return this.get("set-cookie") || []; } get [Symbol.toStringTag]() { return "AxiosHeaders"; } static from(thing) { return thing instanceof this ? thing : new this(thing); } static concat(first, ...targets) { const computed = new this(first); targets.forEach((target) => computed.set(target)); return computed; } static accessor(header) { const internals = this[$internals] = this[$internals] = { accessors: {} }; const accessors = internals.accessors; const prototype2 = this.prototype; function defineAccessor(_header) { const lHeader = normalizeHeader(_header); if (!accessors[lHeader]) { buildAccessors(prototype2, _header); accessors[lHeader] = true; } } utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); return this; } }; AxiosHeaders$1.accessor(["Content-Type", "Content-Length", "Accept", "Accept-Encoding", "User-Agent", "Authorization"]); utils$1.reduceDescriptors(AxiosHeaders$1.prototype, ({ value }, key) => { let mapped = key[0].toUpperCase() + key.slice(1); return { get: () => value, set(headerValue) { this[mapped] = headerValue; } }; }); utils$1.freezeMethods(AxiosHeaders$1); function transformData(fns, response) { const config = this || defaults; const context = response || config; const headers = AxiosHeaders$1.from(context.headers); let data = context.data; utils$1.forEach(fns, function transform(fn) { data = fn.call(config, data, headers.normalize(), response ? response.status : void 0); }); headers.normalize(); return data; } function isCancel$1(value) { return !!(value && value.__CANCEL__); } function CanceledError$1(message, config, request) { AxiosError$1.call(this, message == null ? "canceled" : message, AxiosError$1.ERR_CANCELED, config, request); this.name = "CanceledError"; } utils$1.inherits(CanceledError$1, AxiosError$1, { __CANCEL__: true }); function settle(resolve, reject, response) { const validateStatus2 = response.config.validateStatus; if (!response.status || !validateStatus2 || validateStatus2(response.status)) { resolve(response); } else { reject(new AxiosError$1( "Request failed with status code " + response.status, [AxiosError$1.ERR_BAD_REQUEST, AxiosError$1.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4], response.config, response.request, response )); } } function parseProtocol(url) { const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); return match && match[1] || ""; } function speedometer(samplesCount, min) { samplesCount = samplesCount || 10; const bytes = new Array(samplesCount); const timestamps = new Array(samplesCount); let head = 0; let tail = 0; let firstSampleTS; min = min !== void 0 ? min : 1e3; return function push(chunkLength) { const now = Date.now(); const startedAt = timestamps[tail]; if (!firstSampleTS) { firstSampleTS = now; } bytes[head] = chunkLength; timestamps[head] = now; let i = tail; let bytesCount = 0; while (i !== head) { bytesCount += bytes[i++]; i = i % samplesCount; } head = (head + 1) % samplesCount; if (head === tail) { tail = (tail + 1) % samplesCount; } if (now - firstSampleTS < min) { return; } const passed = startedAt && now - startedAt; return passed ? Math.round(bytesCount * 1e3 / passed) : void 0; }; } function throttle(fn, freq) { let timestamp = 0; let threshold = 1e3 / freq; let lastArgs; let timer; const invoke = (args2, now = Date.now()) => { timestamp = now; lastArgs = null; if (timer) { clearTimeout(timer); timer = null; } fn.apply(null, args2); }; const throttled = (...args2) => { const now = Date.now(); const passed = now - timestamp; if (passed >= threshold) { invoke(args2, now); } else { lastArgs = args2; if (!timer) { timer = setTimeout(() => { timer = null; invoke(lastArgs); }, threshold - passed); } } }; const flush = () => lastArgs && invoke(lastArgs); return [throttled, flush]; } const progressEventReducer = (listener, isDownloadStream, freq = 3) => { let bytesNotified = 0; const _speedometer = speedometer(50, 250); return throttle((e) => { const loaded = e.loaded; const total = e.lengthComputable ? e.total : void 0; const progressBytes = loaded - bytesNotified; const rate = _speedometer(progressBytes); const inRange = loaded <= total; bytesNotified = loaded; const data = { loaded, total, progress: total ? loaded / total : void 0, bytes: progressBytes, rate: rate ? rate : void 0, estimated: rate && total && inRange ? (total - loaded) / rate : void 0, event: e, lengthComputable: total != null, [isDownloadStream ? "download" : "upload"]: true }; listener(data); }, freq); }; const progressEventDecorator = (total, throttled) => { const lengthComputable = total != null; return [(loaded) => throttled[0]({ lengthComputable, total, loaded }), throttled[1]]; }; const asyncDecorator = (fn) => (...args2) => utils$1.asap(() => fn(...args2)); const isURLSameOrigin = platform.hasStandardBrowserEnv ? /* @__PURE__ */ ((origin2, isMSIE) => (url) => { url = new URL(url, platform.origin); return origin2.protocol === url.protocol && origin2.host === url.host && (isMSIE || origin2.port === url.port); })( new URL(platform.origin), platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent) ) : () => true; const cookies = platform.hasStandardBrowserEnv ? ( // Standard browser envs support document.cookie { write(name, value, expires, path, domain, secure) { const cookie = [name + "=" + encodeURIComponent(value)]; utils$1.isNumber(expires) && cookie.push("expires=" + new Date(expires).toGMTString()); utils$1.isString(path) && cookie.push("path=" + path); utils$1.isString(domain) && cookie.push("domain=" + domain); secure === true && cookie.push("secure"); document.cookie = cookie.join("; "); }, read(name) { const match = document.cookie.match(new RegExp("(^|;\\s*)(" + name + ")=([^;]*)")); return match ? decodeURIComponent(match[3]) : null; }, remove(name) { this.write(name, "", Date.now() - 864e5); } } ) : ( // Non-standard browser env (web workers, react-native) lack needed support. { write() { }, read() { return null; }, remove() { } } ); function isAbsoluteURL(url) { return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url); } function combineURLs(baseURL, relativeURL) { return relativeURL ? baseURL.replace(/\/?\/$/, "") + "/" + relativeURL.replace(/^\/+/, "") : baseURL; } function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) { let isRelativeUrl = !isAbsoluteURL(requestedURL); if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) { return combineURLs(baseURL, requestedURL); } return requestedURL; } const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing; function mergeConfig$1(config1, config2) { config2 = config2 || {}; const config = {}; function getMergedValue(target, source, prop, caseless) { if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { return utils$1.merge.call({ caseless }, target, source); } else if (utils$1.isPlainObject(source)) { return utils$1.merge({}, source); } else if (utils$1.isArray(source)) { return source.slice(); } return source; } function mergeDeepProperties(a, b, prop, caseless) { if (!utils$1.isUndefined(b)) { return getMergedValue(a, b, prop, caseless); } else if (!utils$1.isUndefined(a)) { return getMergedValue(void 0, a, prop, caseless); } } function valueFromConfig2(a, b) { if (!utils$1.isUndefined(b)) { return getMergedValue(void 0, b); } } function defaultToConfig2(a, b) { if (!utils$1.isUndefined(b)) { return getMergedValue(void 0, b); } else if (!utils$1.isUndefined(a)) { return getMergedValue(void 0, a); } } function mergeDirectKeys(a, b, prop) { if (prop in config2) { return getMergedValue(a, b); } else if (prop in config1) { return getMergedValue(void 0, a); } } const mergeMap = { url: valueFromConfig2, method: valueFromConfig2, data: valueFromConfig2, baseURL: defaultToConfig2, transformRequest: defaultToConfig2, transformResponse: defaultToConfig2, paramsSerializer: defaultToConfig2, timeout: defaultToConfig2, timeoutMessage: defaultToConfig2, withCredentials: defaultToConfig2, withXSRFToken: defaultToConfig2, adapter: defaultToConfig2, responseType: defaultToConfig2, xsrfCookieName: defaultToConfig2, xsrfHeaderName: defaultToConfig2, onUploadProgress: defaultToConfig2, onDownloadProgress: defaultToConfig2, decompress: defaultToConfig2, maxContentLength: defaultToConfig2, maxBodyLength: defaultToConfig2, beforeRedirect: defaultToConfig2, transport: defaultToConfig2, httpAgent: defaultToConfig2, httpsAgent: defaultToConfig2, cancelToken: defaultToConfig2, socketPath: defaultToConfig2, responseEncoding: defaultToConfig2, validateStatus: mergeDirectKeys, headers: (a, b, prop) => mergeDeepProperties(headersToObject(a), headersToObject(b), prop, true) }; utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { const merge2 = mergeMap[prop] || mergeDeepProperties; const configValue = merge2(config1[prop], config2[prop], prop); utils$1.isUndefined(configValue) && merge2 !== mergeDirectKeys || (config[prop] = configValue); }); return config; } const resolveConfig = (config) => { const newConfig = mergeConfig$1({}, config); let { data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth } = newConfig; newConfig.headers = headers = AxiosHeaders$1.from(headers); newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer); if (auth) { headers.set( "Authorization", "Basic " + btoa((auth.username || "") + ":" + (auth.password ? unescape(encodeURIComponent(auth.password)) : "")) ); } let contentType; if (utils$1.isFormData(data)) { if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) { headers.setContentType(void 0); } else if ((contentType = headers.getContentType()) !== false) { const [type, ...tokens2] = contentType ? contentType.split(";").map((token) => token.trim()).filter(Boolean) : []; headers.setContentType([type || "multipart/form-data", ...tokens2].join("; ")); } } if (platform.hasStandardBrowserEnv) { withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig)); if (withXSRFToken || withXSRFToken !== false && isURLSameOrigin(newConfig.url)) { const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName); if (xsrfValue) { headers.set(xsrfHeaderName, xsrfValue); } } } return newConfig; }; const isXHRAdapterSupported = typeof XMLHttpRequest !== "undefined"; const xhrAdapter = isXHRAdapterSupported && function(config) { return new Promise(function dispatchXhrRequest(resolve, reject) { const _config = resolveConfig(config); let requestData = _config.data; const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize(); let { responseType, onUploadProgress, onDownloadProgress } = _config; let onCanceled; let uploadThrottled, downloadThrottled; let flushUpload, flushDownload; function done() { flushUpload && flushUpload(); flushDownload && flushDownload(); _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled); _config.signal && _config.signal.removeEventListener("abort", onCanceled); } let request = new XMLHttpRequest(); request.open(_config.method.toUpperCase(), _config.url, true); request.timeout = _config.timeout; function onloadend() { if (!request) { return; } const responseHeaders = AxiosHeaders$1.from( "getAllResponseHeaders" in request && request.getAllResponseHeaders() ); const responseData = !responseType || responseType === "text" || responseType === "json" ? request.responseText : request.response; const response = { data: responseData, status: request.status, statusText: request.statusText, headers: responseHeaders, config, request }; settle(function _resolve(value) { resolve(value); done(); }, function _reject(err) { reject(err); done(); }, response); request = null; } if ("onloadend" in request) { request.onloadend = onloadend; } else { request.onreadystatechange = function handleLoad() { if (!request || request.readyState !== 4) { return; } if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf("file:") === 0)) { return; } setTimeout(onloadend); }; } request.onabort = function handleAbort() { if (!request) { return; } reject(new AxiosError$1("Request aborted", AxiosError$1.ECONNABORTED, config, request)); request = null; }; request.onerror = function handleError() { reject(new AxiosError$1("Network Error", AxiosError$1.ERR_NETWORK, config, request)); request = null; }; request.ontimeout = function handleTimeout() { let timeoutErrorMessage = _config.timeout ? "timeout of " + _config.timeout + "ms exceeded" : "timeout exceeded"; const transitional2 = _config.transitional || transitionalDefaults; if (_config.timeoutErrorMessage) { timeoutErrorMessage = _config.timeoutErrorMessage; } reject(new AxiosError$1( timeoutErrorMessage, transitional2.clarifyTimeoutError ? AxiosError$1.ETIMEDOUT : AxiosError$1.ECONNABORTED, config, request )); request = null; }; requestData === void 0 && requestHeaders.setContentType(null); if ("setRequestHeader" in request) { utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) { request.setRequestHeader(key, val); }); } if (!utils$1.isUndefined(_config.withCredentials)) { request.withCredentials = !!_config.withCredentials; } if (responseType && responseType !== "json") { request.responseType = _config.responseType; } if (onDownloadProgress) { [downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true); request.addEventListener("progress", downloadThrottled); } if (onUploadProgress && request.upload) { [uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress); request.upload.addEventListener("progress", uploadThrottled); request.upload.addEventListener("loadend", flushUpload); } if (_config.cancelToken || _config.signal) { onCanceled = (cancel) => { if (!request) { return; } reject(!cancel || cancel.type ? new CanceledError$1(null, config, request) : cancel); request.abort(); request = null; }; _config.cancelToken && _config.cancelToken.subscribe(onCanceled); if (_config.signal) { _config.signal.aborted ? onCanceled() : _config.signal.addEventListener("abort", onCanceled); } } const protocol = parseProtocol(_config.url); if (protocol && platform.protocols.indexOf(protocol) === -1) { reject(new AxiosError$1("Unsupported protocol " + protocol + ":", AxiosError$1.ERR_BAD_REQUEST, config)); return; } request.send(requestData || null); }); }; const composeSignals = (signals, timeout) => { const { length } = signals = signals ? signals.filter(Boolean) : []; if (timeout || length) { let controller = new AbortController(); let aborted; const onabort = function(reason) { if (!aborted) { aborted = true; unsubscribe(); const err = reason instanceof Error ? reason : this.reason; controller.abort(err instanceof AxiosError$1 ? err : new CanceledError$1(err instanceof Error ? err.message : err)); } }; let timer = timeout && setTimeout(() => { timer = null; onabort(new AxiosError$1(`timeout ${timeout} of ms exceeded`, AxiosError$1.ETIMEDOUT)); }, timeout); const unsubscribe = () => { if (signals) { timer && clearTimeout(timer); timer = null; signals.forEach((signal2) => { signal2.unsubscribe ? signal2.unsubscribe(onabort) : signal2.removeEventListener("abort", onabort); }); signals = null; } }; signals.forEach((signal2) => signal2.addEventListener("abort", onabort)); const { signal } = controller; signal.unsubscribe = () => utils$1.asap(unsubscribe); return signal; } }; const streamChunk = function* (chunk, chunkSize) { let len = chunk.byteLength; if (len < chunkSize) { yield chunk; return; } let pos = 0; let end; while (pos < len) { end = pos + chunkSize; yield chunk.slice(pos, end); pos = end; } }; const readBytes = async function* (iterable, chunkSize) { for await (const chunk of readStream(iterable)) { yield* streamChunk(chunk, chunkSize); } }; const readStream = async function* (stream) { if (stream[Symbol.asyncIterator]) { yield* stream; return; } const reader = stream.getReader(); try { for (; ; ) { const { done, value } = await reader.read(); if (done) { break; } yield value; } } finally { await reader.cancel(); } }; const trackStream = (stream, chunkSize, onProgress, onFinish) => { const iterator2 = readBytes(stream, chunkSize); let bytes = 0; let done; let _onFinish = (e) => { if (!done) { done = true; onFinish && onFinish(e); } }; return new ReadableStream({ async pull(controller) { try { const { done: done2, value } = await iterator2.next(); if (done2) { _onFinish(); controller.close(); return; } let len = value.byteLength; if (onProgress) { let loadedBytes = bytes += len; onProgress(loadedBytes); } controller.enqueue(new Uint8Array(value)); } catch (err) { _onFinish(err); throw err; } }, cancel(reason) { _onFinish(reason); return iterator2.return(); } }, { highWaterMark: 2 }); }; const isFetchSupported = typeof fetch === "function" && typeof Request === "function" && typeof Response === "function"; const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === "function"; const encodeText = isFetchSupported && (typeof TextEncoder === "function" ? /* @__PURE__ */ ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) : async (str) => new Uint8Array(await new Response(str).arrayBuffer())); const test = (fn, ...args2) => { try { return !!fn(...args2); } catch (e) { return false; } }; const supportsRequestStream = isReadableStreamSupported && test(() => { let duplexAccessed = false; const hasContentType = new Request(platform.origin, { body: new ReadableStream(), method: "POST", get duplex() { duplexAccessed = true; return "half"; } }).headers.has("Content-Type"); return duplexAccessed && !hasContentType; }); const DEFAULT_CHUNK_SIZE = 64 * 1024; const supportsResponseStream = isReadableStreamSupported && test(() => utils$1.isReadableStream(new Response("").body)); const resolvers = { stream: supportsResponseStream && ((res) => res.body) }; isFetchSupported && ((res) => { ["text", "arrayBuffer", "blob", "formData", "stream"].forEach((type) => { !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res2) => res2[type]() : (_, config) => { throw new AxiosError$1(`Response type '${type}' is not supported`, AxiosError$1.ERR_NOT_SUPPORT, config); }); }); })(new Response()); const getBodyLength = async (body) => { if (body == null) { return 0; } if (utils$1.isBlob(body)) { return body.size; } if (utils$1.isSpecCompliantForm(body)) { const _request = new Request(platform.origin, { method: "POST", body }); return (await _request.arrayBuffer()).byteLength; } if (utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) { return body.byteLength; } if (utils$1.isURLSearchParams(body)) { body = body + ""; } if (utils$1.isString(body)) { return (await encodeText(body)).byteLength; } }; const resolveBodyLength = async (headers, body) => { const length = utils$1.toFiniteNumber(headers.getContentLength()); return length == null ? getBodyLength(body) : length; }; const fetchAdapter = isFetchSupported && (async (config) => { let { url, method, data, signal, cancelToken, timeout, onDownloadProgress, onUploadProgress, responseType, headers, withCredentials = "same-origin", fetchOptions } = resolveConfig(config); responseType = responseType ? (responseType + "").toLowerCase() : "text"; let composedSignal = composeSignals([signal, cancelToken && cancelToken.toAbortSignal()], timeout); let request; const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => { composedSignal.unsubscribe(); }); let requestContentLength; try { if (onUploadProgress && supportsRequestStream && method !== "get" && method !== "head" && (requestContentLength = await resolveBodyLength(headers, data)) !== 0) { let _request = new Request(url, { method: "POST", body: data, duplex: "half" }); let contentTypeHeader; if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get("content-type"))) { headers.setContentType(contentTypeHeader); } if (_request.body) { const [onProgress, flush] = progressEventDecorator( requestContentLength, progressEventReducer(asyncDecorator(onUploadProgress)) ); data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush); } } if (!utils$1.isString(withCredentials)) { withCredentials = withCredentials ? "include" : "omit"; } const isCredentialsSupported = "credentials" in Request.prototype; request = new Request(url, { ...fetchOptions, signal: composedSignal, method: method.toUpperCase(), headers: headers.normalize().toJSON(), body: data, duplex: "half", credentials: isCredentialsSupported ? withCredentials : void 0 }); let response = await fetch(request); const isStreamResponse = supportsResponseStream && (responseType === "stream" || responseType === "response"); if (supportsResponseStream && (onDownloadProgress || isStreamResponse && unsubscribe)) { const options = {}; ["status", "statusText", "headers"].forEach((prop) => { options[prop] = response[prop]; }); const responseContentLength = utils$1.toFiniteNumber(response.headers.get("content-length")); const [onProgress, flush] = onDownloadProgress && progressEventDecorator( responseContentLength, progressEventReducer(asyncDecorator(onDownloadProgress), true) ) || []; response = new Response( trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { flush && flush(); unsubscribe && unsubscribe(); }), options ); } responseType = responseType || "text"; let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || "text"](response, config); !isStreamResponse && unsubscribe && unsubscribe(); return await new Promise((resolve, reject) => { settle(resolve, reject, { data: responseData, headers: AxiosHeaders$1.from(response.headers), status: response.status, statusText: response.statusText, config, request }); }); } catch (err) { unsubscribe && unsubscribe(); if (err && err.name === "TypeError" && /Load failed|fetch/i.test(err.message)) { throw Object.assign( new AxiosError$1("Network Error", AxiosError$1.ERR_NETWORK, config, request), { cause: err.cause || err } ); } throw AxiosError$1.from(err, err && err.code, config, request); } }); const knownAdapters = { http: httpAdapter, xhr: xhrAdapter, fetch: fetchAdapter }; utils$1.forEach(knownAdapters, (fn, value) => { if (fn) { try { Object.defineProperty(fn, "name", { value }); } catch (e) { } Object.defineProperty(fn, "adapterName", { value }); } }); const renderReason = (reason) => `- ${reason}`; const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false; const adapters = { getAdapter: (adapters2) => { adapters2 = utils$1.isArray(adapters2) ? adapters2 : [adapters2]; const { length } = adapters2; let nameOrAdapter; let adapter; const rejectedReasons = {}; for (let i = 0; i < length; i++) { nameOrAdapter = adapters2[i]; let id2; adapter = nameOrAdapter; if (!isResolvedHandle(nameOrAdapter)) { adapter = knownAdapters[(id2 = String(nameOrAdapter)).toLowerCase()]; if (adapter === void 0) { throw new AxiosError$1(`Unknown adapter '${id2}'`); } } if (adapter) { break; } rejectedReasons[id2 || "#" + i] = adapter; } if (!adapter) { const reasons = Object.entries(rejectedReasons).map( ([id2, state]) => `adapter ${id2} ` + (state === false ? "is not supported by the environment" : "is not available in the build") ); let s = length ? reasons.length > 1 ? "since :\n" + reasons.map(renderReason).join("\n") : " " + renderReason(reasons[0]) : "as no adapter specified"; throw new AxiosError$1( `There is no suitable adapter to dispatch the request ` + s, "ERR_NOT_SUPPORT" ); } return adapter; }, adapters: knownAdapters }; function throwIfCancellationRequested(config) { if (config.cancelToken) { config.cancelToken.throwIfRequested(); } if (config.signal && config.signal.aborted) { throw new CanceledError$1(null, config); } } function dispatchRequest(config) { throwIfCancellationRequested(config); config.headers = AxiosHeaders$1.from(config.headers); config.data = transformData.call( config, config.transformRequest ); if (["post", "put", "patch"].indexOf(config.method) !== -1) { config.headers.setContentType("application/x-www-form-urlencoded", false); } const adapter = adapters.getAdapter(config.adapter || defaults.adapter); return adapter(config).then(function onAdapterResolution(response) { throwIfCancellationRequested(config); response.data = transformData.call( config, config.transformResponse, response ); response.headers = AxiosHeaders$1.from(response.headers); return response; }, function onAdapterRejection(reason) { if (!isCancel$1(reason)) { throwIfCancellationRequested(config); if (reason && reason.response) { reason.response.data = transformData.call( config, config.transformResponse, reason.response ); reason.response.headers = AxiosHeaders$1.from(reason.response.headers); } } return Promise.reject(reason); }); } const VERSION$1 = "1.9.0"; const validators$1 = {}; ["object", "boolean", "number", "function", "string", "symbol"].forEach((type, i) => { validators$1[type] = function validator2(thing) { return typeof thing === type || "a" + (i < 1 ? "n " : " ") + type; }; }); const deprecatedWarnings = {}; validators$1.transitional = function transitional(validator2, version, message) { function formatMessage(opt, desc) { return "[Axios v" + VERSION$1 + "] Transitional option '" + opt + "'" + desc + (message ? ". " + message : ""); } return (value, opt, opts) => { if (validator2 === false) { throw new AxiosError$1( formatMessage(opt, " has been removed" + (version ? " in " + version : "")), AxiosError$1.ERR_DEPRECATED ); } if (version && !deprecatedWarnings[opt]) { deprecatedWarnings[opt] = true; console.warn( formatMessage( opt, " has been deprecated since v" + version + " and will be removed in the near future" ) ); } return validator2 ? validator2(value, opt, opts) : true; }; }; validators$1.spelling = function spelling(correctSpelling) { return (value, opt) => { console.warn(`${opt} is likely a misspelling of ${correctSpelling}`); return true; }; }; function assertOptions(options, schema, allowUnknown) { if (typeof options !== "object") { throw new AxiosError$1("options must be an object", AxiosError$1.ERR_BAD_OPTION_VALUE); } const keys = Object.keys(options); let i = keys.length; while (i-- > 0) { const opt = keys[i]; const validator2 = schema[opt]; if (validator2) { const value = options[opt]; const result = value === void 0 || validator2(value, opt, options); if (result !== true) { throw new AxiosError$1("option " + opt + " must be " + result, AxiosError$1.ERR_BAD_OPTION_VALUE); } continue; } if (allowUnknown !== true) { throw new AxiosError$1("Unknown option " + opt, AxiosError$1.ERR_BAD_OPTION); } } } const validator = { assertOptions, validators: validators$1 }; const validators = validator.validators; let Axios$1 = class Axios2 { constructor(instanceConfig) { this.defaults = instanceConfig || {}; this.interceptors = { request: new InterceptorManager(), response: new InterceptorManager() }; } /** * Dispatch a request * * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults) * @param {?Object} config * * @returns {Promise} The Promise to be fulfilled */ async request(configOrUrl, config) { try { return await this._request(configOrUrl, config); } catch (err) { if (err instanceof Error) { let dummy = {}; Error.captureStackTrace ? Error.captureStackTrace(dummy) : dummy = new Error(); const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, "") : ""; try { if (!err.stack) { err.stack = stack; } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ""))) { err.stack += "\n" + stack; } } catch (e) { } } throw err; } } _request(configOrUrl, config) { if (typeof configOrUrl === "string") { config = config || {}; config.url = configOrUrl; } else { config = configOrUrl || {}; } config = mergeConfig$1(this.defaults, config); const { transitional: transitional2, paramsSerializer, headers } = config; if (transitional2 !== void 0) { validator.assertOptions(transitional2, { silentJSONParsing: validators.transitional(validators.boolean), forcedJSONParsing: validators.transitional(validators.boolean), clarifyTimeoutError: validators.transitional(validators.boolean) }, false); } if (paramsSerializer != null) { if (utils$1.isFunction(paramsSerializer)) { config.paramsSerializer = { serialize: paramsSerializer }; } else { validator.assertOptions(paramsSerializer, { encode: validators.function, serialize: validators.function }, true); } } if (config.allowAbsoluteUrls !== void 0) ; else if (this.defaults.allowAbsoluteUrls !== void 0) { config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls; } else { config.allowAbsoluteUrls = true; } validator.assertOptions(config, { baseUrl: validators.spelling("baseURL"), withXsrfToken: validators.spelling("withXSRFToken") }, true); config.method = (config.method || this.defaults.method || "get").toLowerCase(); let contextHeaders = headers && utils$1.merge( headers.common, headers[config.method] ); headers && utils$1.forEach( ["delete", "get", "head", "post", "put", "patch", "common"], (method) => { delete headers[method]; } ); config.headers = AxiosHeaders$1.concat(contextHeaders, headers); const requestInterceptorChain = []; let synchronousRequestInterceptors = true; this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) { if (typeof interceptor.runWhen === "function" && interceptor.runWhen(config) === false) { return; } synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous; requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected); }); const responseInterceptorChain = []; this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) { responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected); }); let promise; let i = 0; let len; if (!synchronousRequestInterceptors) { const chain = [dispatchRequest.bind(this), void 0]; chain.unshift.apply(chain, requestInterceptorChain); chain.push.apply(chain, responseInterceptorChain); len = chain.length; promise = Promise.resolve(config); while (i < len) { promise = promise.then(chain[i++], chain[i++]); } return promise; } len = requestInterceptorChain.length; let newConfig = config; i = 0; while (i < len) { const onFulfilled = requestInterceptorChain[i++]; const onRejected = requestInterceptorChain[i++]; try { newConfig = onFulfilled(newConfig); } catch (error) { onRejected.call(this, error); break; } } try { promise = dispatchRequest.call(this, newConfig); } catch (error) { return Promise.reject(error); } i = 0; len = responseInterceptorChain.length; while (i < len) { promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]); } return promise; } getUri(config) { config = mergeConfig$1(this.defaults, config); const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); return buildURL(fullPath, config.params, config.paramsSerializer); } }; utils$1.forEach(["delete", "get", "head", "options"], function forEachMethodNoData(method) { Axios$1.prototype[method] = function(url, config) { return this.request(mergeConfig$1(config || {}, { method, url, data: (config || {}).data })); }; }); utils$1.forEach(["post", "put", "patch"], function forEachMethodWithData(method) { function generateHTTPMethod(isForm) { return function httpMethod(url, data, config) { return this.request(mergeConfig$1(config || {}, { method, headers: isForm ? { "Content-Type": "multipart/form-data" } : {}, url, data })); }; } Axios$1.prototype[method] = generateHTTPMethod(); Axios$1.prototype[method + "Form"] = generateHTTPMethod(true); }); let CancelToken$1 = class CancelToken2 { constructor(executor) { if (typeof executor !== "function") { throw new TypeError("executor must be a function."); } let resolvePromise; this.promise = new Promise(function promiseExecutor(resolve) { resolvePromise = resolve; }); const token = this; this.promise.then((cancel) => { if (!token._listeners) return; let i = token._listeners.length; while (i-- > 0) { token._listeners[i](cancel); } token._listeners = null; }); this.promise.then = (onfulfilled) => { let _resolve; const promise = new Promise((resolve) => { token.subscribe(resolve); _resolve = resolve; }).then(onfulfilled); promise.cancel = function reject() { token.unsubscribe(_resolve); }; return promise; }; executor(function cancel(message, config, request) { if (token.reason) { return; } token.reason = new CanceledError$1(message, config, request); resolvePromise(token.reason); }); } /** * Throws a `CanceledError` if cancellation has been requested. */ throwIfRequested() { if (this.reason) { throw this.reason; } } /** * Subscribe to the cancel signal */ subscribe(listener) { if (this.reason) { listener(this.reason); return; } if (this._listeners) { this._listeners.push(listener); } else { this._listeners = [listener]; } } /** * Unsubscribe from the cancel signal */ unsubscribe(listener) { if (!this._listeners) { return; } const index2 = this._listeners.indexOf(listener); if (index2 !== -1) { this._listeners.splice(index2, 1); } } toAbortSignal() { const controller = new AbortController(); const abort = (err) => { controller.abort(err); }; this.subscribe(abort); controller.signal.unsubscribe = () => this.unsubscribe(abort); return controller.signal; } /** * Returns an object that contains a new `CancelToken` and a function that, when called, * cancels the `CancelToken`. */ static source() { let cancel; const token = new CancelToken2(function executor(c) { cancel = c; }); return { token, cancel }; } }; function spread$1(callback) { return function wrap(arr) { return callback.apply(null, arr); }; } function isAxiosError$1(payload) { return utils$1.isObject(payload) && payload.isAxiosError === true; } const HttpStatusCode$1 = { Continue: 100, SwitchingProtocols: 101, Processing: 102, EarlyHints: 103, Ok: 200, Created: 201, Accepted: 202, NonAuthoritativeInformation: 203, NoContent: 204, ResetContent: 205, PartialContent: 206, MultiStatus: 207, AlreadyReported: 208, ImUsed: 226, MultipleChoices: 300, MovedPermanently: 301, Found: 302, SeeOther: 303, NotModified: 304, UseProxy: 305, Unused: 306, TemporaryRedirect: 307, PermanentRedirect: 308, BadRequest: 400, Unauthorized: 401, PaymentRequired: 402, Forbidden: 403, NotFound: 404, MethodNotAllowed: 405, NotAcceptable: 406, ProxyAuthenticationRequired: 407, RequestTimeout: 408, Conflict: 409, Gone: 410, LengthRequired: 411, PreconditionFailed: 412, PayloadTooLarge: 413, UriTooLong: 414, UnsupportedMediaType: 415, RangeNotSatisfiable: 416, ExpectationFailed: 417, ImATeapot: 418, MisdirectedRequest: 421, UnprocessableEntity: 422, Locked: 423, FailedDependency: 424, TooEarly: 425, UpgradeRequired: 426, PreconditionRequired: 428, TooManyRequests: 429, RequestHeaderFieldsTooLarge: 431, UnavailableForLegalReasons: 451, InternalServerError: 500, NotImplemented: 501, BadGateway: 502, ServiceUnavailable: 503, GatewayTimeout: 504, HttpVersionNotSupported: 505, VariantAlsoNegotiates: 506, InsufficientStorage: 507, LoopDetected: 508, NotExtended: 510, NetworkAuthenticationRequired: 511 }; Object.entries(HttpStatusCode$1).forEach(([key, value]) => { HttpStatusCode$1[value] = key; }); function createInstance(defaultConfig) { const context = new Axios$1(defaultConfig); const instance = bind(Axios$1.prototype.request, context); utils$1.extend(instance, Axios$1.prototype, context, { allOwnKeys: true }); utils$1.extend(instance, context, null, { allOwnKeys: true }); instance.create = function create(instanceConfig) { return createInstance(mergeConfig$1(defaultConfig, instanceConfig)); }; return instance; } const axios = createInstance(defaults); axios.Axios = Axios$1; axios.CanceledError = CanceledError$1; axios.CancelToken = CancelToken$1; axios.isCancel = isCancel$1; axios.VERSION = VERSION$1; axios.toFormData = toFormData$1; axios.AxiosError = AxiosError$1; axios.Cancel = axios.CanceledError; axios.all = function all2(promises) { return Promise.all(promises); }; axios.spread = spread$1; axios.isAxiosError = isAxiosError$1; axios.mergeConfig = mergeConfig$1; axios.AxiosHeaders = AxiosHeaders$1; axios.formToJSON = (thing) => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); axios.getAdapter = adapters.getAdapter; axios.HttpStatusCode = HttpStatusCode$1; axios.default = axios; const { Axios, AxiosError, CanceledError, isCancel, CancelToken, VERSION, all, Cancel, isAxiosError, spread, toFormData, AxiosHeaders, HttpStatusCode, formToJSON, getAdapter, mergeConfig } = axios; class Patcher { constructor() { __publicField(this, "blacklistedKeywords", ["cdn-cgi", "jquery", "jscolor"]); __publicField(this, "patched", []); __publicField(this, "observer"); } start() { console.log("Called Patcher.start()..."); this.observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.type === "childList" && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach(async (node) => { if (node.tagName === "SCRIPT" && !this.blacklistedKeywords.some((k) => node.src.includes(k)) && node.src.includes(location.host) && !this.patched.includes(node.src)) { console.log("MutationObserver Blocked script", node.src); this.patched.push(node.src); node.removeAttribute("src"); } }); } }); }); this.observer.observe(document.documentElement, { childList: true, subtree: true }); [...document.querySelectorAll("script")].forEach((script) => { if (!this.blacklistedKeywords.some((k) => script.src.includes(k)) && script.src.includes(location.host) && !this.patched.includes(script.src)) { console.log("QuerySelector Blocked script", script.src); this.patched.push(script.src); script.removeAttribute("src"); } }); } async patch() { if (!window.$) { console.log("Called patch(), but jQuery was not detected. Waiting 100ms..."); return setTimeout(() => this.patch(), 100); } console.log("Detected jQuery! Disconnecting Observer & Patching..."); this.observer.disconnect(); this.patched.forEach(async (script) => { try { let { data } = await axios.get(script); let filePatches = bb.patches.filter((e) => script.replace(location.origin, "").startsWith(e.file)); for (const patch of filePatches) for (const replacement of patch.replacement) { if (replacement.setting && bb.plugins.settings[patch.plugin]?.[replacement.setting] === false) { console.log("Setting", replacement.setting, "is not active, ignoring..."); continue; } else if (replacement.setting) console.log("Setting", replacement.setting, "is active, applying..."); const matchRegex = new RegExp(replacement.match, "gm"); if (!matchRegex.test(data)) { console.log(`Patch did nothing! Plugin: ${patch.plugin}; Regex: \`${replacement.match}\`.`); continue; } ; data = data.replaceAll(matchRegex, replacement.replace.replaceAll("$self", `bb.plugins.list.find(a => a.name === '${patch.plugin}')`)); } ; const url = URL.createObjectURL(new Blob([ `// ${script.replace(location.origin, "")}${filePatches.map((p) => p.replacement).flat().length >= 1 ? ` - Patched by ${filePatches.map((p) => p.plugin).join(", ")}` : ``} `, data ])); console.log(`Patched ${script.replace(location.origin, "")}!`); let newScript = document.createElement("script"); newScript.src = url; newScript.setAttribute("__nopatch", true); newScript.setAttribute("__src", newScript); document.head.appendChild(newScript); } catch (error) { console.error(`Error patching ${script}, ignoring file.`, error); } }); let activeStyles = Object.entries(bb.plugins.styles).filter((style) => bb.plugins.active.includes(style[0])).map((s) => s[1]); document.head.insertAdjacentHTML("beforeend", `<style>${activeStyles.join("\n\n")}</style>`); console.log("Finished Patcher.start() & plugin style injection!"); } } const patcher = new Patcher(); class Events { constructor() { __privateAdd(this, _subscriptions, /* @__PURE__ */ new Map()); __publicField(this, "listen", (event, callback) => { console.log(`Listening to event '${event}'...`); if (!__privateGet(this, _subscriptions).has(event)) __privateGet(this, _subscriptions).set(event, /* @__PURE__ */ new Set()); __privateGet(this, _subscriptions).get(event).add(callback); }); __publicField(this, "dispatch", (event, payload) => { console.log(`Dispatching event '${event}'...`); if (__privateGet(this, _subscriptions).has(event)) __privateGet(this, _subscriptions).get(event).forEach((callback) => callback(payload)); }); } } _subscriptions = new WeakMap(); const events = new Events(); class Modal { constructor({ title, description, inputs, buttons, autoClose = true }) { __publicField(this, "element"); __publicField(this, "autoClose"); __publicField(this, "listening"); __publicField(this, "listen", async () => { this.listening = true; return new Promise((resolve) => { [...document.querySelectorAll('[id*="bb_modalButton-"]')].forEach((button) => { button.addEventListener("click", () => { resolve({ button: button.id.split("bb_modalButton-")[1], inputs: [...document.querySelectorAll('[id*="bb_modalInput-"]')].map((a) => { return { name: a.placeholder, value: a.value }; }) }); if (this.autoClose) this.close(); }); }); }); }); __publicField(this, "close", () => this.element.remove()); if (document.querySelector("#modal")) return console.error("Cannot open more than one modal at once."); document.body.insertAdjacentHTML("beforeend", ` <div class="arts__modal___VpEAD-camelCase" id="modal"> <form class="styles__container___1BPm9-camelCase"> <div class="styles__text___KSL4--camelCase">${title}</div> ${description ? `<div class="bb_modalDescription">${description}</div>` : ""} <div class="styles__holder___3CEfN-camelCase"> ${inputs ? `<div style="flex-direction: column;" class="styles__numRow___xh98F-camelCase"> ${inputs.map(({ placeholder }, i) => ` <div class="bb_modalOuterInput"> <input class="bb_modalInput" placeholder="${placeholder}" type="text" value="" id="${"bb_modalInput-" + i}" /> </div> `).join("<br>")} </div>` : ""} ${buttons ? `<div class="styles__buttonContainer___2EaVD-camelCase"> ${buttons.map(({ text }, i) => ` <div class="styles__button___1_E-G-camelCase styles__button___3zpwV-camelCase" role="button" tabindex="0"> <div class="styles__shadow___3GMdH-camelCase"></div> <div class="styles__edge___3eWfq-camelCase" style="background-color: #2f2f2f;"></div> <div class="styles__front___vcvuy-camelCase styles__buttonInside___39vdp-camelCase" style="background-color: #2f2f2f;" id="${"bb_modalButton-" + i}">${text}</div> </div> `).join("")} </div>` : ""} </div> </form> </div> `); this.element = document.querySelector("#modal"); this.autoClose = autoClose; [...document.querySelectorAll('[id*="bb_modalButton-"]')].forEach((b) => b.addEventListener("click", () => !this.listening ? this.close() : null)); } } class Storage { constructor() { __publicField(this, "storage", {}); __publicField(this, "refresh", () => { Object.keys(localStorage).forEach((key) => delete localStorage[key]); Object.entries(this.storage).forEach(([key, value]) => localStorage.setItem(key, value)); return this.storage; }); __publicField(this, "get", (key, parse, fallback = null) => { if (!this.storage[key]) return fallback; if (parse) return JSON.parse(this.storage[key]); return this.storage[key]; }); __publicField(this, "set", (key, value, stringify) => { if (stringify) this.storage[key] = JSON.stringify(value); else this.storage[key] = value; return this.refresh(); }); Object.entries(localStorage).forEach(([key, value]) => this.storage[key] = value); } } const storage = new Storage(); const loadThemes = async (single) => { console.log("Called loadThemes()"); bb.themes.list = []; bb.themes.broken = []; [...document.querySelectorAll("[id*='bb-theme']")].forEach((v) => v.remove()); let themes = storage.get("bb_themeData", true).active.filter((a) => a.trim() !== ""); for (let theme of themes) axios.get(theme).then(async (res) => { let data = res.data; let meta = {}; const matches = data.match(/\/\*\*\s*\n([\s\S]*?)\*\//s)[1].split("\n"); if (matches) matches.forEach((input) => { let match = /@(\w+)\s+([\s\S]+)/g.exec(input); if (match) meta[match[1]] = match[2].trim(); }); else return bb.themes.broken.push({ url: theme, reason: "Theme metadata could not be found." }); const themeStyle = document.createElement("style"); themeStyle.id = `bb-theme-${btoa(Math.random().toString(36).slice(2))}`; themeStyle.innerHTML = data; bb.themes.list.push({ element: themeStyle, name: meta.name, meta, url: theme }); document.head.appendChild(themeStyle); console.log(`Loaded theme "${meta.name}".`); bb.events.dispatch("themeUpdate"); }).catch((err) => { console.log("Failed to load theme: " + theme + " - ", err.message); bb.themes.broken.push({ url: theme, reason: "Theme could not be loaded." }); bb.events.dispatch("themeUpdate"); }); if (single) console.log("Reloaded themes."); else console.log("Finished initial theme load function."); }; const createPlugin = ({ name, description, authors, patches, settings, styles, onLoad, onStart, required, disabled, ...custom }) => { if (!name || !authors?.length || !onLoad && !onStart && !patches && !styles) return console.error(`ERROR: Plugin does not have a title, authors, or executable functions.`); let plugin = { name, description: description || "No description.", authors, patches: patches || [], settings: settings || [], styles: styles || ``, onLoad: onLoad || (() => { }), onStart: onStart || (() => { }), required: required || false, disabled: disabled || false, ...custom }; return plugin; }; const index$l = () => createPlugin({ name: "Advanced Opener", description: "the fastest way to mass open blacket packs.", authors: [ { name: "Syfe", avatar: "https://i.imgur.com/OKpOipQ.gif", url: "https://github.com/ItsSyfe" }, { name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" } ], styles: ` .bb_openModal { font-family: "Nunito", sans-serif; font-size: 1vw; height: 40vw; width: 22vw; border: 3px solid #262626; background: #2f2f2f; position: absolute; bottom: 1vw; right: 1vw; border-radius: 7.5px; text-align: center; color: white; overflow: auto; padding: 2vw; } .bb_openIcons { position: absolute; right: 1vw; top: 1vw; font-size: 1.5vw; } .bb_openIcon { cursor: pointer; } .bb_openTitle { font-size: 2vw; font-weight: 1000; } .bb_openedCount { font-weight: 800; font-size: 1.5vw; margin-top: 1vw; padding-bottom: 1vw; } .bb_opened { margin-top: 1.5vw; height: 27vw; overflow: auto; -ms-overflow-style: none; scrollbar-width: none; } .bb_opened::-webkit-scrollbar { display: none; } .bb_openResult { font-size: 1.55vw; margin-top: 0.5vw; font-weight: 600; } .bb_openButtons { position: absolute; bottom: 1.25vw; display: flex; align-items: center; width: calc(100% - 4vw); } .bb_openButton { font-size: 1.8vw; cursor: pointer; width: 100%; height: 2.6vw; border: 4px solid white; border-radius: 0.4vw; display: flex; justify-content: center; align-items: center; } `, onStart: () => { if (!location.pathname.startsWith("/market")) return; bb.plugins.massopen = {}; bb.plugins.massopen.start = async () => { let packModal = new bb.Modal({ title: "Mass Open", inputs: [{ placeholder: "Pack" }], buttons: [{ text: "Next" }, { text: "Cancel" }] }); let packResponse = await packModal.listen(); if (packResponse.button !== "0") return; let pack = packResponse.inputs[0].value; if (!blacket.packs[pack]) return new bb.Modal({ title: "I cannot find that pack.", buttons: [{ text: "Close" }] }); let countModal = new bb.Modal({ title: "Mass Open", inputs: [{ placeholder: "Quantity" }], buttons: [{ text: "Next" }, { text: "Cancel" }] }); let countResponse = await countModal.listen(); if (countResponse.button !== "0") return; let qty = Number(countResponse.inputs[0].value) || null; if (qty === NaN) return new bb.Modal({ title: "Invalid quantity.", buttons: [{ text: "Close" }] }); let cost = blacket.packs[pack].price * qty; if (blacket.user.tokens < cost) return new bb.Modal({ title: "You do not have enough tokens to open that many packs!", buttons: [{ text: "Close" }] }); let extraDelayModal = new bb.Modal({ title: "Mass Open", description: "you can leave this at zero (nothing) if you're not going to be using blacket while running the opener, otherwise recommended is 50-75", inputs: [{ placeholder: "Extra Delay" }], buttons: [{ text: "Next" }, { text: "Cancel" }] }); let extraDelayResponse = await extraDelayModal.listen(); if (extraDelayResponse.button !== "0") return; let extraDelay = Number(extraDelayResponse.inputs[0].value); if (extraDelay === NaN) return new bb.Modal({ title: "Invalid Extra Delay.", buttons: [{ text: "Close" }] }); let confirmModal = new bb.Modal({ title: "Mass Open", description: `Are you sure you want to open ${qty.toLocaleString()}x ${pack}? This will cost ${cost.toLocaleString()} tokens!`, buttons: [{ text: "Start!" }, { text: "Cancel" }] }); let confirmResponse = await confirmModal.listen(); if (confirmResponse.button !== "0") return; document.querySelector(".bb_openButton").innerText = "Stop Opening"; let maxDelay = Object.values(blacket.rarities).map((x) => x.wait).reduce((curr, prev) => curr > prev ? curr : prev) + extraDelay; let opened = []; let openedCount = 0; let openPack = async () => new Promise((resolve, reject) => { blacket.requests.post("/worker3/open", { pack }, (data) => { if (data.error) reject(); resolve(data.blook); }); }); document.querySelector(".bb_openButton").innerText = "Stop Opening"; document.querySelector(".bb_openButton").onclick = () => openedCount = qty; while (openedCount < qty) { try { const attainedBlook = await openPack(); blacket.user.tokens -= blacket.packs[pack].price; $("#tokenBalance").html(`<img loading="lazy" src="/content/tokenIcon.webp" alt="Token" class="styles__tokenBalanceIcon___3MGhs-camelCase" draggable="false"><div>${blacket.user.tokens.toLocaleString()}</div>`); const delay = blacket.rarities[blacket.blooks[attainedBlook].rarity].wait - 45 + extraDelay; opened.push(attainedBlook); openedCount = opened.length; let count = opened.reduce((acc, blook) => { acc[blook] = (acc[blook] || 0) + 1; return acc; }, {}); Object.entries(count).map((x) => ` ${x[1]} ${x[0]}`).join(` `); document.querySelector(".bb_openedCount").innerHTML = `${pack} | ${openedCount}/${qty} opened`; document.querySelector(".bb_opened").innerHTML = Object.entries(count).map(([blook, qtyOf]) => { return `<div class="bb_openResult" style="color: ${blacket.rarities[blacket.blooks[blook].rarity].color};">${blook} x${qtyOf}</div>`; }).join(""); await new Promise((r) => setTimeout(r, delay)); } catch (err) { console.log(err); await new Promise((r) => setTimeout(r, maxDelay)); } } alert(`Open Complete! Opened ${qty}x ${pack}, spending ${cost.toLocaleString()} tokens!`); document.querySelector(".bb_openedCount").innerHTML = "Opening ended!"; document.querySelector(".bb_openButton").onclick = () => bb.plugins.massopen.start(); document.querySelector(".bb_openButton").innerText = "Start Opening"; }; document.body.insertAdjacentHTML("beforeend", ` <div class="bb_openModal"> <div class="bb_openIcons"> <i class="fas fa-arrows-up-down-left-right bb_openIcon" id="bb_openDragger"></i> <i class="fas fa-x bb_openIcon" onclick="document.querySelector('.bb_openModal').remove()"></i> </div> <div class="bb_openTitle">Pack Opening</div> <div class="bb_openedCount">Waiting to open...</div> <hr> <div class="bb_opened"></div> <div class="bb_openButtons"> <div class="bb_openButton" onclick="bb.plugins.massopen.start()">Start Opening</div> </div> </div> `); let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; let modal = document.querySelector(".bb_openModal"); let dragger = document.querySelector("#bb_openDragger"); dragger.onmousedown = (e) => { e.preventDefault(); pos3 = e.clientX; pos4 = e.clientY; document.onmouseup = () => { document.onmouseup = null; document.onmousemove = null; }; document.onmousemove = (e2) => { e2.preventDefault(); pos1 = pos3 - e2.clientX; pos2 = pos4 - e2.clientY; pos3 = e2.clientX; pos4 = e2.clientY; let top = modal.offsetTop - pos2 > 0 ? modal.offsetTop - pos2 : 0; let left = modal.offsetLeft - pos1 > 0 ? modal.offsetLeft - pos1 : 0; if (top + modal.offsetHeight + 15 <= window.innerHeight) modal.style.top = top + "px"; if (left + modal.offsetWidth + 15 <= window.innerWidth) modal.style.left = left + "px"; }; }; window.onresize = () => modal.style.top = modal.style.left = ""; } }); const __vite_glob_0_0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$l }, Symbol.toStringTag, { value: "Module" })); const index$k = () => createPlugin({ name: "April Fools 2023", description: "returns the 2023 april fools update.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], styles: ` .styles__sidebar___1XqWi-camelCase, .styles__left___9beun-camelCase, .styles__postsContainer___39_IQ-camelCase, .styles__middleWrapper___hjUyY-camelCase, .styles__header___22Ne2-camelCase, .styles__container___2VzTy-camelCase, .styles__input___2XTSp-camelCase { background-color: #dcd9d9; } .styles__background___2J-JA-camelCase, .styles__background___2J-JA-camelCase, .styles__blookGridContainer___AK47P-camelCase { background-color: #b5b5b5; } .styles__headerBadges___ffKa4-camelCase, .styles__statsContainer___QnrRB-camelCase, .styles__profileContainer___CSuIE-camelCase, .styles__tokenBalance___1FHgT-camelCase, .styles__infoContainer___2uI-S-camelCase, .styles__header___2O21B-camelCase, .styles__cardContainer___NGmjp-camelCase, .styles__plan___1OEy4-camelCase, .styles__perkContainer___2rw2I-camelCase, .styles__headerSide___1r1-b-camelCase, .styles__signUpButton___3_ch3-camelCase, .styles__loginButton___1e3jI-camelCase, .styles__chatEmojiButton___8RFa2-camelCase, .styles__button___2hNZo-camelCase, .styles__tradingContainer___B1ABS-camelCase, .styles__otherTokenAmount___SEGGS-camelCase, .styles__myTokenAmount___ANKHA-camelCase, .styles__horizontalBlookGridLine___4SAvz-camelCase, .styles__verticalBlookGridLine___rQWaZ-camelCase, .styles__profileDropdownMenu___2jUAA-camelCase, .styles__profileDropdownOption___ljZXD-camelCase { background-color: #9d9d9d; } .styles__button___2hNZo-camelCase { color: #3a3a3a; } .styles__pageButton___1wFuu-camelCase, .styles__bottomIcon___3Fswk-camelCase, .styles__containerHeaderInside___2omQm-camelCase, .styles__statNum___5RYSd-camelCase { color: #5f5a5a; } .styles__statContainer___QKuOF-camelCase, .styles__containerHeaderInside___2omQm-camelCase, .styles__containerHeader___3xghM-camelCase, .styles__containerHeaderRight___3xghM-camelCase { background-color: #d5d4d4; } #chatBox, .styles__chatInputContainer___gkR4A-camelCase { background-color: #d2cccc; } .styles__setText___1PQLQ-camelCase { color: #3a3939; } .styles__edge___3eWfq-camelCase, .styles__buttonFilled___23Dcn-camelCase { background-color: #ffffff; border-color: #ffffff; } .styles__lockedBlook___3oGaX-camelCase { filter: brightness(0.3); } #packSelector::-webkit-scrollbar, #blookSelector::-webkit-scrollbar, .styles__bazaarItems___KmNa2-camelCase::-webkit-scrollbar { display: none; } .styles__bazaarItems___KmNa2-camelCase { background-color: rgba(0, 0, 0, 0.33); } .styles__bazaarItem___Meg69-camelCase { background-color: #9d9d9d; } .styles__bazaarItem___Meg69-camelCase:hover { background-color: #3a3939; } .styles__container___3St5B-camelCase { background-color: #808080; } `, onLoad: () => { if (document.getElementsByClassName("styles__topRightRow___dQvxc-camelCase")[0] && location.pathname === "/market") { document.getElementsByClassName("styles__topRightRow___dQvxc-camelCase")[0].children[0].style.backgroundColor = "#9d9d9d"; } if (document.getElementsByClassName("styles__front___vcvuy-camelCase")[0] && location.pathname === "/blooks" || location.pathname === "/store" || location.pathname === "/bazaar") { Array.from(document.getElementsByClassName("styles__front___vcvuy-camelCase")).forEach((a) => { a.style.backgroundColor = "#9d9d9d"; }); Array.from(document.getElementsByClassName("styles__edge___3eWfq-camelCase")).forEach((a) => { a.style.backgroundColor = "#9d9a9a"; }); setInterval(() => { Array.from(document.getElementsByClassName("styles__front___vcvuy-camelCase")).forEach((a) => { a.style.backgroundColor = "#9d9d9d"; }); Array.from(document.getElementsByClassName("styles__edge___3eWfq-camelCase")).forEach((a) => { a.style.backgroundColor = "#9d9a9a"; }); }, 25); } if (document.getElementsByTagName("div")[0] && location.pathname === "/404" || location.pathname === "/502/" || location.pathname === "/blacklisted") { document.getElementsByTagName("div")[0].style.backgroundColor = "#b5b5b5"; document.getElementsByTagName("div")[2].style.backgroundColor = "#d5d4d4"; document.getElementsByTagName("div")[2].style.filter = "drop-shadow(white 0px 1px 3px)"; } if (document.getElementsByClassName("styles__background___2J-JA-camelCase")[0] && location.pathname === "/trade" || location.pathname === "/store") { document.getElementsByClassName("styles__background___2J-JA-camelCase")[0].style.backgroundColor = "#b5b5b5"; } Array.from(document.getElementsByTagName("input")).forEach((n) => { n.style.backgroundColor = "#9d9d9d"; }); setInterval(() => { Array.from(document.getElementsByTagName("div")).forEach((n) => { n.style.fontFamily = "Comic Sans MS"; }); Array.from(document.getElementsByTagName("a")).forEach((n) => { n.style.fontFamily = "Comic Sans MS"; }); Array.from(document.getElementsByTagName("text")).forEach((n) => { n.style.fontFamily = "Comic Sans MS"; }); Array.from(document.getElementsByTagName("div")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => node.nodeValue = node.nodeValue.toLowerCase()); }); Array.from(document.getElementsByTagName("a")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => node.nodeValue = node.nodeValue.toLowerCase()); }); Array.from(document.getElementsByTagName("text")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => node.nodeValue = node.nodeValue.toLowerCase()); }); }, 25); setTimeout(() => { Array.from(document.getElementsByTagName("div")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => { let letters = node.nodeValue.split(""); let randomIndex = Math.floor(Math.random() * letters.length); let randomIndex2 = Math.floor(Math.random() * letters.length); let temp = letters[randomIndex]; letters[randomIndex] = letters[randomIndex2]; letters[randomIndex2] = temp; node.nodeValue = letters.join(""); }); }); Array.from(document.getElementsByTagName("a")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => { let letters = node.nodeValue.split(""); let randomIndex = Math.floor(Math.random() * letters.length); let randomIndex2 = Math.floor(Math.random() * letters.length); let temp = letters[randomIndex]; letters[randomIndex] = letters[randomIndex2]; letters[randomIndex2] = temp; node.nodeValue = letters.join(""); }); }); Array.from(document.getElementsByTagName("text")).forEach((n) => { let textNodes = Array.from(n.childNodes).filter((node) => node.nodeType === 3); textNodes.forEach((node) => { let letters = node.nodeValue.split(""); let randomIndex = Math.floor(Math.random() * letters.length); let randomIndex2 = Math.floor(Math.random() * letters.length); let temp = letters[randomIndex]; letters[randomIndex] = letters[randomIndex2]; letters[randomIndex2] = temp; node.nodeValue = letters.join(""); }); }); }, 500); } }); const __vite_glob_0_1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$k }, Symbol.toStringTag, { value: "Module" })); const index$j = () => createPlugin({ name: "Bazaar Sniper", description: "pew pew! sniped right off the bazaar!", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], onStart: () => { let checkBazaar = setInterval(() => { if (blacket.login || blacket.config.path === "") return clearInterval(checkBazaar); if (!blacket.user) return; axios.get("/worker/bazaar").then((bazaar) => { bazaar.data.bazaar.forEach((bazaarItem) => { let blookData = blacket.blooks[bazaarItem.item]; if (!!!blookData || blookData.price < bazaarItem.price || bazaarItem.seller === blacket.user.username) return; axios.post("/worker/bazaar/buy", { id: bazaarItem.id }).then((purchase) => { if (purchase.data.error) return console.log(`[Bazaar Sniper] Error sniping Blook`, bazaarItem, purchase); console.log(`[Bazaar Sniper] Sniped a blook!`, bazaarItem); blacket.createToast({ message: `Sniped Blook ${bazaarItem.item} from seller ${bazaarItem.seller} with price ${bazaarItem.price}!` }); }); }); }); }, 750); } }); const __vite_glob_0_2 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$j }, Symbol.toStringTag, { value: "Module" })); const index$i = () => createPlugin({ name: "Better Chat", description: "enhances your chatting experience!", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /id="\${randomUsernameId}"/, replace: "", setting: "Click 2 Clan" }, { match: /style="color: \${data\.author\.co/, replace: `id="\${randomUsernameId}" style="color: \${data.author.co`, setting: "Click 2 Clan" }, { match: /style="color: \${data\.author\.clan\.color};"/, replace: `onclick="window.open('/clans/discover?name=\${encodeURIComponent(data.author.clan.name)}');" style="color: \${data.author.clan.color};"`, setting: "Click 2 Clan" }, { match: /\$\{blacket\.config\.path !== "trade" \? `<div class="styles__contextMenuItemContainer___m3Xa3-camelCase" id="message-context-quote">/, replace: `\${(data.author.id !== blacket.user.id) && blacket.config.path !== "trade" ? \`<div class="styles__contextMenuItemContainer___m3Xa3-camelCase" id="message-context-trade"> <div class="styles__contextMenuItemName___vj9a3-camelCase">Trade</div> <i class="styles__contextMenuItemIcon___2Zq3a-camelCase fas fa-hand-holding"></i> </div>\` : ""} \${blacket.config.path !== "trade" ? \`<div class="styles__contextMenuItemContainer___m3Xa3-camelCase" id="message-context-quote">` }, { match: /\$\(`#message-context-copy-id`\)\.click\(\(\) => navigator\.clipboard\.writeText\(data\.message\.id\)\);/, replace: `$('message-context-trade').click(() => blacket.tradeUser(data.author.id)); $(\`#message-context-copy-id\`).click(() => navigator.clipboard.writeText(data.message.id));` } ] } ], styles: ` .styles__chatMessageContainer__G1Z4P-camelCase { padding: 1vw 1.5vw; } .styles__chatContainer___iA8ZU-camelCase { height: calc(100% - 4.25vw); } div[style="position: absolute;bottom: 0;width: 100%;"] { bottom: 1.25vw !important; left: 2vw; width: calc(100% - 3vw) !important; } .styles__chatInputContainer___gkR4A-camelCase { border-radius: 10vw; } .styles__chatUploadButton___g39Ac-camelCase, .styles__chatEmojiButton___8RFa2-camelCase { border-radius: 50%; } .styles__chatEmojiPickerContainer___KR4aN-camelCase { border-radius: 0 0 0.5vw 0.5vw; bottom: 3.3vw; background-color: #2f2f2f; width: 19vw; } .styles__chatEmojiPickerBody___KR4aN-camelCase { left: unset; gap: 0.5vw; justify-content: center; } .styles__chatEmojiPickerHeader___FK4Ac-camelCase { font-size: 1.15vw; height: 3vw; font-weight: 800; background-color: #3f3f3f; } `, settings: [{ name: "Click 2 Clan", default: true }] }); const __vite_glob_0_3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$i }, Symbol.toStringTag, { value: "Module" })); const index$h = () => createPlugin({ name: "Better Notifications", description: "a new and improved notification system.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/all.js", replacement: [ { match: /\.styles__toastContainer___o4pCa-camelCase/, replace: `.toastMessage` }, { match: /\$\("body"\)\.append\(`<div class="s.*?<\/div><\/div>`\)/, replace: "bb.plugins.notifications(toast.title, toast.message, toast.audio);return;" } ] }, { file: "/lib/js/game.js", replacement: [ { match: /Notification\.permission == "granted"/, replace: "false", setting: "Disable Desktop" }, { match: /Notification\.permission !== "granted" && Notification\.permission !== "denied"/, replace: "false", setting: "Disable Desktop" }, { match: /3500/, replace: "1000" }, { match: /flyOut 0\.35s ease-in-out/, replace: `styles__oldGrowOut___3FTko-camelCase 0.5s linear` }, { match: /flyIn 0.35s ease-in-out/, replace: `styles__oldGrowIn___3FTko-camelCase 0.5s linear` } ] } ], styles: ` .toastMessage { animation: styles__oldGrowIn___3FTko-camelCase 0.5s linear forwards; background-color: #1f1f1f; border-radius: 5px; left: 0; right: 0; text-align: center; top: 20px; display: flex; flex-direction: column; padding: 5px 20px 10px 20px; position: absolute; margin: 0 auto; height: fit-content; cursor: pointer; } `, onLoad: () => { bb.plugins.notifications = (title, message, audio = true) => { let id2 = Math.random().toString(36).substring(2, 15); $("#app").append(` <div id='${id2}' class='toastMessage'> ${title ? `<text style='color: white; font-size:25px;'>${title}</text>` : ""} ${message ? `<text style='color: white; font-size:20px;'>${message}</text>` : ""} </div> `); if (audio) new Audio("/content/notification.ogg").play(); let timeout = setTimeout(() => { document.getElementById(id2).onclick = null; $(`#${id2}`).attr("style", "animation: styles__oldGrowOut___3FTko-camelCase 0.5s linear forwards;"); setTimeout(() => { $(`#${id2}`).remove(); blacket.toasts.shift(); if (blacket.toasts.length > 0) blacket.createToast(blacket.toasts[0], true); }, 1e3); }, 5e3); document.getElementById(id2).onclick = () => { clearTimeout(timeout); $(`#${id2}`).remove(); blacket.toasts.shift(); if (blacket.toasts.length > 0) blacket.createToast(blacket.toasts[0], true); }; }; }, settings: [{ name: "Disable Desktop", default: false }] }); const __vite_glob_0_4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$h }, Symbol.toStringTag, { value: "Module" })); const index$g = () => createPlugin({ name: "Better Replies", description: "overhauls the message reply system.", authors: [ { name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }, { name: "Syfe", avatar: "https://i.imgur.com/OKpOipQ.gif", url: "https://github.com/ItsSyfe" } ], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /var tem \= document\.querySelector\('\#chatContainer \.styles__chatMessageContainer__G1Z4P\-camelCase\:last\-child'\);/, replace: ` message = message.replace(/<\\/gradient=.*>/, ''); message = message.replace(/<gradient=.*>/, ''); message = message.replace(/<\\/#.*>/, ''); message = message.replace(/<#.*>/, ''); var tem = document.querySelector('#chatContainer .styles__chatMessageContainer__G1Z4P-camelCase:last-child'); ` }, { match: /quote`\).click\(\(\) => \{/, replace: `quote\`).click(() => {return;` }, { match: /\$\(`\#message-context-copy`\)/, replace: `$('#message-context-quote').click(() => $self.quote(data));$('#message-context-copy')` }, { match: /\$\(`\#message-\$\{data.message.id\}-r/, replace: `$(\`#message-\${data.message.id}-quote\`).click(() => $self.quote(data));$(\`#message-\${data.message.id}-r` }, { match: /let delay = 0;/, replace: `window.blacket.chat.update = () => chatBoxUpdate();let delay = 0;` } ] } ], quote: (data) => { let msg = `╭ From <@${data.author.id}> ${localStorage.getItem("chatColor") ? "</c>" : ""}${data.author.clan ? `**<${data.author.clan.color}>[ ${data.author.clan.name} ]</c>**` : ""} ${data.message.content} ${localStorage.getItem("chatColor") ? `<${localStorage.getItem("chatColor")}>` : ""}`; document.querySelector("#chatBox").value = msg; document.querySelector("#chatBox").focus(); blacket.chat.update(); } }); const __vite_glob_0_5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$g }, Symbol.toStringTag, { value: "Module" })); const index$f = () => createPlugin({ name: "Blook Utilities", description: "enhances the blook manager experience.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/blooks.js", replacement: [ { match: /\`\$\{blacket\.user\.blooks\[blook\]\.toLocaleString\(\)\} Owned\`/, replace: `bb.plugins.blookutils ? bb.plugins.blookutils.blooks[blook].toLocaleString() + ' Owned' : \`\${blacket.user.blooks[blook].toLocaleString()} Owned\`` }, { match: /let packBlooks/, replace: "window.packBlooks" }, { match: />List<\/div>/, replace: `>Next</div>` }, { match: /blacket\.listBlook\(\$\(.*?\)\.val\(\)\);/, replace: ` let amount = $('.styles__numRow___xh98F-camelCase > div:nth-child(1) > input:nth-child(1)').val(); $('.arts__modal___VpEAD-camelCase').remove(); document.querySelector('body').insertAdjacentHTML('beforeend', \`<div class='arts__modal___VpEAD-camelCase'> <form class='styles__container___1BPm9-camelCase'> <div class='styles__text___KSL4--camelCase'>List \${blacket.blooks.selected} Blook how many times?</div> <div class='styles__holder___3CEfN-camelCase'> <div class='styles__numRow___xh98F-camelCase'> <div style='border: 0.156vw solid rgba(0, 0, 0, 0.17);border-radius: 0.313vw;width: 90%;height: 2.604vw;margin: 0.000vw;display: flex;flex-direction: row;align-items: center;'> <input style=' border: none;height: 2.083vw;line-height: 2.083vw;font-size: 1.458vw;text-align: center;font-weight: 700;font-family: Nunito, sans-serif;color: #ffffff;background-color: #3f3f3f;outline: none;width: 100%;' placeholder='Price' maxlength='3' value='1'> </div> </div> <div class='styles__buttonContainer___2EaVD-camelCase'> <div id='yesButton' class='styles__button___1_E-G-camelCase styles__button___3zpwV-camelCase' role='button' tabindex='0'> <div class='styles__shadow___3GMdH-camelCase'></div> <div class='styles__edge___3eWfq-camelCase' style='background-color: #2f2f2f;'></div> <div class='styles__front___vcvuy-camelCase styles__buttonInside___39vdp-camelCase' style='background-color: #2f2f2f;'>List</div> </div> <div id='noButton' class='styles__button___1_E-G-camelCase styles__button___3zpwV-camelCase' role='button' tabindex='0'> <div class='styles__shadow___3GMdH-camelCase'></div> <div class='styles__edge___3eWfq-camelCase' style='background-color: #2f2f2f;'></div> <div class='styles__front___vcvuy-camelCase styles__buttonInside___39vdp-camelCase' style='background-color: #2f2f2f;'>Cancel</div> </div> </div> </div> <input type='submit' style='opacity: 0; display: none;' /> </form> </div>\`); $('.styles__container___1BPm9-camelCase').submit((event) => { event.preventDefault(); blacket.listBlook($('.styles__numRow___xh98F-camelCase > div:nth-child(1) > input:nth-child(1)').val()); }); $('.styles__numRow___xh98F-camelCase > div:nth-child(1) > input:nth-child(1)').focus(); $('#yesButton').click(async () => { let times = parseInt($('.styles__numRow___xh98F-camelCase > div:nth-child(1) > input:nth-child(1)').val()); blacket.startLoading(); for (let i = 0; i < times; i++) { blacket.listBlook(amount); await new Promise(resolve => setTimeout(resolve, 500 * times)); }; blacket.stopLoading(); }); $('#noButton').click(() => { $('.arts__modal___VpEAD-camelCase').remove(); }); ` } ] } ], onStart: () => { if (!location.pathname.startsWith("/blooks")) return; blacket.listBlook = (price) => { if (price == `` || price == 0) return; $(".arts__modal___VpEAD-camelCase").remove(); axios.post("/worker/bazaar/list", { item: blacket.blooks.selected, price }).then((list) => { if (list.data.error) { blacket.createToast({ title: "Error", message: list.data.reason, icon: "/content/blooks/Error.png", time: 5e3 }); return blacket.stopLoading(); } blacket.user.blooks[blacket.blooks.selected] -= 1; if (blacket.user.blooks[blacket.blooks.selected] < 1) { $(`#${blacket.blooks.selected.replaceAll(" ", "-").replaceAll("'", "_")} > div:nth-child(2)`).remove(); $(`#${blacket.blooks.selected.replaceAll(" ", "-").replaceAll("'", "_")}`).append(`<i class='fas fa-lock styles__blookLock___3Kgua-camelCase' aria-hidden='true'></i>`); $(`#${blacket.blooks.selected.replaceAll(" ", "-").replaceAll("'", "_")}`).attr("style", "cursor: auto;"); $(`#${blacket.blooks.selected.replaceAll(" ", "-").replaceAll("'", "_")} > div:nth-child(1)`).attr("class", "styles__blookContainer___36LK2-camelCase styles__blook___bNr_t-camelCase styles__lockedBlook___3oGaX-camelCase"); delete blacket.user.blooks[blacket.blooks.selected]; blacket.blooks.selected = Object.keys(blacket.user.blooks)[Math.floor(Math.random() * Object.keys(blacket.user.blooks).length)]; } else $(`#${blacket.blooks.selected.replaceAll(" ", "-").replaceAll("'", "_")} > div:nth-child(2)`).html(blacket.user.blooks[blacket.blooks.selected].toLocaleString()); blacket.selectBlook(blacket.blooks.selected); }); }; $(`<style>.styles__left___9beun-camelCase { height: calc(100% - 6.125vw); top: 4.563vw; } .bb_dupeManager { display: flex; justify-content: space-between; gap: 3vw; position: absolute; left: 2.5%; width: calc(95% - 22.396vw); } .bb_dupeManager > .styles__button___1_E-G-camelCase { width: 100%; margin-left: 0; text-align: center; top: 1vw; } .bb_userSelector { position: absolute; top: calc(50% + 15.417vw); right: 2.5%; width: 20.833vw; display: flex; flex-direction: row; align-items: center; justify-content: space-evenly; } .bb_userSelectBtn { margin: 0.521vw; width: 100%; } .bb_userSelectText { width: 80%; justify-content: space-between; } #bb_userSelectUsername { font-family: 'Titan One'; }</style> <div class='bb_userSelector'> <div id='sellButton' class='styles__button___1_E-G-camelCase bb_userSelectBtn' role='button' tabindex='0'> <div class='styles__shadow___3GMdH-camelCase'></div> <div class='styles__edge___3eWfq-camelCase' style='background-color: #2f2f2f;'></div> <div class='styles__front___vcvuy-camelCase' style='background-color: #2f2f2f;'> <div class='styles__rightButtonInside___14imT-camelCase bb_userSelectText'> <span id='bb_userSelectUsername'>User: ${blacket.user.username}</span> <i class='bb_userSelectIcon fas fa-caret-down'></i> </div> </div> </div> </div>`).insertAfter($(".styles__rightButtonRow___3a0GF-camelCase")); document.querySelector(".bb_userSelectBtn").onclick = async () => { let modal = new bb.Modal({ title: "Blook Viewer", description: "Enter a username to search their blooks.", inputs: [{ placeholder: "Username" }], buttons: [{ text: "Search" }, { text: "Cancel" }] }); let result = await modal.listen(); if (result.button.toString() === "0") { axios.get("/worker2/user/" + result.inputs[0].value).then((u) => { if (u.data.error) return new bb.Modal({ title: "User not found.", buttons: [{ text: "Close" }] }); const lock = (blook) => { let element = document.getElementById(blook.replaceAll("'", "_").replaceAll(" ", "-")); if (!element) return; element.children[0].classList.add("styles__lockedBlook___3oGaX-camelCase"); element.children[1].outerHTML = `<i class='fas fa-lock styles__blookLock___3Kgua-camelCase' aria-hidden='true'></i>`; }; const unlock = (blook, qty, rarity) => { let element = document.getElementById(blook.replaceAll("'", "_").replaceAll(" ", "-")); if (!element) return; element.children[0].classList.remove("styles__lockedBlook___3oGaX-camelCase"); element.children[1].outerHTML = `<div class='styles__blookText___3AMdK-camelCase' style='background-color: ${blacket.rarities[rarity].color};'>${qty}</div>`; }; let blooks2 = [...document.querySelectorAll(".styles__blookContainer___3JrKb-camelCase")].map((a) => a.id); blooks2.forEach((b) => lock(b)); let containers = [...document.querySelectorAll(".styles__setBlooks___3xamH-camelCase")]; let miscList = containers[containers.length - 1]; miscList.replaceChildren(); let user = u.data.user; bb.plugins.blookutils = { viewingSelf: false, blooks: user.blooks }; document.querySelector("#bb_userSelectUsername").innerText = `User: ${user.username}`; Object.entries(user.blooks).forEach((blook) => { if (packBlooks.includes(blook[0])) return unlock(blook[0], blook[1], blacket.blooks[blook[0]].rarity); if (!blacket.blooks[blook[0]]) return; let quantity; if (blacket.rarities[blacket.blooks[blook[0]].rarity] && blacket.rarities[blacket.blooks[blook[0]].rarity].color == "rainbow") quantity = `<div class='styles__blookText___3AMdK-camelCase' style='background-image: url('/content/rainbow.gif');'>${blook[1].toLocaleString()}</div></div>`; else quantity = `<div class='styles__blookText___3AMdK-camelCase' style='background-color: ${blacket.rarities[blacket.blooks[blook[0]].rarity].color};'>${blook[1].toLocaleString()}</div></div>`; miscList.insertAdjacentHTML("beforeend", `<div id='${blook[0].replaceAll(" ", "-").replaceAll("'", "_")}' class='styles__blookContainer___3JrKb-camelCase' style='cursor: pointer' role='button' tabindex='0'><div class='styles__blookContainer___36LK2-camelCase styles__blook___bNr_t-camelCase'><img loading='lazy' src='${blacket.blooks[blook[0]].image}' draggable='false' class='styles__blook___1R6So-camelCase' /></div>${quantity}`); document.getElementById(blook[0].replaceAll(" ", "-").replaceAll("'", "_")).addEventListener("click", () => blacket.selectBlook(blook[0])); }); }); modal.close(); } else modal.close(); }; document.querySelector(".arts__profileBody___eNPbH-camelCase").insertAdjacentHTML("afterbegin", ` <div class="bb_dupeManager"> <div id='checkDupes' class='styles__button___1_E-G-camelCase' role='button' tabindex='0'> <div class='styles__shadow___3GMdH-camelCase'></div> <div class='styles__edge___3eWfq-camelCase' style='background-color: #2f2f2f;'></div> <div class='styles__front___vcvuy-camelCase' style='background-color: #2f2f2f;'> <div class='styles__rightButtonInside___14imT-camelCase'>Check Dupes</div> </div> </div> </div> `); document.querySelector("#checkDupes").onclick = () => { new bb.Modal({ title: "Duplicate Blooks", description: Object.entries(blacket.user.blooks).filter((blook) => blook[1] > 1).map(([blook, qty]) => `<span style="color: ${blacket.rarities[blacket.blooks[blook].rarity].color}">${blook}: ${qty.toLocaleString()}</span>`).join(" | "), buttons: [{ text: "Close" }] }); }; } }); const __vite_glob_0_6 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$f }, Symbol.toStringTag, { value: "Module" })); const badges = async (...args2) => { if (args2[0]) axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) bb.plugins.deafbot.send(`Error fetching user ${args2[0]}: **${u.data.reason}**`); else bb.plugins.deafbot.send(`**${u.data.user.username}**'s Badges: ${u.data.user.badges.join(" ")}`); }); else bb.plugins.deafbot.send(`Your Badges: ${blacket.user.badges.join(" ")}`); }; const blocks = async (...args2) => { switch (args2[0]) { case "list": axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching blocks: **${f.data.reason}**`); else bb.plugins.deafbot.send(`**${f.data.blocks.length}** blocks: ${f.data.blocks.map((f2) => f2.username).join(", ")}`); }); break; case "add": if (!args2[1]) return bb.plugins.deafbot.send(`Whoa - you want to block yourself or something? Tell me who to block!`); axios.post("/worker/friends/block", { user: args2[1] }).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error blocking user: **${f.data.reason}**. I guess they get mercy for now.`); else bb.plugins.deafbot.send(`Blocked **${args2[1]}**. You must be in a GREAT mood!`); }); break; case "remove": if (!args2[1]) return bb.plugins.deafbot.send(`Tell me to remove, or keep hating people. I don't care.`); axios.post("/worker/friends/unblock", { user: args2[1] }).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error removing block: **${f.data.reason}**. L them.`); else bb.plugins.deafbot.send(`You are no longer blocking **${args2[1]}**. How nice you must feel today!`); }); break; case "check": if (!args2[1]) return bb.plugins.deafbot.send(`Specify a username to check.`); axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching blocks: **${f.data.reason}**`); else bb.plugins.deafbot.send(`**${args2[1]}** is **${f.data.blocks.map((a) => a.username).map((a) => a.toLowerCase()).includes(args2[1].toLowerCase()) ? "blocked" : "not blocked"}**.`); }); break; default: bb.plugins.deafbot.send(`Subcommands: **list** ~ **add** ~ **remove** ~ **check**`); break; } }; const blooks = async (...args2) => { if (!args2[0]) return bb.plugins.deafbot.send(`You have **${Object.keys(blacket.user.blooks).length}** unique blooks (**${Object.values(blacket.user.blooks).reduce((partialSum, a) => partialSum + a, 0)}** total), consisting of **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Uncommon").length}** Uncommons, **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Rare").length}** Rares, **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Epic").length}** Epics, **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Legendary").length}** Legendaries, **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Chroma").length}** Chromas, and **${Object.keys(blacket.user.blooks).filter((b) => blacket.blooks[b].rarity === "Mystical").length}** Mysticals.`); if (args2[0] === "check" && args2[1]?.length) { let blook = blacket.blooks[args2.slice(1).join(" ")]; if (!blook) return bb.plugins.deafbot.send(`No blook found for **${args2.slice(1).join(" ")}**. This is case-sensitive.`); if (blacket.user.blooks[args2.slice(1).join(" ")]) return bb.plugins.deafbot.send(`You have **${blacket.user.blooks[args2.slice(1).join(" ")]}x** ${args2.slice(1).join(" ")}.`); else return bb.plugins.deafbot.send(`You don't have **${args2.slice(1).join(" ")}**.`); } axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) bb.plugins.deafbot.send(`Error fetching user ${args2[0]}: **${u.data.reason}**`); if (args2[1]) { let blook = blacket.blooks[args2.slice(1).join(" ")]; if (!blook) return bb.plugins.deafbot.send(`No blook found for **${args2.slice(1).join(" ")}**. This is case-sensitive.`); if (u.data.user.blooks[args2.slice(1).join(" ")]) return bb.plugins.deafbot.send(`**${u.data.user.username}** has **${u.data.user.blooks[args2.slice(1).join(" ")]}x** ${args2.slice(1).join(" ")}.`); else return bb.plugins.deafbot.send(`**${u.data.user.username}** doesn't have **${args2.slice(1).join(" ")}**.`); } bb.plugins.deafbot.send(`**${u.data.user.username}** has **${Object.keys(u.data.user.blooks).length}** unique blooks (**${Object.values(u.data.user.blooks).reduce((partialSum, a) => partialSum + a, 0)}** total), consisting of **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Uncommon").length}** Uncommons, **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Rare").length}** Rares, **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Epic").length}** Epics, **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Legendary").length}** Legendaries, **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Chroma").length}** Chromas, and **${Object.keys(u.data.user.blooks).filter((b) => blacket.blooks[b].rarity === "Mystical").length}** Mysticals.`); }); }; const booster = async () => { let b = await axios.get("/data/index.json"); if (!b.data.booster.active) return bb.plugins.deafbot.send("There is no active booster."); let u = await axios.get("/worker2/user/" + b.data.booster.user); bb.plugins.deafbot.send(`<@${u.data.user.id}> (${u.data.user.username}) is boosting with a ${b.data.booster.multiplier}x booster until ${new Date(b.data.booster.time * 1e3).toLocaleTimeString().replaceAll(" ", " ")}!`); }; const cheapest = async (...args2) => { axios.get("/worker/bazaar?item=" + args2.join(" ")).then((b) => { if (b.data.error) return bb.plugins.deafbot.send(`Error fetching bazaar: **${b.data.reason}**`); let items = b.data.bazaar.filter((i) => i.item.toLowerCase() === args2.join(" ").toLowerCase()); if (!items.length) return bb.plugins.deafbot.send(`No items found for **${args2.join(" ")}**.`); let cheapest2 = items.sort((a, b2) => a.price - b2.price)[0]; bb.plugins.deafbot.send(`The cheapest listing for **${cheapest2.item}** costs **${cheapest2.price.toLocaleString()}** tokens & is sold by **${cheapest2.seller}**.`); }); }; const claim = async () => { let claim2 = await axios.get("/worker/claim"); if (claim2.data.error) bb.plugins.deafbot.send(`Error: **${claim2.data.reason}**`); else bb.plugins.deafbot.send(`Claimed **${blacket.config.rewards[claim2.data.reward - 1]}** tokens!`); }; const clan = async (...args2) => { if (!args2[0]) axios.get("/worker/clans").then((clan2) => { if (clan2.data.error) return bb.plugins.deafbot.send(`Error fetching your clan: **${clan2.data.reason}**`); let clanData = clan2.data.clan; bb.plugins.deafbot.send(`You are in the ${clanData.members.map((a) => a.username).includes("Death") ? "esteemed " : ""}**${clanData.name}** clan, owned by **${clanData.owner.username}**. You have **${clanData.members.length}** (**${clanData.online}** online) members, and **[REDACTED]** investments. The clan **${clanData.safe ? "is" : "is not"}** in safe mode.`); }); else axios.get("/worker/clans/discover/name/" + args2.join(" ")).then((clan2) => { if (clan2.data.error) return bb.plugins.deafbot.send(`Error fetching clan: **${clan2.data.reason}**`); clan2 = clan2.data.clans[0]; bb.plugins.deafbot.send(`The ${clan2.members.map((a) => a.username).includes("Death") ? "esteemed " : ""}**${clan2.name}** clan is owned by **${clan2.owner.username}**. They have **${clan2.members.length}** (**${clan2.online}** online) members, and **[REDACTED]** investments. The clan **${clan2.safe ? "is" : "is not"}** in safe mode.`); }); }; const color = async (...args2) => { if (!args2[0]) return bb.plugins.deafbot.send(`Choose a subcommand: **name** or **text**.`); if (args2[0].toLowerCase() === "name") axios.post("https://blacket.org/worker/settings/color", { color: `#${args2[1].replace("#", "")}` }).then((r) => { if (r.data.error) return bb.plugins.deafbot.send(`Error changing name color: **${r.data.reason}**`); bb.plugins.deafbot.send(`Name color was set to **#${args2[1].replace("#", "")}**!`); }); if (args2[0].toLowerCase() === "text") { if (args2[1] === "gradient") { let formed = `${args2[1]}=[${args2[2]}: ${args2.slice(3).join(", ")}]`; localStorage.setItem("chatColor", formed); bb.plugins.deafbot.send(`Gradient was updated!`); } else { localStorage.setItem("chatColor", args2[1]); bb.plugins.deafbot.send(`Text color was set to **${args2[1]}**!`); } } }; const $eval = async (...args) => { eval(` let send = (msg) => bb.plugins.deafbot.send(msg); ${args.join(" ")} `); }; const friends = async (...args2) => { switch (args2[0]) { case "list": axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching friends: **${f.data.reason}**`); else bb.plugins.deafbot.send(`You have **${f.data.friends.length}** friends: ${f.data.friends.map((f2) => f2.username).join(", ")}`); }); break; case "request": if (!args2[1]) return bb.plugins.deafbot.send(`Tell me who you actually want to request, you friendless fool.`); axios.post("/worker/friends/request", { user: args2[1] }).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error friending: **${f.data.reason}** - ig you just don't want friends.`); else bb.plugins.deafbot.send(`Sent a friend request to **${args2[1]}**. How kind of you :3`); }); break; case "accept": if (!args2[1]) return bb.plugins.deafbot.send(`Tell me who you actually want to accept, you friendless fool.`); axios.post("/worker/friends/accept", { user: args2[1] }).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error accepting: **${f.data.reason}** - ig you just don't want friends.`); else bb.plugins.deafbot.send(`Accepted **${args2[1]}**'s friend request! How kind of you :3`); }); break; case "remove": if (!args2[1]) return bb.plugins.deafbot.send(`So you want to KEEP all your bad friends? Tell me who to get rid of!`); axios.post("/worker/friends/remove", { user: args2[1] }).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error removing: **${f.data.reason}** - L you. With them forever.`); else bb.plugins.deafbot.send(`You are no longer friended to **${args2[1]}**. How nice you must feel today!`); }); break; case "check": if (!args2[1]) return bb.plugins.deafbot.send(`Specify a username to check.`); axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching friends: **${f.data.reason}**`); else bb.plugins.deafbot.send(`**${args2[1]}** **${f.data.friends.map((a) => a.username).map((a) => a.toLowerCase()).includes(args2[1].toLowerCase()) ? "is" : "isn't"}** your friend.`); }); break; case "requests": case "incoming": case "pending": case "recieving": axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching friends: **${f.data.reason}**`); else bb.plugins.deafbot.send(`You have **${f.data.receiving.length}** incoming requests: ${f.data.receiving.map((f2) => f2.username).join(", ")}`); }); break; case "requested": case "outgoing": case "sending": axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching friends: **${f.data.reason}**`); else bb.plugins.deafbot.send(`You have **${f.data.sending.length}** outgoing requests: ${f.data.sending.map((f2) => f2.username).join(", ")}`); }); break; case "mutual": if (!args2[1]) return bb.plugins.deafbot.send(`Tell me who you want to check for mutual friends, fool.`); axios.get("/worker2/user/" + args2[1]).then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error: **${f.data.reason}**`); else bb.plugins.deafbot.send(`You and **${f.data.user.username}** have **${f.data.user.friends.length}** mutual friends: ${f.data.user.friends.map((f2) => blacket.friends.friends.find((fr) => fr.id === f2)).map((a) => a?.username).filter((a) => a).join(", ")}`); }); break; case "count": axios.get("/worker2/friends").then((f) => { if (f.data.error) bb.plugins.deafbot.send(`Error fetching friends: **${f.data.reason}**`); else bb.plugins.deafbot.send(`You have **${f.data.friends.length}** friends.`); }); break; default: bb.plugins.deafbot.send(`Subcommands: **list** ~ **request** ~ **accept** ~ **remove** ~ **check** ~ **mutual** ~ **requests** ~ **sending** ~ **count**`); break; } }; const id = async (...args2) => { if (args2[0]) axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) bb.plugins.deafbot.send(`Error: **${u.data.reason}**`); else bb.plugins.deafbot.send(`**${u.data.user.username}**'s ID: ${u.data.user.id}`); }); else bb.plugins.deafbot.send(`Your ID: ${blacket.user.id}`); }; const level = async (...args2) => { let calculate = (exp) => { let level2 = 0; let needed = 0; for (let i = 0; i <= 27915; i++) { needed = 5 * Math.pow(level2, blacket.config.exp.difficulty) * level2; if (exp >= needed) { exp -= needed; level2++; } } return { level: level2, needed, exp }; }; if (args2[0]) return axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) return bb.plugins.deafbot.send(`Error fetching user ${args2[0]}: **${u.data.reason}**`); let levelData2 = calculate(u.data.user.exp); bb.plugins.deafbot.send(`**${u.data.user.username}** is level **${levelData2.level}**. They need **${Math.round(levelData2.needed).toLocaleString()} XP** to advance, and they're currently **${Math.round(levelData2.exp / levelData2.needed * 100)}%** complete.`); }); let levelData = blacket.user.level && blacket.user.needed ? blacket.user : calculate(blacket.user.exp); bb.plugins.deafbot.send(`You are level **${levelData.level}**. You need **${Math.round(levelData.needed).toLocaleString()} XP** to advance, and you're currently **${Math.round(levelData.exp / levelData.needed * 100)}%** complete.`); }; const tokens = async (...args2) => { if (args2[0]) axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) bb.plugins.deafbot.send(`Error fetching user ${args2[0]}: **${u.data.reason}**`); else bb.plugins.deafbot.send(`**${u.data.user.username}** currently has **${u.data.user.tokens.toLocaleString()}** tokens.`); }); else bb.plugins.deafbot.send(`You currently have **${blacket.user.tokens.toLocaleString()}** tokens.`); }; const trade = async (...args2) => { if (!args2[0]) return bb.plugins.deafbot.send(`Who are you trying to trade, yourself?`); axios.get("/worker2/user/" + args2[0]).then((u) => { if (u.data.error) return bb.plugins.deafbot.send(`Error fetching user ${args2[0]}: **${u.data.reason}**`); axios.post("/worker/trades/requests/send", { user: u.data.user.id.toString() }).then((r) => { if (r.data.error) bb.plugins.deafbot.send(`Error sending trade request to ${u.data.user.username}: **${r.data.reason}**`); else bb.plugins.deafbot.send(`Sent a trade request to **${u.data.user.username}**.`); }); }); }; const commands = { badges, blocks, blooks, booster, cheapest, claim, clan, color, eval: $eval, friends, id, level, tokens, trade }; const index$e = () => createPlugin({ name: "DeafBot", description: "the chatbot you know and love.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /blacket\.sendMessage =\ async \((.*?)\) => \{/, replace: `blacket.sendMessage = async (room, content, instantSend) => { let rawContent = content.replace(/<(gradient=\\[(?:up|down|left|right|\\d{1,3}deg)(?: |):(?: |)(?:(?:(?:black|lime|white|brown|magenta|cyan|turquoise|red|orange|yellow|green|blue|purple|\\#[0-9a-fA-F]{6})(?:, |,| ,| , |)){2,7})\\]|black|lime|white|brown|magenta|cyan|turquoise|red|orange|yellow|green|blue|purple|(\\#[0-9a-fA-F]{6}))>(.+?)<\\/([^&]+?)>/g, (...args) => { return args[3]; }); if (rawContent.startsWith(' ')) rawContent = rawContent.slice(1); if (rawContent.startsWith(atob('JA==')) && !instantSend) { let data = rawContent.split(' '); let command = data[0].slice(1); let args = data.slice(1); console.log(\`Executed BB command "\${command}" with args\`, args); if (!bb.plugins.deafbot.commands[command]) return bb.plugins.deafbot.send('Command not found.'); bb.plugins.deafbot.commands[command](...args); return; }; ` } ] } ], onLoad: () => { bb.plugins.deafbot = { send: (msg) => { let prefix = "**$ sudo node deafbot.js** > > > "; blacket.sendMessage(blacket.chat.room, prefix + msg, true); }, commands }; } }); const __vite_glob_0_7 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$e }, Symbol.toStringTag, { value: "Module" })); const index$d = () => createPlugin({ name: "Double Leaderboard", description: "see both leaderboards together.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/leaderboard.js", replacement: [ { match: /div:nth-child\(4\) > div:nth-child\(1\)/, replace: "div:nth-child(3) > div:nth-child(2)" }, { match: /\$\(".styles__containerHeaderRight___3xghM-camelCase"/, replace: ` document.querySelector('.styles__topStats___3qffP-camelCase').insertAdjacentHTML('afterend', \`<div class="styles__topStats___3qffP-camelCase" style="text-align: center;font-size: 2.604vw;margin-top: 0.521vw;display:block;"></div>\`); document.querySelector('.styles__statsContainer___QnrRB-camelCase > div:nth-child(4)').remove(); $(".styles__containerHeaderRight___3xghM-camelCase" ` }, { match: / \(\$\{data.me.exp.ex(.*?)">\)/, replace: "" }, { match: / \(\$\{data.ex(.*?)">\)/, replace: "" } ] } ], onStart: () => { if (location.pathname.includes("leaderboard")) document.body.insertAdjacentHTML("beforeend", `<style> .styles__statsContainer___QnrRB-camelCase > div:nth-child(3) { display: flex; gap: 2vw; padding: 2vw 1.5vw; } .styles__topStats___3qffP-camelCase { font-size: 1.8vw !important; } .styles__containerHeaderRight___3xghM-camelCase { display: none; } </style>`); } }); const __vite_glob_0_8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$d }, Symbol.toStringTag, { value: "Module" })); const index$c = () => createPlugin({ name: "Extra Stats", description: "gives you extra stats for users.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/stats.js", replacement: [ { match: /\$\("#messages"\)\.html\(`\$\{user\.misc\.messages\.toLocaleString\(\)\}`\);/, replace: ` $("#messages").html(user.misc.messages.toLocaleString()); $("#stat_id").html(user.id); $("#stat_created").html(new Date(user.created * 1000).toLocaleString('en-US', { year: '2-digit', month: '2-digit', day: '2-digit', timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone })); $("#stat_lastonline").removeAttr('timestamped'); $("#stat_lastonline").text(\`<t:\${user.modified}:R>\`); ` } ] } ], onLoad: () => { if (location.pathname.startsWith("/stats")) document.querySelector(".styles__statsContainer___QnrRB-camelCase").insertAdjacentHTML("afterend", ` <div class="styles__statsContainer___QnrRB-camelCase"> <div class="styles__containerHeader___3xghM-camelCase"> <div class="styles__containerHeaderInside___2omQm-camelCase">Account</div> </div> <div class="styles__topStats___3qffP-camelCase"> <div class="styles__statContainer___QKuOF-camelCase" currentitem="false"> <div class="styles__statTitle___z4wSV-camelCase">ID</div> <div id="stat_id" class="styles__statNum___5RYSd-camelCase">0</div> <img loading="lazy" src="https://cdn-icons-png.flaticon.com/512/3596/3596097.png" class="styles__statImg___3DBXt-camelCase" draggable="false"> </div> <div class="styles__statContainer___QKuOF-camelCase" currentitem="false"> <div class="styles__statTitle___z4wSV-camelCase">Created</div> <div id="stat_created" class="styles__statNum___5RYSd-camelCase">0/0/0</div> <img loading="lazy" src="https://cdn-icons-png.flaticon.com/512/4305/4305432.png" class="styles__statImg___3DBXt-camelCase" draggable="false"> </div> <div class="styles__statContainer___QKuOF-camelCase" currentitem="false"> <div class="styles__statTitle___z4wSV-camelCase">Last Online</div> <div id="stat_lastonline" class="styles__statNum___5RYSd-camelCase" style="font-size: 0.9vw;text-align:center;">0/0/0</div> <img loading="lazy" src="https://cdn.discordapp.com/emojis/1102897525192663050.png?size=2048&quality=lossless" class="styles__statImg___3DBXt-camelCase" draggable="false"> </div> </div> </div> `); } }); const __vite_glob_0_9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$c }, Symbol.toStringTag, { value: "Module" })); const index$b = () => createPlugin({ name: "Highlight Rarity", description: "displays the rarity of Bazaar blooks.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/bazaar.js", replacement: [ { match: /"\/content\/blooks\/Error\.png"\}" /, replace: `"/content/blooks/Error.png"}" style="filter: drop-shadow(0 0 7px \${blacket.rarities[blacket.blooks[blook].rarity].color});" ` }, { match: /class="styles__bazaarItemImage___KriA4-camelCase" /, replace: `class="styles__bazaarItemImage___KriA4-camelCase" \${blacket.blooks[listing.item] ? \`style="filter: drop-shadow(0 0 7px \${blacket.rarities[blacket.blooks[listing.item].rarity].color});"\` : ''} ` } ] } ] }); const __vite_glob_0_10 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$b }, Symbol.toStringTag, { value: "Module" })); const index$a = () => createPlugin({ name: "Internals", description: "the internals of BetterBlacket.", authors: [{ name: "Internal" }], required: true, patches: [ { file: "/lib/js/home.js", replacement: [ { match: /blacket\.stopLoading\(\);/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');" }, { match: /if \(blacket\.config\)/, replace: "if (window?.blacket?.config)" } ] }, { file: "/lib/js/auth.js", replacement: [ { match: /blacket\.htmlEncode\s*=\s*\(\s*s\s*\)\s*=>\s*{/, replace: "bb.events.dispatch('pageInit');blacket.htmlEncode = (s) => {" }, { match: /blacket\.config/, replace: "window?.blacket?.config" } ] }, { file: "/lib/js/terms.js", replacement: [ { match: /blacket\.stopLoading\(\);/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');" }, { match: /blacket\.config/, replace: "window?.blacket?.config" } ] }, { file: "/lib/js/stats.js", replacement: [ { match: /blacket\.setUser\(blacket\.user\)\;/, replace: "blacket.setUser(blacket.user);bb.events.dispatch('pageInit');" }, { match: /blacket\.user\s*&&\s*blacket\.friends/, replace: "window?.blacket?.user && window?.blacket?.friends" } ] }, { file: "/lib/js/leaderboard.js", replacement: [ { match: /blacket\.stopLoading\(\);/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/clans/my-clan.js", replacement: [ { match: /\$\("#clanInvestmentsButton"\)\.click\(\(\) \=\> \{/, replace: `bb.events.dispatch('pageInit');$("#clanInvestmentsButton").click(() => {` }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" }, { match: /item.user\).avatar/, replace: `item.user)?.avatar || '/content/blooks/Error.png'` } ] }, { file: "/lib/js/clans/discover.js", replacement: [ { match: /blacket\.stopLoading\(\)\;/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/market.js", replacement: [ { match: /blacket\.showBuyItemModal =/, replace: "bb.events.dispatch('pageInit');blacket.showBuyItemModal =" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/blooks.js", replacement: [ { match: /blacket\.appendBlooks\(\)\;/, replace: "blacket.appendBlooks();bb.events.dispatch('pageInit');" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/bazaar.js", replacement: [ { match: /\}\);\s*blacket\.getBazaar\(\);/, replace: "});blacket.getBazaar();bb.events.dispatch('pageInit');" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/inventory.js", replacement: [ { match: /blacket\.stopLoading\(\);\s*\}\s*else\s*setTimeout\(reset,\s*1\);/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');} else setTimeout(reset, 1);" }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/settings.js", replacement: [ { match: /\$\(\"#tradeRequestsButton\"\).click\(\(\) \=\> \{/, replace: `bb.events.dispatch('pageInit');$("#tradeRequestsButton").click(() => {` }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/store.js", replacement: [ { match: /\$\("#buy1hBoosterButton"\)\.click\(\(\) => \{/, replace: `bb.events.dispatch('pageInit');$("#buy1hBoosterButton").click(() => {` }, { match: /if \(blacket\.user\) \{/, replace: "if (window?.blacket?.user) {" } ] }, { file: "/lib/js/credits.js", replacement: [ { match: /blacket\.stopLoading\(\)\;/, replace: "blacket.stopLoading();bb.events.dispatch('pageInit');" }, { match: /blacket\.config/, replace: "window?.blacket?.config" } ] }, { file: "/lib/js/trade.js", replacement: [ { match: /blacket\.appendBlooks\(\)\;/, replace: "blacket.appendBlooks();bb.events.dispatch('pageInit');" }, { match: /blacket\.user\s*&&\s*blacket\.trade/, replace: "window?.blacket?.user && window?.blacket?.trade" } ] }, { file: "/lib/js/all.js", replacement: [ { match: /blacket\s*=\s*{/, replace: "window.blacket = {" }, { match: /mutation\.type === "childList" \? replace/, replace: "false ? " } ] }, { file: "/lib/js/game.js", replacement: [ { match: /blacket\.config\s*&&\s*blacket\.socket/, replace: "window?.blacket?.config && window?.blacket?.socket" }, { match: /data\.author\.badges = \[/, replace: `if (typeof data.author.badges !== 'object' && !data?.author?.badges?.length) data.author.badges = [` }, { match: /data\.friends/, replace: `data.friends.filter(f => f.username !== '£')` }, { match: /forEach\(post \=\> \{/, replace: `forEach(post => {blacket.news[post].body=blacket.news[post].body.replace(/\\<iframe.*?iframe>/, '');` } ] }, { file: "/lib/js/panel/home.js", replacement: [ { match: /blacket\.user\)/, replace: "window.blacket?.user)" }, { match: /Loading\(\)/, replace: `Loading();bb.events.dispatch('pageInit')` } ] }, { file: "/lib/js/panel/console.js", replacement: [ { match: /blacket\.user && blacket\.socket/, replace: `window.blacket?.user && window.blacket?.socket` }, { match: /blacket\.socket\.on/, replace: `bb.events.dispatch('pageInit');blacket.socket.on` } ] }, { file: "/lib/js/panel/blooks.js", replacement: [ { match: /blacket\.config/, replace: "window?.blacket?.config" }, { match: /\$\("#createButtonBlook"\)\.c/, replace: `bb.events.dispatch('pageInit');$("#createButtonBlook").c` } ] }, { file: "/lib/js/panel/rarities.js", replacement: [ { match: /blacket\.config && blacket\.user && blacket\.rarities/, replace: "window?.blacket?.config && window?.blacket?.user && window?.blacket?.rarities" }, { match: /\$\("\#createButtonRarity"\)\.c/, replace: `bb.events.dispatch('pageInit');$("#createButtonRarity").c` } ] }, { file: "/lib/js/panel/badges.js", replacement: [ { match: /blacket\.config/, replace: "window?.blacket?.config" }, { match: /blacket\.createBadge \=/, replace: `bb.events.dispatch('pageInit');blacket.createBadge = ` } ] }, { file: "/lib/js/panel/banners.js", replacement: [ { match: /blacket\.config && blacket\.banners/, replace: "window?.blacket?.config && window?.blacket?.banners" }, { match: /\$\("\#createButtonBanner"\)\.c/, replace: `bb.events.dispatch('pageInit');$("#createButtonBanner").c` } ] }, { file: "/lib/js/panel/news.js", replacement: [ { match: /blacket\.user && blacket\.news/, replace: "window?.blacket?.user && window?.blacket?.news" }, { match: /localStorage/, replace: "bb.events.dispatch('pageInit');localStorage" } ] }, { file: "/lib/js/panel/emojis.js", replacement: [ { match: /blacket\.config/, replace: "window?.blacket?.config" }, { match: /blacket.showEditModal =/, replace: "bb.events.dispatch('pageInit');blacket.showEditModal =" } ] }, { file: "/lib/js/panel/users.js", replacement: [ { match: /blacket\.user\) \{/, replace: "window?.blacket?.user) {" }, { match: /blacket.setUser =/, replace: "bb.events.dispatch('pageInit');blacket.setUser =" } ] }, { file: "/lib/js/panel/forms.js", replacement: [ { match: /blacket.config/, replace: "window?.blacket?.config" }, { match: /blacket.reject =/, replace: "bb.events.dispatch('pageInit');blacket.reject =" } ] } ], styles: ` .bb_topLeftRow { position: absolute; top: 0; left: 11.5vw; display: flex; flex-direction: row; z-index: 14; margin: 0.5vw; gap: 0.5vw; } .bb_backButtonContainer { position: relative; cursor: pointer; outline: none; user-select: none; text-decoration: none; transition: filter 0.25s; margin-left: 0.521vw; margin: auto; } .bb_settingsContainer { display: flex; flex-flow: row wrap; justify-content: flex-start; margin: 0.260vw calc(5% - 0.625vw); width: calc(90% - 1.250vw); max-width: 62.500vw; } .bb_pluginContainer { border-radius: 0.365vw; background-color: #2f2f2f; padding: 0.781vw 1.042vw 1.146vw; box-shadow: inset 0 -0.365vw rgba(0, 0, 0, 0.2), 0 0 0.208vw rgba(0, 0, 0, 0.15); margin: 0.625vw; min-width: 23.958vw; display: flex; flex-direction: column; color: #ffffff; width: 27.5vw; } .bb_pluginHeader { display: flex; align-items: center; gap: 1vw; } .bb_pluginTitle { width: 100%; } .bb_pluginDescription { margin-top: 0.7vh; font-size: 2.3vh; } .switch { position: relative; display: inline-block; min-width: 30px; max-width: 30px; height: 17px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 34px; } .slider:before { position: absolute; content: ""; height: 13px; min-width: 13px; max-width: 13px; left: 2px; bottom: 2px; background-color: white; -webkit-transition: .4s; transition: .4s; border-radius: 50%; } input:checked + .slider { background-color: #2196F3; } input:focus + .slider { box-shadow: 0 0 1px #2196F3; } input:checked + .slider:before { transform: translateX(13px); } .bb_requiredPluginSlider { background-color: #075c9f; cursor: not-allowed; } .bb_pluginIcon { cursor: pointer; } .bb_pluginAuthors { display: flex; justify-content: center; cursor: pointer; margin-top: 1vw; margin-right: 6px; font-weight: bold; } .bb_pluginAuthor { height: 22px; border-radius: 50%; margin-right: -6px; border: 2px solid #3f3f3f; } .bb_themeInfo { font-family: Nunito, sans-serif; line-height: 1.823vw; margin: 1.5vh 0 5px 0; color: #ffffff; font-size: 1.6vw; } .bb_themeHeader { font-family: Nunito, sans-serif; line-height: 1.823vw; margin: 3.5vw 0 5px 0; color: #ffffff; font-size: 2.75vw; } .bb_themeTextarea { min-height: 30vh; height: auto; width: 100%; background: #2f2f2f; border: 2px solid #1f1f1f; border-radius: 3px; color: white; padding: 10px; margin-top: 2.5vh; outline: none; resize: none; } .styles__container___1BPm9-camelCase { width: 25vw; } .bb_bigModal { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 50%; background-color: #3f3f3f; border-radius: 0.365vw; text-align: center; box-sizing: border-box; padding-bottom: 0.365vw; box-shadow: inset 0 -0.365vw rgba(0, 0, 0, 0.2), 0 0 0.208vw rgba(0, 0, 0, 0.15); } .bb_bigModalTitle { font-family: Nunito, sans-serif; font-size: 2.8vw; line-height: 1.823vw; font-weight: 700; margin: 2vw 1.563vw; color: #ffffff; } .bb_bigModalDescription { font-family: Nunito, sans-serif; line-height: 1.823vw; font-weight: 700; margin: -3px 0 5px 0; color: #ffffff; font-size: 1.6vw; } .bb_bigModalDivider { height: 1.5px; border-top: 1px solid var(--ss-white); border-radius: 10px; width: 90%; margin: 2vh 5%; } .bb_bigModalHeader { font-family: Nunito, sans-serif; font-size: 2vw; line-height: 1.823vw; font-weight: 700; margin: 1.8vw 1.3vw; color: #ffffff; } .bb_modalDescription { font-family: Nunito, sans-serif; line-height: 1.823vw; font-weight: 700; margin: -7px 0 5px 0; color: #ffffff; font-size: 1vw; padding: 0 1vw; } .bb_modalOuterInput { border: 0.156vw solid rgba(0, 0, 0, 0.17); border-radius: 0.313vw; width: 90%; height: 2.604vw; margin: 0.000vw; display: flex; flex-direction: row; align-items: center; } .bb_modalInput { border: none; height: 2.083vw; line-height: 2.083vw; font-size: 1.458vw; text-align: center; font-weight: 700; font-family: Nunito, sans-serif; color: #ffffff; background-color: #3f3f3f; outline: none; width: 100%; } .bb_pluginSettings { display: flex; align-items: center; flex-direction: column; gap: 1vh; } .bb_pluginSetting { display: flex; align-items: center; gap: 1.5vw; } .bb_settingName { color: white; font-size: 1.8vw; } `, onStart: () => { let mods = { "BetterBlacket v2": () => !!(window.pr || window.addCSS), "Flybird": () => !!window.gold, "Themeify": () => !!document.querySelector("#themifyButton"), "Blacket++": () => !!(window.BPP || window.bpp) }; if (Object.entries(mods).some((mod2) => mod2[1]() ? true : false)) return document.body.insertAdjacentHTML("beforeend", ` <div class="arts__modal___VpEAD-camelCase" id="bigModal"> <div class="bb_bigModal"> <div class="bb_bigModalTitle">External Mod Detected</div> <div class="bb_bigModalDescription" style="padding-bottom: 1vw;">Our automated systems believe you are running the ${mod[0]} mod. We require that only BetterBlacket v3 is running. This prevents unneeded "IP abuse bans" from Blacket's systems.</div> </div> </div> `); if (!location.pathname.startsWith("/settings")) return; console.log("Internals started! Patching settings..."); document.querySelector(".styles__mainContainer___4TLvi-camelCase").id = "settings-main"; $(` <div class="styles__infoContainer___2uI-S-camelCase"> <div class="styles__headerRow___1tdPa-camelCase"> <i class="fas fa-code styles__headerIcon___1ykdN-camelCase" aria-hidden="true"></i> <div class="styles__infoHeader___1lsZY-camelCase">BetterBlacket</div> </div> <div><a id="pluginsButton" class="styles__link___5UR6_-camelCase">Manage Plugins</a></div> <div><a id="themesButton" class="styles__link___5UR6_-camelCase">Manage Themes</a></div> <div><a id="resetDataButton" class="styles__link___5UR6_-camelCase">Reset Data</a></div> </div> `).insertBefore($(".styles__infoContainer___2uI-S-camelCase")[0]); document.querySelector("#app > div > div").insertAdjacentHTML("beforeend", ` <div class="bb_topLeftRow"> <div class="bb_backButtonContainer" style="display: none;"> <div class="styles__shadow___3GMdH-camelCase"></div> <div class="styles__edge___3eWfq-camelCase" style="background-color: #2f2f2f;"></div> <div class="styles__front___vcvuy-camelCase styles__buttonInsideNoMinWidth___39vdp-camelCase" style="background-color: #2f2f2f;"> <i class="fas fa-reply" aria-hidden="true"></i> </div> </div> </div> `); $("#resetDataButton").click(async () => { Object.keys(localStorage).forEach((key) => localStorage.removeItem(key)); location.reload(); }); $("#pluginsButton").click(() => { document.querySelector("#settings-main").style.display = "none"; document.querySelector("#plugins-main").style.display = ""; document.querySelector(".styles__header___WE435-camelCase").innerHTML = "Settings | Plugins"; document.querySelector(".styles__header___WE435-camelCase").style.textAlign = "center"; document.querySelector(".bb_backButtonContainer").style.display = ""; }); $("#themesButton").click(() => { document.querySelector("#settings-main").style.display = "none"; document.querySelector("#themes-main").style.display = ""; document.querySelector(".styles__header___WE435-camelCase").innerHTML = "Settings | Themes"; document.querySelector(".styles__header___WE435-camelCase").style.textAlign = "center"; document.querySelector(".bb_backButtonContainer").style.display = ""; }); $(".bb_backButtonContainer").click(() => { document.querySelector("#settings-main").style.display = ""; document.querySelector("#plugins-main").style.display = "none"; document.querySelector("#themes-main").style.display = "none"; document.querySelector(".styles__header___WE435-camelCase").innerHTML = "Settings"; document.querySelector(".styles__header___WE435-camelCase").style.textAlign = ""; document.querySelector(".bb_backButtonContainer").style.display = "none"; }); let activePlugins = bb.storage.get("bb_pluginData", true).active; let themeData = bb.storage.get("bb_themeData", true); $(".arts__profileBody___eNPbH-camelCase").append(` <div class="bb_settingsContainer" id="plugins-main" style="display: none;"> ${bb.plugins.list.filter((p) => !p.required && !p.disabled).map((p) => ` <div class="bb_pluginContainer"> <div class="bb_pluginHeader"> <div class="bb_pluginTitle">${p.name}</div> ${p.settings.length ? `<i id="bb_pluginIcon_${p.name.replaceAll(" ", "-")}" class="fas fa-gear bb_pluginIcon" aria-hidden="true"></i>` : `<i id="bb_pluginIcon_${p.name.replaceAll(" ", "-")}" class="far fa-circle-info bb_pluginIcon" aria-hidden="true"></i>`} <label class="switch"> <input type="checkbox" ${activePlugins.includes(p.name) || p.required ? "checked" : ""} id="bb_pluginCheckbox_${p.name.replaceAll(" ", "-")}"> <span class="${p.required ? "slider bb_requiredPluginSlider" : "slider"}"></span> </label> </div> <div class="bb_pluginDescription">${p.description}</div> </div> `).join("")} </div> <div class="bb_settingsContainer" id="themes-main" style="display: none;"> <div class="bb_themeInfo"><b>Paste CSS file links here.</b><br> - Paste one link per line.<br> - Use raw CSS files, like from "raw.githubusercontent.com" or "github.io".<br> - Put "//" in front of a theme link to ignore it.</div> <textarea class="bb_themeTextarea">${themeData?.textarea ? themeData.textarea : "https://blacket.org/lib/css/all.css\nhttps://blacket.org/lib/css/game.css"}</textarea> <div class="bb_themeHeader">Theme Checker</div> <div class="bb_themeValidation"> ${bb.themes.list.map((t) => `<div class="bb_themeInfo" style="color: green;">${t.name} | ${t.url}</div>`).join("")} ${bb.themes.broken.map((t) => `<div class="bb_themeInfo" style="color: red;">${t.url} - ${t.reason}</div>`).join("")} </div> </div> `); document.querySelector(".bb_themeTextarea").oninput = (ev) => { bb.storage.set("bb_themeData", { active: ev.target.value.split("\\n").filter((a) => !a.startsWith("//")), textarea: ev.target.value }, true); bb.themes.reload(); }; bb.events.listen("themeUpdate", () => { document.querySelector(".bb_themeValidation").innerHTML = ` ${bb.themes.list.map((t) => `<div class="bb_themeInfo" style="color: green;">${t.name} | ${t.url}</div>`).join("")} ${bb.themes.broken.map((t) => `<div class="bb_themeInfo" style="color: red;">${t.url} - ${t.reason}</div>`).join("")} `; }); let storedPluginData = bb.storage.get("bb_pluginData", true); bb.plugins.list.forEach((p) => { if (p.required || p.disabled) return; document.querySelector(`#bb_pluginCheckbox_${p.name.replaceAll(" ", "-")}`).onchange = (ev) => { if (p.required) return ev.target.checked = true; const inform = () => blacket.createToast({ title: "Pending Changes", message: "You have changes in your plugins you have not applied. Reload to apply.", time: 5e3 }); inform(); setInterval(() => inform(), 1e4); bb.plugins.pendingChanges = true; if (storedPluginData.active.includes(p.name)) storedPluginData.active.splice(storedPluginData.active.indexOf(p.name), 1); else storedPluginData.active.push(p.name); bb.storage.set("bb_pluginData", storedPluginData, true); }; document.querySelector(`#bb_pluginIcon_${p.name.replaceAll(" ", "-")}`).onclick = () => { document.body.insertAdjacentHTML("beforeend", ` <div class="arts__modal___VpEAD-camelCase" id="bigModal"> <div class="bb_bigModal"> <div class="bb_bigModalTitle">${p.name}</div> <div class="bb_bigModalDescription">${p.description}</div> <div class="bb_pluginAuthors">${p.authors.map((a) => `<img src="${a.avatar}" onclick="window.open('${a.url}', '_blank')" class="bb_pluginAuthor" />`).join("")}</div> <hr class="bb_bigModalDivider" /> <div class="bb_bigModalHeader">Settings</div> ${p.settings.length ? `<div class="bb_pluginSettings"> ${p.settings.map((set) => ` <div class="bb_pluginSetting"> <div class="bb_settingName">${set.name}</div> <label class="switch"> <input type="checkbox" ${typeof storedPluginData.settings?.[p.name]?.[set.name] === "boolean" ? storedPluginData.settings?.[p.name]?.[set.name] ? "checked" : "" : set.default ? "checked" : ""} id="bb_settingCheck_${p.name.replaceAll(" ", "-")}_${set.name.replaceAll(" ", "-")}"> <span class="slider"></span> </label> </div> `).join("")} </div>` : `<div class="bb_modalDescription">This plugin has no settings.</div>`} <hr class="bb_bigModalDivider" /> <div class="styles__button___1_E-G-camelCase styles__button___3zpwV-camelCase" role="button" tabindex="0" onclick="document.getElementById('bigModal').remove()" style="width: 30%;margin-bottom: 1.5vh;"> <div class="styles__shadow___3GMdH-camelCase"></div> <div class="styles__edge___3eWfq-camelCase" style="background-color: #2f2f2f;"></div> <div class="styles__front___vcvuy-camelCase styles__buttonInside___39vdp-camelCase" style="background-color: #2f2f2f;">Close</div> </div> </div> </div> `); p.settings.forEach((setting) => { document.querySelector(`#bb_settingCheck_${p.name.replaceAll(" ", "-")}_${setting.name.replaceAll(" ", "-")}`).onchange = (ev) => { if (!storedPluginData.settings) storedPluginData.settings = {}; if (!storedPluginData.settings[p.name]) storedPluginData.settings[p.name] = {}; storedPluginData.settings[p.name][setting.name] = ev.target.checked; bb.plugins.settings[p.name][setting.name] = ev.target.checked; bb.storage.set("bb_pluginData", storedPluginData, true); }; }); }; }); } }); const __vite_glob_0_11 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$a }, Symbol.toStringTag, { value: "Module" })); const index$9 = () => createPlugin({ name: "Message Logger", description: "view deleted messages like a staff would.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], disabled: true, patches: [ { file: "/lib/js/game.js", replacement: [ { match: /blacket\.user\.perms\.includes\("delete_messages"\) \|\| blacket\.user\.perms\.includes\("\*"\)/, replace: "true" } ] } ] }); const __vite_glob_0_12 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$9 }, Symbol.toStringTag, { value: "Module" })); const index$8 = () => createPlugin({ name: "No Chat Color", description: "disables color in chat.", authors: [{ name: "Syfe", avatar: "https://i.imgur.com/OKpOipQ.gif", url: "https://github.com/ItsSyfe" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /\$\{data\.author\.color/, replace: `\${"#ffffff"`, setting: "No Username Colors" }, { match: /\$\{blacket\.chat\.cached\.users\[id\]\.color/, replace: `\${"#ffffff"`, setting: "No Mention Colors" }, { match: /\!data\.author\.permissions\.includes\("use_chat_colors"\)/, replace: `bb.plugins.settings['No Chat Color']?.['No Message Colors'] ?? true`, setting: "No Message Colors" }, { match: /\$\{data\.author\.clan\.color\}/, replace: `\${"#ffffff"}`, setting: "No Clan Colors" } ] } ], settings: [ { name: "No Username Colors", default: true }, { name: "No Mention Colors", default: true }, { name: "No Message Colors", default: true }, { name: "No Clan Colors", default: true } ] }); const __vite_glob_0_13 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$8 }, Symbol.toStringTag, { value: "Module" })); const index$7 = () => createPlugin({ name: "No Chat Ping", description: "prevents you from being pinged in chat.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /message\.message\.mentions\.includes\(\w+\.user\.id\.toString\(\)\)/, replace: "false" }, { match: /data\.data\.message\.mentions\.includes\(blacket\.user\.id\.toString\(\)\)/, replace: "false" }, { match: /\$\{mentioned/, replace: `\${bb.plugins.settings['No Chat Ping']?.['Keep Highlight'] && rawMessage.includes(blacket.user.id.toString()) || mentioned` } ] } ], settings: [ { name: "Keep Highlight", default: false } ] }); const __vite_glob_0_14 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$7 }, Symbol.toStringTag, { value: "Module" })); const index$6 = () => createPlugin({ name: "No Devtools Warning", description: "disables the warning in the console.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/all.js", replacement: [ { match: /console\.log\(`%cWARNING!`, `font-size: 35px;`\);\s*console\.log\(`%cThis is a browser feature intended for developers\. If someone told you to copy and paste something here to enable a \${blacket\.config\.name} feature or "hack" someone else's account, it is most likely a scam and will give them access to your account\.`, `font-size: 20px;`\);\s*console\.log\(`%cIf you ignore this message and the script does work, PLEASE contact a \${blacket\.config\.name} developer immediately\.`, `font-size: 20px;`\);\s*/s, replace: "" } ] } ] }); const __vite_glob_0_15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$6 }, Symbol.toStringTag, { value: "Module" })); const index$5 = () => createPlugin({ name: "OldBadges", description: "reverts the first badge upgrade, returning many badges to the original state.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/all.js", replacement: [ { match: /Object.assign/, replace: `data=$self.modify(data);Object.assign` } ] } ], modify: (data) => { let oldBadges = { Plus: "https://i.imgur.com/qu3WJQ6.png", Owner: "https://i.imgur.com/w5PV2jw.png", Artist: "https://i.imgur.com/2EGHbLG.png", "Legacy Ankh": "https://i.imgur.com/m0Vin3j.png", Booster: "https://i.imgur.com/7E20vLD.png", Verified: "https://i.imgur.com/RwlUTSe.png", "Verified Bot": "https://i.imgur.com/0eLB3Xz.png", Tester: "https://i.imgur.com/0K816Nj.png", Staff: "https://i.imgur.com/dmJ2lIB.png", OG: "https://i.imgur.com/kWNfORf.png", "Big Spender": "https://i.imgur.com/bpr9QoT.png" }; if (bb.plugins.settings["OldBadges"]["Co-Owner to Owner"]) oldBadges["Co-Owner"] = oldBadges["Owner"]; Object.entries(oldBadges).forEach(([badge, url]) => data.badges[badge].image = url); return data; }, settings: [{ name: "Co-Owner to Owner", default: false }] }); const __vite_glob_0_16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$5 }, Symbol.toStringTag, { value: "Module" })); const index$4 = () => createPlugin({ name: "Quick CSS", description: "edit CSS for the game and have it applied instantly.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], styles: ` .bb_customCSSBox { position: relative; display: flex; justify-content: center; align-items: center; cursor: pointer; min-width: 5vw; height: 2.865vw; border-bottom-left-radius: 0.521vw; border-bottom-right-radius: 0.521vw; box-sizing: border-box; box-shadow: inset 0 -0.417vw rgba(0, 0, 0, 0.2), 0 0 0.208vw rgba(0, 0, 0, 0.15); padding: 0 0.521vw 0.417vw; font-size: 1.042vw; color: white; background: #2f2f2f; } .bb_customCSSIcon { margin: -0.2vw 0 0 0; padding: 0; font-size: 1.5vw; } .bb_customCSSCorner { position: absolute; bottom: 1vw; right: 1vw; padding: 10px; } .bb_customCSSCornerIcon { font-size: 2.5vw; } .bb_customCSSTextarea { min-height: 30vh; height: 40vh; width: 80%; background: #2f2f2f; border: 2px solid #1f1f1f; border-radius: 3px; color: white; padding: 10px; margin-top: 2.5vh; outline: none; resize: none; } `, onStart: () => { let storage2 = bb.storage.get("bb_pluginData", true); if ([ "stats", "leaderboard", "clans/discover", "market", "blooks", "bazaar", "inventory", "settings" ].some((path) => location.pathname.startsWith(`/${path}`))) { document.querySelector("#app > div > div > div").insertAdjacentHTML("afterbegin", ` <div class="bb_customCSSBox"> <i class="bb_customCSSIcon fas fa-palette"></i> </div> `); } else if ([ "trade", "store", "register", "login" ].some((path) => location.pathname.startsWith(`/${path}`))) { document.querySelector(".arts__body___3acI_-camelCase").insertAdjacentHTML("beforeend", ` <div class='bb_customCSSCorner styles__button___1_E-G-camelCase' role='button' tabindex='0'> <div class='styles__shadow___3GMdH-camelCase'></div> <div class='styles__edge___3eWfq-camelCase' style='background-color: #2f2f2f;'></div> <div class='styles__front___vcvuy-camelCase''> <i class="bb_customCSSCornerIcon fas fa-palette"></i> </div> </div> `); } else if (location.pathname.includes("my-clan")) { document.querySelector("#clanLeaveButton").insertAdjacentHTML("afterend", ` <div class="bb_customCSSBox"> <i class="bb_customCSSIcon fas fa-palette"></i> </div> `); } else return; document.body.insertAdjacentHTML("beforeend", `<style id="bb_quickCSS">${storage2?.quickcss || ""}</style>`); (document.querySelector(".bb_customCSSBox") || document.querySelector(".bb_customCSSCorner") || document.querySelector(".bb_customCSSSmallBox")).onclick = () => { document.body.insertAdjacentHTML("beforeend", ` <div class="arts__modal___VpEAD-camelCase" id="bigModal"> <div class="bb_bigModal"> <div class="bb_bigModalTitle">QuickCSS</div> <div class="bb_bigModalDescription">Quickly modify the CSS of Blacket.</div> <hr class="bb_bigModalDivider" /> <textarea class="bb_customCSSTextarea">${document.querySelector("#bb_quickCSS")?.innerHTML || ""}</textarea> <hr class="bb_bigModalDivider" /> <div class="styles__button___1_E-G-camelCase styles__button___3zpwV-camelCase" role="button" tabindex="0" onclick="document.getElementById('bigModal').remove()" style="width: 30%;margin-bottom: 1.5vh;"> <div class="styles__shadow___3GMdH-camelCase"></div> <div class="styles__edge___3eWfq-camelCase" style="background-color: #2f2f2f;"></div> <div class="styles__front___vcvuy-camelCase styles__buttonInside___39vdp-camelCase" style="background-color: #2f2f2f;">Close</div> </div> </div> </div> `); document.querySelector(".bb_customCSSTextarea").oninput = (e) => { document.querySelector("#bb_quickCSS").innerHTML = e.target.value; let storage3 = bb.storage.get("bb_pluginData", true); storage3.quickcss = e.target.value; bb.storage.set("bb_pluginData", storage3, true); }; }; (document.querySelector(".bb_customCSSBox") || document.querySelector(".bb_customCSSCorner") || document.querySelector(".bb_customCSSSmallBox")).oncontextmenu = (r) => { r.preventDefault(); bb.themes.reload(); }; } }); const __vite_glob_0_17 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$4 }, Symbol.toStringTag, { value: "Module" })); const index$3 = () => createPlugin({ name: "Real Total blooks", description: "displays the true number of total blooks on the stats page.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/stats.js", replacement: [ { match: /maxBlooks\.toLocaleString\(\)/, replace: `Object.keys(blacket.blooks).length` } ] } ] }); const __vite_glob_0_18 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$3 }, Symbol.toStringTag, { value: "Module" })); const index$2 = () => createPlugin({ name: "Staff Tags", description: "gives staff who speak in chat a special tag.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /\$\{badges\}/, replace: `\${badges} \${['Owner', 'Admin', 'Moderator', 'Helper'].includes(data.author.role) || bb.plugins.settings['Staff Tags']?.['Show Artists'] && data.author.role === 'Artist' || bb.plugins.settings['Staff Tags']?.['Show Testers'] && data.author.role === 'Tester' ? \`<span class="bb_roleTag">\${data.author.role}</span>\` : ''}` } ] } ], styles: ` .bb_roleTag { margin-left: 0.208vw; background: #2f2f2f; padding: 1px 8px; border-radius: 10px; font-size: 1vw; color: white; } `, settings: [ { name: "Show Testers", default: true }, { name: "Show Artists", default: true } ] }); const __vite_glob_0_19 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$2 }, Symbol.toStringTag, { value: "Module" })); const index$1 = () => createPlugin({ name: "Test Admin", description: "allows anyone to access the forced admin panel.", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /perm == "none"/, replace: `perm == "none" || page === "Panel"` } ] }, { file: "/lib/js/panel/home.js", replacement: [ { match: /\("\*"\)/, replace: `("*") || !blacket.panel.buttons[button].disabled` }, { match: /"edit_presets"/, replace: `"edit_presets",disabled:true` }, { match: /\/\*"/, replace: `"` }, { match: /_packs"/, replace: `_packs",disabled:true` }, { match: /_reports"/, replace: `_reports",disabled:true` }, { match: /\},\*\//, replace: "}," } ] }, { file: "/lib/js/panel/users.js", replacement: [ { match: /let online/, replace: ` user.mute = { muted: Math.random() < 0.6 }; user.ban = { banned: Math.random() < 0.6 }; let online ` }, { match: /\("ban_users"\)/, replace: `("ban_users") || true` } ] }, { file: "/lib/js/panel/console.js", replacement: [ { match: /\$\("\#commandInputBox"\).k/, replace: ` [ '[Blacket] Started!', '[Blacket] Type "help" for commands.', '[Blacket] Type "clear" to clear the console.', '[Blacket] Type "exit" to exit the console.', '[Blacket] Please note that this is populated data written by BetterBlacket', '[Blacket] To disable these populations, turn off the TestAdmin plugin.' ].forEach(p => blacket.appendConsoleLine(p)); $('#commandInputBox').k` } ] }, { file: "/lib/js/panel/forms.js", replacement: [ { match: /currentPage = 1/, replace: `currentPage = 0` }, { match: /return blacket/, replace: `blacket` }, { match: /maxPages = data\.pages/, replace: `maxPages = 5` }, { match: /blacket\.currentPage = data\.page/, replace: `blacket.currentPage++` }, { match: /data\.forms\.length/, replace: `Math.round(Math.random() * 20)` }, { match: /data\.total/, replace: `Math.round(Math.random() * 70)` }, { match: /data.forms/, replace: ` let createAge = () => Math.round(Math.random() * 3) + 13; let createUsername = () => 'Username' + Math.round(Math.random() * 1000); let discord = () => 'username' + Math.round(Math.random() * 1000); let body = () => 'This body was generated by the Test Admin BetterBlacket Plugin. This is NOT a real form. If you are a staff, you can see real forms by disabling this plugin. '.repeat(Math.round(Math.random() * 3)); let createForm = () => ({ username: createUsername(), age: createAge(), discord: discord(), body: body() }); new Array(69).fill().map(() => createForm())` } ] } ] }); const __vite_glob_0_20 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index$1 }, Symbol.toStringTag, { value: "Module" })); const index = () => createPlugin({ name: "Tokens Everywhere", description: "shows your token count on ALL pages!", authors: [{ name: "Death", avatar: "https://i.imgur.com/PrvNWub.png", url: "https://villainsrule.xyz" }], patches: [ { file: "/lib/js/game.js", replacement: [ { match: /\$\("#roomDropdownGlobal"\)/, replace: `$self.updateTokens();$("#roomDropdownGlobal")` } ] }, { file: "/lib/js/blooks.js", replacement: [ { match: /-= quantity;/, replace: `-= quantity;blacket.user.tokens += blacket.blooks[blacket.blooks.selected].price*quantity;$self.updateTokens();` } ] } ], updateTokens: () => $("#tokenBalance > div:nth-child(2)").html(blacket.user.tokens.toLocaleString()), onLoad: () => { if ([ "leaderboard", "clans/discover", "blooks", "inventory", "settings" ].some((path) => location.pathname.startsWith(`/${path}`))) { document.querySelector(".styles__topRightRow___dQvxc-camelCase").insertAdjacentHTML("afterbegin", ` <div id="tokenBalance" class="styles__tokenBalance___1FHgT-camelCase"> <img loading="lazy" src="/content/tokenIcon.webp" alt="Token" class="styles__tokenBalanceIcon___3MGhs-camelCase" draggable="false"> <div>tokens</div> </div> `); } } }); const __vite_glob_0_21 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, default: index }, Symbol.toStringTag, { value: "Module" })); const loadPlugins = async () => { console.log("Called loadPlugins()"); let pluginData = storage.get("bb_pluginData", true); let contentLoaded = false; await Promise.all(Object.values(/* @__PURE__ */ Object.assign({ "../plugins/advancedopen/index.js": __vite_glob_0_0, "../plugins/aprilfools/index.js": __vite_glob_0_1, "../plugins/bazaarsniper/index.js": __vite_glob_0_2, "../plugins/betterchat/index.js": __vite_glob_0_3, "../plugins/betternotifications/index.js": __vite_glob_0_4, "../plugins/betterreplies/index.js": __vite_glob_0_5, "../plugins/blookutils/index.js": __vite_glob_0_6, "../plugins/deafbot/index.js": __vite_glob_0_7, "../plugins/doubleleaderboard/index.js": __vite_glob_0_8, "../plugins/extrastats/index.js": __vite_glob_0_9, "../plugins/highlightrarity/index.js": __vite_glob_0_10, "../plugins/internals/index.js": __vite_glob_0_11, "../plugins/messagelogger/index.js": __vite_glob_0_12, "../plugins/nochatcolor/index.js": __vite_glob_0_13, "../plugins/nochatping/index.js": __vite_glob_0_14, "../plugins/nodevtoolswarn/index.js": __vite_glob_0_15, "../plugins/oldbadges/index.js": __vite_glob_0_16, "../plugins/quickcss/index.js": __vite_glob_0_17, "../plugins/realtotalblooks/index.js": __vite_glob_0_18, "../plugins/stafftags/index.js": __vite_glob_0_19, "../plugins/testadmin/index.js": __vite_glob_0_20, "../plugins/tokenseverywhere/index.js": __vite_glob_0_21 })).map(async (pluginFile) => { let plugin = pluginFile.default(); bb.plugins.list.push(plugin); if (!!plugin.styles) bb.plugins.styles[plugin.name] = plugin.styles; })); bb.plugins.active = [...pluginData.active, ...bb.plugins.list.filter((p) => p.required).map((p) => p.name)]; bb.plugins.settings = pluginData.settings; console.log(`Detected readyState ${document.readyState}. Running onLoad listeners...`); document.addEventListener("DOMContentLoaded", () => { if (contentLoaded) return; contentLoaded = true; bb.plugins.list.forEach((plugin) => { if (pluginData.active.includes(plugin.name) || plugin.required) plugin.onLoad?.(); }); }); if (document.readyState !== "loading" && !contentLoaded) { contentLoaded = true; bb.plugins.list.forEach((plugin) => { if (pluginData.active.includes(plugin.name) || plugin.required) plugin.onLoad?.(); }); } events.listen("pageInit", () => { console.log(`Plugins got pageInit. Starting plugins...`); bb.plugins.list.forEach((plugin) => { if (pluginData.active.includes(plugin.name) || plugin.required) plugin.onStart?.(); }); }); bb.plugins.list.forEach((plugin) => { if (pluginData.active.includes(plugin.name) || plugin.required) plugin.patches.forEach((patch) => bb.patches.push({ ...patch, plugin: plugin.name })); if (!bb.plugins.settings[plugin.name]) bb.plugins.settings[plugin.name] = {}; plugin.settings.forEach((setting) => { if (!bb.plugins.settings[plugin.name][setting.name]) bb.plugins.settings[plugin.name][setting.name] = setting.default; }); }); console.log("Done with loadPlugins(), running Patcher.patch()..."); patcher.patch(); }; patcher.start(); if (!storage.get("bb_pluginData")) storage.set("bb_pluginData", { active: [], settings: {} }, true); if (!storage.get("bb_themeData")) storage.set("bb_themeData", { active: [] }, true); window.bb = { axios, events, Modal, storage, plugins: { list: [], settings: {}, styles: {}, pendingChanges: false }, themes: { list: [], broken: [], reload: () => loadThemes(true) }, patches: [] }; console.log('Defined global "bb" variable:', bb); setTimeout(() => loadThemes(), 0); setTimeout(() => loadPlugins(), 0);