-
Notifications
You must be signed in to change notification settings - Fork 0
/
ParaGadgetCommand.cs
207 lines (195 loc) · 12.7 KB
/
ParaGadgetCommand.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
using DSharpPlus;
using DSharpPlus.CommandsNext;
using DSharpPlus.CommandsNext.Attributes;
using DSharpPlus.Entities;
using PaimonBot.Extensions.Data;
using PaimonBot.Extensions.DataModels;
using PaimonBot.Services;
using PaimonBot.Services.CurrencyHelper;
using PaimonBot.Services.HelpFormatter;
using Serilog;
using System;
using System.Text;
using System.Threading.Tasks;
using System.Linq;
using DSharpPlus.Exceptions;
namespace PaimonBot.Commands
{
[Group("gadget"), Aliases("parametric", "para")]
[Description("A set of commands to use, enable or disable remind for your parametric gadget.")]
[Category(CategoryName.Account)]
public class ParaGadgetCommand : BaseCommandModule
{
[GroupCommand]
[Description("Default command to return back when you used your Parametric Gadget and when you can next use it")]
[Cooldown(1, 3, CooldownBucketType.Channel)]
public async Task GadgetCall(CommandContext ctx)
{
var traveler = SharedData.PaimonDB.GetTravelerBy("DiscordID", ctx.User.Id);
if (traveler != null)
{
if (traveler.ParaGadgetNextUse == null)
{
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Data Unavailable", $"It seems that you do not have any GadgetData set. Please set when you used your Gadget in-game using " +
$"`{SharedData.prefixes[0]}gadget use`. {Emojis.BlurpEmote}", TimeSpan.FromSeconds(6), ResponseType.Warning);
return;
}
var embed = ParaGadgetEmbed(traveler, ctx.User);
var messageBuilder = new DiscordMessageBuilder().AddEmbed(embed);
await ctx.Channel.SendMessageAsync(messageBuilder).ConfigureAwait(false);
} else
await PaimonServices.SendRespondAsync(ctx, $"It seems you're not in the database, please create an account using `{SharedData.prefixes[0]}acc create`. {Emojis.CryEmote}",
TimeSpan.FromSeconds(5)).ConfigureAwait(false);
}
[Command("use")]
[Description("Use this command to enable a parametric gadget")]
[Cooldown(1, 3, CooldownBucketType.User)]
public async Task ParametricGadgetUpdate(CommandContext ctx)
{
var traveler = SharedData.PaimonDB.GetTravelerBy("DiscordID", ctx.User.Id);
if (traveler != null)
{
var remindedUsers = SharedData.ParaRemindedUsers.Keys.ToList();
if (remindedUsers.Exists(x => x == ctx.User.Id))
SharedData.ParaRemindedUsers.Remove(ctx.User.Id);
var updateTraveler = traveler;
updateTraveler.ParaGadgetNextUse = DateTime.UtcNow.AddDays(7);
updateTraveler.ParaGadgetRemind = false;
// Saves to the Traveler's database data.
SharedData.PaimonDB.ReplaceTraveler(updateTraveler);
await ctx.RespondAsync($"Succesfully recorded the use of Parametric Gadget! Please use `{SharedData.prefixes[0]}gadget` to check its data. If you'd like to be reminded when you can next use it, please use `{SharedData.prefixes[0]}gadget remind`.");
Log.Information("Succesfully recorded Traveler {Id}'s Gadget Next Use.", ctx.User.Id);
}
else
await PaimonServices.SendRespondAsync(ctx, $"It seems you're not in the database, please create an account using `{SharedData.prefixes[0]}acc create`. {Emojis.CryEmote}",
TimeSpan.FromSeconds(5)).ConfigureAwait(false);
}
[Command("remind")]
[Description("Enables for Paimon to remind you when you can next use your parametric gadget ")]
[RequireGuild]
[Cooldown(1, 3, CooldownBucketType.User)]
public async Task ParametricGadgetRemind(CommandContext ctx)
{
var traveler = SharedData.PaimonDB.GetTravelerBy("DiscordID", ctx.User.Id);
if (traveler != null)
{
if (traveler.ParaGadgetNextUse == null)
{
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Data Unavailable", $"It seems that you do not have any GadgetData set. Please set when you used your Gadget in-game using " +
$"`{SharedData.prefixes[0]}gadget use`. {Emojis.BlurpEmote}", TimeSpan.FromSeconds(6), ResponseType.Warning);
Log.Warning($"Invalid Operation: ParaGadgetRemind was called, but User {ctx.User.Id}'s Traveler data does not seem to have Gadget data.");
return;
}
var nextUse = (DateTimeOffset)traveler.ParaGadgetNextUse.ToUniversalTime();
if (SharedData.ParaRemindedUsers.ContainsKey(ctx.User.Id) || traveler.ParaGadgetRemind)
{
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Remind Error", $"It seems that you already will be reminded on your next Gadget use at <t:{nextUse.ToUnixTimeSeconds()}>. To disable, please use " +
$"`{SharedData.prefixes[0]}gadget unremind`. {Emojis.BlurpEmote}", TimeSpan.FromSeconds(6), ResponseType.Warning);
return;
}
try
{
SharedData.ParaRemindedUsers.Add(ctx.User.Id, nextUse);
var DmChannel = await ctx.Member.CreateDmChannelAsync().ConfigureAwait(false);
SharedData.ParaReminderUsersDMs.Add(ctx.User.Id, DmChannel);
// Sets the traveler's data to be reminded
traveler.ParaGadgetRemind = true;
SharedData.PaimonDB.UpdateTraveler(traveler, "ParaGadgetRemind", traveler.ParaGadgetRemind);
Log.Information("Gadget Remind for User {ID} has been added into the dict. RemindTime: {Time}", ctx.User.Id, nextUse);
await ctx.RespondAsync($"{Emojis.HappyEmote} Gagdet Remind Successful, Please keep your DMs open. Paimon will now remind you when you can next use your Parametric Gadget! `{SharedData.prefixes[0]}gadget` for more information.z").ConfigureAwait(false);
}
catch (Exception e)
{
if (e is UnauthorizedException)
{
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Remind Error", "It seems that you do not have DMs from Server Members Enabled. " +
"Please enable to let Paimon talk to you! Once Enabled, please try again. Learn more [here](https://support.discord.com/hc/en-us/articles/217916488-Blocking-Privacy-Settings-)!"
, TimeSpan.FromSeconds(5), ResponseType.Warning);
Log.Warning("User {Id} tried to enable Gadget Remind, however does not have DMs Enabled. {ExceptionMessage}", ctx.User.Id, e.Message);
}
else
Log.Error("This is Exception E {Exception} , Message: {E.Message} Stacktrace: {E.StackTrace}", e, e.Message, e.StackTrace);
}
}
else
await PaimonServices.SendRespondAsync(ctx, $"It seems you're not in the database, please create an account using `{SharedData.prefixes[0]}acc create`. {Emojis.CryEmote}",
TimeSpan.FromSeconds(5)).ConfigureAwait(false);
}
[Command("unremind")]
[Description("Disables Paimon to remind you on your next gadget use, if exists.")]
[RequireGuild]
[Cooldown(1, 3, CooldownBucketType.User)]
public async Task ParametricGadgetUnremind(CommandContext ctx)
{
var traveler = SharedData.PaimonDB.GetTravelerBy("DiscordID", ctx.User.Id);
if (traveler != null)
{
if (SharedData.ParaRemindedUsers.ContainsKey(ctx.User.Id) || traveler.ParaGadgetRemind)
{
// Removing from both lists
SharedData.ParaRemindedUsers.Remove(ctx.User.Id);
SharedData.ParaReminderUsersDMs.Remove(ctx.User.Id);
// Updating Traveler data
traveler.ParaGadgetRemind = false;
SharedData.PaimonDB.UpdateTraveler(traveler, "ParaGadgetRemind", traveler.ParaGadgetRemind);
Log.Information("Gagdet Remind for User {Id} has been deleted from the list, and disabled.");
await ctx.RespondAsync($"{Emojis.BlurpEmote} Your Gadget Remind has been disabled. To re-enable, use `{SharedData.prefixes[0]}gadget remind`").ConfigureAwait(false);
}
else
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Remind Error", $"It seems that you do not have any Gadget Reminder active. Please use " +
$"`{SharedData.prefixes[0]}gadget remind` to be reminded when you can next use your gadget. {Emojis.BlurpEmote}", TimeSpan.FromSeconds(6), ResponseType.Warning);
} else
await PaimonServices.SendRespondAsync(ctx, $"It seems you're not in the database, please create an account using `{SharedData.prefixes[0]}acc create`. {Emojis.CryEmote}",
TimeSpan.FromSeconds(5)).ConfigureAwait(false);
}
[Command("delete"), Aliases("remove", "clear")]
[Description("Deletes the Parametric Gadget Information from your Traveler's Account. Disables Gadget reminding as well.")]
[Cooldown(1, 3, CooldownBucketType.User)]
public async Task GadgetDelete(CommandContext ctx)
{
var traveler = SharedData.PaimonDB.GetTravelerBy("DiscordID", ctx.User.Id);
if (traveler != null)
{
if (traveler.ParaGadgetNextUse == null)
{
await PaimonServices.SendEmbedToChannelAsync(ctx.Channel, "Gadget Data Unavailable", $"It seems that you do not have any GadgetData set. Please set when you used your Gadget in-game using " +
$"`{SharedData.prefixes[0]}gadget use`. {Emojis.BlurpEmote}", TimeSpan.FromSeconds(6), ResponseType.Warning);
return;
}
traveler.ParaGadgetNextUse = null;
traveler.ParaGadgetRemind = false;
SharedData.PaimonDB.ReplaceTraveler(traveler);
SharedData.ParaRemindedUsers.Remove(ctx.User.Id); // doesn't throw
SharedData.ParaReminderUsersDMs.Remove(ctx.User.Id);
await ctx.RespondAsync($"Parametric Gadget Usage Data has been deleted. Thanks for using PaimonBot! " + Emojis.HappyEmote).ConfigureAwait(false);
Log.Information("Traveler {id}'s Parametric Gadget Data has been succesfully deleted.", ctx.User.Id);
}
else
await PaimonServices.SendRespondAsync(ctx, $"It seems you're not in the database, please create an account using `{SharedData.prefixes[0]}acc create`. {Emojis.CryEmote}",
TimeSpan.FromSeconds(5)).ConfigureAwait(false);
}
private DiscordEmbedBuilder ParaGadgetEmbed(Traveler traveler, DiscordUser user)
{
DateTimeOffset offset = (DateTimeOffset)traveler.ParaGadgetNextUse.ToUniversalTime() - TimeSpan.FromDays(7);
DateTimeOffset remindedTime = (DateTimeOffset)traveler.ParaGadgetNextUse.ToUniversalTime();
StringBuilder sb = new StringBuilder();
sb.AppendLine($"You used your Parametric Gadget on <t:{offset.ToUnixTimeSeconds()}>");
sb.AppendLine($"You can next use your Parametric Gadget <t:{remindedTime.ToUnixTimeSeconds()}:R> on <t:{remindedTime.ToUnixTimeSeconds()}>");
sb.AppendLine();
if (traveler.ParaGadgetRemind)
{
sb.AppendLine("Paimon also **will remind** you when you can next use your gadget");
} else
{ sb.AppendLine($"Use `{SharedData.prefixes[0]}gadget remind` or `unremind` to be reminded or unreminded on when you can next use your gadget."); }
sb.AppendLine($"You could also use `{SharedData.prefixes[0]}gadget delete` to delete/clear the data.");
DiscordEmbedBuilder embed = new DiscordEmbedBuilder()
.WithTitle($"{user.Username}#{user.Discriminator}'s Parametric Gadget Information")
.WithColor(SharedData.defaultColour)
.WithThumbnail(user.AvatarUrl)
.WithDescription(sb.ToString())
.WithFooter($"Use {SharedData.prefixes[0]}gadget use to use your gadget, once you've used it in game.")
.WithTimestamp(DateTime.Now);
return embed;
}
}
}