From 36e5ddd5af63d350e8ce486c094815036d9c3759 Mon Sep 17 00:00:00 2001 From: Andriy <30056636+West14@users.noreply.github.com> Date: Mon, 14 Nov 2022 00:23:36 +0200 Subject: [PATCH 1/2] [store] refactor, add new purchasables --- Core/Core.csproj | 1 + modules/ContentStore/ContentStore.cs | 2 +- modules/ContentStore/Handler/NSFW.cs | 37 ++++++++++++ modules/ContentStore/Handler/Store.cs | 20 ++++--- modules/ContentStore/Model/RandomMedia.cs | 10 ++-- .../Service/AbstractKittiesService.cs | 59 +++++++++++++++++++ .../ContentStore/Service/GayKittiesService.cs | 14 +++++ .../Service/IRandomMediaService.cs | 4 +- .../Service/StraightKittiesService.cs | 18 ++++++ 9 files changed, 149 insertions(+), 16 deletions(-) create mode 100644 modules/ContentStore/Handler/NSFW.cs create mode 100644 modules/ContentStore/Service/AbstractKittiesService.cs create mode 100644 modules/ContentStore/Service/GayKittiesService.cs create mode 100644 modules/ContentStore/Service/StraightKittiesService.cs diff --git a/Core/Core.csproj b/Core/Core.csproj index afda299..d230e0d 100644 --- a/Core/Core.csproj +++ b/Core/Core.csproj @@ -17,6 +17,7 @@ + diff --git a/modules/ContentStore/ContentStore.cs b/modules/ContentStore/ContentStore.cs index b7a1345..7710d77 100644 --- a/modules/ContentStore/ContentStore.cs +++ b/modules/ContentStore/ContentStore.cs @@ -24,7 +24,7 @@ public class ContentStore : Module { foreach (var serviceType in MediaServiceTypes) { - services.AddSingleton(typeof(IRandomMediaService), serviceType); + services.AddScoped(typeof(IRandomMediaService), serviceType); } } } \ No newline at end of file diff --git a/modules/ContentStore/Handler/NSFW.cs b/modules/ContentStore/Handler/NSFW.cs new file mode 100644 index 0000000..3a5754e --- /dev/null +++ b/modules/ContentStore/Handler/NSFW.cs @@ -0,0 +1,37 @@ +using BotFramework; +using BotFramework.Attributes; +using BotFramework.Enums; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Telegram.Bot; +using Telegram.Bot.Types; + +namespace West.TelegramBot.ContentStore.Handler; + +public class NSFW : BotEventHandler +{ + private readonly CoreContext _db; + + public NSFW(CoreContext db) + { + _db = db; + } + + [Command("nsfw", CommandParseMode.Both)] + public async Task HandleNSFW() + { + var canUse = await Bot.GetChatMemberAsync(Chat.Id, From.Id) is ChatMemberAdministrator { CanDeleteMessages: true } + or ChatMemberOwner; + if (!canUse) + { + return; + } + + var option = await _db.UserValues.FindOrCreateOption(Chat.Id, "AllowNSFW"); + var newValue = !option.GetValue(); + option.SetValue(newValue); + await _db.SaveChangesAsync(); + + await Bot.SendTextMessageAsync(Chat.Id,$"NSFW {(newValue ? "enabled" : "disabled")}"); + } +} \ No newline at end of file diff --git a/modules/ContentStore/Handler/Store.cs b/modules/ContentStore/Handler/Store.cs index 3dd7d85..0850e05 100644 --- a/modules/ContentStore/Handler/Store.cs +++ b/modules/ContentStore/Handler/Store.cs @@ -8,7 +8,6 @@ using Kruzya.TelegramBot.Core.Service; using Microsoft.Extensions.DependencyInjection; using Telegram.Bot; using Telegram.Bot.Types.Enums; -using Telegram.Bot.Types.InputFiles; using Telegram.Bot.Types.ReplyMarkups; using West.TelegramBot.ContentStore.Service; @@ -47,11 +46,14 @@ public class Store : BotEventHandler await Bot.SendTextMessageAsync(Chat.Id, $"{user.ToHtml()} ({reputation}), чего пожелаете?", ParseMode.Html, replyMarkup: new InlineKeyboardMarkup( _provider.GetServices() - .OrderBy(x => x.StoreItem.Order) - .Select(x => x.StoreItem.ToButton(From.Id)) - .Chunk(2) - .ToList() - ) + .ToAsyncEnumerable() + .WhereAwait(async x => await x.CanView(Chat, user)) + .OrderBy(x => x.StoreItem.Order) + .Select(x => x.StoreItem.ToButton(From.Id)) + .ToEnumerable() + .Chunk(2) + .ToList() + ) ); } @@ -110,14 +112,14 @@ public class Store : BotEventHandler ParseMode.Html); var randomMedia = await mediaService!.GetRandomMediaAsync(); - var file = new InputOnlineFile(randomMedia.Url); + var file = randomMedia.File; switch (randomMedia.Type) { case InputMediaType.Photo: - await Bot.SendPhotoAsync(Chat.Id, file, randomMedia.Caption, replyToMessageId: messageId); + await Bot.SendPhotoAsync(Chat.Id, file, randomMedia.Caption, replyToMessageId: messageId, parseMode: ParseMode.Html); break; case InputMediaType.Video: - await Bot.SendVideoAsync(Chat.Id, file, caption: randomMedia.Caption, replyToMessageId: messageId); + await Bot.SendVideoAsync(Chat.Id, file, caption: randomMedia.Caption, replyToMessageId: messageId, parseMode: ParseMode.Html); break; } } diff --git a/modules/ContentStore/Model/RandomMedia.cs b/modules/ContentStore/Model/RandomMedia.cs index dedb55e..d1b3021 100644 --- a/modules/ContentStore/Model/RandomMedia.cs +++ b/modules/ContentStore/Model/RandomMedia.cs @@ -1,17 +1,17 @@ -using Telegram.Bot.Types; -using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types.Enums; +using Telegram.Bot.Types.InputFiles; namespace West.TelegramBot.ContentStore.Model; public class RandomMedia { - public RandomMedia(string url, string? caption = null) + public RandomMedia(InputOnlineFile file, string? caption = null) { - Url = url; + File = file; Caption = caption; } - public string Url; + public InputOnlineFile File; public string? Caption; public InputMediaType Type { get; set; } = InputMediaType.Photo; diff --git a/modules/ContentStore/Service/AbstractKittiesService.cs b/modules/ContentStore/Service/AbstractKittiesService.cs new file mode 100644 index 0000000..411f8b3 --- /dev/null +++ b/modules/ContentStore/Service/AbstractKittiesService.cs @@ -0,0 +1,59 @@ +using System.Net.Http.Headers; +using System.Text; +using BotFramework.Utils; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Microsoft.Extensions.Configuration; +using Telegram.Bot.Types; +using Telegram.Bot.Types.InputFiles; +using West.TelegramBot.ContentStore.Model; + +namespace West.TelegramBot.ContentStore.Service; + +public abstract class AbstractKittiesService : IRandomMediaService +{ + private readonly CoreContext _db; + protected abstract string VideoType { get; } + + public abstract StoreItem StoreItem { get; } + private readonly HttpClient _httpClient; + + protected AbstractKittiesService(IConfiguration configuration, CoreContext db) + { + _db = db; + var section = configuration.GetSection("KittiesService"); + + var uri = section.GetValue("Uri"); + var token = section.GetValue("Token"); + + _httpClient = new HttpClient + { + BaseAddress = uri, + DefaultRequestHeaders = + { + Authorization = new AuthenticationHeaderValue("Bearer", token) + } + }; + } + + public async Task GetRandomMediaAsync() + { + var response = await _httpClient.GetAsync($"v1/{VideoType}"); + var headers = response.Headers; + var videoSource = headers.GetValues("X-Video-Source").FirstOrDefault(string.Empty); + var videoTitleBase64 = headers.GetValues("X-Video-Title").FirstOrDefault(string.Empty); + var videoTitle = Encoding.UTF8.GetString(Convert.FromBase64String(videoTitleBase64)); + + return new RandomMedia( + new InputOnlineFile(await response.Content.ReadAsStreamAsync()), + new HtmlString().Url(videoSource, videoTitle).ToString() + ); + } + + public async Task CanView(Chat chat, User user) + { + var option = await _db.UserValues.FindOrCreateOption(chat.Id, "AllowNSFW"); + + return option.GetValue(false); + } +} \ No newline at end of file diff --git a/modules/ContentStore/Service/GayKittiesService.cs b/modules/ContentStore/Service/GayKittiesService.cs new file mode 100644 index 0000000..1c0bf91 --- /dev/null +++ b/modules/ContentStore/Service/GayKittiesService.cs @@ -0,0 +1,14 @@ +using Kruzya.TelegramBot.Core.Data; +using Microsoft.Extensions.Configuration; +using West.TelegramBot.ContentStore.Model; + +namespace West.TelegramBot.ContentStore.Service; + +public class GayKittiesService : AbstractKittiesService +{ + public GayKittiesService(IConfiguration configuration, CoreContext db) : base(configuration, db) + { + } + + protected override string VideoType => "gay"; + public override StoreItem StoreItem { get; } = new("kitties", "Прон (не геи)", 40, 110);} \ No newline at end of file diff --git a/modules/ContentStore/Service/IRandomMediaService.cs b/modules/ContentStore/Service/IRandomMediaService.cs index 4d63126..2d6060e 100644 --- a/modules/ContentStore/Service/IRandomMediaService.cs +++ b/modules/ContentStore/Service/IRandomMediaService.cs @@ -1,4 +1,5 @@ -using West.TelegramBot.ContentStore.Model; +using Telegram.Bot.Types; +using West.TelegramBot.ContentStore.Model; namespace West.TelegramBot.ContentStore.Service; @@ -7,4 +8,5 @@ public interface IRandomMediaService public StoreItem StoreItem { get; } public Task GetRandomMediaAsync(); + public async Task CanView(Chat chat, User user) => true; } \ No newline at end of file diff --git a/modules/ContentStore/Service/StraightKittiesService.cs b/modules/ContentStore/Service/StraightKittiesService.cs new file mode 100644 index 0000000..181ed85 --- /dev/null +++ b/modules/ContentStore/Service/StraightKittiesService.cs @@ -0,0 +1,18 @@ +using System.Net.Http.Headers; +using BotFramework.Utils; +using Kruzya.TelegramBot.Core.Data; +using Microsoft.Extensions.Configuration; +using Telegram.Bot.Types.InputFiles; +using West.TelegramBot.ContentStore.Model; + +namespace West.TelegramBot.ContentStore.Service; + +public class StraightKittiesService : AbstractKittiesService +{ + protected override string VideoType => "straight"; + public override StoreItem StoreItem { get; } = new("kitties", "Прон", 40, 100); + + public StraightKittiesService(IConfiguration configuration, CoreContext db) : base(configuration, db) + { + } +} \ No newline at end of file From c893992f5b3a9cd6dcef359f33fa2d44ea4f899f Mon Sep 17 00:00:00 2001 From: Andriy <30056636+West14@users.noreply.github.com> Date: Mon, 14 Nov 2022 00:49:56 +0200 Subject: [PATCH 2/2] [store] add nsfw guard for boobs --- modules/ContentStore/Service/AnimBoobsService.cs | 16 ++++++++++++++-- modules/ContentStore/Service/OBoobsService.cs | 16 ++++++++++++++-- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/ContentStore/Service/AnimBoobsService.cs b/modules/ContentStore/Service/AnimBoobsService.cs index ff300b9..4b5ef00 100644 --- a/modules/ContentStore/Service/AnimBoobsService.cs +++ b/modules/ContentStore/Service/AnimBoobsService.cs @@ -1,15 +1,20 @@ -using Telegram.Bot.Types.Enums; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Telegram.Bot.Types; +using Telegram.Bot.Types.Enums; using West.TelegramBot.ContentStore.Model; namespace West.TelegramBot.ContentStore.Service; public class AnimBoobsService : IRandomMediaService { + private readonly CoreContext _db; private readonly HttpClient _httpClient; public StoreItem StoreItem { get; } = new("anim_boobs", "Сиськи движущиеся", 120, 40); - public AnimBoobsService() + public AnimBoobsService(CoreContext db) { + _db = db; _httpClient = new HttpClient() { BaseAddress = new Uri("https://westdev.me/_boobs/") @@ -24,4 +29,11 @@ public class AnimBoobsService : IRandomMediaService Type = InputMediaType.Video }; } + + public async Task CanView(Chat chat, User user) + { + var option = await _db.UserValues.FindOrCreateOption(chat.Id, "AllowNSFW"); + + return option.GetValue(false); + } } \ No newline at end of file diff --git a/modules/ContentStore/Service/OBoobsService.cs b/modules/ContentStore/Service/OBoobsService.cs index f13cf62..450b25c 100644 --- a/modules/ContentStore/Service/OBoobsService.cs +++ b/modules/ContentStore/Service/OBoobsService.cs @@ -1,15 +1,20 @@ -using Newtonsoft.Json; +using Kruzya.TelegramBot.Core.Data; +using Kruzya.TelegramBot.Core.Extensions; +using Newtonsoft.Json; +using Telegram.Bot.Types; using West.TelegramBot.ContentStore.Model; namespace West.TelegramBot.ContentStore.Service; public class OBoobsService : IRandomMediaService { + private readonly CoreContext _db; private readonly HttpClient _httpClient; public StoreItem StoreItem { get; } = new("boobs", "Сиськи", 60, 30); - public OBoobsService() + public OBoobsService(CoreContext db) { + _db = db; _httpClient = new HttpClient { BaseAddress = new Uri("http://api.oboobs.ru") @@ -26,4 +31,11 @@ public class OBoobsService : IRandomMediaService return new RandomMedia($"https://media.oboobs.ru/boobs/{boobsId}.jpg", boobsItem.Model); } + + public async Task CanView(Chat chat, User user) + { + var option = await _db.UserValues.FindOrCreateOption(chat.Id, "AllowNSFW"); + + return option.GetValue(false); + } } \ No newline at end of file