Пример #1
0
        public static SendMessage Duel(MessageEventArgs e, ChatMemberViewModel userModel)
        {
            var sourceRouletteId = ChatterInfoRepository.Instance.GetRouletteId(e.Username, e.Channel);
            var sourceduelName = RouletteInfoRepository.Instance.Get(sourceRouletteId).DuelName;

            if (!string.IsNullOrEmpty(sourceduelName))
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.AlreadyInDuel, sourceduelName));

            var split = e.Message.Split(' ');

            if(split.Length < 2)
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.IncorrectSyntax, Command.Дуэль));

            var nameForDuel = split[1];

            if (nameForDuel.StartsWith(TwitchConstName.UserStartName.ToString()))
                nameForDuel = nameForDuel.TrimStart(TwitchConstName.UserStartName);

            var allChatters = userModel.Channel.GetAllChatters();

            if (!allChatters.Any(t => t.Name.Equals(nameForDuel, StringComparison.InvariantCultureIgnoreCase)))
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.NoInChat, nameForDuel));

            if(e.Username.Equals(nameForDuel, StringComparison.InvariantCultureIgnoreCase))
                return SendMessage.GetMessage(string.Format(DuelConfig.Texts.Roulette, Command.Рулетка));

            var targetRouletteId = ChatterInfoRepository.Instance.GetRouletteId(nameForDuel, e.Channel);
            var targetduelName = RouletteInfoRepository.Instance.Get(targetRouletteId).DuelName;

            if (!string.IsNullOrEmpty(targetduelName))
            {
                if(e.Username.Equals(targetduelName, StringComparison.InvariantCultureIgnoreCase))
                    return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.NeedConfirm, nameForDuel, Command.Принять));

                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.TargetAlreadyInDuel, nameForDuel, targetduelName));
            }

            RouletteInfoRepository.Instance.SetDuelName(sourceRouletteId, nameForDuel);
            var tokenSource = new CancellationTokenSource();
            RemoveDuelNameTokens.AddOrUpdate(e.Username.ToUpper(), tokenSource, (k, v) => tokenSource);

            Action sleep = () =>
            {
                Thread.Sleep(DuelConfig.Params.Wait * 1000);
            };

            Action continueWith = () =>
            {
                RouletteInfoRepository.Instance.RemoveDuelName(sourceRouletteId);
                var message = SendMessage.GetMessage(string.Format(DuelConfig.Texts.NoConfirm, nameForDuel));
                userModel.Channel.SendMessage(e, message);

            };

            var wait = TimerFactory.RunOnce(userModel.Channel, sleep);
            wait.ContinueWith(task => continueWith(), tokenSource.Token);

            return SendMessage.GetMessage(string.Format(DuelConfig.Texts.Start, nameForDuel, DuelConfig.Params.Wait, Command.Принять, e.Username, Command.Рулетка));
        }
Пример #2
0
        public WhisperWindowViewModel(TwitchIrcClient irc, string userName, MessageEventArgs e = null)
        {
            _irc = irc;
            _irc.OnWhisper += WhisperReceived;
            _userName = userName;

            SendCommand = new DelegateCommand(Send);

            if (e != null)
                WhisperReceived(e);
        }
Пример #3
0
        public static SendMessage RemoveSteam(MessageEventArgs e)
        {
            if (Params.Disable)
                return SendMessage.None;

            var message =  e.UserType.HasFlag(UserType.Broadcaster)
                ? RemoveSteamBroadcaster(e.Message, e.Channel)
                : RemoveSteamSimple(e.Username, e.Message, e.Channel);

            return SendMessage.GetWhisper(message);
        }
