Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8883

Repl.itでBotの機能を開発しまくったお話

$
0
0

:star:まずは皆様にご挨拶

皆様、初めまして!!:tada:
Repl.itでDiscordBotを開発している『姉だぁぁぁぁ』と申します。
私は、まだプログラミングを始めたばかりの学生で、このサイトを利用して投稿したりするのは本当に初めてですが、
良い記事の発行や、Botのプログラミング能力を高めたらと思い、このアカウントを作りました。よろしくお願いします。:bow:

では、本編に参りまっす!

:star:JSで覚醒した沢山の機能を作ってみる

:one:リアクションを使って、ページネーションを作成する。

ページネーションを早く、簡単に作成したい場合は下記のリンクを参照してください。
(InkoHXさん、ありがとうございます!)

リアクションを使って簡単にページネーションを作成する Discord.js 専用のパッケージ

↑このパッケージを使用することによって、Botのメッセージをリアクションのリアクションで、簡単にページネーションを作成する事ができます。

しかし、私は『できれば自分でページネーションを作成したい』と思ったので、数か月前にダウンロードしたソースコードを利用して、ようやくページネーションを作成することができました。
:star:▽▽▽そのソースコードは以下の通りです。▽▽▽

//ページネーションを作成client.on('message',asyncmessage=>{if(message.author.bot){return;}if(message.content===('!help')){constpages={//埋め込みでページネーションを作る時に形式を[Java]にしました。1:newdiscord.MessageEmbed().setTitle('(1/2)Title').setDescription("Helpコマンドっす").setAuthor(message.author.tag+'が実行したな!!',message.author.avatarURL()).setColor(16719653).setTimestamp(),2:newdiscord.MessageEmbed().setTitle('(2/2)Title').setDescription("EMBEDを作るのも https://leovoel.github.io/embed-visualizer/ を参照するといいと思う(多分)").setAuthor(message.author.tag+'が実行したな!!',message.author.avatarURL()).setColor(16719653).setTimestamp()};constoptions={limit:15*1000,min:1,max:2,page:1,pages:pages,};constawaitReactions=async(msg,m,options,filter)=>{awaitm.awaitReactions(filter,{max:1,time:360000,errors:["time"]}).then(async(collected)=>{//各リアクションをクリックした時の処理を作る↓↓↓constreaction=collected.first();if(reaction.emoji.name===""){awaitremoveReaction(m,msg,"");if(options.page!=options.min){options.page=options.page-1;awaitm.edit(options.pages[options.page]);}awaitawaitReactions(msg,m,options,filter);}elseif(reaction.emoji.name===""){awaitremoveReaction(m,msg,"");if(options.page!=options.max){options.page=options.page+1;awaitm.edit(options.pages[options.page]);}awaitawaitReactions(msg,m,options,filter);}else{awaitawaitReactions(msg,m,options,filter);}}).catch((e)=>console.log(e));};constremoveReaction=async(m,msg,emoji)=>{try{awaitm.reactions.cache.find((r)=>r.emoji.name==emoji).users.remove(msg.author.id);}catch(err){console.log(err);}};//メッセージを送信↓↓↓constm=awaitmessage.channel.send(options.pages[options.page]);//リアクションの並び順を作る↓↓↓awaitm.react("");awaitm.react("");//送信したメッセージにリアクション追加↓↓↓constfilter=(reaction,user)=>["",""].includes(reaction.emoji.name)&&user.id==message.author.id;awaitawaitReactions(message,m,options,filter);}});//ここまで

結構長いソースコードです…。
ですが、このソースコードを利用して任意のチャンネルにコマンドを実行すると、ちゃんと動いているんですよね…

実験画像
実験画像
この通りです♪

そんな感じですかね…
このソースコードを色んな風に使うと、様々な埋め込みをシンプルっぽくデザインすることができまっす。
リアクションが追加されない場合は、Botの権限の『リアクションの追加』をONにして下さい。


:two:YouTube検索機能を作成する。

:star:!youtube [検索ワード]でYouTubeにある動画を検索できるソースコードは、以下の通りです。

//ようつべ検索constyts=require('yt-search');//npmをインストールclient.on('message',asyncmessage=>{if(message.content.startsWith("!youtube")){if(message.author.bot){return;}constAKB=message.content.split("").slice(1).join("")//調べたい用語を入れなかった時のメッセージ↓↓↓if(!AKB)returnmessage.channel.send({embed:{color:16719653,description:'**調べたい用語を入れてね!**\n```使用例 : !youtube Discord```'}})//YouTubeで検索中の時のメッセージ↓↓↓constmsg=awaitmessage.channel.send({embed:{color:16719653,author:{name:"Youtube内で検索中なんだ!!ちょっとまてよぉぉ!!",},}});yts(AKB,function(err,r){constvideos=r.videosconstplaylists=r.playlists||r.listsconstchannels=r.channels||r.accounts//メッセージを編集して動画URLをうp↓↓↓msg.edit('✅動画が見つかったよぉぉぉ!!!',{embed:{color:16719653,timestamp:newDate(),author:{name:message.author.tag+'が実行したな!!',icon_url:message.author.avatarURL(),},title:videos[0].title,//動画のタイトルdescription:'**動画URL**\n> '+videos[0].url+'\n\n**  そうかそういう動画か**'}})})}});//ここまで

そんな感じですね。
埋め込みで動画URLとかを貼り付けるので、おしゃれにできるはずです。
わざわざYoutube.comに飛んで検索しなくて済むから、便利と言えば便利かも知れないね…
yt-searchは必ずインストールしないと、このソースコードは使えません!


:three:確認画面有りのKickコマンドを作る。

