[store] Reduce amount of hardcoded values.

This commit is contained in:
West14
2022-02-16 18:08:02 +02:00
parent d99c71c07c
commit cd8b25bcb8
9 changed files with 32 additions and 46 deletions
+5 -5
View File
@@ -8,25 +8,25 @@ namespace West.TelegramBot.ContentStore;
public class ContentStore : Module public class ContentStore : Module
{ {
private readonly List<Type> _mediaServiceTypes = new(); public readonly List<Type> MediaServiceTypes = new();
public ContentStore(Core core) : base(core) public ContentStore(Core core) : base(core)
{ {
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{ {
foreach (var exportedType in assembly.GetExportedTypes() foreach (var exportedType in assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && t.IsSubclassOf(typeof(IRandomMediaService)))) .Where(t => !t.IsAbstract && t.GetInterface(nameof(IRandomMediaService)) != null))
{ {
_mediaServiceTypes.Add(exportedType); MediaServiceTypes.Add(exportedType);
} }
} }
} }
public override void ConfigureServices(IServiceCollection services) public override void ConfigureServices(IServiceCollection services)
{ {
foreach (var serviceType in _mediaServiceTypes) foreach (var serviceType in MediaServiceTypes)
{ {
services.AddSingleton(serviceType); services.AddSingleton(typeof(IRandomMediaService), serviceType);
} }
} }
} }
+9 -28
View File
@@ -19,19 +19,13 @@ public class Store : BotEventHandler
{ {
private readonly IReputation? _reputation; private readonly IReputation? _reputation;
private readonly IServiceProvider _provider; private readonly IServiceProvider _provider;
private readonly ContentStore _store;
private readonly Dictionary<string, StoreItem> _storeItemMap = new() public Store(IServiceProvider provider, ContentStore store)
{
{ "cat", new StoreItem("cat", "Котэ", 40) },
{ "dog", new StoreItem("dog", "Пёсель", 40) },
{ "boobs", new StoreItem("boobs", "Сиськи", 60) },
{ "anim_boobs", new StoreItem("anim_boobs", "Сиськи движущиеся", 120) }
};
public Store(IServiceProvider provider)
{ {
_reputation = provider.GetService<IReputation>(); _reputation = provider.GetService<IReputation>();
_provider = provider; _provider = provider;
_store = store;
} }
[Command(InChat.Public, "store", CommandParseMode.Both)] [Command(InChat.Public, "store", CommandParseMode.Both)]
@@ -47,9 +41,9 @@ public class Store : BotEventHandler
var counter = 0; var counter = 0;
var list = new List<InlineKeyboardButton>(); var list = new List<InlineKeyboardButton>();
foreach (var item in _storeItemMap) foreach (var item in _provider.GetServices<IRandomMediaService>())
{ {
var btn = item.Value.ToButton(From.Id); var btn = item.StoreItem.ToButton(From.Id);
if ((counter & 1) == 0) // 0 - even, 1 - odd if ((counter & 1) == 0) // 0 - even, 1 - odd
{ {
list = new List<InlineKeyboardButton> list = new List<InlineKeyboardButton>
@@ -97,13 +91,13 @@ public class Store : BotEventHandler
var purchaseType = paramList[3]; var purchaseType = paramList[3];
answer = "Спасибо за покупку"; answer = "Спасибо за покупку";
if (!_storeItemMap.TryGetValue(purchaseType, out var storeItem) if (!TryGetMediaService(purchaseType, out var mediaService))
|| !TryGetMediaService(purchaseType, out var mediaService))
{ {
await AnswerQuery(query.Id, "Unknown purchasable."); await AnswerQuery(query.Id, "Unknown purchasable.");
return; return;
} }
var storeItem = mediaService.StoreItem;
var messageId = query.Message!.MessageId; var messageId = query.Message!.MessageId;
if (await _reputation.GetUserReputationAsync(Chat, From) < storeItem.Price) if (await _reputation.GetUserReputationAsync(Chat, From) < storeItem.Price)
{ {
@@ -140,22 +134,9 @@ public class Store : BotEventHandler
private bool TryGetMediaService(string name, out IRandomMediaService? mediaService) private bool TryGetMediaService(string name, out IRandomMediaService? mediaService)
{ {
var serviceType = name switch mediaService = _provider.GetServices<IRandomMediaService>()
{ .FirstOrDefault(s => s.StoreItem.Id == name);
"boobs" => typeof(OBoobsService),
"cat" => typeof(CatApiService),
"dog" => typeof(DogApiService),
"anim_boobs" => typeof(AnimBoobsService),
_ => null
};
if (serviceType == null)
{
mediaService = null;
return false;
}
mediaService = _provider.GetService(serviceType) as IRandomMediaService;
return mediaService != null; return mediaService != null;
} }
+1 -1
View File
@@ -2,7 +2,7 @@
namespace West.TelegramBot.ContentStore.Model; namespace West.TelegramBot.ContentStore.Model;
class StoreItem public class StoreItem
{ {
public string Id; public string Id;
public readonly string Name; public readonly string Name;
@@ -1,5 +1,4 @@
using Telegram.Bot.Types; using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.Enums;
using West.TelegramBot.ContentStore.Model; using West.TelegramBot.ContentStore.Model;
namespace West.TelegramBot.ContentStore.Service; namespace West.TelegramBot.ContentStore.Service;
@@ -7,6 +6,7 @@ namespace West.TelegramBot.ContentStore.Service;
public class AnimBoobsService : IRandomMediaService public class AnimBoobsService : IRandomMediaService
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
public StoreItem StoreItem { get; } = new("boobs", "Сиськи движущиеся", 120);
public AnimBoobsService() public AnimBoobsService()
{ {
@@ -6,6 +6,7 @@ namespace West.TelegramBot.ContentStore.Service;
public abstract class AnimalAsAService : IRandomMediaService public abstract class AnimalAsAService : IRandomMediaService
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
public abstract StoreItem StoreItem { get; }
protected AnimalAsAService(Uri baseAddress) protected AnimalAsAService(Uri baseAddress)
{ {
@@ -15,6 +16,7 @@ public abstract class AnimalAsAService : IRandomMediaService
}; };
} }
public async Task<RandomMedia> GetRandomMediaAsync() public async Task<RandomMedia> GetRandomMediaAsync()
{ {
var resp = await _httpClient.GetAsync("images/search"); var resp = await _httpClient.GetAsync("images/search");
@@ -1,10 +1,9 @@
using Newtonsoft.Json; using West.TelegramBot.ContentStore.Model;
using Telegram.Bot.Types;
using West.TelegramBot.ContentStore.Model;
namespace West.TelegramBot.ContentStore.Service; namespace West.TelegramBot.ContentStore.Service;
public class CatApiService : AnimalAsAService public class CatApiService : AnimalAsAService
{ {
public override StoreItem StoreItem { get; } = new("cat", "Котэ", 40);
public CatApiService() : base(new Uri("https://api.thecatapi.com/v1/")) {} public CatApiService() : base(new Uri("https://api.thecatapi.com/v1/")) {}
} }
@@ -1,6 +1,9 @@
namespace West.TelegramBot.ContentStore.Service; using West.TelegramBot.ContentStore.Model;
namespace West.TelegramBot.ContentStore.Service;
public class DogApiService : AnimalAsAService public class DogApiService : AnimalAsAService
{ {
public override StoreItem StoreItem { get; } = new("dog", "Пёсель", 40);
public DogApiService() : base(new Uri("https://api.thedogapi.com/v1/")) {} public DogApiService() : base(new Uri("https://api.thedogapi.com/v1/")) {}
} }
@@ -1,9 +1,10 @@
using Telegram.Bot.Types; using West.TelegramBot.ContentStore.Model;
using West.TelegramBot.ContentStore.Model;
namespace West.TelegramBot.ContentStore.Service; namespace West.TelegramBot.ContentStore.Service;
public interface IRandomMediaService public interface IRandomMediaService
{ {
public StoreItem StoreItem { get; }
public Task<RandomMedia> GetRandomMediaAsync(); public Task<RandomMedia> GetRandomMediaAsync();
} }
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Telegram.Bot.Types;
using West.TelegramBot.ContentStore.Model; using West.TelegramBot.ContentStore.Model;
namespace West.TelegramBot.ContentStore.Service; namespace West.TelegramBot.ContentStore.Service;
@@ -7,6 +6,7 @@ namespace West.TelegramBot.ContentStore.Service;
public class OBoobsService : IRandomMediaService public class OBoobsService : IRandomMediaService
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
public StoreItem StoreItem { get; } = new("boobs", "Сиськи", 60);
public OBoobsService() public OBoobsService()
{ {