Пример #4
0
        public static SendMessage RouletteInfo(MessageEventArgs e)
        {
            if (e.UserType.HasFlag(UserType.Broadcaster) || e.UserType.HasFlag(UserType.Admin) ||
                e.UserType.HasFlag(UserType.Globalmoderator) || e.UserType.HasFlag(UserType.Staff))
                return SendMessage.GetMessage(Roulette.Texts.Admin);

            if (e.UserType.HasFlag(UserType.Moderator))
                return SendMessage.GetMessage(Roulette.Texts.Moder);

            var rouletteId = ChatterInfoRepository.Instance.GetRouletteId(e.Username, e.Channel);
            var roulette = RouletteInfoRepository.Instance.Get(rouletteId);

            var message = string.Format(Roulette.Texts.Stats, roulette.TryCount, roulette.DeathCount, roulette.MaxStreak, roulette.MaxPercent.ToString("0.####%"), roulette.Streak, roulette.Percent.ToString("0.####%"), roulette.DuelScore);
            return SendMessage.GetMessage(message);
        }
Пример #5
0
        public static SendMessage Start(MessageEventArgs e, ChatMemberViewModel userModel)
        {
            var config = e.Message.ToLower().Replace($"{TwitchConstName.Command}{Command.ОпросСтарт}".ToLower(), "").Trim();

            var split = config.Split(';');
            int seconds;

            if (!int.TryParse(split[0], out seconds) || split.Length < 3 || seconds < 5)
                return SendMessage.GetWhisper(string.Format(Vote.IncorrectSyntax, Command.ОпросСтарт));

            var question = split[1];
            var votes = split.Select(t => t.Trim()).ToList();
            votes.RemoveAt(0);
            votes.RemoveAt(0);

            userModel.Channel.VoteHolder.StartNewVote(question, votes, seconds);
            return SendMessage.None;
        }
Пример #6
0
        public static SendMessage UserVote(MessageEventArgs e, ChatMemberViewModel userModel)
        {
            var vote = userModel.Channel.VoteHolder;

            if (!vote.IsVoteActive)
                return SendMessage.None;

            if (vote.Voted.Contains(e.Username))
                return SendMessage.None;

            var userVote = e.Message.ToLower().Replace($"{TwitchConstName.Command}{Command.Голос}".ToLower(), "").Trim();

            if (vote.Votes.ContainsKey(userVote))
            {
                vote.Votes[userVote]++;
                vote.Voted.Add(e.Username);
            }

            return SendMessage.None;
        }
Пример #7
0
        public static SendMessage RouletteGetTop(MessageEventArgs e)
        {
            var top = RouletteInfoRepository.Instance.GetTop(Roulette.Params.Top, e.Channel);

            var builder = new StringBuilder();
            builder.Append(Roulette.Texts.TopStart);

            for (var i = 1; i <= top.Count; i++)
            {
                var info = top[i-1];
                var chatter = ChatterInfoRepository.Instance.GetByRouletteId(info.Id);

                if (chatter != null)
                {
                    var message = string.Format(Roulette.Texts.TopUser, i, chatter.Name, info.MaxPercent.ToString("0.####%"), info.MaxStreak);
                    builder.Append(message);
                }
            }

            return SendMessage.GetMessage(builder.ToString());
        }
