Spring boot 2.7.2 整合Simbot3.0.0.preview.20.0+mirai組件用Java開發(fā)群聊機器人
前言
Simbot3.0與Mirai皆為開源框架,為了更好的學(xué)習(xí)與開發(fā)在此記錄。
ForteScarlet/simpler-robot: Simple Robot是一個通用bot開發(fā)框架,以同一種靈活的標(biāo)準(zhǔn)來編寫不同平臺的bot應(yīng)用。simpler-robot是用于區(qū)別于舊版本倉庫 simple-robot 的新版本命名。 (github.com)
mamoe/mirai: 高效率 QQ 機器人支持庫 (github.com)?

最近重構(gòu)了一下代碼,發(fā)現(xiàn)simbot3最新版已經(jīng)到3.0.0.preview.20.0了,所以在這里記錄一下本人遇到的一些新問題與解決思路。
首先修改pom文件
這里我們使用springboot 2.7.2版本進行開發(fā)。
接下來在啟動類上開啟simbot@EnableSimbot,與之前版本一致。
接下來在resources文件夾下創(chuàng)建simbot-bots文件夾,接下來在其中寫入我們的機器人配置
機器人配置與之前版本相對多了一些配置,有興趣的可以去官網(wǎng)查看,這里就還用之前的配置不變。
接下來我們有一個這樣的需求,我們需要去做一個群消息的記錄,要求支持文字與圖片,同時在多個群的情況下支持記錄的開啟與關(guān)閉
定時器
首先想在多群情況下對單個群進行的消息記錄實現(xiàn)開啟與關(guān)閉,那么我們就需要對群進行標(biāo)記,那么在這里我們使用數(shù)據(jù)庫mysql進行記錄。
首先建立表group
使用mybatis-plus自動生成service層與mapper,這里就不詳細講了。
接下來在項目中創(chuàng)建timer文件夾,并創(chuàng)建定時類SaticScheduleTask

并將定時類加入到spring容器內(nèi)
同時引入groupService
創(chuàng)建定時方法
這里我們規(guī)定每天凌晨1點執(zhí)行這個方法,加載所有機器人所加入的所有群信息,并默認將所有群設(shè)為非激活狀態(tài)。
如果想修改時間的話,修改@Scheduled(cron = "0 0 1 * * ? ")里面的cron參數(shù)就好,參考cron語法。
之后想增加多少個定時方法,就在SaticScheduleTask類里添加方法,并在方法上標(biāo)注@Scheduled注解即可。
如果定時方法不起效的話,請檢查springboot啟動是否存在@EnableScheduling注解。
監(jiān)聽器
群消息我們已經(jīng)存入并標(biāo)記了,那么接下來就需要進行對相對應(yīng)的群進行消息記錄了。
首先創(chuàng)建監(jiān)聽類BotListenerController
然后在創(chuàng)建一個groupUserInfoService類,防止最后這個監(jiān)聽類寫到后面方法太長不方便查看。
然后創(chuàng)建GroupUserInfoServiceImpl類并繼承g(shù)roupUserInfoService類。
這里加入了事務(wù),是為了防止后面在類里面寫長方法時出現(xiàn)異常回滾,而不會出現(xiàn)其他問題。
在這里我們需要記錄群所有消息,那么還是需要創(chuàng)建一張表。
然后在GroupUserInfoServiceImpl類里加入兩個方法。
回到BotListenerController類里,將GroupUserInfoService引入進來。
接下來我們在BotListenerController類開始編輯我們的第一個監(jiān)聽方法。
這樣,我們就實現(xiàn)了一個群消息監(jiān)聽。
但是你會發(fā)現(xiàn)這樣只會監(jiān)聽所有的群消息,而不能進行調(diào)整群記錄的開關(guān)。
當(dāng)然,你會發(fā)現(xiàn)我已經(jīng)在GroupUserInfoServiceImpl類里寫好了isGroupActivate方法,通過這個方法,可以在GroupInfoLog類里進行判斷,這樣也可以實現(xiàn)調(diào)整群記錄的開關(guān)。
但是在我自己開發(fā)過程中,如果我需要頻繁的調(diào)用isGroupActivate這個方法,然后再去判斷的話,感覺好麻煩,可不可以在一開始就過濾掉這種沒激活的群。
于是我發(fā)現(xiàn)了新版本中的一個好東西。
@Filters
創(chuàng)建filter包并在其中創(chuàng)建IsGroupActivateFilterFactory類

然后在BotListenerController類中添加
@Filters(value = {
? ? ?@Filter(by = IsGroupActivateFilterFactory.class)
})
這樣的話,每次觸發(fā)該監(jiān)聽方法時,會通過IsGroupActivateFilterFactory類進行判斷,如果群為激活,那么才會觸發(fā)該方法。
多個監(jiān)聽方法的情況下,哪個需要激活群執(zhí)行的話,就加這個過濾就好。
當(dāng)然,如果是多個Filter也是可以的。
具體請以simbot3源碼為準(zhǔn)。