Update Cloud Script
Creates a new Cloud Script revision and uploads source code to it. Note that at this time, only one file should be submitted in the revision.
Error codes
This operation may return the following PlayFab errors:
| Error | Code |
|---|---|
| JavascriptException | 1099 |
| ProductDisabledForTitle | 1609 |
| TitleDeleted | 1347 |
POST
/
Admin
/
UpdateCloudScript
Update Cloud Script
curl --request POST \
--url https://{titleId}.playfabapi.com/Admin/UpdateCloudScript \
--header 'Content-Type: application/json' \
--header 'X-SecretKey: <api-key>' \
--data @- <<EOF
{
"Files": [
{
"Filename": "main.js",
"FileContents": "var LevelRewards =\r\n[\r\n\t[\"TestItem1\"],\r\n\t[\"TestItem2\"],\r\n\t[\"TestItem3\"],\r\n\t[\"TestItem1\", \"TestItem2\"],\r\n\t[\"TestItem2\", \"TestItem2\"],\r\n\t[\"TestItem3\", \"TestItem3\"]\r\n]\r\n\r\nhandlers.onLevelComplete = function(args)\r\n{\r\n\tvar levelNum = args.level;\r\n\t\r\n\t// Do some basic input validation\r\n\tif(levelNum < 0 || levelNum >= LevelRewards.length)\r\n\t{\r\n\t\tlog.info(\"Invalid level \"+levelNum+\" completed by \"+currentPlayerId);\r\n\t\treturn {};\r\n\t}\r\n\t\r\n\tvar levelCompleteKey = \"LevelCompleted\"+levelNum;\r\n\t\r\n\t// Get the user's internal data\r\n\tvar playerInternalData = server.GetUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tKeys: [levelCompleteKey]\r\n\t});\r\n\t\r\n\t// Did they already complete this level?\r\n\tif(playerInternalData.Data[levelCompleteKey])\r\n\t{\r\n\t\tlog.info(\"Player \"+currentPlayerId+\" already completed level \"+levelNum);\r\n\t\treturn {};\r\n\t}\r\n\t\r\n\tvar rewards = LevelRewards[levelNum];\r\n\t\r\n\tvar resultItems = null;\r\n\tif(rewards)\r\n\t{\r\n\t\t// Grant reward items to player for completing the level\r\n\t\tvar itemGrantResult = server.GrantItemsToUser(\r\n\t\t{\r\n\t\t\tPlayFabId: currentPlayerId,\r\n\t\t\tAnnotation: \"Given by completing level \"+levelNum,\r\n\t\t\tItemIds: rewards\r\n\t\t});\r\n\t\t\r\n\t\tresultItems = itemGrantResult.ItemGrantResults;\r\n\t}\r\n\t\r\n\t// Mark the level as being completed so they can't get the reward again\r\n\tvar saveData = {};\r\n\tsaveData[levelCompleteKey] = \"true\";\r\n\tserver.UpdateUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tData: saveData\r\n\t});\r\n\r\n\t// Return the results of the item grant so the client can see what they got\r\n\treturn {\r\n\t\trewards: resultItems\r\n\t};\r\n}\r\n\r\nvar monsterRewards =\r\n{\r\n\t\"skrill\" : { \"ChumpCoins\" : 100},\r\n\t\"lumpur\" : { \"ChumpCoins\" : 200}\r\n}\r\n\r\nvar killCoolDown = 60;\r\n\r\nfunction currTimeSeconds()\r\n{\r\n\tvar now = new Date();\r\n\treturn now.getTime() / 1000;\r\n}\r\n\r\nhandlers.monsterKilled = function(args)\r\n{\r\n\tvar monsterType = args.type;\r\n\t\r\n\tvar now = currTimeSeconds();\r\n\t\r\n\t// Get the user's internal data\r\n\tvar playerInternalData = server.GetUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tKeys: [\"lastKill\"]\r\n\t});\r\n\t\r\n\t// Check when the last time they killed a monster was \r\n\tvar lastKill = playerInternalData.Data[\"lastKill\"];\r\n\tif(lastKill)\r\n\t{\r\n\t\t// We have a value, see when it is\r\n\t\tvar lastKillTime = parseInt(lastKill.Value);\r\n\t\tif(now - lastKillTime < killCoolDown)\r\n\t\t{\r\n\t\t\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\r\n\t\t\tlog.info(\"Player \"+currentPlayerId+\" killed \"+monsterType+\" again too quickly!\");\r\n\t\t\treturn {};\r\n\t\t}\r\n\t}\r\n\t\r\n\tvar killReward = monsterRewards[monsterType];\r\n\t\r\n\tif(killReward)\r\n\t{\r\n\t\tfor(var currency in killReward)\r\n\t\t{\r\n\t\t\tvar amount = killReward[currency];\r\n\t\t\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\r\n\t\t}\r\n\t}\r\n\t\r\n\t// Reset the kill timer\r\n\tserver.UpdateUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tData: {\r\n\t\t\t\"lastKill\" : String(now)\r\n\t\t}\r\n\t});\r\n\t\r\n\treturn {\r\n\t\trewards: killReward\r\n\t};\r\n}"
}
]
}
EOFimport requests
url = "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript"
payload = { "Files": [
{
"Filename": "main.js",
"FileContents": "var LevelRewards =
[
[\"TestItem1\"],
[\"TestItem2\"],
[\"TestItem3\"],
[\"TestItem1\", \"TestItem2\"],
[\"TestItem2\", \"TestItem2\"],
[\"TestItem3\", \"TestItem3\"]
]
handlers.onLevelComplete = function(args)
{
var levelNum = args.level;
// Do some basic input validation
if(levelNum < 0 || levelNum >= LevelRewards.length)
{
log.info(\"Invalid level \"+levelNum+\" completed by \"+currentPlayerId);
return {};
}
var levelCompleteKey = \"LevelCompleted\"+levelNum;
// Get the user's internal data
var playerInternalData = server.GetUserInternalData(
{
PlayFabId: currentPlayerId,
Keys: [levelCompleteKey]
});
// Did they already complete this level?
if(playerInternalData.Data[levelCompleteKey])
{
log.info(\"Player \"+currentPlayerId+\" already completed level \"+levelNum);
return {};
}
var rewards = LevelRewards[levelNum];
var resultItems = null;
if(rewards)
{
// Grant reward items to player for completing the level
var itemGrantResult = server.GrantItemsToUser(
{
PlayFabId: currentPlayerId,
Annotation: \"Given by completing level \"+levelNum,
ItemIds: rewards
});
resultItems = itemGrantResult.ItemGrantResults;
}
// Mark the level as being completed so they can't get the reward again
var saveData = {};
saveData[levelCompleteKey] = \"true\";
server.UpdateUserInternalData(
{
PlayFabId: currentPlayerId,
Data: saveData
});
// Return the results of the item grant so the client can see what they got
return {
rewards: resultItems
};
}
var monsterRewards =
{
\"skrill\" : { \"ChumpCoins\" : 100},
\"lumpur\" : { \"ChumpCoins\" : 200}
}
var killCoolDown = 60;
function currTimeSeconds()
{
var now = new Date();
return now.getTime() / 1000;
}
handlers.monsterKilled = function(args)
{
var monsterType = args.type;
var now = currTimeSeconds();
// Get the user's internal data
var playerInternalData = server.GetUserInternalData(
{
PlayFabId: currentPlayerId,
Keys: [\"lastKill\"]
});
// Check when the last time they killed a monster was
var lastKill = playerInternalData.Data[\"lastKill\"];
if(lastKill)
{
// We have a value, see when it is
var lastKillTime = parseInt(lastKill.Value);
if(now - lastKillTime < killCoolDown)
{
// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating
log.info(\"Player \"+currentPlayerId+\" killed \"+monsterType+\" again too quickly!\");
return {};
}
}
var killReward = monsterRewards[monsterType];
if(killReward)
{
for(var currency in killReward)
{
var amount = killReward[currency];
server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });
}
}
// Reset the kill timer
server.UpdateUserInternalData(
{
PlayFabId: currentPlayerId,
Data: {
\"lastKill\" : String(now)
}
});
return {
rewards: killReward
};
}"
}
] }
headers = {
"X-SecretKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-SecretKey': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
Files: [
{
Filename: 'main.js',
FileContents: 'var LevelRewards =\r\n[\r\n ["TestItem1"],\r\n ["TestItem2"],\r\n ["TestItem3"],\r\n ["TestItem1", "TestItem2"],\r\n ["TestItem2", "TestItem2"],\r\n ["TestItem3", "TestItem3"]\r\n]\r\n\r\nhandlers.onLevelComplete = function(args)\r\n{\r\n var levelNum = args.level;\r\n \r\n // Do some basic input validation\r\n if(levelNum < 0 || levelNum >= LevelRewards.length)\r\n {\r\n log.info("Invalid level "+levelNum+" completed by "+currentPlayerId);\r\n return {};\r\n }\r\n \r\n var levelCompleteKey = "LevelCompleted"+levelNum;\r\n \r\n // Get the user\'s internal data\r\n var playerInternalData = server.GetUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Keys: [levelCompleteKey]\r\n });\r\n \r\n // Did they already complete this level?\r\n if(playerInternalData.Data[levelCompleteKey])\r\n {\r\n log.info("Player "+currentPlayerId+" already completed level "+levelNum);\r\n return {};\r\n }\r\n \r\n var rewards = LevelRewards[levelNum];\r\n \r\n var resultItems = null;\r\n if(rewards)\r\n {\r\n // Grant reward items to player for completing the level\r\n var itemGrantResult = server.GrantItemsToUser(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Annotation: "Given by completing level "+levelNum,\r\n ItemIds: rewards\r\n });\r\n \r\n resultItems = itemGrantResult.ItemGrantResults;\r\n }\r\n \r\n // Mark the level as being completed so they can\'t get the reward again\r\n var saveData = {};\r\n saveData[levelCompleteKey] = "true";\r\n server.UpdateUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Data: saveData\r\n });\r\n\r\n // Return the results of the item grant so the client can see what they got\r\n return {\r\n rewards: resultItems\r\n };\r\n}\r\n\r\nvar monsterRewards =\r\n{\r\n "skrill" : { "ChumpCoins" : 100},\r\n "lumpur" : { "ChumpCoins" : 200}\r\n}\r\n\r\nvar killCoolDown = 60;\r\n\r\nfunction currTimeSeconds()\r\n{\r\n var now = new Date();\r\n return now.getTime() / 1000;\r\n}\r\n\r\nhandlers.monsterKilled = function(args)\r\n{\r\n var monsterType = args.type;\r\n \r\n var now = currTimeSeconds();\r\n \r\n // Get the user\'s internal data\r\n var playerInternalData = server.GetUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Keys: ["lastKill"]\r\n });\r\n \r\n // Check when the last time they killed a monster was \r\n var lastKill = playerInternalData.Data["lastKill"];\r\n if(lastKill)\r\n {\r\n // We have a value, see when it is\r\n var lastKillTime = parseInt(lastKill.Value);\r\n if(now - lastKillTime < killCoolDown)\r\n {\r\n // In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\r\n log.info("Player "+currentPlayerId+" killed "+monsterType+" again too quickly!");\r\n return {};\r\n }\r\n }\r\n \r\n var killReward = monsterRewards[monsterType];\r\n \r\n if(killReward)\r\n {\r\n for(var currency in killReward)\r\n {\r\n var amount = killReward[currency];\r\n server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\r\n }\r\n }\r\n \r\n // Reset the kill timer\r\n server.UpdateUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Data: {\r\n "lastKill" : String(now)\r\n }\r\n });\r\n \r\n return {\r\n rewards: killReward\r\n };\r\n}'
}
]
})
};
fetch('https://{titleId}.playfabapi.com/Admin/UpdateCloudScript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'Files' => [
[
'Filename' => 'main.js',
'FileContents' => 'var LevelRewards =
[
\t["TestItem1"],
\t["TestItem2"],
\t["TestItem3"],
\t["TestItem1", "TestItem2"],
\t["TestItem2", "TestItem2"],
\t["TestItem3", "TestItem3"]
]
handlers.onLevelComplete = function(args)
{
\tvar levelNum = args.level;
\t
\t// Do some basic input validation
\tif(levelNum < 0 || levelNum >= LevelRewards.length)
\t{
\t\tlog.info("Invalid level "+levelNum+" completed by "+currentPlayerId);
\t\treturn {};
\t}
\t
\tvar levelCompleteKey = "LevelCompleted"+levelNum;
\t
\t// Get the user\'s internal data
\tvar playerInternalData = server.GetUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tKeys: [levelCompleteKey]
\t});
\t
\t// Did they already complete this level?
\tif(playerInternalData.Data[levelCompleteKey])
\t{
\t\tlog.info("Player "+currentPlayerId+" already completed level "+levelNum);
\t\treturn {};
\t}
\t
\tvar rewards = LevelRewards[levelNum];
\t
\tvar resultItems = null;
\tif(rewards)
\t{
\t\t// Grant reward items to player for completing the level
\t\tvar itemGrantResult = server.GrantItemsToUser(
\t\t{
\t\t\tPlayFabId: currentPlayerId,
\t\t\tAnnotation: "Given by completing level "+levelNum,
\t\t\tItemIds: rewards
\t\t});
\t\t
\t\tresultItems = itemGrantResult.ItemGrantResults;
\t}
\t
\t// Mark the level as being completed so they can\'t get the reward again
\tvar saveData = {};
\tsaveData[levelCompleteKey] = "true";
\tserver.UpdateUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tData: saveData
\t});
\t// Return the results of the item grant so the client can see what they got
\treturn {
\t\trewards: resultItems
\t};
}
var monsterRewards =
{
\t"skrill" : { "ChumpCoins" : 100},
\t"lumpur" : { "ChumpCoins" : 200}
}
var killCoolDown = 60;
function currTimeSeconds()
{
\tvar now = new Date();
\treturn now.getTime() / 1000;
}
handlers.monsterKilled = function(args)
{
\tvar monsterType = args.type;
\t
\tvar now = currTimeSeconds();
\t
\t// Get the user\'s internal data
\tvar playerInternalData = server.GetUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tKeys: ["lastKill"]
\t});
\t
\t// Check when the last time they killed a monster was
\tvar lastKill = playerInternalData.Data["lastKill"];
\tif(lastKill)
\t{
\t\t// We have a value, see when it is
\t\tvar lastKillTime = parseInt(lastKill.Value);
\t\tif(now - lastKillTime < killCoolDown)
\t\t{
\t\t\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating
\t\t\tlog.info("Player "+currentPlayerId+" killed "+monsterType+" again too quickly!");
\t\t\treturn {};
\t\t}
\t}
\t
\tvar killReward = monsterRewards[monsterType];
\t
\tif(killReward)
\t{
\t\tfor(var currency in killReward)
\t\t{
\t\t\tvar amount = killReward[currency];
\t\t\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });
\t\t}
\t}
\t
\t// Reset the kill timer
\tserver.UpdateUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tData: {
\t\t\t"lastKill" : String(now)
\t\t}
\t});
\t
\treturn {
\t\trewards: killReward
\t};
}'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-SecretKey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript"
payload := strings.NewReader("{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-SecretKey", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{titleId}.playfabapi.com/Admin/UpdateCloudScript")
.header("X-SecretKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{titleId}.playfabapi.com/Admin/UpdateCloudScript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-SecretKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"status": "OK",
"data": {
"Version": 1,
"Revision": 5
}
}{
"code": 123,
"errorCode": 123,
"status": "<string>",
"error": "<string>",
"errorMessage": "<string>",
"errorDetails": {}
}Authorizations
This API requires a title secret key, available to title admins, from PlayFab Game Manager.
Body
application/json
List of Cloud Script files to upload to create the new revision. Must have at least one file.
Show child attributes
Show child attributes
Immediately publish the new revision
The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.).
PlayFab user ID of the developer initiating the request.
Last modified on October 1, 2026
Was this page helpful?
⌘I
Update Cloud Script
curl --request POST \
--url https://{titleId}.playfabapi.com/Admin/UpdateCloudScript \
--header 'Content-Type: application/json' \
--header 'X-SecretKey: <api-key>' \
--data @- <<EOF
{
"Files": [
{
"Filename": "main.js",
"FileContents": "var LevelRewards =\r\n[\r\n\t[\"TestItem1\"],\r\n\t[\"TestItem2\"],\r\n\t[\"TestItem3\"],\r\n\t[\"TestItem1\", \"TestItem2\"],\r\n\t[\"TestItem2\", \"TestItem2\"],\r\n\t[\"TestItem3\", \"TestItem3\"]\r\n]\r\n\r\nhandlers.onLevelComplete = function(args)\r\n{\r\n\tvar levelNum = args.level;\r\n\t\r\n\t// Do some basic input validation\r\n\tif(levelNum < 0 || levelNum >= LevelRewards.length)\r\n\t{\r\n\t\tlog.info(\"Invalid level \"+levelNum+\" completed by \"+currentPlayerId);\r\n\t\treturn {};\r\n\t}\r\n\t\r\n\tvar levelCompleteKey = \"LevelCompleted\"+levelNum;\r\n\t\r\n\t// Get the user's internal data\r\n\tvar playerInternalData = server.GetUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tKeys: [levelCompleteKey]\r\n\t});\r\n\t\r\n\t// Did they already complete this level?\r\n\tif(playerInternalData.Data[levelCompleteKey])\r\n\t{\r\n\t\tlog.info(\"Player \"+currentPlayerId+\" already completed level \"+levelNum);\r\n\t\treturn {};\r\n\t}\r\n\t\r\n\tvar rewards = LevelRewards[levelNum];\r\n\t\r\n\tvar resultItems = null;\r\n\tif(rewards)\r\n\t{\r\n\t\t// Grant reward items to player for completing the level\r\n\t\tvar itemGrantResult = server.GrantItemsToUser(\r\n\t\t{\r\n\t\t\tPlayFabId: currentPlayerId,\r\n\t\t\tAnnotation: \"Given by completing level \"+levelNum,\r\n\t\t\tItemIds: rewards\r\n\t\t});\r\n\t\t\r\n\t\tresultItems = itemGrantResult.ItemGrantResults;\r\n\t}\r\n\t\r\n\t// Mark the level as being completed so they can't get the reward again\r\n\tvar saveData = {};\r\n\tsaveData[levelCompleteKey] = \"true\";\r\n\tserver.UpdateUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tData: saveData\r\n\t});\r\n\r\n\t// Return the results of the item grant so the client can see what they got\r\n\treturn {\r\n\t\trewards: resultItems\r\n\t};\r\n}\r\n\r\nvar monsterRewards =\r\n{\r\n\t\"skrill\" : { \"ChumpCoins\" : 100},\r\n\t\"lumpur\" : { \"ChumpCoins\" : 200}\r\n}\r\n\r\nvar killCoolDown = 60;\r\n\r\nfunction currTimeSeconds()\r\n{\r\n\tvar now = new Date();\r\n\treturn now.getTime() / 1000;\r\n}\r\n\r\nhandlers.monsterKilled = function(args)\r\n{\r\n\tvar monsterType = args.type;\r\n\t\r\n\tvar now = currTimeSeconds();\r\n\t\r\n\t// Get the user's internal data\r\n\tvar playerInternalData = server.GetUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tKeys: [\"lastKill\"]\r\n\t});\r\n\t\r\n\t// Check when the last time they killed a monster was \r\n\tvar lastKill = playerInternalData.Data[\"lastKill\"];\r\n\tif(lastKill)\r\n\t{\r\n\t\t// We have a value, see when it is\r\n\t\tvar lastKillTime = parseInt(lastKill.Value);\r\n\t\tif(now - lastKillTime < killCoolDown)\r\n\t\t{\r\n\t\t\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\r\n\t\t\tlog.info(\"Player \"+currentPlayerId+\" killed \"+monsterType+\" again too quickly!\");\r\n\t\t\treturn {};\r\n\t\t}\r\n\t}\r\n\t\r\n\tvar killReward = monsterRewards[monsterType];\r\n\t\r\n\tif(killReward)\r\n\t{\r\n\t\tfor(var currency in killReward)\r\n\t\t{\r\n\t\t\tvar amount = killReward[currency];\r\n\t\t\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\r\n\t\t}\r\n\t}\r\n\t\r\n\t// Reset the kill timer\r\n\tserver.UpdateUserInternalData(\r\n\t{\r\n\t\tPlayFabId: currentPlayerId,\r\n\t\tData: {\r\n\t\t\t\"lastKill\" : String(now)\r\n\t\t}\r\n\t});\r\n\t\r\n\treturn {\r\n\t\trewards: killReward\r\n\t};\r\n}"
}
]
}
EOFimport requests
url = "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript"
payload = { "Files": [
{
"Filename": "main.js",
"FileContents": "var LevelRewards =
[
[\"TestItem1\"],
[\"TestItem2\"],
[\"TestItem3\"],
[\"TestItem1\", \"TestItem2\"],
[\"TestItem2\", \"TestItem2\"],
[\"TestItem3\", \"TestItem3\"]
]
handlers.onLevelComplete = function(args)
{
var levelNum = args.level;
// Do some basic input validation
if(levelNum < 0 || levelNum >= LevelRewards.length)
{
log.info(\"Invalid level \"+levelNum+\" completed by \"+currentPlayerId);
return {};
}
var levelCompleteKey = \"LevelCompleted\"+levelNum;
// Get the user's internal data
var playerInternalData = server.GetUserInternalData(
{
PlayFabId: currentPlayerId,
Keys: [levelCompleteKey]
});
// Did they already complete this level?
if(playerInternalData.Data[levelCompleteKey])
{
log.info(\"Player \"+currentPlayerId+\" already completed level \"+levelNum);
return {};
}
var rewards = LevelRewards[levelNum];
var resultItems = null;
if(rewards)
{
// Grant reward items to player for completing the level
var itemGrantResult = server.GrantItemsToUser(
{
PlayFabId: currentPlayerId,
Annotation: \"Given by completing level \"+levelNum,
ItemIds: rewards
});
resultItems = itemGrantResult.ItemGrantResults;
}
// Mark the level as being completed so they can't get the reward again
var saveData = {};
saveData[levelCompleteKey] = \"true\";
server.UpdateUserInternalData(
{
PlayFabId: currentPlayerId,
Data: saveData
});
// Return the results of the item grant so the client can see what they got
return {
rewards: resultItems
};
}
var monsterRewards =
{
\"skrill\" : { \"ChumpCoins\" : 100},
\"lumpur\" : { \"ChumpCoins\" : 200}
}
var killCoolDown = 60;
function currTimeSeconds()
{
var now = new Date();
return now.getTime() / 1000;
}
handlers.monsterKilled = function(args)
{
var monsterType = args.type;
var now = currTimeSeconds();
// Get the user's internal data
var playerInternalData = server.GetUserInternalData(
{
PlayFabId: currentPlayerId,
Keys: [\"lastKill\"]
});
// Check when the last time they killed a monster was
var lastKill = playerInternalData.Data[\"lastKill\"];
if(lastKill)
{
// We have a value, see when it is
var lastKillTime = parseInt(lastKill.Value);
if(now - lastKillTime < killCoolDown)
{
// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating
log.info(\"Player \"+currentPlayerId+\" killed \"+monsterType+\" again too quickly!\");
return {};
}
}
var killReward = monsterRewards[monsterType];
if(killReward)
{
for(var currency in killReward)
{
var amount = killReward[currency];
server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });
}
}
// Reset the kill timer
server.UpdateUserInternalData(
{
PlayFabId: currentPlayerId,
Data: {
\"lastKill\" : String(now)
}
});
return {
rewards: killReward
};
}"
}
] }
headers = {
"X-SecretKey": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-SecretKey': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
Files: [
{
Filename: 'main.js',
FileContents: 'var LevelRewards =\r\n[\r\n ["TestItem1"],\r\n ["TestItem2"],\r\n ["TestItem3"],\r\n ["TestItem1", "TestItem2"],\r\n ["TestItem2", "TestItem2"],\r\n ["TestItem3", "TestItem3"]\r\n]\r\n\r\nhandlers.onLevelComplete = function(args)\r\n{\r\n var levelNum = args.level;\r\n \r\n // Do some basic input validation\r\n if(levelNum < 0 || levelNum >= LevelRewards.length)\r\n {\r\n log.info("Invalid level "+levelNum+" completed by "+currentPlayerId);\r\n return {};\r\n }\r\n \r\n var levelCompleteKey = "LevelCompleted"+levelNum;\r\n \r\n // Get the user\'s internal data\r\n var playerInternalData = server.GetUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Keys: [levelCompleteKey]\r\n });\r\n \r\n // Did they already complete this level?\r\n if(playerInternalData.Data[levelCompleteKey])\r\n {\r\n log.info("Player "+currentPlayerId+" already completed level "+levelNum);\r\n return {};\r\n }\r\n \r\n var rewards = LevelRewards[levelNum];\r\n \r\n var resultItems = null;\r\n if(rewards)\r\n {\r\n // Grant reward items to player for completing the level\r\n var itemGrantResult = server.GrantItemsToUser(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Annotation: "Given by completing level "+levelNum,\r\n ItemIds: rewards\r\n });\r\n \r\n resultItems = itemGrantResult.ItemGrantResults;\r\n }\r\n \r\n // Mark the level as being completed so they can\'t get the reward again\r\n var saveData = {};\r\n saveData[levelCompleteKey] = "true";\r\n server.UpdateUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Data: saveData\r\n });\r\n\r\n // Return the results of the item grant so the client can see what they got\r\n return {\r\n rewards: resultItems\r\n };\r\n}\r\n\r\nvar monsterRewards =\r\n{\r\n "skrill" : { "ChumpCoins" : 100},\r\n "lumpur" : { "ChumpCoins" : 200}\r\n}\r\n\r\nvar killCoolDown = 60;\r\n\r\nfunction currTimeSeconds()\r\n{\r\n var now = new Date();\r\n return now.getTime() / 1000;\r\n}\r\n\r\nhandlers.monsterKilled = function(args)\r\n{\r\n var monsterType = args.type;\r\n \r\n var now = currTimeSeconds();\r\n \r\n // Get the user\'s internal data\r\n var playerInternalData = server.GetUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Keys: ["lastKill"]\r\n });\r\n \r\n // Check when the last time they killed a monster was \r\n var lastKill = playerInternalData.Data["lastKill"];\r\n if(lastKill)\r\n {\r\n // We have a value, see when it is\r\n var lastKillTime = parseInt(lastKill.Value);\r\n if(now - lastKillTime < killCoolDown)\r\n {\r\n // In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\r\n log.info("Player "+currentPlayerId+" killed "+monsterType+" again too quickly!");\r\n return {};\r\n }\r\n }\r\n \r\n var killReward = monsterRewards[monsterType];\r\n \r\n if(killReward)\r\n {\r\n for(var currency in killReward)\r\n {\r\n var amount = killReward[currency];\r\n server.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\r\n }\r\n }\r\n \r\n // Reset the kill timer\r\n server.UpdateUserInternalData(\r\n {\r\n PlayFabId: currentPlayerId,\r\n Data: {\r\n "lastKill" : String(now)\r\n }\r\n });\r\n \r\n return {\r\n rewards: killReward\r\n };\r\n}'
}
]
})
};
fetch('https://{titleId}.playfabapi.com/Admin/UpdateCloudScript', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'Files' => [
[
'Filename' => 'main.js',
'FileContents' => 'var LevelRewards =
[
\t["TestItem1"],
\t["TestItem2"],
\t["TestItem3"],
\t["TestItem1", "TestItem2"],
\t["TestItem2", "TestItem2"],
\t["TestItem3", "TestItem3"]
]
handlers.onLevelComplete = function(args)
{
\tvar levelNum = args.level;
\t
\t// Do some basic input validation
\tif(levelNum < 0 || levelNum >= LevelRewards.length)
\t{
\t\tlog.info("Invalid level "+levelNum+" completed by "+currentPlayerId);
\t\treturn {};
\t}
\t
\tvar levelCompleteKey = "LevelCompleted"+levelNum;
\t
\t// Get the user\'s internal data
\tvar playerInternalData = server.GetUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tKeys: [levelCompleteKey]
\t});
\t
\t// Did they already complete this level?
\tif(playerInternalData.Data[levelCompleteKey])
\t{
\t\tlog.info("Player "+currentPlayerId+" already completed level "+levelNum);
\t\treturn {};
\t}
\t
\tvar rewards = LevelRewards[levelNum];
\t
\tvar resultItems = null;
\tif(rewards)
\t{
\t\t// Grant reward items to player for completing the level
\t\tvar itemGrantResult = server.GrantItemsToUser(
\t\t{
\t\t\tPlayFabId: currentPlayerId,
\t\t\tAnnotation: "Given by completing level "+levelNum,
\t\t\tItemIds: rewards
\t\t});
\t\t
\t\tresultItems = itemGrantResult.ItemGrantResults;
\t}
\t
\t// Mark the level as being completed so they can\'t get the reward again
\tvar saveData = {};
\tsaveData[levelCompleteKey] = "true";
\tserver.UpdateUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tData: saveData
\t});
\t// Return the results of the item grant so the client can see what they got
\treturn {
\t\trewards: resultItems
\t};
}
var monsterRewards =
{
\t"skrill" : { "ChumpCoins" : 100},
\t"lumpur" : { "ChumpCoins" : 200}
}
var killCoolDown = 60;
function currTimeSeconds()
{
\tvar now = new Date();
\treturn now.getTime() / 1000;
}
handlers.monsterKilled = function(args)
{
\tvar monsterType = args.type;
\t
\tvar now = currTimeSeconds();
\t
\t// Get the user\'s internal data
\tvar playerInternalData = server.GetUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tKeys: ["lastKill"]
\t});
\t
\t// Check when the last time they killed a monster was
\tvar lastKill = playerInternalData.Data["lastKill"];
\tif(lastKill)
\t{
\t\t// We have a value, see when it is
\t\tvar lastKillTime = parseInt(lastKill.Value);
\t\tif(now - lastKillTime < killCoolDown)
\t\t{
\t\t\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating
\t\t\tlog.info("Player "+currentPlayerId+" killed "+monsterType+" again too quickly!");
\t\t\treturn {};
\t\t}
\t}
\t
\tvar killReward = monsterRewards[monsterType];
\t
\tif(killReward)
\t{
\t\tfor(var currency in killReward)
\t\t{
\t\t\tvar amount = killReward[currency];
\t\t\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });
\t\t}
\t}
\t
\t// Reset the kill timer
\tserver.UpdateUserInternalData(
\t{
\t\tPlayFabId: currentPlayerId,
\t\tData: {
\t\t\t"lastKill" : String(now)
\t\t}
\t});
\t
\treturn {
\t\trewards: killReward
\t};
}'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-SecretKey: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://{titleId}.playfabapi.com/Admin/UpdateCloudScript"
payload := strings.NewReader("{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-SecretKey", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://{titleId}.playfabapi.com/Admin/UpdateCloudScript")
.header("X-SecretKey", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://{titleId}.playfabapi.com/Admin/UpdateCloudScript")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-SecretKey"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"Files\": [\n {\n \"Filename\": \"main.js\",\n \"FileContents\": \"var LevelRewards =\\r\\n[\\r\\n\\t[\\\"TestItem1\\\"],\\r\\n\\t[\\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\"],\\r\\n\\t[\\\"TestItem1\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem2\\\", \\\"TestItem2\\\"],\\r\\n\\t[\\\"TestItem3\\\", \\\"TestItem3\\\"]\\r\\n]\\r\\n\\r\\nhandlers.onLevelComplete = function(args)\\r\\n{\\r\\n\\tvar levelNum = args.level;\\r\\n\\t\\r\\n\\t// Do some basic input validation\\r\\n\\tif(levelNum < 0 || levelNum >= LevelRewards.length)\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Invalid level \\\"+levelNum+\\\" completed by \\\"+currentPlayerId);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar levelCompleteKey = \\\"LevelCompleted\\\"+levelNum;\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [levelCompleteKey]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Did they already complete this level?\\r\\n\\tif(playerInternalData.Data[levelCompleteKey])\\r\\n\\t{\\r\\n\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" already completed level \\\"+levelNum);\\r\\n\\t\\treturn {};\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar rewards = LevelRewards[levelNum];\\r\\n\\t\\r\\n\\tvar resultItems = null;\\r\\n\\tif(rewards)\\r\\n\\t{\\r\\n\\t\\t// Grant reward items to player for completing the level\\r\\n\\t\\tvar itemGrantResult = server.GrantItemsToUser(\\r\\n\\t\\t{\\r\\n\\t\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\t\\tAnnotation: \\\"Given by completing level \\\"+levelNum,\\r\\n\\t\\t\\tItemIds: rewards\\r\\n\\t\\t});\\r\\n\\t\\t\\r\\n\\t\\tresultItems = itemGrantResult.ItemGrantResults;\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Mark the level as being completed so they can't get the reward again\\r\\n\\tvar saveData = {};\\r\\n\\tsaveData[levelCompleteKey] = \\\"true\\\";\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: saveData\\r\\n\\t});\\r\\n\\r\\n\\t// Return the results of the item grant so the client can see what they got\\r\\n\\treturn {\\r\\n\\t\\trewards: resultItems\\r\\n\\t};\\r\\n}\\r\\n\\r\\nvar monsterRewards =\\r\\n{\\r\\n\\t\\\"skrill\\\" : { \\\"ChumpCoins\\\" : 100},\\r\\n\\t\\\"lumpur\\\" : { \\\"ChumpCoins\\\" : 200}\\r\\n}\\r\\n\\r\\nvar killCoolDown = 60;\\r\\n\\r\\nfunction currTimeSeconds()\\r\\n{\\r\\n\\tvar now = new Date();\\r\\n\\treturn now.getTime() / 1000;\\r\\n}\\r\\n\\r\\nhandlers.monsterKilled = function(args)\\r\\n{\\r\\n\\tvar monsterType = args.type;\\r\\n\\t\\r\\n\\tvar now = currTimeSeconds();\\r\\n\\t\\r\\n\\t// Get the user's internal data\\r\\n\\tvar playerInternalData = server.GetUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tKeys: [\\\"lastKill\\\"]\\r\\n\\t});\\r\\n\\t\\r\\n\\t// Check when the last time they killed a monster was \\r\\n\\tvar lastKill = playerInternalData.Data[\\\"lastKill\\\"];\\r\\n\\tif(lastKill)\\r\\n\\t{\\r\\n\\t\\t// We have a value, see when it is\\r\\n\\t\\tvar lastKillTime = parseInt(lastKill.Value);\\r\\n\\t\\tif(now - lastKillTime < killCoolDown)\\r\\n\\t\\t{\\r\\n\\t\\t\\t// In this particular game, it should not be possible to kill a monster more often than once a minute, so they might be cheating\\r\\n\\t\\t\\tlog.info(\\\"Player \\\"+currentPlayerId+\\\" killed \\\"+monsterType+\\\" again too quickly!\\\");\\r\\n\\t\\t\\treturn {};\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\tvar killReward = monsterRewards[monsterType];\\r\\n\\t\\r\\n\\tif(killReward)\\r\\n\\t{\\r\\n\\t\\tfor(var currency in killReward)\\r\\n\\t\\t{\\r\\n\\t\\t\\tvar amount = killReward[currency];\\r\\n\\t\\t\\tserver.AddUserVirtualCurrency({ PlayFabId: currentPlayerId, VirtualCurrency: currency, Amount: amount });\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\t\\r\\n\\t// Reset the kill timer\\r\\n\\tserver.UpdateUserInternalData(\\r\\n\\t{\\r\\n\\t\\tPlayFabId: currentPlayerId,\\r\\n\\t\\tData: {\\r\\n\\t\\t\\t\\\"lastKill\\\" : String(now)\\r\\n\\t\\t}\\r\\n\\t});\\r\\n\\t\\r\\n\\treturn {\\r\\n\\t\\trewards: killReward\\r\\n\\t};\\r\\n}\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"code": 200,
"status": "OK",
"data": {
"Version": 1,
"Revision": 5
}
}{
"code": 123,
"errorCode": 123,
"status": "<string>",
"error": "<string>",
"errorMessage": "<string>",
"errorDetails": {}
}