Skip to main content

Command Palette

Search for a command to run...

Discord 봇 만들기

Published
2 min read

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 제공 문서를 참조하세요!

https://discordnet.dev/guides/introduction/intro.html

19 views

More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read17

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read20

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.