heavily WIP

This commit is contained in:
U9G 2022-12-15 12:39:19 -05:00
parent 6b07c3c613
commit d27da693aa
6 changed files with 131 additions and 18 deletions

View file

@ -17,7 +17,8 @@ const client = mc.createClient({
host, host,
port, port,
username, username,
auth: username === 'offline' ? 'offline' : 'microsoft' auth: username === 'offline' ? 'offline' : 'microsoft',
version: '1.19.2'
}) })
// Boilerplate // Boilerplate

View file

@ -1,8 +1,12 @@
const states = require('../states') const states = require('../states')
const CHAT_PREVIEW_MODES = require('./chatPreviewModes')
module.exports = (client, options) => { module.exports = (client, options) => {
const mcData = require('minecraft-data')(client.version) const mcData = require('minecraft-data')(client.version)
const players = {} // 1.19+ const players = {} // 1.19+
client.previewId = 0
client.lastPreviewTime = 0
client.msgAwaitingChatPreview = null
function onChat (packet, isMessageFromServer = false) { function onChat (packet, isMessageFromServer = false) {
let message = packet.message ?? packet.unsignedChatContent ?? packet.signedChatContent let message = packet.message ?? packet.unsignedChatContent ?? packet.signedChatContent
@ -27,23 +31,99 @@ module.exports = (client, options) => {
} }
}) })
const EMPTY_BUFFER = Buffer.from([])
client.on('state', function (newState) { client.on('state', function (newState) {
if (newState === states.PLAY) { if (newState === states.PLAY) {
client.chat = (message) => { client.chat = message => sendChatMessage(mcData, client, message)
if (mcData.supportFeature('signedChat')) {
const timestamp = BigInt(Date.now())
client.write('chat_message', {
message,
timestamp,
salt: 0,
signature: client.profileKeys != null ? EMPTY_BUFFER : client.signMessage(message, timestamp)
})
} else {
client.write('chat', { message })
}
}
} }
}) })
} }
const EMPTY_BUFFER = Buffer.from([])
async function sendChatMessage (mcData, client, message) {
if (mcData.supportFeature('signedChat')) {
const timestamp = BigInt(Date.now())
if (client.chatPreviewMode === CHAT_PREVIEW_MODES.OFF) {
console.log("server doesn't preview chat")
clearPreview(client)
} else {
if (message.startsWith('/')) {
// TODO: Implement
throw new Error('commands are unimplemented')
} else {
const normalizedMsg = trimAndRemoveRepeatedSpaces(message)
if (normalizedMsg.length !== 0 && client.lastPreviewedMsg !== normalizedMsg) {
client.lastPreviewedMsg = normalizedMsg
await requestChatPreview(client, message)
} else {
clearPreview(client)
}
// await preview reply
}
}
return
client.write('chat_message', {
message,
timestamp,
salt: 0,
signature: client.profileKeys != null ? EMPTY_BUFFER : client.signMessage(message, timestamp)
})
} else {
client.write('chat', { message })
}
}
const { once } = require('events')
async function requestChatPreview (client, msg) {
if (maybeTryPreviewMessage(client, msg)) {
console.log('did request')
client.msgAwaitingChatPreview = msg
const [data] = await once(client, 'chat_preview')
console.log('requested preview')
console.log(data)
} else {
console.log('didnt')
}
}
function randomIntFromInterval (min, max) { // min and max included
return Math.floor(Math.random() * (max - min + 1) + min)
}
// returns whether we previewed the message
function maybeTryPreviewMessage (client, msg) {
if (client.msgAwaitingChatPreview === msg) {
return true
}
const nowMs = Date.now()
if (nowMs >= client.lastPreviewTime + 100 &&
(client.msgAwaitingChatPreview === null || nowMs >= client.lastPreviewTime + 1000)) {
client.lastPreviewTime = nowMs
client.previewId += randomIntFromInterval(1, 100)
console.log('sent request:', {
query: client.previewId,
message: msg
})
client.write('chat_preview', {
query: client.previewId,
message: msg
})
return true
}
return false
}
function trimAndRemoveRepeatedSpaces (str) {
return str.trim().replace(/\s+/g, ' ')
}
function clearPreview (client) {
client.lastPreviewedMsg = null
client.msgAwaitingChatPreview = null
client.lastPreviewResponse = null
// client.currentPreviewRequest = null
client.lastPreviewTime = 0
}

View file

@ -0,0 +1,5 @@
module.exports = {
OFF: 0,
LIVE: 1,
CONFIRM: 2
}

View file

@ -0,0 +1,24 @@
const CHAT_PREVIEW_MODES = require('./chatPreviewModes')
const ping = require('../ping')
module.exports = (client, options) => {
options.chatPreviewMode ??= CHAT_PREVIEW_MODES.LIVE // default in minecraft
const mcData = require('minecraft-data')(client.version)
client.useChatPreview = false
client.chatPreviewMode = CHAT_PREVIEW_MODES.OFF
// autoversion ping called too late
ping(options).then((reponse) => {
if (mcData.version['==']('1.19.2') && reponse.previewsChat && client.chatPreviewSetting !== CHAT_PREVIEW_MODES.OFF) {
console.log('enabling chat preview')
client.useChatPreview = true // default state before receiving packet
client.chatPreviewMode = options.chatPreviewMode
}
}).catch(() => { })
client.on('should_display_chat_preview', ({ should_display_chat_preview: shouldDisplayChatPreview }) => {
client.useChatPreview = shouldDisplayChatPreview
client.chatPreviewMode = client.useChatPreview ? options.chatPreviewMode : CHAT_PREVIEW_MODES.OFF
})
}

View file

@ -30,9 +30,10 @@ module.exports = function (client, options) {
? { ? {
timestamp: BigInt(client.profileKeys.expiresOn.getTime()), // should probably be called "expireTime" timestamp: BigInt(client.profileKeys.expiresOn.getTime()), // should probably be called "expireTime"
publicKey: client.profileKeys.publicDER, publicKey: client.profileKeys.publicDER,
signature: client.profileKeys.signature signature: client.profileKeys.signatureV2 ?? client.profileKeys.signature
} }
: null : null,
uuid: client.uuid
}) })
} }
} }

View file

@ -15,6 +15,7 @@ const autoVersion = require('./client/autoVersion')
const pluginChannels = require('./client/pluginChannels') const pluginChannels = require('./client/pluginChannels')
const versionChecking = require('./client/versionChecking') const versionChecking = require('./client/versionChecking')
const chat = require('./client/chat') const chat = require('./client/chat')
const chat_activity = require('./client/chat_activity_bring_to_mineflayer')
module.exports = createClient module.exports = createClient
@ -62,6 +63,7 @@ function createClient (options) {
pluginChannels(client, options) pluginChannels(client, options)
versionChecking(client, options) versionChecking(client, options)
chat(client, options) chat(client, options)
chat_activity(client, options)
return client return client
} }