feat(guild): join_request_accept + reject_join_request

This commit is contained in:
gamer147
2026-06-27 13:58:54 -04:00
parent 771d884314
commit dd955fe4be
3 changed files with 363 additions and 6 deletions

View File

@@ -327,11 +327,40 @@ public sealed class GuildService : IGuildService
return GuildOpResult.Ok;
}
public Task<GuildOpResult> AcceptJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
=> throw new NotImplementedException();
public async Task<GuildOpResult> AcceptJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
{
var m = await _members.GetMembershipAsync(callerViewerId, ct);
if (m is null) return new(GuildOpResultCode.NotInGuild);
if (m.Role != GuildRole.Leader) return new(GuildOpResultCode.PermissionDenied);
public Task<GuildOpResult> RejectJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
=> throw new NotImplementedException();
var req = await _joinRequests.GetAsync(m.GuildId, applicantViewerId, ct);
if (req is null) return new(GuildOpResultCode.JoinRequestNotFound);
if (req.Status != GuildJoinRequestStatus.Pending) return new(GuildOpResultCode.JoinRequestAlreadyResolved);
var cfg = _config.Get<GuildConfig>();
var memberCount = await _members.CountByGuildAsync(m.GuildId, ct);
if (memberCount >= cfg.MaxMemberNum) return new(GuildOpResultCode.MemberCapReached);
var now = DateTime.UtcNow;
await _joinRequests.UpdateStatusAsync(m.GuildId, applicantViewerId, GuildJoinRequestStatus.Accepted, now, ct);
await CommitJoinAsync(applicantViewerId, m.GuildId, now, ct);
return GuildOpResult.Ok;
}
public async Task<GuildOpResult> RejectJoinRequestAsync(long callerViewerId, long applicantViewerId, CancellationToken ct = default)
{
var m = await _members.GetMembershipAsync(callerViewerId, ct);
if (m is null) return new(GuildOpResultCode.NotInGuild);
if (m.Role != GuildRole.Leader) return new(GuildOpResultCode.PermissionDenied);
var req = await _joinRequests.GetAsync(m.GuildId, applicantViewerId, ct);
if (req is null) return new(GuildOpResultCode.JoinRequestNotFound);
if (req.Status != GuildJoinRequestStatus.Pending) return new(GuildOpResultCode.JoinRequestAlreadyResolved);
var now = DateTime.UtcNow;
await _joinRequests.UpdateStatusAsync(m.GuildId, applicantViewerId, GuildJoinRequestStatus.Rejected, now, ct);
return GuildOpResult.Ok;
}
public Task<GuildOpResult> LeaveAsync(long viewerId, CancellationToken ct = default)
=> throw new NotImplementedException();