コード例 #1
0
        public Macros CalculateMacros(UserStat userStat)
        {
            _userStat = userStat;
            var weight             = GetWeight();
            var height             = GetHeight();
            var age                = GetAge();
            var genderAddition     = _userStat.Gender.Multiplier;
            var activityMultiplier = _userStat.ActivityFactor.Multiplier;
            var goalAddition       = _userStat.Goal.Multiplier;

            var REE = (weight * WEIGHTMULTIPLIER) + (height * HEIGHTMULTIPLIER) - (AGEMULTIPLIER * age) + genderAddition;

            var macros = (int)Math.Round((REE * activityMultiplier) / 10.0) * 10;

            macros = macros + goalAddition;
            var fatGrams     = (int)Math.Round(macros * 0.03, 0);
            var proteinGrams = (int)Math.Round(weight * 2 * 0.8, 0);
            var carbs        = macros - (fatGrams * 9 + proteinGrams * 4);
            var carbsGrams   = (int)Math.Round((double)carbs / 4.0, 0);

            macros = fatGrams * 9 + ((proteinGrams + carbsGrams) * 4);
            return(new Macros
            {
                FatGrams = fatGrams,
                CarbsGrams = carbsGrams,
                ProteinGrams = proteinGrams,
                Calories = macros
            });
        }
コード例 #2
0
        private void setUserVM(short id)
        {
            UserManage = new List <GroupManagementUserVM>();
            var         queues   = db.Queue.Include(p => p.User).Where(p => p.GroupID == id);
            List <User> Allusers = new List <User>();

            foreach (var item in queues)
            {
                Allusers.AddRange(item.User);
            }
            var users = Allusers.Distinct().OrderBy(u => u.Username);
            var e     = new RejectManagementVM(id);

            foreach (var item in users)
            {
                if (item.IsActive)
                {
                    UserStat i = new UserStat(item);
                    GroupManagementUserVM x = new GroupManagementUserVM
                    {
                        User              = item.Username,
                        ProcessedToday    = i.processedToday,
                        OutstandingErrors = e.ErrorList.Where(p => p.Processing.Username == item.Username).Count()
                    };

                    UserManage.Add(x);
                }
            }
        }
コード例 #3
0
        // GET: api/Statistics?userName=elad
        public UserStat Get(string userName)
        {
            UserStat ans;
            var      u = Server.Server.GameFacade.GetStat(userName);

            if (u == null)
            {
                ans = new UserStat
                {
                    Username        = "",
                    AvgCashGain     = -1,
                    AvgGrossProfit  = -1,
                    GrossProfit     = -1,
                    HighestCashGain = -1,
                    NumOfGames      = -1,
                    AvatarPath      = ""
                }
            }
            ;
            else
            {
                ans = new UserStat
                {
                    Username        = u.Username,
                    AvgCashGain     = u.AvgCashGain,
                    AvgGrossProfit  = u.AvgGrossProfit,
                    GrossProfit     = u.GrossProfit,
                    HighestCashGain = u.HighestCashGain,
                    NumOfGames      = u.NumOfGames,
                    AvatarPath      = u.AvatarPath
                }
            };

            return(ans);
        }
コード例 #4
0
ファイル: StatService.cs プロジェクト: SergeyMirvoda/web-2015
 public void AddStat(UserStat userStat)
 {
     using (var da = new SqlDataAdapter("SELECT * FROM dbo.UserStat", conn))
     {
         da.MissingSchemaAction = MissingSchemaAction.AddWithKey; // Для получения метаинформации из БД
         //Объект, который сгенерирует команды встави и обновления
         var b = new SqlCommandBuilder(da);
         //Объект для записи данных
         var data = new DataTable();
         //Заполняем объект данными
         da.Fill(data);
         //Возможны два сценария:
         //1. Строка уже есть в БД, тогда её нужно обновить
         //2. Строки нет в БД, тогда её нужно создать
         DataRow row = data.Rows.Find(userStat.UserId); //Поищем строку по первичному ключу
         if (row == null)                               // Строки нет, создадим её
         {
             row           = data.NewRow();
             row["UserID"] = userStat.UserId;//Нужно установить первичный ключ
             data.Rows.Add(row);
         }
         //Установим св-ва
         row["Money"] = (int)row["Money"] + userStat.Money;
         //Обновим БД
         da.Update(data);
     }
 }
コード例 #5
0
ファイル: User.cs プロジェクト: iNeutronn/PizzaBot
 public void Clear_card()
 {
     addons           = new List <string>();
     order            = new List <int>();
     orderCreatePizza = new List <string>();
     Status           = UserStat.WaitCommand;
 }
コード例 #6
0
        public async Task <UserStat> UpdateUserStat(User user, UserStat stat)
        {
            var statDB = _context.UsersStats
                         .FirstOrDefault(o => stat.UserStatsId == o.UserStatsId);

            if (statDB.UserId != user.UserId)
            {
                throw new AuthenticationException();
            }

            if (stat.Key != null)
            {
                statDB.Key = stat.Key;
            }
            if (stat.Value != null)
            {
                statDB.Value = stat.Value;
            }
            if (stat.StatsCategoryId != null)
            {
                statDB.StatsCategoryId = stat.StatsCategoryId;
            }

            _context.UsersStats.Update(statDB);
            await _context.SaveChangesAsync();

            return(_context.UsersStats.FirstOrDefault(o => o.UserStatsId == stat.UserStatsId));
        }
コード例 #7
0
        /// <summary>
        /// Gets user stats
        /// </summary>
        public UserStat GetUserStats(int userId, DateTime howFarBackToSearch)
        {
            if (userId <= 0)
            {
                throw new ArgumentOutOfRangeException("userId");
            }

            var userStat = new UserStat();

            userStat.RecipeCount = this.Repository.GetSet <Recipe>()
                                   .Where(x => x.CreatedBy == userId)
                                   .Where(x => x.IsActive == true)
                                   .Where(x => x.IsPublic == true)
                                   .Where(x => x.DateCreated > howFarBackToSearch)
                                   .Count();

            userStat.SessionCount = this.Repository.GetSet <BrewSession>()
                                    .Where(x => x.UserId == userId)
                                    .Where(x => x.IsActive == true)
                                    .Where(x => x.IsPublic == true)
                                    .Where(x => x.DateCreated > howFarBackToSearch)
                                    .Count();

            userStat.CommentCount = this.Repository.GetSet <RecipeComment>()
                                    .Where(x => x.UserId == userId)
                                    .Where(x => x.IsActive == true)
                                    .Where(x => x.DateCreated > howFarBackToSearch)
                                    .Count();

            return(userStat);
        }
コード例 #8
0
        //GET: /Manage/MWCStats
        public ActionResult MWCStats()
        {
            /*
             * The following code that is used to calculate a user's stats was originally from
             * Kyle Aardal's project. During Lab 2 I was having trouble calculating the user
             * stats and was unable to finish the user stats. So after reviewing his project I
             * adapted parts of his user stat calculator for my project. Credit goes to him.
             */

            List <int> MWCScores = new List <int>();
            UserStat   stats     = new UserStat();

            stats.PlayerName = User.Identity.Name;

            stats.Scores = db.Leaderboards.Where(s => s.PlayerName.Equals(stats.PlayerName))
                           .Where(s => s.GameName.Equals(ApplicationConstants.GAME_MWC)).ToList();

            foreach (Leaderboard score in stats.Scores)
            {
                MWCScores.Add(score.Score);
            }

            //if there are no scores return to index
            if (MWCScores.Count == 0)
            {
                return(View("Index"));
            }

            stats.MWCAverageScore = (int)MWCScores.Average();
            stats.MWCBestScore    = MWCScores.Max();
            stats.MWCTimesPlayed  = MWCScores.Count();
            stats.MWCWorstScore   = MWCScores.Min();

            return(View(stats));
        }
コード例 #9
0
ファイル: User.cs プロジェクト: Forsina/CoderaShopping
 public User()
 {
     _isAdmin     = false;
     _userStatus  = UserStat.Active;
     _orders      = new List <Order>();
     _memberSince = DateTime.Now;
 }
コード例 #10
0
            public async Task <Unit> Handle(Command request, CancellationToken cancellationToken)
            {
                var userStatsOld = await _context.UserStats.FirstOrDefaultAsync(x => x.AppUserId == _userAccessor.GetCurrentId());



                if (userStatsOld != null)
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { stats = "User stats already exists for this user" });
                }

                var goal = await _context.Goals.FindAsync(request.GoalId);

                var gender = await _context.Genders.FindAsync(request.GenderId);

                var activityFactor = await _context.ActivitiesFactor.FindAsync(request.ActivityFactorId);

                var unitSystem = await _context.UnitSystems.FindAsync(request.UnitSystemId);

                if (goal == null)
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { goal = "Goal Id is not valid" });
                }
                if (gender == null)
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { gener = "Gender Id is not valid" });
                }
                if (activityFactor == null)
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { activityFactor = "ActivityFactor Id is not valid" });
                }
                if (unitSystem == null)
                {
                    throw new RestException(HttpStatusCode.BadRequest, new { hightUnit = "UnitSystem Id is not valid" });
                }


                var userStats = new UserStat
                {
                    Goal           = goal,
                    Gender         = gender,
                    ActivityFactor = activityFactor,
                    UnitSystem     = unitSystem,
                    Height         = request.Height,
                    Weight         = request.Weight,
                    DateOfBirth    = request.DateOfBirth,
                    AppUserId      = _userAccessor.GetCurrentId(),
                };

                _context.UserStats.Add(userStats);
                var success = await _context.SaveChangesAsync() > 0;


                if (success)
                {
                    return(Unit.Value);
                }

                throw new Exception("Problem saving changes");
            }
コード例 #11
0
ファイル: User.cs プロジェクト: iNeutronn/PizzaBot
 public User()
 {
     addons           = new List <string>();
     order            = new List <int>();
     orderCreatePizza = new List <string>();
     Status           = UserStat.WaitCommand;
     start            = new DateTime();
 }
コード例 #12
0
    // STATIC INTERNALS

    private static UserStat CreateUserStat(UserStatDescriptor i_Descriptor)
    {
        UserStat userStat = null;

        string id = i_Descriptor.id;

        if (id != "")
        {
            switch (i_Descriptor.type)
            {
            case UserStatType.Bool:

                bool defaultBoolValue = i_Descriptor.defaultBoolValue;
                BooleanCombineFunction booleanCombineFunction = i_Descriptor.booleanCombineFunction;

                userStat = new UserStatBool(id, defaultBoolValue, booleanCombineFunction);

                break;

            case UserStatType.Float:

                float defaultFloatValue   = i_Descriptor.defaultFloatValue;
                bool  usingFloatLowLimit  = i_Descriptor.usingLowLimit;
                bool  usingFloatHighLimit = i_Descriptor.usingHighLimit;
                float minFloatValue       = i_Descriptor.minFloatValue;
                float maxFloatValue       = i_Descriptor.maxFloatValue;
                NumericCombineFunction floatCombineFunction = i_Descriptor.numericCombineFunction;

                userStat = new UserStatFloat(id, defaultFloatValue, usingFloatLowLimit, usingFloatHighLimit, minFloatValue, maxFloatValue, floatCombineFunction);

                break;

            case UserStatType.Int:

                int  defaultIntValue   = i_Descriptor.defaultIntValue;
                bool usingIntLowLimit  = i_Descriptor.usingLowLimit;
                bool usingIntHighLimit = i_Descriptor.usingHighLimit;
                int  minIntValue       = i_Descriptor.minIntValue;
                int  maxIntValue       = i_Descriptor.maxIntValue;
                NumericCombineFunction intCombineFunction = i_Descriptor.numericCombineFunction;

                userStat = new UserStatInt(id, defaultIntValue, usingIntLowLimit, usingIntHighLimit, minIntValue, maxIntValue, intCombineFunction);

                break;

            case UserStatType.String:

                string defaultStringValue = i_Descriptor.defaultStringValue;
                StringCombineFunction stringCombineFunction = i_Descriptor.stringCombineFunction;

                userStat = new UserStatString(id, defaultStringValue, stringCombineFunction);

                break;
            }
        }

        return(userStat);
    }
コード例 #13
0
 public static void RainedOn(UserStat userStats, decimal amount)
 {
     userStats.RainedOn      += 1;
     userStats.RainedOnTotal += amount;
     if (userStats.TopRainedOn < amount)
     {
         userStats.TopRainedOn = amount;
     }
 }
コード例 #14
0
        public void Insert(UserStat statistic)
        {
            if (statistic == null)
            {
                throw new ArgumentNullException("statistic");
            }

            this._statisticRepository.Insert(statistic);
        }
コード例 #15
0
 public static void Tip(UserStat userStats, decimal amount)
 {
     userStats.AmountOfTipsSent        += 1;
     userStats.TotalSentBitcornViaTips += amount;
     if (userStats.LargestSentBitcornTip < amount)
     {
         userStats.LargestSentBitcornTip = amount;
     }
 }
コード例 #16
0
 public static void RainedOn(UserStat userStats, decimal amount)
 {
     userStats.AmountOfRainsReceived     += 1;
     userStats.TotalReceivedBitcornRains += amount;
     if (userStats.LargestReceivedBitcornRain < amount)
     {
         userStats.LargestReceivedBitcornRain = amount;
     }
 }
コード例 #17
0
 public static void Rain(UserStat userStats, decimal amount)
 {
     userStats.AmountOfRainsSent        += 1;
     userStats.TotalSentBitcornViaRains += amount;
     if (userStats.LargestSentBitcornRain < amount)
     {
         userStats.LargestSentBitcornRain = amount;
     }
 }
コード例 #18
0
 public static void Tip(UserStat userStats, decimal amount)
 {
     userStats.Tip      += 1;
     userStats.TipTotal += amount;
     if (userStats.TopTip < amount)
     {
         userStats.TopTip = amount;
     }
 }
コード例 #19
0
        //----------
        //User Stats
        //----------
        public async Task <UserStat> AddUserStat(User user, UserStat stat)
        {
            stat.UserId = user.UserId;

            _context.UsersStats.Add(stat);
            await _context.SaveChangesAsync();

            return(_context.UsersStats.FirstOrDefault(o => o.UserStatsId == stat.UserStatsId));
        }
コード例 #20
0
        public static void Tipped(UserStat userStats, decimal amount)
        {
            userStats.AmountOfTipsReceived     += 1;
            userStats.TotalReceivedBitcornTips += amount;

            if (userStats.LargestReceivedBitcornTip < amount)
            {
                userStats.LargestReceivedBitcornTip = amount;
            }
        }
コード例 #21
0
        public static void Tipped(UserStat userStats, decimal amount)
        {
            userStats.Tipped      += 1;
            userStats.TippedTotal += amount;

            if (userStats.TopTipped < amount)
            {
                userStats.TopTipped = amount;
            }
        }
コード例 #22
0
        public static async Task BonusPayout(BitcornContext dbContext, UserReferral userReferral, Referrer referrer, User user, User referrerUser,
                                             UserStat referrerStat)
        {
            if (userReferral != null &&
                userReferral.SignupReward != null &&
                userReferral.MinimumBalanceDate != null &&
                userReferral.WalletDownloadDate != null &&
                userReferral.SyncDate != null &&
                userReferral.Bonus == null &&
                userReferral.ReferrerBonus == null &&
                userReferral.UserSubscriptionId == null &&
                referrer != null &&
                !user.IsBanned &&
                !referrerUser.IsBanned)
            {
                var subQuery = SubscriptionUtils.GetActiveSubscription(dbContext, user, "BITCORNFarms", 1);
                if (subQuery == null)
                {
                    return;
                }

                var userSubInfo = await subQuery.FirstOrDefaultAsync();

                if (userSubInfo == null)
                {
                    return;
                }

                userReferral.UserSubscriptionId = userSubInfo.UserSubcriptionTierInfo.UserSubscription.UserSubscriptionId;

                var amount      = BONUS_PAYOUT;
                var bonusReward = await TxUtils.SendFromBitcornhub(user, amount, "BITCORNFarms", "Referral bonus reward", dbContext);

                if (IsValidReferrer(referrer))
                {
                    if (bonusReward)
                    {
                        userReferral.Bonus = DateTime.Now;
                        await LogReferralTx(dbContext, user.UserId, amount, "Recruit bonus reward");

                        var referrerBonusReward = await TxUtils.SendFromBitcornhub(referrerUser, amount, "BITCORNFarms", "Referral bonus reward", dbContext);

                        if (referrerBonusReward)
                        {
                            await UpdateYtdTotal(dbContext, referrer, amount);
                            await LogReferralTx(dbContext, referrerUser.UserId, amount, "Referral bonus reward");

                            referrerStat.TotalReferralRewardsCorn += amount;
                            referrerStat.TotalReferralRewardsUsdt += (amount * await ProbitApi.GetCornPriceAsync(dbContext));
                            userReferral.ReferrerBonus             = DateTime.Now;
                        }
                    }
                }
            }
        }
    // CALLBACKS

    private void OnUserStatsReceived(UserStatsReceived_t i_CallbackParams)
    {
        if (m_UserStatsManager == null || m_RemoteStatsMapper == null)
        {
            return;
        }

        if (i_CallbackParams.m_nGameID == ((ulong)m_GameId))
        {
            EResult callbackResult = i_CallbackParams.m_eResult;
            if (callbackResult == EResult.k_EResultOK)
            {
                for (int userStatIndex = 0; userStatIndex < m_UserStatsManager.statsCount; ++userStatIndex)
                {
                    UserStat userStat = m_UserStatsManager.GetStatByIndex(userStatIndex);
                    if (userStat != null)
                    {
                        UserStatType userStatType = userStat.type;
                        switch (userStatType)
                        {
                        case UserStatType.Int:

                            UserStatInt userStatInt = (UserStatInt)userStat;
                            CombineIntUserStat(userStatInt);

                            break;

                        case UserStatType.Bool:

                            UserStatBool userStatBool = (UserStatBool)userStat;
                            CombineBoolUserStat(userStatBool);

                            break;

                        case UserStatType.Float:

                            UserStatFloat userStatFloat = (UserStatFloat)userStat;
                            CombineFloatUserStat(userStatFloat);

                            break;

                        case UserStatType.String:

                            UserStatString userStatString = (UserStatString)userStat;
                            CombineStringUserStat(userStatString);

                            break;
                        }
                    }
                }

                m_StatsValid = true;
            }
        }
    }
コード例 #24
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="Stat"></param>
 public UserRole(UserStat Stat, Page input)
 {
     if (Session["UserRole"] == null)
     {
         input.Response.Redirect("~/Default.aspx");
         return;
     }
     mStrCurrentStat         = input.Session["UserRole"].ToString();
     mClassUserStat          = Stat;
     mClassUserStat.PageInfo = input;
 }
コード例 #25
0
        public static object SelectUserProperties(User user,
                                                  UserIdentity userIdentity,
                                                  UserWallet userWallet,
                                                  UserStat userStats,
                                                  UserReferral userReferral,
                                                  Referrer referrer,
                                                  bool guestView)
        {
            Dictionary <string, object> output = new Dictionary <string, object>();

            AppendUserOutput(output, new Type[] {
                typeof(int),
                typeof(string),
                typeof(DateTime?),
                typeof(bool)
            }, user, "Username");

            if (!guestView)
            {
                AppendUserOutput(output,
                                 new Type[] { typeof(string) },
                                 userIdentity);
            }
            else
            {
                output.Add("auth0Id", userIdentity.Auth0Id);
                output.Add("auth0Nickname", userIdentity.Auth0Nickname);

                //Auth0Id = userIdentity.Auth0Id,
                //Auth0Nickname = userIdentity.Auth0Nickname,
            }

            if (!guestView)
            {
                AppendUserOutput(output, new Type[] { typeof(decimal?), typeof(int?), typeof(string) }, userWallet);
            }
            if (!guestView)
            {
                AppendUserOutput(output, new Type[] { typeof(decimal?), typeof(int?), typeof(string) }, userStats);
            }
            if (!guestView && referrer != null)
            {
                AppendUserOutput(output, new Type[] { typeof(decimal?), typeof(int?), typeof(string), typeof(DateTime?), typeof(int) }, referrer, "userId");
            }

            if (!guestView && userReferral != null)
            {
                AppendUserOutput(output, new Type[] { typeof(decimal), typeof(int), typeof(string), typeof(int) }, userReferral, "userId");
            }



            return(output);
        }
    public void StoreStats()
    {
        if (!SteamManager.initializedMain)
        {
            return;
        }

        if (!m_StatsValid)
        {
            return;
        }

        for (int userStatIndex = 0; userStatIndex < m_UserStatsManager.statsCount; ++userStatIndex)
        {
            UserStat userStat = m_UserStatsManager.GetStatByIndex(userStatIndex);
            if (userStat != null)
            {
                UserStatType userStatType = userStat.type;
                switch (userStatType)
                {
                case UserStatType.Int:

                    UserStatInt userStatInt = (UserStatInt)userStat;
                    StoreIntUserStat(userStatInt);

                    break;

                case UserStatType.Bool:

                    UserStatBool userStatBool = (UserStatBool)userStat;
                    StoreBoolUserStat(userStatBool);

                    break;

                case UserStatType.Float:

                    UserStatFloat userStatFloat = (UserStatFloat)userStat;
                    StoreFloatUserStat(userStatFloat);

                    break;

                case UserStatType.String:

                    UserStatString userStatString = (UserStatString)userStat;
                    StoreStringUserStat(userStatString);

                    break;
                }
            }
        }

        SteamManager.SetStatsDirtyMain();
    }
コード例 #27
0
        public async Task <IActionResult> AddStatsByName([Bind("Key,Value,CreatedAt,StatsCategoryId")] UserStat stat)
        {
            User user = _userService.GetByEmail(User.Identity.Name);

            if (stat.Key == "" || stat.Key.Length < 1)
            {
                throw new ArgumentException();
            }

            var stats = await _userService.AddUserStat(user, stat);

            return(Ok(stats));
        }
コード例 #28
0
        public async Task <IActionResult> UpdateOption(Guid statId, [Bind("key,value,StatsCategoryId")] UserStat stat)
        {
            if (stat.Key == null)
            {
                throw new ArgumentNullException();
            }
            User user = _userService.GetByEmail(User.Identity.Name);

            stat.UserStatsId = statId;


            stat = await _userService.UpdateUserStat(user, stat);

            return(Ok(stat));
        }
コード例 #29
0
ファイル: Program.cs プロジェクト: Claymore/WikiBots
 static int CompareUserStat(UserStat x, UserStat y)
 {
     if (x.IsBot && !y.IsBot)
     {
         return 1;
     }
     if (!x.IsBot && y.IsBot)
     {
         return -1;
     }
     if (y.TotalActions == x.TotalActions)
     {
         return x.Name.CompareTo(y.Name);
     }
     return y.TotalActions.CompareTo(x.TotalActions);
 }
コード例 #30
0
    public UserStatType GetUserStatStype(string i_StatId)
    {
        for (int userStatIndex = 0; userStatIndex < m_UserStats.Count; ++userStatIndex)
        {
            UserStat userStat = m_UserStats[userStatIndex];
            if (userStat != null)
            {
                string statId = userStat.id;
                if (statId == i_StatId)
                {
                    return(userStat.type);
                }
            }
        }

        return(UserStatType.Invalid);
    }
コード例 #31
0
        private static void SendReportUser(UserStat utente, Message messaggio)
        {
            var messaggiTotali      = utente.ContAudio + utente.ContText + utente.ContImg + utente.ContSticker;
            var percentualeMessaggi = (float)utente.ContText / messaggiTotali;
            var percentualeAudio    = (float)utente.ContAudio / messaggiTotali;
            var percentualeImmagini = (float)utente.ContImg / messaggiTotali;
            var percentualeSticker  = (float)utente.ContSticker / messaggiTotali;

            Istance.Bot.Istance.SendTextMessageAsync(messaggio.Chat.Id, "Analisi utente \r \n \r \n" +
                                                     $" Nome : {utente.Nome} \r \n" +
                                                     $" Cognome : {utente.Cognome} \r \n" +
                                                     $" Id : {utente.Id} \r \n" +
                                                     $" Messaggi inviati : {utente.ContText}  ({percentualeMessaggi * 100}%) \r \n" +
                                                     $" Foto inviate : {utente.ContImg}  ({percentualeImmagini * 100}%) \r \n" +
                                                     $" Audio inviati: {utente.ContAudio } ({ percentualeAudio * 100}%) \r \n" +
                                                     $" Stickers inviati: {utente.ContSticker} ({ percentualeSticker * 100}%) \r \n");
        }
