Skip to content

Commit

Permalink
Make tags use modals
Browse files Browse the repository at this point in the history
  • Loading branch information
Naamloos committed Feb 26, 2024
1 parent 0a88ba9 commit b7fc324
Show file tree
Hide file tree
Showing 3 changed files with 178 additions and 69 deletions.
99 changes: 30 additions & 69 deletions ModCore/Commands/Tags.cs
Expand Up @@ -6,8 +6,11 @@
using ModCore.AutoComplete;
using ModCore.Database;
using ModCore.Database.DatabaseEntities;
using ModCore.Extensions;
using ModCore.Modals;
using ModCore.Utils.Extensions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

Expand All @@ -24,7 +27,7 @@ public class Tags : ApplicationCommandModule
public async Task GetAsync(InteractionContext ctx,
[Option("name", "Tag name.", true)][Autocomplete(typeof(TagAutoComplete))]string name)
{
if (tryGetTag(name, ctx.Channel, out DatabaseTag tag))
if (tryGetTag(name, ctx.Channel, this.Database, out DatabaseTag tag))
{
await ctx.CreateResponseAsync($"🏷 `{name}`:\n\n{tag.Contents}");
return;
Expand All @@ -35,93 +38,51 @@ public class Tags : ApplicationCommandModule

[SlashCommand("set", "Sets a tag's content.")]
public async Task SetAsync(InteractionContext ctx,
[Option("name", "Name of tag to set.")]string name,
[Option("content", "New content for this tag.")]string content)
[Option("name", "Name of tag to set.")][MaximumLength(100)]string name)
{
bool isNew = false;

if (tryGetTag(name, ctx.Channel, out var tag))
var exists = tryGetTag(name, ctx.Channel, this.Database, out var tag);
if (exists)
{
if (!canManageTag(tag, ctx.Channel, ctx.Member))
{
await ctx.CreateResponseAsync("⚠️ That tag already exists and you don't own it!", true);
await ctx.CreateResponseAsync("⚠️ That tag already exists and you can not manage it!", true);
return;
}
}
else
{
tag = new DatabaseTag
{
ChannelId = -1, // guild tag
Name = name,
GuildId = (long)ctx.Guild.Id,
OwnerId = (long)ctx.User.Id,
CreatedAt = DateTime.Now
};
isNew = true;
}

await using var db = this.Database.CreateContext();
tag.Contents = content;
if (isNew)
{
db.Tags.Add(tag);
await ctx.CreateResponseAsync($"✅ Server-global tag `{name}` succesfully created!", true);
}
else
{
db.Tags.Update(tag);
await ctx.CreateResponseAsync($"✅ Server-global tag `{name}` succesfully modified!", true);
}
await db.SaveChangesAsync();
await ctx.Client.GetInteractionExtension().RespondWithModalAsync<SetTagModal>(ctx.Interaction,
exists? "Update global tag contents" : "Create new global tag", new Dictionary<string, string>()
{
{ "n", name }
});
}

[SlashCommand("override", "Creates a channel-specific override for a tag.")]
public async Task OverrideAsync(InteractionContext ctx,
[Option("name", "Name of tag to override.")] string name,
[Option("content", "New override content for this tag.")] string content)
[Option("name", "Name of tag to override.")][MaximumLength(100)]string name)
{
bool isNew = false;
if (!tryGetTag(name, ctx.Channel, out var tag)
|| tag.ChannelId < 1)
var exists = tryGetTag(name, ctx.Channel, this.Database, out var tag);
if (exists)
{
tag = new DatabaseTag()
if (!canManageTag(tag, ctx.Channel, ctx.Member))
{
ChannelId = (long)ctx.Channel.Id,
GuildId = (long)ctx.Guild.Id,
Contents = content,
CreatedAt = DateTime.Now,
Name = name,
OwnerId = (long)ctx.User.Id
};
isNew = true;
}
else if (!canManageTag(tag, ctx.Channel, ctx.Member))
{
await ctx.CreateResponseAsync("⚠️ That tag already exists and you don't own it!", true);
return;
await ctx.CreateResponseAsync("⚠️ That tag already exists and you can not manage it!", true);
return;
}
}

await using var db = this.Database.CreateContext();
tag.Contents = content;
if (isNew)
{
db.Tags.Add(tag);
await ctx.CreateResponseAsync($"✅ Channel override tag `{name}` succesfully created!", true);
}
else
{
db.Tags.Update(tag);
await ctx.CreateResponseAsync($"✅ Channel override tag `{name}` succesfully modified!", true);
}
await db.SaveChangesAsync();
await ctx.Client.GetInteractionExtension().RespondWithModalAsync<OverrideTagModal>(ctx.Interaction,
exists ? "Update channel tag contents" : "Create new channel tag", new Dictionary<string, string>()
{
{ "n", name }
});
}

