private async Task <string> GetCurrentSubscriptions(string teamId, AppMentionEvent appMentioned)
        {
            try
            {
                var team = await _teamRepo.GetTeam(teamId);

                var currentSubscriptions = team.Subscriptions;

                if (currentSubscriptions.Count() < 1)
                {
                    return("You are not subscribing to any fplbot updates :disappointed:");
                }

                var sb = new StringBuilder();

                sb.Append("This channel will receive notifications for: \n");

                sb.Append($"{Formatter.BulletPoints(team.Subscriptions)}");

                return(sb.ToString());
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message, e);
                return($"Oops, could not get subscriptions.");
            }
        }
Esempio n. 2
0
    public async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent)
    {
        string mentionTextStripped = Regex.Replace(slackEvent.Text, "<@(\\w+)>", "$1");
        await _session.Publish(new UnknownAppMentionReceived(eventMetadata.Team_Id, slackEvent.User, mentionTextStripped));

        return(new EventHandledResponse("OK"));
    }
    private async Task <string> GetAndUpdateSubscriptionInfo(string teamId, AppMentionEvent appMentioned)
    {
        try
        {
            var team = await _teamRepo.GetTeam(teamId);

            var currentSubscriptions = team.Subscriptions;
            (var inputSubscriptions, var unableToParse) = ParseSubscriptionsFromInput(appMentioned);

            if (inputSubscriptions.Count() < 1 && unableToParse.Count() < 1)
            {
                return($"You need to pass some arguments\n {FormatAllSubsAvailable()}");
            }

            if (inputSubscriptions.Count() < 1)
            {
                return($"I was not able to understand: *{string.Join(", ", unableToParse)}.* :confused: \n {FormatAllSubsAvailable()}");
            }

            var newSubscriptions = appMentioned.Text.Contains("unsubscribe") ?
                                   UnsubscribeToEvents(inputSubscriptions, currentSubscriptions) :
                                   SubscribeToEvents(inputSubscriptions, currentSubscriptions);

            await _teamRepo.UpdateSubscriptions(teamId, newSubscriptions);

            return(FormatSubscriptionMessage(newSubscriptions, unableToParse));
        }
        catch (Exception e)
        {
            _logger.LogError(e.Message, e);
            return($"Oops, could not update subscriptions.");
        }
    }
