Skip to content

Commit 63627d1

Browse files
committed
NEW! refactor code to ALLOW look for chat history and inventory EVEN AFTER being disconnected!
1 parent d076572 commit 63627d1

File tree

7 files changed

+66
-31
lines changed

7 files changed

+66
-31
lines changed

src/controls.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,12 +463,17 @@ const customCommandsHandler = ({ command }) => {
463463
}
464464
contro.on('trigger', customCommandsHandler)
465465

466+
const isCommandAvailableAfterDisconnect = (command: Command) => {
467+
if (!miscUiState.disconnectedCleanup?.wasConnected) return false
468+
return command === 'general.chat' || command === 'general.inventory'
469+
}
470+
466471
contro.on('trigger', ({ command }) => {
467472
if (isCommandDisabled(command)) return
468473

469474
const willContinue = !isGameActive(true)
470475
alwaysPressedHandledCommand(command)
471-
if (willContinue) return
476+
if (willContinue && !isCommandAvailableAfterDisconnect(command)) return
472477

473478
const secondActionCommand = secondActionCommands[command]
474479
if (secondActionCommand) {

src/globalState.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,17 @@ export const miscUiState = proxy({
133133
appConfig: null as AppConfig | null,
134134
displaySearchInput: false,
135135
displayFullmap: false,
136-
fullscreen: false
136+
fullscreen: false,
137+
disconnectedCleanup: null as { callback: () => void, date: number, wasConnected: boolean } | null
137138
})
138139

140+
export const maybeCleanupAfterDisconnect = () => {
141+
if (miscUiState.disconnectedCleanup) {
142+
miscUiState.disconnectedCleanup.callback()
143+
miscUiState.disconnectedCleanup = null
144+
}
145+
}
146+
139147
window.miscUiState = miscUiState
140148

141149
export const isGameActive = (foregroundCheck: boolean) => {

src/index.ts

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import {
5050
miscUiState,
5151
showModal,
5252
gameAdditionalState,
53+
maybeCleanupAfterDisconnect,
5354
} from './globalState'
5455

5556
import { parseServerAddress } from './parseServerAddress'
@@ -168,6 +169,8 @@ export async function connect (connectOptions: ConnectOptions) {
168169
})
169170
}
170171

172+
maybeCleanupAfterDisconnect()
173+
171174
appStatusState.showReconnect = false
172175
loadingTimerState.loading = true
173176
loadingTimerState.start = Date.now()
@@ -212,12 +215,13 @@ export async function connect (connectOptions: ConnectOptions) {
212215

213216
let ended = false
214217
let bot!: typeof __type_bot
218+
let hadWorldLoaded = false
215219
let hadConnected = false
216-
const destroyAll = (wasKicked = false) => {
220+
const handleSessionEnd = (wasKicked = false) => {
217221
if (ended) return
218222
loadingTimerState.loading = false
219223
const { alwaysReconnect } = appQueryParams
220-
if ((!wasKicked && miscUiState.appConfig?.allowAutoConnect && appQueryParams.autoConnect && hadConnected) || (alwaysReconnect)) {
224+
if ((!wasKicked && miscUiState.appConfig?.allowAutoConnect && appQueryParams.autoConnect && hadWorldLoaded) || (alwaysReconnect)) {
221225
if (alwaysReconnect === 'quick' || alwaysReconnect === 'fast') {
222226
quickDevReconnect()
223227
} else {
@@ -227,26 +231,33 @@ export async function connect (connectOptions: ConnectOptions) {
227231
errorAbortController.abort()
228232
ended = true
229233
progress.end()
230-
// dont reset viewer so we can still do debugging
231-
localServer = window.localServer = window.server = undefined
232-
gameAdditionalState.viewerConnection = false
233-
234-
if (bot) {
235-
bot.end()
236-
// ensure mineflayer plugins receive this event for cleanup
237-
bot.emit('end', '')
238-
bot.removeAllListeners()
239-
bot._client.removeAllListeners()
240-
bot._client = {
241-
//@ts-expect-error
242-
write (packetName) {
243-
console.warn('Tried to write packet', packetName, 'after bot was destroyed')
234+
bot.end()
235+
// ensure mineflayer plugins receive this event for cleanup
236+
bot.emit('end', '')
237+
238+
miscUiState.disconnectedCleanup = {
239+
callback () {
240+
appViewer.resetBackend(true)
241+
localServer = window.localServer = window.server = undefined
242+
gameAdditionalState.viewerConnection = false
243+
244+
if (bot) {
245+
bot.removeAllListeners()
246+
bot._client.removeAllListeners()
247+
bot._client = {
248+
//@ts-expect-error
249+
write (packetName) {
250+
console.warn('Tried to write packet', packetName, 'after bot was destroyed')
251+
}
252+
}
253+
//@ts-expect-error
254+
window.bot = bot = undefined
244255
}
245-
}
246-
//@ts-expect-error
247-
window.bot = bot = undefined
256+
cleanFs()
257+
},
258+
date: Date.now(),
259+
wasConnected: hadConnected
248260
}
249-
cleanFs()
250261
}
251262
const cleanFs = () => {
252263
if (singleplayer && !fsState.inMemorySave) {
@@ -277,7 +288,7 @@ export async function connect (connectOptions: ConnectOptions) {
277288
setLoadingScreenStatus(`Error encountered. ${err}`, true)
278289
appStatusState.showReconnect = true
279290
onPossibleErrorDisconnect()
280-
destroyAll()
291+
handleSessionEnd()
281292
}
282293

283294
// todo(hard): remove it!
@@ -678,7 +689,7 @@ export async function connect (connectOptions: ConnectOptions) {
678689
}
679690
setLoadingScreenStatus(`The Minecraft server kicked you. Kick reason: ${kickReasonString}`, true, undefined, undefined, kickReasonFormatted)
680691
appStatusState.showReconnect = true
681-
destroyAll(true)
692+
handleSessionEnd(true)
682693
})
683694

684695
const packetBeforePlay = (_, __, ___, fullBuffer) => {
@@ -705,13 +716,14 @@ export async function connect (connectOptions: ConnectOptions) {
705716
setLoadingScreenStatus(`You have been disconnected from the server. End reason:\n${endReason}`, true)
706717
appStatusState.showReconnect = true
707718
onPossibleErrorDisconnect()
708-
destroyAll()
719+
handleSessionEnd()
709720
if (isCypress()) throw new Error(`disconnected: ${endReason}`)
710721
})
711722

712723
onBotCreate()
713724

714725
bot.once('login', () => {
726+
hadConnected = true
715727
errorAbortController.abort()
716728
loadingTimerState.networkOnlyStart = 0
717729
progress.setMessage('Loading world')
@@ -871,7 +883,7 @@ export async function connect (connectOptions: ConnectOptions) {
871883
} catch (err) {
872884
handleError(err)
873885
}
874-
hadConnected = true
886+
hadWorldLoaded = true
875887
}
876888
// don't use spawn event, player can be dead
877889
bot.once(spawnEarlier ? 'forcedMove' : 'health', displayWorld)

src/inventoryWindows.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ const upWindowItemsLocal = () => {
408408
let skipClosePacketSending = false
409409
const openWindow = (type: string | undefined, title: string | any = undefined) => {
410410
// if (activeModalStack.some(x => x.reactType?.includes?.('player_win:'))) {
411-
if (activeModalStack.length) { // game is not in foreground, don't close current modal
411+
if (activeModalStack.length && !miscUiState.disconnectedCleanup) { // game is not in foreground, don't close current modal
412412
if (type) {
413413
skipClosePacketSending = true
414414
hideCurrentModal()

src/react/AppStatusProvider.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { proxy, useSnapshot } from 'valtio'
22
import { useEffect, useRef, useState } from 'react'
3-
import { activeModalStack, activeModalStacks, hideModal, insertActiveModalStack, miscUiState } from '../globalState'
3+
import { activeModalStack, activeModalStacks, hideModal, insertActiveModalStack, maybeCleanupAfterDisconnect, miscUiState } from '../globalState'
44
import { guessProblem } from '../errorLoadingScreenHelpers'
55
import type { ConnectOptions } from '../connect'
66
import { downloadPacketsReplay, packetsRecordingState, replayLogger } from '../packetsReplay/packetsReplayLegacy'
@@ -153,6 +153,8 @@ export default () => {
153153
let backAction = undefined as (() => void) | undefined
154154
if (maybeRecoverable && (!lockConnect || !wasDisconnected)) {
155155
backAction = () => {
156+
maybeCleanupAfterDisconnect()
157+
156158
if (!wasDisconnected) {
157159
hideModal(undefined, undefined, { force: true })
158160
return

src/react/ChatProvider.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ export default () => {
1717
const isChatActive = useIsModalActive('chat')
1818
const lastMessageId = useRef(0)
1919
const lastPingTime = useRef(0)
20-
const usingTouch = useSnapshot(miscUiState).currentTouch
20+
const {
21+
currentTouch: usingTouch,
22+
disconnectedCleanup
23+
} = useSnapshot(miscUiState)
2124
const {
2225
chatSelect,
2326
messagesLimit,
@@ -61,6 +64,8 @@ export default () => {
6164
})
6265
}, [])
6366

67+
const disabledReason = disconnectedCleanup ? 'You have been disconnected from the server on ' + new Date(disconnectedCleanup.date).toLocaleString() : undefined
68+
6469
return <Chat
6570
chatVanillaRestrictions={chatVanillaRestrictions}
6671
debugChatScroll={debugChatScroll}
@@ -70,6 +75,7 @@ export default () => {
7075
messages={messages}
7176
opened={isChatActive}
7277
placeholder={forwardChat || !viewerConnection ? undefined : 'Chat forwarding is not enabled in the plugin settings'}
78+
inputDisabled={disabledReason}
7379
currentPlayerName={chatPingExtension ? bot.username : undefined}
7480
spellCheckEnabled={chatSpellCheckEnabled}
7581
onSpellCheckEnabledChange={(enabled) => {

src/reactUi.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,15 +141,17 @@ const InGameComponent = ({ children }) => {
141141
let adapter: DrawerAdapterImpl
142142

143143
const InGameUi = () => {
144-
const { gameLoaded, showUI: showUIRaw } = useSnapshot(miscUiState)
144+
const { gameLoaded, showUI: showUIRaw, disconnectedCleanup } = useSnapshot(miscUiState)
145145
const { disabledUiParts, displayBossBars, showMinimap } = useSnapshot(options)
146146
const modalsSnapshot = useSnapshot(activeModalStack)
147147
const hasModals = modalsSnapshot.length > 0
148148
const showUI = showUIRaw || hasModals
149149
const displayFullmap = modalsSnapshot.some(modal => modal.reactType === 'full-map') || true
150150
// bot can't be used here
151151

152-
if (!gameLoaded || !bot || disabledUiParts.includes('*')) return
152+
const gameWasLoaded = gameLoaded || disconnectedCleanup?.wasConnected
153+
154+
if (!gameWasLoaded || !bot || disabledUiParts.includes('*')) return
153155

154156
if (!adapter) adapter = new DrawerAdapterImpl(bot.entity.position)
155157

0 commit comments

Comments
 (0)