在 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左邊箭頭的部分。