public async Task Suspend([Name("Gebruiker")] SocketUser user, [Name("Smeu"), Remainder] string smeu) { using (var typing = Context.Channel.EnterTypingState()) { // find the given smeu in the duplicates list Duplicate duplicate; using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { duplicate = (from d in database.Duplicates where d.Author == user.Id && d.Suspension == null && d.Original.Smeu == smeu select d).FirstOrDefault(); } if (duplicate == null) { // if no such duplicate exists, return this to the user await ReplyAsync("Nee, dat klopt niet.").ConfigureAwait(false); return; } // try suspend the user on this ground if (await smeuService.SuspendAsync(user.Id, Context.User.Id, $"{smeu} is al eerder genoemd.", duplicate)) { // reply with success await ReplyAsync($"{user.Mention} is nu **af**!").ConfigureAwait(false); } else { // reply with failure await ReplyAsync($"{user.Username} is al af!").ConfigureAwait(false); } } }
public async Task <bool> SuspendAsync(ulong user, ulong suspender, string reason, Duplicate duplicate = null) { if (GetUserSuspension(user) != null) { // if user is already suspended, return feedback to user return(false); } // if there is no suspension, add one to the database using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { Suspension suspension = new Suspension { User = user, Date = DateTime.UtcNow, Suspender = suspender, Reason = reason }; database.Suspensions.Add(suspension); if (duplicate != null) { // if a duplicate was given, update the duplicate to reflect the suspension duplicate.Suspension = suspension; database.Duplicates.Update(duplicate); } await database.SaveChangesAsync().ConfigureAwait(false); } return(true); }
public async Task Suspend([Name("Gebruiker")] SocketUser user, [Name("Smeu"), Remainder] string smeu) { using (var typing = Context.Channel.EnterTypingState()) { Duplicate duplicate; using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { duplicate = (from d in database.Duplicates where d.Author == user.Id && d.Suspension == null && d.Original.Smeu == smeu select d).FirstOrDefault(); } if (duplicate == null) { await ReplyAsync("Nee, dat klopt niet."); return; } if (await smeuService.SuspendAsync(user.Id, Context.User.Id, $"{smeu} is al eerder genoemd.", duplicate)) { await ReplyAsync($"{user.Mention} is nu **af**!"); } else { await ReplyAsync($"{user.Username} is al af!"); } } }
public async Task <bool> AddAsync(string smeu, DateTime date, ulong author, ulong messageid) { // has the smeu been submitted before? using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { Submission dbresult = (from s in database.Submissions where s.Smeu == smeu orderby s.Date select s).FirstOrDefault(); if (dbresult != null) { // create a duplicate if an original already exists database.Duplicates.Add(new Duplicate { Author = author, Date = date, MessageId = messageid, Original = dbresult }); await database.SaveChangesAsync().ConfigureAwait(false); return(false); } else { // otherwise add it to the database database.Submissions.Add(new Submission { Author = author, Date = date, MessageId = messageid, Smeu = smeu }); await database.SaveChangesAsync().ConfigureAwait(false); return(true); } } }
public async Task GetSuspensions() { using (var typing = Context.Channel.EnterTypingState()) { using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { // get all suspensions var dbresult = from s in database.Suspensions where s.Revoker == null select s; // if nobody is suspended, notify the user about that if (dbresult.Count() == 0) { await ReplyAsync("Er is op dit moment helemaal niemand af!"); } else { // present the suspensions in an embed EmbedBuilder eb = new EmbedBuilder() .WithTitle("Deze mensen zijn **af**:") .WithColor(Color.DarkRed); foreach (Suspension suspension in dbresult) { eb.AddField(client.GetUser(suspension.User).Username, suspension); } await ReplyAsync(embed : eb.Build()); } } } }
private async Task AddPendingSmeuToChat() { // get the smeu channel and add all the un-assigned smeu to it if (!(client.GetChannel(settings.SmeuChannelId) is IMessageChannel smeuChannel)) { await logger.LogAsync(new LogMessage(LogSeverity.Warning, "RestoreService", $"Could not restore pending smeu, because something went wrong while acquiring the smeu text channel")).ConfigureAwait(false); return; } using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { // get all unassigned smeu from the chat var dbresult = from s in database.Submissions where s.MessageId == 0 select s; await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", $"Found {dbresult.Count()} smeu to restore.")).ConfigureAwait(false); foreach (Submission submission in dbresult) { // send all unassigned smeu to the chat and update the database IUserMessage msg = await smeuChannel.SendMessageAsync(submission.Smeu).ConfigureAwait(false); submission.MessageId = msg.Id; } database.Submissions.UpdateRange(dbresult); await database.SaveChangesAsync().ConfigureAwait(false); await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", "All smeu are restored")).ConfigureAwait(false); } }
private Suspension GetUserSuspension(ulong user) { // check if there is an entry in the suspensions table for given user using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { return((from s in database.Suspensions where s.Revoker == null && s.User == user select s).FirstOrDefault()); } }
public async Task RestoreAsync() { await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", "Start database migration")); try { using (SmeuContext context = smeuBaseFactory.GetSmeuBase()) { context.Database.Migrate(); } } catch (Exception e) { await logger.LogAsync(new LogMessage(LogSeverity.Critical, "RestoreService", "Attempted to migrate the database, but failed.", e)); Environment.Exit(-1); } await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", "Database migrated")); }
public async Task <bool> UnsuspendAsync(ulong user, ulong revoker) { Suspension suspension; if ((suspension = GetUserSuspension(user)) == null) { // if there is no suspension, return feedback to the user return(false); } else { // if there is a suspension, add the revoker to it. suspension.Revoker = revoker; using (SmeuContext context = smeuBaseFactory.GetSmeuBase()) { context.Suspensions.Update(suspension); await context.SaveChangesAsync().ConfigureAwait(false); } return(true); } }
public async Task RestoreAsync() { await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", "Start database migration")).ConfigureAwait(false); try { // try to migrate the database to the latest version using (SmeuContext context = smeuBaseFactory.GetSmeuBase()) { context.Database.Migrate(); } } catch (Exception e) { // log failure and stop the application await logger.LogAsync(new LogMessage(LogSeverity.Critical, "RestoreService", "Attempted to migrate the database, but failed.", e)).ConfigureAwait(false); Environment.Exit(-1); } await logger.LogAsync(new LogMessage(LogSeverity.Info, "RestoreService", "Database migrated")).ConfigureAwait(false); }
public async Task <bool> RemoveAsync(string smeu, ulong author) { using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { // first check if this combination is a duplicate Duplicate duplicate = (from d in database.Duplicates where d.Author == author && d.Original.Smeu == smeu orderby d.Date descending select d).FirstOrDefault(); if (duplicate != null) { // remove the duplicate IMessage msg = await(client.GetChannel(settings.SmeuChannelId) as IMessageChannel).GetMessageAsync(duplicate.MessageId).ConfigureAwait(false); await msg.DeleteAsync().ConfigureAwait(false); database.Duplicates.Remove(duplicate); await database.SaveChangesAsync().ConfigureAwait(false); return(true); } // check if there is an original Submission submission = await(from s in database.Submissions where s.Author == author && s.Smeu == smeu select s).Include(x => x.Duplicates).FirstOrDefaultAsync().ConfigureAwait(false); if (submission != null) { // remove the original message IMessage msg = await(client.GetChannel(settings.SmeuChannelId) as IMessageChannel).GetMessageAsync(submission.MessageId).ConfigureAwait(false); await msg.DeleteAsync().ConfigureAwait(false); // check if a duplicate must take this submission's place if (submission.Duplicates.Count > 0) { // if so, take the oldest duplicate and change the details of the submission to these. duplicate = (from d in submission.Duplicates orderby d.Date ascending select d).First(); submission.Author = duplicate.Author; submission.Date = duplicate.Date; submission.MessageId = duplicate.MessageId; database.Submissions.Update(submission); database.Duplicates.Remove(duplicate); } else { // if not, just remove the submission from the database database.Submissions.Remove(submission); } await database.SaveChangesAsync().ConfigureAwait(false); return(true); } // if there was no duplicate and no original, return failure return(false); } }
private Embed GatherSmeuData(string input) { // create embed for given word EmbedBuilder eb = new EmbedBuilder() .WithTitle($"__{input}__") .WithColor(Color.LightOrange); // find existing submission in database Submission submission; using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { submission = (from s in database.Submissions where s.Smeu == input select s).FirstOrDefault(); } // add potential existing submission to the embed if (submission != null) { SocketUser user = client.GetUser(submission.Author); eb = eb.WithThumbnailUrl(user.GetAvatarUrl()); eb.AddField("Auteur", user.Username); eb.AddField("Datum", $"{submission.Date:d-MMMM-yyyy H:mm} UTC"); eb.AddField("\u200B", "\u200B"); } // add similar smeu to the embed using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { // find the similar smeu and sort them by similarity var top = from s in database.Submissions let d = Levenshtein.GetLevenshteinDistance(s.Smeu, input) where s.Smeu != input && d <= 4 orderby d, s.Smeu select new { Submission = s, Similarity = d }; int i = 0; StringBuilder sbsmeu = new StringBuilder(); StringBuilder sbsimilarity = new StringBuilder(); if (top.Any()) { foreach (var r in top) { // add each similar smeu and its similarity value to the embed, up to 5 smeu sbsmeu.AppendLine(r.Submission.Smeu); sbsimilarity.AppendLine($"({Math.Round(Levenshtein.GetSimilarity(r.Submission.Smeu, input, r.Similarity) * 100)}%)"); i++; if (i > 4) { break; } } // apply stringbuilders to embed eb.AddField("Vergelijkbaar met:", sbsmeu.ToString(), true); eb.AddField("\u200B", sbsimilarity.ToString(), true); } else { // show it if there are no similar smeu eb.AddField("Vergelijkbaar met:", "*Geen vergelijkbare smeu*"); } } // return the result return(eb.Build()); }
public SmeuService(SmeuContext smeuContext) { this.smeuContext = smeuContext ?? throw new ArgumentNullException(nameof(smeuContext)); }
private async Task <Embed> GatherSmeuData(string input) { // create embed for given word EmbedBuilder eb = new EmbedBuilder() .WithTitle($"__{input}__") .WithColor(Color.LightOrange); IEnumerable <EmbedFieldBuilder> similarFields = new EmbedFieldBuilder[0]; IEnumerable <EmbedFieldBuilder> SubmissionFields = new EmbedFieldBuilder[0]; // Run a task that finds similar smeu Task similarSmeuTask = Task.Run(() => { // find similars List <(Submission, float)> similars = GetSimilarSmeu(input); if (similars.Any()) { // if there are any similar smeu, create fields for the smeu and their similarity value similarFields = new EmbedFieldBuilder[] { new EmbedFieldBuilder { IsInline = true, Name = "Vergelijkbaar met", Value = string.Join("\n", similars.Select(s => s.Item1.Smeu)) }, new EmbedFieldBuilder { IsInline = true, Name = "\u200B", Value = string.Join("\n", similars.Select(x => Math.Round(x.Item2 * 100).ToString() + "%")) } }; } else { // if there are no similar smeu, just create one field with indicating that there are no similar smeu similarFields = new EmbedFieldBuilder[] { new EmbedFieldBuilder { IsInline = true, Name = "Vergelijkbaar met", Value = "*Geen vergelijkbare smeu*" } }; } }); Task submissionTask = Task.Run(() => { // find existing submission in database Submission submission; using (SmeuContext database = smeuBaseFactory.GetSmeuBase()) { submission = (from s in database.Submissions where s.Smeu == input select s).FirstOrDefault(); } // add potential existing submission to the embed if (submission != null) { SocketUser user = client.GetUser(submission.Author); eb.WithThumbnailUrl(user.GetAvatarUrl()); SubmissionFields = new EmbedFieldBuilder[] { new EmbedFieldBuilder { Name = "Autheur", Value = user.Username }, new EmbedFieldBuilder { Name = "Datum", Value = $"{submission.Date:d-MMMM-yyyy H:mm} UTC" }, new EmbedFieldBuilder { Name = "\u200B", Value = "\u200B" } }; }