Esempio n. 1
0
        private async Task <MattermostResponse> HandleReopen(MattermostRequest req)
        {
            var cmdParams = req.text.Split(" ").ToList();
            int id        = 0;

            if (cmdParams.Count > 1)
            {
                if (!int.TryParse(cmdParams[1], out id))
                {
                    return(new MattermostResponse()
                    {
                        ResponseType = Common.Consts.ResponseType.Ephemeral,
                        Text = Langs.ReopenUsage
                    });
                }
            }

            var pollToReopen = id > 0
                ? await _dbContext.Polls.SingleOrDefaultAsync(p => p.OwnerId == req.user_id && p.Id == id && !p.IsActive)
                : await _dbContext.Polls.Where(p => p.OwnerId == req.user_id && !p.IsActive).OrderByDescending(p => p.CreatedAtUtc).FirstOrDefaultAsync();

            if (pollToReopen == null)
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.NoPollToReopen
                });
            }

            pollToReopen.IsActive = true;
            await _dbContext.SaveChangesAsync();

            return(new MattermostResponse()
            {
                ResponseType = Common.Consts.ResponseType.InChannel,
                Text = string.Format(
                    Langs.UserReopenedPoll,
                    req.user_name,
                    pollToReopen.Description,
                    pollToReopen.Id
                    )
            });
        }
Esempio n. 2
0
        private async Task <MattermostResponse> HandleNewOpenPoll(MattermostRequest req, List <string> cmdParams)
        {
            if (cmdParams.Count < 3)
            {
                return new MattermostResponse()
                       {
                           ResponseType = Common.Consts.ResponseType.Ephemeral,
                           Text         = Langs.NewOpenPollUsage
                       }
            }
            ;

            using (var transaction = _dbContext.Database.BeginTransaction())
            {
                var poll = new Poll()
                {
                    ChannelId    = req.channel_id,
                    CreatedAtUtc = DateTime.UtcNow,
                    IsActive     = true,
                    OwnerId      = req.user_id,
                    Type         = Consts.PollType.Open,
                    Description  = req.text.Substring(
                        req.text.IndexOf(cmdParams[1]) + cmdParams[1].Length + 1
                        )
                };

                _dbContext.Polls.Add(poll);
                await _dbContext.SaveChangesAsync();

                transaction.Commit();

                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.InChannel,
                    Text = string.Format(
                        Langs.OpenPollCreated,
                        req.user_name,
                        poll.Description,
                        poll.Id
                        )
                });
            }
        }
Esempio n. 3
0
        public async Task <MattermostResponse> GetRandomMember(MattermostRequest req)
        {
            //-get channel members with matermostSrv
            //-pick random guy and send an InChannel message

            var members = await _mattermostSrv.GetChannelMembers(req.channel_id);

            var randomMember        = members[new Random().Next(members.Count)];
            var randomMemberDetails = await _mattermostSrv.GetUser(randomMember.UserId);

            return(new MattermostResponse()
            {
                ResponseType = Common.Consts.ResponseType.InChannel,
                Text = string.Format(
                    Langs.RandomMemberSelected,
                    req.user_name,
                    randomMemberDetails.username
                    )
            });
        }
Esempio n. 4
0
        private async Task <MattermostResponse> JoinGroup(MattermostRequest req)
        {
            var joinParams = req.text.Split(" ").Select(x => x.Trim()).ToList();

            if (joinParams.Count < 2)
            {
                return(new MattermostResponse()
                {
                    ResponseType = ResponseType.Ephemeral,
                    Text = Langs.JoinGroupUsage
                });
            }

            var groupNameLower = joinParams[1].ToLower();
            var group          = _dbContext.Groups.FirstOrDefault(x => x.Name.ToLower() == groupNameLower);

            if (group == null)
            {
                group = new Apprefine.MattermostBots.SkypeBot.Entities.Group()
                {
                    ChannelId = req.channel_id,
                    Name      = groupNameLower
                };
                _dbContext.Groups.Add(group);
                await _dbContext.SaveChangesAsync();
            }

            _dbContext.UserGroups.Add(new Apprefine.MattermostBots.SkypeBot.Entities.UserGroup()
            {
                UserId  = req.user_id,
                GroupId = group.Id
            });
            await _dbContext.SaveChangesAsync();

            return(new MattermostResponse()
            {
                ResponseType = ResponseType.InChannel,
                Text = string.Format(Langs.UserJoinedGroup, req.user_name, groupNameLower)
            });
        }
