blob: db47b8555a1bc8a934c517abc649453ff11ef7ec (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
using System.Text.RegularExpressions;
using ArcaneLibs.Extensions;
using BugMine.Web.Classes.Exceptions;
using LibMatrix;
using LibMatrix.Homeservers;
using LibMatrix.Responses;
using LibMatrix.RoomTypes;
namespace BugMine.Web.Classes;
public class BugMineClient(AuthenticatedHomeserverGeneric homeserver) {
public AuthenticatedHomeserverGeneric Homeserver { get; } = homeserver;
public async IAsyncEnumerable<BugMineProject> GetProjects() {
List<Task<BugMineProject>> tasks = [];
await foreach (var room in homeserver.GetJoinedRoomsByType(BugMineProject.RoomType)) {
tasks.Add(room.AsBugMineProject());
}
var results = tasks.ToAsyncEnumerable();
await foreach (var result in results) {
yield return result;
}
}
public async Task<BugMineProject> CreateProject(ProjectInfo request) {
var alias = string.Join('_', Regex.Matches(request.Name, @"[a-zA-Z0-9]+").Select(x => x.Value)) + "-bugmine";
var crr = new CreateRoomRequest() {
CreationContent = new() {
["type"] = "gay.rory.bugmine.project"
},
Name = $"{request.Name} (BugMine project)",
RoomAliasName = alias,
InitialState = [
new StateEvent() {
Type = "m.room.join_rules",
RawContent = new() {
["join_rule"] = "public"
}
},
new StateEvent() {
Type = ProjectInfo.EventId,
TypedContent = request
}
]
};
var response = await Homeserver.CreateRoom(crr);
// await response.SendStateEventAsync(ProjectInfo.EventId, request);
return await response.AsBugMineProject();
}
public async Task<BugMineProject?> GetProject(string projectSlug) {
var room = await ResolveProjectSlug(projectSlug);
if (room == null) return null;
var rooms = await Homeserver.GetJoinedRooms();
if (!rooms.Any(r => r.RoomId == room.RoomId)) throw new BugMineException(BugMineException.ErrorCodes.UserNotInRoom);
return await (await room.AsBugMineProject()).InitializeAsync();
}
public async Task<GenericRoom?> ResolveProjectSlug(string projectSlug) {
GenericRoom? room;
if (projectSlug.StartsWith('!')) {
room = homeserver.GetRoom(projectSlug);
}
else {
var alias = $"#{projectSlug}";
var resolveResult = await Homeserver.ResolveRoomAliasAsync(alias);
if (string.IsNullOrEmpty(resolveResult?.RoomId)) return null; //TODO: fallback to finding via joined rooms' canonical alias event?
room = homeserver.GetRoom(resolveResult.RoomId);
}
return room;
}
}
|