2017-03-28 37 views
0

我正在創建一個'say'命令,允許我通過bot直接向特定的(或任何可能的)頻道發送消息。對於初學者和一般測試目的,我的目標是能夠使用標準的if(commandIs("command", message)直接在我的測試服務器上發送一個通道,最終演變到服務器上的所有通道。使用Discord.js發送跨渠道消息 - 'undefined'錯誤

通過我的研究,我在無意中發現的:

var channel = client.servers.get("name", "My Server").defaultChannel; client.sendMessage(channel, "Hello");

代碼,這正是我希望做的下榻地點,因爲我可以爲實際信道ID換出.get("name", "My server") ,而是通過有發言權般的命令做這個設置var在我的代碼信道類別,它不支持.sendMessage()

我當前的命令代碼如下所示:

if(commandIs("speak", message)){ 
    var chat = client.channels.get(18numberID); 
     if(args.length === 1){ 
       message.channel.sendMessage('You did not say anything. Usage: `a~speak [message]`') 
      } else { 
       chat.sendMessage(args.join(" ").substring(8)); 

- 但是這會導致undefined錯誤.sendMessage(),我認爲它會。我試過message.chat.sendMessage()以及其他所有可能的變體,即使只有兩行代碼在on.ready()處進行測試,但這仍然給我帶來了同樣的錯誤。我一直在尋找一種圍繞Channel類的方法,一旦找到了ID並創建了TextChannelGuildChannel擴展名,但我很確定考慮到所有代碼都有更簡單的方法(即使這裏有幾個示例)不包含所有額外的信息。我覺得我正在查看某些內容,或者可能使代碼更加複雜,但我不確定。

任何想法或幫助,將不勝感激。

編輯︰看來我是對的,我看了幾個關鍵點,特別是channelID沒有引號周圍是一個字符串。單單試了命令,一切都很順利;調整了主代碼,這一切都奏效了。

+0

不知道爲什麼它不會返回一個TextChannel ..你確定它是一個TextChannel嗎?也許有一個(安全?)限制在客戶端或什麼的。也許你應該試着詢問discord.js服務器的Discord。js官方#222078108977594368 –

+0

我一直對自己很好奇。我已經嘗試過所有可以用作初學者的編碼漏洞,但似乎沒有任何工作可做。我會確保聯繫官方的Discord.js服務器,看看他們對此有何看法。 – Esirza

+0

什麼是您的djs版本? – Aister

回答

1

首先,我只是勾勒出幾件事情,在Discord.JS庫不再工作(感謝擡頭泰Q.!)

首先,.sendMessage()有已被棄用,並且很可能不會很快/不再工作。這相當於.send() - 這更簡單,而且很容易做出改變。

第二:.defaultChannel不幸的是不再是一件事。當我們想發送消息時,我們必須更加具體。

我並不擅長談論這類問題,所以如果有其他人想要拿起它,請做。


好吧,讓我們讓你的命令設置了這樣的:a~speak [ChannelID] <Message>

比方說,我們使用這個命令:a~speak 12345689 I has a bucket

我們想要做的是找出我們是否可以找到通道與ID,如果可以的話,發送消息給它。

要做到這一點,我想我們應該看看我們是否可以使用client.channels.find("id", ID)函數。


讓我們開始通過建立我們的命令

if(commandIs("speak", message)){ 
    args = args.shift(); 
    /* ["a~speak", "CHANNELID", "I", "has", "a", "bucket"] 
    BECOMES 
    ["123456789", "I", "has", "a", "bucket"] 
    args [0]  [1] [2] [3]  [4]*/ 


    let chan = client.channels.find("id", args[0]); // Find the channel ID "123456789" 
    if(chan) { // Check if that channel exists 
     chan.send(args.shift().join(" ")); 
    } else { 
     message.channel.send(args.join(" ")); 
    } 
} 

讓我們跟隨該命令

如果我們a~speak 12345689 I has a bucket型,我們的機器人將尋找它訪問的通道到ID爲「123456789」的


如果你的機器人找到id爲 「123456789」 的渠道:

chan.send(args.shift().join(" "));

我們定義早些時候chan = args[0] - 這將是 「123456789」,我們不希望發在消息中,所以我們使用args.shift()--這消除了其餘的第一個爭論,讓我們留下了["I", "has", "a", "bucket"]

之後,我們使用.join(" ") - 這連接["I", "has", "a", "bucket"]與空格形成I has a bucket

然後,我們只需將該消息發送到我們定義的頻道,即chan.send()


如果你的機器人沒有找到ID爲「12456789」

message.channel.send(args.join(" "));

這其中的幾種方法有點不同,首先的通道,我們算了一下, chan變量,因爲我們找不到那個頻道。如果我們知道這一點,我們可以推斷出用戶可能會說​​之類的東西 - 完全沒有ID。

知道了,我們(不像以前),不要想要args.shift() - 我們會刪除「我」位!相反,我們只是想args.join(" ")再次將這些單詞連接在一起成爲一個句子,然後用message.channel.send()發送出去 - 它只是將它發送到它從中獲得消息的服務器。


如果您需要更多的幫助,只需用你的名字不和諧的評論,我會很樂意給你在正確的方向輕輕一推。

來源信息:

一些好的地方尋找這些類型的主題(Discord.JS)的幫助,是Official Discord.JS ServerAnIdiotsGuide。這兩個都能解決你的問題。

+1

TL; DR:我認爲你的問題是'var chat = client.channels.get(18numberID);' - 我想你可能必須使用'var chat = client.channels.find(「id 「,18號ID);'。 –

+0

我想你們忽略了OP試圖使用像.sendMessage()和'.defaultChannel'這樣不推薦使用的代碼的事實。如果他有最新的Discord.js,則會產生錯誤。另外,我不確定Discord API甚至還支持實際支持這些命令的D.js版本。 –

+0

啊,是的。我刪除了.sendMessage()的'Message'部分出於習慣,但我忘記解釋它的重要性。我將編輯帖子。 –