Exemple #1
0
        public void RemoveCommand(WinterBot sender, TwitchUser user, string c, string a)
        {
            Args   args = a.ParseArguments(m_bot);
            string cmd  = args.GetOneWord();

            if (cmd == null)
            {
                sender.SendResponse(Importance.Med, m_removeCommandUsage);
                return;
            }

            if (cmd[0] == '!')
            {
                cmd = cmd.Substring(1);
            }

            lock (m_sync)
            {
                cmd = cmd.ToLower();
                if (m_commands.ContainsKey(cmd))
                {
                    m_commands.Remove(cmd);
                    m_remove.Add(cmd);
                    m_dirty = true;
                    sender.SendResponse(Importance.Low, string.Format("Removed command {0}.", cmd));
                    WinterBotSource.Log.RemoveCommand(user.Name, cmd);
                }
                else
                {
                    sender.SendResponse(Importance.Med, string.Format("Command {0} not found.", cmd));
                }
            }
        }
Exemple #2
0
        void bot_Tick(WinterBot sender, TimeSpan timeSinceLastUpdate)
        {
            if (m_enabled)
            {
                if (!sender.IsStreamLive)
                {
                    if (!m_streamDead)
                    {
                        m_streamDead  = true;
                        m_lastOffline = DateTime.Now;
                    }
                    else if (m_lastOffline.Elapsed().TotalMinutes >= 10)
                    {
                        m_enabled    = false;
                        m_streamDead = false;
                        sender.SendResponse(Importance.Med, "Disabling jukebox mode.");
                    }
                }
                else
                {
                    m_streamDead = false;
                }
            }

            if (m_enabled && m_lastMessage.Elapsed().TotalMinutes >= 7)
            {
                SendMessage(sender);
            }
        }
Exemple #3
0
        public BettingSystem(WinterBot bot, WinterOptions options)
        {
            m_options = options;
            m_bot     = bot;
            Enabled   = true;

            m_http = new HttpManager(options);
            m_http.GetAsync("points.php", LoadPoints);
        }
        public ViewerCountLogger(WinterBot bot, WinterOptions options)
            : base(bot)
        {
            m_bot     = bot;
            m_options = options;

            m_http = new HttpManager(options);
            bot.ViewerCountChanged += bot_ViewerCountChanged;
        }
Exemple #5
0
        public void Bet(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (!Enabled)
            {
                return;
            }

            if (!IsBettingOpen)
            {
                SendMessage(sender, "{0}: Betting is not currently open.", user.Name);
                return;
            }

            const int min = 1;
            const int max = 500;

            Args args = value.ToLower().ParseArguments(sender);

            string who;
            int    amount;

            if (args.GetInt(out amount))
            {
                who = args.GetOneWord();
            }
            else
            {
                args.Reset();
                who    = args.GetOneWord();
                amount = args.GetInt();
            }

            if (args.Error != null || string.IsNullOrWhiteSpace(who) || !m_betting.Contains(who))
            {
                return;
            }

            if (amount < min)
            {
                amount = min;
            }
            else if (amount > max)
            {
                amount = max;
            }

            m_bets[user] = new Tuple <string, int>(who, amount);
            if (m_thread == null)
            {
                m_thread = new Thread(SaveProc);
                m_thread.Start();

                m_bot.BeginShutdown += m_bot_BeginShutdown;
                m_bot.EndShutdown   += m_bot_EndShutdown;
            }
        }
Exemple #6
0
        private void SendMessage(WinterBot sender, string fmt, params object[] args)
        {
            if (m_lastMessage.Elapsed().Seconds < 20)
            {
                return;
            }

            sender.SendMessage(Importance.Low, string.Format(fmt, args));
            m_lastMessage = DateTime.Now;
        }
Exemple #7
0
        public static void Init(WinterBot bot)
        {
            WinterOptions options = new WinterOptions(bot.Options);

            bot.AddCommands(new JukeBox(bot, options));
            bot.AddCommands(new BettingSystem(bot, options));
            bot.AddCommands(new ViewerCountLogger(bot, options));
            new ChatSaver(bot, options);
            bot.AddCommands(new BetterCommands(bot, options));
        }
