[精讚] [會員登入]
379

【JDA/discord bot】取得頻道第一筆或最新(最後一筆)的歷史訊息

在不處理訊息的先後順序下取得相關的歷史訊息

分享此文連結 //n.sfs.tw/16361

分享連結 【JDA/discord bot】取得頻道第一筆或最新(最後一筆)的歷史訊息@小編過路君子
(文章歡迎轉載,務必尊重版權註明連結來源)
2024-02-15 15:04:43 最後編修
2024-02-15 02:36:50 By 過路君子
 

哈囉大家好,這裡是覺得Java很麻煩的小編過路君子

同樣的功能 Python3 都會提供好,但在 JDA 下都必須自行處理相關的問題

 

 

小編所使用的 JDA 版本是:5.0.0-beta.20,有看上一篇的人不用緊張,小編是真的換版本了。

為了以防萬一,小編在此統一事前聲明一下,以下的方式不會進行 Asynchronous 的等待,換句話說,若在查詢頻道訊息的歷史紀錄之前,有使用 sendMessage() 之類的函數傳送訊息的話,有可能會從倒數第二筆的訊息開始取得,而非從剛剛傳送的訊息開始取得。

若想要搭配 sendMessage() 之類的函數使用並正確的取得頻道可以參考小編的另一篇文章:【JDA/discord bot】刪除事件或slash(斜槓)指令的reply訊息

 

 

取得該頻道第一筆的歷史訊息

取得頻道中的第一條訊息比較簡單,因為已經有現成的函示可以呼叫並使用。

import java.util.List;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;


public void getFirstMessage(JDA bot)
{
    // Get the channel
    long channelID = 900000000L;
    TextChannel channel = bot.getTextChannelById(channelID);

    // If you want to get the first ten histories
    // Replace getHistoryFromBeginning(1) with getHistoryFromBeginning(10).
    channel.getHistoryFromBeginning(1).queue(history ->
    {
        if(history.isEmpty()) return;

        // Get all historical messages.
        // The number of messages is equal to the value in the getHistoryFromBeginning(n) above.
        List<Message> historyList = history.getRetrievedHistory();

        // The first message is at 0
        // The second message is at 1, and so on.
        Message first = historyList.get(0);

        // Get the message content
        String content = first.getContentDisplay();
    });
}

上方的範例程式碼僅僅只有取回頻道的第一條訊息。

若想要取得頻道的前十條訊息,僅需將上方的 getHistoryFromBeginning(1) 改為 getHistoryFromBeginning(10) 即可,其他數量的訊息也是同樣的動作。

基本上 historyList 的長度就會是 getHistoryFromBeginning 中所給定的數值,若不足,則是因為該頻道中沒有那麼多的訊息,可以使用 historyList.size() 來確認實際的訊息數量。

 

取得該頻道最後一筆的歷史訊息

相較於取得第一筆訊息的輕鬆,取得最後一筆的頻道訊息就稍稍有些麻煩了。

這也是小編為何要撰寫這篇文章,因為怕不寫下來之後小編自己又要花大量時間重新摸索。

import java.util.List;
import net.dv8tion.jda.api.JDA;
import java.util.stream.Collectors;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.entities.channel.concrete.TextChannel;

public void getLastMessage(JDA bot)
{
    // Get the channel
    long channelID = 9000000000L;
    TextChannel channel = bot.getTextChannelById(channelID);

    try
    {
        // Get all historical messages.
        // The number of messages is equal to the value in the takeAsync(n) above.
        List<Message> message = channel.getIterableHistory().takeAsync(1).thenApply(list -> list.stream().collect(Collectors.toList())).get();
        
        // The last message in the countdown is at 0
        // The penultimate message is at 1, and so on.
        if(message.isEmpty()) return;
        Message lastone = message.get(0);
        
        // Get the message content
        String lastone = first.getContentDisplay();
    }
    catch(Exception error) {System.out.println(error);}
}

