在 doBotCommand 方法中,我們需要增加處理新的指令 !info 和 !reset。!info 用來顯示使用者的訂閱資訊,而 !reset 則是重置用戶的所有設定,這樣用戶可以隨時重新設定推播條件。
case "!info":
    botResponeMessage = discordBotCommandService.showInfoCommand(userId);
    break;
case "!reset":
    botResponeMessage = discordBotCommandService.showInfoCommand(userId);
    break;
為了讓使用者能夠透過 Discord 以嵌入訊息的形式看到訂閱狀態,我們新增了一個 toEmbed 方法。這個方法將使用者的訂閱資訊格式化為 Discord 的嵌入訊息格式。
// 將 SubscribeUser 物件的屬性轉換為 EmbedBuilder 物件,方便在 Discord 中顯示
public EmbedBuilder toEmbed() {
    EmbedBuilder embedBuilder = new EmbedBuilder();
    embedBuilder.setTitle("訂閱資訊");
    embedBuilder.setColor(0x00FF00); // 設定綠色的嵌入框架
    // 基本資訊避免ID洩漏,暫時不顯示用戶ID及頻道ID
    embedBuilder.addField("訂閱狀態", isSubscribe != null && isSubscribe ? "已訂閱" : "未訂閱", false);
    // 設定價格區間的顯示邏輯
    String priceRange = (lowestPrice != null ? lowestPrice : "無下限") + " ~ "
            + (highestPrice != null ? highestPrice : "無上限");
    embedBuilder.addField("價格區間", priceRange, false);
    // 設定樓層區間的顯示邏輯
    String floorRange = (lowestFloor != null ? lowestFloor : "無下限") + " ~ "
            + (highestFloor != null ? highestFloor : "無上限");
    embedBuilder.addField("樓層區間", floorRange, false);
    // 房型資訊的處理
    embedBuilder.addField("房型條件", rooms.isEmpty() ? "無指定" : String.join(", ", rooms), false);
    // 地址資訊的處理
    embedBuilder.addField("搜尋地區", address.isEmpty() ? "無指定" : String.join(", ", address), false);
    // 設備要求的處理
    embedBuilder.addField("設備要求", items.isEmpty() ? "無指定" : String.join(", ", items), false);
    return embedBuilder;
}
此方法將使用者的訂閱狀態、價格區間、樓層區間、房型條件、搜尋地區及設備要求,逐一轉換為 Discord 嵌入訊息的欄位,方便閱讀。
在 DiscordBotCommandServiceImpl 中,我們實作了兩個方法:showInfoCommand 和 resetCommand。
showInfoCommand 方法來取得指定用戶的訂閱資訊,並將結果轉換為嵌入格式,方便在 Discord 中顯示。@Override
public EmbedBuilder showInfoCommand(String userID) {
    // 從資料庫中找到對應的使用者訂閱資料
    SubscribeUser subscribeUser = subscribeUserRepository.findByUserId(userID);
    // 使用 toEmbed 方法將用戶資料轉換為 EmbedBuilder 格式
    return subscribeUser.toEmbed();
}
resetCommand 方法會將用戶的所有訂閱設定清空,讓使用者能重新設定新的條件。@Override
public EmbedBuilder resetCommand(String userID) {
    // 獲取用戶資料,若不存在則新建一個空的訂閱用戶
    SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, "");
    // 訂閱狀態重置為未訂閱
    subscribeUser.setIsSubscribe(false);
    // 清空用戶的所有設定,包括房型、地址、設備、價格及樓層區間
    subscribeUser.getRooms().clear();
    subscribeUser.getAddress().clear();
    subscribeUser.getItems().clear();
    subscribeUser.setLowestPrice(null);
    subscribeUser.setHighestPrice(null);
    subscribeUser.setLowestFloor(null);
    subscribeUser.setHighestFloor(null);
    // 儲存變更至資料庫
    subscribeUserRepository.save(subscribeUser);
    // 返回重置成功的訊息
    return stringToEmbed("所有租屋條件已重置成功!");
}
這段程式碼的核心是清空用戶的所有設定,並將結果更新到資料庫中。最後返回一個嵌入訊息,通知使用者重置完成。
 


 
 
今天的架構圖進度更新,雙向互動邏輯已完成。原先的設計認為只需要單向推播到 Discord,但事實上用戶需要能夠透過 Discord 來調整推播條件,因此調整成雙向互動。
而現在使用者已經可以透過Discord 來調整推播條件了,所已下列進度也完成了。

今天完成了重置及查看訂閱資訊的功能,明天開始開發推播往Discord左邊箭頭的部分。