[SlashCommand("remove", "Removes a tag.")]
public async Task RemoveAsync(InteractionContext ctx,
[Option("name", "Name of the tag to remove.", true)][Autocomplete(typeof(TagAutoComplete))] string name)
{
if (!tryGetTag(name, ctx.Channel, out DatabaseTag tag))
if (!tryGetTag(name, ctx.Channel, this.Database, out DatabaseTag tag))
{
await ctx.CreateResponseAsync($"⚠️ No such tag exists!", true);
return;
Expand Down Expand Up @@ -156,7 +117,7 @@ public class Tags : ApplicationCommandModule
public async Task InfoAsync(InteractionContext ctx,
[Option("name", "Name of tag to show information about.", true)][Autocomplete(typeof(TagAutoComplete))] string name)
{
if (!tryGetTag(name, ctx.Channel, out DatabaseTag tag))
if (!tryGetTag(name, ctx.Channel, this.Database, out DatabaseTag tag))
{
await ctx.CreateResponseAsync($"⚠️ No such tag exists!", true);
return;
Expand All @@ -176,7 +137,7 @@ public class Tags : ApplicationCommandModule
[Option("name", "Name of tag you want to transfer.", true)][Autocomplete(typeof(TagAutoComplete))] string name,
[Option("user", "User to transfer this tag to.")]DiscordUser newowner)
{
if (!tryGetTag(name, ctx.Channel, out DatabaseTag tag))
if (!tryGetTag(name, ctx.Channel, this.Database, out DatabaseTag tag))
{
await ctx.CreateResponseAsync($"⚠️ No such tag exists!", true);
}
Expand Down Expand Up @@ -218,9 +179,9 @@ public async Task ListAsync(InteractionContext ctx)
}
}

private bool tryGetTag(string name, DiscordChannel channel, out DatabaseTag tag)
public static bool tryGetTag(string name, DiscordChannel channel, DatabaseContextBuilder database, out DatabaseTag tag)
{
using var db = this.Database.CreateContext();
using var db = database.CreateContext();
tag = db.Tags.FirstOrDefault(x => x.Name == name && x.ChannelId == (long)channel.Id);
if (tag == null)
tag = db.Tags.FirstOrDefault(x => x.Name == name && x.GuildId == (long)channel.GuildId && x.ChannelId < 1);
Expand Down
73 changes: 73 additions & 0 deletions ModCore/Modals/OverrideTagModal.cs
@@ -0,0 +1,73 @@
using DSharpPlus;
using DSharpPlus.Entities;
using ModCore.Commands;
using ModCore.Database;
using ModCore.Database.DatabaseEntities;
using ModCore.Extensions.Abstractions;
using ModCore.Extensions.Attributes;
using System;
using System.Threading.Tasks;

namespace ModCore.Modals
{
[Modal("override_tag")]
public class OverrideTagModal : IModal
{
[ModalField("Tag Content (Markdown Permitted)", "content", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", null, true, TextInputStyle.Paragraph, 1, 255)]
public string Content { get; set; }

[ModalHiddenField("n")]
public string TagName { get; set; }

private DatabaseContextBuilder Database;

public OverrideTagModal(DatabaseContextBuilder database)
{
this.Database = database;
}

public async Task HandleAsync(DiscordInteraction interaction)
{
await interaction.DeferAsync(true);
var member = await interaction.Guild.GetMemberAsync(interaction.User.Id);

bool isNew = false;
if (!Tags.tryGetTag(TagName, interaction.Channel, this.Database, out var tag)
|| tag.ChannelId < 1)
{
tag = new DatabaseTag()
{
ChannelId = (long)interaction.Channel.Id,
GuildId = (long)interaction.Guild.Id,
Contents = Content,
CreatedAt = DateTime.Now,
Name = TagName,
OwnerId = (long)interaction.User.Id
};
isNew = true;
}
else if (!Tags.canManageTag(tag, interaction.Channel, member))
{
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"⚠️ The tag {TagName} already exists and you can not manage it!"));
return;
}

await using var db = this.Database.CreateContext();
tag.Contents = Content;
if (isNew)
{
db.Tags.Add(tag);
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"✅ Channel override tag `{TagName}` succesfully created"));
}
else
{
db.Tags.Update(tag);
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"✅ Channel override tag `{TagName}` succesfully modified!"));
}
await db.SaveChangesAsync();
}
}
}
75 changes: 75 additions & 0 deletions ModCore/Modals/SetTagModal.cs
@@ -0,0 +1,75 @@
using DSharpPlus;
using DSharpPlus.Entities;
using ModCore.Commands;
using ModCore.Database;
using ModCore.Database.DatabaseEntities;
using ModCore.Extensions.Abstractions;
using ModCore.Extensions.Attributes;
using System;
using System.Threading.Tasks;

namespace ModCore.Modals
{
[Modal("set_tag")]
public class SetTagModal : IModal
{
[ModalField("Tag Content (Markdown Permitted)", "content", "https://www.youtube.com/watch?v=dQw4w9WgXcQ", null, true, TextInputStyle.Paragraph, 1, 255)]
public string Content { get; set; }

[ModalHiddenField("n")]
public string TagName { get; set; }

private DatabaseContextBuilder Database;

public SetTagModal(DatabaseContextBuilder database)
{
this.Database = database;
}

public async Task HandleAsync(DiscordInteraction interaction)
{
await interaction.DeferAsync(true);

bool isNew = false;
var member = await interaction.Guild.GetMemberAsync(interaction.User.Id);

if (Tags.tryGetTag(TagName, interaction.Channel, Database, out var tag))
{
if (!Tags.canManageTag(tag, interaction.Channel, member))
{
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"⚠️ The tag {TagName} already exists and you can not manage it!"));
return;
}
}
else
{
tag = new DatabaseTag
{
ChannelId = -1, // guild tag
Name = TagName,
GuildId = (long)interaction.Guild.Id,
OwnerId = (long)interaction.User.Id,
CreatedAt = DateTime.Now
};
isNew = true;
}

await using var db = this.Database.CreateContext();
tag.Contents = Content;
if (isNew)
{
db.Tags.Add(tag);
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"✅ Server-global tag `{TagName}` succesfully created!"));
}
else
{
db.Tags.Update(tag);
await interaction.CreateFollowupMessageAsync(new DiscordFollowupMessageBuilder()
.WithContent($"✅ Server-global tag `{TagName}` succesfully modified!"));
}
await db.SaveChangesAsync();
}
}
}

0 comments on commit b7fc324

Please sign in to comment.