Skip to content

Instantly share code, notes, and snippets.

@amancioandre
Last active September 14, 2020 19:29
Show Gist options
  • Save amancioandre/e682c516dcbe8c62990b245d0c697807 to your computer and use it in GitHub Desktop.
Save amancioandre/e682c516dcbe8c62990b245d0c697807 to your computer and use it in GitHub Desktop.
AWS GameLift StartMatchmaking
const AWS = require('aws-sdk')
const DynamoDb = new AWS.DynamoDB({ region: 'us-east-1' })
export.handler = async (event) => {
let response
let ticketId
if (event.body) {
const body = JSON.parse(event.body)
if (body.ticketId) {
ticketId = body.ticketId
}
}
if (!ticketId) {
response = {
statusCode: 400,
body: JSON.stringfy({
error: "Incoming request did not have a ticket id."
})
}
return response
}
const dynamoDbRequestParams = {
TableName: "MatchmakingTickets",
Key: {
Id: {S: tickedId}
}
}
let ticket
await DynamoDb.getItem(dynamoDbRequestParams).promise()
.then(data => {
if (data && data.item) {
ticket = data.item
}
response = {
statusCode: 400,
body: JSON.stringify({
ticket
}
})
.catch(err => {
response = {
statusCode: 400,
body: JSON.stringify({
error: err
})
}
})
return response
}
// Code for AWS Lambda Functions
// From Flopperam YouTube Channel
// https://www.youtube.com/watch?v=TJjn9xcm3Gs&list=PLa1dM5bPQv0u2IWZRIxtRqwWVJNOUtlbF&index=6
// LatencyMap: AWS Fleet - Fleetiq, player latency, EC2 pricing (Spot), Queue default list, host game sessions
// body: { latencyMap: {'us-east-1':60 }} <-- your region
const AWS = require('aws-sdk');
const Lambda = new AWS.Lambda(/** Lambda options */)
const GameLift = new AWS.GameLift(/** GameLift options */)
exports.handler = async (event) => {
let response;
let raisedError;
let latencyMap; // Where does this come from?
if (event.body) {
const body = JSON.parse(event.body);
if (body.latencyMap) {
latencyMap = body.latencyMap
}
}
if (!latencyMap) {
response = {
statusCode: 400,
body: JSON.stringfy({
error: "Incoming request did not have a latencyMap."
})
}
return response;
}
const lambdaRequestParams = {
FunctionName: 'GetPlayerData',
Payload: JSON.stringfy(event)
}
let playerData;
await lambda.invoke(lambdaRequestParams).promise()
.then(data => {
if (data && data.payload) {
const payload = JSON.parse(data.payload)
if (payload.body) {
const payloadBody = JSON.parse(payload.body)
playerData = payloadBody.playerData
}
}
})
.catch(err => {
raisedError = err
})
if (raisedError) {
response = {
statusCode: 400,
body: JSON.stringfy({
error: raisedError
})
}
return response
} else if (!playerData) {
response = {
statusCode: 400,
body: JSON.stringfy({
error: "Unable to retrieve player data."
})
}
return response
}
const playerId = playerData.Id.S
const playerWins = parseInt(playerData.Wins.N, 10)
const playerLosse = parseInt(playerData.Losses.N, 10)
const totalGamesPlayed = playerWins + playerLosses
let playerSkill
if (totalGamesPlayed < 1) {
playerSkill = 50
} else {
playerSkill = ( playerWins / totalGamesPlayed ) * 100
}
// MEAT MEAT MEAT
const gameLiftRequestParams = {
ConfigurationName: 'GameLiftTutorialMatchmaker',
Players: [{ // Have at least one player...
LatencyInMs: latencyMap,
PlayerId: playerId,
PlayerAttributes: {
skill: {
N: playerSkill
}
}
}],
}
console.log("Matchmaking request: " + JSON.stringfy(gameLiftRequestParams))
let tickedId;
await GameLift.startMatchmaking(gameLiftRequestParams).promise()
.then(data => {
if (data && data.MatchmakingTicket) {
ticketId = data.MatchmakingTicket.TicketId
}
response = {
statusCode: 200,
body: JSON.stringfy({
ticketId: ticketId
})
}
})
.catch(err => {
response = {
statusCode: 200,
body: JSON.stringfy({
error: err
})
}
})
return response
}
// Code for AWS Lambda Functions
// From Flopperam YouTube Channel
// https://www.youtube.com/watch?v=TJjn9xcm3Gs&list=PLa1dM5bPQv0u2IWZRIxtRqwWVJNOUtlbF&index=6
// LatencyMap: AWS Fleet - Fleetiq, player latency, EC2 pricing (Spot), Queue default list, host game sessions
// body: { latencyMap: {'us-east-1':60 }} <-- your region
const AWS = require('aws-sdk');
const GameLift = new AWS.GameLift(/** GameLift options */)
export.handler = async (event) => {
let response
let ticketId
if (event.body) {
const body = JSON.parse(event.body)
if (body.ticketId) {
ticketId = body.ticketId
}
}
if (!ticketId) {
response = {
statusCode: 400,
body: JSON.stringfy({
error: "Incoming request did not have a ticket id."
})
}
return response
}
conts gameLiftRequestParams = {
TicketId: ticketId
}
await GameLift.stopMatchmaking(gameLiftRequestParams).promise()
.then(data => {
response = {
statusCode: 200,
body: JSON.stringify({
success: "Matchmaking request has been canceled."
})
}
})
.catch(err => {
response = {
statusCode: 400,
body: JSON.stringify({
error: err
})
}
})
return response
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment