コード例 #1
0
        public override void HandleMessage(INetPacketStream packet)
        {
            base.HandleMessage(packet);

            var size = packet.Read <int>();
            var id   = packet.Read <int>();
            var type = packet.Read <int>();

            if (type == 2 && id == -1)
            {
                IsAuthenticated = false;
                OnAuthenticationResult?.Invoke(this, false);
            }
            else if (type == 2 && id == 0)
            {
                IsAuthenticated = true;
                OnAuthenticationResult?.Invoke(this, true);
            }

            if (type == 0)
            {
                var len   = (int)(packet.Length - packet.Position - 1);
                var bData = packet.Read <byte>(len);
                var str   = Encoding.Default.GetString(bData);

                OnCommandResponse?.Invoke(this, str);
            }
        }
コード例 #2
0
        private void InitializeCommands()
        {
            CommandsList = _botDataManager.LoadCommands();

            if (CommandsList == null)
            {
                OnCommandResponse?.Invoke(this, new OnCommandResponseArgs(_botDataManager.BotDictionary.CommandsNotFound));
            }
            else if (CommandsList.Count <= 0)
            {
                OnCommandResponse?.Invoke(this, new OnCommandResponseArgs(_botDataManager.BotDictionary.ZeroCommands));
            }
        }
コード例 #3
0
        private void ParseCommandReturn(Message e)
        {
            string returnParam = e.MessageString.Remove(0, "COMMAND_RETURN ".Length);

            OnCommandResponse?.Invoke(returnParam);
        }
