fix(discord): update sessions via interactions
Deploy Telegram Bot / build-and-push (push) Successful in 6m14s
Deploy Telegram Bot / scan-images (push) Successful in 3m12s
Deploy Telegram Bot / deploy (push) Successful in 31s

This commit is contained in:
2026-05-26 14:24:06 +03:00
parent 56aeca5288
commit 3447acd8c4
12 changed files with 445 additions and 68 deletions
+46 -15
View File
@@ -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)