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);
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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!");
                }
            }
        }
Beispiel #4
0
        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);
                }
            }
        }
Beispiel #5
0
            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());
                        }
                    }
                }
            }
Beispiel #6
0
        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);
            }
        }
Beispiel #7
0
 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());
     }
 }
Beispiel #8
0
        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"));
        }
Beispiel #9
0
        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);
            }
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
        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);
            }
        }
Beispiel #12
0
            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());
            }
Beispiel #13
0
 public SmeuService(SmeuContext smeuContext)
 {
     this.smeuContext = smeuContext ?? throw new ArgumentNullException(nameof(smeuContext));
 }
Beispiel #14
0
            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"
                            }
                        };
                    }