Пример #8
0
        public static SendMessage RouletteTry(MessageEventArgs e)
        {
            if (e.UserType.HasFlag(UserType.Broadcaster) || e.UserType.HasFlag(UserType.Admin) ||
                e.UserType.HasFlag(UserType.Globalmoderator) || e.UserType.HasFlag(UserType.Staff))
                return SendMessage.GetMessage(Roulette.Texts.Admin);

            if (e.UserType.HasFlag(UserType.Moderator))
                return SendMessage.GetMessage(Roulette.Texts.Moder);

            var rouletteId = ChatterInfoRepository.Instance.GetRouletteId(e.Username, e.Channel);
            var currentTry = RouletteInfoRepository.Instance.Get(rouletteId).CurrentTry;

            var rnd = new Random();
            var firstNumber = rnd.Next(1, 7 - currentTry);
            var percent = 1 - 1 / (6.0 - currentTry);
            currentTry++;

            RouletteInfoRepository.Instance.AddTry(rouletteId);

            if (firstNumber == 1)
            {
                var secondNumber = rnd.Next(1, 21);

                if (secondNumber == 1)
                {
                    RouletteInfoRepository.Instance.ResetCurrentTry(rouletteId);
                    RouletteInfoRepository.Instance.AddPercent(rouletteId, 0.05);
                    return SendMessage.GetMessage(Roulette.Texts.Misfire);
                }

                RouletteInfoRepository.Instance.AddDeath(rouletteId);
                var message = SendMessage.GetMessage(string.Format(Roulette.Texts.Death, currentTry));
                return SendMessage.GetTimeout(e.Username, Roulette.Params.Timeout).AddMessage(message);
            }

            RouletteInfoRepository.Instance.AddPercent(rouletteId, percent);

            return SendMessage.GetMessage(string.Format(Roulette.Texts.Luck, currentTry));
        }
Пример #9
0
 static void OnMessage(MessageEventArgs e)
 {
     Console.WriteLine($"{e.Username} on channel {e.Channel}: {e.Message}");
 }
Пример #10
0
        //  Open a whisper once a whisper is received
        private void OnWhisper(MessageEventArgs e)
        {
            if (!WhisperOn)
                return;

            Application.Current.Dispatcher.Invoke(() =>
            {
                if (!Whispers.Any(x => x.UserName.Equals(e.Username)))
                    Whispers.Add(new WhisperWindowViewModel(_irc, e.Username, e));
            });
        }
Пример #11
0
        public bool IsHaveAccess(MessageEventArgs e)
        {
            if (IsDisabled)
                return false;

            return Access.HasFlag(UserType.Default) || (Access & e.UserType) != 0;
        }
