-
Notifications
You must be signed in to change notification settings - Fork 3
/
RegisterStatusMonitorUseCase.cs
104 lines (88 loc) · 3.69 KB
/
RegisterStatusMonitorUseCase.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using Discord;
using Discord.WebSocket;
using LanguageExt;
using OpenttdDiscord.Base.Ext;
using OpenttdDiscord.Database.Statuses;
using OpenttdDiscord.Domain.Security;
using OpenttdDiscord.Domain.Servers;
using OpenttdDiscord.Domain.Statuses;
using OpenttdDiscord.Infrastructure.Akkas;
using OpenttdDiscord.Infrastructure.Statuses.Messages;
namespace OpenttdDiscord.Infrastructure.Statuses.UseCases
{
internal class RegisterStatusMonitorUseCase : UseCaseBase, IRegisterStatusMonitorUseCase
{
private readonly IStatusMonitorRepository statusMonitorRepository;
private readonly DiscordSocketClient discord;
private readonly IAkkaService akkaService;
public RegisterStatusMonitorUseCase(
IStatusMonitorRepository statusMonitorRepository,
IAkkaService akkaService,
DiscordSocketClient discord)
{
this.statusMonitorRepository = statusMonitorRepository;
this.akkaService = akkaService;
this.discord = discord;
}
public EitherAsync<IError, StatusMonitor> Execute(User user, OttdServer server, ulong guildId, ulong channelId)
{
var embedMessageIdResult = CreateEmbedMessage(channelId, server);
return
(
from _1 in CheckIfHasCorrectUserLevel(user, UserLevel.Admin).ToAsync()
from messageId in embedMessageIdResult
from statusMonitor in statusMonitorRepository.Insert(new StatusMonitor(
server.Id,
guildId,
channelId,
messageId,
DateTime.MinValue.ToUniversalTime()))
from _2 in InformActor(statusMonitor)
select statusMonitor)
.MapLeft(err =>
{
if (embedMessageIdResult.IsRight.Result)
{
DeleteEmbedMessage(channelId, embedMessageIdResult.Right());
}
return err;
});
}
private EitherAsync<IError, ulong> CreateEmbedMessage(ulong channelId, OttdServer server)
=> TryAsync<Either<IError, ulong>>(async () =>
{
IChannel channel = await discord.GetChannelAsync(channelId);
if (!(channel is IMessageChannel msgChannel))
{
return new HumanReadableError("Wrong channel!");
}
IUserMessage msg = await msgChannel.SendMessageAsync(embed: CreateEmptyEmbed(server));
return msg.Id;
}).ToEitherAsyncErrorFlat();
private EitherAsyncUnit DeleteEmbedMessage(ulong channelId, ulong messageId)
=> TryAsync<EitherUnit>(async () =>
{
IChannel channel = await discord.GetChannelAsync(channelId);
if (!(channel is IMessageChannel msgChannel))
{
return new HumanReadableError("Wrong channel!");
}
await msgChannel.DeleteMessageAsync(messageId);
return Unit.Default;
}).ToEitherAsyncErrorFlat();
private Embed CreateEmptyEmbed(OttdServer server)
{
return new EmbedBuilder()
.WithTitle($"{server.Name} Status")
.AddField("Please Wait", "Status message creation in progress")
.Build();
}
private EitherAsyncUnit InformActor(StatusMonitor statusMonitor)
=> TryAsync(async () =>
{
var msg = new RegisterStatusMonitor(statusMonitor);
(await akkaService.SelectActor(MainActors.Paths.Guilds)).Tell(msg);
return Unit.Default;
}).ToEitherAsyncError();
}
}