Exemple #8
0
        public void ListCommands(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (m_lastCommandList.Elapsed().TotalSeconds < 15)
            {
                WinterBotSource.Log.DenyCommand(user.Name, cmd, "time");
                return;
            }

            m_lastCommandList = DateTime.Now;
            sender.SendMessage("A full listing of user commands can be found here: " + m_http.GetUrl("commands.php"));
            m_sent.AddLast(new Tuple <string, DateTime>("commands", DateTime.Now));
        }
Exemple #9
0
        public void AddCommand(WinterBot sender, TwitchUser user, string c, string v)
        {
            Args args = v.ParseArguments(m_bot);

            AccessLevel level   = args.GetAccessFlag("ul", AccessLevel.Mod);
            string      cmdName = args.GetOneWord();
            string      cmdText = args.GetString();

            if (string.IsNullOrWhiteSpace(cmdName) || string.IsNullOrWhiteSpace(cmdText) || args.Error != null)
            {
                sender.SendResponse(Importance.Med, m_addCommandUsage);
                return;
            }

            if (cmdName[0] != '!')
            {
                sender.SendResponse(Importance.Med, string.Format("User commands must start with a '!'. {0}", m_addCommandUsage));
                return;
            }
            else
            {
                cmdName = cmdName.Substring(1);
            }

            if (cmdText[0] == '.' || cmdText[0] == '/')
            {
                sender.SendResponse(Importance.Med, string.Format("Cannot create a command which starts with a '{0}'.", cmdText[0]));
                return;
            }

            cmdName = cmdName.ToLower();
            Command userCommand = new Command(level, cmdText);

            bool exists;

            lock (m_sync)
            {
                exists = m_commands.ContainsKey(cmdName);
                m_commands[cmdName] = userCommand;
                m_dirty             = true;
            }

            if (exists)
            {
                sender.SendResponse(Importance.Med, string.Format("Updated command: !{0}.", cmdName));
                WinterBotSource.Log.AddCommand(user.Name, cmdName, cmdText);
            }
            else
            {
                sender.SendResponse(Importance.Med, string.Format("Successfully added command: !{0}.", cmdName));
                WinterBotSource.Log.UpdateCommand(user.Name, cmdName, cmdText);
            }
        }
Exemple #10
0
        public void BettingEnable(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            bool enable = false;

            if (!value.ParseBool(ref enable))
            {
                sender.SendMessage(Importance.Low, "Betting is currently: {0}", Enabled ? "enabled" : "disabled");
                return;
            }

            Enabled = enable;
            sender.SendMessage(Importance.Med, "Betting is now {0}.", Enabled ? "enabled" : "disabled");
        }
Exemple #11
0
        public ChatSaver(WinterBot bot, WinterOptions options)
            : base(bot)
        {
            m_options = options;
            m_bot     = bot;

            m_http = new HttpManager(options);
            bot.MessageReceived += bot_MessageReceived;
            bot.ActionReceived  += bot_ActionReceived;
            bot.UserSubscribed  += bot_UserSubscribed;
            bot.ChatClear       += bot_ChatClear;
            bot.UserBanned      += bot_UserBanned;
            bot.UserTimedOut    += bot_UserTimedOut;
        }
Exemple #12
0
        public BetterCommands(WinterBot bot, WinterOptions options)
            : base(bot)
        {
            if (bot.Options.ChatOptions.UserCommandsEnabled)
            {
                return;
            }

            m_bot     = bot;
            m_options = options;
            m_bot.UnknownCommandReceived += UnknownCommandReceived;

            m_http = new HttpManager(options);
            m_http.GetAsync("api.php", "GETCMDS=1", Load);
        }
Exemple #13
0
        public void CancelBet(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (!Enabled)
            {
                return;
            }

            if (IsBettingClosed)
            {
                return;
            }

            ClearBetting();
            CancelCallback();
        }
