blob: 9b61929ff166b4adef6b51f0b07a3da3b7bf6dd9 (
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
|
using ArcaneLibs.Extensions;
using LibMatrix.EventTypes.Spec.State;
using LibMatrix.EventTypes.Spec.State.RoomInfo;
using LibMatrix.HomeserverEmulator.Services;
using LibMatrix.Homeservers;
using LibMatrix.Responses;
using Microsoft.AspNetCore.Mvc;
namespace LibMatrix.HomeserverEmulator.Controllers;
[ApiController]
[Route("/_matrix/")]
public class DirectoryController(ILogger<DirectoryController> logger, RoomStore roomStore) : ControllerBase {
#region Room directory
[HttpGet("client/v3/directory/room/{alias}")]
public async Task<AliasResult> GetRoomAliasV3(string alias) {
var match = roomStore._rooms.FirstOrDefault(x =>
x.State.Any(y => y.Type == RoomCanonicalAliasEventContent.EventId && y.StateKey == "" && y.RawContent?["alias"]?.ToString() == alias));
if (match == null)
throw new MatrixException() {
ErrorCode = "M_NOT_FOUND",
Error = "Room not found"
};
var servers = match.State.Where(x => x.Type == RoomMemberEventContent.EventId && x.RawContent?["membership"]?.ToString() == "join")
.Select(x => x.StateKey!.Split(':', 2)[1]).ToList();
return new() {
RoomId = match.RoomId,
Servers = servers
};
}
#endregion
#region User directory
[HttpPost("client/v3/user_directory/search")]
public async Task<UserDirectoryResponse> SearchUserDirectory([FromBody] UserDirectoryRequest request) {
var users = roomStore._rooms
.SelectMany(x => x.State.Where(y =>
y.Type == RoomMemberEventContent.EventId
&& y.RawContent?["membership"]?.ToString() == "join"
&& (y.StateKey!.ContainsAnyCase(request.SearchTerm) || y.RawContent?["displayname"]?.ToString()?.ContainsAnyCase(request.SearchTerm) == true)
)
)
.DistinctBy(x => x.StateKey)
.ToList();
request.Limit ??= 10;
return new() {
Results = users.Select(x => new UserDirectoryResponse.UserDirectoryResult {
UserId = x.StateKey!,
DisplayName = x.RawContent?["displayname"]?.ToString(),
AvatarUrl = x.RawContent?["avatar_url"]?.ToString()
}).ToList(),
Limited = users.Count > request.Limit
};
}
#endregion
}
|