This commit is contained in:
2026-05-05 16:15:26 +01:00
parent ebbdc17b15
commit 0c50e78cf4
5 changed files with 102 additions and 17 deletions

2
.gitignore vendored
View File

@@ -2,6 +2,6 @@
.gitignore
**/bin/
**/obj/
**/SkyBot.sln
**/SkyBot*.sln
**/database.db
**/Config.cs

View File

@@ -0,0 +1,68 @@
using System.Collections.Concurrent;
using SkyBot.Helpers;
using SkyBot.Models;
using SkyBot.Services;
using SkyBot.Services.Messages;
using Valour.Sdk.Models;
using Valour.Shared.Authorization;
namespace SkyBot.Commands
{
public class ChannelCmds : ICommand
{
public string Name => "channel";
public string[] Aliases => ["ch"];
public string Description => "Enable or disable bot commands in a channel";
public string Section => "Dev";
public string Usage => "channel <enable|disable>";
public async Task Execute(CommandContext ctx)
{
ConcurrentDictionary<long, Channel> channelCache = ctx.ChannelCache;
PlanetMember member = ctx.Member;
string[] args = ctx.Args;
long channelId = ctx.ChannelId;
if (!channelCache.TryGetValue(channelId, out var channel)) return;
if (!PermissionHelper.IsOwner(member) && !await PermissionHelper.HasPermAsync(member, channel, [ChatChannelPermissions.ManageMessages]))
{
await MessageHelper.ReplyAsync(ctx, channel, "This is a Dev only command.");
return;
}
if (args.Length == 0)
{
await MessageHelper.ReplyAsync(ctx, channel, "Usage: `channel <enable|disable>`");
return;
}
switch (args[0].ToLower())
{
case "disable":
if (Create.disabledChannels.Contains(channelId))
{
await MessageHelper.ReplyAsync(ctx, channel, "This channel is already disabled.");
return;
}
Create.disabledChannels.Add(channelId);
await MessageHelper.ReplyAsync(ctx, channel, "Bot commands disabled in this channel.");
break;
case "enable":
if (!Create.disabledChannels.Contains(channelId))
{
await MessageHelper.ReplyAsync(ctx, channel, "This channel is not disabled.");
return;
}
Create.disabledChannels.Remove(channelId);
await MessageHelper.ReplyAsync(ctx, channel, "Bot commands enabled in this channel.");
break;
default:
await MessageHelper.ReplyAsync(ctx, channel, "Usage: `channel <enable|disable>`");
break;
}
}
}
}

View File

@@ -2,6 +2,7 @@ using System.Collections.Concurrent;
using SkyBot.Helpers;
using SkyBot.Models;
using Valour.Sdk.Models;
using Valour.Shared.Authorization;
namespace SkyBot.Commands
{

View File

@@ -3,10 +3,11 @@ using System.Text;
using SkyBot.Helpers;
using SkyBot.Models;
using Valour.Sdk.Models;
using Valour.Shared.Models;
namespace SkyBot.Commands
{
public class Info : ICommand
public partial class Info : ICommand
{
public string Name => "info";
public string[] Aliases => [];
@@ -44,6 +45,21 @@ namespace SkyBot.Commands
}
}
[System.Text.RegularExpressions.GeneratedRegex(@"«@m-(\d+)»")]
private static partial System.Text.RegularExpressions.Regex MemberMentionRegex();
private static long? ExtractMemberMentionId(Message message)
{
var mention = message.Mentions?.FirstOrDefault(m => m.Type == MentionType.PlanetMember);
if (mention != null) return mention.TargetId;
var match = MemberMentionRegex().Match(message.Content ?? "");
if (match.Success && long.TryParse(match.Groups[1].Value, out long id))
return id;
return null;
}
private async Task HandleUserInfo(CommandContext ctx, Channel channel)
{
Message message = ctx.Message;
@@ -51,11 +67,11 @@ namespace SkyBot.Commands
string[] args = ctx.Args;
PlanetMember? target;
try
var mentionId = ExtractMemberMentionId(message);
if (mentionId.HasValue)
{
if (message.Mentions != null && message.Mentions.Any())
{
target = await planet.FetchMemberAsync(message.Mentions.First().TargetId);
target = await planet.FetchMemberAsync(mentionId.Value);
}
else if (args.Length > 1 && long.TryParse(args[1], out long memberid))
{
@@ -65,12 +81,6 @@ namespace SkyBot.Commands
{
target = ctx.Member;
}
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
target = ctx.Member;
}
if (target == null)
{
@@ -87,6 +97,7 @@ namespace SkyBot.Commands
sb.AppendLine($"Status: `{(string.IsNullOrWhiteSpace(target.Status) ? "None" : target.Status)}`");
sb.AppendLine($"Primary Role: `{target.PrimaryRole?.Name ?? "None"}`");
sb.AppendLine($"Roles: `{string.Join(", ", target.Roles.Select(r => r.Name))}`");
sb.AppendLine($"Valour Join Date: `{target.User.TimeJoined} UTC`");
await MessageHelper.ReplyAsync(ctx, channel, sb.ToString());
}

View File

@@ -2,6 +2,7 @@ using System.Collections.Concurrent;
using SkyBot.Commands;
using SkyBot.Helpers;
using SkyBot.Models;
using SkyBot.Services;
using Valour.Sdk.Client;
using Valour.Sdk.Models;
@@ -13,6 +14,7 @@ namespace SkyBot.Services.Messages
{
private static readonly ConcurrentDictionary<long, DateTime> _cooldowns = new();
private static readonly TimeSpan _cooldown = TimeSpan.FromSeconds(2);
public static readonly HashSet<long> disabledChannels = new();
public static async Task MessageAsync(
ValourClient client,
ConcurrentDictionary<long, Channel> channelCache,
@@ -59,6 +61,9 @@ namespace SkyBot.Services.Messages
_cooldowns[message.AuthorUserId] = DateTime.UtcNow;
if (disabledChannels.Contains(channelId) && command != "channel" && command != "ch")
return;
if (CommandRegistry.Commands.TryGetValue(command, out var handler))
{
await handler.Execute(ctx);