예제 #1
0
        public async Task StoreAsync <T>(string key, T value)
        {
            key.NullInspect(nameof(key));

            var dbWorker = new GmailDbContextWorker();

            var json = JsonConvert.SerializeObject(value);

            int userId;

            if (!int.TryParse(key, out userId))
            {
                throw new ArgumentException("Wrong key, it must be an User Id number.", key);
            }

            var userModel = await dbWorker.FindUserAsync(userId);

            if (userModel == null)
            {
                throw new DbDataStoreException(
                          $"Can't store refreshed data in database. {nameof(UserModel)} record with id {userId} is absent in the database.");
            }

            JsonConvert.PopulateObject(json, userModel);
            await dbWorker.UpdateUserRecordAsync(userModel);

            LogMaker.Log(Logger, $"{nameof(UserModel)} record with userId={userId} updated with new access token.", false);
        }
예제 #2
0
        public async Task RestoreServicesFromRepositoryAsync()
        {
            var gmailDbContextWorker = new GmailDbContextWorker();
            var users = await gmailDbContextWorker.GetAllUsersAsync();

            if (users == null)
            {
                return;
            }
            await Task.Run(() =>
            {
                users.ForEach(userModel =>
                {
                    var userSettingsModel = gmailDbContextWorker.FindUserSettings(userModel.UserId);
                    try
                    {
                        Instance_AuthorizationRegistredEvent(userModel, userSettingsModel);
                    }
                    catch (Exception ex)
                    {
                        gmailDbContextWorker.RemoveUserRecord(userModel);
                        LogMaker.Log(Logger, ex);
                    }
                });
            });
        }
예제 #3
0
        public void InitializePushNotificationWatchTimer(int updatePeriod)
        {
            if (UpdatesHandler == null)
            {
                throw new InvalidOperationException($"{nameof(ServiceFactory)} property must be initialized first.");
            }
            if (UpdatesHandler == null)
            {
                throw new InvalidOperationException($"{nameof(MessageHandler)} property must be initialized first.");
            }

            if (_gmailDbContextWorker == null)
            {
                _gmailDbContextWorker = new GmailDbContextWorker();
            }
            //start timer which would be update push notification watch for users which expiration time approaches the end
            PushNotificationWatchTimer = new Timer(state =>
            {
                var userSettings = _gmailDbContextWorker.GetAllUsersSettings();
                userSettings.ForEach(us =>
                {
                    var difference = DateTime.UtcNow.Difference(us.Expiration);
                    if (difference.TotalHours >= 2)
                    {
                        return;
                    }
                    var service = ServiceFactory?.ServiceCollection.FirstOrDefault(s => s.From == us.UserId);
                    if (service == null)
                    {
                        return;
                    }
                    MessageHandler?.HandleStartWatchCommand(service);
                });
            }, null, updatePeriod, updatePeriod);
        }
예제 #4
0
        public async Task SendAuthorizeLink(ISender message, AuthorizeLinks links)
        {
            try
            {
                var gmailDbContextWorker = new GmailDbContextWorker();

                LogMaker.Log(Logger, $"Start authorizing user with UserId={message.From.Id}.", false);
                var userModel = await gmailDbContextWorker.FindUserAsync(message.From.Id) ??
                                await gmailDbContextWorker.AddNewUserAsync(message.From);

                LogMaker.Log(Logger, $"The user with id:{userModel.UserId} has requested authorization", false);

                var fullAccessState   = Base64.Encode($"{userModel.UserId},{UserAccess.FULL}");
                var notifyAccessState = Base64.Encode($"{userModel.UserId},{UserAccess.NOTIFY}");

                var pendingUserModel = await gmailDbContextWorker.FindPendingUserAsync(userModel.UserId);

                if (pendingUserModel != null)
                {
                    await gmailDbContextWorker.UpdateRecordJoinTimeAsync(pendingUserModel.Id, DateTime.UtcNow);
                }
                else
                {
                    await gmailDbContextWorker.QueueAsync(userModel.UserId);
                }

                Uri notifyAccessUri = null;
                Uri fullAccessUri   = null;
                switch (links)
                {
                case AuthorizeLinks.Both:
                    notifyAccessUri = GetAuthenticationUri(notifyAccessState, UserAccessAttribute.GetScopesValue(UserAccess.NOTIFY));
                    fullAccessUri   = GetAuthenticationUri(fullAccessState, UserAccessAttribute.GetScopesValue(UserAccess.FULL));
                    break;

                case AuthorizeLinks.Full:
                    fullAccessUri = GetAuthenticationUri(fullAccessState, UserAccessAttribute.GetScopesValue(UserAccess.FULL));
                    break;

                case AuthorizeLinks.Notify:
                    notifyAccessUri = GetAuthenticationUri(notifyAccessState, UserAccessAttribute.GetScopesValue(UserAccess.NOTIFY));
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(links), links, null);
                }

                await _botActions.AuthorizeMessage(message.From.Id.ToString(), notifyAccessUri, fullAccessUri);
            }
            catch (Exception ex)
            {
                throw new AuthorizeException("An error occurred while trying to send the authentication link to the user", ex);
            }
        }
