private async void BotOnMessageReceivedAsync(object sender, MessageEventArgs messageEventArgs) { var message = messageEventArgs.Message; if (message == null) { return; } var username = message.Chat.Username; await asyncLock.AcquireLockAsync(username); var handlersToExecute = handlers .Select(handler => (handler.GetScore(message, botClient), handler)) .Where(pair => pair.Item1 > 0) .OrderByDescending(pair => pair.Item1) .Take(4) .ToArray(); if (handlersToExecute.Length == 0) { await botClient.SendTextMessageAsync( chatId : message.Chat.Id, text : "I can't understand you :(\nPlease, use /help.", replyMarkup : new ReplyKeyboardRemove() ); asyncLock.Release(username); return; } if (handlersToExecute.Length == 1) { await handlersToExecute.First().handler.ExecuteAsync(message, botClient); asyncLock.Release(username); return; } repository.CreateOrUpdate(username, message); await SendInlineKeyboard(message, handlersToExecute .Select(pair => pair.handler) .ToArray()); }