mineflayer icon indicating copy to clipboard operation
mineflayer copied to clipboard

kicked on whispering (unsigned_chat)

Open Moosbee opened this issue 2 years ago • 10 comments

  • [x] The FAQ doesn't contain a resolution to my issue

Versions

  • mineflayer: ^4.8.1
  • server: paper 1.19.2
  • node: v19.8.1

Detailed description of a problem

while using the default connection options(disableChatSigning not specified) bot.chat("/tell Moosbee Test") will kick the bot from the Server. Bot.whisper(username, message); does exist, but it doesn't work at all, just outputting /tell username message to the general chat regardless if disableChatSigning is true or false The disconnect packet is as follows: { reason: '{"translate":"multiplayer.disconnect.unsigned_chat"}' } { size: 54, name: 'kick_disconnect', state: 'play' } Using bot.chat("Test") does work.

What did you try yet?

/msg is the same problem. But the /help command works. Setting disableChatSigning on start to true will fix the issue, provided the server you are playing on allows unsigned chat.

Did you try any method from the API? Bot.whisper(username, message); does exist, but it doesn't work at all, just outputting /tell username message to the general chat

Did you try any example? Any error from those? I couldn't find a whisper/private conversation example

Your current code

The code does work if disableChatSigning is set to true

  answer(data: chat, message: string) {
    if (data.type == 2) {
      getBot().chat(
        `/tell ${this.getUserByUUID(data.sender)?.username} ${message}`
      );
    } else {
      getBot().chat(message);
    }
  }


Expected behavior

The bot whispering me something, it beeing signed and not getting kicked

Additional context

Setting disableChatSigning on start to true will fix the issue, provided the server you are playing on allows unsigned chat.

Moosbee avatar Mar 25 '23 15:03 Moosbee

I think this is a duplicate of https://github.com/PrismarineJS/mineflayer/issues/2874

lkwilson avatar Jul 29 '23 04:07 lkwilson

@lkwilson @Moosbee Can you check that the above fixes (https://github.com/PrismarineJS/node-minecraft-protocol/pull/1241/commits) indeed fixed this problem? I believe that the latest npm package of minecraft-protocol (1.44.0) has the above changes, but calling mineflayer's bot.whisper() seems to still be kicking with "lost connection: Received chat packet with missing or invalid signature." being returned from a vanilla 1.20.1 server...?

rgmarquez avatar Sep 23 '23 03:09 rgmarquez

Does it work for you on a 1.19.3+ server other than 1.20.1? Also are you whispering a long message or using coloring? And does using .chat(“/whisper …”) work? You can look in node_modules/minecraft-protocol/package.json to verify you’re using 1.44

lkwilson avatar Sep 23 '23 04:09 lkwilson

@lkwilson Let me check for those cases, I would be glad to help out. Messaging is literally:

bot.whisper(masterPlayer, you whispered to me "${message}")

...where 'masterPlayer' is my user name, and 'message' is the string "Hi!".

rgmarquez avatar Sep 23 '23 04:09 rgmarquez

(There are backticks in the above JavaScript, but of course they got converted to formatting)

rgmarquez avatar Sep 23 '23 04:09 rgmarquez

The bot.whisper command now works as expected, but you still have to enable disableChatSigning for the bot to not get kicked. Tested on Paper 1.19.3 and Paper 1.20.1

Moosbee avatar Sep 27 '23 15:09 Moosbee

@Moosbee excellent, that worked, I hadn't realized that I could pass disableChatSigning to mineflayer.createBot(). Tested on Mojang vanilla 1.20.1 and Simpcraft.com (Paper 1.20.1). Verified it works on both without kicking player, thanks!

REVISED: Still not working for me. disableChatSigning: true did solve the "kick" issue when calling bot.whisper(), but I never actually see the whisper coming from the bot. I am whispering to the bot (using /msg in-game) to trigger things, and I only see the autogenerated You whisper to [botname]: [message], and not the whispered reply from the bot. Using console.log() verifies that the the bot's whisper handler is getting called, but bot.whisper() is not generating a msg back to me.

This is my test script:

const path = require('path')

if (process.argv.length != 5) {
  let scriptname = path.basename(process.argv[1]);
  console.log(`Usage : node ${scriptname} <host> <port> [<name>]`)
  process.exit(1)
}

const bot = mineflayer.createBot({
  username: process.argv[4],
  auth: 'microsoft',
  host: process.argv[2],
  port: parseInt(process.argv[3]),
  disableChatSigning: true,
  verbose: true
})

bot.on('whisper', (username, message, rawMessage) => {
    console.log(`I received a message from ${username}: ${message}`)
    bot.whisper(username, 'I can tell secrets too.')
})

rgmarquez avatar Sep 28 '23 07:09 rgmarquez

@rgmarquez try to hardcode the username in bot.whisper, if the username is not exactly right it will fail. Also try using the npm i https://github.com/PrismarineJS/mineflayer to get the newest version of mineflayer.

Moosbee avatar Sep 28 '23 08:09 Moosbee

@Moosbee I finally got a chance to try out your suggestions. As for the npm, just for completeness, this is what I get when doing "npm i https://github.com/PrismarineJS/mineflayer":

npm WARN EBADENGINE Unsupported engine {
npm WARN EBADENGINE   package: '@azure/[email protected]',
npm WARN EBADENGINE   required: { node: '10 || 12 || 14 || 16 || 18' },
npm WARN EBADENGINE   current: { node: 'v20.6.1', npm: '10.2.0' }
npm WARN EBADENGINE }

up to date, audited 111 packages in 3s

9 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

I'm trying this all under MacOS, Node version v20.6.1, npm version 10.2.0.

This is what my package.json looks like:

{
  "name": "getting_started",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "minecraft-data": "^3.45.0",
    "minecraft-protocol": "^1.44.0",
    "mineflayer": "github:PrismarineJS/mineflayer",
    "mineflayer-armor-manager": "^2.0.1",
    "mineflayer-auto-eat": "^3.3.6",
    "mineflayer-pathfinder": "^2.4.5",
    "mineflayer-pvp": "^1.3.2"
  }
}

I did trying to hardcode the bot's whisper statement to "bot.whisper('blammo21', 'I can tell secrets too.')", and verified the spelling of my currently logged-in account was indeed "blammo21". I also re-verified that the bot was being "triggered" to whisper correctly, as the debug console correctly printed the incoming message thusly : "I received a message from blammo21: hi!".

Can you tell me if everyone else seems to have bot.whisper() working fine with disableChatSigning: true? If so, I can narrow differences down on my end. Thanks for all your time looking at this so far.

rgmarquez avatar Oct 04 '23 23:10 rgmarquez

you can try to use getBot().chat('/tell blammo21 Test');

Moosbee avatar Oct 06 '23 19:10 Moosbee