using System; using System.Data; using System.Security; using sodoff.Model; using sodoff.Schema; using sodoff.Util; namespace sodoff.Services; public class BuddyService { private char[] BuddyCodeCharacterList = new char[] { 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0' }; private readonly DBContext ctx; private readonly MessagingService messagingService; public BuddyService(DBContext ctx, MessagingService messagingService) { this.ctx = ctx; this.messagingService = messagingService; } public BuddyActionResult CreateBuddyRelation(Viking viking1, Viking viking2, BuddyStatus buddyStatus1 = BuddyStatus.PendingApprovalFromOther, BuddyStatus buddyStatus2 = BuddyStatus.PendingApprovalFromSelf) { // get execution UTC timestamp DateTime now = DateTime.UtcNow; // construct buddy Model.Buddy buddy = new Model.Buddy { Viking = viking1, VikingId = viking1.Id, BuddyViking = viking2, BuddyVikingId = viking2.Id, BuddyStatus1 = buddyStatus1, BuddyStatus2 = buddyStatus2, IsBestFriend1 = false, IsBestFriend2 = false, CreatedAt = now }; // do not add if viking1 is on a different game version than viking2 if (viking1.GameVersion < viking2.GameVersion) return new BuddyActionResult { Result = BuddyActionResultType.InvalidFriendCode }; // do not add if relationship already exists Model.Buddy? existingBuddy = ctx.Buddies.FirstOrDefault(e => e.VikingId == buddy.VikingId && e.BuddyVikingId == buddy.BuddyVikingId); if (existingBuddy != null) return new BuddyActionResult { Result = BuddyActionResultType.AlreadyInList }; // add relationship to database ctx.Buddies.Add(buddy); ctx.SaveChanges(); // if this is a buddy relationship, use MessagingService to send buddy request message to viking2 if (buddyStatus1 == BuddyStatus.PendingApprovalFromOther && buddyStatus2 == BuddyStatus.PendingApprovalFromSelf) messagingService.AddMessageToViking(viking1, viking2, MessageType.Data, MessageTypeID.BuddyList, MessageLevel.WhiteList, "[[Line1]]=[[{{BuddyUserName}} Wants To Add You As A Buddy!]]", "[[Line1]]=[[{{BuddyUserName}} Wants To Add You As A Buddy!]]", "[[Line1]]=[[{{BuddyUserName}} Wants To Add You As A Buddy!]]"); // return result return new BuddyActionResult { Result = BuddyActionResultType.Success, Status = buddy.BuddyStatus1, BuddyUserID = viking2.Uid.ToString() }; } public bool UpdateBuddyRelation(Viking viking, Viking buddyViking, BuddyStatus buddyStatus1, BuddyStatus buddyStatus2) { // find relation Model.Buddy? buddy = ctx.Buddies.Where(e => e.VikingId == viking.Id || e.BuddyVikingId == viking.Id) .FirstOrDefault(e => e.BuddyVikingId == buddyViking.Id || e.VikingId == buddyViking.Id); if (buddy != null) { // update it buddy.BuddyStatus1 = buddyStatus1; buddy.BuddyStatus2 = buddyStatus2; ctx.SaveChanges(); // return result return true; } else return false; } public bool UpdateBestBuddy(Viking viking, Viking buddyViking, bool bestBuddy) { // find relation Model.Buddy? buddy = ctx.Buddies.Where(e => e.VikingId == viking.Id || e.BuddyVikingId == viking.Id) .FirstOrDefault(e => e.BuddyVikingId == buddyViking.Id || e.VikingId == buddyViking.Id); if (buddy != null) { if (buddy.VikingId == viking.Id) buddy.IsBestFriend2 = bestBuddy; else buddy.IsBestFriend1 = bestBuddy; ctx.SaveChanges(); return true; } else return false; } public string GetOrSetBuddyCode(Viking viking) { if (viking.BuddyCode != null) return viking.BuddyCode; else { // generate a buddy code and set it Random rnd = new Random(); string code = ""; do { for( int i = 0; i < 5; i++ ) { code += BuddyCodeCharacterList[rnd.Next(0, BuddyCodeCharacterList.Length)]; } } while (ctx.Vikings.FirstOrDefault(e => e.BuddyCode == code) != null); // set code on viking viking.BuddyCode = code; ctx.SaveChanges(); // return it return viking.BuddyCode; } } public bool RemoveBuddy(Viking viking, Viking buddyViking) { // find relation Model.Buddy? buddy = ctx.Buddies.Where(e => e.VikingId == viking.Id || e.BuddyVikingId == viking.Id) .FirstOrDefault(e => e.BuddyVikingId == buddyViking.Id || e.VikingId == buddyViking.Id); if (buddy != null) { // remove it ctx.Buddies.Remove(buddy); ctx.SaveChanges(); return true; } else return false; } public BuddyList ConstructBuddyList(Viking viking) { // get all relationships viking has made List buddies = ctx.Buddies.Where(e => e.VikingId == viking.Id || e.BuddyVikingId == viking.Id) .ToList(); List schemaBuddies = new(); foreach (var buddy in buddies) { // show differently depending on requester if (buddy.VikingId == viking.Id) schemaBuddies.Add(new Schema.Buddy { UserID = buddy.BuddyViking.Uid.ToString(), DisplayName = XmlUtil.DeserializeXml(buddy.BuddyViking.AvatarSerialized).DisplayName, Status = buddy.BuddyStatus2, CreateDate = buddy.CreatedAt, Online = buddy.BuddyViking.Online ?? false, OnMobile = false, BestBuddy = buddy.IsBestFriend2 }); else schemaBuddies.Add(new Schema.Buddy { UserID = buddy.Viking.Uid.ToString(), DisplayName = XmlUtil.DeserializeXml(buddy.Viking.AvatarSerialized).DisplayName, Status = buddy.BuddyStatus1, CreateDate = buddy.CreatedAt, Online = buddy.Viking.Online ?? false, OnMobile = false, BestBuddy = buddy.IsBestFriend1 }); } // return buddy list return new BuddyList { Buddy = schemaBuddies.ToArray() }; } }