私が、Bot作る中で一番苦労したのは『確認画面が有るKickコマンド』を作る事でしたね…。
良いコマンドにしたくて色んなソースコードを組み合わせたものの、Runボタンを押したら…沢山の所からエラー吐いて来たので始末することにかなり時間が掛かりました。()
:star:▽▽▽そのソースコードは以下の通りです。▽▽▽

//Kickコマンドclient.on('message',asyncmessage=>{if(message.author.bot){return;}if(message.content.startsWith('!kick')&&message.guild){//コマンドを実行したユーザーの権限を確認↓↓↓if(!message.member.hasPermission('KICK_MEMBERS')){//Kickする権限が無ければメッセージを↓↓↓returnmessage.channel.send({embed:{color:16719653,description:'**Kickする権限ないよ!!**',}})}constuser=message.mentions.users.first();if(user){constmember=message.guild.member(user);//権限を持っている人がKickコマンドを実行したら確認画面を↓↓↓constmsg=awaitmessage.channel.send({embed:{color:16719653,timestamp:newDate(),author:{name:message.author.tag+'が実行したな!!',icon_url:message.author.avatarURL(),},description:'**本当にこれでいいのかよ!?**\n```diff\n+ [ok],[no]のどれかを送信してクレメンス\n+ ok → mentionしたメンバーをKick。\n+ no → mentionしたメンバーをKickせず、処理を停止するぜ。```'}});//回答による処理を作る↓↓↓constfilter=msg=>msg.author.id===message.author.idconstcollected=awaitmessage.channel.awaitMessages(filter,{max:1,time:300000})constresponse=collected.first()if(!response)returnmessage.channel.send('> **応答はやくしてよぉぉぉ!!!**')if(!['ok','no'].includes(response.content)){return;}//noを送信したら↓↓↓if(response.content==='no')returnmsg.edit({embed:{color:16719653,author:{name:'Kickの処理を止めたよ!!',},}});//okを送信したらKick!!↓↓↓if(response.content==='ok'){if(member){member.kick('監査ログに出されるやつ').then(()=>{msg.edit({embed:{color:16719653,timestamp:newDate(),author:{name:message.author.tag+'が実行したな!!',icon_url:message.author.avatarURL(),},description:'**キィィィィック!!!**\n**'+`${user.tag}`+'**をKickしたよ!!',}})})//エラーメッセージ↓↓↓.catch(err=>{msg.edit({embed:{color:16719653,description:'Kickできなかったよ!!権限確認してよぉぉ!!'}});console.error(err);});}else{//メンションされたユーザーがサーバーにいない時↓↓↓message.channel.send({embed:{color:16719653,description:'そいつここのサーバーにいないよぉぉ!!'}})};}}else{//対象を指定していない時↓↓↓message.channel.send({embed:{color:16719653,description:'**Kickしたいメンバーをメンションしてね!!**```使用例 : !#kick [@mention]```'}});}}});//ここまで

そんな感じですね。
これで、確認画面有りのKickコマンドが作れます。
確認画面の下の方のこれ↓↓↓

constfilter=msg=>msg.author.id===message.author.idconstcollected=awaitmessage.channel.awaitMessages(filter,{max:1,time:300000})constresponse=collected.first()if(!response)returnmessage.channel.send('> **応答はやくしてよぉぉぉ!!!**')if(!['ok','no'].includes(response.content)){return;}if(response.content==='no')returnmesssage.channel.send('なんでnoだにゃーん');if(response.content==='ok'){message.channel.send('んにゃ')}

結構色んなコマンドの所で使えるので、是非試してみて下さい!


:four:ステータスを変える方法

Botのステータス(カスタムステータス含む)を変えるには、下記のリンクを参照にするといいです。
(作成者様、ありがとうございます!)

Discord.js 例文 (v12.2.0)

:star:カスタムステータスの所のソースコードは、以下の通りです。

client.on('ready',message=>{console.log('準備完了っす!');client.user.setActivity('にゃーん',{type:"PLAYING"});/*
        typeの値:
            https://discord.js.org/#/docs/main/stable/class/ClientUser?scrollTo=setActivity
                'PLAYING': 〇〇 をプレイ中
                'STREAMING': 〇〇 を配信中
                'WATCHING': 〇〇 を視聴中
                'LISTENING': 〇〇 を再生中
        */});

カスタムステータスの所はこの通りに簡単に変えることができますが、『じゃあ、退席中等のステータスの所は?』と言いますと…それは、status値を使って変える事ができます。

status:"online"/*
                'online': オンライン
                'idle': 退席中
                'dnd': 邪魔しないで下さい
                'offline': オフライン
         ただしスマホステータスにしたい場合は別になる。
        */

これを入れればできると思います。
スマホステータスに変えたい場合は、クライアントを作るところをいじればできるはず。
:star:ソースコードは以下の通りです。

constclient=newdiscord.Client({ws:{properties:{$browser:"Discord iOS"}}});

これでしばらくすると、ステータスがスマホマークになります。

:star:最後に

結構沢山の所のねたばらしみたいな感じになってしまいましたが…私は、まだDiscord.jsのことをまだ完全に理解しているという訳ではないのでできれば大目に見てくれると幸いです。
そして、こんなjsのソースコードだらけの記事を最後まで見て下さり、誠にありがとうございました。

もし、最後まで見て「あれ?」と思う事がございましたら、この記事にコメントをするか、
Discordの[姉だぁぁぁぁ#1985]にDMを下さい。

できる限りの事はお答えします!
ありがとうございました。


Viewing all articles
Browse latest Browse all 8883

Trending Articles