Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Rustcord

egui/eframe ベースで作る、Rust 製の Discord 風デスクトップクライアントです。

現在の実装

  • サーバー・チャンネル・メンバーの三分割レイアウト
  • ダークテーマのネイティブ egui UI
  • チャンネル切り替え、メンバー欄の表示切り替え、検索
  • チャンネルカテゴリの折りたたみと長いメンバー一覧のスクロール
  • 固定アカウントバーとチャンネル/Voice一覧の独立スクロール
  • 参照UIに合わせた voice 会話パネルとメンバー欄の切り替え
  • voice 会話パネルの composer 入力とローカルメッセージ反映
  • 選択・開閉・検索・Voice接続・入力中表示のトランジションアニメーション
  • 設定・ピン・コマンドパレットのフェード表示
  • Ctrl/Cmd+K 検索、Ctrl/Cmd+Shift+P ピン、Ctrl/Cmd+/ コマンドパレット、Escape 閉じる
  • メッセージ入力と Enter によるローカル送信
  • composer の絵文字ピッカーから絵文字を本文へ挿入
  • Twemoji によるカラー絵文字表示(本文・リアクション・チャンネル・主要操作アイコン)
  • メッセージへの返信(message_reference
  • 取得した返信の引用プレビュー表示(referenced_message
  • 自分のメッセージの編集・削除
  • ファイルパス指定によるメッセージ添付送信(composer の
  • 設定ウィンドウ
  • Discord 実アカウントログイン(メール/電話番号・パスワード・MFA)
  • Discord QRログイン(スマホのDiscordアプリで承認)
  • OAuth2 PKCE + WebView によるアプリ認証(webview feature)
  • 同梱 Noto Sans CJK による日本語表示
  • ユーザートークンによる REST / Gateway 接続
  • Guild のチャンネル・直近メッセージ取得、メッセージ送信
  • ホームからの DM / グループ DM 一覧取得とメッセージ送信
  • Discord Favorites と同期する DM のお気に入り追加・削除、公式の position/最終メッセージ順への即時反映
  • Gateway による DM チャンネル作成・更新・削除のリアルタイム反映
  • before ページングによる過去メッセージの追加読み込み
  • 指定 Guild の実名・カテゴリ・メンバー一覧の取得
  • メンバー・メッセージの Discord CDN アバターを非同期取得して表示
  • メンバー CDN アバターを user ID 優先でキャッシュ
  • 接続中 Guild の CDN アイコンをサーバーレールへ表示
  • Gateway の Identify / Heartbeat と MESSAGE_CREATE / チャンネル更新イベントの反映
  • Gateway のメッセージ作成・編集・削除イベントの反映
  • Gateway の入力中通知(typing)を composer に表示
  • Presence のアクティビティ名をメンバー欄へ表示
  • composer 入力時の typing 通知を Discord へ送信(7秒間隔)
  • REST/Gateway のメッセージリアクション表示
  • メッセージ上の操作ボタンから 👍 リアクションを追加
  • 自分の 👍 リアクションを削除
  • 別チャンネルの新着メッセージを未読マーカーへ反映
  • ヘッダー通知ミュートによる未読マーカー抑制
  • REST 429 (Retry-After) の再試行と Gateway 切断時の自動再接続
  • 複数 Guild ID の接続とサーバーレールからの Guild 切り替え
  • Gateway session_id / seq を使った Resume
  • Discord CDN のアバター・添付画像の非同期取得と egui テクスチャキャッシュ
  • Discord message embed の image / thumbnail プレビュー
  • Discord 風の URL / 引用 / インラインコード表示
  • Guild 検索 API によるサーバー横断メッセージ検索
  • from: / in: / has: 検索フィルターの解析とDiscord検索API連携
  • 検索件数と結果要約を表示する検索ポップアップ
  • Voice チャンネルの参加/退出シグナリングと Voice Server 情報の受信
  • 通話中の self mute / self deaf 切り替え
  • Voice WebSocket v8 の Identify と WebRTC SDP シグナリング
  • WebRTC ICE / DTLS / SRTP による Opus 音声の送受信
  • Go Live の専用 Voice WebSocket / WebRTC 接続と H.264 映像送信
  • Go Live の H.264 映像受信・デコードとボイス画面での配信視聴
  • Discord の不完全な SDP answer の補正と PeerConnection 状態ログ
  • 復号済み Voice Opus フレームの PCM デコード(48 kHz stereo)
  • optional microphone feature による 48 kHz マイク取得・Opus エンコード・WebRTC 音声送信
cargo run

実アカウントでログインする場合は、設定画面の「実アカウントでログイン」にメールアドレス/電話番号とパスワードを入力します。MFA が有効なアカウントでは、ログイン後に表示される認証方式とコードを入力してください。接続成功後の User token はアプリ設定に保存され、次回起動時に自動接続します。パスワードは保存しません。

QRログインを使う場合は、ログイン画面の「DiscordアプリでQRログイン」を押し、表示されたQRコードをスマホのDiscordアプリで読み取って承認してください。Discordから追加認証を要求された場合は、--features webview で起動すると discord.com オリジンのWebViewにhCaptchaが表示されます。ユーザー自身で認証を完了すると、返された解答トークンとDiscordの captcha_rqtoken を使って同じログイン要求を再送します。自動解答や外部CAPTCHAソルバーは使用しません。QRログインはDiscordのRemote Auth Gateway(公開Bot APIではない非公開仕様)を利用するため、Discord側の仕様変更で利用できなくなる可能性があります。承認中のQRコードは他人に見せないでください。

OAuth2 の WebView ログインを使う場合は、Discord Developer Portal で OAuth2 アプリを作成し、Redirects に http://127.0.0.1:8787/callback を完全一致で登録します。Client ID を環境変数に設定して起動してください。

RUSTCORD_DISCORD_CLIENT_ID=あなたのClient_ID cargo run --features webview

設定画面の「OAuth2 WebViewログイン」からログインできます。Redirect URI を変更する場合は、Developer Portal の登録値と設定画面の値を一致させてください。ログインには PKCE と state 検証を使い、WebView は incognito モードで起動します。OAuth2 の Bearer access token は REST の scoped session に使用します。

Linux で WebView feature をビルドするには WebKitGTK 4.1 が必要です。Nix 環境では nix develop に含まれています。

Nix を使う場合は nix develop で入り、ALSA を含む開発環境を有効にできます。

起動時はログイン画面を表示します。実アカウントログインは .contexts/Paicord の認証フローを参考にした実験的互換機能です。Discord の ToS に反する可能性とアカウント停止リスクがあります。利用者自身の責任で使用してください。

接続する場合はログイン画面で認証モードを選び、アカウントログインまたは User token を入力してください。接続後は設定画面から再接続や認証設定を変更できます。Guild ID は任意で、空欄なら参加中の Guild を自動取得します。複数指定する場合はカンマ区切りです。環境変数 RUSTCORD_GUILD_ID を使うと起動時に指定できます。

参照画像の voice 会話パネルを起動時から表示する場合は RUSTCORD_THREAD_PANEL=1 cargo run を使えます。通常はヘッダーの会話アイコンから切り替えます。

リアルタイム本文とオンライン状態を Gateway から受け取るには、Discord 側で MESSAGE CONTENT INTENTPRESENCE INTENT を有効にしてください。メンバー一覧取得には SERVER MEMBERS INTENT が必要です。

マイク送信は optional feature です。cargo run --features microphone で有効になり、48 kHz の既定入力デバイスを Voice へ送信します。Linux では cpal/ALSA の開発パッケージが必要です。

Voice のメディア通信は通常 WebRTC(ICE / DTLS / SRTP)を使用します。接続の進捗、SDP、ICE、PeerConnection、Opus、DAVE のエラーは [rustcord][webrtc][rustcord][voice] を先頭に付けて標準出力へ記録します。旧 UDP/RTP transport と比較して問題を切り分ける場合だけ、RUSTCORD_VOICE_UDP=1 を設定してください。

画面共有は Gateway の STREAM_CREATE / STREAM_SET_PAUSED / STREAM_DELETE と、配信用の独立した Voice WebSocket / WebRTC PeerConnection を使用します。通話音声の PeerConnection は再ネゴシエーションも再接続も行わないため、配信の開始・停止中も音声を継続します。GNOME Wayland では XDG Desktop Portal の選択ダイアログで共有対象を選び、PipeWire → GStreamer で 1280×720・30fps の低遅延 H.264 に変換します。配信接続の進捗とエラーは [rustcord][stream]、映像フレームは [rustcord][webrtc] outbound screen として出力します。

添付送信は composer の を押してローカルファイルのパスを入力します。対象チャンネルでファイル添付権限が必要です。

スピーカー出力は任意機能です。cargo run --features audio で有効になり、Linux では alsa の開発パッケージが必要です。標準ビルドでは PCM を受信キューへ受け付け、音声デバイスなしでも起動できます。

参考:

  • discord.py-self — Gateway/API ラッパーの責務分離の参考
  • Paicord — ネイティブ Discord クライアントの UI/UX の参考

Twemoji graphics are licensed under CC BY 4.0, Copyright 2020 Twitter, Inc and other contributors.

About

egui-based discord client

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages