コード例 #1
0
 private void ChangeState(TelegramSessionState state)
 {
     if (State != state)
     {
         _logger.LogInformation("Telegram State changed from {from} to {to}", State, state);
         State = state;
         _stateChanges.OnNext(state);
     }
 }
コード例 #2
0
        private async void client_UpdateReceived(object sender, TdApi.Update e)
        {
            switch (e)
            {
            case TdApi.Update.UpdateConnectionState connState:

                _logger.LogDebug("Telegram Connection State Update: {COnnectionState}", connState.State.GetType().Name);

                switch (connState.State)
                {
                case TdApi.ConnectionState.ConnectionStateUpdating s1:
                case TdApi.ConnectionState.ConnectionStateReady s2:
                case TdApi.ConnectionState.ConnectionStateConnecting s3:

                    ChangeState(AuthState);
                    break;

                default:

                    ChangeState(TelegramSessionState.Disconnected);
                    break;
                }

                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateWaitTdlibParameters:

                ChangeState(TelegramSessionState.Initializing);

                await _client.ExecuteAsync(new TdApi.SetTdlibParameters
                {
                    Parameters = new TdApi.TdlibParameters
                    {
                        ApiId              = _configuration.ApiId,
                        ApiHash            = _configuration.ApiHash,
                        ApplicationVersion = "1.3.0",
                        DeviceModel        = "PC",
                        SystemLanguageCode = "en",
                        SystemVersion      = RuntimeInformation.OSDescription,
                        DatabaseDirectory  = System.IO.Path.Combine(_configuration.Data, "db"),
                        FilesDirectory     = System.IO.Path.Combine(_configuration.Data, "files")
                    }
                });

                ChangeState(TelegramSessionState.Initialized);
                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateWaitEncryptionKey:
            {
                ChangeState(TelegramSessionState.SettingEncryptionKey);

                var key  = _configuration.EncryptionKey;
                var bkey = new byte[key.Length / 2];
                for (int i = 0; i < key.Length / 2; i++)
                {
                    bkey[i] = Convert.ToByte(key.Substring(i * 2, 2), 16);
                }

                await _client.ExecuteAsync(new TdApi.CheckDatabaseEncryptionKey()
                    {
                        EncryptionKey = bkey
                    });

                break;
            }

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateWaitPhoneNumber:

                ChangeState(AuthState = TelegramSessionState.PendingServiceAccount);
                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateWaitCode:

                ChangeState(AuthState = TelegramSessionState.PendingCode);
                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateWaitPassword:

                ChangeState(AuthState = TelegramSessionState.PendingPassword);
                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateReady:

                ChangeState(AuthState = TelegramSessionState.Connected);
                LoadContactsAndChats();
                break;

            case TdApi.Update.UpdateAuthorizationState authState
                when authState.AuthorizationState is TdApi.AuthorizationState.AuthorizationStateClosed:

                ResetSession();
                break;

            case TdApi.Update.UpdateAuthorizationState authState:

                _logger.LogInformation("Unexpected Telegram State {state}", authState.AuthorizationState.DataType);
                ChangeState(AuthState = TelegramSessionState.Unauthorized);
                break;

            case TdApi.Update.UpdateUser updateUser:

                var user = await GetTelegramContact(updateUser.User.Id);

                user.FirstName = updateUser.User.FirstName;
                user.LastName  = updateUser.User.LastName;
                user.Username  = updateUser.User.Username;
                break;

            case TdApi.Update.UpdateOption option
                when option.Value is TdApi.OptionValue.OptionValueString value:

                _logger.LogDebug("Option: {Name} = {Value}", option.Name, value.Value);
                break;

            case TdApi.Update.UpdateOption option
                when option.Value is TdApi.OptionValue.OptionValueBoolean value:

                _logger.LogDebug("Option: {Name} = {Value}", option.Name, value.Value);
                break;

            case TdApi.Update.UpdateOption option
                when option.Value is TdApi.OptionValue.OptionValueInteger value:

                _logger.LogDebug("Option: {Name} = {Value}", option.Name, value.Value);
                break;

            case TdApi.Update.UpdateOption option
                when option.Value is TdApi.OptionValue.OptionValueEmpty value:

                _logger.LogDebug("Option: {Name} is Empty", option.Name, null);
                break;

            case TdApi.Update.UpdateMessageSendSucceeded sentMessage:

                if (_pendingPins.Contains(sentMessage.OldMessageId))
                {
                    await _client.ExecuteAsync(new TdApi.PinChatMessage()
                    {
                        ChatId              = sentMessage.Message.ChatId,
                        MessageId           = sentMessage.Message.Id,
                        DisableNotification = true
                    });

                    _pendingPins.Remove(sentMessage.OldMessageId);
                }

                break;

            case TdApi.Update.UpdateNewMessage newMessage:
                if (!(newMessage.Message.IsOutgoing &&
                      newMessage.Message.SendingState is TdApi.MessageSendingState.MessageSendingStatePending))
                {
                    if (newMessage.Message.Content is TdApi.MessageContent.MessageChatChangeTitle newTitle)
                    {
                        var chatChanged = await GetChat(newMessage.Message.ChatId);

                        _logger.LogInformation("Chat title changed for {chatId} from {oldTitle} to {chatTitle}", chatChanged.ChatId, chatChanged.Title, newTitle.Title);
                        chatChanged.Title = newTitle.Title;
                    }
                    else
                    {
                        var msg = await CreateMessage(newMessage.Message);

                        if (msg != null)
                        {
                            _messageFeed.OnNext(msg);
                        }
                    }
                }
                else
                {
                    _logger.LogInformation("Unknown message type received {chatId} {chatTitle}", newMessage.Message.ChatId, newMessage.DataType);
                }

                break;

            case TdApi.Update.UpdateNewChat newChat:

                var chat = await GetChat(newChat.Chat.Id, newChat.Chat);

                _logger.LogInformation("Loading chat {chatId} {chatTitle}", chat.Id, chat.Title);

                break;

            case TdApi.Update.UpdateUserStatus userStatus:

                break;

            default:

                _logger.LogDebug("Unhandled Telegram Event {eventType}", e.DataType);
                break;
            }
        }
コード例 #3
0
 private void OnStateChanged(TelegramSessionState state)
 {
     _hub.Clients.All.OnStateUpdated(state);
 }