// Version: 1.0.0 import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:googleapis/gmail/v1.dart'; import 'package:googleapis_auth/google_auth.dart'; /// Gmail API を介した同期用メールリレー /// /// P2P 通信不要なノード識別システムを提供します。 class GmailWrapper { final String _gmailAddress; // BCC 用gmail アドレス(ノードキー) final GAuthClient? _authClient; // OAuth 認証クライアント final GmailService? _gmail; /// 新しいインスタンスを作成 factory GmailWrapper({ required String gmailAddress, bool useOAuth = true, }) { if (useOAuth) { // 正式な OAuth2 フロー(credentials.json など)を使う場合 final client = GAuthClient.fromFile('credentials.json'); return GmailWrapper._internal( gmailAddress: gmailAddress, authClient: client, ); } else { // アプリパスワードなどの簡易認証は後実装 throw UnsupportedError('OAuth 方式でのみサポートされています'); } } GmailWrapper._internal({ required this._gmailAddress, required GAuthClient? authClient, }) : _authClient = authClient, _gmail = authClient != null ? GmailService(authClient) : null; /// ノード ID(BCC アドレス)を取得 String get gmailAddress => _gmailAddress; /// チャットメッセージをノードに配送する Future sendMessage({ required String fromNode, required String message, String? toNode, }) async { if (_gmail == null) return; try { // シンプルなテキストの送信(HTML のため簡易 escaping) final body = base64Encode(utf8.encode(message)); await _gmail.users.messages.send( userId: 'me', body: EmailMessage(fromNode, message, toNode), ); print('[Gmail] メッセージ送信完了 (from=$fromNode to=$toNode)'); } catch (e) { print('[Gmail] 送信失敗:$e'); rethrow; } } /// ノードリストを取得(自己認識用) Future> getNodes() async { // 現在接続可能なノードを返す(ハートビートの結果などから集約) return []; // ここに母艦が管理するノードリストを読み込むロジック } } /// メール送信用ダミーモデル(後実装で本格的な GmailService の構築へ) class EmailMessage { final String from; final String body; final String? to; EmailMessage(this.from, this.body, this.to); // ...実際のメールオブジェクト構築は Googleapis ライブラリに委譲... }