Exemple #14
0
        void m_bot_Tick(WinterBot sender, TimeSpan timeSinceLastUpdate)
        {
            if (!IsBettingOpen)
            {
                sender.SendMessage(Importance.High, "Betting is now CLOSED.");
                CancelCallback();
                return;
            }

            if (m_bettingStarted.Elapsed().TotalSeconds >= m_time)
            {
                sender.SendMessage(Importance.High, "Betting is now CLOSED.");
                CancelCallback();
                m_state = State.WaitingResult;
            }
        }
Exemple #15
0
        public void OpenBetting(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (!Enabled)
            {
                return;
            }

            if (IsBettingOpen || WaitingResult)
            {
                sender.SendResponse(Importance.Low, "Betting is currently ongoing.  Use !result to award points, use !cancelbet to cancel the current bet.");
                return;
            }

            HashSet <string> betting = new HashSet <string>();
            Args             args    = value.ToLower().ParseArguments(sender);

            int    time = args.GetIntFlag("time", 120, false);
            string val;

            while ((val = args.GetOneWord()) != null)
            {
                betting.Add(val);
            }

            if (betting.Count < 2)
            {
                sender.SendResponse(Importance.High, "Need at least two people to bet on!");
                return;
            }

            m_betting        = betting;
            m_bets           = new Dictionary <TwitchUser, Tuple <string, int> >();
            m_state          = State.Open;
            m_time           = time;
            m_bettingStarted = DateTime.Now;

            GetCallback();

            sender.SendResponse(Importance.High, "Betting is now OPEN.  Use '!bet [player] [amount]' to bet.  Minimum bet is 1, maximum bet is 500.  You start with 3000 points, you can bet even if you have no points.");
        }
Exemple #16
0
        void UnknownCommandReceived(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            cmd = cmd.ToLower();
            Command command;

            lock (m_sync)
                if (!m_commands.TryGetValue(cmd, out command))
                {
                    return;
                }

            if (!sender.CanUseCommand(user, command.AccessLevel))
            {
                WinterBotSource.Log.DenyCommand(user.Name, cmd, "access");
                return;
            }

            if (CanSendCommand(user, cmd))
            {
                sender.SendResponse(Importance.Low, command.Text);
                m_sent.AddLast(new Tuple <string, DateTime>(cmd, DateTime.Now));
            }
        }
Exemple #17
0
 private void SendMessage(WinterBot bot)
 {
     m_lastMessage = DateTime.Now;
     bot.SendResponse(Importance.Low, m_message);
 }
Exemple #18
0
        public void JukeBoxCommand(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (!m_enabled)
            {
                if (!sender.CanUseCommand(user, AccessLevel.Mod))
                {
                    if (m_lastMessage.Elapsed().TotalSeconds <= 30)
                    {
                        return;
                    }

                    m_lastMessage = DateTime.Now;
                    sender.SendResponse(Importance.Low, "The jukebox is CLOSED. No additional requests are being accepted.");
                    return;
                }

                value = value.Trim().ToLower();

                if (value == "on")
                {
                    m_enabled     = true;
                    m_lastMessage = DateTime.Now;
                    sender.SendResponse(Importance.Med, "Jukebox activated.  Use '!JukeboxMode off' to deactivate.");
                }
                else if (value == "off")
                {
                    sender.SendResponse(Importance.Med, "Jukebox mode is off.");
                }
                else
                {
                    sender.SendResponse(Importance.Low, "Usage: '!jukebox on' and '!jukebox off'.  Mod only.");
                }
            }
            else
            {
                if (sender.CanUseCommand(user, AccessLevel.Mod))
                {
                    if (value == "on")
                    {
                        sender.SendResponse(Importance.Low, "Jukebox mode is already enabled.");
                    }
                    else if (value == "off")
                    {
                        sender.SendResponse(Importance.High, "The jukebox is shutting down for the night. Please hold your song requests for next time.");
                        m_enabled = false;
                    }
                    else
                    {
                        SendMessage(sender);
                    }
                }
                else
                {
                    if (m_lastMessage.Elapsed().TotalSeconds <= 10)
                    {
                        return;
                    }

                    m_lastMessage = DateTime.Now;
                    SendMessage(sender);
                }
            }
        }
