Размер разделов/Обновление статистики (C Sharp)

Материал из WikiNU

Перейти к: навигация, поиск
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using wikiNU_MainPage.Properties;
using Claymore.SharpMediaWiki;
using System.Threading;
 
namespace wikiNU_MainPage
{
    class Program
    {
        static Wiki wiki;
        static string getResponse(string uri)
        {
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[8192];
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream resStream = response.GetResponseStream();
            int count = 0;
            do
            {
                count = resStream.Read(buf, 0, buf.Length);
                if (count != 0)
                {
                    sb.Append(Encoding.Default.GetString(buf, 0, count));
                }
            }
            while (count > 0);
            return sb.ToString();
        }
 
        static void Login()
        {            
            Directory.CreateDirectory(@"Cache\");
 
            wiki = new Wiki("http://wiki.nayanova.edu/meta/");
            wiki.SleepBetweenQueries = 5;
 
            Console.WriteLine("Logging in as " + Settings.Default.wLogin + " to " + wiki.Uri + "...");
 
            Thread.Sleep(2000);
 
            try
            {
                string cookieFile = @"Cache\cookie.jar";
                WikiCache.Login(wiki, Settings.Default.wLogin, Settings.Default.wPass, cookieFile);
 
                string namespacesFile = @"Cache\namespaces.dat";
                if (!WikiCache.LoadNamespaces(wiki, namespacesFile))
                {
                    wiki.GetNamespaces();
                    WikiCache.CacheNamespaces(wiki, namespacesFile);
                }
            }
            catch (WikiException e)
            {
                Console.WriteLine(e.Message);
                return;
            }
            Console.WriteLine("Logged in as " + wiki.User + ".");
        }
 
        static void Main(string[] args)
        {
            bool index = false;
            bool metapage = false;
 
            if (args.Contains("--index")) index = true;
            if (args.Contains("--meta")) metapage = true;
            if (args.Contains("--all")) { index = true; metapage = true;}
 
            Console.Write("Получение данных: meta ... ");
            string meta = getResponse("http://wiki.nayanova.edu/meta/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", meta);
 
            Console.Write("Получение данных: pool ... ");
            string pool = getResponse("http://wiki.nayanova.edu/pool/index.php?title=Special:Statistics&action=raw").Split('=', ';')[15];
            Console.WriteLine("{0,5}", pool);
 
            Console.Write("Получение данных: ru   ... ");
            string ru = getResponse("http://wiki.nayanova.edu/ru/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", ru);
 
            Console.Write("Получение данных: en   ... ");
            string en = getResponse("http://wiki.nayanova.edu/en/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", en);
 
            Console.Write("Получение данных: de   ... ");
            string de = getResponse("http://wiki.nayanova.edu/de/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", de);
 
            Console.Write("Получение данных: fr   ... ");
            string fr = getResponse("http://wiki.nayanova.edu/fr/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", fr);
 
            Console.Write("Получение данных: ja   ... ");
            string ja = getResponse("http://wiki.nayanova.edu/ja/index.php?title=Special:Statistics&action=raw").Split('=', ';')[3];
            Console.WriteLine("{0,5}", ja);
 
            Console.WriteLine("Запись в локальный файл.");
            using (StreamWriter sw = new StreamWriter("statistics.txt"))
            {
                sw.WriteLine("meta = {0,5}", meta);
                sw.WriteLine("pool = {0,5}", pool);
                sw.WriteLine("ru   = {0,5}", ru);
                sw.WriteLine("en   = {0,5}", en);
                sw.WriteLine("de   = {0,5}", de);
                sw.WriteLine("fr   = {0,5}", fr);
                sw.WriteLine("ja   = {0,5}", ja);
 
                sw.Close();
            }
 
            if (index)
            {
                List<string> MainPage = new List<string>();
 
                Console.WriteLine("Чтение шаблона ...");
                StreamReader sr = new StreamReader("index-template.html");
                string line;
                while ((line = sr.ReadLine()) != null)
                    MainPage.Add(line);
                sr.Close();
 
                Console.WriteLine("Добавление цифр ...");
                // ru
                MainPage[33] = "<div style=\"font-size: 10pt;\">Информационный проект<br />академии Наяновой<br />Статей: " + ru.ToString() + "</div>";
                // meta
                MainPage[38] = "<div style=\"font-size: 10pt;\">Координационный центр<br />информационного проекта<br />Статей: " + meta.ToString() + "</div>";
                // pool
                MainPage[43] = "<div style=\"font-size: 10pt;\">Медиа хранилище<br />информационного проекта<br />Файлов: " + pool.ToString() + "</div>";
                // en
                MainPage[48] = "<div style=\"font-size: 10pt;\">Nayanova academy<br />information project<br />Article count: " + en.ToString() + "</div>";
                // de
                MainPage[53] = "<div style=\"font-size: 10pt;\">Informationen projekt<br />akademie Nayanova<br />Anzahl Artikel: " + de.ToString() + "</div>";
                // fr
                MainPage[58] = "<div style=\"font-size: 10pt;\">Le projet informatique<br />de Academie de Nayanova<br />Nombre d'articles: " + fr.ToString() + "</div>";
                // ja
                MainPage[63] = "<div style=\"font-size: 10pt;\">情報プロジェクトアカデミーNayanova<br />記事数:" + ja.ToString() + "</div>";
 
 
                Console.WriteLine("Запись итогового файла ...");
                StreamWriter swr = new StreamWriter("index.html", false, Encoding.UTF8);
                foreach (string st in MainPage)
                    swr.WriteLine(st);
                swr.Close();
 
                Console.WriteLine("Загрузка файла ...");
 
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://wiki.nayanova.edu/httpdocs/index.html");
 
                request.Method = WebRequestMethods.Ftp.UploadFile;
 
                request.Credentials = new NetworkCredential(Settings.Default.Login, Settings.Default.Password);
 
                Stream ftpStream = request.GetRequestStream();
                FileStream file;
 
 
                file = File.OpenRead("index.html");
 
                int length = 10240;
                byte[] buffer = new byte[length];
                int bytesRead = 0;
 
                do
                {
                    bytesRead = file.Read(buffer, 0, length);
                    ftpStream.Write(buffer, 0, bytesRead);
                } while (bytesRead != 0);
 
                file.Close();
                ftpStream.Close();
 
                Console.WriteLine("Готово.");
            }
 
            if (metapage)
            {
                Console.WriteLine("Обновление страницы на мете ...");
 
                Login();
 
                Console.WriteLine("Загрузка страницы \"Размер разделов\" ...");
                string pageText = wiki.LoadText("Размер разделов");
 
                Console.WriteLine("Добавление цифр ...");
                string DateStr = DateTime.Now.ToString();
                string stats = "|-\n|" + DateStr;
                stats += "||" + meta.ToString();
                stats += "||" + pool.ToString();
                stats += "||" + ru.ToString();
                stats += "||" + en.ToString();
                stats += "||" + de.ToString();
                stats += "||" + fr.ToString();
                stats += "||" + ja.ToString();
                stats += "\n|}";
 
                pageText = pageText.Replace("|}", stats);
 
                Console.WriteLine("Запись страницы ...");
                wiki.Save("Размер разделов", pageText, "Обновление на " + DateStr);
 
                Console.WriteLine("Logout ...");
                wiki.Logout();
 
                Console.WriteLine("Готово.");                
            }
 
            Console.ReadKey();
        }
    }
}