Compare commits
16 Commits
9d96d1ecd8
...
mistress
Author | SHA1 | Date | |
---|---|---|---|
|
9738147d24 | ||
|
9dad73c936 | ||
|
6863213651 | ||
|
945289afa1 | ||
fe23bffad0 | |||
e542782050 | |||
9ceb6ea2cd | |||
c1300702d8 | |||
a8150850b7 | |||
ef8e2cb3ed | |||
f2d041edd5 | |||
6cff644dc9 | |||
1130b04947 | |||
5a62ce3274 | |||
43463171e2 | |||
f63826a1b0 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
node_modules
|
node_modules
|
||||||
|
ideas.txt
|
||||||
|
93
ambient.d.ts
vendored
93
ambient.d.ts
vendored
@@ -1,45 +1,48 @@
|
|||||||
/* eslint-disable no-unused-vars */
|
declare namespace LILY {
|
||||||
/* eslint-disable @typescript-eslint/consistent-type-definitions */
|
interface Utils {
|
||||||
/* eslint-disable @typescript-eslint/member-delimiter-style */
|
remove_hook: undefined | (() => void)
|
||||||
/* eslint-disable @typescript-eslint/naming-convention */
|
true(callback: () => unknown): true // stops eslint from complaining about constant bool expressions
|
||||||
/* eslint-disable @typescript-eslint/semi */
|
with<V, R>(value: V, callback: (v: V) => R): R // A silly helper to kinda curry values
|
||||||
|
ass<V, R>(value: V | undefined | null, callback: (v: V) => R): R | undefined /* ditto, but check for empty */ //eslint-disable-line @typescript-eslint/ban-types
|
||||||
declare namespace LILY {
|
send(callback: () => boolean): boolean // updates the player if the function succeeds
|
||||||
interface Utils {
|
}
|
||||||
with<V, R>(value: V, callback: (v: V) => R): R // A silly helper to kinda curry values
|
|
||||||
}
|
interface Box {
|
||||||
|
enable(item: Item | undefined): boolean
|
||||||
interface Box {
|
disable(item: Item | undefined): boolean
|
||||||
enable(): void
|
on(): boolean
|
||||||
disable(): void
|
off(): boolean
|
||||||
get equipped(): boolean
|
get item(): Item | undefined
|
||||||
get enabled(): boolean
|
get enabled(): boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
interface Eyes {
|
interface Eyes {
|
||||||
zones: AssetGroupName[]
|
zones: AssetGroupName[]
|
||||||
craft: CraftingItem
|
craft: CraftingItem
|
||||||
rgb: string[]
|
rgb: string[]
|
||||||
timeout: NodeJS.Timeout | undefined
|
speed: number
|
||||||
set_rgb(item: Item, index: number): boolean
|
timeout: NodeJS.Timeout | undefined
|
||||||
next_rgb(): boolean | undefined
|
set_rgb(item: Item, index: number): boolean
|
||||||
roll_rgb(): void
|
next_rgb(): boolean
|
||||||
start(): boolean
|
roll_rgb(): void
|
||||||
stop(): boolean
|
start(): boolean
|
||||||
dim(): boolean
|
stop(): boolean
|
||||||
clear(): boolean
|
dim(): boolean
|
||||||
check(zone: AssetGroupName): Item | undefined
|
clear(): boolean
|
||||||
get item(): Item | undefined
|
set_speed(seconds: number): void
|
||||||
}
|
check(zone: AssetGroupName): Item | undefined
|
||||||
|
get item(): Item | undefined
|
||||||
type CommandCB = (...arguments: string[]) => unknown
|
}
|
||||||
type Command<T> = Record<string, T | CommandCB>
|
|
||||||
interface Commands extends Command<Commands> {}
|
type CommandCB = (...arguments: string[]) => unknown
|
||||||
interface Belt {
|
type Command<T> = Record<string, T | CommandCB>
|
||||||
admins: number[]
|
interface Commands extends Command<Commands> {}
|
||||||
cli: Commands
|
interface Belt {
|
||||||
is_cb(subject: Commands | CommandCB): subject is CommandCB
|
admins: number[]
|
||||||
run(tokens: string[]): string
|
users: Record<number, {zone: AssetGroupName, name: string}>
|
||||||
receive(data: ServerChatRoomMessage): undefined
|
cli: Commands
|
||||||
}
|
is_cb(subject: Commands | CommandCB): subject is CommandCB
|
||||||
}
|
run(tokens: string[]): string
|
||||||
|
receive(data: ServerChatRoomMessage): undefined
|
||||||
|
}
|
||||||
|
}
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -13,6 +13,13 @@
|
|||||||
],
|
],
|
||||||
"checkJs": true,
|
"checkJs": true,
|
||||||
"strict": true,
|
"strict": true,
|
||||||
"noImplicitOverride": true
|
"exactOptionalPropertyTypes": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noPropertyAccessFromIndexSignature": true,
|
||||||
|
"noUncheckedIndexedAccess": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
191
lily.user.js
191
lily.user.js
@@ -1,82 +1,109 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name LILY
|
// @name LILY
|
||||||
// @namespace https://code.fleshless.org/mute
|
// @namespace https://code.fleshless.org/mute
|
||||||
// @version 0.0.1
|
// @version 0.0.4
|
||||||
// @description Lily's Integrated Logic Yoke
|
// @description Lily's Integrated Logic Yoke
|
||||||
// @grant none
|
// @grant none
|
||||||
// @author Mute
|
// @author Mute
|
||||||
// @require https://code.fleshless.org/mute/LILY/raw/branch/mistress/bcmodsdk-1.2.0.mjs
|
// @require https://jomshir98.github.io/bondage-club-mod-sdk/bcmodsdk.js
|
||||||
// @match https://bondageprojects.elementfx.com/*
|
// @match https://*.bondageprojects.elementfx.com/R*/*/
|
||||||
// @match https://www.bondageprojects.elementfx.com/*
|
// @match https://*.bondage-europe.com/R*/*/
|
||||||
// @match https://bondage-europe.com/*
|
// @match https://*.bondageprojects.com/R*/
|
||||||
// @match https://www.bondage-europe.com/*
|
// @match http://localhost:*/*
|
||||||
// @match http://localhost:*/*
|
// ==/UserScript==
|
||||||
// ==/UserScript==
|
(function() {
|
||||||
|
'use strict';
|
||||||
(async function() {
|
const $ = undefined
|
||||||
'use strict';
|
const W = /** @type {Window & typeof globalThis & {bcModSdk: import('bondage-club-mod-sdk').ModSDKGlobalAPI}} */ (window)
|
||||||
|
const SDK = W.bcModSdk.registerMod({name: GM_info.script.name, fullName: GM_info.script.description ?? '', version: GM_info.script.version, repository: 'finger://your.mom'})
|
||||||
const W = /** @type {Window & typeof globalThis & {bcModSdk: import('bondage-club-mod-sdk').ModSDKGlobalAPI}} */ (window)
|
/** @type {LILY.Utils} */ const U = {remove_hook: $,
|
||||||
const SDK = W.bcModSdk.registerMod({name: GM_info.script.name, fullName: GM_info.script.description || '', version: GM_info.script.version, repository: 'finger://your.mom'})
|
true(f) {f(); return true},
|
||||||
/** @type {LILY.Utils} */ const U = {
|
with: (v, f) => f(v),
|
||||||
with: (v, f) => f(v),
|
ass: (v, f) => v === $ || v === null ? $ : U.with(f(v), r => r === null ? $ : r), //eslint-disable-line @typescript-eslint/prefer-nullish-coalescing
|
||||||
}
|
send: f => f() && U.true(() => void W.ChatRoomCharacterUpdate(W.Player)),
|
||||||
/** @type {LILY.Box} */ const Box = {
|
}
|
||||||
enable() {},
|
/** @type {LILY.Box} */ const Box = {
|
||||||
disable() {},
|
enable(item) { if (item === $) return false // TODO Okay, we need to be more clever here. The light should be above the box itself
|
||||||
get equipped() {return false},
|
return U.with(item.Property, ip => typeof ip?.OverridePriority === 'object' && (ip.OverridePriority['Light'] = 41) > 0)
|
||||||
get enabled() {return this.equipped && false},
|
},
|
||||||
}
|
disable(item) { return item === $ ? false : U.with(item.Property ??= {}, ip => U.with(ip.OverridePriority ??= {}, op =>
|
||||||
/** @type {LILY.Eyes} */ const Eyes = { // #9C0000 156 0 0
|
typeof op === 'number' ? Boolean(ip.OverridePriority = {Lock: op, Unit: op}) : ((op['Light'] = 0) < 1)
|
||||||
rgb: [
|
))},
|
||||||
'#990000', '#990f00', '#991f00', '#992e00', '#993d00', '#994d00', '#995c00', '#996b00', '#997a00', '#998a00',
|
on: () => U.with(Box.item, i => U.send(() => Box.enable(i))),
|
||||||
'#999900', '#8a9900', '#7a9900', '#6b9900', '#5c9900', '#4d9900', '#3d9900', '#2e9900', '#1f9900', '#0f9900',
|
off: () => U.with(Box.item, i => U.send(() => Box.disable(i))),
|
||||||
'#009900', '#00990f', '#00991f', '#00992e', '#00993d', '#00994d', '#00995c', '#00996b', '#00997a', '#00998a',
|
get item() {return U.ass(W.Player, p => U.ass(Belt.users[p.MemberNumber ?? -1], u => U.ass(W.InventoryGet(p, u.zone), i => i.Craft?.Name === u.name ? i : $)))},
|
||||||
'#009999', '#008a99', '#007a99', '#006b99', '#005c99', '#004d99', '#003d99', '#002e99', '#001f99', '#000f99',
|
get enabled() {return U.with(Box.item, i => i !== $ && U.with(i?.Property?.OverridePriority, op => typeof op !== 'object' || !Object.hasOwn(op, 'Light') || (op['Light'] ?? 1) > 0))}, // TODO check if the light is above the box
|
||||||
'#000099', '#0f0099', '#1f0099', '#2e0099', '#3d0099', '#4d0099', '#5c0099', '#6b0099', '#7a0099', '#8a0099',
|
}
|
||||||
'#990099', '#99008a', '#99007a', '#99006b', '#99005c', '#99004d', '#99003d', '#99002e', '#99001f', '#99000f',
|
/** @type {LILY.Eyes} */ const Eyes = {timeout: $, speed: 1500, zones: ['ItemHead', 'Mask'],
|
||||||
],
|
rgb: [
|
||||||
timeout: undefined,
|
'#ff4d4d', '#ff714d', '#ff944d', '#ffb84d', '#ffe04d', '#e4ff4d', '#c0ff4d', '#9cff4d', '#78ff4d', '#55ff4d',
|
||||||
craft: {Item: 'AnimeLenses', Name: 'Akihabara souvenir', Description: 'you will never be the same uwu', Color: '#FFFFFF,Default,#FFFFFF,Default', Property: 'Thick', Lock: '', Private: true, ItemProperty: {}, Type: null, TypeRecord: null, MemberNumber: 71_240, MemberName: 'Mute'},
|
'#4dff62', '#4dff85', '#4dffa8', '#4dffcc', '#4dfff0', '#4ddcff', '#4db8ff', '#4d94ff', '#4d70ff', '#4d4dff',
|
||||||
zones: ['ItemHead', 'Mask'],
|
'#704dff', '#944dff', '#b84dff', '#dc4dff', '#ff4df0', '#ff4dcc', '#ff4da8', '#ff4d85', '#ff4d62', '#ff4d4d',
|
||||||
set_rgb(item, n) {item.Color = [this.rgb[n], 'Default', this.rgb[n], 'Default']; return true},
|
'#ff6a4d', '#ff874d', '#ffa44d', '#ffc14d', '#ffde4d', '#e3ff4d', '#c6ff4d', '#a9ff4d', '#8cff4d', '#6fff4d',
|
||||||
next_rgb() {return !this.check('ItemHead') && U.with(this.check('Mask'), i => i && U.with(this.rgb.indexOf(i.Color?.[0] || this.rgb[0]) + 1, n => this.set_rgb(i, n)))},
|
'#4dff4d', '#4dff6f', '#4dff8c', '#4dffaa', '#4dffc7', '#4dffe4', '#4dffff', '#4ddcff', '#4dbfff', '#4da3ff',
|
||||||
roll_rgb() {this.next_rgb() && W.ChatRoomCharacterItemUpdate(W.Player, 'Mask')},
|
'#4d86ff', '#4d6aff', '#4d4dff', '#6a4dff', '#864dff', '#a34dff', '#bf4dff', '#dc4dff', '#ff4dff', '#ff4ddc',
|
||||||
start() {return Boolean(this.check('Mask')) && !this.timeout && Boolean(this.timeout = setInterval(() => this.roll_rgb(), 1000))},
|
'#ff4dbf', '#ff4da3', '#ff4d86', '#ff4d6a', '#ff4d4d', '#ff6e4d', '#ff914d', '#ffb44d', '#ffd84d', '#f1ff4d',
|
||||||
stop() {return Boolean(this.check('Mask')) && Boolean(this.timeout) && !(this.timeout = void clearInterval(this.timeout))},
|
'#ceff4d', '#abff4d', '#88ff4d', '#65ff4d', '#4dff5b', '#4dff7e', '#4dffa1', '#4dffc4', '#4dffe7', '#4dffff',
|
||||||
dim() {return !this.check('ItemHead') && Boolean(W.InventoryWear(W.Player, 'AnimeLenses', 'ItemHead', undefined, undefined, 71_240, this.craft) && !void W.ChatRoomCharacterUpdate(W.Player))},
|
'#4dcfff', '#4dacff', '#4d89ff', '#4d66ff', '#4d4dff', '#664dff', '#894dff', '#ac4dff', '#cf4dff', '#f24dff',
|
||||||
clear() {return Boolean(this.check('ItemHead')) && !void W.InventoryRemove(W.Player, 'ItemHead') && !void W.ChatRoomCharacterUpdate(W.Player)},
|
'#ff4dce', '#ff4dab', '#ff4d88', '#ff4d65', '#ff4d4d', '#ff774d', '#ff9f4d', '#ffc74d', '#fff04d', '#d4ff4d',
|
||||||
check(zone) {return U.with(this.item, item => (item && item.Asset.Group.Name === zone) ? item : undefined)},
|
'#acff4d', '#84ff4d', '#5cff4d', '#4dff74', '#4dff9c', '#4dffc4', '#4dffee', '#4dbdff', '#4d95ff', '#4d6dff',
|
||||||
get item() {return this.zones.map(z => W.InventoryGet(W.Player, z)).find(item => item && item.Asset.Name === 'AnimeLenses') || undefined},
|
'#6d4dff', '#954dff', '#bd4dff', '#e54dff', '#ff4dd5', '#ff4dad', '#ff4d85', '#ff4d5d'
|
||||||
}
|
],
|
||||||
/** @type {LILY.Belt} */ const Belt = {
|
craft: {Item: 'AnimeLenses', Name: 'Akihabara souvenir', Description: 'you will never be the same uwu', Color: '#FFFFFF,Default,#FFFFFF,Default', Property: 'Thick', Lock: '', Private: true, ItemProperty: {}, Type: null, TypeRecord: null, MemberNumber: 71_240, MemberName: 'Mute'},
|
||||||
admins: [71_240, 67_994],
|
set_rgb: (item, n) => U.true(() => item.Color = [Eyes.rgb[n] ?? 'Default', 'Default', Eyes.rgb[n] ?? 'Default', 'Default']),
|
||||||
cli: {'!LILY': {
|
next_rgb: () => Eyes.check('ItemHead') === $ && U.with(Eyes.check('Mask'), i => i !== $ && U.with(Eyes.rgb.indexOf(i.Color?.[0] ?? Eyes.rgb[0] ?? '') + 1, n => Eyes.set_rgb(i, n))),
|
||||||
status: _ => '200 OK',
|
roll_rgb: () => Eyes.next_rgb() && void W.ChatRoomCharacterItemUpdate(W.Player, 'Mask'),
|
||||||
box: {
|
start: () => Eyes.check('Mask') !== $ && Eyes.timeout === $ && Boolean(Eyes.timeout = setInterval(Eyes.roll_rgb, Eyes.speed)),
|
||||||
on: _ => Box.enable(),
|
stop: () => Eyes.check('Mask') !== $ && Eyes.timeout !== $ && U.true(() => Eyes.timeout = void clearInterval(Eyes.timeout)),
|
||||||
off: _ => Box.disable(),
|
set_speed(seconds) {const ms = Math.max(100, seconds * 1000); Eyes.speed = ms; if (Eyes.timeout !== $) {clearInterval(Eyes.timeout); Eyes.timeout = setInterval(Eyes.roll_rgb, Eyes.speed);}},
|
||||||
},
|
dim: () => U.send(() => Eyes.check('ItemHead') === $ && U.true(() => W.InventoryWear(W.Player, 'AnimeLenses', 'ItemHead', ['#FFFFFF', 'Default', '#FFFFFF', 'Default'], $, 71_240, Eyes.craft))),
|
||||||
eyes: {
|
clear: () => U.send(() => Eyes.check('ItemHead') !== $ && U.true(() => void W.InventoryRemove(W.Player, 'ItemHead'))),
|
||||||
start: _ => Eyes.start(),
|
check: zone => U.with(Eyes.item, item => item?.Asset.Group.Name === zone ? item : $),
|
||||||
stop: _ => Eyes.stop(),
|
get item() {return Eyes.zones.map(z => W.InventoryGet(W.Player, z)).find(item => item?.Asset.Name === 'AnimeLenses') ?? $},
|
||||||
dim: _ => Eyes.dim(),
|
}
|
||||||
clear: _ => Eyes.clear(),
|
/** @type {LILY.Belt} */ const Belt = {admins: [71_240, 67_994, 21_504],
|
||||||
},
|
users: {
|
||||||
}},
|
119_643: {zone: 'ItemNeckAccessories', name: 'Lily\'s voicebox'},
|
||||||
/** @type {LILY.Belt['is_cb']} */ is_cb: s => typeof s === 'function',
|
//154_662: '?hell if I remember?',
|
||||||
run(tokens) { /** @type {string | undefined} */ let t, /** @type {LILY.Commands | LILY.CommandCB} */ cmd = this.cli
|
62_808: {zone: 'ItemNeck', name: 'CKO voicebox'},
|
||||||
while (t = tokens.shift()) if (U.with(cmd[t], next => !next || this.is_cb(cmd = next))) break // eslint-disable-line no-cond-assign
|
},
|
||||||
// either t is undefined, or cmd[t] is undefined or cmd is a function
|
cli: {'#LILY': {
|
||||||
if (!this.is_cb(cmd)) return t ? `unknown token ${t}` : `subcommands: [${Object.keys(cmd).join(', ')}]`
|
status: _ => '200 OK',
|
||||||
return U.with(cmd(...tokens), r => typeof r === 'boolean' ? (r ? 'success' : 'fail') : String(r))
|
box: {on: Box.on, off: Box.off},
|
||||||
},
|
version: _ => `LILY version ${GM_info?.script?.version ?? 'unknown'}`,
|
||||||
receive(data) { if (!data.Sender) return undefined
|
eyes: {
|
||||||
const reply = this.admins.includes(data.Sender) ? this.run(data.Content.split(' ')) : 'access denied'
|
start: Eyes.start,
|
||||||
return void W.ChatRoomSendWhisper(data.Sender, `LILY: ${reply}`)
|
stop: Eyes.stop,
|
||||||
},
|
dim: Eyes.dim,
|
||||||
}
|
clear: Eyes.clear,
|
||||||
SDK.hookFunction('SpeechTransformGagGarble', 0, ([text]) => text) // disable garbling
|
speed(s) {
|
||||||
SDK.hookFunction('ChatRoomSendChatMessage', 0, (na, n) => Box.enabled ? n(na) : Boolean(W.ChatRoomSendLocal('<span style="color: red">You try to talk, but nothing comes out.</span>')))
|
const seconds = parseFloat(s);
|
||||||
W.ChatRoomRegisterMessageHandler({Priority: -169, Description: 'LILY', Callback: data => data.Type === 'Whisper' && data.Content.startsWith('!LILY') && (Belt.receive(data) || true)})
|
if (isNaN(seconds) || seconds <= 0) return 'invalid speed';
|
||||||
})()
|
Eyes.set_speed(seconds);
|
||||||
|
return `Eye speed set to ${seconds}s`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
/** @type {LILY.Belt['is_cb']} */ is_cb: s => typeof s === 'function',
|
||||||
|
run(tokens) { /** @type {string | undefined} */ let t, /** @type {LILY.Commands | LILY.CommandCB} */ cmd = Belt.cli
|
||||||
|
while ((t = tokens.shift()) !== $) if (U.with(cmd[t], next => next !== $ && Belt.is_cb(cmd = next))) break // eslint-disable-line @typescript-eslint/no-loop-func
|
||||||
|
if (!Belt.is_cb(cmd)) return t === $ ? `subcommands: [${Object.keys(cmd).join(', ')}]` : `unknown token ${t}`
|
||||||
|
return U.with(cmd(...tokens), r => typeof r === 'boolean' ? (r ? 'success' : 'fail') : String(r))
|
||||||
|
},
|
||||||
|
receive(data) { if (data.Sender === $) return $
|
||||||
|
W.ChatRoomSendLocal(`<span style="color: #666">${data.Content}</span>`)
|
||||||
|
return void W.ChatRoomSendWhisper(data.Sender, `LILY: ${Belt.admins.includes(data.Sender) ? Belt.run(data.Content.split(' ')) : 'access denied'}`)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
/** @type {(text: string) => undefined} */ const unload = text => U.true(SDK.unload) && void console.debug(`LILY: ${text}, unloading the mod`)
|
||||||
|
const load_after_login = () => {
|
||||||
|
if (U.remove_hook !== $) {U.remove_hook?.(); U.remove_hook = $}
|
||||||
|
if (W.Player.MemberNumber === $) return void unload('member not identified')
|
||||||
|
if (!Object.hasOwn(Belt.users, W.Player.MemberNumber)) return void unload('member not eligible for loading')
|
||||||
|
SDK.hookFunction('SpeechTransformGagGarbleIntensity', 0, _ => 0) // disable garbling
|
||||||
|
SDK.hookFunction('ChatRoomSendChatMessage', 0, (na, n) => Box.enabled || na[0].startsWith('(') ? n(na) : !U.true(() => void W.ChatRoomSendLocal('<span style="color: red">You try to talk, but nothing comes out.</span>')))
|
||||||
|
W.ChatRoomRegisterMessageHandler({Priority: -169, Description: 'LILY', Callback: data => data.Type === 'Whisper' && data.Content.startsWith('#LILY') && U.true(() => void Belt.receive(data))})
|
||||||
|
console.debug(`LILY: eligible member detected, loaded version ${GM_info.script.version}`)
|
||||||
|
}
|
||||||
|
U.remove_hook = SDK.hookFunction('AsylumGGTSSAddItems', 0, (na, n) => U.true(load_after_login) && void n(na))
|
||||||
|
})()
|
||||||
|
12
package-lock.json
generated
12
package-lock.json
generated
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"name": "lily",
|
"name": "lily",
|
||||||
"version": "0.0.1",
|
"version": "0.0.3",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "lily",
|
"name": "lily",
|
||||||
"version": "0.0.1",
|
"version": "0.0.3",
|
||||||
"license": "SEE LICENSE IN LICENSE.",
|
"license": "SEE LICENSE IN LICENSE.",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/tampermonkey": "^5.0.3",
|
"@types/tampermonkey": "^5.0.3",
|
||||||
"bc-stubs": "^105.0.0",
|
"bc-stubs": "^114.0.0",
|
||||||
"bondage-club-mod-sdk": "^1.2.0",
|
"bondage-club-mod-sdk": "^1.2.0",
|
||||||
"xo": "^0.58.0"
|
"xo": "^0.58.0"
|
||||||
}
|
}
|
||||||
@@ -1098,9 +1098,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/bc-stubs": {
|
"node_modules/bc-stubs": {
|
||||||
"version": "105.0.3",
|
"version": "114.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/bc-stubs/-/bc-stubs-105.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/bc-stubs/-/bc-stubs-114.0.0.tgz",
|
||||||
"integrity": "sha512-haKRphxOdPQT/9W6s5L0x5DFDttOrk0xBddFfoLnMQlz7AiXnU3TGdlJ+biWpmQtyHc7WrJARbYd4Wf7+a4j8g==",
|
"integrity": "sha512-o5G1ryUDwOez2GdnpLChGYVRiR8981PHOZNUnWuquSbQf5eNTqdq3sWtEF9vgpyJjlodNPBuoNQj+KlOeWOAjQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"socket.io-client": "4.6.1"
|
"socket.io-client": "4.6.1"
|
||||||
|
46
package.json
46
package.json
@@ -1,22 +1,44 @@
|
|||||||
{
|
{
|
||||||
"name": "lily",
|
"name": "lily",
|
||||||
"version": "0.0.1",
|
"version": "0.0.4",
|
||||||
"description": "Lily's Integrated Logic Yoke",
|
"description": "Lily's Integrated Logic Yoke",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"private": true,
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"xo": "^0.58.0",
|
"xo": "^0.58.0",
|
||||||
"bc-stubs": "^105.0.0",
|
"bc-stubs": "^114.0.0",
|
||||||
"bondage-club-mod-sdk": "^1.2.0",
|
"bondage-club-mod-sdk": "^1.2.0",
|
||||||
"@types/tampermonkey": "^5.0.3"
|
"@types/tampermonkey": "^5.0.3"
|
||||||
},
|
},
|
||||||
"license": "SEE LICENSE IN LICENSE.",
|
"license": "SEE LICENSE IN LICENSE.",
|
||||||
"xo": {
|
"eslintConfig": {
|
||||||
"env": [
|
"root": true,
|
||||||
"browser",
|
"extends": [
|
||||||
"node"
|
"xo",
|
||||||
|
"xo-typescript"
|
||||||
],
|
],
|
||||||
"globals": ["GM", "GM_info"],
|
"parser": "@typescript-eslint/parser",
|
||||||
|
"parserOptions": { "project": ["./jsconfig.json"] },
|
||||||
|
"plugins": ["@typescript-eslint"],
|
||||||
|
"globals": {"GM": true, "GM_info": true},
|
||||||
"rules": {
|
"rules": {
|
||||||
|
"@typescript-eslint/brace-style": "off",
|
||||||
|
"@typescript-eslint/comma-dangle": ["error", "only-multiline"],
|
||||||
|
"@typescript-eslint/consistent-type-definitions": "off",
|
||||||
|
"@typescript-eslint/member-delimiter-style": "off",
|
||||||
|
"@typescript-eslint/naming-convention": "off",
|
||||||
|
"@typescript-eslint/no-confusing-void-expression": ["error", {
|
||||||
|
"ignoreVoidOperator": true
|
||||||
|
}],
|
||||||
|
"@typescript-eslint/no-meaningless-void-operator": "off",
|
||||||
|
"@typescript-eslint/padding-line-between-statements": "off",
|
||||||
|
"@typescript-eslint/semi": "off",
|
||||||
|
"@typescript-eslint/space-before-function-paren": "off",
|
||||||
|
"@typescript-eslint/strict-boolean-expressions": ["error", {
|
||||||
|
"allowString": false,
|
||||||
|
"allowNumber": false,
|
||||||
|
"allowNullableObject": false
|
||||||
|
}],
|
||||||
"array-element-newline": "off",
|
"array-element-newline": "off",
|
||||||
"brace-style": "off",
|
"brace-style": "off",
|
||||||
"camelcase": "off",
|
"camelcase": "off",
|
||||||
@@ -44,6 +66,14 @@
|
|||||||
"unicorn/prefer-module": "off",
|
"unicorn/prefer-module": "off",
|
||||||
"unicorn/prefer-top-level-await": "off",
|
"unicorn/prefer-top-level-await": "off",
|
||||||
"fake/fuck-commas": "off"
|
"fake/fuck-commas": "off"
|
||||||
}
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.d.ts"],
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user