|
|
|
@@ -5,6 +5,7 @@ using Grpc.Core;
|
|
|
|
|
using TL;
|
|
|
|
|
using WTelegram;
|
|
|
|
|
using RpcException = TL.RpcException;
|
|
|
|
|
using Deal.Telegram.Telegram;
|
|
|
|
|
|
|
|
|
|
namespace Deal.Telegram.Telegram;
|
|
|
|
|
|
|
|
|
@@ -82,7 +83,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
public byte[]? SessionBytes => Volatile.Read(ref _latestSessionBytes);
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task ConnectAsync(CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.ConnectAsync(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (IsConnected)
|
|
|
|
|
{
|
|
|
|
@@ -94,7 +95,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task RequestCodeAsync(string phone, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.RequestCodeAsync(string phone, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
_phone = phone;
|
|
|
|
|
_phoneCodeHash = null;
|
|
|
|
@@ -118,7 +119,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<string?> SubmitCodeAsync(string code, CancellationToken cancellationToken)
|
|
|
|
|
async Task<string?> ISessionClient.SubmitCodeAsync(string code, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (_phoneAlreadyAuthorized)
|
|
|
|
|
{
|
|
|
|
@@ -158,7 +159,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task SubmitPasswordAsync(string password, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.SubmitPasswordAsync(string password, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@@ -178,7 +179,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.StartQrAsync(Action<string> onQrUrl, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
@@ -196,13 +197,13 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task LogOutAsync(CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.LogOutAsync(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
await _client.Auth_LogOut().WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<string> GetAccountAsync(CancellationToken cancellationToken)
|
|
|
|
|
async Task<string> ISessionClient.GetAccountAsync(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
UserBase[] users = await _client.Users_GetUsers(InputUser.Self).WaitAsync(cancellationToken).ConfigureAwait(false);
|
|
|
|
|
string username = users.OfType<User>().FirstOrDefault()?.username ?? string.Empty;
|
|
|
|
@@ -221,7 +222,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
public event Func<TelegramMessage, Task>? MessageReceived;
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<IReadOnlyList<TelegramDialog>> GetDialogsAsync(int limit, CancellationToken cancellationToken)
|
|
|
|
|
async Task<IReadOnlyList<TelegramDialog>> ISessionClient.GetDialogsAsync(int limit, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
Messages_DialogsBase result = await RunTlCallAsync(() => _client.Messages_GetDialogs(limit: limit), cancellationToken).ConfigureAwait(false);
|
|
|
|
|
(DialogBase[] dialogs, Dictionary<long, ChatBase> chats, Dictionary<long, User> users) = UnpackDialogs(result);
|
|
|
|
@@ -241,7 +242,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<IReadOnlyList<TelegramMessage>> GetMessagesAsync(
|
|
|
|
|
async Task<IReadOnlyList<TelegramMessage>> ISessionClient.GetMessagesAsync(
|
|
|
|
|
string dialogId,
|
|
|
|
|
int limit,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
@@ -265,7 +266,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<TelegramMessage?> GetMessageAsync(
|
|
|
|
|
async Task<TelegramMessage?> ISessionClient.GetMessageAsync(
|
|
|
|
|
string dialogId,
|
|
|
|
|
long msgId,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
@@ -295,7 +296,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task MarkReadAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.MarkReadAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
InputPeer peer = await ResolvePeerAsync(dialogId, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
await RunTlCallAsync(() => _client.ReadHistory(peer), cancellationToken).ConfigureAwait(false);
|
|
|
|
@@ -303,7 +304,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<IReadOnlyList<TelegramDialog>> SearchAsync(
|
|
|
|
|
async Task<IReadOnlyList<TelegramDialog>> ISessionClient.SearchAsync(
|
|
|
|
|
string query,
|
|
|
|
|
int limit,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
@@ -327,7 +328,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<TelegramSourceInfo> GetInfoAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
async Task<TelegramSourceInfo> ISessionClient.GetInfoAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
TelegramSourceInfo unknown = DefaultSourceInfo(dialogId);
|
|
|
|
|
if (!TryParseSignedId(dialogId, out bool isChannel, out bool isChat, out bool isUser, out long rawId))
|
|
|
|
@@ -361,7 +362,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task<DiscoveryReadResult> ReadForEvalAsync(
|
|
|
|
|
async Task<DiscoveryReadResult> ISessionClient.ReadForEvalAsync(
|
|
|
|
|
string dialogId,
|
|
|
|
|
int limit,
|
|
|
|
|
CancellationToken cancellationToken)
|
|
|
|
@@ -410,7 +411,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task JoinAsync(string username, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.JoinAsync(string username, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
Contacts_ResolvedPeer resolved = await RunTlCallAsync(() => _client.Contacts_ResolveUsername(username), cancellationToken).ConfigureAwait(false);
|
|
|
|
|
CacheEntities(resolved.chats.Values, resolved.users.Values);
|
|
|
|
@@ -425,7 +426,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <inheritdoc />
|
|
|
|
|
public async Task LeaveAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
async Task ISessionClient.LeaveAsync(string dialogId, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
if (!TryParseSignedId(dialogId, out bool isChannel, out _, out _, out long rawId) || !isChannel)
|
|
|
|
|
{
|
|
|
|
@@ -923,7 +924,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
|
|
|
|
|
// Канал/пользователь без access_hash (рестарт/новый источник): доливаем сущности
|
|
|
|
|
// первой страницей списка диалогов — каталог ядра строится из неё же (лимит 500, как refresh).
|
|
|
|
|
await GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
await ((ISessionClient)this).GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
return BuildPeer(isChannel, isChat, isUser, rawId)
|
|
|
|
|
?? throw new SessionException(StatusCode.InvalidArgument, SessionErrorMessages.UnknownDialog);
|
|
|
|
|
}
|
|
|
|
@@ -945,7 +946,7 @@ public sealed class WTelegramSessionClient : ISessionClient
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
await ((ISessionClient)this).GetDialogsAsync(DialogResolvePageSize, cancellationToken).ConfigureAwait(false);
|
|
|
|
|
lock (_entityCacheGate)
|
|
|
|
|
{
|
|
|
|
|
return _entityAccessHashes.TryGetValue(dialogId, out long accessHash)
|
|
|
|
|