diff --git a/.vscode/launch.json b/.vscode/launch.json index 9fab56e..a4cb667 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -31,10 +31,12 @@ "grapevine", "--email", "henry@henryhiles.com", + "--emailAlias", + "info@federated.nexus", "--mailDomain", "mail.henryhiles.com", "--mailName", - "Federated Nexus Registrations" + "Federated Nexus" ], "request": "launch", "type": "dart" diff --git a/bin/nexusbot.dart b/bin/nexusbot.dart index 2f528ef..f81ce27 100644 --- a/bin/nexusbot.dart +++ b/bin/nexusbot.dart @@ -23,6 +23,7 @@ void main(List argsRaw) async { ..addOption("adminName", mandatory: true) ..addOption("adminRoom", mandatory: true) ..addOption("email", mandatory: true) + ..addOption("emailAlias", mandatory: false) ..addOption("mailName", mandatory: true) ..addOption("mailDomain", mandatory: true) ..addOption("smtpPasswordFile", mandatory: true) @@ -100,7 +101,6 @@ If you have any questions, check out [our documentation](https://federated.nexus If you have any issues, reply to this email.""", subject: "Your registration for Federated Nexus has been accepted!", - from: mail.MailAddress(settings.mailName, settings.email), to: mail.MailAddress(registration.username, registration.email), ); await event.room.redactEvent(reactionEvent!); diff --git a/lib/controllers/mail_client_controller.dart b/lib/controllers/mail_client_controller.dart index 8e462d9..228eb70 100644 --- a/lib/controllers/mail_client_controller.dart +++ b/lib/controllers/mail_client_controller.dart @@ -25,17 +25,20 @@ class MailClientController extends AsyncNotifier { required String plainText, required String markdown, required String subject, - required MailAddress from, required MailAddress to, }) async { final client = await future; + final settings = ref.watch(SettingsController.provider)!; + return await client.sendMessageBuilder( MessageBuilder.prepareMultipartAlternativeMessage( plainText: plainText, htmlText: markdownToHtml(markdown), ) ..subject = subject - ..from = [from] + ..from = [ + MailAddress(settings.mailName, settings.emailAlias ?? settings.email), + ] ..to = [to], ); } diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 2c76fd5..235d4c0 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -14,6 +14,7 @@ abstract class Settings with _$Settings { required String adminName, required String adminRoom, required String email, + required String? emailAlias, required String mailName, required String? inviteTo, required String mailDomain, diff --git a/lib/models/settings.freezed.dart b/lib/models/settings.freezed.dart index fba9f73..414b06e 100644 --- a/lib/models/settings.freezed.dart +++ b/lib/models/settings.freezed.dart @@ -16,7 +16,7 @@ T _$identity(T value) => value; /// @nodoc mixin _$Settings { - String get socket; Uri get homeserver; Uri get failureUri; Uri get successUri; String get name; String get adminName; String get adminRoom; String get email; String get mailName; String? get inviteTo; String get mailDomain; String get smtpPasswordFile; String get botPasswordFile; + String get socket; Uri get homeserver; Uri get failureUri; Uri get successUri; String get name; String get adminName; String get adminRoom; String get email; String? get emailAlias; String get mailName; String? get inviteTo; String get mailDomain; String get smtpPasswordFile; String get botPasswordFile; /// Create a copy of Settings /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @@ -29,16 +29,16 @@ $SettingsCopyWith get copyWith => _$SettingsCopyWithImpl(thi @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.failureUri, failureUri) || other.failureUri == failureUri)&&(identical(other.successUri, successUri) || other.successUri == successUri)&&(identical(other.name, name) || other.name == name)&&(identical(other.adminName, adminName) || other.adminName == adminName)&&(identical(other.adminRoom, adminRoom) || other.adminRoom == adminRoom)&&(identical(other.email, email) || other.email == email)&&(identical(other.mailName, mailName) || other.mailName == mailName)&&(identical(other.inviteTo, inviteTo) || other.inviteTo == inviteTo)&&(identical(other.mailDomain, mailDomain) || other.mailDomain == mailDomain)&&(identical(other.smtpPasswordFile, smtpPasswordFile) || other.smtpPasswordFile == smtpPasswordFile)&&(identical(other.botPasswordFile, botPasswordFile) || other.botPasswordFile == botPasswordFile)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.failureUri, failureUri) || other.failureUri == failureUri)&&(identical(other.successUri, successUri) || other.successUri == successUri)&&(identical(other.name, name) || other.name == name)&&(identical(other.adminName, adminName) || other.adminName == adminName)&&(identical(other.adminRoom, adminRoom) || other.adminRoom == adminRoom)&&(identical(other.email, email) || other.email == email)&&(identical(other.emailAlias, emailAlias) || other.emailAlias == emailAlias)&&(identical(other.mailName, mailName) || other.mailName == mailName)&&(identical(other.inviteTo, inviteTo) || other.inviteTo == inviteTo)&&(identical(other.mailDomain, mailDomain) || other.mailDomain == mailDomain)&&(identical(other.smtpPasswordFile, smtpPasswordFile) || other.smtpPasswordFile == smtpPasswordFile)&&(identical(other.botPasswordFile, botPasswordFile) || other.botPasswordFile == botPasswordFile)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,socket,homeserver,failureUri,successUri,name,adminName,adminRoom,email,mailName,inviteTo,mailDomain,smtpPasswordFile,botPasswordFile); +int get hashCode => Object.hash(runtimeType,socket,homeserver,failureUri,successUri,name,adminName,adminRoom,email,emailAlias,mailName,inviteTo,mailDomain,smtpPasswordFile,botPasswordFile); @override String toString() { - return 'Settings(socket: $socket, homeserver: $homeserver, failureUri: $failureUri, successUri: $successUri, name: $name, adminName: $adminName, adminRoom: $adminRoom, email: $email, mailName: $mailName, inviteTo: $inviteTo, mailDomain: $mailDomain, smtpPasswordFile: $smtpPasswordFile, botPasswordFile: $botPasswordFile)'; + return 'Settings(socket: $socket, homeserver: $homeserver, failureUri: $failureUri, successUri: $successUri, name: $name, adminName: $adminName, adminRoom: $adminRoom, email: $email, emailAlias: $emailAlias, mailName: $mailName, inviteTo: $inviteTo, mailDomain: $mailDomain, smtpPasswordFile: $smtpPasswordFile, botPasswordFile: $botPasswordFile)'; } @@ -49,7 +49,7 @@ abstract mixin class $SettingsCopyWith<$Res> { factory $SettingsCopyWith(Settings value, $Res Function(Settings) _then) = _$SettingsCopyWithImpl; @useResult $Res call({ - String socket, Uri homeserver, Uri failureUri, Uri successUri, String name, String adminName, String adminRoom, String email, String mailName, String? inviteTo, String mailDomain, String smtpPasswordFile, String botPasswordFile + String socket, Uri homeserver, Uri failureUri, Uri successUri, String name, String adminName, String adminRoom, String email, String? emailAlias, String mailName, String? inviteTo, String mailDomain, String smtpPasswordFile, String botPasswordFile }); @@ -66,7 +66,7 @@ class _$SettingsCopyWithImpl<$Res> /// Create a copy of Settings /// with the given fields replaced by the non-null parameter values. -@pragma('vm:prefer-inline') @override $Res call({Object? socket = null,Object? homeserver = null,Object? failureUri = null,Object? successUri = null,Object? name = null,Object? adminName = null,Object? adminRoom = null,Object? email = null,Object? mailName = null,Object? inviteTo = freezed,Object? mailDomain = null,Object? smtpPasswordFile = null,Object? botPasswordFile = null,}) { +@pragma('vm:prefer-inline') @override $Res call({Object? socket = null,Object? homeserver = null,Object? failureUri = null,Object? successUri = null,Object? name = null,Object? adminName = null,Object? adminRoom = null,Object? email = null,Object? emailAlias = freezed,Object? mailName = null,Object? inviteTo = freezed,Object? mailDomain = null,Object? smtpPasswordFile = null,Object? botPasswordFile = null,}) { return _then(_self.copyWith( socket: null == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable @@ -76,7 +76,8 @@ as Uri,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nu as String,adminName: null == adminName ? _self.adminName : adminName // ignore: cast_nullable_to_non_nullable as String,adminRoom: null == adminRoom ? _self.adminRoom : adminRoom // ignore: cast_nullable_to_non_nullable as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable -as String,mailName: null == mailName ? _self.mailName : mailName // ignore: cast_nullable_to_non_nullable +as String,emailAlias: freezed == emailAlias ? _self.emailAlias : emailAlias // ignore: cast_nullable_to_non_nullable +as String?,mailName: null == mailName ? _self.mailName : mailName // ignore: cast_nullable_to_non_nullable as String,inviteTo: freezed == inviteTo ? _self.inviteTo : inviteTo // ignore: cast_nullable_to_non_nullable as String?,mailDomain: null == mailDomain ? _self.mailDomain : mailDomain // ignore: cast_nullable_to_non_nullable as String,smtpPasswordFile: null == smtpPasswordFile ? _self.smtpPasswordFile : smtpPasswordFile // ignore: cast_nullable_to_non_nullable @@ -92,7 +93,7 @@ as String, @JsonSerializable() class _Settings implements Settings { - const _Settings({required this.socket, required this.homeserver, required this.failureUri, required this.successUri, required this.name, required this.adminName, required this.adminRoom, required this.email, required this.mailName, required this.inviteTo, required this.mailDomain, required this.smtpPasswordFile, required this.botPasswordFile}); + const _Settings({required this.socket, required this.homeserver, required this.failureUri, required this.successUri, required this.name, required this.adminName, required this.adminRoom, required this.email, required this.emailAlias, required this.mailName, required this.inviteTo, required this.mailDomain, required this.smtpPasswordFile, required this.botPasswordFile}); factory _Settings.fromJson(Map json) => _$SettingsFromJson(json); @override final String socket; @@ -103,6 +104,7 @@ class _Settings implements Settings { @override final String adminName; @override final String adminRoom; @override final String email; +@override final String? emailAlias; @override final String mailName; @override final String? inviteTo; @override final String mailDomain; @@ -122,16 +124,16 @@ Map toJson() { @override bool operator ==(Object other) { - return identical(this, other) || (other.runtimeType == runtimeType&&other is _Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.failureUri, failureUri) || other.failureUri == failureUri)&&(identical(other.successUri, successUri) || other.successUri == successUri)&&(identical(other.name, name) || other.name == name)&&(identical(other.adminName, adminName) || other.adminName == adminName)&&(identical(other.adminRoom, adminRoom) || other.adminRoom == adminRoom)&&(identical(other.email, email) || other.email == email)&&(identical(other.mailName, mailName) || other.mailName == mailName)&&(identical(other.inviteTo, inviteTo) || other.inviteTo == inviteTo)&&(identical(other.mailDomain, mailDomain) || other.mailDomain == mailDomain)&&(identical(other.smtpPasswordFile, smtpPasswordFile) || other.smtpPasswordFile == smtpPasswordFile)&&(identical(other.botPasswordFile, botPasswordFile) || other.botPasswordFile == botPasswordFile)); + return identical(this, other) || (other.runtimeType == runtimeType&&other is _Settings&&(identical(other.socket, socket) || other.socket == socket)&&(identical(other.homeserver, homeserver) || other.homeserver == homeserver)&&(identical(other.failureUri, failureUri) || other.failureUri == failureUri)&&(identical(other.successUri, successUri) || other.successUri == successUri)&&(identical(other.name, name) || other.name == name)&&(identical(other.adminName, adminName) || other.adminName == adminName)&&(identical(other.adminRoom, adminRoom) || other.adminRoom == adminRoom)&&(identical(other.email, email) || other.email == email)&&(identical(other.emailAlias, emailAlias) || other.emailAlias == emailAlias)&&(identical(other.mailName, mailName) || other.mailName == mailName)&&(identical(other.inviteTo, inviteTo) || other.inviteTo == inviteTo)&&(identical(other.mailDomain, mailDomain) || other.mailDomain == mailDomain)&&(identical(other.smtpPasswordFile, smtpPasswordFile) || other.smtpPasswordFile == smtpPasswordFile)&&(identical(other.botPasswordFile, botPasswordFile) || other.botPasswordFile == botPasswordFile)); } @JsonKey(includeFromJson: false, includeToJson: false) @override -int get hashCode => Object.hash(runtimeType,socket,homeserver,failureUri,successUri,name,adminName,adminRoom,email,mailName,inviteTo,mailDomain,smtpPasswordFile,botPasswordFile); +int get hashCode => Object.hash(runtimeType,socket,homeserver,failureUri,successUri,name,adminName,adminRoom,email,emailAlias,mailName,inviteTo,mailDomain,smtpPasswordFile,botPasswordFile); @override String toString() { - return 'Settings(socket: $socket, homeserver: $homeserver, failureUri: $failureUri, successUri: $successUri, name: $name, adminName: $adminName, adminRoom: $adminRoom, email: $email, mailName: $mailName, inviteTo: $inviteTo, mailDomain: $mailDomain, smtpPasswordFile: $smtpPasswordFile, botPasswordFile: $botPasswordFile)'; + return 'Settings(socket: $socket, homeserver: $homeserver, failureUri: $failureUri, successUri: $successUri, name: $name, adminName: $adminName, adminRoom: $adminRoom, email: $email, emailAlias: $emailAlias, mailName: $mailName, inviteTo: $inviteTo, mailDomain: $mailDomain, smtpPasswordFile: $smtpPasswordFile, botPasswordFile: $botPasswordFile)'; } @@ -142,7 +144,7 @@ abstract mixin class _$SettingsCopyWith<$Res> implements $SettingsCopyWith<$Res> factory _$SettingsCopyWith(_Settings value, $Res Function(_Settings) _then) = __$SettingsCopyWithImpl; @override @useResult $Res call({ - String socket, Uri homeserver, Uri failureUri, Uri successUri, String name, String adminName, String adminRoom, String email, String mailName, String? inviteTo, String mailDomain, String smtpPasswordFile, String botPasswordFile + String socket, Uri homeserver, Uri failureUri, Uri successUri, String name, String adminName, String adminRoom, String email, String? emailAlias, String mailName, String? inviteTo, String mailDomain, String smtpPasswordFile, String botPasswordFile }); @@ -159,7 +161,7 @@ class __$SettingsCopyWithImpl<$Res> /// Create a copy of Settings /// with the given fields replaced by the non-null parameter values. -@override @pragma('vm:prefer-inline') $Res call({Object? socket = null,Object? homeserver = null,Object? failureUri = null,Object? successUri = null,Object? name = null,Object? adminName = null,Object? adminRoom = null,Object? email = null,Object? mailName = null,Object? inviteTo = freezed,Object? mailDomain = null,Object? smtpPasswordFile = null,Object? botPasswordFile = null,}) { +@override @pragma('vm:prefer-inline') $Res call({Object? socket = null,Object? homeserver = null,Object? failureUri = null,Object? successUri = null,Object? name = null,Object? adminName = null,Object? adminRoom = null,Object? email = null,Object? emailAlias = freezed,Object? mailName = null,Object? inviteTo = freezed,Object? mailDomain = null,Object? smtpPasswordFile = null,Object? botPasswordFile = null,}) { return _then(_Settings( socket: null == socket ? _self.socket : socket // ignore: cast_nullable_to_non_nullable as String,homeserver: null == homeserver ? _self.homeserver : homeserver // ignore: cast_nullable_to_non_nullable @@ -169,7 +171,8 @@ as Uri,name: null == name ? _self.name : name // ignore: cast_nullable_to_non_nu as String,adminName: null == adminName ? _self.adminName : adminName // ignore: cast_nullable_to_non_nullable as String,adminRoom: null == adminRoom ? _self.adminRoom : adminRoom // ignore: cast_nullable_to_non_nullable as String,email: null == email ? _self.email : email // ignore: cast_nullable_to_non_nullable -as String,mailName: null == mailName ? _self.mailName : mailName // ignore: cast_nullable_to_non_nullable +as String,emailAlias: freezed == emailAlias ? _self.emailAlias : emailAlias // ignore: cast_nullable_to_non_nullable +as String?,mailName: null == mailName ? _self.mailName : mailName // ignore: cast_nullable_to_non_nullable as String,inviteTo: freezed == inviteTo ? _self.inviteTo : inviteTo // ignore: cast_nullable_to_non_nullable as String?,mailDomain: null == mailDomain ? _self.mailDomain : mailDomain // ignore: cast_nullable_to_non_nullable as String,smtpPasswordFile: null == smtpPasswordFile ? _self.smtpPasswordFile : smtpPasswordFile // ignore: cast_nullable_to_non_nullable diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index e13ef23..ce83370 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -15,6 +15,7 @@ _Settings _$SettingsFromJson(Map json) => _Settings( adminName: json['adminName'] as String, adminRoom: json['adminRoom'] as String, email: json['email'] as String, + emailAlias: json['emailAlias'] as String?, mailName: json['mailName'] as String, inviteTo: json['inviteTo'] as String?, mailDomain: json['mailDomain'] as String, @@ -31,6 +32,7 @@ Map _$SettingsToJson(_Settings instance) => { 'adminName': instance.adminName, 'adminRoom': instance.adminRoom, 'email': instance.email, + 'emailAlias': instance.emailAlias, 'mailName': instance.mailName, 'inviteTo': instance.inviteTo, 'mailDomain': instance.mailDomain,