UNPKG

node-thealtening

Version:

An unofficial node wrapper for thealtening's API

102 lines (93 loc) 2.5 kB
const axios = require('axios') const crypto = require('crypto') let Client = {} /** * Two's Compliment * All credit to andrewrk * https://gist.github.com/andrewrk/4425843 */ function performTwosCompliment(buffer) { var carry = true; var i, newByte, value; for (i = buffer.length - 1; i >= 0; --i) { value = buffer.readUInt8(i); newByte = ~value & 0xff; if (carry) { carry = newByte === 0xff; buffer.writeUInt8(newByte + 1, i); } else { buffer.writeUInt8(newByte, i); } } } /** * Calculate hash thing * All credit to andrewrk * https://gist.github.com/andrewrk/4425843 */ Client.mcHexDigest = function(str) { var hash = new Buffer(crypto.createHash('sha1').update(str).digest(), 'binary'); // check for negative hashes var negative = hash.readInt8(0) < 0; if (negative) performTwosCompliment(hash); var digest = hash.toString('hex'); // trim leading zeroes digest = digest.replace(/^0+/g, ''); if (negative) digest = '-' + digest; return digest; } /** * Redeem an alt token */ Client.redeem = async function(options, cb) { let response = await axios({ method: "POST", url: options.uri || 'http://authserver.thealtening.com/authenticate', data: { agent: { name: "Minecraft", version: 1 }, username: options.token, password: "yeet_who_needs_passwords", requestUser: true } }) if (Math.trunc(response.status/100) == 2){ return { success: true, accessToken: response.data.accessToken, uuid: response.data.user.id, user: response.data.user }; } return { success: false }; } /** * Join a server using a thealtening session */ Client.join = async function(options, cb) { let serverhash = null; if(options.serverid && options.sharedsecret && options.serverkey) { serverhash = this.mcHexDigest(crypto.createHash('sha1') .update(options.serverid) .update(options.sharedsecret) .update(options.serverkey) .digest()) } let response = await axios({ method: "POST", url: options.uri || 'http://sessionserver.thealtening.com/session/minecraft/join', data: { accessToken: options.accessToken, uuid: options.uuid, serverId: options.serverhash || serverhash } }) return { success: Math.trunc(response.status/100) == 2 }; } module.exports = Client