Files
telegram-bot/modules/ContentStore/Handler/Store.cs
T

169 lines
5.6 KiB
C#
Raw Normal View History

2022-02-16 17:07:30 +02:00
#nullable enable
using BotFramework.Attributes;
using BotFramework.Enums;
2023-07-21 17:14:11 +03:00
using Kruzya.TelegramBot.Core.Data;
2022-02-16 17:07:30 +02:00
using Kruzya.TelegramBot.Core.Extensions;
2023-07-21 17:14:11 +03:00
using Kruzya.TelegramBot.Core.Handler;
2022-02-16 17:07:30 +02:00
using Kruzya.TelegramBot.Core.Service;
using Microsoft.Extensions.DependencyInjection;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.ReplyMarkups;
using West.TelegramBot.ContentStore.Service;
namespace West.TelegramBot.ContentStore.Handler;
2023-07-21 17:14:11 +03:00
public class Store : CommonHandler
2022-02-16 17:07:30 +02:00
{
private readonly IReputation? _reputation;
private readonly IServiceProvider _provider;
2022-02-16 18:08:02 +02:00
private readonly ContentStore _store;
2023-07-21 17:14:11 +03:00
public Store(CoreContext db, IServiceProvider provider, ContentStore store) : base(db)
2022-02-16 17:07:30 +02:00
{
_reputation = provider.GetService<IReputation>();
_provider = provider;
2022-02-16 18:08:02 +02:00
_store = store;
2022-02-16 17:07:30 +02:00
}
2023-07-29 01:50:28 +03:00
[InChat(InChat.Public)]
[Command("store", CommandParseMode.Both)]
2022-02-16 17:07:30 +02:00
public async Task HandleStore()
{
if (From.IsBot)
{
return;
}
2022-02-16 17:07:30 +02:00
if (_reputation == null)
{
await Bot.SendTextMessageAsync(Chat.Id, "Reputation is unavailable.");
return;
}
2022-04-26 00:28:39 +03:00
var user = From;
var reputation = await _reputation.GetUserReputationAsync(Chat, user);
2023-01-02 19:01:03 +02:00
await Bot.SendTextMessageAsync(Chat.Id, $"<b>{user.ToHtml()} ({reputation})</b>, чего пожелаете?", parseMode: ParseMode.Html,
2022-04-26 00:28:39 +03:00
replyMarkup: new InlineKeyboardMarkup(
_provider.GetServices<IRandomMediaService>()
2022-11-14 00:23:36 +02:00
.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()
)
);
2022-02-16 17:07:30 +02:00
}
2023-07-29 01:50:28 +03:00
[InChat(InChat.Public)]
[Update(UpdateFlag.CallbackQuery)]
2022-02-16 17:07:30 +02:00
public async Task HandleStoreCallback()
{
var query = CallbackQuery;
var queryData = query.Data;
if (queryData == null || !queryData.StartsWith("store|") || _reputation == null)
{
return;
}
var paramList = queryData.Split('|');
if (!long.TryParse(paramList[1], out var senderId))
{
return;
}
if (senderId != From.Id)
{
await AnswerQuery(query.Id, "Keyboard called by another user.");
return;
}
var answer = "Unknown action.";
if (paramList[2] == "purchase")
{
var purchaseType = paramList[3];
answer = "Спасибо за покупку";
2022-02-16 18:08:02 +02:00
if (!TryGetMediaService(purchaseType, out var mediaService))
2022-02-16 17:07:30 +02:00
{
await AnswerQuery(query.Id, "Unknown purchasable.");
return;
}
var storeItem = mediaService!.StoreItem;
2022-02-16 17:07:30 +02:00
var messageId = query.Message!.MessageId;
2022-04-26 00:49:32 +03:00
var reputation = await _reputation.GetUserReputationAsync(Chat, From);
if (reputation < storeItem.Price)
2022-02-16 17:07:30 +02:00
{
await Bot.EditMessageTextAsync(
Chat.Id,
messageId,
2022-04-26 00:49:32 +03:00
$"<b>{From.ToHtml()} ({reputation})</b>, продолжай работать и тебе обязательно хватит на покупку.",
2022-02-16 17:07:30 +02:00
ParseMode.Html);
await AnswerQuery(query.Id);
return;
}
2023-05-17 23:12:15 +03:00
try
{
await PerformPurchase(mediaService, messageId);
}
2023-07-21 18:40:24 +03:00
catch (Exception)
2023-05-17 23:12:15 +03:00
{
answer = "Товар недоступен";
await Bot.EditMessageTextAsync(Chat.Id,
messageId,
2023-05-17 23:48:39 +03:00
$"<b>{From.ToHtml()} попытался купить \"{storeItem.Name}\", но товара в наличии не оказалось.",
ParseMode.Html);
2023-05-17 23:12:15 +03:00
await AnswerQuery(query.Id, answer);
return;
}
2022-04-26 00:49:32 +03:00
reputation = await _reputation.SetUserReputationAsync(Chat, From, reputation - storeItem.Price);
await Bot.EditMessageTextAsync(Chat.Id,
messageId,
2022-04-26 00:49:32 +03:00
$"<b>{From.ToHtml()} ({reputation})</b> купил \"{storeItem.Name}\".",
ParseMode.Html);
2022-02-16 17:07:30 +02:00
}
await AnswerQuery(query.Id, answer);
}
2023-05-17 23:12:15 +03:00
private async Task PerformPurchase(IRandomMediaService mediaService, int messageId)
{
var randomMedia = await mediaService!.GetRandomMediaAsync();
var file = randomMedia.File;
switch (randomMedia.Type)
{
case InputMediaType.Photo:
await Bot.SendPhotoAsync(Chat.Id, file,
caption: randomMedia.Caption,
replyToMessageId: messageId,
parseMode: ParseMode.Html,
hasSpoiler: randomMedia.Nsfw
);
break;
case InputMediaType.Video:
await Bot.SendVideoAsync(Chat.Id, file,
caption: randomMedia.Caption,
replyToMessageId: messageId,
parseMode: ParseMode.Html,
hasSpoiler: randomMedia.Nsfw
);
break;
}
}
2022-02-16 17:07:30 +02:00
private bool TryGetMediaService(string name, out IRandomMediaService? mediaService)
{
2022-02-16 18:08:02 +02:00
mediaService = _provider.GetServices<IRandomMediaService>()
.FirstOrDefault(s => s.StoreItem.Id == name);
2022-02-16 17:07:30 +02:00
return mediaService != null;
}
}