Giter Club home page Giter Club logo

butler's Introduction

バトラー

Node.jsサーバーで動作させることを前提とした、 TypeScript実装のDiscord Botです。

HerokuやGCPにデプロイすると無料枠で動かせてイイカンジです

機能

  • ボイスチャンネルが開始された際の通知
  • 特殊なコマンドの提供
    • !memoコマンド - 発言のメモ
      • タイトル/本文がセットになった文字列のCRUDを提供
    • !pomodoroコマンド - ポモドーロタイマー機能
      • 特定の音声チャンネルで、マイクのミュートを利用した擬似的なポモドーロタイマーを提供
    • !wikiコマンド - wikipediaからの引用
      • wikipediaから単語の概要を引用して発言・リンクする
    • !stickerコマンド - チャットに反応するスタンプ機能
      • 正規表現と対応する画像URLを登録し、チャットがマッチした際Botに発言させることで、スタンプ機能のように振る舞わせる

それぞれのコマンドの詳細については、実装をご覧いただくか、本Bot起動後、コマンドに引数を付けずに実行することで詳細なヘルプが表示されます。

ファイル・ディレクトリ構成

本プロジェクトは npmのWorkspacesを利用したモノリポ構成となっております。

.
├── package.json
├── tsconfig.base.json    # モノリポのパッケージ達に継承されるベースのtsconfig.json
├── tsconfig.json         # referencesで関連のtsconfig.jsonをまとめる、ビルド用tsconfig.json
├── packages/             # モノリポのパッケージ郡が格納されるディレクトリ
│   ├── core/             # 共通で利用するライブラリや定数、機能など
│   │   └── ... # 省略
│   ├── worker/           # Discordのイベントを常時監視するワーカー関連の機能
│   │   └── ... # 省略
│   └── web/              # ブラウザからBOTを操作するための、Next.jsによるUIを提供 (開発中)
│       └── ... # 省略
└── ... # 省略

ローカルでの環境構築

前提

  • 対象のDiscordサーバーにBOTがログインしている状態にしておくこと
  • node.jsのいい感じの環境を整えておくこと
  • Redisサーバーにアクセスできること

手順

  1. 本リポジトリをクローンし、npm ciを実行する
  2. プロジェクトのルートディレクトリにある.env.sampleをコピーして.envを作成する
  3. .envファイルを編集して環境変数を設定する
  4. npm run devを行うと、開発用サーバーが立ち上がり、ファイルの変更検知込のビルド&サービングを行う

Herokuへのデプロイ

  1. クローンしたリポジトリをHerokuに上げる
  2. Herokuの環境変数を設定する
    • WAKEUP_URLにアプリのURLを設定するのを忘れないこと
  3. Heroku Redisアドオンを設定し、Redisサーバーの環境変数を確認する(他のRedisサーバーを使う人はよしなに)
  4. web dynoを再起動すると、npm start が実行され正常に動作をし始める

GCE(Google Compute Engine)へのデプロイ

  1. VMインスタンスを作り、VPCネットワーク ファイアウォールルールで、ポート3000の上りパケットを許可する設定を追加する
  2. VMインスタンス内のnode.jsやGitなどの前提条件を整え、仮想環境でリポジトリをクローンする
  3. Redisをインストールしてsystemctlとかで有効化する
  4. 環境変数を整える
  5. npm ciしてnpm run buildしてnpm run startするとwebサーバーとworkerサーバーが起動する
    • npm ciにめちゃくちゃ時間(1時間弱くらいとか)がかかるかも? node 16の問題らしいがworkspacesを利用したいので我慢
    • 一応、メモリ1GBとかならサーバーにSwap領域を設定しておいたほうがいいかも

環境変数(.envファイル)の説明

  • DISCORD_TOKEN: Discord APIを利用するために必要なトークン
  • NOTIFY_TEXT_CHANNEL_ID: 通知など、BOTが自発的に発言する際のテキストチャンネルID
  • POMODORO_VOICE_CHANNEL_ID: ポモドーロ機能で利用するボイスチャンネルのID
  • REDIS_URL: 利用するRedisサーバーのURI
  • DETECT_STICKER_RATE: チャットがstickerの正規表現にマッチした際の反応率を、0.0-1.0で記述(0は無効化、1.0のときは必ず反応)
  • WAKEUP_URL: Herokuのように、アクセスがないとsleepしてしまうPaaSなどに対して、定期的にGETリクエストを送るためのURL

その他

チャンネルのIDどうやって見るん?

WebブラウザからDiscordにアクセスして、お目当てのチャンネルのURL見ればなんとなくわかると思います。

音声チャンネルはURLが表示されないので、開発者ツールとかで該当音声チャンネルのDOMを見るとなんとなくわかると思います。

butler's People

Contributors

ver-1000000 avatar

Watchers

 avatar

Forkers

tamaki-tech

butler's Issues

データ永続化の手法をHerokuとGlitchで共有できるものにする

元来、データ永続化の手法には、
Glitchで動作していたfor-sabasabaserverではdata-storeを利用し、
Herokuで動作していたprobably-akosukeはRedisを利用していた。

2つを統合する際、

  • data-storeは同期処理で型が古くメンテナンスもされていないっぽい
  • Redisは色々めんどくさいしGlitchとの統合がようわからん

という理由から、butlerでは新しくLevelDBというデータ永続化の手法を採用した。

しかし、統合を終え、実際にデプロイしてみると、 Herokuではローカルに保存するタイプのファイルベースDBは、データが破棄されるために利用できない ことが判明した。 いやほんとはなんとなくわかっていた。 なんかいけないかなって甘えて実装した。

