Files
SPT-Server-Build/Core/Controllers/ProfileController.cs
T
2025-01-12 23:15:55 +00:00

353 lines
11 KiB
C#

using Core.Annotations;
using Core.Generators;
using Core.Helpers;
using Core.Models.Eft.Common;
using Core.Models.Eft.Launcher;
using Core.Models.Eft.Profile;
using Core.Models.Enums;
using Core.Routers;
using Core.Servers;
using Core.Services;
using Core.Utils;
using Core.Utils.Cloners;
namespace Core.Controllers;
[Injectable]
public class ProfileController
{
protected Models.Utils.ILogger _logger;
protected HashUtil _hashUtil;
protected ICloner _cloner;
protected TimeUtil _timeUtil;
protected SaveServer _saveServer;
protected DatabaseService _databaseService;
protected ItemHelper _itemHelper;
protected ProfileFixerService _profileFixerService;
protected LocalisationService _localisationService;
private readonly CreateProfileService _createProfileService;
protected SeasonalEventService _seasonalEventService;
// TODO: MailSendService mailSendService: MailSendService
protected PlayerScavGenerator _playerScavGenerator;
private readonly EventOutputHolder _eventOutputHolder;
protected TraderHelper _traderHelper;
protected DialogueHelper _dialogueHelper;
protected QuestHelper _questHelper;
private readonly QuestRewardHelper _questRewardHelper;
protected ProfileHelper _profileHelper;
public ProfileController(
Models.Utils.ILogger logger,
HashUtil hashUtil,
ICloner cloner,
TimeUtil timeUtil,
SaveServer saveServer,
DatabaseService databaseService,
ItemHelper itemHelper,
ProfileFixerService profileFixerService,
LocalisationService localisationService,
CreateProfileService createProfileService,
SeasonalEventService seasonalEventService,
// TODO: MailSendService mailSendService,
PlayerScavGenerator playerScavGenerator,
EventOutputHolder eventOutputHolder,
TraderHelper traderHelper,
DialogueHelper dialogueHelper,
QuestHelper questHelper,
QuestRewardHelper questRewardHelper,
ProfileHelper profileHelper
)
{
_logger = logger;
_cloner = cloner;
_hashUtil = hashUtil;
_timeUtil = timeUtil;
_saveServer = saveServer;
_databaseService = databaseService;
_itemHelper = itemHelper;
_profileFixerService = profileFixerService;
_localisationService = localisationService;
_createProfileService = createProfileService;
_seasonalEventService = seasonalEventService;
_playerScavGenerator = playerScavGenerator;
_eventOutputHolder = eventOutputHolder;
_traderHelper = traderHelper;
_dialogueHelper = dialogueHelper;
_questHelper = questHelper;
_questRewardHelper = questRewardHelper;
_profileHelper = profileHelper;
}
/**
* Handle /launcher/profiles
*/
public List<MiniProfile> GetMiniProfiles()
{
return _saveServer.GetProfiles().Select(kv => GetMiniProfile(kv.Key)).ToList();
}
/**
* Handle launcher/profile/info
*/
public MiniProfile GetMiniProfile(string sessionID)
{
var profile = _saveServer.GetProfile(sessionID);
if (profile?.CharacterData == null)
{
throw new Exception($"Unable to find character data for id: {sessionID}. Profile may be corrupt");
}
var pmc = profile.CharacterData.PmcData;
var maxlvl = _profileHelper.GetMaxLevel();
// Player hasn't completed profile creation process, send defaults
if (pmc?.Info?.Level == null)
{
return new MiniProfile()
{
Username = profile.ProfileInfo?.Username ?? "",
Nickname = "unknown",
Side = "unknown",
CurrentLevel = 0,
CurrentExperience = 0,
PreviousExperience = 0,
NextLevel = 0,
MaxLevel = maxlvl,
Edition = profile.ProfileInfo?.Edition ?? "",
ProfileId = profile.ProfileInfo?.ProfileId ?? "",
SptData = _profileHelper.GetDefaultSptDataObject(),
};
}
var currlvl = pmc.Info.Level;
var nextlvl = _profileHelper.GetExperience((int)(currlvl + 1));
return new MiniProfile()
{
Username = profile.ProfileInfo.Username,
Nickname = pmc.Info.Nickname,
Side = pmc.Info.Side,
CurrentLevel = (int)(pmc.Info.Level),
CurrentExperience = (int)(pmc.Info.Experience ?? 0),
PreviousExperience = currlvl == 0 ? 0 : _profileHelper.GetExperience((int)currlvl),
NextLevel = nextlvl,
MaxLevel = maxlvl,
Edition = profile.ProfileInfo?.Edition ?? "",
ProfileId = profile.ProfileInfo?.ProfileId ?? "",
SptData = profile.SptData,
};
}
/**
* Handle client/game/profile/list
*/
public List<PmcData> GetCompleteProfile(string sessionID)
{
return _profileHelper.GetCompleteProfile(sessionID);
}
/**
* Handle client/game/profile/create
* @param info Client reqeust object
* @param sessionID Player id
* @returns Profiles _id value
*/
public string CreateProfile(ProfileCreateRequestData request, string sessionID)
{
return _createProfileService.CreateProfile(sessionID, request);
}
/**
* Generate a player scav object
* PMC profile MUST exist first before pscav can be generated
* @param sessionID
* @returns IPmcData object
*/
public PmcData GeneratePlayerScav(string sessionID)
{
return _playerScavGenerator.Generate(sessionID);
}
/**
* Handle client/game/profile/nickname/validate
*/
public string ValidateNickname(ValidateNicknameRequestData info, string sessionID)
{
if (info.Nickname.Length < 3)
{
return "tooshort";
}
if (_profileHelper.IsNicknameTaken(info, sessionID))
{
return "taken";
}
return "OK";
}
/**
* Handle client/game/profile/nickname/change event
* Client allows player to adjust their profile name
*/
public string ChangeNickname(ProfileChangeNicknameRequestData info, string sessionID)
{
var output = ValidateNickname(new ValidateNicknameRequestData() { Nickname = info.Nickname }, sessionID);
if (output == "OK")
{
var pmcData = _profileHelper.GetPmcProfile(sessionID);
pmcData.Info.Nickname = info.Nickname;
pmcData.Info.LowerNickname = info.Nickname.ToLower();
}
return output;
}
/**
* Handle client/game/profile/voice/change event
*/
public void ChangeVoice(ProfileChangeVoiceRequestData info, string sessionID)
{
var pmcData = _profileHelper.GetPmcProfile(sessionID);
pmcData.Info.Voice = info.Voice;
}
/**
* Handle client/game/profile/search
*/
public List<SearchFriendResponse> GetFriends(SearchFriendRequestData info, string sessionID)
{
// TODO: We should probably rename this method in the next client update
var result = new List<SearchFriendResponse>();
// Find any profiles with a nickname containing the entered name
var allProfiles = _saveServer.GetProfiles().Values;
foreach (var profile in allProfiles)
{
var pmcProfile = profile?.CharacterData?.PmcData;
if (!pmcProfile?.Info?.LowerNickname?.Contains(info.Nickname.ToLower()) ?? false)
{
continue;
}
result.Add(_profileHelper.GetChatRoomMemberFromPmcProfile(pmcProfile));
}
return result;
}
/**
* Handle client/profile/status
*/
public GetProfileStatusResponseData GetProfileStatus(string sessionId)
{
var account = _saveServer.GetProfile(sessionId).ProfileInfo;
var response = new GetProfileStatusResponseData()
{
MaxPveCountExceeded = false,
Profiles =
[
new() { ProfileId = account.ScavengerId, ProfileToken = null, Status = "Free", Sid = "", Ip = "", Port = 0 },
new() { ProfileId = account.ProfileId, ProfileToken = null, Status = "Free", Sid = "", Ip = "", Port = 0 },
]
};
return response;
}
/**
* Handle client/profile/view
*/
public GetOtherProfileResponse GetOtherProfile(string sessionId, GetOtherProfileRequest request)
{
// Find the profile by the account ID, fall back to the current player if we can't find the account
var profile = _profileHelper.GetFullProfileByAccountId(request.AccountId);
if (profile?.CharacterData?.PmcData == null || profile?.CharacterData?.ScavData == null)
{
profile = _profileHelper.GetFullProfile(sessionId);
}
var playerPmc = profile.CharacterData.PmcData;
var playerScav = profile.CharacterData.ScavData;
return new GetOtherProfileResponse()
{
Id = playerPmc.Id,
Aid = playerPmc.Aid as int?,
Info =
{
Nickname = playerPmc.Info.Nickname,
Side = playerPmc.Info.Side,
Experience = playerPmc.Info.Experience as int?,
MemberCategory = playerPmc.Info.MemberCategory as int?,
BannedState = playerPmc.Info.BannedState,
BannedUntil = playerPmc.Info.BannedUntil,
RegistrationDate = playerPmc.Info.RegistrationDate,
},
Customization =
{
Head = playerPmc.Customization.Head,
Body = playerPmc.Customization.Body,
Feet = playerPmc.Customization.Feet,
Hands = playerPmc.Customization.Hands,
Dogtag = playerPmc.Customization.DogTag,
},
Skills = playerPmc.Skills,
Equipment =
{
Id = playerPmc.Inventory.Equipment,
Items = playerPmc.Inventory.Items,
},
Achievements = playerPmc.Achievements,
FavoriteItems = _profileHelper.GetOtherProfileFavorites(playerPmc),
PmcStats =
{
Eft =
{
TotalInGameTime = playerPmc.Stats.Eft.TotalInGameTime as int?,
OverAllCounters = playerPmc.Stats.Eft.OverallCounters,
},
},
ScavStats =
{
Eft =
{
TotalInGameTime = playerScav.Stats.Eft.TotalInGameTime as int?,
OverAllCounters = playerScav.Stats.Eft.OverallCounters,
}
}
};
}
/**
* Handle client/profile/settings
*/
public bool SetChosenProfileIcon(string sessionId, GetProfileSettingsRequest request)
{
var profileToUpdate = _profileHelper.GetPmcProfile(sessionId);
if (profileToUpdate == null)
{
return false;
}
if (request.MemberCategory != null)
{
profileToUpdate.Info.SelectedMemberCategory = request.MemberCategory as MemberCategory?;
}
if (request.SquadInviteRestriction != null)
{
profileToUpdate.Info.SquadInviteRestriction = request.SquadInviteRestriction;
}
return true;
}
}