public async Task <Result <bool, Error> > TryAddMarriage(ulong user1, ulong user2) => await _soraTransactor.TryDoInTransactionAsync(async context => { this.OrderUserIdsRef(ref user1, ref user2); // Check if already exists var marr = await context.Marriages.FirstOrDefaultAsync(x => x.Partner1Id == user1 && x.Partner2Id == user2); if (marr != null) { return(new Result <bool, Error>(new Error("You are already married to this person"))); } // Make sure users exists :) await context.Users.GetOrCreateUserNoSaveAsync(user1); await context.Users.GetOrCreateUserNoSaveAsync(user2); var user1Count = await this.GetUserMarriageCount(user1); var user2Count = await this.GetUserMarriageCount(user2); if (user1Count >= _MAX_MARRIAGES || user2Count >= _MAX_MARRIAGES) { return(new Result <bool, Error>(new Error("Marriage limit has been reached"))); } // Otherwise we create it var marriage = new Marriage() { Partner1Id = user1, Partner2Id = user2, PartnerSince = DateTime.UtcNow }; context.Marriages.Add(marriage); await context.SaveChangesAsync(); return(true); }).ConfigureAwait(false);
public async Task <bool> TryUnboxWaifus(ulong userid, List <Waifu> waifus, uint boxCost) { return(await _soraTransactor.TryDoInTransactionAsync(async context => { var user = await context.Users.FindAsync(userid).ConfigureAwait(false); if (user == null) { return false; } // check if enough money if (user.Coins < boxCost) { return false; } // Remove money user.Coins -= boxCost; // Give waifus foreach (var waifu in waifus) { var userWaifu = user.UserWaifus.FirstOrDefault(x => x.WaifuId == waifu.Id); if (userWaifu != null) { userWaifu.Count++; continue; } // otherwise we have to add it userWaifu = new UserWaifu(userid, waifu.Id, 1); user.UserWaifus.Add(userWaifu); } await context.SaveChangesAsync().ConfigureAwait(false); return true; }).ConfigureAwait(false)); }
public async Task <bool> TryTakeAmount(ulong userId, uint amount) { return(await _soraTransactor.TryDoInTransactionAsync(async context => { var user = await context.Users.FindAsync(userId).ConfigureAwait(false); if (user.Coins < amount) { return false; } user.Coins -= amount; await context.SaveChangesAsync().ConfigureAwait(false); return true; }).ConfigureAwait(false)); }
public async Task <bool> SetGuildPrefix(ulong id, string prefix) { // let's at least test this if (string.IsNullOrWhiteSpace(prefix)) { return(false); } return(await _soraTransactor.TryDoInTransactionAsync(async context => { var guild = await GetOrSetAndGetGuild(id, context).ConfigureAwait(false); guild.Prefix = prefix; await context.SaveChangesAsync().ConfigureAwait(false); return true; }).ConfigureAwait(false)); }