コード例 #4
0
        /// <summary>
        /// Method handling internal command distribution
        /// </summary>
        /// <param name="sender">User who sent the command</param>
        /// <param name="command">Command to execute</param>
        /// <param name="args">List of command arguments</param>
        /// <returns>String result</returns>
        private async Task <string> InternalHandler(User sender, Command command, List <string> args)
        {
            switch (command.CommandHandlerType)
            {
            case CommandHandlerType.LastFollower:
                // Last follower, !lastfollower |  0 input args
                try
                {
                    Follower last = await _followersManager.GetNewestFollower(_botDataManager.Login.ChannelId);

                    if (last == null)     // Fail: 0 params
                    {
                        throw new NullReferenceException("Last follower has not been found");
                    }

                    // Success: 2 params: {0:User} {1:Date}
                    return(String.Format(command.SuccessMessage, last.FollowerName, last.FollowedAt.ToShortDateString()));
                }
                catch (Exception ex)
                {
                    _logger.LogError("Critical error occurred during last follower command.\n{ex}", ex);

                    return(command.FailMessage);
                }

            case CommandHandlerType.Random:
                // Selects random user,  !random   !random {0}  | 0 or 1 input args {0: Active past X minutes}
                try
                {
                    User randomUser = null;
                    int  totalUsers = 0;
                    if (args.Count == 0)
                    {
                        // Regular random
                        randomUser = _usersManager.SelectRandomUser();
                        totalUsers = _usersManager.TotalUsersOnline;
                    }
                    else
                    {
                        // Active users random
                        if (args.Count <= 0)
                        {
                            throw new IndexOutOfRangeException("Command " + command.CommandFormat + "should contain some arguments. Found " + args.Count);
                        }

                        var minutes = int.Parse(args[0]);
                        randomUser = _usersManager.SelectActiveRandomUser(int.Parse(args[0]));
                        totalUsers = _usersManager.GetActiveUsers(minutes).Count;
                    }

                    if (randomUser == null)
                    {
                        throw new NullReferenceException("No available users to select a random from.");
                    }

                    // Success: 1 param: {0:User} {1:number of people to draw}
                    return(String.Format(command.SuccessMessage, randomUser.DisplayName, totalUsers));
                }
                catch (Exception ex)
                {
                    _logger.LogError("Critical error occurred during random command.\n{ex}", ex);
                    return(command.FailMessage);
                }

            case CommandHandlerType.Color:
                // !color on  !color off    | input args 1 {1: state}
                if (args.Count != 1)
                {
                    _logger.LogError("Error occurred while switching colors on/off. Arguments doesn't match!");
                    return(command.ErrorMessage);
                }

                if (args[0].ToLower().Equals("on"))
                {     // Turn on colors
                    if (_botDataManager.UseColoredMessages)
                    { // already on
                        command.ResetCommandCooldown();
                        return("");
                    }

                    _botDataManager.UseColoredMessages = true;
                    _logger.LogInformation("Bot colored messages were turned ON.");
                    return(command.SuccessMessage);
                }
                else if (args[0].ToLower().Equals("off"))
                {     // Turn off colors
                    if (!_botDataManager.UseColoredMessages)
                    { // already off
                        command.ResetCommandCooldown();
                        return("");
                    }

                    _botDataManager.UseColoredMessages = false;
                    _logger.LogInformation("Bot colored messages were turned OFF.");
                    return(command.FailMessage);    // FailMessage is here used for turning off
                }
                else
                {     // Error
                    _logger.LogError("Error occurred while switching colors on/off. Arguments doesn't match!");
                    return(String.Format(command.ErrorMessage));
                }

            case CommandHandlerType.ChangeColor:
                // !color <name>
                var match = Enum.GetNames(typeof(BotChatColors)).FirstOrDefault(color => color.ToLower().Equals(args[0].ToLower()));
                if (match == null)
                {
                    return("");
                }

                OnCommandResponse?.Invoke(this, new OnCommandResponseArgs($".color {match}", true));

                return(command.SuccessMessage);

            case CommandHandlerType.All:
                // !medbot   !medbot mod  !medbot streamer         |  0 or 1 input args {1: mod/streamer}
                if (args.Count == 0)
                {
                    // Commands for normal users

                    List <string> usersCommands = new List <string>();
                    foreach (Command com in CommandsList)
                    {
                        if (!com.ModeratorPermissionRequired && !com.BroadcasterOnly)
                        {
                            usersCommands.Add(com.ToReadableFormat());
                        }
                    }

                    return(String.Format(command.SuccessMessage, String.Join(", ", usersCommands)));
                }
                else if (args.Count == 1)
                {
                    // Commands for mods/streamers
                    List <string> usersCommands = new List <string>();

                    if (args[0].ToLower().Equals("mod") || args[0].ToLower().Equals("moderator"))
                    {
                        foreach (Command com in CommandsList)
                        {
                            if (com.ModeratorPermissionRequired && !com.BroadcasterOnly)
                            {
                                usersCommands.Add(com.ToReadableFormat());
                            }
                        }
                        return(String.Format(command.SuccessMessage, String.Join(", ", usersCommands)));
                    }
                    else if (args[0].ToLower().Equals("streamer") || args[0].ToLower().Equals("broadcaster") || args[0].ToLower().Equals("owner"))
                    {
                        foreach (Command com in CommandsList)
                        {
                            if (!com.ModeratorPermissionRequired && com.BroadcasterOnly)
                            {
                                usersCommands.Add(com.ToReadableFormat());
                            }
                        }
                        return(String.Format(command.SuccessMessage, usersCommands.Count != 0 ? String.Join(", ", usersCommands) : "---"));
                    }
                    else
                    {     // args doesn't match, return empty
                        command.ResetCommandCooldown();
                        return(command.FailMessage);
                    }
                }
                // there are more than 1 args, throw error
                _logger.LogError("Error occurred while listing all commands. Arguments doesn't match!");
                return(String.Format(command.ErrorMessage));

            case CommandHandlerType.Leaderboard:
                // !leaderboard & !leaderboard {1}     | input args 0 or 1  {1: currency name / xp / level}
                try
                {
                    if (args.Count > 1)
                    {
                        throw new IndexOutOfRangeException("Command " + command.CommandFormat + "shouldn't containg more than 1 argument. Found " + args.Count);
                    }

                    if (args.Count == 0)
                    {     // Form leaderboard with top 3 with points & XP
                        List <TempUser> fullPointsLeaderboard = _botDataManager.GetPointsLeaderboard();
                        List <TempUser> fullXPLeaderboard     = _botDataManager.GetExperienceLeaderboard();

                        if (fullPointsLeaderboard.Count <= 0 || fullXPLeaderboard.Count <= 0)
                        {
                            throw new PointsException("Leaderboard doesn't contain any records");
                        }

                        // Success 3 params - {0: currency plural} {1: list of top points users} {2: list of top XP users}
                        return(String.Format(command.SuccessMessage, _pointsManager.CurrencyNamePlural,
                                             String.Join(", ", FormLeaderboard(fullPointsLeaderboard)),
                                             String.Join(", ", FormLeaderboard(fullXPLeaderboard)),
                                             _botDataManager.BotSettings.LeaderboardTopNumber));
                    }
                    else
                    {     // Form specific leaderboard
                        if (args[0].ToLower().Equals(_pointsManager.CurrencyName.ToLower()) || args[0].ToLower().Equals("points"))
                        {
                            List <TempUser> fullLeaderboard = _botDataManager.GetPointsLeaderboard();
                            if (fullLeaderboard.Count <= 0)
                            {
                                throw new PointsException("Leaderboard doesn't contain any records");
                            }

                            // Success 2 params - {0: currency plural} {1: list of top users}
                            return(string.Format(command.SuccessMessage, _pointsManager.CurrencyNamePlural, string.Join(", ", FormLeaderboard(fullLeaderboard)), _botDataManager.BotSettings.LeaderboardTopNumber));
                        }
                        else if (args[0].ToLower().Equals("xp") || args[0].ToLower().Equals("exp") || args[0].ToLower().Equals("level"))
                        {
                            List <TempUser> fullLeaderboard = _botDataManager.GetExperienceLeaderboard();
                            if (fullLeaderboard.Count <= 0)
                            {
                                throw new PointsException("Leaderboard doesn't contain any records");
                            }

                            // Success 2 params - {0: xp} {1: list of top users}
                            return(String.Format(command.SuccessMessage, "xp", String.Join(", ", FormLeaderboard(fullLeaderboard)), _botDataManager.BotSettings.LeaderboardTopNumber));
                        }
                        else
                        {     // Arguments doens't match
                            command.ResetCommandCooldown();
                            // Fail: 1 param - {0: currency name} {1: currency plural} {2: currency units}
                            return(string.Format(command.FailMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits));
                        }
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError("Critical error occurred while forming leaderboard.\n{ex}", ex);

                    return(command.ErrorMessage);
                }

            case CommandHandlerType.FollowAge:
                // !followage    | input args 0
                try
                {
                    if (sender == null)
                    {
                        throw new NullReferenceException("Something went wrong, sender is null");
                    }

                    var followDate = await _followersManager.GetFollowDate(_botDataManager.Login.ChannelId, sender);

                    if (followDate == null)
                    {
                        return("");
                    }

                    TimeSpan age = DateTime.Now - followDate.Value;
                    //TimeSpan age = DateTime.Now - new DateTime(2017, 3, 1, 5, 30, 20, 1);

                    // Success 2 params - {0: user/sender} {1: number of days}
                    string ageFormatting = String.Empty;

                    int numberOfYears = 0;
                    if (age.TotalDays > 365)
                    {
                        numberOfYears  = (int)Math.Round(age.TotalDays / 365);
                        ageFormatting += numberOfYears + "Y ";
                    }

                    ageFormatting += Math.Round(age.TotalDays - (numberOfYears * 365)) + "D";

                    return(String.Format(command.SuccessMessage, sender.Username, ageFormatting));
                }
                catch (Exception ex)
                {
                    _logger.LogError("Critical error occurred while getting follower's age.\n{ex}", ex);

                    return(command.ErrorMessage);
                }

            case CommandHandlerType.Help:
                Command matchedCommand = CommandsList.FirstOrDefault(c => c.CommandFormat.Contains(args[0]));
                if (matchedCommand == null)
                {
                    return("");
                }

                // {0: Points name} {1: Points plural} {2: Points units}
                return(string.Format(matchedCommand.AboutMessage, _pointsManager.CurrencyName, _pointsManager.CurrencyNamePlural, _pointsManager.CurrencyUnits));
            }

            return("Unknown internal handler");
        }
コード例 #5
0
        private string ExperienceHandler(User sender, Command command, List <string> args)
        {
            switch (command.CommandHandlerType)
            {
            // !rank    | 0 input args
            case CommandHandlerType.Info:
                try
                {
                    if (sender == null)
                    {
                        throw new NullReferenceException("Something went wrong, sender is null");
                    }

                    // Success: 5 params: {0:User} {1:rank level} {2: rank name} {3: user's XP} {4: XP needed to next level}
                    var xpToNextRank = _experienceManager.NextUserRank(sender)?.ExpRequired.ToString() ?? "??";
                    return(string.Format(command.SuccessMessage,
                                         sender.DisplayName,
                                         sender.UserRank.RankLevel,
                                         sender.UserRank.RankName,
                                         sender.Experience,
                                         xpToNextRank));
                }
                catch (Exception ex)
                {
                    // Fail: 4 params: {0:User} {1:rank level} {2: rank name} {3: user's XP}
                    _logger.LogError("Critical error occurred during rank command.\n{ex}", ex);

                    if (sender == null)
                    {
                        return(String.Format(command.FailMessage, "N/A", "N/A", "N/A", "N/A"));
                    }

                    return(String.Format(command.FailMessage, sender.DisplayName, sender.UserRank.RankLevel, sender.UserRank.RankName, sender.Experience));
                }

            case CommandHandlerType.InfoSecond:
                // !nextrank   | 0 input args
                try
                {
                    if (sender == null)
                    {
                        throw new NullReferenceException("Something went wrong, sender is null");
                    }

                    Rank nextRank = _experienceManager.NextUserRank(sender);
                    if (nextRank == null)
                    {
                        throw new RanksException("User's next rank is null");
                    }

                    // Success: 5 params: {0:User} {1:next rank level} {2:next rank name} {3: XP needed to next level} {4: time to next rank}
                    return(String.Format(command.SuccessMessage, sender.DisplayName,
                                         nextRank.RankLevel,
                                         nextRank.RankName,
                                         _experienceManager.ToNextUserRank(sender),
                                         _experienceManager.TimeToNextUserRank(sender, _experienceManager.ActiveExperienceReward, _experienceManager.ExperienceTickInterval)));
                }
                catch (RanksException ex)
                {
                    // Fail: 4 params: {0:User} {1:next rank level} {2:next rank name} {3: user's XP}
                    _logger.LogError("Error occurred during rank information command.\n{ex}", ex);

                    if (sender == null)
                    {
                        return(String.Format(command.FailMessage, "N/A", "N/A", "N/A", "N/A"));
                    }

                    Rank nextRank = _experienceManager.NextUserRank(sender);
                    return(String.Format(command.FailMessage, sender.DisplayName,
                                         nextRank != null ? nextRank.RankLevel.ToString() : "N/A",
                                         nextRank != null ? nextRank.RankName : "N/A", sender.Experience));
                }
                catch (Exception ex)
                {
                    // Fail: 4 params: {0:User} {1:next rank level} {2:next rank name} {3: user's XP}
                    _logger.LogError("Critical error occurred during rank information command.\n{ex}", ex);

                    if (sender == null)
                    {
                        return(String.Format(command.FailMessage, "N/A", "N/A", "N/A", "N/A"));
                    }

                    Rank nextRank = _experienceManager.NextUserRank(sender);
                    return(String.Format(command.ErrorMessage, sender.DisplayName,
                                         nextRank != null ? nextRank.RankLevel.ToString() : "N/A",
                                         nextRank != null ? nextRank.RankName : "N/A", sender.Experience));
                }

            case CommandHandlerType.Add:
                // Add experience,  !addexp 500 Bukk94 |  2 input args {0:Number of points} {1:User to which add points}
                User receiver = null;
                try
                {
                    if (args.Count < 2)
                    {
                        throw new IndexOutOfRangeException($"Command {command.CommandFormat} should contain some arguments. Found {args.Count}.");
                    }

                    if (long.Parse(args[0]) <= 0)
                    {     // Can't add 0 or negative amount
                        command.ResetCommandCooldown();
                        return("");
                    }

                    receiver = _usersManager.FindOnlineUser(args[1]);
                    if (receiver == null)
                    {     // user is not online
                        _botDataManager.AddUserExperienceToFile(args[1], long.Parse(args[0]));
                    }
                    else
                    {
                        receiver.AddExperience(long.Parse(args[0]));
                        bool newRank = _experienceManager.CheckUserRankUp(receiver);
                        if (newRank && !string.IsNullOrEmpty(_botDataManager.BotDictionary.NewRankMessage))
                        {
                            OnCommandResponse?.Invoke(this, new OnCommandResponseArgs
                            {
                                Message = string.Format(_botDataManager.BotDictionary.NewRankMessage,
                                                        receiver.DisplayName,
                                                        receiver.UserRank.RankLevel,
                                                        receiver.UserRank.RankName)
                            });
                        }

                        _usersManager.SaveData();
                    }

                    _logger.LogInformation("Sucessfully added {total} experience points to {sender}.", args[0], args[1]);

                    // Success: 2 params: {0:User} {1:Number of points}
                    return(String.Format(command.SuccessMessage, args[1], args[0]));
                }
                catch (Exception ex)
                {
                    _logger.LogError("Critical error occurred during experienece addition command.\n{ex}", ex);

                    // Fail: 1 param: {:User to which add points}
                    return(String.Format(receiver != null ? receiver.DisplayName : args[1]));
                }
            }


            return("Unknown experience handler");
        }