Esempio n. 5
0
        private Task <MattermostResponse> HandleNewPoll(MattermostRequest req)
        {
            //TODO:
            //-extract poll type from text
            //open looks like this: "open DESCRIPTION" where DESCRIPTION is anything
            //closed looks like this: "closed ANSWERS DESCRIPTION" when answers is semicolon separated list of answers

            var cmdParams = req.text.Split(" ").Select(x => x.Trim()).ToList();

            if (cmdParams.Count < 2)
            {
                return(Task.FromResult(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.NewPollUsage
                }));
            }

            var type = cmdParams[1].ToLower();

            if (type.StartsWith("o"))
            {
                return(HandleNewOpenPoll(req, cmdParams));
            }
            else if (type.StartsWith("c"))
            {
                return(HandleNewClosedPoll(req, cmdParams));
            }
            else
            {
                return(Task.FromResult(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.NewPollUsage
                }));
            }
        }
Esempio n. 6
0
        public Task <MattermostResponse> GetRandomNumber(MattermostRequest req)
        {
            var numbersRegex = new Regex(@"(\d+).*?(\d+)");
            var match        = numbersRegex.Match(req.text);

            if (!match.Success)
            {
                return(Task.FromResult(
                           new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = string.Format(
                        Langs.RandomNumberUsage
                        )
                }
                           ));
            }

            var randomFrom = int.Parse(match.Groups[1].Value);
            var randomTo   = int.Parse(match.Groups[2].Value) + 1; //+1 because .NET random max is exclusive

            var random = new Random().Next(randomFrom, randomTo);

            return(Task.FromResult(
                       new MattermostResponse()
            {
                ResponseType = Common.Consts.ResponseType.InChannel,
                Text = string.Format(
                    Langs.RandomNumberSelected,
                    req.user_name,
                    randomFrom,
                    match.Groups[2].Value,
                    random
                    )
            }
                       ));
        }
Esempio n. 7
0
 public Task <MattermostResponse> HandleMessage([FromForm] MattermostRequest req)
 {
     return(_slashCommandSrv.Handle(req));
 }
Esempio n. 8
0
        private async Task <MattermostResponse> HandleAnswerId(MattermostRequest req)
        {
            var cmdParams = req.text.Split(" ").ToList();

            if (cmdParams.Count < 3)
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.AnswerIdUsage
                });
            }

            int pollId = 0;

            if (!int.TryParse(cmdParams[1], out pollId))
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.AnswerIdUsage
                });
            }

            var poll = await _dbContext.Polls.SingleOrDefaultAsync(x =>
                                                                   x.Id == pollId &&
                                                                   x.IsActive &&
                                                                   x.ChannelId == req.channel_id
                                                                   );

            if (poll == null)
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.ActivePollNotFound
                });
            }

            var answer = _dbContext.PollAnswers.SingleOrDefault(
                x => x.UserId == req.user_id &&
                x.PollId == poll.Id
                );

            if (answer == null)
            {
                answer = new PollAnswer()
                {
                    UserId   = req.user_id,
                    UserName = req.user_name,
                    PollId   = poll.Id
                };

                _dbContext.PollAnswers.Add(answer);
            }

            //everything except "id" - first param
            answer.Answer = req.text.Substring(
                req.text.IndexOf(cmdParams[1]) + cmdParams[1].Length + 1
                );

            await _dbContext.SaveChangesAsync();

            return(new MattermostResponse()
            {
                ResponseType = Common.Consts.ResponseType.Ephemeral,
                Text = string.Format(Langs.AnswerUpdated, poll.Id)
            });
        }