Esempio n. 4
0
        /// <summary>
        /// @smartbot tell @john bull hop stuff
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public async Task <EventHandledResponse> Handle(EventMetaData data, AppMentionEvent message)
        {
            var args      = message.Text.Split(' ');
            var recipient = message.Channel;
            var content   = "Psst";

            if (args.Length == 2)
            {
                content = "lol, du må gi meg et navn å sende til..`@smartbot tell @nash du er en tufs`";
            }

            if (args.Length == 3)
            {
                content = "lol, du må gi meg noe innhold å sende! `@smartbot tell @nash du er en tufs`";
            }

            if (args.Length > 3)
            {
                var parsedName = args[2];

                var users = await _slackClient.UsersList();

                var usr = users.Members.FirstOrDefault(u => $"<@{u.Id}>" == parsedName);

                var channels = await _slackClient.ConversationsListPublicChannels();

                var channel = channels.Channels.FirstOrDefault(c => string.Equals($"<#{c.Id}|{c.Name}>", parsedName, StringComparison.InvariantCultureIgnoreCase));

                content = string.Join(" ", args[3..args.Length]);
        public async Task <EventHandledResponse> Handle(EventMetaData data, AppMentionEvent message)
        {
            var index          = new Random().Next(_smartinger.Smartingene.Count);
            var randomSmarting = _smartinger.Smartingene[index];
            await _client.ChatPostMessage(message.Channel, randomSmarting.Name);

            return(new EventHandledResponse("OK"));
        }
Esempio n. 6
0
        private static SearchMetaData GetSearchMetaData(SlackTeam slackTeam, AppMentionEvent message)
        {
            var metaData = new SearchMetaData
            {
                Team   = slackTeam?.TeamId, FollowingFplLeagueId = slackTeam?.FplbotLeagueId.ToString(), Actor = message.User,
                Client = QueryClient.Slack
            };

            return(metaData);
        }
Esempio n. 7
0
        public async Task Handle(EventMetaData eventMetadata, AppMentionEvent @event)
        {
            var text = _handlers.Select(handler => handler.GetHelpDescription())
                       .Where(desc => !string.IsNullOrEmpty(desc.HandlerTrigger))
                       .Aggregate("*HALP:*", (current, tuple) => current + $"\n• `{tuple.HandlerTrigger}` : _{tuple.Description}_");

            var token = await _tokenStore.GetTokenByTeamId(eventMetadata.Team_Id);

            var slackClient = _slackClientService.Build(token);
            await slackClient.ChatPostMessage(@event.Channel, text);
        }
Esempio n. 8
0
        public IEventReaction Generate(
            EventWrapper eventWrapper)
        {
            if (eventWrapper.Event == null)
            {
                throw new InvalidOperationException(
                          "EventWrapper does not hold any callback event");
            }

            return(eventWrapper.Event switch
            {
                AppMentionEvent _ => _appMentionEventReactionFactory.Create(
                    eventWrapper),
                _ => _noopEventReactionFactory.Create(eventWrapper),
            });
Esempio n. 9
0
        public async Task <EventHandledResponse> Handle(EventMetaData data, AppMentionEvent message)
        {
            var unanswered = await _inviter.SendRemindersToUnanswered();

            if (unanswered.Any())
            {
                var uText = unanswered.Select(u => $"Reminded {u.SlackUsername} to RSVP {u.EventTopic}");
                var aggr  = $"{uText.Aggregate((x, y) => x + "\n" + y)}";
                await _client.ChatPostMessage(message.Channel, aggr);
            }
            else
            {
                await _client.ChatPostMessage(message.Channel, $"No unanswered invites or no existing invites for next storsdag");
            }

            return(new EventHandledResponse("OK"));
        }
        public Task Handle(EventMetaData eventMetadata, AppMentionEvent @event)
        {
            var publicHandlersToBeListedBack = _handlers.Where(handler => handler.GetHelpDescription().HandlerTrigger != string.Empty)

                                               .Aggregate("*Public trigger mentions*", (current, kvPair) => current + $"\n• `{kvPair.GetType()}. `{kvPair.GetHelpDescription().HandlerTrigger}` : _{kvPair.GetHelpDescription().Description}_");


            Console.WriteLine(publicHandlersToBeListedBack);


            var ssh = _handlers.Where(handler => handler.GetHelpDescription().HandlerTrigger == string.Empty)
                      .Aggregate("*Private trigger handlers*", (current, kvPair) => current + $"\n• `{kvPair.GetType()}`");

            Console.WriteLine(ssh);

            return(Task.CompletedTask);
        }
Esempio n. 11
0
    public async Task Handle(EventMetaData eventMetadata, AppMentionEvent @event)
    {
        var team = await _tokenStore.GetTeam(eventMetadata.Team_Id);

        var slackClient = _slackClientService.Build(team.AccessToken);
        var text        = $"*HELP:*\n";

        if (team.HasChannelAndLeagueSetup())
        {
            try
            {
                var league = await _leagueClient.GetClassicLeague(team.FplbotLeagueId.Value);

                text += $"Currently following {league.Properties.Name} in {ChannelName()}\n";
            }
            catch (HttpRequestException e) when(e.StatusCode == HttpStatusCode.NotFound)
            {
                text += $"Currently following {team.FplbotLeagueId} in {ChannelName()}\n";
            }

            string ChannelName()
            {
                return(team.FplBotSlackChannel.StartsWith("#") ? team.FplBotSlackChannel : $"<#{team.FplBotSlackChannel}>");
            }
        }
        else
        {
            text += "Currently not following any leagues\n";
        }

        if (team.Subscriptions.Any())
        {
            text += $"Active subscriptions:\n{Formatter.BulletPoints(team.Subscriptions)}\n";
        }

        await slackClient.ChatPostMessage(@event.Channel, text);

        var handlerHelp = _handlers.Select(handler => handler.GetHelpDescription())
                          .Where(desc => !string.IsNullOrEmpty(desc.HandlerTrigger))
                          .Aggregate($"\n*Available commands:*", (current, tuple) => current + $"\n• `@fplbot {tuple.HandlerTrigger}` : _{tuple.Description}_");



        await slackClient.ChatPostMessage(new ChatPostMessageRequest { Channel = @event.Channel, Text = handlerHelp, Link_Names = false });
    }
Esempio n. 12
0
        public async Task <EventHandledResponse> Handle(EventMetaData data, AppMentionEvent message)
        {
            var nextStorsdag = await _eventStorage.GetNextEvent(EventTypes.StorsdagEventType);

            var invitations = await _inviteStorage.GetInvitations(nextStorsdag.RowKey);

            var rapport = nextStorsdag.Topic;

            foreach (var inviteGroup in invitations.GroupBy(i => i.Rsvp))
            {
                string names = inviteGroup.Select(i => i.SlackUsername).Aggregate((x, y) => x + ", " + y);
                rapport += $"\n• `{inviteGroup.Key}` : {names}";
            }

            await _client.ChatPostMessage(message.Channel, rapport);

            return(new EventHandledResponse("OK"));
        }
Esempio n. 13
0
    public async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent)
    {
        var debugDetails = MetaService.DebugInfo();
        var debugInfo    = $"▪️ v{debugDetails.MajorMinorPatch}\n" +
                           $"▪️ {debugDetails.Informational}\n";
        var releaseNotes = await GitHubReleaseService.GetReleaseNotes(debugDetails.MajorMinorPatch);

        if (!string.IsNullOrEmpty(releaseNotes))
        {
            debugInfo += releaseNotes;
        }
        else if (debugDetails.Sha != "0")
        {
            debugInfo += $"️▪️ <https://github.com/fplbot/fplbot/tree/{debugDetails.Sha}|{debugDetails.Sha?.Substring(0, debugDetails.Sha.Length - 1)}>\n";
        }
        await _session.Send("FplBot.EventHandlers.Slack", new PublishToSlack(eventMetadata.Team_Id, slackEvent.Channel, debugInfo));

        return(new EventHandledResponse("OK"));
    }
Esempio n. 14
0
        public void Write_Returns_Expected_AppMentionEvent()
        {
            var @event = new AppMentionEvent
            {
                ChannelId         = "channel",
                Text              = "text",
                CallbackEventType = AppMentionEvent.CallbackEventTypeValue,
                UserId            = "user",
                MessageId         = new Timestamp
                {
                    Suffix = "006", Seconds = 123456,
                },
                EventTimestamp = new Timestamp
                {
                    Suffix = "006", Seconds = 123456,
                },
            };

            Serialize(@event)
            .ShouldMatchSnapshot();
        }
Esempio n. 15
0
        public void OnlyExpectedSupportedHandlersShouldHandleCommand(string input, Type expectedSupportedHandler)
        {
            // Arrange
            var mentionEvent = new AppMentionEvent {
                Text = input
            };

            // Act / assert
            foreach (var handler in _allHandlers)
            {
                var handlerShouldHandleCommand        = handler.ShouldHandle(mentionEvent);
                var handlerIsExpectedSupportedHandler = handler.GetType() == expectedSupportedHandler;
                if (handlerIsExpectedSupportedHandler)
                {
                    Assert.True(handlerShouldHandleCommand, $"{handler.GetType().Name} should've handled \"{input}\", but it didn't");
                }
                else
                {
                    Assert.False(handlerShouldHandleCommand, $"{handler.GetType().Name} shouldn't handle \"{input}\"");
                }
            }
        }
Esempio n. 16
0
        public async Task <EventHandledResponse> Handle(EventMetaData data, AppMentionEvent message)
        {
            var messageText = message.Text.Replace($"wolf ", "");

            var wolfram = new WolframAlpha(_options.Value.WulframAlphaAppId);
            var results = wolfram.Query(messageText);
            var text    = "";

            if (results != null)
            {
                foreach (var pod in results.Pods)
                {
                    if (pod.SubPods != null)
                    {
                        foreach (var subPod in pod.SubPods)
                        {
                            if (!string.IsNullOrEmpty(subPod.Title))
                            {
                                text += $"•{subPod.Title}\n";
                            }

                            text += $"{subPod.Plaintext} \n";
                            text += $"\n";
                        }
                    }
                }
            }

            if (string.IsNullOrEmpty(text))
            {
                text = "Wulf aner ikke 🐺";
            }

            await _client.ChatPostMessage(message.Channel, text);

            return(new EventHandledResponse("OK"));
        }
Esempio n. 17
0
 protected string ParseArguments(AppMentionEvent message) => MessageHelper.ExtractArgs(message.Text, Commands.Select(c => $"{c} {{args}}").ToArray());
Esempio n. 18
0
 public virtual bool ShouldHandle(AppMentionEvent slackEvent) => Commands.Any(c => slackEvent.Text.TextAfterFirstSpace().StartsWith(c, StringComparison.InvariantCultureIgnoreCase));
Esempio n. 19
0
 public abstract Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent);
Esempio n. 20
0
    public override async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent message)
    {
        var globalSettings = await _globalSettingsClient.GetGlobalSettings();

        var allPlayers = globalSettings.Players;
        var teams      = globalSettings.Teams;

        var priceChangedPlayers = allPlayers.Where(p => p.CostChangeEvent != 0 && p.IsRelevant())
                                  .Select(p =>
        {
            var t = teams.First(t => t.Code == p.TeamCode);
            return(new PlayerWithPriceChange(p.Id, p.WebName, p.CostChangeEvent, p.NowCost, p.OwnershipPercentage, t.Id, t.ShortName));
        });

        if (priceChangedPlayers.Any())
        {
            var messageToSend = Formatter.FormatPriceChanged(priceChangedPlayers);
            await _workSpacePublisher.PublishToWorkspace(eventMetadata.Team_Id, message.Channel, messageToSend);
        }
        else
        {
            await _workSpacePublisher.PublishToWorkspace(eventMetadata.Team_Id, message.Channel, "No relevant price changes yet");
        }

        return(new EventHandledResponse("Ok"));
    }