Exemple #19
0
 public void Initialize()
 {
     m_bot = new WinterBot(new Options(), "testdata", "username", "oauth:123");
 }
Exemple #20
0
        public void Result(WinterBot sender, TwitchUser user, string cmd, string value)
        {
            if (!Enabled)
            {
                return;
            }

            if (IsBettingClosed)
            {
                sender.SendMessage(Importance.Med, "Betting is not currently open.");
                return;
            }

            Args   args   = value.ParseArguments(sender);
            string result = args.GetOneWord();

            if (string.IsNullOrWhiteSpace(result))
            {
                sender.SendMessage(Importance.Med, "Usage: '!result [player]'.");
                return;
            }
            else if (!m_betting.Contains(result))
            {
                sender.SendMessage(Importance.High, "'{0}' not a valid player, valid players: {1}", result, string.Join(", ", m_betting));
                return;
            }

            var winners = from bet in m_bets
                          where bet.Value.Item1.Equals(result, StringComparison.CurrentCultureIgnoreCase)
                          select bet;

            var losers = from bet in m_bets
                         where !bet.Value.Item1.Equals(result, StringComparison.CurrentCultureIgnoreCase)
                         select bet;


            int totalWinners = 0, totalLosers = 0;

            foreach (var winner in winners)
            {
                AddPoints(winner.Key, winner.Value.Item2);
                totalWinners++;
            }

            foreach (var loser in losers)
            {
                AddPoints(loser.Key, -loser.Value.Item2);
                totalLosers++;
            }


            Tuple <TwitchUser, int>[] t = (from bet in m_bets
                                           select new Tuple <TwitchUser, int>(bet.Key, m_points[bet.Key])).ToArray();


            lock (m_sync)
                foreach (var usr in m_bets.Keys)
                {
                    m_queue.Add(new Tuple <TwitchUser, int>(usr, m_points[usr]));
                }

            m_event.Set();


            ClearBetting();
            CancelCallback();

            sender.SendMessage(Importance.High, "Betting complete.  {0} winners and {1} losers.  Point totals can be found here: http://www.darkautumn.net/winter/chat.php?POINTS", totalWinners, totalLosers);
        }
Exemple #21
0
 void m_bot_EndShutdown(WinterBot sender)
 {
     m_thread.Join();
 }
Exemple #22
0
 void bot_MessageReceived(WinterBot sender, TwitchUser user, string text)
 {
     lock (m_sync)
         m_messages.Add(new ChatMessage(DateTime.Now, user, Action.Chat, text));
 }
Exemple #23
0
 void m_bot_BeginShutdown(WinterBot sender)
 {
     m_shutdown = true;
     m_event.Set();
 }
Exemple #24
0
 void bot_UserSubscribed(WinterBot sender, TwitchUser user)
 {
     lock (m_sync)
         m_messages.Add(new ChatMessage(DateTime.Now, user, Action.Subbed));
 }
Exemple #25
0
 void bot_ChatClear(WinterBot sender, TwitchUser user)
 {
     lock (m_sync)
         m_messages.Add(new ChatMessage(DateTime.Now, user, Action.Clear));
 }
Exemple #26
0
 void bot_UserTimedOut(WinterBot sender, TwitchUser user, int duration)
 {
     lock (m_sync)
         m_messages.Add(new ChatMessage(DateTime.Now, user, Action.Timeout, string.Format("BOT TIMEOUT FOR {0} SECONDS", duration)));
 }
Exemple #27
0
 void bot_ViewerCountChanged(WinterBot sender, int currentViewerCount)
 {
     lock (m_sync)
         m_viewers.Add(new Tuple <DateTime, int>(DateTime.Now, currentViewerCount));
 }
Exemple #28
0
 public JukeBox(WinterBot bot, WinterOptions options)
 {
     m_options = options;
     bot.Tick += bot_Tick;
 }