Esempio n. 9
0
        /// <summary>
        /// /poll results [ID]
        /// </summary>
        private async Task <MattermostResponse> HandlePollResults(MattermostRequest req)
        {
            //-send poll results as an ephemeral message

            var cmdParams = req.text.Split(" ").Select(x => x.Trim()).ToList();
            int pollId    = 0;

            if (cmdParams.Count > 1)
            {
                //get specific poll answers
                var pollIdParam = cmdParams[1];
                if (!int.TryParse(pollIdParam, out pollId))
                {
                    return(new MattermostResponse()
                    {
                        ResponseType = Common.Consts.ResponseType.Ephemeral,
                        Text = Langs.ResultsUsage
                    });
                }
            }
            else
            {
                //get latest poll answers
                var latestPoll = await _dbContext.Polls
                                 .Where(x => x.ChannelId == req.channel_id)
                                 .OrderByDescending(x => x.CreatedAtUtc)
                                 .FirstOrDefaultAsync();

                if (latestPoll == null)
                {
                    return new MattermostResponse()
                           {
                               ResponseType = Common.Consts.ResponseType.Ephemeral,
                               Text         = Langs.ResultsUsage
                           }
                }
                ;

                pollId = latestPoll.Id;
            }

            var answers = await(
                from poll in _dbContext.Polls
                where poll.ChannelId == req.channel_id && poll.Id == pollId
                from pollAnswer in _dbContext.PollAnswers.Where(x => x.PollId == poll.Id).DefaultIfEmpty()
                select pollAnswer
                ).ToListAsync();

            if (answers != null && answers.Any())
            {
                var table = new TableBuilder();
                foreach (var answer in answers)
                {
                    table
                    .AddColumn("User", answer.UserName)
                    .AddColumn("Answer", answer.Answer);
                }

                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = table.ToString()
                });
            }
            else
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.NoAnswersFound
                });
            }
        }
Esempio n. 10
0
        private async Task <MattermostResponse> HandlePollAnswer(MattermostRequest req)
        {
            var cmdParams = req.text.Split(" ").Select(x => x.Trim()).ToList();

            if (cmdParams.Count < 2)
            {
                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = Langs.AnswerUsage
                });
            }

            //-find an active poll on current channel
            //-add or update user answer

            using (var transaction = _dbContext.Database.BeginTransaction())
            {
                var poll = await _dbContext.Polls.Where(
                    x => x.ChannelId == req.channel_id && x.IsActive
                    )
                           .OrderByDescending(x => x.CreatedAtUtc)
                           .FirstOrDefaultAsync();

                if (poll == null)
                {
                    return new MattermostResponse()
                           {
                               ResponseType = Common.Consts.ResponseType.Ephemeral,
                               Text         = Langs.NoActivePolls
                           }
                }
                ;

                var answer = _dbContext.PollAnswers.SingleOrDefault(
                    x => x.UserId == req.user_id &&
                    x.PollId == poll.Id
                    );

                if (answer == null)
                {
                    answer = new PollAnswer()
                    {
                        UserId   = req.user_id,
                        UserName = req.user_name,
                        PollId   = poll.Id
                    };

                    _dbContext.PollAnswers.Add(answer);
                }

                //everything except "answer" - first param
                answer.Answer = req.text.Substring(
                    req.text.IndexOf(cmdParams[0]) + cmdParams[0].Length + 1
                    );

                await _dbContext.SaveChangesAsync();

                transaction.Commit();

                return(new MattermostResponse()
                {
                    ResponseType = Common.Consts.ResponseType.Ephemeral,
                    Text = string.Format(Langs.AnswerUpdated, poll.Id)
                });
            }
        }