Esempio n. 21
0
 public bool ShouldHandle(AppMentionEvent message) => message.User == "johnkors" && message.Text.Contains("storsdagreminder");
Esempio n. 22
0
 public bool ShouldHandle(AppMentionEvent slackEvent) => slackEvent.Text.Contains("debug");
        public override async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent appMentioned)
        {
            var team = await _teamRepo.GetTeam(eventMetadata.Team_Id);

            var settings = await _globalSettingsClient.GetGlobalSettings();

            var gameweek = settings.Gameweeks.GetCurrentGameweek();
            await _mediator.Publish(new PublishStandingsCommand(team, gameweek));

            return(new EventHandledResponse("OK"));
        }
Esempio n. 24
0
 public bool ShouldHandle(AppMentionEvent slackEvent) => slackEvent.Text == "test";
Esempio n. 25
0
 public bool ShouldHandle(AppMentionEvent message) => Contains(message.Text, "wolf");
Esempio n. 26
0
        public async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent)
        {
            await _session.SendLocal(new PublishToSlack("T0A9QSU83", "#fplbot-notifications", $"Unhandled app_mention:\n * [{eventMetadata.Team_Id}-{slackEvent.User}] \"{slackEvent.Text}\""));

            return(new EventHandledResponse("OK"));
        }