コード例 #32
0
ファイル: Program.cs プロジェクト: Claymore/WikiBots
        static void Main(string[] args)
        {
            Wiki wiki = new Wiki("http://ru.wikipedia.org/w/");
            if (string.IsNullOrEmpty(Settings.Default.Login) ||
                string.IsNullOrEmpty(Settings.Default.Password))
            {
                Console.Out.WriteLine("Please add login and password to the configuration file.");
                return;
            }

            Console.Out.WriteLine("Logging in as " + Settings.Default.Login + "...");
            try
            {
                wiki.Login(Settings.Default.Login, Settings.Default.Password);
            }
            catch (WikiException e)
            {
                Console.Out.WriteLine(e.Message);
                return;
            }
            Console.Out.WriteLine("Logged in as " + Settings.Default.Login + ".");
            wiki.SleepBetweenQueries = 3;

            Regex re = new Regex(@"\*\s*\[\[User:(.+?)\]\]\s*→\s*\[\[User:(.+?)\]\]");
            Dictionary<string, string> renamedUsers = new Dictionary<string, string>();
            string renamedUsersData = wiki.LoadText("Википедия:Проект:Патрулирование/Статистика/1k+/Переименования");
            using (TextReader sr = new StringReader(renamedUsersData))
            {
                string line;
                while ((line = sr.ReadLine()) != null)
                {
                    Match m = re.Match(line);
                    if (m.Success)
                    {
                        string oldName = m.Groups[1].Value;
                        string newName = m.Groups[2].Value;
                        if (!renamedUsers.ContainsKey(oldName))
                        {
                            renamedUsers.Add(oldName, newName);
                        }
                    }
                }
            }

            DateTime currentMonth = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
            DateTime now = currentMonth;
            DateTime firstReviewMonth = new DateTime(2008, 9, 1);
            while (currentMonth > firstReviewMonth)
            {
                DateTime previousMonth = currentMonth.AddMonths(-1);
                if (File.Exists("output" + previousMonth.ToString("yyyy-MM") + ".txt"))
                {
                    currentMonth = currentMonth.AddMonths(-1);
                    continue;
                }
                string start = previousMonth.ToString("yyyy-MM-ddTHH:mm:ssZ");
                string stop = currentMonth.ToString("yyyy-MM-ddTHH:mm:ssZ");

                Console.Out.WriteLine("Quering list of editors for " + previousMonth.ToString("MMMM yyyy") + "...");
                ParameterCollection parameters = new ParameterCollection();
                parameters.Add("list", "logevents");
                parameters.Add("letype", "review");
                parameters.Add("lestart", start);
                parameters.Add("leend", stop);
                parameters.Add("ledir", "newer");
                parameters.Add("lelimit", "max");

                Dictionary<string, User> users = new Dictionary<string, User>();
                XmlNode continueNode = null;
                while (true)
                {
                    XmlDocument doc;
                    try
                    {
                        doc = wiki.MakeRequest(Claymore.SharpMediaWiki.Action.Query, parameters);
                    }
                    catch (WikiException e)
                    {
                        Console.Out.WriteLine(e.Message);
                        return;
                    }

                    continueNode = doc.SelectSingleNode("//query-continue");
                    if (continueNode != null)
                    {
                        string name = continueNode.FirstChild.Attributes[0].Name;
                        string value = continueNode.FirstChild.Attributes[0].Value;
                        parameters.Set(name, value);
                    }

                    XmlNodeList entries = doc.SelectNodes("//item[@action!=\"approve-a\" and @action!=\"approve-ia\"]");

                    foreach (XmlNode entry in entries)
                    {
                        string username = renamedUsers.ContainsKey(entry.Attributes["user"].Value)
                            ? renamedUsers[entry.Attributes["user"].Value]
                            : entry.Attributes["user"].Value;
                        string ns = entry.Attributes["ns"].Value;
                        if (!users.ContainsKey(username))
                        {
                            User user = new User(username);
                            if (ns == "0")
                            {
                                user.ArticleActions = 1;
                            }
                            else if (ns == "14")
                            {
                                user.CategoryActions = 1;
                            }
                            else if (ns == "10")
                            {
                                user.TemplateActions = 1;
                            }
                            else if (ns == "6")
                            {
                                user.FileActions = 1;
                            }
                            users.Add(username, user);
                        }
                        else
                        {
                            User user = users[username];
                            if (ns == "0")
                            {
                                ++user.ArticleActions;
                            }
                            else if (ns == "14")
                            {
                                ++user.CategoryActions;
                            }
                            else if (ns == "10")
                            {
                                ++user.TemplateActions;
                            }
                            else if (ns == "6")
                            {
                                ++user.FileActions;
                            }
                            users[username] = user;
                        }
                    }

                    if (continueNode == null)
                    {
                        break;
                    }
                }

                Console.Out.WriteLine("Processing data...");

                List<User> userList = new List<User>(users.Select(s => s.Value));
                userList.Sort(CompareUsers);

                using (StreamWriter sw =
                            new StreamWriter("output" + previousMonth.ToString("yyyy-MM") + ".txt", false))
                {
                    int totalActions = 0;
                    int totalArticleActions = 0;
                    int totalCategoryActions = 0;
                    int totalTemplateActions = 0;
                    int totalFileActions = 0;
                    bool bots = false;
                    sw.WriteLine("== " + previousMonth.ToString("MMMM") + " ==");
                    sw.WriteLine("{| class=\"standard sortable\"");
                    sw.WriteLine("!№!!Участник!!всего!!статей!!категорий!!шаблонов!!файлов");
                    for (int i = 0, j = 1; i < userList.Count; ++i)
                    {
                        if (userList[i].Name.Contains("Lockalbot") ||
                            userList[i].Name.Contains("Secretary"))
                        {
                            bots = true;
                            continue;
                        }
                        sw.WriteLine("|-");
                        totalActions += userList[i].Actions;
                        totalArticleActions += userList[i].ArticleActions;
                        totalCategoryActions += userList[i].CategoryActions;
                        totalTemplateActions += userList[i].TemplateActions;
                        totalFileActions += userList[i].FileActions;
                        string line = string.Format("|{0}||[[User:{1}|]]||{2}||{3}||{4}||{5}||{6}",
                            j++,
                            userList[i].Name,
                            userList[i].Actions,
                            userList[i].ArticleActions,
                            userList[i].CategoryActions,
                            userList[i].TemplateActions,
                            userList[i].FileActions);
                        sw.WriteLine(line);
                    }
                    sw.WriteLine("|-");
                    sw.WriteLine("|||Итого||{0}||{1}||{2}||{3}||{4}",
                        totalActions,
                        totalArticleActions,
                        totalCategoryActions,
                        totalTemplateActions,
                        totalFileActions);
                    sw.WriteLine("|}");

                    if (bots)
                    {
                        sw.WriteLine("; Боты");
                        sw.WriteLine("{| class=\"standard sortable\"");
                        sw.WriteLine("!№!!Участник!!всего!!статей!!категорий!!шаблонов!!файлов");
                        for (int i = 0, j = 1; i < userList.Count; ++i)
                        {
                            if (userList[i].Name.Contains("Lockalbot") ||
                                userList[i].Name.Contains("Secretary"))
                            {
                                sw.WriteLine("|-");
                                string line = string.Format("|{0}||[[User:{1}|]]||{2}||{3}||{4}||{5}||{6}",
                                    j++,
                                    userList[i].Name,
                                    userList[i].Actions,
                                    userList[i].ArticleActions,
                                    userList[i].CategoryActions,
                                    userList[i].TemplateActions,
                                    userList[i].FileActions);
                                sw.WriteLine(line);
                            }
                        }
                        sw.WriteLine("|}");
                    }
                    sw.WriteLine("\n— ~~~~");
                }
                currentMonth = currentMonth.AddMonths(-1);
            }

            currentMonth = new DateTime(2008, 9, 1);
            Dictionary<string, List<MonthStat>> userStatistics = new Dictionary<string, List<MonthStat>>();
            while (currentMonth < now)
            {
                using (TextReader sr =
                        new StreamReader("output" + currentMonth.ToString("yyyy-MM") + ".txt"))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        if (line == "|-")
                        {
                            line = sr.ReadLine();
                            string[] fields = line.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
                            string user = fields[1];
                            int actions = int.Parse(fields[2]);
                            if (user.StartsWith("[[User:"******"output" + currentMonth.ToString("yyyy-MM") + ".txt"))
                {
                    string line;
                    while ((line = sr.ReadLine()) != null)
                    {
                        if (line == "|-")
                        {
                            line = sr.ReadLine();
                            string[] fields = line.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
                            string user = fields[1];
                            int actions = int.Parse(fields[2]);
                            if (userStatistics.ContainsKey(user))
                            {
                                List<MonthStat> stats = userStatistics[user];
                                stats.Add(new MonthStat(currentMonth, actions));
                            }
                        }
                    }
                }
                currentMonth = currentMonth.AddMonths(1);
            }

            using (StreamWriter sw =
                           new StreamWriter("output.txt", false))
            {
                sw.WriteLine("== Статистика ==");

                for (int year = DateTime.Today.Year; year >= 2008; --year)
                {
                    DateTime currentYear = new DateTime(year, 1, 1);
                    List<UserStat> userStats = new List<UserStat>();
                    foreach (var user in userStatistics)
                    {
                        var stats = user.Value.Where(s => (s.Month >= currentYear && s.Month < currentYear.AddYears(1)));
                        UserStat userStat = new UserStat(user.Key, stats);
                        userStat.enterDate = user.Value.Where(s => s.Actions >= 1000).Min(s => s.Month);
                        userStat.ActionsBefore = user.Value.Where(s => s.Month < currentYear).Sum(s => s.Actions);
                        userStat.Max = user.Value.Max(s => s.Actions);
                        if (stats.Count() > 0 && userStat.enterDate.Year <= year)
                        {
                            userStats.Add(userStat);
                        }
                    }
                    userStats.Sort(CompareUserStat);

                    sw.WriteLine("\n=== {0} ===", currentYear.Year);
                    sw.WriteLine("{| class=\"wikitable sortable\"");
                    sw.Write("! № !! Участник");
                    currentMonth = currentYear;
                    while (currentMonth < currentYear.AddYears(1))
                    {
                        sw.Write(" !! " + currentMonth.ToString("MMM yy"));
                        currentMonth = currentMonth.AddMonths(1);
                    }
                    sw.Write(" !! За {0} !! На конец {0} ", currentYear.Year);
                    sw.WriteLine();

                    for (int index = 0; index < userStats.Count; ++index)
                    {
                        sw.WriteLine("|-");
                        sw.WriteLine(userStats[index].IsBot ? "! Бот" : string.Format("! {0}", index + 1));
                        sw.Write(string.Format("| {0}", userStats[index].Name));
                        int max = userStats[index].Stat.Max(s => s.Actions);
                        currentMonth = currentYear;
                        int totalActions = 0;
                        while (currentMonth < currentYear.AddYears(1))
                        {
                            int actions = 0;
                            foreach (var item in userStats[index].Stat)
                            {
                                if (item.Month == currentMonth)
                                {
                                    actions = item.Actions;
                                    break;
                                }
                            }
                            if (actions != userStats[index].Max)
                            {
                                sw.Write(" || " + actions);
                            }
                            else
                            {
                                sw.Write(string.Format(" || '''{0}'''", actions));
                            }
                            totalActions += actions;
                            currentMonth = currentMonth.AddMonths(1);
                        }
                        sw.Write(string.Format(" || {0}", totalActions));
                        sw.Write(string.Format(" || {0}", totalActions + userStats[index].ActionsBefore));
                        sw.WriteLine();
                    }
                    sw.WriteLine("|}");
                }
            }

            currentMonth = new DateTime(now.Year, now.Month, 1).AddMonths(-1);
            Console.Out.WriteLine("Updating the wiki page...");
            using (TextReader sr =
                        new StreamReader("output" + currentMonth.ToString("yyyy-MM") + ".txt"))
            {
                DateTime previousMonth = new DateTime(now.Year, now.Month, 1).AddMonths(-1);
                string text = sr.ReadToEnd();
                string period = previousMonth.ToString("MMMM yyyy");
                wiki.Save(previousMonth.ToString("Википедия:Проект:Патрулирование\\/Статистика\\/yyyy\\/MM"),
                    text,
                    "статистика патрулирования за " + period[0].ToString().ToLower() + period.Substring(1));
            }

            Console.Out.WriteLine("Updating Википедия:Проект:Патрулирование/Статистика/1k+...");
            using (TextReader sr =
                        new StreamReader("output.txt"))
            {
                string text = sr.ReadToEnd();
                wiki.SaveSection("Википедия:Проект:Патрулирование/Статистика/1k+",
                    "1",
                    text,
                    "обновление");
            }
            wiki.Save(currentMonth.ToString("Википедия:Проект:Патрулирование\\/Статистика\\/yyyy"),
                string.Format("#REDIRECT [[{0}]]", currentMonth.ToString("Википедия:Проект:Патрулирование\\/Статистика\\/yyyy\\/MM")),
                "обновление");
            Console.Out.WriteLine("Done.");
            wiki.Logout();
        }