public async Task <Message> Post(FormDataCollection collection)
        {
            Input.SaveFormParams(collection, nameof(VotebanController));
            var parameters = collection.ReadAs <CommandParameters>();

            var voteban = await Voteban.Create(parameters);

            voteban.Save();

            var vote = new Vote(voteban, voteban.GetAuthor(), true);

            vote.Save();

            var message = FormatMessage(voteban);

            return(message);
        }
        internal static Message FormatMessage(Voteban voteban)
        {
            var votes = Repository.Get <Vote>().Where(v => v.Voteban.Id == voteban.Id).ToList();
            var ban   = votes.Count(v => v.NeedBan);
            var none  = votes.Count(v => !v.NeedBan);

            // Если голосуем поздно - то делаем пока-пока.
            if (voteban.IsTimeOut())
            {
                var message = new Message();
                var quest   = new Attachment();
                quest.Text     = "Time for vote out";
                quest.Callback = voteban.Callback;
                quest.Fallback = "Voteban fallback";
                message.Attachments.Add(quest);

                return(message);
            }

            // Пытаемся определить, голосуем или баним.
            if (ban < 3 || ban <= none)
            {
                var message = new Message();
                var quest   = new Attachment();
                quest.Text = string.Format("Vote to ban {0}. \r\n {1} already voted. \r\n Votes: {2} / {3}",
                                           voteban.User, string.Join(", ", votes.Select(v => v.User)), ban, none);
                quest.Callback = voteban.Callback;
                quest.Color    = "warning";
                quest.Fallback = "Voteban fallback";
                quest.Actions.Add(new Button()
                {
                    Text = "Ban", Name = Vote.Ban, Value = Vote.Ban, Style = "danger"
                });
                quest.Actions.Add(new Button()
                {
                    Text = "Not ban", Name = Vote.None, Value = Vote.None
                });
                message.Attachments.Add(quest);

                return(message);
            }
            else
            {
#warning Тут наверно лучше слать новое сообщение.

                voteban.Banned = true;
                voteban.Save();

                var message = new Message();
                var quest   = new Attachment();
                quest.Callback = voteban.Callback;
                quest.Color    = "danger";
                quest.Fallback = "Voteban fallback";
                message.Attachments.Add(quest);

                var client = WebApiConfig.Clients.Find(c => c.TeamId == voteban.TeamId);
                if (client != null)
                {
                    client.Kick(voteban.ChannelId, voteban.UserId);
                    quest.Text = string.Format("User {0} has been banned.", voteban.User);
                }
                else
                {
                    quest.Text = string.Format("User {0} has been banned. \r\n {0}, leave channel, pls =)", voteban.User);
                }
                return(message);
            }
        }
        public override bool CanHandleMessage(BotClient client, NewMessage message)
        {
            var bannedUsers = Voteban.GetBannedUsers(client.TeamId, message.channel).Select(u => u.Id);

            return(bannedUsers.Contains(message.user));
        }