944 lines
30 KiB
Ucode
944 lines
30 KiB
Ucode
|
/**
|
||
|
* Copyright 1998-2013 Epic Games, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Concrete implementation for managing groups through the groups web API
|
||
|
*/
|
||
|
class McpGroupsManager extends McpGroupsBase
|
||
|
config(Engine);
|
||
|
|
||
|
`include(Engine\Classes\HttpStatusCodes.uci)
|
||
|
|
||
|
/** The URL of CreateGroup function on the server */
|
||
|
var config string CreateGroupUrl;
|
||
|
|
||
|
/** The URL of DeleteGroup function on the server */
|
||
|
var config string DeleteGroupUrl;
|
||
|
|
||
|
/** The URL of ListGroups function on the server */
|
||
|
var config string QueryGroupsUrl;
|
||
|
|
||
|
/** The URL of ListGroupMembers function on the server */
|
||
|
var config string QueryGroupMembersUrl;
|
||
|
|
||
|
/** The URL of AddGroupMembers function on the server */
|
||
|
var config string AddGroupMembersUrl;
|
||
|
|
||
|
/** The URL of RemoveGroupMembers function on the server */
|
||
|
var config string RemoveGroupMembersUrl;
|
||
|
|
||
|
/** The URL of DeleteAllGroups function on the server */
|
||
|
var config string DeleteAllGroupsUrl;
|
||
|
|
||
|
/** The URL of AcceptGroupInvite function on the server */
|
||
|
var config string AcceptGroupInviteUrl;
|
||
|
|
||
|
/** The URL of RejectGroupInvite function on the server */
|
||
|
var config string RejectGroupInviteUrl;
|
||
|
|
||
|
/**
|
||
|
* Creates the URL and sends the request to create a group.
|
||
|
* - This updates the group on the server QueryGroups will need to be
|
||
|
* - run again before GetGroups will reflect the this new group.
|
||
|
* @param UniqueUserId the UserId that will own the group
|
||
|
* @param GroupName The name the group will be created with
|
||
|
*/
|
||
|
function CreateGroup(String UniqueUserId, String GroupName)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface CreateGroupRequest;
|
||
|
local McpGroup FailedGroup;
|
||
|
|
||
|
//Ensure that UniqueUserId and GroupName both have values
|
||
|
if(Len(UniqueUserId) > 0 && Len(GroupName) > 0)
|
||
|
{
|
||
|
// Create HttpRequest
|
||
|
CreateGroupRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
|
||
|
if(CreateGroupRequest != none)
|
||
|
{
|
||
|
// Fill url out using parameters
|
||
|
Url = GetBaseURL() $ CreateGroupUrl $ GetAppAccessURL() $
|
||
|
"&uniqueUserId=" $ UniqueUserId $
|
||
|
"&groupName=" $ GroupName $
|
||
|
"&accessLevel=" $ "OWNER";
|
||
|
|
||
|
// Build our web request with the above URL
|
||
|
CreateGroupRequest.SetURL(URL);
|
||
|
CreateGroupRequest.SetVerb("POST");
|
||
|
|
||
|
CreateGroupRequest.OnProcessRequestComplete = OnCreateGroupRequestComplete;
|
||
|
|
||
|
// Call Web Request
|
||
|
if (!CreateGroupRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
`Log(`Location $ " URL is " $ Url);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnCreateGroupComplete(FailedGroup, false, "HttpRequest was not be created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnCreateGroupComplete(FailedGroup, false, "UserId or GroupName wasn't specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed.
|
||
|
* Used to return any errors and notify any registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
function OnCreateGroupRequestComplete(HttpRequestInterface CreateGroupRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local McpGroup CreatedGroup;
|
||
|
local String JsonString;
|
||
|
local JsonObject ParsedJson;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
if (HttpResponse != none && CreateGroupRequest != none)
|
||
|
{
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_CREATED;
|
||
|
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
|
||
|
//Set default parameters in case create was not successful
|
||
|
CreatedGroup.OwnerId = CreateGroupRequest.GetURLParameter("uniqueUserId");
|
||
|
CreatedGroup.GroupName = CreateGroupRequest.GetURLParameter("groupName");
|
||
|
JsonString = HttpResponse.GetContentAsString();
|
||
|
if (JsonString != "" && bWasSuccessful)
|
||
|
{
|
||
|
// Parse the json
|
||
|
ParsedJson = class'JsonObject'.static.DecodeJson(JsonString);
|
||
|
CreatedGroup.GroupId = ParsedJson.GetStringValue("group_id");
|
||
|
CreatedGroup.OwnerId = ParsedJson.GetStringValue("unique_user_id");
|
||
|
CreatedGroup.GroupName = ParsedJson.GetStringValue("group_name");
|
||
|
CreatedGroup.AccessLevel = EMcpGroupAccessLevel(ParsedJson.GetIntValue("access_level") );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`log(`Location@" CreateGroup query did not return a group.");
|
||
|
}
|
||
|
}
|
||
|
OnCreateGroupComplete(CreatedGroup, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deletes a Group by GroupId
|
||
|
*
|
||
|
* @param UniqueUserId UserId of the owner of the Group
|
||
|
* @param GroupId Id of the group
|
||
|
*/
|
||
|
function DeleteGroup(String UniqueUserId, String GroupId)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface DeleteGroupRequest;
|
||
|
|
||
|
//Ensure that UniqueUserId and GroupId both have values
|
||
|
if(Len(UniqueUserId) > 0 && Len(GroupId) > 0)
|
||
|
{
|
||
|
// Delete HttpRequest
|
||
|
DeleteGroupRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
|
||
|
if(DeleteGroupRequest != none)
|
||
|
{
|
||
|
// Fill url out using parameters
|
||
|
Url = GetBaseURL() $ DeleteGroupUrl $ GetAppAccessURL() $
|
||
|
"&uniqueUserId=" $ UniqueUserId $
|
||
|
"&groupId=" $ GroupId;
|
||
|
|
||
|
// Build our web request with the above URL
|
||
|
DeleteGroupRequest.SetVerb("DELETE");
|
||
|
DeleteGroupRequest.SetURL(URL);
|
||
|
DeleteGroupRequest.OnProcessRequestComplete = OnDeleteGroupRequestComplete;
|
||
|
|
||
|
// call WebRequest
|
||
|
if(!DeleteGroupRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
`Log(`Location $ "URL is " $ Url);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnDeleteGroupComplete(GroupId, false, "HttpRequest could not be completed");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnDeleteGroupComplete(GroupId, false, "UniqueUserId and/or GroupId was not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed.
|
||
|
* Used to process the response and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
function OnDeleteGroupRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local String GroupId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
if (HttpResponse != none)
|
||
|
{
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
GroupId = HttpResponse.GetURLParameter("GroupId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
|
||
|
OnDeleteGroupComplete(GroupId, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Queries the backend for the Groups belonging to the supplied UserId
|
||
|
*
|
||
|
* @param UniqueUserId the id of the owner of the groups to return
|
||
|
*/
|
||
|
//Change to be not just owner but all groups userId belongs to
|
||
|
function QueryGroups(String RequesterId)
|
||
|
{
|
||
|
// Cache one group result set per user, instead of only having one array<McpGroup> that gets over
|
||
|
local string Url;
|
||
|
local HttpRequestInterface QueryGroupsRequest;
|
||
|
|
||
|
//Ensure that UniqueUserId and GroupName both have values
|
||
|
if(Len(RequesterId) > 0 )
|
||
|
{
|
||
|
// List HttpRequest
|
||
|
QueryGroupsRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
if (QueryGroupsRequest != none)
|
||
|
{
|
||
|
// Fill it out using parameters
|
||
|
// The server takes one of two parameters
|
||
|
// - uniqueUserId will return only groups owned by the user
|
||
|
// - memberUniqueUserId will return all groups that have the user as a member (including groups owned by that user)
|
||
|
Url = GetBaseURL() $ QueryGroupsUrl $ GetAppAccessURL() $
|
||
|
"&memberUniqueUserId=" $ RequesterId;
|
||
|
|
||
|
// Build our web request with the above URL
|
||
|
QueryGroupsRequest.SetURL(URL);
|
||
|
QueryGroupsRequest.SetVerb("GET");
|
||
|
QueryGroupsRequest.OnProcessRequestComplete = OnQueryGroupsRequestComplete;
|
||
|
|
||
|
// Call Web Request
|
||
|
if(!QueryGroupsRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnQueryGroupsComplete(RequesterId, false, "Http Request could not be created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnQueryGroupsComplete(RequesterId, false, "RequesterId was not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed. Used to process the returned data and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
delegate OnQueryGroupsRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Error;
|
||
|
local McpGroup Group;
|
||
|
local string JsonString;
|
||
|
local JsonObject ParsedJson;
|
||
|
local int JsonIndex;
|
||
|
local string RequesterId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
// Both HttpResponse and OriginalRequest need to be present
|
||
|
if (HttpResponse != none && OriginalRequest != none)
|
||
|
{
|
||
|
RequesterId = OriginalRequest.GetURLParameter("memberUniqueUserId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
if (bWasSuccessful)
|
||
|
{
|
||
|
JsonString = HttpResponse.GetContentAsString();
|
||
|
if (JsonString != "")
|
||
|
{
|
||
|
// Parse the json
|
||
|
ParsedJson = class'JsonObject'.static.DecodeJson(JsonString);
|
||
|
// Add each mapping in the json packet if missing
|
||
|
for (JsonIndex = 0; JsonIndex < ParsedJson.ObjectArray.Length; JsonIndex++)
|
||
|
{
|
||
|
Group.OwnerId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("unique_user_id");
|
||
|
Group.GroupId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("group_id");
|
||
|
Group.GroupName = ParsedJson.ObjectArray[JsonIndex].GetStringValue("group_name");
|
||
|
Group.AccessLevel = EMcpGroupAccessLevel(ParsedJson.ObjectArray[JsonIndex].GetIntValue("access_level") );
|
||
|
|
||
|
CacheGroup(RequesterId, Group);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error = "Query did not return any content in it's response.";
|
||
|
`log(`Location $ Error);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
}
|
||
|
OnQueryGroupsComplete(RequesterId, bWasSuccessful, Error);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the set of groups that related to the specified UserId
|
||
|
* Called after QueryGroups, which fills/updates the GroupLists variable with the response from the server.
|
||
|
* To check for ownership compare the RequesterId to the OwnerId of the group.
|
||
|
*
|
||
|
* @param UserId the request object that was used
|
||
|
* @param GroupList the response object that was generated
|
||
|
*/
|
||
|
function GetGroupList(string UserId, out McpGroupList GroupList)
|
||
|
{
|
||
|
local int GroupListIndex;
|
||
|
|
||
|
// Make sure that userId is valid
|
||
|
if( Len(UserId) > 0 )
|
||
|
{
|
||
|
// Check Cache Variable GroupLists
|
||
|
GroupListIndex = GroupLists.Find('RequesterId', UserId);
|
||
|
if(GroupListIndex != INDEX_NONE)
|
||
|
{
|
||
|
GroupList = GroupLists[GroupListIndex];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`Log(`Location $ " Requester Id not found or GroupLists is empty. Using UserId: " $ UserId);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`Log(`Location $ "UserId not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Queries the backend for the Groups Members belonging to the specified group
|
||
|
*
|
||
|
* After the Query is returned from the server the data is stored in a local variable GroupLists
|
||
|
* In order to fully fill this variable for a given user you need to run QueryGroups AND QueryGroupMembers.
|
||
|
* Since there are potentially many more GroupMembers than Groups it saves bandwidth to only Query what you need
|
||
|
*
|
||
|
* @param UniqueUserId the id of the owner of the group being queried
|
||
|
* @param GroupId the id of the owner of the groups to return
|
||
|
*/
|
||
|
function QueryGroupMembers(String UniqueUserId, String GroupId)
|
||
|
{
|
||
|
// Cache one group result set per user, instead of only having one array<McpGroup> that gets over
|
||
|
local string Url;
|
||
|
local HttpRequestInterface QueryGroupMembersRequest;
|
||
|
|
||
|
|
||
|
// Make sure that UniqueUserId and GroupId have been given
|
||
|
if( Len(UniqueUserId) > 0 && Len(GroupId) > 0)
|
||
|
{
|
||
|
// List HttpRequest
|
||
|
QueryGroupMembersRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
if (QueryGroupMembersRequest != none)
|
||
|
{
|
||
|
//Create URL parameters
|
||
|
Url = GetBaseURL() $ QueryGroupMembersUrl $ GetAppAccessURL() $
|
||
|
"&groupId=" $ GroupId;
|
||
|
|
||
|
// Build our web request with the above URL
|
||
|
QueryGroupMembersRequest.SetURL(URL);
|
||
|
QueryGroupMembersRequest.SetVerb("GET");
|
||
|
QueryGroupMembersRequest.OnProcessRequestComplete = OnQueryGroupMembersRequestComplete;
|
||
|
|
||
|
// Call WebRequest
|
||
|
if(!QueryGroupMembersRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnQueryGroupMembersComplete(GroupId, false, "HttpRequest not created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnQueryGroupMembersComplete(GroupId, false, "UserId and/or GroupId not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed. Used to process the returned data and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
delegate OnQueryGroupMembersRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Error;
|
||
|
local string JsonString;
|
||
|
local JsonObject ParsedJson;
|
||
|
local int JsonIndex;
|
||
|
local EMcpGroupAcceptState AcceptState;
|
||
|
local string MemberId;
|
||
|
local string GroupId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
|
||
|
// Both HttpResponse and OriginalRequest need to be present
|
||
|
if (HttpResponse != none && OriginalRequest != none)
|
||
|
{
|
||
|
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
if (bWasSuccessful)
|
||
|
{
|
||
|
JsonString = HttpResponse.GetContentAsString();
|
||
|
if (JsonString != "")
|
||
|
{
|
||
|
// @todo joeg - Replace with Wes' ImportJson() once it's implemented
|
||
|
// Parse the json
|
||
|
ParsedJson = class'JsonObject'.static.DecodeJson(JsonString);
|
||
|
// Add each mapping in the json packet if missing
|
||
|
for (JsonIndex = 0; JsonIndex < ParsedJson.ObjectArray.Length; JsonIndex++)
|
||
|
{
|
||
|
MemberId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("unique_user_id");
|
||
|
GroupId = ParsedJson.ObjectArray[JsonIndex].GetStringValue("group_id");
|
||
|
AcceptState = EMcpGroupAcceptState(ParsedJson.ObjectArray[JsonIndex].GetIntValue("status"));
|
||
|
|
||
|
CacheGroupMember(MemberId, GroupId, AcceptState);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error = "Query did not return any content in it's response.";
|
||
|
`log(`Location $ Error);
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Error = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
}
|
||
|
OnQueryGroupMembersComplete(GroupId, bWasSuccessful, Error);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the set of Group Members that belong to the specified GroupId
|
||
|
* Called after QueryGroupMembers.
|
||
|
*
|
||
|
* @param GroupId the request object that was used
|
||
|
* @param GroupList the response object that was generated
|
||
|
*/
|
||
|
function GetGroupMembers(String GroupId, out array<McpGroupMember> GroupMembers)
|
||
|
{
|
||
|
local int GroupIndex;
|
||
|
local McpGroupList GroupList;
|
||
|
local McpGroup GroupTemp;
|
||
|
|
||
|
foreach GroupLists(GroupList)
|
||
|
{
|
||
|
foreach GroupList.Groups(GroupTemp, GroupIndex)
|
||
|
{
|
||
|
if(GroupTemp.GroupId == GroupId)
|
||
|
{
|
||
|
GroupMembers = GroupTemp.Members;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Adds an Group Members to the specified Group. Sends this request to MCP to be processed
|
||
|
*
|
||
|
* @param UniqueUserId the user that owns the group
|
||
|
* @param GroupId the group id
|
||
|
* @param MemberIds list of member ids to add to the group
|
||
|
* @param bRequiresAcceptance whether or not members need to accept an invitation to a group
|
||
|
*/
|
||
|
function AddGroupMembers(String UniqueUserId, String GroupId, const out array<String> MemberIds, bool bRequiresAcceptance)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface AddGroupMembersRequest;
|
||
|
local string JsonPayload;
|
||
|
local int Index;
|
||
|
|
||
|
|
||
|
// Make sure that UniqueUserId and GroupId have been given
|
||
|
if( Len(UniqueUserId) > 0 && Len(GroupId) > 0)
|
||
|
{
|
||
|
// Create HttpRequest
|
||
|
AddGroupMembersRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
AddGroupMembersRequest.OnProcessRequestComplete = OnAddGroupMembersRequestComplete;
|
||
|
if(AddGroupMembersRequest != none)
|
||
|
{
|
||
|
Url = GetBaseURL() $ AddGroupMembersUrl $ GetAppAccessURL() $
|
||
|
"&uniqueUserId=" $ UniqueUserId $
|
||
|
"&groupId=" $ GroupId $
|
||
|
"&requiresAcceptance=" $ bRequiresAcceptance ? "true" : "false";
|
||
|
// If bRequiresAcceptance is set to false then the group member will be created with a status of Accepted by default
|
||
|
// If it is set to true then the status will be set to Pending and the user will need to accept the invite to officially be part of the group
|
||
|
|
||
|
if(MemberIds.Length > 0)
|
||
|
{
|
||
|
// Make a json string from our list of ids
|
||
|
JsonPayload = "[ ";
|
||
|
for (Index = 0; Index < MemberIds.Length; Index++)
|
||
|
{
|
||
|
JsonPayload $= "\"" $ MemberIds[Index] $ "\"";
|
||
|
// Only add the comma to the string if this isn't the last item
|
||
|
if (Index + 1 < MemberIds.Length)
|
||
|
{
|
||
|
JsonPayload $= ",";
|
||
|
}
|
||
|
}
|
||
|
JsonPayload $= " ]";
|
||
|
|
||
|
// Fill it out using parameters
|
||
|
AddGroupMembersRequest.SetVerb("POST");
|
||
|
AddGroupMembersRequest.SetContentAsString(JsonPayload);
|
||
|
AddGroupMembersRequest.SetURL(URL);
|
||
|
|
||
|
// Call WebRequest
|
||
|
if (!AddGroupMembersRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
`Log(`Location@"URL(" $ Url $ ")");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`Log(`Location@" No MemberIds given.");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnAddGroupMembersComplete(GroupId, false, "HttpRequest was not created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnAddGroupMembersComplete(GroupId, false, "UserId and/or GroupId not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed. Used to process the add mapping result and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
delegate OnAddGroupMembersRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local String GroupId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
if (HttpResponse != none)
|
||
|
{
|
||
|
GroupId = HttpResponse.GetURLParameter("GroupId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
|
||
|
OnAddGroupMembersComplete(GroupId, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Remove Group Members from the specified Group. Sends this request to MCP to be processed
|
||
|
*
|
||
|
* @param UniqueUserId the user that owns the group
|
||
|
* @param GroupId the group id
|
||
|
* @param MemberIds list of member ids to add to the group
|
||
|
*/
|
||
|
function RemoveGroupMembers(String UniqueUserId, String GroupId, const out array<String> MemberIds)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface RemoveGroupMembersRequest;
|
||
|
local string JsonPayload;
|
||
|
local int Index;
|
||
|
|
||
|
// Make sure that UniqueUserId and GroupId have been given
|
||
|
if( Len(UniqueUserId) > 0 && Len(GroupId) > 0)
|
||
|
{
|
||
|
RemoveGroupMembersRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
if(RemoveGroupMembersRequest != none)
|
||
|
{
|
||
|
|
||
|
Url = GetBaseURL() $ RemoveGroupMembersUrl $ GetAppAccessURL() $
|
||
|
"&groupId=" $ GroupId;
|
||
|
|
||
|
if(MemberIds.Length > 0)
|
||
|
{
|
||
|
// Make a json string from our list of ids
|
||
|
JsonPayload = "[ ";
|
||
|
for (Index = 0; Index < MemberIds.Length; Index++)
|
||
|
{
|
||
|
JsonPayload $= "\"" $ MemberIds[Index] $ "\"";
|
||
|
// Only add the comma to the string if this isn't the last item
|
||
|
if (Index + 1 < MemberIds.Length)
|
||
|
{
|
||
|
JsonPayload $= ",";
|
||
|
}
|
||
|
}
|
||
|
JsonPayload $= " ]";
|
||
|
|
||
|
RemoveGroupMembersRequest.SetURL(URL);
|
||
|
RemoveGroupMembersRequest.SetContentAsString(JsonPayload);
|
||
|
RemoveGroupMembersRequest.SetVerb("DELETE");
|
||
|
RemoveGroupMembersRequest.OnProcessRequestComplete = OnRemoveGroupMembersRequestComplete;
|
||
|
|
||
|
// Call the request
|
||
|
if (!RemoveGroupMembersRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`Log(`Location@" No MemberIds given.");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnRemoveGroupMembersComplete(GroupId, false, "Http request was not created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnRemoveGroupMembersComplete(GroupId, false, "UniqueUserId and/or GroupId was not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed. Used to process the add mapping result and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
function OnRemoveGroupMembersRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local String GroupId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
if (HttpResponse != none)
|
||
|
{
|
||
|
GroupId = HttpResponse.GetURLParameter("GroupId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
|
||
|
OnRemoveGroupMembersComplete(GroupId, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Deletes all Groups that belong to UniqueUserId
|
||
|
*
|
||
|
* @param UniqueUserId UserId of the owner of the Group
|
||
|
*/
|
||
|
function DeleteAllGroups(String UniqueUserId)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface DeleteGroupRequest;
|
||
|
|
||
|
// Make sure that UniqueUserId and GroupId have been given
|
||
|
if( Len(UniqueUserId) > 0 )
|
||
|
{
|
||
|
// Delete HttpRequest
|
||
|
DeleteGroupRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
if(DeleteGroupRequest != none)
|
||
|
{
|
||
|
|
||
|
// Fill it out using parameters
|
||
|
DeleteGroupRequest.SetVerb("DELETE");
|
||
|
|
||
|
Url = GetBaseURL() $ DeleteAllGroupsUrl $ GetAppAccessURL() $
|
||
|
"&uniqueUserId=" $ UniqueUserId;
|
||
|
|
||
|
DeleteGroupRequest.SetURL(URL);
|
||
|
|
||
|
`log("URL="@DeleteGroupRequest.GetURL());
|
||
|
|
||
|
DeleteGroupRequest.OnProcessRequestComplete = OnDeleteGroupRequestComplete;
|
||
|
|
||
|
// call WebRequest
|
||
|
if(!DeleteGroupRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnDeleteAllGroupsComplete(UniqueUserId, false, "HttpRequest was not created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnDeleteAllGroupsComplete(UniqueUserId, false, "UniqueUserId was not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Called once the results come back from the server to indicate success/failure of the operation
|
||
|
*
|
||
|
* @param bWasSuccessful whether the operation succeeded or not
|
||
|
* @param Error string information about the error (if an error)
|
||
|
*/
|
||
|
function OnDeleteAllGroupsRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local string RequesterId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
// Both HttpResponse and OriginalRequest need to be present
|
||
|
if (HttpResponse != none && OriginalRequest != none)
|
||
|
{
|
||
|
RequesterId = OriginalRequest.GetURLParameter("uniqueUserId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
|
||
|
OnDeleteAllGroupsComplete(RequesterId, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set's the a Member's membership status to Accept or Reject
|
||
|
* based on the value of bShouldAccept
|
||
|
*
|
||
|
* @param UniqueUserId User who's status is to be update
|
||
|
* @param GroupId
|
||
|
* @param bShouldAccept 1 = accepted 0 = rejected
|
||
|
*/
|
||
|
function AcceptGroupInvite(String UniqueUserId, String GroupId, bool bShouldAccept)
|
||
|
{
|
||
|
local string Url;
|
||
|
local HttpRequestInterface AcceptGroupInviteRequest;
|
||
|
|
||
|
// Make sure that UniqueUserId and GroupId have been given
|
||
|
if( Len(UniqueUserId) > 0 && Len(GroupId) > 0)
|
||
|
{
|
||
|
// Create HttpRequest
|
||
|
AcceptGroupInviteRequest = class'HttpFactory'.static.CreateRequest();
|
||
|
if(AcceptGroupInviteRequest != none)
|
||
|
{
|
||
|
Url = GetBaseURL() $ AcceptGroupInviteUrl $ GetAppAccessURL() $
|
||
|
"&uniqueUserId=" $ UniqueUserId $
|
||
|
"&groupId=" $ GroupId $
|
||
|
"&status=" $ bShouldAccept ? "accepted" : "rejected";
|
||
|
|
||
|
// Fill it out using parameters
|
||
|
AcceptGroupInviteRequest.SetVerb("POST");
|
||
|
AcceptGroupInviteRequest.SetURL(URL);
|
||
|
AcceptGroupInviteRequest.OnProcessRequestComplete = OnAcceptGroupInviteRequestComplete;
|
||
|
|
||
|
// Call WebRequest
|
||
|
`log("Calling Process Request");
|
||
|
if(!AcceptGroupInviteRequest.ProcessRequest())
|
||
|
{
|
||
|
`Log(`Location@"Failed to process web request for URL(" $ Url $ ")");
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnAcceptGroupInviteComplete(GroupId, false, "HttpRequest not created");
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
OnAcceptGroupInviteComplete(GroupId, false, "UniqueUserId or GroupId was not specified");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Called once the request/response has completed. Used to process the add mapping result and notify any
|
||
|
* registered delegate
|
||
|
*
|
||
|
* @param Request the request object that was used
|
||
|
* @param Response the response object that was generated
|
||
|
* @param bWasSuccessful whether or not the request completed successfully
|
||
|
*/
|
||
|
delegate OnAcceptGroupInviteRequestComplete(HttpRequestInterface OriginalRequest, HttpResponseInterface HttpResponse, bool bWasSuccessful)
|
||
|
{
|
||
|
local int ResponseCode;
|
||
|
local string Content;
|
||
|
local String GroupId;
|
||
|
|
||
|
ResponseCode = `HTTP_STATUS_SERVER_ERROR;
|
||
|
if (HttpResponse != none)
|
||
|
{
|
||
|
GroupId = HttpResponse.GetURLParameter("GroupId");
|
||
|
ResponseCode = HttpResponse.GetResponseCode();
|
||
|
Content = HttpResponse.GetContentAsString();
|
||
|
}
|
||
|
// Both of these need to be true for the request to be a success
|
||
|
bWasSuccessful = bWasSuccessful && ResponseCode == `HTTP_STATUS_OK;
|
||
|
|
||
|
OnAcceptGroupInviteComplete(GroupId, bWasSuccessful, Content);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
*Store group in an object in memory instead of having to query the server again for it
|
||
|
*
|
||
|
* @param Group to be placed in the cache
|
||
|
*/
|
||
|
function CacheGroup(string RequesterId, McpGroup Group)
|
||
|
{
|
||
|
local int AddAt;
|
||
|
local int GroupIndex;
|
||
|
local int GroupListIndex;
|
||
|
local McpGroupList UserGroupList;
|
||
|
local bool bWasFound;
|
||
|
|
||
|
//Find the user's cached group list in collection of users group lists, GroupLists
|
||
|
//TODO Is there a better way to do this? Have to rely on the response not being empty, though if it is then we don't do anything so that's fine.
|
||
|
// - More importantly we're querying the GroupLists for every entry returned which isn't as efficient.
|
||
|
// - Could just set GroupListIndex and then check if it's been set ...
|
||
|
bWasFound = false;
|
||
|
GroupListIndex = GroupLists.Find('RequesterId', RequesterId);
|
||
|
if(GroupListIndex != INDEX_NONE)
|
||
|
{
|
||
|
UserGroupList = GroupLists[GroupListIndex];
|
||
|
|
||
|
// Search the array for any existing adding only when missing
|
||
|
for (GroupIndex = 0; GroupIndex < UserGroupList.Groups.Length && !bWasFound; GroupIndex++)
|
||
|
{
|
||
|
bWasFound = Group.GroupId == UserGroupList.Groups[GroupIndex].GroupId;
|
||
|
}
|
||
|
// Add this one since it wasn't found
|
||
|
if (!bWasFound)
|
||
|
{
|
||
|
AddAt = UserGroupList.Groups.Length;
|
||
|
UserGroupList.Groups.Length = AddAt + 1;
|
||
|
UserGroupList.Groups[AddAt] = Group;
|
||
|
GroupLists[GroupListIndex] = UserGroupList;
|
||
|
}
|
||
|
|
||
|
`log(`Location $ " GroupName: " $ UserGroupList.Groups[AddAt].GroupName);
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Add User with this first returned group since it wasn't found
|
||
|
AddAt = GroupLists.Length;
|
||
|
GroupLists.Length = AddAt +1;
|
||
|
GroupLists[AddAt].RequesterId = Group.OwnerId;
|
||
|
GroupLists[AddAt].Groups[0]=Group;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
*Store group member in an object in memory instead of having to query the server again for it
|
||
|
*
|
||
|
* @param MemberId to be placed in the cache
|
||
|
* @param GroupId to be placed in the cache
|
||
|
* @param intAcceptState whether the group member's status is accepted, pending or rejected
|
||
|
*/
|
||
|
function CacheGroupMember(String MemberId, String GroupId, EMcpGroupAcceptState AcceptState)
|
||
|
{
|
||
|
local int MemberIndex;
|
||
|
local McpGroupList GroupList;
|
||
|
local int GroupListIndex;
|
||
|
local McpGroup GroupTemp;
|
||
|
local int GroupIndex;
|
||
|
local int AddAt;
|
||
|
|
||
|
// Have the variables been passed in properly
|
||
|
if(Len(MemberId) > 0 && Len(GroupId) > 0 && Len(AcceptState) > 0)
|
||
|
{
|
||
|
// Look at each GroupList (userId:<groups>) mapping to see where to add/update this member
|
||
|
foreach GroupLists(GroupList, GroupListIndex)
|
||
|
{
|
||
|
// For each group related to the user see if it's the GroupId specified
|
||
|
foreach GroupList.Groups(GroupTemp, GroupIndex)
|
||
|
{
|
||
|
// If the group is found Update the Member field
|
||
|
// This will potential run multiple times as it will be stored under both owners and members in GroupLists
|
||
|
if(GroupTemp.GroupId == GroupId)
|
||
|
{
|
||
|
// Locate the proper place to update or add the member
|
||
|
MemberIndex = GroupTemp.Members.find('MemberId', MemberId);
|
||
|
if(MemberIndex == INDEX_NONE)
|
||
|
{
|
||
|
// No MemberId found so add the member
|
||
|
AddAt = GroupTemp.Members.Length;
|
||
|
GroupTemp.Members.Length = AddAt +1;
|
||
|
GroupTemp.Members[AddAt].MemberId = MemberId;
|
||
|
GroupTemp.Members[AddAt].AcceptState = AcceptState;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// GroupId and MemberId have been confirmed so just update the accept state if it's changed
|
||
|
if(GroupTemp.Members[MemberIndex].AcceptState != AcceptState)
|
||
|
{
|
||
|
GroupTemp.Members[MemberIndex].AcceptState = AcceptState;
|
||
|
}
|
||
|
}
|
||
|
// Set the group at the location to the updated (or unchanged) group
|
||
|
GroupList.Groups[GroupIndex] = GroupTemp;
|
||
|
}
|
||
|
}
|
||
|
// Set the GroupList at the location to the updated (or unchanged) GroupList
|
||
|
GroupLists[GroupListIndex] = GroupList;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
`Log(`Location@" Either the MemberId, GroupId, or AcceptState was not Specified.");
|
||
|
}
|
||
|
}
|