質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

1回答

1631閲覧

Discord.jsで特定の単語が発言されたらメッセージを削除

0505Keitan

総合スコア15

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

1クリップ

投稿2019/02/05 08:45

編集2019/02/06 07:30

前提・実現したいこと

Discord.jsで特定の単語が発言されたらメッセージを削除する機能で、単語はjson管理にする。

発生している問題・エラーメッセージ

以下のソースでやってみたところ、単語2だけが読み込まれ削除された

該当のソースコード

一部のコードは今回の実装に関係がないため省略しています。

js

1const {Client, RichEmbed} = require('discord.js'); 2const client = new Client(); 3const fs = require("fs"); 4 5client.on('message', async msg => { 6 //var nw = JSON.parse(fs.readFileSync('./Desktop/test.json', 'utf8')); 7 nw.ng = []; 8 9 const args = msg.content.split(' '); 10 const cmd = args.shift(); 11 12 if(nw.ng.some( item => msg.content.indexOf(item ) > -1)){ 13 msg.delete(10); 14 } 15 16 if(msg.content.startsWith('/add')){ 17 //const args = msg.content.split(' '); 18 //var newNg = args[1]; 19 nw.ng.push("単語3"); 20 } 21 22 if(msg.content.startsWith('/rm')){ 23 var target = "単語2"; 24 delete nw.ng[target]; 25 } 26 27}); 28

json

1{ 2 "ng" : "単語1", 3 "ng" : "単語2" 4}

試したこと

そのままのソースコードで試しましたがうまくいかずに止まっています。

補足情報(FW/ツールのバージョンなど)

名前バージョン
node.jsv10.15.0
npmv6.4.1
discord.jsv11.4.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2019/02/05 08:55

「単語2」って何ですか?あと、jsonはどういう姿をしているのか開示できませんか?
guest

回答1

0

ベストアンサー

同じキーは2つ存在できません。

javascript

1var val = { ng : ['単語1', '単語2']}

のようなかたちにし

javascript

1//if(msg.content.match(nw.ng)){ 2if(nw.ng.includes(msg.content)){

とか。

まあ部分一致だったらちょっと面倒ですが、↓こういう検知をするほかないです。

javascript

1if(nw.ng.some( item => msg.content.indexOf(item ) > -1))

投稿2019/02/05 09:08

編集2019/02/06 00:09
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0505Keitan

2019/02/05 11:43

部分一致のコードを試したところ、以下のエラーが出てしまいました。 ``` a(node:2351) UnhandledPromiseRejectionWarning: TypeError: nw.ng.any is not a function at Client.client.on (/Users/0505Keitan/Desktop/ng.js:29:14) at Client.emit (events.js:182:13) at MessageCreateHandler.handle (/Users/0505Keitan/node_modules/discord.js/src/client/websocket/packets/handlers/MessageCreate.js:9:34) at WebSocketPacketManager.handle (/Users/0505Keitan/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:103:65) at WebSocketConnection.onPacket (/Users/0505Keitan/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35) at WebSocketConnection.onMessage (/Users/0505Keitan/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17) at WebSocket.onMessage (/Users/0505Keitan/node_modules/discord.js/node_modules/ws/lib/event-target.js:120:16) at WebSocket.emit (events.js:182:13) at Receiver._receiver.onmessage (/Users/0505Keitan/node_modules/discord.js/node_modules/ws/lib/websocket.js:137:47) at Receiver.dataMessage (/Users/0505Keitan/node_modules/discord.js/node_modules/ws/lib/receiver.js:409:14) (node:2351) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:2351) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. ```
papinianus

2019/02/06 00:09

すみません。jsはsomeでした。書き換えました
0505Keitan

2019/02/06 06:39

ありがとうございます。できました! (もしよろしければ単語をjsonに追加する方法か単語をjsonから削除する方法を教えていただけたら幸いです。)
papinianus

2019/02/06 06:45 編集

追加は容易です nw.ng.push("単語3") 削除はあまりやりたくないなー target = "単語2" nw.ng.some((v, i) => if (v==target) nw.ng.splice(i,1);); とか nw.ng = nw.ng.filter(v => v != target); とか
0505Keitan

2019/02/06 07:05

追加の場合は var nw = JSON.parse(fs.readFileSync('./Desktop/test.json', 'utf8')); だと読み込みしかできないとかあったりしますでしょうか?
papinianus

2019/02/06 07:12

いや、そんなことはないです。ただ、ファイルに書く必要はあります。 追加がうまくいかないのであれば、検証のために var nw.ng = ["単語1","単語2","単語3",]と、とりあえず全部上書きしてみて確認なさるといいかも。 もしかしてこいつ→`nw.ng = ngWord;`が邪魔してません(コメントアウトしてますか)?
0505Keitan

2019/02/06 07:18

今度は SyntaxError: Unexpected token . が出てしまいました.....。
papinianus

2019/02/06 07:19

すみません。どこでですか? もしかして↑の上書きだったら、varがいらなかった。ごめんなさい nw.ng = [];でした。
0505Keitan

2019/02/06 07:24

↑の上書きでまたエラーで UnhandledPromiseRejectionWarning: ReferenceError: nw is not defined が出ました.....。
papinianus

2019/02/06 07:26

どこで書いてますか?もともとの`nw.ng = ngWord;`の位置? 可能であれば、現時点のコードで質問を更新していただきたいのですが。
0505Keitan

2019/02/06 07:31

了解です!更新しました
papinianus

2019/02/06 07:57

更新したコードで「UnhandledPromiseRejectionWarning: ReferenceError: nw is not defined」ということですよね? ファイルリードの↓がコメントアウトされているので、nwが未定義です。 //var nw
0505Keitan

2019/02/06 08:05

//var nwのコメントアウトを無くしたら (node:1086) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ] in JSON at position 710 at JSON.parse (<anonymous>) at Client.client.on (/Users/0505Keitan/Desktop/ng.js:24:19) とまたエラーが増えました
papinianus

2019/02/06 08:19

text.jsonは'{"ng":["単語1","単語2"]}'こんな内容ですかね?なんかjsonのかきかたがおかしいみたいです。あと文字コードもみてください。
0505Keitan

2019/02/06 08:24

jsonはこんな感じですね { "ng": ["単語1", "単語2", "単語3", "単語4"]}
papinianus

2019/02/06 08:28 編集

これならエラーにならないですよね?"の数とか、,の有無とか]の手前に問題がありそうなんですが。 ブラウザのF12のツール開いてコンソールタブでJSON.parse(jsonの中身);(エンター)で、エラーでませんか?
0505Keitan

2019/02/06 08:54

問題なくいけました
papinianus

2019/02/06 08:58

そうでしたか…考えます。
0505Keitan

2019/02/06 09:00

申し訳ないです.....。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問