forked from admin/VolcanicAgenticCore
34 lines
1.2 KiB
C#
34 lines
1.2 KiB
C#
using Telegram.Bot;
|
|
using Telegram.Bot.Types;
|
|
using Telegram.Bot.Types.Enums;
|
|
|
|
namespace Volcanic.AgenticCore.Telegram.Groups;
|
|
|
|
/// <summary>Whether a user is in a group: only members may put a trigger on it.</summary>
|
|
public interface IGroupMembership
|
|
{
|
|
Task<bool> IsMemberAsync(long groupId, long userId, CancellationToken cancellationToken);
|
|
}
|
|
|
|
/// <summary><c>getChatMember</c>; any failure (the bot was removed, the user is unknown) counts as not a member.</summary>
|
|
public sealed class TelegramGroupMembership(ITelegramBotClient bot) : IGroupMembership
|
|
{
|
|
public async Task<bool> IsMemberAsync(long groupId, long userId, CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
var member = await bot.GetChatMember(groupId, userId, cancellationToken).ConfigureAwait(false);
|
|
return member.Status switch
|
|
{
|
|
ChatMemberStatus.Creator or ChatMemberStatus.Administrator or ChatMemberStatus.Member => true,
|
|
ChatMemberStatus.Restricted => member is ChatMemberRestricted { IsMember: true },
|
|
_ => false,
|
|
};
|
|
}
|
|
catch (Exception ex) when (ex is not OperationCanceledException)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|