43 lines
1.5 KiB
Python
43 lines
1.5 KiB
Python
"""Chat adapter for the Minecraft 26.3 play protocol."""
|
|
import time
|
|
from contextlib import nullcontext
|
|
|
|
from minecraft.networking.modern import (
|
|
ChatCommand, ClientboundPlayerChatPacket, ServerboundChatPacket, SystemChat,
|
|
)
|
|
|
|
|
|
class ModernChatManager:
|
|
def __init__(self, global_state):
|
|
self.g = global_state
|
|
self.handler = None
|
|
self.g.connection.register_packet_listener(
|
|
self.handle_player_chat, ClientboundPlayerChatPacket)
|
|
|
|
def set_handler(self, callback):
|
|
self.handler = callback
|
|
|
|
def handle_player_chat(self, packet):
|
|
sender = str(packet.sender)
|
|
text = '{}: {}'.format(sender, packet.message)
|
|
print('[chat] {}: {}'.format(sender, packet.message), flush=True)
|
|
if self.handler:
|
|
with self.g.get('reload_lock') or nullcontext():
|
|
self.handler(('CHAT', sender, text))
|
|
|
|
def handle_system_chat(self, packet, message):
|
|
if self.handler:
|
|
with self.g.get('reload_lock') or nullcontext():
|
|
self.handler(('SYSTEM', None, message))
|
|
|
|
def send(self, message):
|
|
if not message:
|
|
return
|
|
if message.startswith('/'):
|
|
self.g.connection.write_packet(
|
|
ChatCommand(command=message[1:]), force=True)
|
|
else:
|
|
packet = ServerboundChatPacket(
|
|
message=message, timestamp=int(time.time() * 1000))
|
|
self.g.connection.write_packet(packet, force=True)
|