0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

8,000サーバー以上で導入されているDiscordカレンダーBot「DisCalendar」の紹介

0
Posted at

はじめに

Discord向けのカレンダーアプリ「DisCalendar」を開発・運用しています。

ブラウザのカレンダーで予定を管理し、Discordのチャンネルへ通知するためのサービスです。ゲーム会や勉強会など、サーバーのメンバーで共有したい予定を登録して使えます。

もともとは身内のサーバーだけで使うBotでしたが、現在は3代目のv3として運用しています。

この記事では、予定の登録から通知までの使い方と、v1からv3までの歩み、現在の技術構成を紹介します。

月表示のカレンダーに、ゲーム会やミーティングなどの予定が色分けされて並んでいる

公式サイトで公開しているデモ画面。サンプルの予定を表示しています。本記事の機能説明は2026年9月7日時点のv3.8.0を基準にしています。

作ったきっかけは「いつものカレンダーを、Discordとつなぎたい」

Googleカレンダーのような画面で予定を入力して、通知は普段愛用しているDiscordで受け取る。そんなBotがあれば便利だと思ったのが、作り始めたきっかけです。

こだわっているのは、直感的に操作できることと、導入しやすいことです。長いコマンドや独自の書式を覚えずに予定を追加できるよう、ブラウザでの操作を中心にしています。

Googleカレンダーの接続は不要で、Discordアカウントがあれば使えます。

週末のゲーム会を登録してみる

1. Botを招待して、サーバーのカレンダーを開く

トップページの「BOTを導入する」から、Discordの画面で追加先のサーバーを選びます。Botの招待にはサーバーの管理権限が必要です。

その後、DisCalendarにDiscordアカウントでログインし、対象のサーバーを選ぶとカレンダーが開きます。利用する方がプログラムを動かしたり、Bot用のトークンを用意したりする必要はありません。

2. 通知を流すチャンネルを決める

カレンダー右上の歯車からサーバー設定を開き、「Discordへの通知」で通知先チャンネルを選んで保存します。この設定には管理権限が必要です。

サーバー設定のデモ。編集権限の制限、通知先チャンネル、開始時刻の通知、既定の事前通知を設定できる

公式サイトの設定デモから、通知に関係する部分を抜粋しています。

通知先を決めていないと、予定を追加してもDiscordには通知されません。最初にここまで設定しておくと、あとはカレンダーで予定を管理できます。

3. 日付を選んで、予定と事前通知を入力する

カレンダーの日付や「新規作成」を押すと、予定の入力画面が開きます。

今回は、週末のゲーム会を例に入力してみます。

項目 入力例
タイトル 週末のゲーム会
日時 2026年9月12日 21:00〜23:00
事前通知 1日前と1時間前
説明 21時からボイスチャンネルに集合。遊ぶゲームは当日決めましょう!

「週末のゲーム会」の入力例。タイトル、開始・終了日時、色、通知、説明を一つのダイアログで指定できる

事前通知は「何分前」「何時間前」「何日前」「何週間前」という形で、予定ごとに最大10件まで指定できます。上の例なら、前日に一度知らせて、当日の開始1時間前にもリマインドする設定です。

Discordの通知のデモ

開始時刻の通知もあり、不要ならサーバー設定でオフにできます。新しい予定に最初から入れておく事前通知も、サーバーごとに変更できます。

予定を変更するときは、カレンダー上の予定をクリックして編集します。日時だけの変更なら、ドラッグで移動することもできます。詳しい操作は予定の追加と表示にまとめています。

予定の確認や共有に便利な機能

複数のサーバーの予定を、一つの画面で見る

複数のサーバーでDisCalendarを使っている場合は、「すべての予定」から、自分が参加していてBotも導入されているサーバーの予定をまとめて見られます。

サーバーごとに色分けされるので、「ゲームの予定と別のコミュニティの予定が重なっていないか」といった確認にも使えます。この画面は閲覧用で、作成・編集は各サーバーのカレンダーから行います(カレンダーの使い方)。

普段使っている外部カレンダーからも見る

サーバーの予定を、GoogleカレンダーやAppleカレンダーなどで購読することもできます。サーバー設定で発行したフィードURLを、外部カレンダーに登録する方式です。

これは閲覧用の連携で、編集はDisCalendar側で行います。また、変更の反映タイミングは外部カレンダーの更新間隔によります。すぐに最新の内容を確認したいときは、DisCalendarを開いてください(外部カレンダーで見る)。

予定一つだけをリンクで共有する

予定の編集画面から共有リンクを発行すると、リンクを受け取った人はログインせずにその予定を確認できます。別のサーバーやDMで、一つの予定を案内したいときに使えます。

共有リンクでは、その予定のタイトル・日時・説明・サーバー名が見えるようになります。外部カレンダーのフィードURLはサーバーの予定を購読するためのものなので、予定一つを共有するリンクとは公開される範囲が違います。どちらも、URLを知っている人が閲覧できることを前提に使ってください(予定の共有方法)。

Discordのスケジュールイベントとも連携する

作成画面の「Discordのイベントとしても作成する」を使うと、Discord側にもスケジュールイベントを作れます。Discordの「興味あり」を利用したい場合にも使えます。

