first prototype hopefully
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | node_modules | ||||||
							
								
								
									
										45
									
								
								ambient.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								ambient.d.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | |||||||
|  | /* eslint-disable no-unused-vars */ | ||||||
|  | /* eslint-disable @typescript-eslint/consistent-type-definitions */ | ||||||
|  | /* eslint-disable @typescript-eslint/member-delimiter-style */ | ||||||
|  | /* eslint-disable @typescript-eslint/naming-convention */ | ||||||
|  | /* eslint-disable @typescript-eslint/semi */ | ||||||
|  |  | ||||||
|  | declare namespace LILY { | ||||||
|  | 	interface Utils { | ||||||
|  | 		with<V, R>(value: V, callback: (v: V) => R): R // A silly helper to kinda curry values | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	interface Box { | ||||||
|  | 		enable(): void | ||||||
|  | 		disable(): void | ||||||
|  | 		get equipped(): boolean | ||||||
|  | 		get enabled(): boolean | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	interface Eyes { | ||||||
|  | 		zones: AssetGroupName[] | ||||||
|  | 		craft: CraftingItem | ||||||
|  | 		rgb: string[] | ||||||
|  | 		timeout: NodeJS.Timeout | undefined | ||||||
|  | 		set_rgb(item: Item, index: number): boolean | ||||||
|  | 		next_rgb(): boolean | undefined | ||||||
|  | 		roll_rgb(): void | ||||||
|  | 		start(): boolean | ||||||
|  | 		stop(): boolean | ||||||
|  | 		dim(): boolean | ||||||
|  | 		clear(): boolean | ||||||
|  | 		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> {} | ||||||
|  | 	interface Belt { | ||||||
|  | 		admins: number[] | ||||||
|  | 		cli: Commands | ||||||
|  | 		is_cb(subject: Commands | CommandCB): subject is CommandCB | ||||||
|  | 		run(tokens: string[]): string | ||||||
|  | 		receive(data: ServerChatRoomMessage): undefined | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								jsconfig.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								jsconfig.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | |||||||
|  | { | ||||||
|  | 	"include": [ | ||||||
|  | 		"node_modules/bc-stubs/bc/**/*.d.ts", | ||||||
|  | 		"node_modules/bondage-club-mod-sdk/dist/**/*.d.ts", | ||||||
|  | 		"node_modules/@types/tampermokey/**/*.d.ts", | ||||||
|  | 		"ambient.d.ts", | ||||||
|  | 		"lily.user.js" | ||||||
|  | 	], | ||||||
|  | 	"compilerOptions": { | ||||||
|  | 		"lib": [ | ||||||
|  | 			"es2022", | ||||||
|  | 			"DOM" | ||||||
|  | 		], | ||||||
|  | 		"checkJs": true, | ||||||
|  | 		"strict": true, | ||||||
|  | 		"noImplicitOverride": true | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										82
									
								
								lily.user.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								lily.user.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | // ==UserScript== | ||||||
|  | // @name         LILY | ||||||
|  | // @namespace    https://code.fleshless.org/mute | ||||||
|  | // @version      0.0.1 | ||||||
|  | // @description  Lily's Integrated Logic Yoke | ||||||
|  | // @grant        none | ||||||
|  | // @author       Mute | ||||||
|  | // @require      https://code.fleshless.org/mute/LILY/raw/branch/mistress/bcmodsdk-1.2.0.mjs | ||||||
|  | // @match        https://bondageprojects.elementfx.com/* | ||||||
|  | // @match        https://www.bondageprojects.elementfx.com/* | ||||||
|  | // @match        https://bondage-europe.com/* | ||||||
|  | // @match        https://www.bondage-europe.com/* | ||||||
|  | // @match        http://localhost:*/* | ||||||
|  | // ==/UserScript== | ||||||
|  |  | ||||||
|  | (async function() { | ||||||
|  | 	'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'}) | ||||||
|  | 	/** @type {LILY.Utils} */ const U = { | ||||||
|  | 		with: (v, f) => f(v), | ||||||
|  | 	} | ||||||
|  | 	/** @type {LILY.Box} */ const Box = { | ||||||
|  | 		enable() {}, | ||||||
|  | 		disable() {}, | ||||||
|  | 		get equipped() {return false}, | ||||||
|  | 		get enabled() {return this.equipped && false}, | ||||||
|  | 	} | ||||||
|  | 	/** @type {LILY.Eyes} */ const Eyes = { // #9C0000 156 0 0 | ||||||
|  | 		rgb: [ | ||||||
|  | 			'#990000', '#990f00', '#991f00', '#992e00', '#993d00', '#994d00', '#995c00', '#996b00', '#997a00', '#998a00', | ||||||
|  | 			'#999900', '#8a9900', '#7a9900', '#6b9900', '#5c9900', '#4d9900', '#3d9900', '#2e9900', '#1f9900', '#0f9900', | ||||||
|  | 			'#009900', '#00990f', '#00991f', '#00992e', '#00993d', '#00994d', '#00995c', '#00996b', '#00997a', '#00998a', | ||||||
|  | 			'#009999', '#008a99', '#007a99', '#006b99', '#005c99', '#004d99', '#003d99', '#002e99', '#001f99', '#000f99', | ||||||
|  | 			'#000099', '#0f0099', '#1f0099', '#2e0099', '#3d0099', '#4d0099', '#5c0099', '#6b0099', '#7a0099', '#8a0099', | ||||||
|  | 			'#990099', '#99008a', '#99007a', '#99006b', '#99005c', '#99004d', '#99003d', '#99002e', '#99001f', '#99000f', | ||||||
|  | 		], | ||||||
|  | 		timeout: undefined, | ||||||
|  | 		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'}, | ||||||
|  | 		zones: ['ItemHead', 'Mask'], | ||||||
|  | 		set_rgb(item, n) {item.Color = [this.rgb[n], 'Default', this.rgb[n], 'Default']; return true}, | ||||||
|  | 		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)))}, | ||||||
|  | 		roll_rgb() {this.next_rgb() && W.ChatRoomCharacterItemUpdate(W.Player, 'Mask')}, | ||||||
|  | 		start() {return Boolean(this.check('Mask')) && !this.timeout && Boolean(this.timeout = setInterval(() => this.roll_rgb(), 1000))}, | ||||||
|  | 		stop() {return Boolean(this.check('Mask')) && Boolean(this.timeout) && !(this.timeout = void clearInterval(this.timeout))}, | ||||||
|  | 		dim() {return !this.check('ItemHead') && Boolean(W.InventoryWear(W.Player, 'AnimeLenses', 'ItemHead', undefined, undefined, 71_240, this.craft) && !void W.ChatRoomCharacterUpdate(W.Player))}, | ||||||
|  | 		clear() {return Boolean(this.check('ItemHead')) && !void W.InventoryRemove(W.Player, 'ItemHead') && !void W.ChatRoomCharacterUpdate(W.Player)}, | ||||||
|  | 		check(zone) {return U.with(this.item, item => (item && item.Asset.Group.Name === zone) ? item : undefined)}, | ||||||
|  | 		get item() {return this.zones.map(z => W.InventoryGet(W.Player, z)).find(item => item && item.Asset.Name === 'AnimeLenses') || undefined}, | ||||||
|  | 	} | ||||||
|  | 	/** @type {LILY.Belt} */ const Belt = { | ||||||
|  | 		admins: [71_240, 67_994], | ||||||
|  | 		cli: {'!LILY': { | ||||||
|  | 			status: _ => '200 OK', | ||||||
|  | 			box: { | ||||||
|  | 				on: _ => Box.enable(), | ||||||
|  | 				off: _ => Box.disable(), | ||||||
|  | 			}, | ||||||
|  | 			eyes: { | ||||||
|  | 				start: _ => Eyes.start(), | ||||||
|  | 				stop: _ => Eyes.stop(), | ||||||
|  | 				dim: _ => Eyes.dim(), | ||||||
|  | 				clear: _ => Eyes.clear(), | ||||||
|  | 			}, | ||||||
|  | 		}}, | ||||||
|  | 		/** @type {LILY.Belt['is_cb']} */ is_cb: s => typeof s === 'function', | ||||||
|  | 		run(tokens) { /** @type {string | undefined} */ let t, /** @type {LILY.Commands | LILY.CommandCB} */ cmd = this.cli | ||||||
|  | 			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 | ||||||
|  | 			if (!this.is_cb(cmd)) return t ? `unknown token ${t}` : `subcommands: [${Object.keys(cmd).join(', ')}]` | ||||||
|  | 			return U.with(cmd(...tokens), r => typeof r === 'boolean' ? (r ? 'success' : 'fail') : String(r)) | ||||||
|  | 		}, | ||||||
|  | 		receive(data) { if (!data.Sender) return undefined | ||||||
|  | 			const reply = this.admins.includes(data.Sender) ? this.run(data.Content.split(' ')) : 'access denied' | ||||||
|  | 			return void W.ChatRoomSendWhisper(data.Sender, `LILY: ${reply}`) | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 	SDK.hookFunction('SpeechTransformGagGarble', 0, ([text]) => text) // disable garbling | ||||||
|  | 	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>'))) | ||||||
|  | 	W.ChatRoomRegisterMessageHandler({Priority: -169, Description: 'LILY', Callback: data => data.Type === 'Whisper' && data.Content.startsWith('!LILY') && (Belt.receive(data) || true)}) | ||||||
|  | })() | ||||||
							
								
								
									
										5974
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										5974
									
								
								package-lock.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										49
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								package.json
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,49 @@ | |||||||
|  | { | ||||||
|  | 	"name": "lily", | ||||||
|  | 	"version": "0.0.1", | ||||||
|  | 	"description": "Lily's Integrated Logic Yoke", | ||||||
|  | 	"type": "module", | ||||||
|  | 	"devDependencies": { | ||||||
|  | 		"xo": "^0.58.0", | ||||||
|  | 		"bc-stubs": "^105.0.0", | ||||||
|  | 		"bondage-club-mod-sdk": "^1.2.0", | ||||||
|  | 		"@types/tampermonkey": "^5.0.3" | ||||||
|  |   }, | ||||||
|  | 	"license": "SEE LICENSE IN LICENSE.", | ||||||
|  | 	"xo": { | ||||||
|  | 		"env": [ | ||||||
|  | 			"browser", | ||||||
|  | 			"node" | ||||||
|  | 		], | ||||||
|  | 		"globals": ["GM", "GM_info"], | ||||||
|  | 		"rules": { | ||||||
|  | 			"array-element-newline": "off", | ||||||
|  | 			"brace-style": "off", | ||||||
|  | 			"camelcase": "off", | ||||||
|  | 			"capitalized-comments": "off", | ||||||
|  | 			"curly": "off", | ||||||
|  | 			"max-params": "off", | ||||||
|  | 			"max-statements-per-line": "off", | ||||||
|  | 			"new-cap": "off", | ||||||
|  | 			"no-return-assign": "off", | ||||||
|  | 			"no-unused-expressions": "off", | ||||||
|  | 			"no-unused-vars": ["error", { | ||||||
|  | 				"argsIgnorePattern": "^_", | ||||||
|  | 				"destructuredArrayIgnorePattern": "^_" | ||||||
|  | 			}], | ||||||
|  | 			"no-void": "off", | ||||||
|  | 			"padding-line-between-statements": "off", | ||||||
|  | 			"object-curly-newline": "off", | ||||||
|  | 			"one-var": "off", | ||||||
|  | 			"one-var-declaration-per-line": "off", | ||||||
|  | 			"semi": "off", | ||||||
|  | 			"space-before-function-paren": "off", | ||||||
|  | 			"spaced-comment": "off", | ||||||
|  | 			"unicorn/no-array-for-each": "off", | ||||||
|  | 			"unicorn/no-array-reduce": "off", | ||||||
|  | 			"unicorn/prefer-module": "off", | ||||||
|  | 			"unicorn/prefer-top-level-await": "off", | ||||||
|  | 			"fake/fuck-commas": "off" | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user