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 ) }); }
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 ) }); } }
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 ) }); }
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) }); }
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 })); } }
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 ) } )); }
public Task <MattermostResponse> HandleMessage([FromForm] MattermostRequest req) { return(_slashCommandSrv.Handle(req)); }
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) }); }
/// <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 }); } }
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) }); } }