LookAtMySuitBot/js/node_modules/mineflayer/examples/python/chatterbox.py

303 lines
8.3 KiB
Python

# ==========================================================================
# This example demonstrates how easy it is to create a bot
# that sends chat messages whenever something interesting happens
# on the server you are connected to.
#
# Below you can find a wide range of different events you can watch
# but remember to check out the API documentation to find even more!
#
# Some events may be commented out because they are very frequent and
# may flood the chat, feel free to check them out for other purposes though.
#
# This bot also replies to some specific chat messages so you can ask him
# a few informations while you are in game.
# ===========================================================================
import sys, re
from javascript import require, On, Once, console
mineflayer = require("mineflayer", "latest")
Vec3 = require("vec3").Vec3
print(sys.argv)
if len(sys.argv) < 3 or len(sys.argv) > 6:
print("Usage : node chatterbot.js <host> <port> [<name>]")
exit(1)
host = sys.argv[1]
port = sys.argv[2]
username = sys.argv[3] if len(sys.argv) > 3 else "boat"
bot = mineflayer.createBot({
"host": host,
"port": port,
"username": username,
"port": port
})
Item = require("prismarine-item")(bot.registry)
@On(bot, "chat")
def handle(this, username, message, *args):
if username == bot.username:
return
if message.startswith("can see"):
# Extract x, y and z
# e.g. "can see 327 60 -120" or "can see 327, -23, -120"
try:
x, y, z = map(lambda v: int(v), message.split("see")[1].replace(",", " ").split())
except Exception:
bot.chat("Bad syntax")
elif message.startswith("pos"):
say_position(username)
elif message.startswith("wearing"):
say_equipment(username)
elif message.startswith("block"):
say_block_under()
elif message.startswith("spawn"):
say_spawn()
elif message.startswith("quit"):
quit_game(username)
else:
bot.chat("That's nice")
def can_see(pos):
block = bot.blockAt(pos)
canSee = bot.canSeeBlock(block)
if canSee:
bot.chat(f"I can see the block of {block.displayName} at {pos}")
else:
bot.chat(f"I can't see the block of {block.displayName} at {pos}")
def say_position(username):
p = bot.entity.position
bot.chat(f"I am at {p.toString()}")
if username in bot.players:
p = bot.players[username].entity.position
bot.chat(f"You are at {p.toString()}")
def say_equipment(username):
eq = bot.players[username].entity.equipment
eqText = []
if eq[0]:
eqText.append(f"holding a {eq[0].displayName}")
if eq[1]:
eqText.append(f"wearing a {eq[1].displayName} on your feet")
if eq[2]:
eqText.append(f"wearing a {eq[2].displayName} on your legs")
if eq[3]:
eqText.append(f"wearing a {eq[3].displayName} on your torso")
if eq[4]:
eqText.append(f"wearing a {eq[4].displayName} on your head")
if len(eqText):
bot.chat(f"You are {', '.join(eqText)}.")
else:
bot.chat("You are naked!")
def say_spawn():
bot.chat(f"Spawn is at {bot.spawnPoint.toString()}")
def say_block_under():
block = bot.blockAt(bot.players[username].entity.position.offset(0, -1, 0))
bot.chat(f"Block under you is {block.displayName} in the {block.biome.name} biome")
print(block)
def quit_game(username):
bot.quit(f"{username} told me to")
def say_nick():
bot.chat(f"My name is {bot.player.displayName}")
@On(bot, "whisper")
def whisper(this, username, message, rawMessage, *a):
console.log(f"I received a message from {username}: {message}")
bot.whisper(username, "I can tell secrets too.")
@On(bot, "nonSpokenChat")
def nonSpokenChat(this, message):
console.log(f"Non spoken chat: {message}")
@On(bot, "login")
def login(this):
bot.chat("Hi everyone!")
@On(bot, "spawn")
def spawn(this):
bot.chat("I spawned, watch out!")
@On(bot, "spawnReset")
def spawnReset(this, message):
bot.chat("Oh noez! My bed is broken.")
@On(bot, "forcedMove")
def forcedMove(this):
p = bot.entity.position
bot.chat(f"I have been forced to move to {p.toString()}")
@On(bot, "health")
def health(this):
bot.chat(f"I have {bot.health} health and {bot.food} food")
@On(bot, "death")
def death(this):
bot.chat("I died x.x")
@On(bot, "kicked")
def kicked(this, reason, *a):
print("I was kicked", reason, a)
console.log(f"I got kicked for {reason}")
@On(bot, "time")
def time(this):
bot.chat(f"Current time: " + str(bot.time.timeOfDay))
@On(bot, "rain")
def rain(this):
if bot.isRaining:
bot.chat("It started raining")
else:
bot.chat("It stopped raining")
@On(bot, "noteHeard")
def noteHeard(this, block, instrument, pitch):
bot.chat(f"Music for my ears! I just heard a {instrument.name}")
@On(bot, "chestLidMove")
def chestLidMove(this, block, isOpen, *a):
action = "open" if isOpen else "close"
bot.chat(f"Hey, did someone just {action} a chest?")
@On(bot, "pistonMove")
def pistonMove(this, block, isPulling, direction):
action = "pulling" if isPulling else "pushing"
bot.chat(f"A piston is {action} near me, i can hear it.")
@On(bot, "playerJoined")
def playerJoined(this, player):
print("joined", player)
if player["username"] != bot.username:
bot.chat(f"Hello, {player['username']}! Welcome to the server.")
@On(bot, "playerLeft")
def playerLeft(this, player):
if player["username"] == bot.username:
return
bot.chat(f"Bye ${player.username}")
@On(bot, "playerCollect")
def playerCollect(this, collector, collected):
if collector.type == "player" and collected.type == "object":
raw_item = collected.metadata[10]
item = Item.fromNotch(raw_item)
header = ("I'm so jealous. " + collector.username) if (
collector.username != bot.username) else "I "
bot.chat(f"{header} collected {item.count} {item.displayName}")
@On(bot, "entitySpawn")
def entitySpawn(this, entity):
if entity.type == "mob":
p = entity.position
console.log(f"Look out! A {entity.displayName} spawned at {p.toString()}")
elif entity.type == "player":
bot.chat(f"Look who decided to show up: {entity.username}")
elif entity.type == "object":
p = entity.position
console.log(f"There's a {entity.displayName} at {p.toString()}")
elif entity.type == "global":
bot.chat("Ooh lightning!")
elif entity.type == "orb":
bot.chat("Gimme dat exp orb!")
@On(bot, "entityHurt")
def entityHurt(this, entity):
if entity.type == "mob":
bot.chat(f"Haha! The ${entity.displayName} got hurt!")
elif entity.type == "player":
if entity.username in bot.players:
ping = bot.players[entity.username].ping
bot.chat(f"Aww, poor {entity.username} got hurt. Maybe you shouldn't have a ping of {ping}")
@On(bot, "entitySwingArm")
def entitySwingArm(this, entity):
bot.chat(f"{entity.username}, I see that your arm is working fine.")
@On(bot, "entityCrouch")
def entityCrouch(this, entity):
bot.chat(f"${entity.username}: you so sneaky.")
@On(bot, "entityUncrouch")
def entityUncrouch(this, entity):
bot.chat(f"{entity.username}: welcome back from the land of hunchbacks.")
@On(bot, "entitySleep")
def entitySleep(this, entity):
bot.chat(f"Good night, {entity.username}")
@On(bot, "entityWake")
def entityWake(this, entity):
bot.chat(f"Top of the morning, {entity.username}")
@On(bot, "entityEat")
def entityEat(this, entity):
bot.chat(f"{entity.username}: OM NOM NOM NOMONOM. That's what you sound like.")
@On(bot, "entityAttach")
def entityAttach(this, entity, vehicle):
if entity.type == "player" and vehicle.type == "object":
print(f"Sweet, {entity.username} is riding that {vehicle.displayName}")
@On(bot, "entityDetach")
def entityDetach(this, entity, vehicle):
if entity.type == "player" and vehicle.type == "object":
print(f"Lame, {entity.username} stopped riding the {vehicle.displayName}")
@On(bot, "entityEquipmentChange")
def entityEquipmentChange(this, entity):
print("entityEquipmentChange", entity)
@On(bot, "entityEffect")
def entityEffect(this, entity, effect):
print("entityEffect", entity, effect)
@On(bot, "entityEffectEnd")
def entityEffectEnd(this, entity, effect):
print("entityEffectEnd", entity, effect)