連携には利用者とBotの権限が必要です。また、変更が反映されるのはDisCalendarからDiscordへの方向です。Discord側で直接編集した内容が、DisCalendarへ戻ってくるわけではありません(イベント連携の説明)。

導入実績

2026年9月7日に管理画面を撮影した時点では、次の件数になっていました。

管理画面の集計。Botが参加中のギルド8,833、退出済みでデータが残るギルド7,046、予定133,595、これからの予定2,522

管理画面の項目 件数
Botが参加中のサーバー 8,833
保存されている予定 133,595
そのうち、これからの予定 2,522

画像には、Botが退出済みでデータが残っているサーバーも7,046件と表示されています。これは参加中の8,833サーバーには含めていません。また、予定の件数は撮影時点で保存されているレコードの数で、これまでに作られたすべての予定の累計ではありません。

サーバー数は利用者数や日々のアクティブ数を示すものではありませんが、身内向けから始まったBotが、これだけのサーバーに導入されるようになりました。使ってくださっている皆さん、ありがとうございます。

実は旧版のDisCalendarを長く運用していた

v1:身内向けから始まった

最初のv1は、身内のサーバーだけで使うクローズドなBotでした。

v2:Nuxtベースで、2020年から2026年まで運用

v2はNuxt+Vuetifyベースで作り、2020年から2026年まで運用しました。ブラウザでカレンダーを操作し、Discordへ通知する使い方は、この頃から続いています。

当時は革新的に思えたマテリアルUIベースのインターフェースでしたが、数年の月日が経つうちに「一昔前感」が否めないUIとなっておりました。

v3:Claude・Codexを使い、使い慣れた操作を引き継ぐ

現在運用しているのがv3です。ClaudeやCodexを開発に活用し、継続的に更新しています。

大切にしているのは、それまでの使い勝手を引き継ぐことです。全面リニューアルの際には、保存されていた予定やサーバー設定を引き継ぎました。カレンダーの操作は保ちつつ、Discord上の旧形式のcalコマンドはスラッシュコマンドへ移行しています(v3以降の更新履歴)。

導入の手間も減らしています。例えば、v3.8.0ではブラウザから通知先を設定できるようにしました。カレンダーを開いたら、そのまま初期設定まで済ませられます。

また、v2ではログ周りの設定などがうまくいっておらずサーバー容量を圧迫しているという問題があり、度々サービスが止まってしまうといった問題がありました。
すでに使われている方からすれば、「こいつ定期的に止まるよな」といった印象を与えてしまっていたかと思います。この周りの設計も全て見直しし、安定したサービスを実現できたかなあと思います。

開発者向け:現在はNext.jsとRustで構成しています

v3.8.0では、主に次の技術を使っています。

担当 主な技術
Web画面 Next.js 16、React 19、TypeScript
カレンダーUI FullCalendar 7
ログイン Better AuthによるDiscord認証
データ取得・フォーム TanStack Query、React Hook Form、Zod
API Rust、actix-web、SQLx
Discord Bot Rust、poise/serenity
データベース PostgreSQL

バージョンや依存関係は、Webのpackage.json、API、Bot、Rustワークスペースから確認できます。

予定の保存から通知までを簡略化すると、次の流れになります。認証やスラッシュコマンドなどは省略しています。

ブラウザで操作する部分と、時刻を見て通知する部分を分けています。予定はAPI経由でデータベースへ保存し、Botが予定と通知設定を確認してDiscordへ送信します。そのため、予定を保存したあと、利用者がブラウザを開いたままにする必要はありません(通知処理の実装)。

操作結果が分かるようにすることも大切にしています。予定をドラッグで移動すると、画面には移動先がすぐに反映されます。保存に失敗した場合は元の位置に戻し、エラーを表示するようにしています(予定の編集の説明)。

実装に興味のある方は、GitHubリポジトリも見ていただけるとうれしいです。

今後の展望

今後の機能追加も、GitHubのIssueで整理しています。2026年9月7日時点のOpen Issueから、主なものを紹介します。

追加予定の機能 できるようにしたいこと
繰り返し予定 毎週・毎月などの定例イベントをまとめて登録し、各回の事前通知や「この回だけ」「以降すべて」の変更に対応する
日程調整・投票 複数の候補日時に投票し、決まった候補からそのまま予定を作る
通知先とメンションの指定 予定ごとに通知先チャンネルやメンションするロール・ユーザーを選び、関係するメンバーへ案内しやすくする
今日・今週の予定のまとめ 決まった時刻に予定の一覧をチャンネルへ投稿し、その日や週の予定を確認しやすくする
Discordイベントとの連携強化 Discord側で作成・変更したイベントを取り込むほか、「興味あり」の人数とメンバーをカレンダー上で確認できるようにする
外部カレンダーの取り込み・重ね表示 ICSファイルから予定を取り込む。外部カレンダーを購読し、読み取り専用で重ねて表示する機能も検討する
Webhookによる外部連携 予定の作成・更新・削除を登録したURLへ通知し、自作ツールやほかのサービスとの連携に使えるようにする

仕様や実装時期は検討中です。進捗は、それぞれのIssueで確認できます。

おわりに

DisCalendarは、すべての機能を無料で利用できます。Discordで予定を共有する機会があれば、次のゲーム会や集まりの予定を登録してみてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?