1
0
This repository has been archived on 2023-08-03. You can view files and clone it, but cannot push or open issues or pull requests.
budet-cho-bot/Budet-cho-bot/CommandHandler.cs
2023-07-25 19:04:53 +08:00

89 lines
3.1 KiB
C#

using System;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Discord.Commands;
using Discord.WebSocket;
using Newtonsoft.Json.Linq;
using Discord;
using System.Linq;
using Newtonsoft.Json;
namespace Discord_Bot
{
public class CommandHandlingService
{
private readonly CommandService _commands;
private readonly DiscordSocketClient _client;
private readonly IServiceProvider _services;
public CommandHandlingService(IServiceProvider services)
{
_commands = services.GetRequiredService<CommandService>();
_client = services.GetRequiredService<DiscordSocketClient>();
_services = services;
// Event handlers
_client.Ready += ClientReadyAsync;
_client.MessageReceived += HandleCommandAsync;
_client.JoinedGuild += SendJoinMessageAsync;
}
private async Task HandleCommandAsync(SocketMessage rawMessage)
{
if (rawMessage.Author.IsBot || !(rawMessage is SocketUserMessage message) || message.Channel is IDMChannel)
return;
var context = new SocketCommandContext(_client, message);
int argPos = 0;
JObject config = Functions.GetConfig();
string[] prefixes = JsonConvert.DeserializeObject<string[]>(config["prefixes"].ToString());
// Check if message has any of the prefixes or mentiones the bot.
if (prefixes.Any(x => message.HasStringPrefix(x, ref argPos)) || message.HasMentionPrefix(_client.CurrentUser, ref argPos))
{
// Execute the command.
var result = await _commands.ExecuteAsync(context, argPos, _services);
if (!result.IsSuccess && result.Error.HasValue)
await context.Channel.SendMessageAsync($":x: {result.ErrorReason}");
}
}
private async Task SendJoinMessageAsync(SocketGuild guild)
{
JObject config = Functions.GetConfig();
string joinMessage = config["join_message"]?.Value<string>();
if (string.IsNullOrEmpty(joinMessage))
return;
// Send the join message in the first channel where the bot can send messsages.
foreach (var channel in guild.TextChannels.OrderBy(x => x.Position))
{
var botPerms = channel.GetPermissionOverwrite(_client.CurrentUser).GetValueOrDefault();
if (botPerms.SendMessages == PermValue.Deny)
continue;
try
{
await channel.SendMessageAsync(joinMessage);
return;
}
catch
{
continue;
}
}
}
private async Task ClientReadyAsync()
=> await Functions.SetBotStatusAsync(_client);
public async Task InitializeAsync()
=> await _commands.AddModulesAsync(Assembly.GetEntryAssembly(), _services);
}
}