上方的程式碼僅會取回位在頻道的最後一條訊息。

但若在此之前有使用諸如 sendMessage() 之類的函式,有可能不會取回剛剛所傳送的訊息,因為以上的範例不會等待 Async 完成。

若需要等待相關的 Async 完成的話,可以去參考小編開頭所提到的文章,那篇便有去處理相關的問題。

 

若想要取回更多筆的資料,可以將上方範例中的 takeAsync(1) 中的數字替換為想要取回的歷史訊息數量。

例如若想要取回十筆的話,就改成 takeAsync(10) 就可以了!

 

 

 

後記

真的沒想到 JDA 竟然沒有提供如 getLastMessage() 這類的快捷函式以供使用,但就算提供了,依照 JDA 的尿性,說不定又是從快取中取得相關的資訊,然後可能結果也不是我們想要的。

但無奈 Java 的執行效率就是比 Python3 還要好,希望未來的 JDA 能越來越強大,讓偉大的 Java 再次崛起吧!

那至於小編會不會考慮 discord.js 呢?雖然小編知道 Node.js 的強大之處,但至少目前是不會的,就讓 Javascript 停留在網頁上吧。

END

你可能感興趣的文章

【Nexus Repository Manager】(deploy)使他人可以對遠端資料庫做讀寫 使用 Nexus Repository Manager 來讓各個工程師控制自己的 Jar 包,不會有 Github Merge Crashed 問題。

【Wildfly/jBoss】[Linux](Connection Datasource)如何與MySQL資料庫建立連線 網頁瀏覽器和資料庫的關係密不可分,而通常會將兩者分開架設在不同的伺服器上面來提供服務,這時要如何進行連線呢?

【Discord bot 2.0.1】(discord.ui.View)如何將舊機器人升級至目前最新版本 很多時候升級軟體是為了讓別人覺得你的程式很先進,但這次卻是因為要使用某個新功能

【Wicket】[Header]如何讀取來自客戶端地檔頭和傳送自訂擋頭至客戶端 當需要設定檔頭或是讀取來自客戶端的檔頭時,這些程式碼就很好用

【教程】(進階版)如何用Sigil製作一本高質量的epub 下載好了Sigil之後除了直接把文字貼進去以外,還有:變更字型、著色、導入CSS……等等功能,不知道你有沒有發現呢?

【Docker&Wildfly】(bitnami/wildfly)如何從零開始創建網頁伺服器 使用他人的 docker image 來架設我們的 wildfly web server

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

[活動] 2017年4/1雲空幻想愚人節活動彩蛋&攻略 (紀念性質) 雲空幻想2017年的愚人節活動介紹同時也是本小編的第一篇網路文章(*^ω^)♪

高捷少女:美麗島的守護者③ 小雅閉上眼睛,思索在高捷發生的點點滴滴。她心意已決,在高捷的日子的確也有快樂的部分,不過她相信換個方向是更好的決定。有關高捷的所有美好回憶,小雅決定保留在心裡就好,繼續在高捷工作只會讓自己更痛苦而已,

高捷少女:耐耐的新年驚喜① 耐耐拿出手機。「我回來囉。」她說。幾分鐘後,木門緩緩打開。當它完全開啟的那一刻,小穹手中的包包掉到地上;艾米揉揉雙眼,確定自己看見的景象;婕兒的三魂七魄飛到了九霄雲外。

婕兒──她的青春④ 「投降吧,耐耐!這回合妳將不會再有獲勝的機會了!哈哈哈哈!」 「妳確定?」耐耐臉上泛起一絲微笑,並將手中的牌展示給婕兒看 婕兒的笑容僵住了。恐懼浮現在她的臉。

【歌評】蓮台野夜行 - 少女秘封倶楽部 少女秘封俱樂部 我們的主角終於出場啦!這首歌一反蓮台野夜行的固有風格,總是華麗的開始又華麗的結束!