plugins
This commit is contained in:
		| @ -1,5 +1,7 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const axios = require('axios'); | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep} = require('../utils'); | ||||
|  | ||||
| @ -11,11 +13,80 @@ const { | ||||
| } = require("@google/generative-ai"); | ||||
|  | ||||
|  | ||||
|  | ||||
| class Ai{ | ||||
| 	constructor(prompt){ | ||||
| 		this.prompt = prompt; | ||||
| 		this.start(); | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 		this.promptName = args.promptName; | ||||
| 		this.prompCustom = args.prompCustom || ''; | ||||
| 		this.intervalLength = args.intervalLength || 30; | ||||
| 		this.intervalStop; | ||||
| 		this.messageListener; | ||||
| 	} | ||||
|  | ||||
| 	async init(){ | ||||
| 		await this.start(); | ||||
| 		this.bot.on('onReady', async (argument)=>{ | ||||
| 			try{ | ||||
| 				await sleep(1000); | ||||
| 				let messages = ['']; | ||||
|  | ||||
| 				this.messageListener = this.bot.on('message', (message, type)=>{ | ||||
| 					if(type === 'game_info') return; | ||||
| 					if(message.toString().startsWith('<') && message.toString().split('>')[0].includes(this.bot.bot.entity.username)){ | ||||
| 						console.log('message blocked from message array') | ||||
| 						return; | ||||
| 					} | ||||
| 					console.log(`Message ${type}: ${message.toString()}`) | ||||
| 					messages.push('>', message.toString()); | ||||
| 				}); | ||||
| 				 | ||||
| 				this.intervalStop = setInterval(async ()=>{ | ||||
| 					let result; | ||||
| 					// if(messages.length ===0) return; | ||||
| 					 | ||||
| 					try{ | ||||
| 						result = await this.chat(JSON.stringify({ | ||||
| 							messages, currentTime:Date.now()+1} | ||||
| 						)); | ||||
| 					}catch(error){ | ||||
| 						console.log('error AI API', error, result); | ||||
| 						messages = []; | ||||
| 						return ; | ||||
| 					} | ||||
|  | ||||
| 					try{ | ||||
| 						messages = ['']; | ||||
| 						if(!result.response.text()) return; | ||||
|  | ||||
| 						for(let message of JSON.parse(result.response.text())){ | ||||
| 							console.log('toSay', message.delay, message.text); | ||||
| 							if(message.text === '___') return; | ||||
| 							setTimeout(async (message)=>{ | ||||
| 								await this.bot.sayAiSafe(message.text); | ||||
| 							}, message.delay*1000, message); | ||||
| 						} | ||||
| 					}catch(error){ | ||||
| 						console.log('Error in AI message loop', error, result); | ||||
| 						if(result || result.response || result.response.text()){ | ||||
| 							console.log(result.response.text()) | ||||
| 						} | ||||
| 					} | ||||
| 				}, this.intervalLength*1000); | ||||
| 			 | ||||
| 			}catch(error){ | ||||
| 				console.log('error in onReady', error); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	async unload(){ | ||||
| 		if(this.intervalStop){ | ||||
| 			clearInterval(this.intervalStop); | ||||
| 			this.intervalStop = undefined; | ||||
| 		} | ||||
| 		this.messageListener(); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	__settings(history){ | ||||
| @ -63,13 +134,26 @@ class Ai{ | ||||
| 	} | ||||
| 	} | ||||
|  | ||||
| 	start(history){ | ||||
| 	async start(history){ | ||||
| 		const genAI = new GoogleGenerativeAI(conf.ai.key); | ||||
|  | ||||
| 		const model = genAI.getGenerativeModel({ | ||||
| 			model: "gemini-1.5-flash", | ||||
| 		}); | ||||
|  | ||||
| 		let bulbaItems = await axios.get('https://webstore.bulbastore.uk/api/listings'); | ||||
| 		bulbaItems = bulbaItems.data.listings.map(i=>i.listing_name); | ||||
|  | ||||
| 		console.log('AI for prompts', conf.ai.prompts) | ||||
|  | ||||
| 		this.prompt = conf.ai.prompts[this.promptName]( | ||||
| 			this.bot.bot.entity.username, | ||||
| 			conf.ai.interval, | ||||
| 			Object.values(this.bot.getPlayers()).map(player=>`<[${player.lvl}] ${player.username}>`).join('\n'), | ||||
| 			bulbaItems, | ||||
| 			this.prompCustom, | ||||
| 		); | ||||
|  | ||||
| 		this.session = model.startChat({ | ||||
| 			...this.__settings(history), | ||||
| 			// systemInstruction: this.prompt, | ||||
| @ -91,7 +175,6 @@ class Ai{ | ||||
| 			}; | ||||
| 			await sleep(500); | ||||
| 			this.session.params.history.pop(); | ||||
| 			console.log('current history', this.session.params.history); | ||||
| 			this.start(this.session.params.history); | ||||
| 			return await this.chat(message, retryCount++) | ||||
| 		} | ||||
| @ -103,5 +186,5 @@ class Ai{ | ||||
|  | ||||
|  | ||||
|  | ||||
| module.exports = {Ai}; | ||||
| module.exports = Ai; | ||||
| // run(); | ||||
							
								
								
									
										64
									
								
								nodejs/controller/botWalk.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								nodejs/controller/botWalk.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep} = require('../utils'); | ||||
|  | ||||
| class Craft{ | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 		this.interval = args.interval; | ||||
| 		this.target = args.target; | ||||
| 		this.intervalStop; | ||||
| 		this.isAction = true; | ||||
| 	} | ||||
|  | ||||
| 	async init(){ | ||||
| 		this.bot.on('onReady', async ()=>{ | ||||
| 			this.bot.bot.setControlState('jump', true); | ||||
| 			setTimeout(()=> this.bot.bot.setControlState('jump', false), 2000); | ||||
| 			await sleep(2000); | ||||
|  | ||||
| 			let chest = this.bot.findChestBySign('FILLED BOXES'); | ||||
| 			await this.bot.goTo({ | ||||
| 				where: chest, | ||||
| 				range: 3, | ||||
| 			}); | ||||
| 			await this.bot.getFullShulkersFromChest(chest, {id:3}); | ||||
|  | ||||
| 			// goto 'FILLED BOXES' box | ||||
| 			// get 4 boxes of 'prismarine_shard' | ||||
| 			// get 5 boxes of 'prismarine_crystals' | ||||
| 			// place boxes | ||||
|  | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	unload(){ | ||||
| 		if(this.intervalStop){ | ||||
| 			clearInterval(this.intervalStop); | ||||
| 			this.intervalStop = undefined; | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	async goToSpot(){ | ||||
| 		await this.bot.goTo({ | ||||
| 			where: this.bot.findBlockBySign('guardian\nattack spot'), | ||||
| 			range: 0, | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	async swing(){ | ||||
| 		this.intervalStop = setInterval(()=>{ | ||||
| 			try{ | ||||
| 				this.bot.bot.attack( | ||||
| 					this.bot.bot.nearestEntity( | ||||
| 						entity => entity.name.toLowerCase() === 'guardian' | ||||
| 					) | ||||
| 				); | ||||
| 			}catch(error){} | ||||
| 		}, 4000); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = Craft; | ||||
| @ -1,32 +1,112 @@ | ||||
| module.exports =  { | ||||
| 	'help': { | ||||
| 	    desc: `Print the allowed commands.`, | ||||
| 	    async function(from){ | ||||
| 	        console.log('called help', from) | ||||
| 	        let intro = [ | ||||
| 	            'I am a bot owned and operated by', | ||||
| 	            'wmantly <wmantly@gmail.com>', | ||||
| 	            'You have access to the following commands:' | ||||
| 	        ] | ||||
| 	        await this.whisper(from, ...intro, ...this.__reduceCommands(from).map(command => | ||||
| 	            `${command} -- ${this.commands[command].desc || ''}` | ||||
| 	        )); | ||||
| 	    } | ||||
| 		desc: `Print the allowed commands.`, | ||||
| 		async function(from){ | ||||
| 			console.log('called help', from) | ||||
| 			let intro = [ | ||||
| 				'I am a bot owned and operated by', | ||||
| 				'wmantly <wmantly@gmail.com>', | ||||
| 				'You have access to the following commands:' | ||||
| 			] | ||||
| 			await this.whisper(from, ...intro, ...this.__reduceCommands(from).map(command => | ||||
| 				`${command} -- ${this.commands[command].desc || ''}` | ||||
| 			)); | ||||
| 		} | ||||
| 	}, | ||||
| 	'say': { | ||||
| 		desc: `Make the bot say stuff in chat`, | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', '1_cut',], | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 	    async function(from, ...messages){ | ||||
| 	        await this.say((messages || []).join(' ')); | ||||
| 	    } | ||||
| 		async function(from, ...messages){ | ||||
| 			await this.say((messages || []).join(' ')); | ||||
| 		} | ||||
|  | ||||
| 	}, | ||||
| 	'plugins': { | ||||
| 		desc: 'List the plugins', | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName){ | ||||
| 			if(botName){ | ||||
| 				if(botName in this.constructor.bots){ | ||||
| 					this.whisper(from, `${Object.keys(this.constructor.bots[botName].plunginsLoaded)}`) | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 		} | ||||
| 	}, | ||||
| 	'unload': { | ||||
| 		desc: `Make bot unload plugin`, | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName, plugin) { | ||||
| 			this.whisper(from, `Unloading ${plugin}`); | ||||
| 			if(botName in this.constructor.bots){ | ||||
| 				let bot = this.constructor.bots[botName]; | ||||
| 				let status = await bot.pluginUnload(plugin); | ||||
| 				return this.whisper(from, `plugin status ${status}`); | ||||
| 			} | ||||
|  | ||||
| 			this.whisper(from, '?') | ||||
| 		} | ||||
| 	}, | ||||
| 	'load': { | ||||
| 		desc: `Make bot load/unload plugin`, | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName, plugin) { | ||||
| 			this.whisper(from, `Loading ${plugin}`); | ||||
| 			if(botName in this.constructor.bots){ | ||||
| 				let bot = this.constructor.bots[botName]; | ||||
| 				let status = await bot.pluginLoad(plugin); | ||||
| 				return this.whisper(from, `plugin status ${status}`); | ||||
| 			} | ||||
|  | ||||
| 			this.whisper(from, '?') | ||||
| 		} | ||||
| 	}, | ||||
| 	'guardian': { | ||||
| 		desc:'', | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName, action) { | ||||
| 			this.whisper(from, `Loading ${plugin}`); | ||||
| 			if(botName in this.constructor.bots){ | ||||
| 				let bot = this.constructor.bots[botName]; | ||||
| 				let status = await bot.pluginLoad(plugin); | ||||
| 				return this.whisper(from, `plugin status ${status}`); | ||||
| 			} | ||||
|  | ||||
| 			this.whisper(from, '?') | ||||
| 		} | ||||
| 	}, | ||||
| 	'ai': { | ||||
| 		desc: `Make bot load/unload plugin`, | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName, personality, ...custom) { | ||||
| 			if(botName in this.constructor.bots ){ | ||||
| 				let bot = this.constructor.bots[botName]; | ||||
| 				if(bot.isReady){ | ||||
| 					let status = await bot.pluginLoad('Ai', { | ||||
| 						promptName: personality, | ||||
| 						prompCustom: custom, | ||||
| 					}); | ||||
| 					 | ||||
| 					return this.whisper(from, `plugin status ${status}`); | ||||
| 				} | ||||
|  | ||||
| 			} | ||||
|  | ||||
| 			this.whisper(from, '?') | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	'logon': { | ||||
| 		desc: `Have bot log on for 10 seconds'`, | ||||
| 		allowed: ['wmantly', 'useless666', 'tux4242', 'pi_chef', '1_cut',], | ||||
| 		ignoreLock: true, | ||||
| 		async function(from, botName){ | ||||
| 		async function(from, botName, time){ | ||||
| 			this.__unLockCommand(); | ||||
|  | ||||
| 			if(botName in this.constructor.bots){ | ||||
| @ -35,11 +115,11 @@ module.exports =  { | ||||
| 				if(!bot.isReady){ | ||||
| 					try{ | ||||
| 						await bot.connect(); | ||||
| 						var clear = setTimeout(()=> bot.quit(), 10000); | ||||
| 						var clear = setTimeout(()=> bot.quit(), time ? parseInt(time)*1000 : 10000); | ||||
| 						bot.whisper(from, 'I am ready') | ||||
| 					}catch(error){ | ||||
| 						console.log('inv error connecting to bot'); | ||||
| 						this.whisper('Bot is not available right now, try again in 30 seconds.'); | ||||
| 						this.whisper(from, 'Bot is not available right now, try again in 30 seconds.'); | ||||
| 					} | ||||
| 				}else{ | ||||
| 					await this.whisper(from, `Bot ${bot.bot.entity.username} Already online`); | ||||
|  | ||||
| @ -98,12 +98,18 @@ module.exports = { | ||||
| 						console.log('inv error connecting to bot'); | ||||
| 						this.whisper('Bot is not available right now, try again in 30 seconds.'); | ||||
| 					} | ||||
| 					var clear = setTimeout(()=> bot.quit(), 10000); | ||||
| 					var clear = setTimeout(()=>{ | ||||
| 						bot.pluginUnload('Tp'); | ||||
| 						bot.quit() | ||||
| 					}, 10000); | ||||
| 				} | ||||
| 				await bot.pluginLoad('Tp'); | ||||
| 				await bot.bot.chat(`/invite ${from}`); | ||||
| 				await bot.whisper(from, `accept invite from ${bot.bot.entity.username} within 10 seconds...`); | ||||
| 				bot.on('message', (message) =>{ | ||||
| 				bot.on('message', async (message) =>{ | ||||
| 					if(message.toString() === `${from} teleported to you.`){ | ||||
| 						await bot.pluginUnload('Tp'); | ||||
|  | ||||
| 						if(clear){ | ||||
| 							clearTimeout(clear); | ||||
| 							bot.quit(); | ||||
|  | ||||
| @ -8,81 +8,81 @@ const customerSlots = [5, 6, 7, 8, 14, 15, 16, 17, 23, 24, 25, 26]; | ||||
|  | ||||
|  | ||||
| function findChestBySign(bot, text){ | ||||
|     let sign = bot.bot.findBlock({ | ||||
|         useExtraInfo: true, | ||||
|         maxDistance: 32, | ||||
|         matching: (block)=> { | ||||
|             if(block.name.includes('sign') && block.signText.includes(text)){ | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|     }); | ||||
| 	let sign = bot.bot.findBlock({ | ||||
| 		useExtraInfo: true, | ||||
| 		maxDistance: 32, | ||||
| 		matching: (block)=> { | ||||
| 			if(block.name.includes('sign') && block.signText.includes(text)){ | ||||
| 				return true; | ||||
| 			} | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
|     return bot.bot.findBlock({ | ||||
|         point: sign.position, | ||||
|         // maxDistance: 1, | ||||
|         useExtraInfo: true, | ||||
|         matching: block => block.name === 'chest' | ||||
|     }); | ||||
| 	return bot.bot.findBlock({ | ||||
| 		point: sign.position, | ||||
| 		// maxDistance: 1, | ||||
| 		useExtraInfo: true, | ||||
| 		matching: block => block.name === 'chest' | ||||
| 	}); | ||||
| } | ||||
|  | ||||
| module.exports = { | ||||
|     '.trade': { | ||||
|         desc: 'Bot will take trade requests', | ||||
|         async function(from){ | ||||
|             /* | ||||
|             todo | ||||
| 	'.trade': { | ||||
| 		desc: 'Bot will take trade requests', | ||||
| 		async function(from){ | ||||
| 			/* | ||||
| 			todo | ||||
|  | ||||
|             * Do... something if the users chest is full | ||||
| 			* Do... something if the users chest is full | ||||
|  | ||||
|             */ | ||||
| 			*/ | ||||
|  | ||||
|             // Make the user has a chest then can add too. | ||||
|             let chestBlock = findChestBySign(this, from); | ||||
|             if(!chestBlock) return this.whisper(from, `You aren't allowed to trade with me...`); | ||||
| 			// Make the user has a chest then can add too. | ||||
| 			let chestBlock = findChestBySign(this, from); | ||||
| 			if(!chestBlock) return this.whisper(from, `You aren't allowed to trade with me...`); | ||||
|  | ||||
|             await this.say('/trade accept'); | ||||
|             let window = await this.once('windowOpen'); | ||||
| 			await this.say('/trade accept'); | ||||
| 			let window = await this.once('windowOpen'); | ||||
|  | ||||
|             // If the process is taking to long, just stop | ||||
|             let timeoutCheck = setTimeout(()=>{ | ||||
|                 this.bot.closeWindow('window'); | ||||
|                 this.bot.removeAllListeners('windowOpen'); | ||||
|                 this.whisper(from, `I have things to do, I cant wait on you all day!`) | ||||
|             }, 120000); | ||||
| 			// If the process is taking to long, just stop | ||||
| 			let timeoutCheck = setTimeout(()=>{ | ||||
| 				this.bot.closeWindow('window'); | ||||
| 				this.bot.removeAllListeners('windowOpen'); | ||||
| 				this.whisper(from, `I have things to do, I cant wait on you all day!`) | ||||
| 			}, 120000); | ||||
|  | ||||
|             // Check to see if the remote user has agreed to the trade. | ||||
|             let confirmationCheck = setInterval(async ()=>{ | ||||
|                 if(window.containerItems().filter(item => item?.slot == 53)[0].name == 'lime_dye'){ | ||||
|                     this.bot.moveSlotItem(37, 37); | ||||
|                 } | ||||
|             }, 500); | ||||
| 			// Check to see if the remote user has agreed to the trade. | ||||
| 			let confirmationCheck = setInterval(async ()=>{ | ||||
| 				if(window.containerItems().filter(item => item?.slot == 53)[0].name == 'lime_dye'){ | ||||
| 					this.bot.moveSlotItem(37, 37); | ||||
| 				} | ||||
| 			}, 500); | ||||
|  | ||||
|             // Clean up when the trade is done | ||||
|             await this.once('windowClose'); | ||||
|             clearInterval(confirmationCheck); | ||||
| 			// Clean up when the trade is done | ||||
| 			await this.once('windowClose'); | ||||
| 			clearInterval(confirmationCheck); | ||||
|  | ||||
|             // If the trade took so long it timed out, just kill the whole thing. | ||||
|             if(timeoutCheck._destroyed) return; | ||||
|             clearTimeout(timeoutCheck) | ||||
| 			// If the trade took so long it timed out, just kill the whole thing. | ||||
| 			if(timeoutCheck._destroyed) return; | ||||
| 			clearTimeout(timeoutCheck) | ||||
|  | ||||
|             // Give MC a moment | ||||
|             // await sleep(1000); | ||||
| 			// Give MC a moment | ||||
| 			// await sleep(1000); | ||||
|  | ||||
|             let goBack = await this.goToReturn({where: chestBlock, reTry: true}) | ||||
| 			let goBack = await this.goToReturn({where: chestBlock, reTry: true}) | ||||
|  | ||||
|             let isPutAway = await this.dumpToChest(chestBlock) | ||||
| 			let isPutAway = await this.dumpToChest(chestBlock) | ||||
|  | ||||
|             await goBack(); | ||||
| 			await goBack(); | ||||
|  | ||||
|             await this.whisper(from, `I put ${isPutAway ? 'all' : 'some'} items in your chest.`); | ||||
|         } | ||||
|     }, | ||||
|     'test': { | ||||
|         desc: 'go away', | ||||
|         allowed: ['useless666'], | ||||
|         async function(from){ | ||||
|             let chestBlock = findChestBySign(this, from); | ||||
|         } | ||||
|     } | ||||
| 			await this.whisper(from, `I put ${isPutAway ? 'all' : 'some'} items in your chest.`); | ||||
| 		} | ||||
| 	}, | ||||
| 	'test': { | ||||
| 		desc: 'go away', | ||||
| 		allowed: ['useless666'], | ||||
| 		async function(from){ | ||||
| 			let chestBlock = findChestBySign(this, from); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
							
								
								
									
										187
									
								
								nodejs/controller/craft.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										187
									
								
								nodejs/controller/craft.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,187 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep, nextTick} = require('../utils'); | ||||
|  | ||||
| class Craft{ | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 		this.interval = args.interval; | ||||
| 		this.target = args.target; | ||||
| 		this.intervalStop; | ||||
| 		this.isAction = true; | ||||
| 	} | ||||
|  | ||||
| 	init(){ | ||||
| 		return new Promise(async (resolve, reject)=>{ | ||||
| 			this.bot.on('onReady', async ()=>{ | ||||
| 				try{ | ||||
| 					await sleep(500); | ||||
| 					await this.bot.goTo({ | ||||
| 						where: this.bot.findBlockBySign('bot walk 2').position, | ||||
| 						range: 0, | ||||
| 					}); | ||||
|  | ||||
| 					await this.bot.goTo({ | ||||
| 						where: this.bot.findBlockBySign('bot walk 1').position, | ||||
| 						range: 0, | ||||
| 					}); | ||||
|  | ||||
| 					await this.bot.goTo({ | ||||
| 						where: this.bot.findBlockBySign('bot walk 2').position, | ||||
| 						range: 0, | ||||
| 					}); | ||||
|  | ||||
| 					let hasItems = await this.getItems(); | ||||
|  | ||||
| 					while(hasItems){ | ||||
| 						await this.craft(); | ||||
| 						hasItems = await this.getItems(); | ||||
| 					} | ||||
|  | ||||
| 					return resolve(); | ||||
|  | ||||
| 				}catch(error){ | ||||
| 					reject(error); | ||||
| 				} | ||||
|  | ||||
| 			});			 | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	unload(){ | ||||
| 		if(this.intervalStop){ | ||||
| 			clearInterval(this.intervalStop); | ||||
| 			this.intervalStop = undefined; | ||||
| 		} | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	async getItems(){ | ||||
| 		/*  | ||||
| 		shards  | ||||
| 		*/ | ||||
| 		let prismarine_shardChest = this.bot.findChestBySign('prismarine_shard'); | ||||
| 		await this.bot.goTo({ | ||||
| 			where: prismarine_shardChest.position, | ||||
| 			range: 2, | ||||
| 		}); | ||||
|  | ||||
| 		let hasShard = await this.bot.checkItemsFromContainer( | ||||
| 			prismarine_shardChest, 'prismarine_shard', 64*4 | ||||
| 		); | ||||
|  | ||||
| 		/* | ||||
| 		crystals | ||||
| 		*/ | ||||
| 		let prismarine_crystalsChest = this.bot.findChestBySign('crystals'); | ||||
| 		await this.bot.goTo({ | ||||
| 			where: prismarine_crystalsChest.position, | ||||
| 			range: 2, | ||||
| 		}); | ||||
|  | ||||
| 		let hasCrystals = await this.bot.checkItemsFromContainer( | ||||
| 			prismarine_crystalsChest, 'prismarine_crystals', 64*5 | ||||
| 		); | ||||
|  | ||||
| 		if(!hasShard || !hasCrystals) return false; | ||||
|  | ||||
| 		/* | ||||
| 		get | ||||
| 		*/ | ||||
| 		await sleep(3000); | ||||
|  | ||||
| 		await this.bot.getItemsFromChest( | ||||
| 			prismarine_shardChest, 'prismarine_shard', 64*4 | ||||
| 		); | ||||
| 		await sleep(1000); | ||||
|  | ||||
| 		await this.bot.getItemsFromChest( | ||||
| 			prismarine_crystalsChest, 'prismarine_crystals', 64*5 | ||||
| 		); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	async craft(){ | ||||
|  | ||||
| 		// Ensure the bot has enough items (4 shards and 5 crystals for 1 lantern) | ||||
| 		let prismarineShardsCount = this.bot.bot.inventory.count(this.bot.mcData.itemsByName.prismarine_shard.id); | ||||
| 		let prismarineCrystalsCount = this.bot.bot.inventory.count(this.bot.mcData.itemsByName.prismarine_crystals.id); | ||||
|  | ||||
| 		if(prismarineShardsCount < 4 || prismarineCrystalsCount < 5){ | ||||
| 		  console.log("Not enough materials to craft 64 Sea Lanterns."); | ||||
| 		  return; | ||||
| 		}else{ | ||||
| 			console.log('good to make sea_lantern!') | ||||
| 		} | ||||
|  | ||||
| 		// Hold onto the closest crafting table | ||||
| 		let craftingTable = this.bot.bot.findBlock({ | ||||
| 			matching: this.bot.mcData.blocksByName.crafting_table.id, | ||||
| 			maxDistance: 64 | ||||
| 		}); | ||||
|  | ||||
| 		await this.bot.goTo({ | ||||
| 			where: craftingTable.position, | ||||
| 			range: 1, | ||||
| 		}); | ||||
|  | ||||
| 		// Hold onto the recipe | ||||
| 		let recipe = this.bot.bot.recipesAll( | ||||
| 			this.bot.mcData.itemsByName.sea_lantern.id, | ||||
| 			null, | ||||
| 			craftingTable | ||||
| 		)[0]; | ||||
|  | ||||
| 		let window = await this.bot.openCraftingTable(craftingTable); | ||||
|  | ||||
| 		// Move these into openCrating function | ||||
| 		let windowOnce = (event)=> new Promise((resolve, reject)=> window.once(event, resolve)); | ||||
| 		let inventory = ()=> window.slots.slice(window.inventoryStart, window.inventoryEnd) | ||||
|  | ||||
| 		// Move the items into the crafting grid | ||||
| 		let slotCount = 1; | ||||
| 		for(let shapeRow of recipe.inShape){ | ||||
| 			for(let shape of shapeRow){ | ||||
| 				this.bot.bot.moveSlotItem( | ||||
| 					inventory().find((element)=> element && element.type === shape.id).slot, | ||||
| 					slotCount | ||||
| 				); | ||||
| 				await windowOnce(`updateSlot:${slotCount}`); | ||||
| 				slotCount++; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Wait for the server to catch up. | ||||
| 		await sleep(500); | ||||
|  | ||||
| 		// Craft each item until all are gone. | ||||
| 		let craftedCount = 0; | ||||
| 		while(window.slots[0]){ | ||||
| 			await this.bot.bot.moveSlotItem( | ||||
| 				window.craftingResultSlot, | ||||
| 				38 // dont hard code this!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||||
| 			); | ||||
| 			craftedCount++; | ||||
| 			await windowOnce(`updateSlot:0`); | ||||
| 			await sleep(50); // wait for the client to catchup | ||||
| 		} | ||||
|  | ||||
| 		await window.close(); | ||||
|  | ||||
| 		/* | ||||
| 		Dump items to chest | ||||
| 		*/ | ||||
|  | ||||
| 		let seaLanternChest = this.bot.findChestBySign('sea_lantern'); | ||||
| 		await this.bot.goTo({ | ||||
| 			where: seaLanternChest.position, | ||||
| 			range: 4, | ||||
| 		}); | ||||
|  | ||||
| 		await this.bot.dumpToChest(seaLanternChest, 'sea_lantern') | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = Craft; | ||||
							
								
								
									
										53
									
								
								nodejs/controller/guardianFarm.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								nodejs/controller/guardianFarm.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,53 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep, nextTick} = require('../utils'); | ||||
|  | ||||
| class GuardianFarm{ | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 		this.isDangerous = true; | ||||
| 		this.isAction = true; | ||||
| 	} | ||||
|  | ||||
| 	async init(){ | ||||
| 		console.log('GuardianFarm started') | ||||
| 		this.onReadyListen = this.bot.on('onReady', async ()=>{ | ||||
| 			await sleep(3000); | ||||
| 			let lastTimeListen = this.bot.bot.time.timeOfDay; | ||||
| 			this.onTimeListen = this.bot.bot.on('time', async ()=>{ | ||||
| 				let isDay = lastTimeListen < this.bot.bot.time.timeOfDay; | ||||
| 				lastTimeListen = this.bot.bot.time.timeOfDay; | ||||
|  | ||||
| 				if(isDay){ | ||||
| 					await this.onNewDay(); | ||||
| 				} | ||||
| 			}); | ||||
| 			await this.bot.pluginLoad('Swing'); | ||||
|  | ||||
| 		}); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	unload(){ | ||||
| 		this.onReadyListen(); | ||||
| 		this.onTimeListen(); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	async onNewDay(){ | ||||
| 		try{ | ||||
| 			console.log('GuardianFarm.onNewDay new day!'); | ||||
| 			await this.bot.pluginUnload('Swing'); | ||||
| 			await this.bot.pluginLoad('Craft'); | ||||
| 			await this.bot.pluginUnload('Craft'); | ||||
| 			await this.bot.pluginLoad('Swing'); | ||||
| 		}catch(error){ | ||||
| 			console.error('Error in GuardianFarm.onNewDay:', error); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = GuardianFarm; | ||||
| @ -1,7 +1,5 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const axios = require('axios'); | ||||
|  | ||||
| const {sleep} = require('../utils'); | ||||
| const conf = require('../conf'); | ||||
| const {CJbot} = require('../model/minecraft'); | ||||
| @ -10,7 +8,15 @@ const inventoryViewer = require('mineflayer-web-inventory'); | ||||
| const commands = require('./commands'); | ||||
| const {onJoin} = require('./player_list'); | ||||
| const {Ai} = require('./ai'); | ||||
| // const plugins = { | ||||
| // 	Swing: require('./swing'), | ||||
| // } | ||||
|  | ||||
| CJbot.pluginAdd(require('./swing')); | ||||
| CJbot.pluginAdd(require('./craft')); | ||||
| CJbot.pluginAdd(require('./tp')); | ||||
| CJbot.pluginAdd(require('./ai')); | ||||
| CJbot.pluginAdd(require('./guardianFarm')); | ||||
|  | ||||
| for(let name in conf.mc.bots){ | ||||
| 	if(CJbot.bots[name]) continue; | ||||
| @ -23,81 +29,11 @@ for(let name in conf.mc.bots){ | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	bot.on('onReady', async function(argument) { | ||||
| 		// inventoryViewer(bot.bot); | ||||
| 		try{ | ||||
| 			// onJoin(bot); | ||||
| 			// await sleep(1000); | ||||
| 			// bot.bot.setControlState('jump', true); | ||||
| 			// setTimeout(()=> bot.bot.setControlState('jump', false), 5000); | ||||
| 			if(bot.hasAi){ | ||||
| 				console.log(`${bot.bot.entity.username} has AI`); | ||||
| 				let messages = ['']; | ||||
|  | ||||
| 				let bulbaItems = await axios.get('https://webstore.bulbastore.uk/api/listings'); | ||||
| 				bulbaItems = bulbaItems.data.listings.map(i=>i.listing_name); | ||||
|  | ||||
| 				bot.bot.on('message', (message, type)=>{ | ||||
| 					if(type === 'game_info') return; | ||||
| 					if(message.toString().startsWith('<') && message.toString().split('>')[0].includes(bot.bot.entity.username)) return; | ||||
| 					console.log(`Message ${type}: ${message.toString()}`) | ||||
| 					messages.push('>', message.toString()); | ||||
| 				}); | ||||
|  | ||||
| 				await sleep(500); | ||||
| 				 | ||||
| 				let aiChat = new Ai(conf.ai.prompt( | ||||
| 					bot.bot.entity.username, | ||||
| 					conf.ai.interval, | ||||
| 					Object.values(bot.getPlayers()).map(player=>`<[${player.lvl}] ${player.username}>`).join('\n'), | ||||
| 					bulbaItems | ||||
| 				)) | ||||
|  | ||||
| 				 | ||||
| 				setInterval(async ()=>{ | ||||
| 					let result; | ||||
| 					// if(messages.length ===0) return; | ||||
| 					 | ||||
| 					try{ | ||||
| 						result = await aiChat.chat(JSON.stringify({ | ||||
| 							messages, currentTime:Date.now()+1} | ||||
| 						)); | ||||
| 					}catch(error){ | ||||
| 						console.log('error AI API', error, result); | ||||
| 						messages = []; | ||||
| 						return ; | ||||
| 					} | ||||
|  | ||||
| 					try{ | ||||
| 						messages = ['']; | ||||
| 						if(!result.response.text()) return; | ||||
|  | ||||
| 						for(let message of JSON.parse(result.response.text())){ | ||||
| 							console.log('toSay', message.delay, message.text); | ||||
| 							if(message.text === '___') return; | ||||
| 							setTimeout(async (message)=>{ | ||||
| 								await bot.sayAiSafe(message.text); | ||||
| 							}, message.delay*1000, message); | ||||
| 						} | ||||
| 					}catch(error){ | ||||
| 						console.log('Error in AI message loop', error, result); | ||||
| 						if(result || result.response || result.response.text()){ | ||||
| 							console.log(result.response.text()) | ||||
| 						} | ||||
| 					} | ||||
| 				}, conf.ai.interval*1000); | ||||
| 			} | ||||
|  | ||||
| 		}catch(error){ | ||||
| 			console.log('error in onReady', error); | ||||
| 	if(conf.mc.bots[name].plugins){ | ||||
| 		for(let pluginName in conf.mc.bots[name].plugins){ | ||||
| 			bot.pluginLoad(pluginName, conf.mc.bots[name].plugins[pluginName]); | ||||
| 		} | ||||
| 	}); | ||||
|  | ||||
| 	bot.on('error', console.log); | ||||
|  | ||||
| 	// bot.on('message', function(message, type){ | ||||
| 	// 	console.log(`${type}: ${message.toString()}`) | ||||
| 	// }); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| (async ()=>{try{ | ||||
|  | ||||
							
								
								
									
										60
									
								
								nodejs/controller/swing.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								nodejs/controller/swing.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep} = require('../utils'); | ||||
|  | ||||
| class Swing{ | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 		this.target = args.target; | ||||
| 		this.interval = args.interval; | ||||
| 		this.intervalStop; | ||||
| 		this.isDangerous = true; | ||||
| 		this.isAction = true; | ||||
| 	} | ||||
|  | ||||
| 	async init(){ | ||||
| 		this.onReadyListen = this.bot.on('onReady', async ()=>{ | ||||
| 			console.log('Swing.init onReady called'); | ||||
| 			try{ | ||||
| 				this.block = this.bot.findBlockBySign('guardian\nattack spot'); | ||||
| 				await this.goToSpot(); | ||||
| 				await this.swing(); | ||||
| 			}catch(error){ | ||||
| 				console.error('Error in Swing.init:', error) | ||||
| 			} | ||||
| 		}); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	unload(){ | ||||
| 		clearInterval(this.intervalStop); | ||||
| 		this.intervalStop = null; | ||||
| 		this.onReadyListen(); | ||||
|  | ||||
| 		return true; | ||||
| 	} | ||||
|  | ||||
| 	async goToSpot(){ | ||||
| 		await this.bot.goTo({ | ||||
| 			where: this.block, | ||||
| 			range: 3, | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	async swing(){ | ||||
| 		this.intervalStop = setInterval(async ()=>{ | ||||
| 			try{ | ||||
| 				// console.log('attacking'); | ||||
| 				await this.bot.bot.attack( | ||||
| 					this.bot.bot.nearestEntity( | ||||
| 						entity => entity.name.toLowerCase() === 'guardian' | ||||
| 					) | ||||
| 				); | ||||
| 			}catch(error){} | ||||
| 		}, 1010); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = Swing; | ||||
							
								
								
									
										41
									
								
								nodejs/controller/tp.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								nodejs/controller/tp.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| 'use strict'; | ||||
|  | ||||
| const conf = require('../conf'); | ||||
| const {sleep} = require('../utils'); | ||||
|  | ||||
| class Tp{ | ||||
| 	constructor(args){ | ||||
| 		this.bot = args.bot; | ||||
| 	} | ||||
|  | ||||
| 	async init(){ | ||||
| 		for(let pluginName in this.bot.plunginsLoaded){	 | ||||
| 			if(this.bot.plunginsLoaded[pluginName].isDangerous){		 | ||||
| 				this.bot.pluginUnload(pluginName); | ||||
| 				this.pluginToContinue = pluginName; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		await this.bot.goTo({ | ||||
| 			where: this.bot.findBlockBySign('bot TP spot'), | ||||
| 			range: 0, | ||||
| 		}); | ||||
|  | ||||
| 		this.cleatTimeout = setTimeout(()=>{ | ||||
| 			this.bot.pluginUnload(this.constructor.name) | ||||
| 		}, 60000); | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	unload(){ | ||||
| 		if(this.cleatTimeout){ | ||||
| 			clearTimeout(this.cleatTimeout); | ||||
| 			this.cleatTimeout = undefined; | ||||
| 		} | ||||
|  | ||||
| 		if(this.pluginToContinue) this.bot.pluginLoad(this.pluginToContinue); | ||||
| 		return true; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| module.exports = Tp; | ||||
		Reference in New Issue
	
	Block a user