Exemplo n.º 1
0
        public async Task StartAsync(CancellationToken stoppingToken)
        {
            if (TelegramAccessToken == null)
            {
                var TelegramAccessToken = Environment.GetEnvironmentVariable(AccessTokenEnvName);
                if (TelegramAccessToken == null)
                {
                    throw new InvalidOperationException($"Can't find environment variable {AccessTokenEnvName}");
                }
            }

            Bot = new TelegramBotClient(TelegramAccessToken);
            StartBotAsync();
            Started = true;

            await LogsManager.CreateLog($"Bot started", LogLevel.Info);
        }
Exemplo n.º 2
0
        public async Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
        {
            var ErrorMessage = exception switch
            {
                ApiRequestException apiRequestException => $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
                _ => exception.ToString()
            };

            //Log stats
            await StatsManager.AddStatAction(ActionType.Error);

            await LogsManager.CreateLog(ErrorMessage, LogLevel.Critical);
        }

        async Task BotOnMessageReceived(ITelegramBotClient botClient, Message message)
        {
            //TODO
            //Ignore old messages
            //if (message.Date.AddMinutes(1) < DateTime.Now)
            //    return;

            if (message.Text != null)
            {
                await MessageInvoker(message);
            }
        }

        async Task BotOnCallbackQueryReceived(ITelegramBotClient botClient, CallbackQuery callbackQuery)
        {
            //TODO
            //Ignore old messages
            //if (message.Date.AddMinutes(1) < DateTime.Now)
            //    return;

            await CallbackQueryInvoker(callbackQuery);
        }
Exemplo n.º 3
0
        private async Task CallbackQueryInvoker(CallbackQuery callbackQuery)
        {
            //Log stats
            await StatsManager.AddStatAction(ActionType.CallbackQuery);

            //Get message data
            var user = await UserManager.AddOrUpdateUser(callbackQuery.From);

            //Get all handlers
            var handlers = ReflectiveEnumerator.GetEnumerableOfType <BaseCallbackQueryHandler>();

            foreach (var handlerType in handlers)
            {
                //Find method in handler
                MethodInfo[] handlerMethods = handlerType.GetMethods();

                foreach (var method in handlerMethods)
                {
                    //Pattern matching for message text
                    if (BaseHandler.MatchMethod(method, callbackQuery.Data))
                    {
                        //Check user access by role
                        if (!BaseHandler.ValidateAccess(method, user))
                        {
                            return;
                        }

                        try
                        {
                            //Get and send chatAction from attributes
                            var chatAction = BaseHandler.GetChatActionAttributes(method);
                            if (chatAction.HasValue)
                            {
                                await Bot.SendChatActionAsync(callbackQuery.Message.Chat.Id, chatAction.Value);
                            }

                            //Cast handler object
                            var handler = Activator.CreateInstance(handlerType);

                            //Set params
                            ((BaseHandler)handler).Init(Bot, user, callbackQuery: callbackQuery);

                            //Invoke method
                            await(Task) method.Invoke(handler, parameters: new object[] { });
                        }
                        catch (Exception ex)
                        {
                            await LogsManager.CreateLog($"Invoker error *{ex.Message}*", LogLevel.Critical);

                            //Log stats
                            await StatsManager.AddStatAction(ActionType.Error);
                        }
                    }
                    else
                    {
                        //Cant find method
                        //await LogsManager.CreateLog($"Can't find method for *{messageEventArgs.Message.Text}*", LogLevel.Warning);
                        //Console.WriteLine($"Can't find method for *{messageEventArgs.Message.Text}*");
                    }
                }
            }
        }