Skip to content

Commit

Permalink
Add /nicknamelock
Browse files Browse the repository at this point in the history
Closes #226
  • Loading branch information
Erisa committed Sep 4, 2024
1 parent 0923e93 commit 279a200
Show file tree
Hide file tree
Showing 3 changed files with 125 additions and 0 deletions.
84 changes: 84 additions & 0 deletions Commands/InteractionCommands/NicknameLockInteraction.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Cliptok.Commands.InteractionCommands
{
public class NicknameLockInteraction : ApplicationCommandModule
{
[SlashCommandGroup("nicknamelock", "Prevent a member from changing their nickname.", defaultPermission: false)]
[SlashRequireHomeserverPerm(ServerPermLevel.TrialModerator), SlashCommandPermissions(DiscordPermissions.ManageNicknames)]
public class NicknameLockSlashCommands
{
[SlashCommand("enable", "Prevent a member from changing their nickname.")]
public async Task NicknameLockEnableSlashCmd(InteractionContext ctx, [Option("member", "The member to nickname lock.")] DiscordUser discordUser)
{
DiscordMember member = default;

try
{
member = await ctx.Guild.GetMemberAsync(discordUser.Id);
} catch (Exception e)
{
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Error} Failed to find {discordUser.Mention} as a member! Are they in the server?\n```\n{e.Message}```", ephemeral: true);
return;
}

var currentValue = await Program.db.HashGetAsync($"nicknamelock", discordUser.Id);

if (currentValue.HasValue)
{
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Error} {discordUser.Mention} is already nickname locked!", mentions: false);
} else
{
await Program.db.HashSetAsync("nicknamelock", discordUser.Id, member.DisplayName);
var msg = $"{Program.cfgjson.Emoji.On} Nickname locked {discordUser.Mention} as `{member.DisplayName}`!";
await ctx.RespondAsync(msg, mentions: false);
await LogChannelHelper.LogMessageAsync("nicknames", msg);
}
}

[SlashCommand("disable", "Allow a member to change their nickname again.")]
public async Task NicknameLockDisableSlashCmd(InteractionContext ctx, [Option("member", "The member to remove the nickname lock for.")] DiscordUser discordUser)
{
DiscordMember member = default;

try
{
member = await ctx.Guild.GetMemberAsync(discordUser.Id);
}
catch (Exception e)
{
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Error} Failed to find {discordUser.Mention} as a member! Are they in the server?\n```\n{e.Message}```", ephemeral: true);
return;
}

var currentValue = await Program.db.HashGetAsync($"nicknamelock", discordUser.Id);

if (currentValue.HasValue)
{
await Program.db.HashDeleteAsync("nicknamelock", discordUser.Id);
var msg = $"{Program.cfgjson.Emoji.Off} Removed nickname lock for {discordUser.Mention}!";
await ctx.RespondAsync(msg, mentions: false);
await LogChannelHelper.LogMessageAsync("nicknames", msg);
}
else
{
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Error} {discordUser.Mention} is not nickname locked!", mentions: false);
}
}

[SlashCommand("status", "Check the status of nickname lock for a member.")]
public async Task NicknameLockStatusSlashCmd(InteractionContext ctx, [Option("member", "The member whose nickname lock status to check.")] DiscordUser discordUser)
{
if ((await Program.db.HashGetAsync("nicknamelock", discordUser.Id)).HasValue)
await ctx.RespondAsync($"{Program.cfgjson.Emoji.On} {discordUser.Mention} is nickname locked.", mentions: false);
else
await ctx.RespondAsync($"{Program.cfgjson.Emoji.Off} {discordUser.Mention} is not nickname locked.", mentions: false);
}
}
}

}
38 changes: 38 additions & 0 deletions Events/MemberEvents.cs
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,25 @@ public static async Task GuildMemberUpdated(DiscordClient client, GuildMemberUpd
if (differrence > 10 && !userMute.IsNull && !e.Member.Roles.Contains(muteRole))
db.HashDeleteAsync("mutes", e.Member.Id);

// Nickname lock check
var nicknamelock = await db.HashGetAsync("nicknamelock", e.Member.Id);

if (nicknamelock.HasValue)
{
if (e.Member.DisplayName != nicknamelock)
{
var oldName = e.Member.DisplayName;
await e.Member.ModifyAsync(a =>
{
a.Nickname = nicknamelock.ToString();
a.AuditLogReason = "Nickname lock applied, reverting nickname change. Nice try though.";
});
await LogChannelHelper.LogMessageAsync("nicknames", $"{cfgjson.Emoji.MessageEdit} Reverted nickname change from {e.Member.Mention}: `{oldName}`");
}
// We don't want to run the dehoist checks on locked nicknames, else it may cause a fight between the two.
return;
}

DehoistHelpers.CheckAndDehoistMemberAsync(e.Member);

// Persist permadehoists
Expand All @@ -220,6 +239,25 @@ public static async Task UserUpdated(DiscordClient client, UserUpdatedEventArgs

var member = await homeGuild.GetMemberAsync(e.UserAfter.Id);

// Nickname lock check
var nicknamelock = await db.HashGetAsync("nicknamelock", member.Id);

if (nicknamelock.HasValue)
{
if (member.DisplayName != nicknamelock)
{
var oldName = member.DisplayName;
await member.ModifyAsync(async a =>
{
a.Nickname = nicknamelock.ToString();
a.AuditLogReason = "Nickname lock applied, reverting nickname change. Nice try though.";
});
await LogChannelHelper.LogMessageAsync("nicknames", $"{cfgjson.Emoji.MessageEdit} Reverted nickname change from {member.Mention}: `{oldName}`");
}
// We don't want to run the dehoist checks on locked nicknames, else it may cause a fight between the two.
return;
}

DehoistHelpers.CheckAndDehoistMemberAsync(member);
ScamHelpers.UsernameCheckAsync(member); ;
}
Expand Down
3 changes: 3 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@
},
"mentions": {
"channelId": 1018252827254063224
},
"nicknames": {
"channelId": 1280688061528674314
}
},
"botOwners": [
Expand Down

0 comments on commit 279a200

Please sign in to comment.