예제 #5
0
 public ChosenInlineResultHandler()
 {
     try
     {
         _botActions = new BotActions(BotInitializer.Instance.BotSettings.Token);
         InitRules();
         _dbWorker = new GmailDbContextWorker();
         BotInitializer.Instance.UpdatesHandler.TelegramChosenInlineEvent += HandleChosenInlineResult;
     }
     catch (Exception ex)
     {
         throw new TypeInitializationException(nameof(ChosenInlineResultHandler), ex);
     }
 }
예제 #6
0
 public InlineQueryHandler()
 {
     try
     {
         _botSettings = BotInitializer.Instance.BotSettings;
         _botActions  = new BotActions(_botSettings.Token);
         _dbWorker    = new GmailDbContextWorker();
         InitFullAccessRules();
         InitNotifyAccessRules();
         BotInitializer.Instance.UpdatesHandler.TelegramInlineQueryEvent += HandleInlineQuery;
     }
     catch (Exception ex)
     {
         throw new TypeInitializationException(nameof(InlineQueryHandler), ex);
     }
 }
예제 #7
0
 public NotifyHandler()
 {
     try
     {
         _botSettings    = BotInitializer.Instance.BotSettings;
         _botActions     = new BotActions(_botSettings.Token);
         _messageHandler = BotInitializer.Instance.MessageHandler;
         _dbWorker       = new GmailDbContextWorker();
         var authorizer = BotInitializer.Instance.Authorizer;
         authorizer.AuthorizationRegistredEvent += Instance_AuthorizationRegistredEvent;
     }
     catch (Exception ex)
     {
         throw new TypeInitializationException(nameof(NotifyHandler), ex);
     }
 }
예제 #8
0
        public void RestoreServicesFromRepository()
        {
            var gmailDbContextWorker = new GmailDbContextWorker();
            var users = gmailDbContextWorker.GetAllUsers();

            users?.ForEach(userModel =>
            {
                var userSettingsModel = gmailDbContextWorker.FindUserSettings(userModel.UserId);
                try
                {
                    Instance_AuthorizationRegistredEvent(userModel, userSettingsModel);
                }
                catch (Exception ex)
                {
                    gmailDbContextWorker.RemoveUserRecord(userModel);
                    LogMaker.Log(Logger, ex);
                }
            });
        }
예제 #9
0
 public MessageHandler()
 {
     try
     {
         _authorizer  = BotInitializer.Instance.Authorizer;
         _dbWorker    = new GmailDbContextWorker();
         _botSettings = BotInitializer.Instance.BotSettings;
         _botActions  = new BotActions(_botSettings.Token);
         InitFullAccessRules();
         InitNotifyAccessRules();
         InitFullForceReplyRules();
         InitNotifyForceReplyRules();
         BotInitializer.Instance.UpdatesHandler.TelegramTextMessageEvent     += HandleTextMessage;
         BotInitializer.Instance.UpdatesHandler.TelegramTextMessageEvent     += HandleForceReplyMessage;
         BotInitializer.Instance.UpdatesHandler.TelegramDocumentMessageEvent += HandleForceReplyMessage;
         BotInitializer.Instance.UpdatesHandler.TelegramAudioMessageEvent    += HandleForceReplyMessage;
         BotInitializer.Instance.UpdatesHandler.TelegramVideoMessageEvent    += HandleForceReplyMessage;
     }
     catch (Exception ex)
     {
         throw new TypeInitializationException(nameof(MessageHandler), ex);
     }
 }
