82 lines
2.6 KiB
Dart
82 lines
2.6 KiB
Dart
// 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<void> 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<List<String>> getNodes() async {
|
||
// 現在接続可能なノードを返す(ハートビートの結果などから集約)
|
||
return []; // ここに母艦が管理するノードリストを読み込むロジック
|
||
}
|
||
}
|
||
|
||
/// メール送信用ダミーモデル(後実装で本格的な GmailService の構築へ)
|
||
class EmailMessage {
|
||
final String from;
|
||
final String body;
|
||
final String? to;
|
||
|
||
EmailMessage(this.from, this.body, this.to);
|
||
|
||
// ...実際のメールオブジェクト構築は Googleapis ライブラリに委譲...
|
||
}
|