티스토리 뷰

목차

1. 기본틀 설명

2. GetOriginalResponseAsync

3. Context

4. Embed Send

5. Menu Send

 

1. 기본틀 설명

기본 틀은 다음과 같습니다.

public class InteractionModule : InteractionModuleBase<SocketInteractionContext>
{
    [SlashCommand("ping", "Hello World")]
    public async Task HandlePingTest()
    {
        await RespondAsync("Bot is alive");
    }
}

 

SlashCommand 리플렉션을 통해 키워드와 설명을 적어줄 수 있는데, 첫 번째가 키워드 네임, 두 번째가 설명입니다.

Discord.net에서 제공하는 리플렉션에 대한 종류는 엄청 많은데 궁금하신 분들은 공식 Document를 확인해보시면 될 것같습니다. 저는 SlashCommand만 사용했기때문에 ㅎㅎ;

 

2. GetOriginalResponseAsync

그리고 RespondAsync를 통해 생성된 메시지의 ID를 얻어오고 싶은 경우가 있을 수 있습니다. 이럴 경우, GetOriginalResponseAsync().Result 를 통해 생성된 message 정보를 얻어올 수 있습니다.

FollowAsyncmessage정보를 리턴하는데 FollowAsync의 경우 RespondAsyncDeferAsync를 호출한 이후에 호출할 수 있어서 RespondAsync로 생성된 메시지의 정보는 얻지 못하더라구요.

[SlashCommand("ping", "Hello World")]
public async Task HandlePingTest()
{
	await RespondAsync("Bot is alive");
	var message = GetOriginalResponseAsync().Result;
	Console.WriteLine(message.Id);
}

 

3. Context

그리고 SocektInteractionContext로 받았기 때문에, 안에는 호출된 디스코드 서버의 Guild, Channel 정보를 다 얻어올 수 있습니다. 이를 통해서 특정 TextChannel을 삭제한다던지 할 수 있습니다. counts는 특정 메시지의 아이디를 들고 있는 리스트이며, 제가 위 코드를 통해 넣어둔 상태입니다.

 

4. Embed Send

그리고 Embed형태로도 보낼 수 있는데 여기서 Embed형태는 아래와 같은 형태를 말합니다.

 

사용하는 방법은 다음 코드와 같습니다. EmbedBuilder 를 통해 형태를 구성하고, build()를 통해 Embed를 생성합니다.

그리고 addField를 통해 추가할 수도 A, B 이런식으로 추가도 할 수 있습니다.

AddField는 (Title, Description)으로 넣으시면됩니다.

EmbedBuilder builder = new EmbedBuilder()
            .WithTitle("Today 학식")
            .WithDescription("학식입니다.")
            .WithColor(Color.Green);
            .AddField("A", "~~~~");
            
Embed myEmbed = builder.build();

await RespondAsync(embed: myEmbed);

 

5. Menu Send

Menu는 두 가지의 Builder가 필요합니다. 첫 번째는 SelectMenuBuilder와 ComponentBuilder 입니다.

SelectMenuBuilder를 통해 메뉴를 만들고, Component에 넣은 후 Respond하면 됩니다.

참고로 Button도 형식이 비슷합니다.

var menu = new SelectMenuBuilder()
{
    CustomId = "menu",
    Placeholder = "Select Days"
};

//(출력값, Key)
menu.AddOption("월", "Mon");
menu.AddOption("화", "Tue");
menu.AddOption("수", "Wed");
menu.AddOption("목", "Thu");
menu.AddOption("금", "Fri");

// Component에 추가
var component = new ComponentBuilder();
component.WithSelectMenu(menu);

await RespondAsync("Show Select Menu", components: component.Build());

 

단 Menu는 다음과 같은 코드가 필수적으로 필요한데, 메뉴 선택 시 발생한 Interation을 동작하는 코드입니다. 제 코드 같은 경우에는 sql 동작을 하는 코드로 만들어놨기 때문에, 동작하지는 않지만 여러분이 필요한 코드를 넣으시면 됩니다. 참고로 string[] inputs에는 위의 AddOption에서 설적한 Key값이 들어옵니다.

[ComponentInteraction("menu")]
public async Task HandleMenuSelection(string[] inputs)
{
    if (inputs[0] == "Mon")
    {
        myembed = sql.ReadCafeterial("월요일 학식", DateUtils.Monday());
        await RespondAsync(embed: myembed);
    }
    else if (inputs[0] == "Tue")
    {
        myembed = sql.ReadCafeterial("화요일 학식", DateUtils.Tusday());
        await RespondAsync(embed: myembed);
    }
    else if (inputs[0] == "Wed")
    {
        myembed = sql.ReadCafeterial("수요일 학식", DateUtils.Wednesday());
        await RespondAsync(embed: myembed);
    }
    else if (inputs[0] == "Thu")
    {
        myembed = sql.ReadCafeterial("목요일 학식", DateUtils.Thursday());
        await RespondAsync(embed: myembed);
    }
    else if (inputs[0] == "Fri")
    {
        myembed = sql.ReadCafeterial("금요일 학식", DateUtils.Friday());
        await RespondAsync(embed: myembed);
    }
}

 

실행 동작

'개인적인 취미 > 디스코드 봇 만들기 With C#' 카테고리의 다른 글

기본 틀 제작하기 #2  (0) 2023.06.12
서론 Discord.Net #1  (0) 2023.06.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함