public async Task SetUserAfk(ulong userId, string message) => await _soraTransactor.DoInTransactionAsync(async context => { var user = await context.Users.GetOrCreateUserNoSaveAsync(userId).ConfigureAwait(false); if (user.Afk == null) { var afk = new Afk() { UserId = userId, Message = message }; user.Afk = afk; } else { user.Afk.Message = message; } await context.SaveChangesAsync().ConfigureAwait(false); }).ConfigureAwait(false);
public async Task Away([Summary("Time and/or Reason")][Remainder] string reason = null) { using (var db = new NeoContext()) { if (db.Afks.Any(afk => afk.User == db.Users.FirstOrDefault(u => u.Id == Context.User.Id))) //user is afk so he is back now { var obj = db.Afks.FirstOrDefault(afk => afk.User == db.Users.FirstOrDefault(u => u.Id == Context.User.Id)); if (string.IsNullOrEmpty(obj?.Reason)) { var embed = NeoEmbeds.Afk($"{Context.User} is back!", Context.User); await ReplyAsync("", false, embed.Build()); } else { var embed = NeoEmbeds.Afk($"{Context.User} is back from {obj.Reason.TrimStart()}!", Context.User); await ReplyAsync("", false, embed.Build()); } db.Afks.Attach(obj ?? throw new InvalidOperationException()); db.Afks.Remove(obj); db.SaveChanges(); } else { var obj = new Afk(); if (reason != null) // there is time and or reason { var time = reason.Substring(0, reason.IndexOf(' ') <= -1 ? reason.Length : reason.IndexOf(' ')); // get first block if (CheckTimeString(time)) //check if first block is time string { var timestr = HandleTime(time); //get timespan from that block reason = reason.Replace(time, ""); //get time out of reason if (reason.Length == 0) { var embed = NeoEmbeds.Afk($"{Context.User} is now afk!", Context.User, null, Thing(timestr)); await ReplyAsync("", false, embed.Build()); obj.Reason = null; obj.Time = (DateTime.Now + timestr); obj.User = db.Users.FirstOrDefault(u => u.Id == Context.User.Id); } else { var embed = NeoEmbeds.Afk($"{Context.User} is now afk!", Context.User, reason, Thing(timestr)); await ReplyAsync("", false, embed.Build()); obj.Reason = reason; obj.Time = (DateTime.Now + timestr); obj.User = db.Users.FirstOrDefault(u => u.Id == Context.User.Id); } } else //no time just reason { var embed = NeoEmbeds.Afk($"{Context.User} is now afk!", Context.User, reason); await ReplyAsync("", false, embed.Build()); obj.Reason = reason; obj.Time = default(DateTime); obj.User = db.Users.FirstOrDefault(u => u.Id == Context.User.Id); } } else //no reason and time { var embed = NeoEmbeds.Afk($"{Context.User} is now afk!", Context.User); await ReplyAsync("", false, embed.Build()); obj.Reason = null; obj.Time = default(DateTime); obj.User = db.Users.FirstOrDefault(u => u.Id == Context.User.Id); } db.Afks.Add(obj); db.SaveChanges(); } } }