about summary refs log tree commit diff
path: root/OsuFederatedBeatmapApi/Services
diff options
context:
space:
mode:
authorEmma [it/its]@Rory& <root@rory.gay>2023-10-14 23:19:46 +0200
committerEmma [it/its]@Rory& <root@rory.gay>2023-10-14 23:19:46 +0200
commit73461bd79f923caa44740f170213a4abb4743660 (patch)
tree89cbb7403b4bf3f86a505d70a8f255b6463a2c3f /OsuFederatedBeatmapApi/Services
parentMaybe fix libmatrix bug with room creation (diff)
downloadOsuFederatedBeatmapApi-master.tar.xz
Stuff works HEAD master
Diffstat (limited to 'OsuFederatedBeatmapApi/Services')
-rw-r--r--OsuFederatedBeatmapApi/Services/BeatmapFetcherService.cs34
-rw-r--r--OsuFederatedBeatmapApi/Services/FederatedBeatmapApiBot.cs23
2 files changed, 56 insertions, 1 deletions
diff --git a/OsuFederatedBeatmapApi/Services/BeatmapFetcherService.cs b/OsuFederatedBeatmapApi/Services/BeatmapFetcherService.cs
new file mode 100644
index 0000000..ae108fb
--- /dev/null
+++ b/OsuFederatedBeatmapApi/Services/BeatmapFetcherService.cs
@@ -0,0 +1,34 @@
+using System.Net.Http.Headers;
+using OsuFederatedBeatmapApi.Events.State;
+using OsuFederatedBeatmapApi.UtilityClasses;
+
+namespace OsuFederatedBeatmapApi.Services;
+
+public class BeatmapFetcherService(FederatedBeatmapApiBotAccountDataService ads) {
+
+    public async Task<BeatmapSetInfo> FetchBeatmapSetInfo(int id) {
+        var hc = new HttpClient();
+        hc.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("OsuFederatedBeatmapApi", "1.0"));
+        var res = await hc.GetFromJsonAsync<OsuDirectApiResponses.BeatmapSet>($"https://osu.direct/api/s/{id}");
+        var info = new BeatmapSetInfo {
+            Title = res.Title,
+            Artist = res.Artist,
+            Creator = res.Creator,
+            Beatmaps = res.ChildrenBeatmaps.ToDictionary(b => b.BeatmapID, b => new BeatmapSetInfo.BeatmapInfo {
+                Difficulty = b.DiffName,
+                Mode = b.Mode,
+                DifficultyRating = b.DifficultyRating,
+                TotalLength = b.TotalLength,
+                BPM = b.BPM,
+                MaxCombo = b.MaxCombo
+            })
+        };
+
+        await ads.LoadAccountDataAsync();
+
+        await ads.OwnBeatmapRepositoryRoom.SendStateEventAsync(BeatmapSetInfo.EventName, id.ToString(), info);
+
+        return info;
+    }
+
+}
diff --git a/OsuFederatedBeatmapApi/Services/FederatedBeatmapApiBot.cs b/OsuFederatedBeatmapApi/Services/FederatedBeatmapApiBot.cs
index b8cc635..2aaf45c 100644
--- a/OsuFederatedBeatmapApi/Services/FederatedBeatmapApiBot.cs
+++ b/OsuFederatedBeatmapApi/Services/FederatedBeatmapApiBot.cs
@@ -40,7 +40,28 @@ public class FederatedBeatmapApiBot(AuthenticatedHomeserverGeneric hs,
                 var controlRoomMembers = accountDataService.ControlRoom.GetMembersAsync();
                 await foreach (var member in controlRoomMembers) {
                     if ((member.TypedContent as RoomMemberEventContent)?
-                        .Membership == "join") admins.Add(member.UserId);
+                        .Membership == "join")
+                        admins.Add(member.StateKey);
+                }
+
+                var pls = await accountDataService.OwnBeatmapRepositoryRoom.GetPowerLevelsAsync();
+                var ownPl = pls.GetUserPowerLevel(hs.UserId);
+
+                if (!pls.UserHasPermission(hs.UserId, RoomPowerLevelEventContent.EventId)) {
+                    accountDataService.LogRoom.SendMessageEventAsync(
+                        MessageFormatter.FormatError(
+                            $"I don't have permission to send power level updates in " +
+                            $"{MessageFormatter.HtmlFormatMention(accountDataService.OwnBeatmapRepositoryRoom.RoomId, "my own beatmap repository")}!"));
+                }
+                else {
+                    foreach (var admin in admins) {
+                        if (pls.GetUserPowerLevel(admin) < ownPl - 1) {
+                            logger.LogInformation("Raising powerlevel of {} in {} to {}", admin, accountDataService.OwnBeatmapRepositoryRoom.RoomId, ownPl - 1);
+                            pls.SetUserPowerLevel(admin, ownPl - 1);
+                            await accountDataService.OwnBeatmapRepositoryRoom.SendStateEventAsync(
+                                RoomPowerLevelEventContent.EventId, pls);
+                        }
+                    }
                 }
 
                 await Task.Delay(TimeSpan.FromSeconds(30), cancellationToken);