Пример #12
0
        public static SendMessage DuelStart(MessageEventArgs e, ChatMemberViewModel userModel)
        {
            var sourceRouletteId = ChatterInfoRepository.Instance.GetRouletteId(e.Username, e.Channel);
            var sourceduelName = RouletteInfoRepository.Instance.Get(sourceRouletteId).DuelName;

            if (!string.IsNullOrEmpty(sourceduelName))
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.AlreadyInDuel, sourceduelName));

            var split = e.Message.Split(' ');

            if (split.Length < 2)
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.IncorrectSyntaxStart, Command.Принять));

            var nameForDuel = split[1];

            if (nameForDuel.StartsWith(TwitchConstName.UserStartName.ToString()))
                nameForDuel = nameForDuel.TrimStart(TwitchConstName.UserStartName);

            var allChatters = userModel.Channel.GetAllChatters();

            if (!allChatters.Any(t => t.Name.Equals(nameForDuel, StringComparison.InvariantCultureIgnoreCase)))
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.NoInChat, nameForDuel));

            if (e.Username.Equals(nameForDuel, StringComparison.InvariantCultureIgnoreCase))
                return SendMessage.GetMessage(string.Format(DuelConfig.Texts.Roulette, Command.Рулетка));

            var targetRouletteId = ChatterInfoRepository.Instance.GetRouletteId(nameForDuel, e.Channel);
            var targetduelName = RouletteInfoRepository.Instance.Get(targetRouletteId).DuelName;

            if (!string.IsNullOrEmpty(targetduelName) && !e.Username.Equals(targetduelName, StringComparison.InvariantCultureIgnoreCase))
                return SendMessage.GetWhisper(string.Format(DuelConfig.Texts.TargetAlreadyInDuel, nameForDuel, targetduelName));

            RouletteInfoRepository.Instance.SetDuelName(sourceRouletteId, nameForDuel);
            RouletteInfoRepository.Instance.Reset(sourceRouletteId);
            RouletteInfoRepository.Instance.Reset(targetRouletteId);

            if (RemoveDuelNameTokens.ContainsKey(nameForDuel.ToUpper()))
                RemoveDuelNameTokens[nameForDuel.ToUpper()].Cancel();

            Action action = () =>
            {
                WaitAndDefaultTimers();

                var moderators = userModel.Channel.GetGroup(ChatterType.Moderators);

                if (e.Username.Equals(e.Channel, StringComparison.InvariantCultureIgnoreCase) ||
                    nameForDuel.Equals(e.Channel, StringComparison.InvariantCultureIgnoreCase))
                {
                    var user = e.Username.Equals(e.Channel) ? nameForDuel : e.Username;

                    if (moderators.Any(t => t.Name.Equals(user, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        var mes = SendMessage.GetMessage(string.Format(DuelConfig.Texts.AdminVsModer, e.Channel, user));
                        userModel.Channel.SendMessage(null, mes);
                        return;
                    }

                    var timeout = SendMessage.GetTimeout(user, RouletteTimeout);
                    var message = SendMessage.GetMessage(string.Format(DuelConfig.Texts.AdminVsUser, e.Channel, user));
                    timeout.AddMessage(message);
                    userModel.Channel.SendMessage(null, timeout);
                    return;
                }

                if (moderators.Any(t => t.Name.Equals(e.Username, StringComparison.InvariantCultureIgnoreCase)) ||
                    moderators.Any(t => t.Name.Equals(nameForDuel, StringComparison.InvariantCultureIgnoreCase)))
                {
                    var user = moderators.Any(t => t.Name.Equals(e.Username, StringComparison.InvariantCultureIgnoreCase)) ? nameForDuel : e.Username;
                    var moder = user == nameForDuel ? e.Username : nameForDuel;

                    if (moderators.Any(t => t.Name.Equals(user, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        var mes = SendMessage.GetMessage(string.Format(DuelConfig.Texts.ModerVsModer, e.Username, nameForDuel));
                        userModel.Channel.SendMessage(null, mes);
                        return;
                    }

                    var timeout = SendMessage.GetTimeout(user, RouletteTimeout);
                    var message = SendMessage.GetMessage(string.Format(DuelConfig.Texts.ModerVsUser, moder, user));
                    timeout.AddMessage(message);
                    userModel.Channel.SendMessage(null, timeout);
                    return;
                }

                var context = RouletteInfoRepository.Instance;

                while (true)
                {
                    var first = Roulette(context, targetRouletteId, e.Username, nameForDuel);

                    if (first.Type == SendType.Timeout)
                    {
                        context.AddDuelScore(sourceRouletteId);

                        var win = SendMessage.GetMessage(string.Format(DuelConfig.Texts.Win, e.Username, nameForDuel));
                        first.NextMessage.AddMessage(win);
                        userModel.Channel.SendMessage(null, first);
                        return;
                    }

                    userModel.Channel.SendMessage(null, first);

                    WaitAndDefaultTimers();

                    var second = Roulette(context, sourceRouletteId, nameForDuel, e.Username);

                    if (second.Type == SendType.Timeout)
                    {
                        context.AddDuelScore(targetRouletteId);

                        var win = SendMessage.GetMessage(string.Format(DuelConfig.Texts.Win, nameForDuel, e.Username));
                        second.NextMessage.AddMessage(win);
                        userModel.Channel.SendMessage(null, second);
                        return;
                    }

                    userModel.Channel.SendMessage(null, second);

                    WaitAndDefaultTimers();
                }
            };

            Action continueWith = () =>
            {
                RouletteInfoRepository.Instance.RemoveDuelName(sourceRouletteId);
                RouletteInfoRepository.Instance.RemoveDuelName(targetRouletteId);
            };

            var wait = TimerFactory.RunOnce(userModel.Channel, action);
            wait.ContinueWith(task => continueWith());

            return SendMessage.GetMessage(string.Format(DuelConfig.Texts.Confirm, nameForDuel, e.Username));
        }