微信扫一扫 分享朋友圈

已有 1035 人浏览分享

[其他幫助] Discord Bot連接應用

[複製鏈接]

集團新軍

Rank: 1

116

威望

391

金錢

44

A幣
主題
1
帖子
15
精華
0
綜合社群主題發文量
5
電玩社群主題發文量
0
娛樂社群主題發文量
0
技術社群主題發文量
1
閱讀權限
10
註冊時間
2016-10-31
  • TA的每日心情

    2022-4-25 01:05
  • 簽到天數: 52 天

    連續簽到: 1 天

    [LV.5]常住居民I

    g9502995 發表於  2022-1-25 14:12:31 | 顯示全部樓層 | 閱讀模式
    本帖最後由 g9502995 於 2022-1-28 13:31 編輯

    不知道能不能在這裡發這個
    最近在用伺服器時突然想到 何不用個Discord BOT來讓玩法更多元
    這個教學只教一些基礎的東西 後續再由各位發揮囉
    首先當然要先下載檔案囉
    使用的是JDA連接在這:https://github.com/DV8FromTheWorld/JDA


    首先打開netbeans 創建一個java package 名字可以自己取
    螢幕擷取畫面 2022-01-25 000204.png
    下載最新的JDA版本 兩種都要下載

    螢幕擷取畫面 2022-01-28 124111.png
    把JDA-5.0.0-alpha.2-withDependncies.jar加進去
    687474703a2f2f692e696d6775722e636f6d2f35435a494a59462e706e67.png
    然後對它點右鍵
    3.png

    找到剛剛下載的javadoc
    螢幕擷取畫面 2022-01-28 123337.png

    這樣就完成了

    螢幕擷取畫面 2022-01-28 123545.png 也可以下載這個:
    https://drive.google.com/file/d/ ... Zq/view?usp=sharing


    在你剛剛創建的新的Java Package裡再新增一個Java Class 名字隨便 我是取DiscordMain.java
    新增這串

    public class DiscordMain {

        private static JDA jda;
        private String token;
        public static TextChannel textChannel;

        public DiscordMain(String token, String guild, String textChannel)
            throws LoginException, InterruptedException {
            this.token = token; //你的BOT TOKEN
            jda = JDABuilder.createDefault(token).build();
            jda.setAutoReconnect(true);
            jda.awaitReady();
            this.textChannel = jda.getTextChannelById(textChannel);

        }  
    }


    至於bot token不知道的人可以去網路上google discord bot token如何取得
    然後再到server.Start.java裡新增

    public static DiscordMain bot;

    try {
                bot = new DiscordMain("你的BOT TOKEN","你的DC伺服器ID","你的頻道ID");
            } catch (LoginException ex) {
                Logger.getLogger(Start.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InterruptedException ex) {
                Logger.getLogger(Start.class.getName()).log(Level.SEVERE, null, ex);
            }



    大概長這樣
    螢幕擷取畫面 2022-01-25 123252.png

    然後就可以打包Java來測試了 記得把我上面的檔案丟到java的ext資料夾裡
    螢幕擷取畫面 2022-01-25 123806.png
    看到這個就代表成功上線

    那我們再來新增一些東西 玩家創建角色提示:在你的DiscordMain.java新增


      public static void sendMessage(String msg) {
           textChannel.sendMessage(msg).queue();
        }


    在MapleMap.java找這一串

    World.Broadcast.broadcastMessage(MaplePacketCreator.getItemNotice("【歡迎】:" + chr.getName() + " 來到了"+ chr.getClient().getChannelServer().getServerName() +"!大家熱烈歡迎!"));

    在他下面新增

    DiscordMain.sendMessage("【歡迎】:" + chr.getName() + " 來到了"+ chr.getClient().getChannelServer().getServerName() +"!大家熱烈歡迎!");



    好了後打包
    成功
    螢幕擷取畫面 2022-01-25 140809.png


    可以做的功能還很多 就靠大家自己發揮了
    我在8F新增了一些東西 http://www.xinbiao-aicl.com/foru ... =16822&fromuid=4745













    共收到 60 A幣
    打賞榜
    共打賞 20 A幣
    共打賞 20 A幣
    共打賞 20 A幣
    暫無
    ----
    暫無
    ----
    暫無
    ----
    暫無
    ----

    區域版主

    Rank: 10Rank: 10Rank: 10

    20

    威望

    264

    金錢

    19

    A幣
    主題
    132
    帖子
    172
    精華
    0
    綜合社群主題發文量
    20
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    5
    技術社群主題發文量
    0
    閱讀權限
    100
    註冊時間
    2017-2-26
  • TA的每日心情
    無聊
    2022-1-30 09:44
  • 簽到天數: 6 天

    連續簽到: 1 天

    [LV.2]偶爾看看I

    騎總統逛街 發表於 2022-1-25 14:36:02 | 顯示全部樓層
    哇!這功能很好!現在每服DC是標配,但裡面都死氣沉沉,這裝下去很快能活絡起來,有點牛B這功能

    集團新軍

    Rank: 1

    126

    威望

    189

    金錢

    0

    A幣
    主題
    2
    帖子
    29
    精華
    0
    綜合社群主題發文量
    1
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2017-6-16
  • TA的每日心情
    擦汗
    2022-4-26 09:24
  • 簽到天數: 43 天

    連續簽到: 1 天

    [LV.5]常住居民I

    aa806878 發表於 2022-1-25 22:50:55 | 顯示全部樓層
    請問上述都完成後沒有報錯,在遊戲中打字沒有跳到Discord是正常的嗎?

    集團新軍

    Rank: 1

    116

    威望

    391

    金錢

    44

    A幣
    主題
    1
    帖子
    15
    精華
    0
    綜合社群主題發文量
    5
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2016-10-31
  • TA的每日心情

    2022-4-25 01:05
  • 簽到天數: 52 天

    連續簽到: 1 天

    [LV.5]常住居民I

     樓主| g9502995 發表於 2022-1-25 23:37:08 | 顯示全部樓層
    本帖最後由 g9502995 於 2022-1-25 23:38 編輯
    aa806878 發表於 2022-1-25 22:50
    請問上述都完成後沒有報錯,在遊戲中打字沒有跳到Discord是正常的嗎?

    可以去ChatHandler.java裡面的GeneralChat下面新增
    跟後面的方法一樣 只是這樣如果在人多的服會很吵

    集團新軍

    Rank: 1

    126

    威望

    189

    金錢

    0

    A幣
    主題
    2
    帖子
    29
    精華
    0
    綜合社群主題發文量
    1
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2017-6-16
  • TA的每日心情
    擦汗
    2022-4-26 09:24
  • 簽到天數: 43 天

    連續簽到: 1 天

    [LV.5]常住居民I

    aa806878 發表於 2022-1-26 09:46:55 | 顯示全部樓層
    g9502995 發表於 2022-1-25 23:37
    可以去ChatHandler.java裡面的GeneralChat下面新增
    跟後面的方法一樣 只是這樣如果在人多的服會很吵 ...

    我不是很懂src  ,  需要解惑QQ
    我這樣輸入  dc  跑出的是編碼 , 還是說不是這樣打

        public static final void GeneralChat(final String text, final byte unk, final MapleClient c, final MapleCharacter chr) {
            if (chr != null && !CommandProcessor.processCommand(c, text, CommandType.NORMAL)) {
                if (!chr.isGM() && text.length() >= 80) {
                    return;
                }
                if (chr.getCanTalk() || chr.isStaff()) {

                    if (chr.isHidden()) {
                        chr.getMap().broadcastGMMessage(chr, MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isGM(), unk), true);
                      DiscordMain.sendMessage(chr.getName() + "說:"+ MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isGM(), unk));

                    } else {
                        chr.getCheatTracker().checkMsg();
                        chr.getMap().broadcastMessage(MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isGM(), unk));
                       DiscordMain.sendMessage(chr.getName() + "說:"+ MaplePacketCreator.getChatText(chr.getId(), text, c.getPlayer().isGM(), unk));
                    }

    集團新軍

    Rank: 1

    116

    威望

    391

    金錢

    44

    A幣
    主題
    1
    帖子
    15
    精華
    0
    綜合社群主題發文量
    5
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2016-10-31
  • TA的每日心情

    2022-4-25 01:05
  • 簽到天數: 52 天

    連續簽到: 1 天

    [LV.5]常住居民I

     樓主| g9502995 發表於 2022-1-26 12:26:04 | 顯示全部樓層
    aa806878 發表於 2022-1-26 09:46
    我不是很懂src  ,  需要解惑QQ
    我這樣輸入  dc  跑出的是編碼 , 還是說不是這樣打

    上面的String text已經有文字了
    所以你可以直接這樣用
    Chr.getName() + "說:" + text

    集團新軍

    Rank: 1

    116

    威望

    391

    金錢

    44

    A幣
    主題
    1
    帖子
    15
    精華
    0
    綜合社群主題發文量
    5
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2016-10-31
  • TA的每日心情

    2022-4-25 01:05
  • 簽到天數: 52 天

    連續簽到: 1 天

    [LV.5]常住居民I

     樓主| g9502995 發表於 2022-1-28 11:42:51 | 顯示全部樓層
    本帖最後由 g9502995 於 2022-1-28 20:22 編輯

    再來教個東西
    首先在Discord Package裡創建一個Java Class
    我是命名為EventListener
    然後新增下面這串
    1. public class EventListener extends ListenerAdapter{
    2.    

    3. public void onMessageReceived(MessageReceivedEvent event) {//當收到訊息時
    4.         Member m = event.getMember();
    5.         String[] msg = event.getMessage().getContentRaw().split(" ");
    6.         String a =msg[0];
    7.       if(m != null){
    8.                 if (msg[0].equalsIgnoreCase("!線上人數")) {//指令
    9.                     event.getMessage().delete().queue();
    10.                     m.getUser().openPrivateChannel().complete().sendMessageEmbeds(new EmbedBuilder()//使用私訊來發送訊息
    11.                          .setColor(Color.yellow)//顏色
    12.                          .addField(LoginServer.getServerName()+"目前正常運作中:green_circle: ",OnlinePlayer(),false)//文字內容
    13.                          .setTitle(LoginServer.getServerName()).build()).queue(message -> message.delete().queueAfter(30, TimeUnit.SECONDS)); //創建訊息並在30秒後自動刪除訊息           
    14.                 }
    15.        }else{//判斷成員
    16.              return;
    17.          }
    18.    return;
    19. }
    20.               
    21.             
    22.    

    23. private static String OnlinePlayer(){//查詢目前線上人數
    24.      int totalUsers = 0;
    25.      String player = "";
    26.         for (ChannelServer cs : ChannelServer.getAllInstances()) {
    27.             int channelUsers = cs.getConnectedClients();
    28.             totalUsers += channelUsers;
    29.             player = "目前線上人數:" + totalUsers;
    30.             
    31.         }
    32.      return player;
    33. }


    34.     }
    複製代碼


    完成後回到DiscordMain 裡面找到這串
    jda.awaitReady();
    在它上面新增
    jda.addEventListener(new EventListener());
    好了後打包
    就會像這樣
    螢幕擷取畫面 2022-01-28 114226.png

    集團新軍

    Rank: 1

    126

    威望

    189

    金錢

    0

    A幣
    主題
    2
    帖子
    29
    精華
    0
    綜合社群主題發文量
    1
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2017-6-16
  • TA的每日心情
    擦汗
    2022-4-26 09:24
  • 簽到天數: 43 天

    連續簽到: 1 天

    [LV.5]常住居民I

    aa806878 發表於 2022-1-28 19:38:06 | 顯示全部樓層
    g9502995 發表於 2022-1-26 12:26
    上面的String text已經有文字了
    所以你可以直接這樣用
    Chr.getName() + "說:" + text ...

    謝謝!這個有成功了,另外一篇的教學我在dc  打指令後跑出錯誤

    [JDA MainWS-ReadThread] ERROR net.dv8tion.jda.api.JDA - One of the EventListeners had an uncaught exception
    java.lang.IllegalStateException: Cannot delete another User's messages in a PrivateChannel.

    集團新軍

    Rank: 1

    116

    威望

    391

    金錢

    44

    A幣
    主題
    1
    帖子
    15
    精華
    0
    綜合社群主題發文量
    5
    電玩社群主題發文量
    0
    娛樂社群主題發文量
    0
    技術社群主題發文量
    1
    閱讀權限
    10
    註冊時間
    2016-10-31
  • TA的每日心情

    2022-4-25 01:05
  • 簽到天數: 52 天

    連續簽到: 1 天

    [LV.5]常住居民I

     樓主| g9502995 發表於 2022-1-28 20:01:16 | 顯示全部樓層
    本帖最後由 g9502995 於 2022-1-28 20:22 編輯
    aa806878 發表於 2022-1-28 19:38
    謝謝!這個有成功了,另外一篇的教學我在dc  打指令後跑出錯誤

    [JDA MainWS-ReadThread] ERROR net.dv8ti ...
    哈哈 謝謝你一直發問 讓我也可以順便學習去找問題
    我大概知道你是錯在哪了
    我這個指令是設定在頻道內打的 不是直接私密它 沒講清楚sorry想要變成私密以後如果有機會再講 或是你直接私密我

    另外根據上面那個錯誤可以加個判斷
    來讓它不會跑出那串
    1. public void onMessageReceived(MessageReceivedEvent event) {//當收到訊息時
    2.         Member m = event.getMember();
    3.         String[] msg = event.getMessage().getContentRaw().split(" ");
    4.         String a =msg[0];
    5.       if(m != null){
    6.                 if (msg[0].equalsIgnoreCase("!線上人數")) {//指令
    7.                     event.getMessage().delete().queue();
    8.                     m.getUser().openPrivateChannel().complete().sendMessageEmbeds(new EmbedBuilder()//使用私訊來發送訊息
    9.                          .setColor(Color.yellow)//顏色
    10.                          .addField(LoginServer.getServerName()+"目前正常運作中:green_circle: ",OnlinePlayer(),false)//文字內容
    11.                          .setTitle(LoginServer.getServerName()).build()).queue(message -> message.delete().queueAfter(30, TimeUnit.SECONDS)); //創建訊息並在30秒後自動刪除訊息           
    12.                 }
    13.        }else{//判斷成員
    14.              return;
    15.          }
    16.    return;
    17. }
    複製代碼




    您需要登錄後才可以回帖 登錄 | 註冊會員

    本版積分規則

    15

    發文

    391

    金錢

    44

    A幣

    ----------榮譽勳章----------

    熱門推薦
    圖文推薦
    • 關於我們
    • 企業文化
    • 人才招聘
    • 常見問題
    • 建議反饋
    • 合作夥伴
    • 新聞媒體
    • 商家合作
    • 客戶案例
    • 產品服務
    • 聯繫我們

    小黑屋|AICL社群娛樂集團

    GMT+8, 2022-6-28 14:24 , 網路刷新 0.127134 秒 .

    歡迎來到 AICL網路社群

    版權AICL社群所有 2011-2021.

    Total:123 Today:213 Online:322