fix(discord): update sessions via interactions
This commit is contained in:
@@ -104,24 +104,38 @@ public sealed class SessionService(
|
||||
public async Task<List<WebGameGroup>> GetGroupsForUserAsync(string platform, string externalUserId)
|
||||
{
|
||||
await using var conn = await dataSource.OpenConnectionAsync();
|
||||
var effectiveId = await _ResolveEffectivePlayerIdAsync(conn, platform, externalUserId);
|
||||
if (effectiveId is null)
|
||||
var playerIds = await _ResolveLinkedPlayerIdsAsync(conn, platform, externalUserId);
|
||||
if (playerIds.Length == 0)
|
||||
return [];
|
||||
|
||||
return (await conn.QueryAsync<WebGameGroup>(
|
||||
"""
|
||||
WITH visible_groups AS (
|
||||
SELECT gm.group_id,
|
||||
CASE
|
||||
WHEN bool_or(gm.role = @OwnerRole) THEN @OwnerRole
|
||||
ELSE @CoGmRole
|
||||
END AS ManagerRole
|
||||
FROM group_managers gm
|
||||
WHERE gm.player_id = ANY(@PlayerIds)
|
||||
GROUP BY gm.group_id
|
||||
)
|
||||
SELECT g.id,
|
||||
g.telegram_chat_id AS TelegramChatId,
|
||||
g.external_group_id AS ExternalGroupId,
|
||||
g.name,
|
||||
g.platform AS Platform,
|
||||
gm.role AS ManagerRole
|
||||
FROM group_managers gm
|
||||
JOIN game_groups g ON g.id = gm.group_id
|
||||
WHERE gm.player_id = @PlayerId
|
||||
vg.ManagerRole
|
||||
FROM visible_groups vg
|
||||
JOIN game_groups g ON g.id = vg.group_id
|
||||
ORDER BY g.name
|
||||
""",
|
||||
new { PlayerId = effectiveId.Value })).ToList();
|
||||
new
|
||||
{
|
||||
PlayerIds = playerIds,
|
||||
OwnerRole = GroupManagerRoleExtensions.OwnerValue,
|
||||
CoGmRole = GroupManagerRoleExtensions.CoGmValue
|
||||
})).ToList();
|
||||
}
|
||||
|
||||
public async Task<WebGameGroup?> GetGroupAsync(Guid groupId)
|
||||
@@ -144,8 +158,8 @@ public sealed class SessionService(
|
||||
public async Task<bool> IsGroupManagerAsync(Guid groupId, string platform, string externalUserId)
|
||||
{
|
||||
await using var conn = await dataSource.OpenConnectionAsync();
|
||||
var effectiveId = await _ResolveEffectivePlayerIdAsync(conn, platform, externalUserId);
|
||||
if (effectiveId is null)
|
||||
var playerIds = await _ResolveLinkedPlayerIdsAsync(conn, platform, externalUserId);
|
||||
if (playerIds.Length == 0)
|
||||
return false;
|
||||
|
||||
return await conn.ExecuteScalarAsync<bool>(
|
||||
@@ -154,17 +168,17 @@ public sealed class SessionService(
|
||||
SELECT 1
|
||||
FROM group_managers
|
||||
WHERE group_id = @GroupId
|
||||
AND player_id = @PlayerId
|
||||
AND player_id = ANY(@PlayerIds)
|
||||
)
|
||||
""",
|
||||
new { GroupId = groupId, PlayerId = effectiveId.Value });
|
||||
new { GroupId = groupId, PlayerIds = playerIds });
|
||||
}
|
||||
|
||||
public async Task<bool> IsGroupOwnerAsync(Guid groupId, string platform, string externalUserId)
|
||||
{
|
||||
await using var conn = await dataSource.OpenConnectionAsync();
|
||||
var effectiveId = await _ResolveEffectivePlayerIdAsync(conn, platform, externalUserId);
|
||||
if (effectiveId is null)
|
||||
var playerIds = await _ResolveLinkedPlayerIdsAsync(conn, platform, externalUserId);
|
||||
if (playerIds.Length == 0)
|
||||
return false;
|
||||
|
||||
return await conn.ExecuteScalarAsync<bool>(
|
||||
@@ -173,11 +187,11 @@ public sealed class SessionService(
|
||||
SELECT 1
|
||||
FROM group_managers
|
||||
WHERE group_id = @GroupId
|
||||
AND player_id = @PlayerId
|
||||
AND player_id = ANY(@PlayerIds)
|
||||
AND role = @OwnerRole
|
||||
)
|
||||
""",
|
||||
new { GroupId = groupId, PlayerId = effectiveId.Value, OwnerRole = GroupManagerRoleExtensions.OwnerValue });
|
||||
new { GroupId = groupId, PlayerIds = playerIds, OwnerRole = GroupManagerRoleExtensions.OwnerValue });
|
||||
}
|
||||
|
||||
public async Task<List<WebGroupManager>> GetGroupManagersAsync(Guid groupId)
|
||||
@@ -1561,6 +1575,23 @@ public sealed class SessionService(
|
||||
return primaryId ?? playerId;
|
||||
}
|
||||
|
||||
private static async Task<Guid[]> _ResolveLinkedPlayerIdsAsync(NpgsqlConnection conn, string platform, string externalUserId)
|
||||
{
|
||||
var effectiveId = await _ResolveEffectivePlayerIdAsync(conn, platform, externalUserId);
|
||||
if (effectiveId is null)
|
||||
return [];
|
||||
|
||||
return (await conn.QueryAsync<Guid>(
|
||||
"""
|
||||
SELECT @EffectiveId
|
||||
UNION
|
||||
SELECT secondary_player_id
|
||||
FROM player_links
|
||||
WHERE primary_player_id = @EffectiveId
|
||||
""",
|
||||
new { EffectiveId = effectiveId.Value })).ToArray();
|
||||
}
|
||||
|
||||
private static async Task<Guid> _UpsertPlayerAndGetIdAsync(
|
||||
NpgsqlConnection conn, string platform, string externalUserId,
|
||||
string displayName, string? avatarUrl, NpgsqlTransaction? transaction)
|
||||
|
||||
Reference in New Issue
Block a user