Esempio n. 27
0
 public bool ShouldShortcut(AppMentionEvent @event) => @event.Text.Contains("help");
    public override async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent)
    {
        var team = await _tokenStore.GetTeam(eventMetadata.Team_Id);

        var slackClient = _slackClientService.Build(team.AccessToken);
        var usersTask   = slackClient.UsersList();
        var settings    = await _globalSettingsClient.GetGlobalSettings();

        var users     = await usersTask;
        var gameweeks = settings.Gameweeks;
        var teams     = settings.Teams;

        var nextGw   = gameweeks.First(gw => gw.IsNext);
        var fixtures = await _fixtureClient.GetFixturesByGameweek(nextGw.Id);

        var user         = users.Members.FirstOrDefault(x => x.Id == slackEvent.User);
        var userTzOffset = user?.Tz_Offset ?? 0;

        var textToSend = Formatter.FixturesForGameweek(nextGw.Id, nextGw.Name, nextGw.Deadline, fixtures, teams, userTzOffset);

        await _workspacePublisher.PublishToWorkspace(eventMetadata.Team_Id, slackEvent.Channel, textToSend);

        return(new EventHandledResponse(textToSend));
    }
Esempio n. 29
0
        public override async Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent message)
        {
            var term = ParseArguments(message);

            SlackTeam slackTeam = null;

            try
            {
                slackTeam = await _slackTeamRepo.GetTeam(eventMetadata.Team_Id);
            }
            catch (Exception e)
            {
                _logger.LogError(e, "Unable to get team {teamId} during search.", eventMetadata.Team_Id);
            }

            string countryToBoost = await GetCountryToBoost(slackTeam);

            var searchMetaData = GetSearchMetaData(slackTeam, message);

            var entriesTask = _searchService.SearchForEntry(term, 0, 10, searchMetaData);
            var leaguesTask = _searchService.SearchForLeague(term, 0, 10, searchMetaData, countryToBoost);

            var entries = await entriesTask;
            var leagues = await leaguesTask;

            var sb = new StringBuilder();

            sb.Append("Matching teams:\n");

            int?currentGameweek = null;

            if (entries.Any() || leagues.Any())
            {
                try
                {
                    var globalSettings = await _globalSettingsClient.GetGlobalSettings();

                    var gameweeks = globalSettings.Gameweeks;
                    currentGameweek = gameweeks.GetCurrentGameweek().Id;
                }
                catch (Exception e)
                {
                    _logger.LogError(e, "Unable to obtain current gameweek when creating search result links");
                }
            }

            if (entries.Any())
            {
                sb.Append(Formatter.BulletPoints(entries.ExposedHits.Select(e => Formatter.FormatEntryItem(e, currentGameweek))));
                if (entries.HitCountExceedingExposedOnes > 0)
                {
                    sb.Append($"\n...and {entries.HitCountExceedingExposedOnes} more");
                }
            }
            else
            {
                sb.Append("Found no matching teams :shrug:");
            }

            sb.Append("\n\nMatching leagues:\n");

            if (leagues.Any())
            {
                sb.Append(Formatter.BulletPoints(leagues.ExposedHits.Select(e => Formatter.FormatLeagueItem(e, currentGameweek))));
                if (leagues.HitCountExceedingExposedOnes > 0)
                {
                    sb.Append($"\n...and {leagues.HitCountExceedingExposedOnes} more");
                }
            }
            else
            {
                sb.Append("Found no matching leagues :shrug:");
            }

            await _workSpacePublisher.PublishToWorkspace(eventMetadata.Team_Id, message.Channel, sb.ToString());

            return(new EventHandledResponse(sb.ToString()));
        }
Esempio n. 30
0
 public Task <EventHandledResponse> Handle(EventMetaData eventMetadata, AppMentionEvent slackEvent)
 {
     Console.WriteLine("Doing stuff from AppmentionHandler: " + JsonConvert.SerializeObject(slackEvent));
     return(Task.FromResult(new EventHandledResponse("Wrote stuff to log")));
 }