今天的目標是實作 !sub、!unsub 和部分 !info 指令,並且處理未知指令。這些指令的核心功能在於使用資料庫來記錄用戶的訂閱狀態,因此我們建立一個 SubscribeUser 的資料表來儲存相關資訊。
首先,我們建立一個簡單的 SubscribeUser 實體來儲存用戶的 userId 和 channelId及isSubscribe(訂閱狀態),以便記錄哪個用戶在哪個頻道訂閱了機器人推播。
@Entity
@Data
public class SubscribeUser {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String channelId;
private String userId;
private Boolean isSubscribe;
}
接著,建立 SubscribeUserRepository 來處理與資料庫的交互操作。我們只需要透過 userId 來查詢用戶的訂閱狀態。
public interface SubscribeUserRepository extends JpaRepository<SubscribeUser, Long> {
SubscribeUser findByUserId(String userId);
}
增加了!sub、!unsub 和部分!info 指令,並且處理未知的指令。
@Override
public void onMessageReceived(MessageReceivedEvent event) {
if (event.getAuthor().isBot())
return;
String message = event.getMessage().getContentRaw();
if (message.startsWith("!")) {
String channelId = event.getChannel().getId();
log.info("所在頻道為: {}", channelId);
String userId = event.getAuthor().getId();
log.info("下指令者為: {}", userId);
log.info("收到指令: {}", message);
doBotCommand(message, channelId, userId);
}
}
private void doBotCommand(String message, String channelId, String userId) {
EmbedBuilder botResponeMessage;
if (message.startsWith("!help")) {
botResponeMessage = discordBotCommandService.helpCommand();
} else if (message.startsWith("!sub")) {
botResponeMessage = discordBotCommandService.subscribeCommand(userId, channelId);
} else if (message.startsWith("!unsub")) {
botResponeMessage = discordBotCommandService.unsubscribeCommand(userId);
} else if (message.startsWith("!info")) {
botResponeMessage = discordBotCommandService.showInfoCommand(userId);
} else {
botResponeMessage = discordBotCommandService.unKnowCommand();
}
discordBotService.sendMessage(channelId, botResponeMessage);
}
接下來是今天的核心實作,包含訂閱、解除訂閱以及顯示用戶資訊的指令處理邏輯。
@Override
public EmbedBuilder subscribeCommand(String userID, String channel) {
// 目前沒有多個訂閱的機制,每次更新都覆蓋掉之前的資料
SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, channel);
subscribeUser.setIsSubscribe(true);
subscribeUserRepository.save(subscribeUser);
return stringToEmbed("訂閱成功");
}
@Override
public EmbedBuilder unsubscribeCommand(String userID) {
SubscribeUser subscribeUser = getOrNewSubscribeUser(userID, "");
subscribeUser.setIsSubscribe(false);
subscribeUserRepository.save(subscribeUser);
return stringToEmbed("解除訂閱成功");
}
@Override
public EmbedBuilder showInfoCommand(String userID) {
SubscribeUser findByUserId = subscribeUserRepository.findByUserId(userID);
if (Objects.nonNull(findByUserId) && findByUserId.getIsSubscribe()) {
return stringToEmbed("目前有訂閱");
} else {
return stringToEmbed("目前無訂閱");
}
}
private SubscribeUser getOrNewSubscribeUser(String userID, String channel) {
SubscribeUser subscribeUser = subscribeUserRepository.findByUserId(userID);
if (Objects.isNull(subscribeUser)) {
subscribeUser = new SubscribeUser();
subscribeUser.setUserId(userID);
subscribeUser.setChannelId(channel);
}
return subscribeUser;
}
@Override
public EmbedBuilder unKnowCommand() {
EmbedBuilder embedBuilder = stringToEmbed("未知的指令,請檢查指令後重新輸入,也可輸入`!help`確認指令。");
embedBuilder.setColor(0xFF0000); // 紅色
return embedBuilder;
}
訂閱
查詢訂閱狀態
解除訂閱
查詢訂閱狀態
輸入未知指令
今天完成了訂閱及解除訂閱的指令,並且已經成功把使用者的訂閱狀態寫在資料庫中了,明天我們繼續把剩下的指令完成。