Herokuで利用できる永続化サービスでなおかつGlitchでの実装に齟齬がないようなものに置き換える必要がある。

!shiritoriコマンド

!shiritori 10
  • wikipediaをソースに、しりとりバトルを開始するコマンド
  • 三文字以上の言葉にしなければいけない
  • 数字を指定で制限時間
  • 連続で回答するとおてつき
  • おなじ尻文字に回答者が出た場合、先勝
    • つまり、実質回線の強さとタイピングの速さで勝負するゲーム

モノリポ化したbutlerのtscがglitch上で動かない

次のようなエラーが出てる。 意味がわからん。

> @butler/[email protected] build
> npx tsc -b .
                                                                               
                This is not the tsc command you are looking for                
                                                                               
To get access to the TypeScript compiler, tsc, from the command line either:
- Use npm install typescript to first add TypeScript to your project before using npx
- Use yarn to avoid accidentally running code from packages which haven't been installed
  • #12 を試してみたら副次的に解決しないか?
  • コンパイルをesbuildにしてみたらどうか?

12試してみて、そのあとesbuildにする?

誕生日通知機能

誕生日を迎えると、それを通知する機能。

!birthday.set あこすけ 2020/07/07
!birthday.get あこすけ
!birthday.remove あこすけ
!birthday.list
  • 文章・文言はとりあえず固定
  • ランダムで誕生日イメージが表示できるとよいが、優先度は低い
    • DiscordのGIF画像機能みたいな感じのところからソース引っ張ってきたい
  • Amazonのほしい物リストを登録できるようにする?
    • インターフェース的に厳しい
    • これをするならば、誕生日の3日前に事前通知とかもほしい

ver-1000000/discord-bot-probably-akosuke#2 から移譲されたIssue。

[Glitch] ffmpeg-staticが~/.cache配下に貯めるファイルが時間経過で大きくなりすぎてエラーが出る

しばらくサービングを続けると、途中でError: ENOSPC: no space left on device, writeみたいな
エラーが出てることに気づいた。(たしか)

Glitchの無料プランではディスクスペースに200MBしか利用できないのだが、
どうやら.cache配下に数十MB単位のキャッシュが作成されてしまうことが問題のようであった。

これをdu -hd 1などのコマンドで分析していくと、どうやら.cache/ffmpeg-static-nodejsがバカでかい。

消しても問題ないようなので、rimrafとかでガバッと削除してやれば動く気もするが、
どうやらGlitchのサーバーにはネイティブffmpegがインストールされているようなので、
npmからffmpeg-staticの利用をやめ、新たにffmpegの利用を試みてみる。

Botの導入手順をどこかにまとめる

以下のような流れ。 とりいそぎmemo。


https://discord.com/developers でボットを作成
左部メニュー Bot から Build-A-Bot > Add Bot
サブメニュー OAuth2 の OAuth2 URL Generator でBot登録用URLを作成するために、SCOPESからbotにチェック
BOT PERMISSIONSに必要そうな権限をチェックしていく 面倒ならAdministrator
多分 Send Messages Use External Emojis Add Reactions Use Slash Commands Connect Speak Mute Members Use Voice Activity
んでこれが生成される https://discord.com/api/oauth2/authorize?client_id=893258033726119958&permissions=2188642368&scope=bot
生成したURLからbotを追加し、トークンを利用して開発を行う

アルバム機能

特定のチャンネルに投稿された画像を、サードパーティストレージに保存する。

できればビュワーみたいなのも提供したい。

サードパーティストレージいらんか?discordのcdnから引っ張ってしまってもよいだろうか なんか規約に引っかかるかな

詳しい人おしえて


ver-1000000/discord-bot-sabasabaserver#4 から移譲

Webpackを利用してimportパスの解決を行いたい

/tsconfig.base.json

    "paths": {
      "@butler/*": ["./*/src"]
    }

を追加して、

/packages/worker/src/app.tsなどから

import { DISCORD_TOKEN, NOTIFY_TEXT_CHANNEL_ID } from '@butler/core';
import { MemosStore } from '@butler/worker/stores/memos.store';

のようにimportできるようにしたい……。

スラッシュコマンドに対応する

2021年になんかスラッシュコマンドとかいうのが有効化されたじゃん?

あのへんの資料を集めてそっちに対応させる。

ビックリマークは廃止したいけど、スラッシュコマンドに対応してないサーバーとかが存在するんだったら廃止できないから残しとくことになるのかな? 誰か資料あつめてここに貼ってくれたらうれしいな……。

Glitchでの運用に無理が出てきた

#6の実装中、Glitch無料プランのディスク容量制限200MBがキツくて実現できなくなってきた。

  • Redisサーバーを別で立てればまだなんとかなりそう
  • 無料のRedisホスティングサービスに、Upstashというものがあり、かなり優秀に見えるが、無料枠は1つだけ
  • Herokuは相変わらず一人でRedisもWebページサービングも行える
  • 将来的には、Redisの設定はリポジトリ内に置かないようにする
  • GCEとHerokuでのセットアップドキュメントを整備する
  • っていうかRedisを除外したらGlitchでも動かすことができるのでは?

VoiceChannelRanking

音声チャットにインしてた時間を計測して、週末に発言するみたいなやつ。

おもしろそう。 サバ主と相談してTOPの人にはロールとかつけてもいいかも。

時間を計算して文字列でグラフ表現みたいなんしたい

■■■■■■■■■■■■■■■■■■■■■■■■■■■■       hoge
■■■■■■■■■■■■■■■■■■■■       foo
■■■■■■■■■■■■■■■■■       bar

みたいな?


ver-1000000/discord-bot-sabasabaserver#1 から移譲。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.