Discord ๋ด‡ ๋งŒ๋“ค๊ธฐ

Discord๋Š” ๊ฒŒ์ด๋จธ๊ฐ€ ์• ์šฉํ•˜๋Š” ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋น„์Šค๋กœ ์ด์ œ๋Š” ๊ฒŒ์ด๋ฐ ๋ถ€ํ„ฐ ๊ต์œก๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ์˜์—ญ์œผ๋กœ ๊ทธ ์„œ๋น„์Šค๋ฅผ ํ™•์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Discord ๋ด‡์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ Discord.NET์„ ์ด์šฉํ•˜๋ฉด ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ด‡ ์ƒ์„ฑ

DEVELOPER PORTAL์—์„œ ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

image

image

๋‹ค์Œ Bot์—์„œ ๋ด‡์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

image

์ด ๋•Œ ์•ฑ ์ด๋ฆ„์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฆ„์ผ ๊ฒฝ์šฐ ๋ด‡์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•ฑ ์ด๋ฆ„์„ ์ ์ ˆํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Reset Token์œผ๋กœ ๋ด‡ API์—์„œ ์‚ฌ์šฉํ•  ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image

์ ์ ˆํ•œ ์ธํ…ํŠธ๊ฐ€ ํ™œ์„ฑํ™” ๋˜์ง€ ์•Š์œผ๋ฉด ๋ด‡ ์‹œ์ž‘ ์‹œ ์ •์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

image

๋‹ค์Œ ์„œ๋ฒ„์— ๋ด‡์„ ์ถ”๊ฐ€ํ•  URL์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

image

(BOT PERMISSIONS๋Š” ํŽธ์˜์ƒ Administrator๋ฅผ ์ฒดํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ๋Š” ํ•„์š”์— ๋ถ€ํ•ฉํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ํผ๋ฏธ์…˜๋งŒ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

Discord๊ฐ€ ๋กœ๊ทธ์ธ ๋œ ์ƒํƒœ์—์„œ ํด๋ฆฝ๋ณด๋“œ ๋ณต์‚ฌ๋œ ์ฃผ์†Œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ž์‹ ์˜ ์„œ๋ฒ„์— ๋ด‡์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image

image

Discord.NET์„ ์ด์šฉํ•ด์„œ ์• ์ฝ” ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋ด‡์˜ ์‹œ์ž‘์€ ์—์ฝ” ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ฝ˜์†” ํ”„๋กœ์ ํŠธ๋กœ ๋จผ์ € Discord.NET ํŒจํ‚ค์ง€๋ฅผ ํ”„๋กœ์ ํŠธ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

image

๋‹ค์Œ์€ ๋””์Šค์ฝ”๋“œ ๋ด‡์˜ ๊ธฐ๋ณธ ์—์ฝ” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค.

using Discord;
using Discord.Commands;
using Discord.WebSocket;

using System.Reflection;

var client = new DiscordSocketClient(new()
{
    LogLevel = LogSeverity.Verbose,
    // ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ผญ ํ•„์š”ํ•œ intent๋งŒ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
    GatewayIntents = GatewayIntents.All ^ (GatewayIntents.GuildPresences | GatewayIntents.GuildScheduledEvents | GatewayIntents.GuildInvites)
});
var commandService = new CommandService(new()
{
    LogLevel = LogSeverity.Verbose,
});

client.Log += OnClientLogReceived;
commandService.Log += OnClientLogReceived;

await client.LoginAsync(TokenType.Bot, "๋ด‡ ํ† ํฐ");
await client.StartAsync();
await commandService.AddModulesAsync(assembly: Assembly.GetExecutingAssembly(), services: null);

client.MessageReceived += OnClientMessage;
client.Ready += OnReady;

Console.ReadLine();

async Task OnClientMessage(SocketMessage arg)
{
    // ํด๋ผ์ด์–ธํŠธ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ

    // ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๊ฐ€ ์•„๋‹ˆ๋ฉด
    if (arg is not SocketUserMessage message)
        return;

    if (client is null || commandService is null)
        return;

    var pos = 0;
    
    //if (message.HasCharPrefix('!', ref pos) is false || message.HasMentionPrefix(_client.CurrentUser, ref pos) is true || message.Author.IsBot is true)
    
    
    if (message.HasCharPrefix('!', ref pos) is false || message.Author.IsBot is true)
        return;

    var context = new SocketCommandContext(client, message);
    await commandService.ExecuteAsync(context, pos, null);
}

Task OnReady()
{
    // ๋ด‡์ด ์‹œ์ž‘ ์ค€๋น„๋˜์—ˆ์„ ๋•Œ ๊ด€๋ จ ์ฒ˜๋ฆฌ

    return Task.CompletedTask;
}

Task OnClientLogReceived(LogMessage arg)
{
    // Discord ๋กœ๊ทธ ๊ธฐ๋ก
    Console.WriteLine(arg.ToString());

    return Task.CompletedTask;
}

/// <summary>
/// ๋ช…๋ น์–ด ๋ชจ๋“ˆ. commandService.AddModulesAsync()์— ์˜ํ•ด ์ถ”๊ฐ€๋จ
/// </summary>
public class RemoteModule : ModuleBase<SocketCommandContext>
{
    [Command("echo")]
    [Alias("!")]
    public Task Echo(string message) => Send(message);

    private Task Send(string message) => Context.Channel.SendMessageAsync(message);
}

์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด OnClientLogReceived()์— ์˜ํ•ด ๋‹ค์Œ์ฒ˜๋Ÿผ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ 

image

Discord ์ฑ„๋„์—์„œ ๋ด‡์—๊ฒŒ ๋ช…๋ น์„ ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

image

์ข€ ๋” ์ƒ์„ธํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ Discord.NET ์ œ๊ณต ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”!

4๊ฐœ์˜ ์ข‹์•„์š”