AtCoderの競技プログラミングを支援するDiscord Botです。モチベーション向上と継続的な学習を促進するための様々な機能を提供します。
/register <atcoder_username>- AtCoderのユーザー名を登録- 提出履歴を自動同期
/contest-notify <channel> [enable_reminder]- コンテスト通知を設定- 24時間以内に開始予定のコンテストを自動通知
- リアクションを付けたユーザーには開始30分前にDMでリマインド
/weekly-report <channel>- 週次レポートを設定- 毎週月曜日の朝9時に先週のAC数をランキング形式で表示
- 難易度別のAC数も表示
/daily-problem <channel> [difficulty_min] [difficulty_max]- 今日の一問を設定- 毎日朝9時に指定難易度範囲からランダムに問題を配信
- デフォルト難易度: 400〜800
/virtual-create <title> <duration> <problems>- バーチャルコンテストを作成/virtual-start <contest_id>- コンテストを開始/virtual-standings <contest_id>- 順位表を表示
/mystats- 自分の今週の統計情報を表示
- 言語: Go 1.21+
- Discord Bot: discordgo
- データベース: PostgreSQL
- スケジューラ: robfig/cron
- インフラ: Fly.io (完全無料)
- Go 1.21以上
- PostgreSQL
- Discord Bot Token
- リポジトリをクローン
git clone https://github.com/yourusername/coding-winner.git
cd coding-winner- 依存関係をインストール
go mod download- 環境変数を設定
cp .env.example .env
# .envファイルを編集して必要な情報を入力- データベースをセットアップ
# PostgreSQLを起動してデータベースを作成
createdb coding_winner- アプリケーションを実行
go run cmd/bot/main.go- Discord Developer Portalにアクセス
- "New Application"をクリック
- Botセクションに移動して"Add Bot"をクリック
- Bot Tokenをコピーして
.envのDISCORD_BOT_TOKENに設定 - OAuth2 > URL Generatorで以下を選択:
- Scopes:
bot,applications.commands - Bot Permissions:
Send Messages,Add Reactions,Read Message History,Use Slash Commands
- Scopes:
- 生成されたURLでBotをサーバーに招待
curl -L https://fly.io/install.sh | shfly auth loginfly postgres create --name coding-winner-db --region nrtデータベースの接続情報を保存してください。
fly launch --name coding-winner-bot --region nrt --no-deployfly secrets set DISCORD_BOT_TOKEN=your_bot_token_here
fly secrets set DATABASE_URL=postgres://user:pass@host:5432/dbnamefly deployfly logscoding-winner/
├── cmd/
│ └── bot/
│ └── main.go # エントリーポイント
├── internal/
│ ├── bot/ # Discord Bot関連
│ │ ├── bot.go
│ │ ├── commands.go
│ │ └── handlers/ # コマンドハンドラー
│ ├── scheduler/ # スケジューラー
│ ├── atcoder/ # AtCoder API クライアント
│ ├── database/ # データベース操作
│ └── models/ # データモデル
├── migrations/ # SQLマイグレーション
├── Dockerfile
├── fly.toml
├── go.mod
└── README.md
users- ユーザー情報contest_notifications- コンテスト通知設定submissions- 提出履歴problems- 問題情報daily_problem_config- 今日の一問設定virtual_contests- バーチャルコンテストvirtual_contest_submissions- バーチャルコンテスト提出weekly_report_config- 週次レポート設定
詳細は migrations/ フォルダを参照してください。
- 15分ごと:
- ユーザーの提出データを同期
- コンテスト情報をチェックして通知
- 毎日朝3時: 問題データを同期
- 毎日朝9時: 今日の一問を配信
- 毎週月曜日朝9時: 週次精進レポートを送信
# macOS
brew install go
# Linux
wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin.envファイルのDATABASE_URLが正しく設定されているか確認してください。
Fly.ioの無料枠では、アプリがスリープする可能性があります。定期的なタスクがあるため、基本的にはスリープしません。
完全無料で運用可能:
- Fly.io: 3 Shared CPU VMs(無料枠)
- PostgreSQL: Fly.io PostgreSQL 3GB(無料枠)
- AtCoder Problems API: 無料
- Discord Bot: 無料
MIT License
プルリクエストを歓迎します!バグ報告や機能リクエストはIssueで報告してください。
問題が発生した場合は、GitHubのIssueで報告してください。