Esempio n. 1
0
        public async Task <bool> Process(BaseController baseController, Func <string, Task> callback)
        {
            var comment = baseController as Comment;

            if (comment == null || !comment.Body.StartsWith("!wikify") || comment.Depth != 0)
            {
                return(false);
            }

            if (!_service.Subreddit.Moderators.Any(m => m.Name.Equals(comment.Author)))
            {
                return(false);
            }

            var result = await _service.SelfCommentDatabase.GetAny(nameof(SelfComment.ParentId), comment.Id);

            if (result != null)
            {
                return(false);
            }

            if (!DryRun)
            {
                var commandParts = Regex.Split(comment.Body, "(?<=^[^\"]*(?:\"[^\"]*\"[^\"]*)*) (?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)");
                if (commandParts.Length == 3)
                {
                    if (commandParts[1] == "review")
                    {
                        var knifeName  = commandParts[2].Trim('"');
                        var post       = _service.Subreddit.Post(comment.ParentFullname).Info();
                        var rewiewPage = new ReviewPage(_logger, _service);
                        rewiewPage.AddReviewLinkToReviewPage(knifeName, post.Author, post.Title, $"{_urlRoute}{post.Listing.Permalink}");

                        var replyComment = comment
                                           .Reply("Added to the wiki: https://www.reddit.com/r/chefknives/wiki/reviews")
                                           .Distinguish("yes");

                        _service.SelfCommentDatabase.Upsert(replyComment.ToSelfComment(comment.Id, RedditThingType.Comment, comment.Listing.AuthorFlairTemplateId));
                    }
                }
            }

            _logger.Information($"[{nameof(WikifyCommentHandler)}]: Commented on command: {comment.Body}");

            return(true);
        }
Esempio n. 2
0
        public static async Task Main(string[] args)
        {
            var initialConfiguration = new ConfigurationBuilder()
                                       .AddJsonFile("appsettings.json", false, false)
                                       .Build();

            var ChefKnivesSettingsFile = Environment.ExpandEnvironmentVariables(initialConfiguration["ChefKnivesSettingsFile"]);
            var compoundConfiguration  = new ConfigurationBuilder()
                                         .AddJsonFile("appsettings.json", false, true);

            if (!string.IsNullOrEmpty(ChefKnivesSettingsFile))
            {
                compoundConfiguration.AddJsonFile(ChefKnivesSettingsFile, true, false);
            }

            _configuration = compoundConfiguration.Build();

            Log.Logger = new LoggerConfiguration()
                         .WriteTo.File("Logs/.log", rollingInterval: RollingInterval.Day)
                         .CreateLogger();

            if (args.Any(a => a.Equals("--seedchefknives")))
            {
                Console.WriteLine("Action: Seed for chefknives. Press any key to continue...");
                Console.ReadLine();
                await SeedFor("chefknives");
            }
            else if (args.Any(a => a.Equals("--testchefknivesbot")))
            {
                Console.WriteLine("Running ChefKnivesBot on r/zapatodefuego.");
                Console.WriteLine("Press any key to exit...");

                var service = new TestSubredditBotInitializer().Start(Log.Logger, _configuration, false);
                InitializeTestServiceFunctions(Log.Logger, service, false);

                Console.ReadKey();
                service.Dispose();
            }
            else if (args.Any(a => a.Equals("--chefkniveswiki")))
            {
                Console.WriteLine("Executing wiki functions");
                var service = new TestSubredditBotInitializer().Start(Log.Logger, _configuration, false);

                var reviewPage = new ReviewPage(Log.Logger, service);
                reviewPage.AddReviewLinkToReviewPage("A", "zapatodefuego", "test entry 0", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("B", "zapatodefuego", "test entry 1", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("C", "zapatodefuego", "test entry 2", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("X", "zapatodefuego", "test entry 3", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("Y", "zapatodefuego", "test entry 4", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("Z", "zapatodefuego", "test entry 5", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");

                reviewPage.AddReviewLinkToReviewPage("A", "zapatodefuego", "test entry 10", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("B", "zapatodefuego", "test entry 11", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("C", "zapatodefuego", "test entry 12", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("X", "zapatodefuego", "test entry 13", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("Y", "zapatodefuego", "test entry 14", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
                reviewPage.AddReviewLinkToReviewPage("Z", "zapatodefuego", "test entry 15", "https://www.reddit.com/r/chefknives/wiki/edit/reviews");
            }
            else if (args.Any(a => a.Equals("--reprocessmongo")))
            {
                var mongoClient = new MongoClient(_configuration["ConnectionString"]);
                var collection  = mongoClient.GetDatabase("chefknives").GetCollection <BsonDocument>("comments");
                //var redditComments = collection.Find(Builders<BsonDocument>.Filter.Eq("_t", "RedditComment")).ToList();
                //foreach (var redditComment in redditComments)
                //{
                //    var comment = BsonSerializer.Deserialize<Comment>(redditComment);
                //    var bson = comment.ToBsonDocument();
                //    bson.InsertAt(1, new BsonElement("_t", "Comment"));
                //    collection.ReplaceOne(
                //        filter: new BsonDocument("_id", comment.Id),
                //        options: new ReplaceOptions { IsUpsert = true },
                //        replacement: bson);
                //}

                //var bsonResults = collection.AsQueryable();
                //foreach (var r in bsonResults)
                //{
                //    var s = r.GetValue("Author");
                //    var ss = s.AsString.ToLower();
                //}
            }
            else if (args.Any(a => a.Equals("--wordcloud")))
            {
                var mongoClient = new MongoClient(_configuration["ConnectionString"]);
                var collection  = mongoClient.GetDatabase("chefknives").GetCollection <BsonDocument>("posts");
                var makerPosts  = collection
                                  .Find(Builders <BsonDocument>
                                        .Filter.Eq("Flair", "Maker Post"))
                                  .ToList()
                                  .Select(b => BsonSerializer.Deserialize <Post>(b));

                var cloud = new Dictionary <string, int>();
                foreach (var makerPost in makerPosts)
                {
                    var words = makerPost.Title.Split(' ', StringSplitOptions.RemoveEmptyEntries).ToList();

                    words.ForEach(w =>
                    {
                        var word = w.ToLower().Trim();
                        if (cloud.TryGetValue(word, out int value))
                        {
                            cloud[word]++;
                        }
                        else
                        {
                            cloud.Add(word, 1);
                        }
                    });
                }

                var builder = new StringBuilder();
                foreach (var kvp in from entry in cloud orderby entry.Value descending select entry)
                {
                    builder.AppendLine($"{kvp.Key} {kvp.Value}");
                }

                File.WriteAllText("out.txt", builder.ToString());
            }
        }