iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Software Development

我命由我不由語言 java爬蟲挑戰系列 第 18

java爬蟲挑戰 Day 18 - Discord Bot增加歡迎詞 & 轉Spring Bean

  • 分享至 

  • xImage
  •  

開始之前先補充一下,如何讓使用者將機器人加入伺服器時先自我介紹。

讓機器人自我介紹

DiscordBotListener

當你的 Discord Bot 被加入伺服器時,你可以利用 onGuildJoin 事件來讓機器人在預設的文字頻道中發送一條歡迎訊息,這樣用戶可以快速了解機器人的功能。

@Override
public void onGuildJoin(GuildJoinEvent event) {
    TextChannel defaultChannel = event.getGuild().getDefaultChannel().asTextChannel();
    if (defaultChannel != null) {
        String welcomeMessage = "大家好!我是小草租屋推播機器人,請使用 `!help` 查看我能幫助你做些什麼!";
        defaultChannel.sendMessage(welcomeMessage).queue();
    }
}

當機器人加入伺服器時,它會自動在伺服器的預設頻道發送一條歡迎訊息。
下圖是我將機器人加入一個新的伺服器的結果:
https://ithelp.ithome.com.tw/upload/images/20240904/20168635s0nUS5zXLK.png

Discord Bot 轉 Spring Bean

將 Discord Bot 轉換為 Spring Bean 可以讓我們更方便地管理機器人的生命周期和依賴注入。首先,我們創建一個新的介面 DiscordBotService,其中定義了傳送訊息的方法。

DiscordBotService

public interface DiscordBotService {
    String sendMessage(String channelId, String message);
    String tagUserAndSendMessage(String channelId, String userId, String message);
}

這個介面簡單定義了兩個方法,一個用於發送普通訊息,另一個用於標記用戶並發送訊息。

DiscordBotService

接著,我們實作這個介面,並將機器人的初始化放在 Spring 的 @PostConstruct 方法中,確保機器人在 Spring 啟動時就已經被建立好。

@Service
public class DiscordBotServiceImpl implements DiscordBotService {

    @Value("${discord.token}")
    private String discordToken;

    Logger log = LoggerFactory.getLogger(DiscordBotServiceImpl.class);

    JDA jda;

    @PostConstruct
    public void init() {
        JDABuilder builder = JDABuilder.createDefault(discordToken);
        builder.enableIntents(GatewayIntent.MESSAGE_CONTENT);
        builder.addEventListeners(new DiscordBotListener());
        jda = builder.build();
        log.info("Discord bot creation completed.");
    }

    @Override
    public String sendMessage(String channelId, String message) {
        TextChannel channel = jda.getTextChannelById(channelId);
        if (channel != null) {
            channel.sendMessage(message).queue();
        }
        return "success";
    }

    @Override
    public String tagUserAndSendMessage(String channelId, String userId, String message) {
        TextChannel channel = jda.getTextChannelById(channelId);
        if (channel != null) {
            String taggedMessage = "<@" + userId + "> " + message;
            channel.sendMessage(taggedMessage).queue();
        }
        return "success";
    }

}

移除 DiscordBotRunner

在之前的實作中,我們將所有的 Discord Bot 邏輯放在 DiscordBotRunner 中,而現在,我們可以將這部分邏輯移動到 Spring Bean 中,並通過注入 DiscordBotService 來實現訊息傳送。

測試結果

為了方便測試,使用本來的DiscordBotRunner進行訊息發送測試。

@Component
public class DiscordBotRunner implements ApplicationRunner {

    @Autowired
    DiscordBotService discordBotService;

    @Override
    public void run(ApplicationArguments args) throws Exception {
        discordBotService.sendMessage("你的Channel Id", "使用Service服務發送訊息。");
    }

}

https://ithelp.ithome.com.tw/upload/images/20240904/20168635RvWlSpIS4e.png

https://ithelp.ithome.com.tw/upload/images/20240904/20168635VtG2b3hYNE.png

可以看到程式有順利運行

git現狀

https://ithelp.ithome.com.tw/upload/images/20240904/20168635aPYTGGtw4d.png

小結

今天我們成功地將 Discord Bot 轉換為 Spring Bean,並且添加了當機器人加入伺服器時的自我介紹功能。這樣一來,我們的 Discord Bot 不僅更易於管理,還能更好地與 Spring 框架整合。
明天預計設計Discord Bot的指令!


上一篇
java爬蟲挑戰 Day 17 - 實作Discord Bot的基本功能 (2)
下一篇
java爬蟲挑戰 Day 19 - Discord Bot !help 指令規劃
系列文
我命由我不由語言 java爬蟲挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言