public async Task BecomeGodfather(IUser actor, IUserShim targetShim) { var target = await targetShim.Load(); using (var context = await ContextProvider.Connect()) using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable)) { var godfather = await context.Users.Include(u => u.Membership).SingleAsync(u => u.Id == actor.UserId); // if godfather is not a real member, this method call was super duper obsolete if (godfather.Membership == null) { return; } var guest = await context.Users.Include(u => u.Membership).Include(u => u.GuestInvite) .Include(u => u.PersistentGuest.Godfathers).SingleAsync(u => u.Id == target.UserId); if (guest.PersistentGuest == null) { // only guests can be promoted to persistentguests if (guest.GuestInvite == null) { return; } guest.PersistentGuest = new PersistentGuest { OriginalInvite = guest.GuestInvite, }; guest.GuestInvite = null; CertificateCredentials creds; if (Fancyauth.GuestCredentials.TryGetValue(target.UserId, out creds)) { guest.CertCredentials.Add(creds); } else { await actor.SendMessage("No certificate found."); return; } } // ignore the nop case if (guest.PersistentGuest.Godfathers.Contains(godfather.Membership)) { return; } guest.PersistentGuest.Godfathers.Add(godfather.Membership); await context.SaveChangesAsync(); transact.Commit(); } await target.SendMessage("Irgendwann - möglicherweise aber auch nie - werde ich dich bitten, mir eine kleine Gefälligkeit zu erweisen."); }
public async Task Invite(IUser usr) { var rand = new byte[42]; InviteRng.GetBytes(rand); var codeBuilder = new StringBuilder(rand.Length); for (int i = 0; i < rand.Length; i++) { codeBuilder.Append(PwdChars[rand[i] & PwdIndexMask]); } var code = codeBuilder.ToString(); using (var context = await ContextProvider.Connect()) { context.Invites.Add(new Invite { Code = code, Inviter = context.Users.Attach(new User { Id = usr.UserId }), ExpirationDate = DateTimeOffset.Now.AddHours(1), }); await context.SaveChangesAsync(); } await usr.SendMessage("Invite code: " + code); }
public async Task RevokeGodfather(IUser actor, string targetName) { using (var context = await ContextProvider.Connect()) using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable)) { var guest = await context.Users.Include(u => u.GuestInvite).Include(u => u.PersistentGuest.Godfathers) .SingleAsync(u => u.Name == targetName); // if guest is not a persistent guest, why the heck did someone call this method if (guest.PersistentGuest == null) { await actor.SendMessage("How about no."); transact.Commit(); return; } var membership = guest.PersistentGuest.Godfathers.Single(m => m.UserId == actor.UserId); if (membership != null) { guest.PersistentGuest.Godfathers.Remove(membership); // no godfather anymore --> downgrade to regular guest if (guest.PersistentGuest.Godfathers.Count == 0) { guest.GuestInvite = guest.PersistentGuest.OriginalInvite; context.PersistentGuests.Remove(guest.PersistentGuest); context.CertificateCredentials.RemoveRange(guest.CertCredentials); guest.PersistentGuest = null; guest.CertCredentials.Clear(); await actor.SendMessage("Removed. Downgraded to a normal guest."); } else { await actor.SendMessage("Removed. User is still a persistent guest though."); } } else { await actor.SendMessage("He was never yours anyways."); } await context.SaveChangesAsync(); transact.Commit(); } }
public async Task Integrate(IUser actor, IUserShim targetShim) { var target = await targetShim.Load(); using (var context = await ContextProvider.Connect()) using (var transact = context.Database.BeginTransaction(IsolationLevel.Serializable)) { var targetEntity = await context.Users.Include(x => x.Membership).Include(x => x.PersistentGuest) .Include(x => x.GuestInvite).SingleAsync(x => x.Id == target.UserId); var actorEntity = await context.Users.Include(x => x.Membership).Include(x => x.PersistentGuest) .Include(x => x.GuestInvite).Include(x => x.CertCredentials) .SingleAsync(x => x.Id == actor.UserId); // reqiurements: // * a member // * targets a non-member // * specifically, a non-persistent guest if ((targetEntity.Membership != null) || (targetEntity.PersistentGuest != null) || (actorEntity.Membership == null)) { await actor.SendMessage("Integration denied."); return; } CertificateCredentials creds; if (Fancyauth.GuestCredentials.TryGetValue(target.UserId, out creds)) { actorEntity.CertCredentials.Add(creds); } else { await actor.SendMessage("No certificate found."); return; } await context.SaveChangesAsync(); transact.Commit(); } await targetShim.Kick("You have been integrated into " + actor.Name); }