📠

RustでTimes拡散DiscordBot

2024/03/29に公開

ナマステ, neruneruna7だ.

今回の記事は,Ubiquitimesの派生プロダクトについてである.
名前は Ubiqutimes-Cardiac だ.

概要

Timesに書き込んだ内容を,書き込んだDiscordサーバとは他のサーバにも拡散するDiscord Botである.

この記事を見ている人の中には,何かしらのコミュニティに所属している人もいると思う.特にソフトウェアエンジニア,プログラミング系のコミュニティではTimes文化なるものがあるコミュニティも少なくない.
そして,複数のコミュニティに属している場合,同じ内容を各コミュニティに書き込みたいこともあるだろう.本Botは,その手間を削減することを目的とするDiscordBotである.

また,プロダクト内容や機能としてはcalloc134timesを全部共有してくれるdiscordボットをサクッと作ったとほぼ同一である.
(一応calloc134本人にこのように名前出す許可を取っています)

余談,プロダクトの命名

Ubiquitous(遍在) + Times + Cardiac(心臓)

目標

このプロダクトを作成するにあたり,開発を通じて得るものとして以下の目標を設定した.

  • 変更に強い設計
  • 実際にユーザを得ることを想定した設計
  • ユーザからのフィードバックを得て,改善につなげる流れ

補足: 変更に強い設計を目標の1つとして掲げているのは,源流のUbiquiTimesからの影響である.UbiquiTimesと比べて規模が小さいため,開発の際に様々な設計を試しやすい.そうして得たものをUbiquiTimesへ還元するのである.

設計・アーキテクチャについて

設計の過程において,俗にいうクリーンアーキテクチャについてごく軽く調べ参考にした部分はある.しかし,方針としてクリーンアーキテクチャを目指す・採用することを目指しているわけではない.

本プロダクトにおいては以下の3つを達成していればよい.

  • 使用するDBを切り替えしやすい
  • 使用するDiscordライブラリを切り替えしやすい(Slackのものにも切り替えられる)
  • ライブラリによって変化しない型,トレイト,関数をまとめる(Domain?)

できること

現在以下のコンテンツについて拡散を行うことができる.

  • テキスト
  • ファイル(画像など)

拡散の仕組み

WebHookを利用して拡散を行っている.
なぜBotから直接チャンネルへ書き込むのではなくWebHookを利用しているのか,という疑問があるだろう.その理由はこのBotはあくまでもUbiquiTimesから派生したものであり,UbiquiTimesはWebHook前提の仕組みなので,派生であるこのプロダクトそれを受け継いでいる.
メリットとして,どちらかで得られた知識・コードを簡単に共有・流用できるという点がある.

技術構成

  • プログラミング言語: Rust
  • Discordライブラリ: poise
  • デプロイ先のサービス: shuttle
  • データベースライブラリ: sqlx
  • データベース: postgresql

導入

https://github.com/neruneruna7/UbiquiTimes-Cardiac
リポジトリのREADMEにBotの導入リンクがあるので,それを使用する.

使用方法

helpスラッシュコマンド

helpスラッシュコマンドの実行例
使用可能なすべてのスラッシュコマンドと,その説明を表示する.
特定のコマンドを選んで,より詳細な説明を表示することもできる.

ut_c_guild_initスラッシュコマンド

Botを導入したら,まずut_c_guild_initスラッシュコマンドを実行する.
これは,Botが動作するサーバーの情報を登録するためのものである.
ut_c_guild_initスラッシュコマンドの実行例

ut_c_times_setスラッシュコマンド

次に,自身のTimesであるチャンネルでut_c_times_setスラッシュコマンドを実行する.
ut_c_times_setスラッシュコマンドの実行例
user_nameは,他のサーバーから拡散されてきた際のユーザー名であり,自由に設定することができる.また,サーバーごとに違う名前を設定してもよい.ただし,プレフィクスとしてUT-が自動的に付加される.
例を示す

  • サーバA ut_c_times_setコマンドの際にユーザ名をAlphaに設定
  • サーバB ut_c_times_setコマンドの際にユーザ名をBetaに設定
    この状態で,BからAに拡散された場合,AのチャンネルにはUT-Betaからのメッセージとして表示される.

Timesのチャンネルや,user_nameを変更したい場合は,再度このコマンドを実行することで変更できる.

Timesの内容を拡散したいすべてのサーバーで繰り返し

ut_c_guild_inittimes_setの2つのコマンドを,Timesの内容を拡散したいすべてのサーバーで実行する.
もちろん,Botが導入されているサーバーであることが前提である.

~UTプレフィックスコマンド

Timesに書き込んだ内容を拡散するためのコマンドである.
どのサーバーで実行してもよいし,どのチャンネルで実行してもよい.
ただし,実行したサーバーの自身のTimesには,Botから書き込まれることはない.

例として,テキストと画像を拡散したい場合は以下の画像のように入力する.

拡散元

テキストと画像を送信する際の例

拡散先では以下のように表示される

拡散先

テキストと画像を受信した際の例

画像ファイルではこのように同じような表示までされるが,テキストファイルなどでは少し違う表示になる.

拡散元

テキストファイルを送信する際の例

拡散先

テキストファイルを受信した際の例

拡散元,拡散先で同じように表示がされるのが理想だったが,やり方がわからなかったため断念した.
また仕組みとしてはCDNへのリンクを貼っているだけなので,アクセスするとダウンロードが始まってしまう.ファイル名が見えるだけで,どんなファイルなのか全くわからないというのは少々怖い.
そのため,ファイルの種別とサイズを表示することで,ある程度どんなファイルなのか,ファイルにアクセスする前に判別できるようにしている.

このコマンド実行時に呼ばれる処理はut_c_times_releaseスラッシュコマンドと同一であるが,helpコマンドで確認できるようにスラッシュコマンドとしてもあるだけである.また,ut_c_times_releaseとして使用してもプレフィックスコマンドへ誘導するメッセージが表示されるだけである.

おわりに

今後も改善・メンテナンスを続けていく予定である.
現在は24時間稼働しており,また誰でも使えるのでぜひ使ってみてほしい.
https://github.com/neruneruna7/UbiquiTimes-Cardiac

リポジトリのREADMEにBotの導入リンクがあるので,それを使用することで導入できる.
フィードバックを頂けると喜びます.

Discussion