diff --git a/.vscode/launch.json b/.vscode/launch.json index 64e643b..bf9ab6a 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,6 +6,7 @@ "configurations": [ { "name": "nexusbot", + "preLaunchTask": "rm-socket", "program": "bin/nexusbot.dart", "args": [ "--socket", diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..724fc1c --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,14 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "rm-socket", + "type": "shell", + "presentation": { + "reveal": "silent", + "close": true + }, + "command": "rm socket || true" + } + ] +} diff --git a/lib/helpers/api_helper.dart b/lib/helpers/api_helper.dart index da9d2d6..b6a4f9e 100644 --- a/lib/helpers/api_helper.dart +++ b/lib/helpers/api_helper.dart @@ -1,5 +1,6 @@ import "dart:convert"; import "dart:io"; +import "package:markdown/markdown.dart"; import "package:nexusbot/controllers/login_controller.dart"; import "package:nexusbot/controllers/settings_controller.dart"; import "package:nexusbot/models/registration.dart"; @@ -34,30 +35,68 @@ class ApiHelper { return json.decode(response.body)["room_id"]; } + Future sendMessage(message, {required String room}) async { + final settings = ref.read(SettingsController.provider)!; + final response = await http.put( + settings.homeserver.replace( + path: + "_matrix/client/v3/rooms/${await getRoomId(room)}/send/m.room.message/${getTxn()}", + ), + headers: await getHeaders(), + body: json.encode({ + "msgtype": "m.text", + "body": message, + "format": "org.matrix.custom.html", + "formatted_body": markdownToHtml(message), + }), + ); + + if (response.statusCode != 200) { + throw Exception("Message send failed for room $room: ${response.body}"); + } + + return json.decode(response.body)["event_id"]; + } + + Future react( + String reaction, { + required String eventId, + required String room, + }) async { + final settings = ref.read(SettingsController.provider)!; + final response = await http.put( + settings.homeserver.replace( + path: + "_matrix/client/v3/rooms/${await getRoomId(room)}/send/m.reaction/${getTxn()}", + ), + headers: await getHeaders(), + body: json.encode({ + "m.relates_to": { + "rel_type": "m.annotation", + "event_id": eventId, + "key": reaction, + }, + }), + ); + + if (response.statusCode != 200) { + throw Exception("Reaction failed for room $room: ${response.body}"); + } + + return json.decode(response.body)["event_id"]; + } + Future register(Request request) async { final settings = ref.read(SettingsController.provider)!; final registration = Registration.fromJson( json.decode(await request.readAsString()), ); - final response = await http.post( - settings.homeserver.replace( - path: - "_matrix/client/v3/rooms/${await getRoomId(settings.adminRoom)}/send/m.room.message/${getTxn()}", - ), - headers: await getHeaders(), - body: json.encode({ - "msgtype": "m.text", - "body": - "Signup request from ${registration.username}, email is: ${registration.email}.", - }), - ); + final event = await sendMessage("""# Registration request +- Username: `${registration.username}` +- Email: `${registration.email}`""", room: settings.adminRoom); - if (response.statusCode != 200) { - throw Exception( - "Registration failed for ${registration.username}: ${response.body}", - ); - } + await react("✅", eventId: event, room: settings.adminRoom); return Response.found(settings.successUri); } diff --git a/pubspec.lock b/pubspec.lock index 1b03549..e45aaff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -385,6 +385,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + markdown: + dependency: "direct main" + description: + name: markdown + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" + url: "https://pub.dev" + source: hosted + version: "7.3.0" matcher: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 84f20f6..f65a51f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: cli_tools: ^0.6.0 args: ^2.7.0 enough_mail: ^2.1.6 + markdown: ^7.3.0 dev_dependencies: build_runner: ^2.4.6