private static async Task Main(string[] args) { var config = Config.Config.Load(Environment.GetEnvironmentVariable("NEKO_USE_TEST_CONFIG") == "true" ? "config.test.yml" : "config.yml"); using var database = new TextFileDatabase(config.DataDir); await database.ConnectAsync(); if (!string.IsNullOrWhiteSpace(config.DiscordWebhook)) { posters.Add(new DiscordWebhookClient(new Uri(config.DiscordWebhook))); } if (!string.IsNullOrWhiteSpace(config.TelegramBotToken)) { posters.Add(new TelegramClient(database, config)); } var moeClient = new NekosMoeClient(); var random = new Random(); var number = random.NextDouble(); var nsfw = number < config.NsfwChance; Console.WriteLine($"NSFW rolled: {number}, configured chance {config.NsfwChance}, nsfw {nsfw}"); var neko = await GetRandomNekoThatHasNotBeenPostedYet(database, moeClient, nsfw); if (posters.Count == 0) { return; } await Task.WhenAll(posters.Select(x => TaskWithExceptionHandling(x.PostAsync(neko)))); await database.PostNekoAsync(neko.Id); }
public async Task PostAsync(Image neko) { var updates = await GetMessageUpdates(); while (updates.Any()) { var offset = await HandleUpdates(updates); updates = await GetMessageUpdates(offset); } string fileId = null; var sb = new StringBuilder(); sb.AppendLine(neko.TagsTruncated()); sb.AppendLine($"nsfw: {(neko.Nsfw ? "yes" : "no")}"); var caption = sb.ToString(); await foreach (var client in db.GetTelegramClientIdsAsync()) { if (fileId == null) { fileId = await SendPhoto(client, NekosMoeClient.GetImageUrlFromId(neko.Id), caption); } else { await SendPhoto(client, fileId, caption); } } }
public async Task PostAsync(Image neko) { var request = new RestRequest(Method.POST); request.AddHeader("Content-Type", "application/json"); var sb = new StringBuilder(); sb.AppendLine(NekosMoeClient.GetImageUrlFromId(neko.Id)); sb.AppendLine(neko.TagsTruncated()); sb.Append($"nsfw: **{(neko.Nsfw ? "yes" : "no")}**"); request.AddJsonBody(new { content = sb.ToString() }); await c.ExecutePostAsync(request); }
private static async Task <Image> GetRandomNekoThatHasNotBeenPostedYet(INekoDatabase database, NekosMoeClient client, bool nsfw) { while (true) { // TODO handle rate limiting var nekos = await client.GetRandomNekos(nsfw, 50); foreach (var neko in nekos.Images) { if (await database.HasBeenPostedAsync(neko.Id)) { continue; } return(neko); } } }