예제 #10
0
        public async Task DeleteAsync <T>(string key)
        {
            key.NullInspect(nameof(key));

            var dbWorker = new GmailDbContextWorker();
            int userId;

            if (!int.TryParse(key, out userId))
            {
                throw new ArgumentException("Wrong key, it must be an User Id number.", key);
            }

            var service = ServiceFactory.Instance?.ServiceCollection.Find(s => s.From == userId);

            if (service == null)
            {
                return;
            }

            var messageHandler = BotInitializer.Instance?.MessageHandler;

            if (messageHandler != null)
            {
                try
                {
                    await messageHandler.HandleStopWatchCommandAsync(service);

                    LogMaker.Log(Logger, $"Push notifications receiving has stopped for user with userId={userId}.", false);
                }
                catch (Exception ex)
                {
                    LogMaker.Log(Logger, ex, $"exception throwed in attempt to stop push notifications. userId={userId}.");
                }
            }

            var userModel = await dbWorker.FindUserAsync(userId);

            if (userModel == null)
            {
                LogMaker.Log(Logger,
                             $"Error while removing {nameof(UserModel)} record from database. {nameof(UserModel)} record with id {userId} is absent in the database.",
                             false);
            }
            else
            {
                await dbWorker.RemoveUserRecordAsync(userModel);

                LogMaker.Log(Logger, $"{nameof(UserModel)} record with userId={userId} deleted.", false);
            }

            var userSettingsModel = await dbWorker.FindUserSettingsAsync(userId);

            if (userSettingsModel == null)
            {
                LogMaker.Log(Logger,
                             $"Error while removing {nameof(UserSettingsModel)} record from database. {nameof(UserSettingsModel)} record with id {userId} is absent in the database.",
                             false);
            }
            else
            {
                await dbWorker.RemoveUserSettingsRecordAsync(userSettingsModel);

                LogMaker.Log(Logger, $"{nameof(UserSettingsModel)} record with userId={userId} deleted.", false);
            }

            var nmStoreModel = await dbWorker.FindNmStoreAsync(userId);

            if (nmStoreModel != null)
            {
                await dbWorker.RemoveNmStoreAsync(nmStoreModel);

                LogMaker.Log(Logger, $"{nameof(NmStoreModel)} record with userId={userId} deleted.", false);
            }
            var tempData = await dbWorker.FindTempDataAsync(userId);

            if (tempData != null)
            {
                await dbWorker.RemoveTempDataAsync(tempData);

                LogMaker.Log(Logger, $"{nameof(TempDataModel)} record with userId={userId} deleted.", false);
            }
            ServiceFactory.Instance?.ServiceCollection.Remove(service);
            LogMaker.Log(Logger, $"Removed service from {nameof(ServiceFactory.ServiceCollection)} with userId={userId}.", false);
        }
예제 #11
0
#pragma warning disable 4014
        private void Authorizer_AuthorizeRequestEvent(string code, string state, string error)
        {
            int    id;
            string access;

            if (!RestoreState(state, out id, out access))
            {
                return;
            }

            UserModel        userModel        = null;
            PendingUserModel pendingUserModel = null;
            var gmailDbContextWorker          = new GmailDbContextWorker();

            try
            {
                pendingUserModel = gmailDbContextWorker.FindPendingUser(id);
                if (!string.IsNullOrEmpty(error))
                {
                    _botActions.AuthorizationFailedMessage(id.ToString());
                    LogMaker.Log(Logger,
                                 error == "access_denied"
                            ? $"User with id:{id} user declined the authorization request."
                            : $"Authorization user with id:{id} has faulted with error={error}", false);
                    return;
                }
                if (pendingUserModel == null)
                {
                    _botActions.AuthorizationTimeExpiredMessage(id.ToString());
                    return;
                }
                if (DateTime.Now.Subtract(pendingUserModel.JoinTimeUtc).Minutes > MaxPendingMinutes)
                {
                    _botActions.AuthorizationTimeExpiredMessage(id.ToString());
                    LogMaker.Log(Logger,
                                 $"Authorization attempt from user with id:{id} when authorization time has expired.", false);
                    return;
                }
                if (string.IsNullOrEmpty(code))
                {
                    LogMaker.Log(Logger, $"Server returned empty authorization code for user with id:{id}.", false);
                    return;
                }
                userModel = gmailDbContextWorker.FindUser(id);
                if (userModel == null)
                {
                    return;
                }
                RevokeToken(userModel);
                userModel.RefreshToken = null;
                ExchangeCodeForToken(code, userModel);
                GetTokenInfo(userModel);

                var userSettings = gmailDbContextWorker.FindUserSettings(id) ??
                                   gmailDbContextWorker.AddNewUserSettings(id);
                userSettings.Access = access;
                gmailDbContextWorker.UpdateUserSettingsRecord(userSettings);

                AuthorizationRegistredEvent?.Invoke(userModel, userSettings);
                _botActions.AuthorizationSuccessfulMessage(id.ToString());
            }
            catch (Exception ex)
            {
                gmailDbContextWorker.RemoveUserRecord(userModel);
                _botActions.AuthorizationFailedMessage(id.ToString());
                throw new AuthorizeException("An error occurred while attempting to authorize the user.", ex);
            }
            finally
            {
                if (pendingUserModel != null)
                {
                    gmailDbContextWorker.RemoveFromQueue(pendingUserModel);
                }
                if (userModel != null)
                {
                    gmailDbContextWorker.UpdateUserRecord(userModel);
                }
            }
        }