57 lines
2.2 KiB
JavaScript
57 lines
2.2 KiB
JavaScript
const { createHash } = require('crypto')
|
|
const utils = require('./utils')
|
|
const nf = require('node-fetch')
|
|
|
|
const defaultHost = 'https://sessionserver.mojang.com'
|
|
|
|
function loader (moduleOptions) {
|
|
/**
|
|
* Client's Mojang handshake call
|
|
* See http://wiki.vg/Protocol_Encryption#Client
|
|
* @param {String} accessToken Client's accessToken
|
|
* @param {String} selectedProfile Client's selectedProfile
|
|
* @param {String} serverid ASCII encoding of the server ID
|
|
* @param {String} sharedsecret Server's secret string
|
|
* @param {String} serverkey Server's encoded public key
|
|
* @param {Function} cb (is okay, data returned by server)
|
|
* @async
|
|
*/
|
|
async function join (accessToken, selectedProfile, serverid, sharedsecret, serverkey) {
|
|
return await utils.call(
|
|
moduleOptions?.host ??
|
|
defaultHost,
|
|
'session/minecraft/join',
|
|
{
|
|
accessToken,
|
|
selectedProfile,
|
|
serverId: utils.mcHexDigest(createHash('sha1').update(serverid).update(sharedsecret).update(serverkey).digest())
|
|
},
|
|
moduleOptions?.agent
|
|
)
|
|
}
|
|
|
|
/**
|
|
* Server's Mojang handshake call
|
|
* @param {String} username Client's username, case-sensitive
|
|
* @param {String} serverid ASCII encoding of the server ID
|
|
* @param {String} sharedsecret Server's secret string
|
|
* @param {String} serverkey Server's encoded public key
|
|
* @param {Function} cb (is okay, client info)
|
|
* @async
|
|
*/
|
|
async function hasJoined (username, serverid, sharedsecret, serverkey) {
|
|
const host = moduleOptions?.host ?? defaultHost
|
|
const hash = utils.mcHexDigest(createHash('sha1').update(serverid).update(sharedsecret).update(serverkey).digest())
|
|
const data = await nf(`${host}/session/minecraft/hasJoined?username=${encodeURIComponent(username)}&serverId=${hash}`, { agent: moduleOptions?.agent, method: 'GET' })
|
|
const body = JSON.parse(await data.text())
|
|
if (body.id !== undefined) return body
|
|
else throw new Error('Failed to verify username!')
|
|
}
|
|
|
|
return {
|
|
join: utils.callbackify(join, 5),
|
|
hasJoined: utils.callbackify(hasJoined, 4)
|
|
}
|
|
}
|
|
|
|
module.exports = loader
|