[store] refactor, add new purchasables

This commit is contained in:
Andriy
2022-11-14 00:23:36 +02:00
parent c50d5f63ba
commit 36e5ddd5af
9 changed files with 149 additions and 16 deletions
+1
View File
@@ -17,6 +17,7 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="6.0.0" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="6.0.0" />
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
</ItemGroup>
</Project>
+1 -1
View File
@@ -24,7 +24,7 @@ public class ContentStore : Module
{
foreach (var serviceType in MediaServiceTypes)
{
services.AddSingleton(typeof(IRandomMediaService), serviceType);
services.AddScoped(typeof(IRandomMediaService), serviceType);
}
}
}
+37
View File
@@ -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<bool>();
option.SetValue(newValue);
await _db.SaveChangesAsync();
await Bot.SendTextMessageAsync(Chat.Id,$"NSFW {(newValue ? "enabled" : "disabled")}");
}
}
+6 -4
View File
@@ -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,8 +46,11 @@ public class Store : BotEventHandler
await Bot.SendTextMessageAsync(Chat.Id, $"<b>{user.ToHtml()} ({reputation})</b>, чего пожелаете?", ParseMode.Html,
replyMarkup: new InlineKeyboardMarkup(
_provider.GetServices<IRandomMediaService>()
.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;
}
}
+5 -5
View File
@@ -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;
@@ -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>("Uri");
var token = section.GetValue<string>("Token");
_httpClient = new HttpClient
{
BaseAddress = uri,
DefaultRequestHeaders =
{
Authorization = new AuthenticationHeaderValue("Bearer", token)
}
};
}
public async Task<RandomMedia> 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<bool> CanView(Chat chat, User user)
{
var option = await _db.UserValues.FindOrCreateOption(chat.Id, "AllowNSFW");
return option.GetValue(false);
}
}
@@ -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);}
@@ -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<RandomMedia> GetRandomMediaAsync();
public async Task<bool> CanView(Chat chat, User user) => true;
}
@@ -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)
{
}
}