Hoppa till innehållet

Wikipedia:Projekt DotNetWikiBot Framework/GameOnBot/Statistik

Från Wikipedia
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections;
using System.Xml;
using DotNetWikiBot;
using System.Threading;
using System.Net;
using System.Collections.Generic;

public class TableRow
{
	public String cell1;
	public int cell2;
	
	public TableRow(String c1, int c2)
	{
		cell1 = c1;
		cell2 = c2;
	}
}

class MyBot : Bot
{
	static StringBuilder sb  = new StringBuilder();
	static byte[]        buf = new byte[8192];
	static int count;
	static string tempString;
	
	private static string getNumberOfVisits(string inStr)
	{
		int pos  = inStr.IndexOf(" has been viewed ");
		int pos2 = inStr.Substring(pos + 17).IndexOf(" times in ");
		if(pos > 0 && pos2 > 0)
			return inStr.Substring(pos + 17, pos2);
		return "";
	}
	
	private static string getPage(string url)
	{
		HttpWebRequest  request  = (HttpWebRequest)WebRequest.Create(url);
		HttpWebResponse response = (HttpWebResponse)request.GetResponse();
		Stream resStream = response.GetResponseStream();
		sb.Length = 0;
		tempString = null;
		count      = 0;
		do
		{
			count = resStream.Read(buf, 0, buf.Length);
			if (count != 0)
			{
				tempString = Encoding.UTF8.GetString(buf, 0, count);
				sb.Append(tempString);
			}
		}
		while (count > 0);
		return sb.ToString();
	}
	
	public static void Main()
	{
		Site site   = new Site("http://sv.wikipedia.org", username, password);
		PageList pl = new PageList(site);
		//date to check against (normally last month), remember to edit the text in the header as well!
		String date = "201106";
		//Header for the page
		String[] headersStr  = new String[4];
		String[] footersStr  = new String[4];
		String[] catscanStr  = new String[4];
		String[] articlesStr = new String[4];
		
		headersStr[0] = "{{Wikipedia:Projekt datorspel/Stat/Mest lästa stubbar/Tidigare månader}}\nDenna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Datorspelsstubbar]] under juni 2011.";
		headersStr[1] = "{{Wikipedia:Projekt Karlstad/Stat/Mest lästa stubbar/Tidigare månader}}\nDenna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Karlstad]] som är märkta som stubbar under juni 2011.";
		headersStr[2] = "Denna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Stockholmsstubbar]] under juni 2011.";
		headersStr[3] = "Denna sida innehåller statistik över antalet visningar av respektive artikel i [[:Kategori:Internet i Sverige]] under juni 2011.";
		
		footersStr[0] = "[[Kategori:Wikipedia:Projekt datorspel/Stat]]";
		footersStr[1] = "";
		footersStr[2] = "";
		footersStr[3] = "[[Kategori:Wikipedia:Projekt Internet i Sverige]]";
		
		catscanStr[0] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "datorspelsstubbar"  + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv";
//Special case, we don't search for specific category but all articles marked as stubs inside the category
		catscanStr[1] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=Karlstad&basedeep=20&mode=cs&tagcat=stubbar&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv";
		catscanStr[2] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "Stockholmsstubbar"  + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv";
		catscanStr[3] = "http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + "Internet_i_Sverige" + "&basedeep=20&templates=&mode=al&go=Sök&format=wiki&userlang=sv";
		
		articlesStr[0] = "Wikipedia:Projekt datorspel/Stat/Mest lästa stubbar";
		articlesStr[1] = "Wikipedia:Projekt Karlstad/Stat/Mest lästa stubbar";
		articlesStr[2] = "Wikipedia:Projekt Stockholm/Mest lästa stubbar";
		articlesStr[3] = "Wikipedia:Projekt Internet i Sverige/Mest lästa artiklar";
		
		String tmpStr;
		for(int stat = 0; stat < 4; stat++)
		{
			Page myPage2 = new Page(site);
			myPage2.title = articlesStr[stat];
			//Add header
			myPage2.text += headersStr[stat] + "\n";
			myPage2.text += "{| class=\"sortable wikitable\"\n! Artikel !! Antal besök\n|-\n";
			//Catscan search
			tmpStr = getPage(catscanStr[stat]);
			string[] lines = Regex.Split(tmpStr, "\n");
			string title;
			int pos;
			int pos2;
			List<TableRow> tableRow = new List<TableRow>();

			foreach (string line in lines)
			{
				pos  = line.IndexOf("[[");
				pos2 = line.IndexOf("]]");
				if(pos > 0 && pos2 > 0)
				{
					title = line.Substring(pos + 2, pos2 - 4);
					if(!title.StartsWith("Kategori:"))
					{
						tmpStr = getPage("http://stats.grok.se/sv/" + date + "/" + title);
						tmpStr = getNumberOfVisits(tmpStr);
						if(tmpStr.Length > 0)
							tableRow.Add(new TableRow(title.Replace("_", " "), int.Parse(tmpStr)));
					}
				}
			}

			tableRow.Sort(delegate(TableRow r1, TableRow r2)
				{
					return r1.cell2.CompareTo(r2.cell2);
				}
			);
			//descending order
			tableRow.Reverse();
			tableRow.ForEach(delegate(TableRow r)
				{
					myPage2.text += "|-\n| [[" + r.cell1 + "]]\n| " + r.cell2.ToString() + "\n";
				}
			);
			myPage2.text += "|}\n";
			//Add footer
			myPage2.text += footersStr[stat] + "\n";
			//Save page
			myPage2.Save("Uppdaterar statistiken", true);
		}

		String[] kategorier = {"Windows-spel", "Macintosh-spel", "Amigaspel", "Atari-spel", "Wii-spel", "Playstation 3-spel", "Xbox 360-spel"};
		foreach(string kategori in kategorier)
		{
			Page myPage = new Page(site);
			myPage.title = "Wikipedia:Projekt datorspel/Stat/" + kategori;
			myPage.text += "{| class=\"sortable wikitable\"\n! Artikel !! Antal besök\n|-\n";
			//Catscan sökning
			tmpStr = getPage("http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=" + kategori + "&basedeep=20&mode=cs&tagcat=Stubbar&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv");
			string[] lines = Regex.Split(tmpStr, "\n");
			string title;
			int pos;
			int pos2;
			List<TableRow> tableRow = new List<TableRow>();

			foreach (string line in lines)
			{
				pos  = line.IndexOf("[[");
				pos2 = line.IndexOf("]]");
				if(pos > 0 && pos2 > 0)
				{
					title = line.Substring(pos + 2, pos2 - 4);
					tmpStr = getPage("http://stats.grok.se/sv/" + date + "/" + title);
					tmpStr = getNumberOfVisits(tmpStr);
					if(tmpStr.Length > 0)
//						myPage.text += "|-\n| [[" + title + "]]\n| " + tmpStr + "\n";
						tableRow.Add(new TableRow(title.Replace("_", " "), int.Parse(tmpStr)));
				}
			}
			tableRow.Sort(delegate(TableRow r1, TableRow r2)
				{
					return r1.cell2.CompareTo(r2.cell2);
				}
			);
			//descending order
			tableRow.Reverse();
			tableRow.ForEach(delegate(TableRow r)
				{
					myPage.text += "|-\n| [[" + r.cell1 + "]]\n| " + r.cell2.ToString() + "\n";
				}
			);
			myPage.text += "|}\n";
			myPage.Save("Uppdaterar statistiken", true);
		}

		double proc;
		int antal;
		int antalKat;
		Page myPage3 = new Page(site);
		myPage3.title = "Wikipedia:Projekt datorspel/Stat/Konsolkampen";

		myPage3.text += "{|\n! [[:Kategori:" + kategorier[0] + "|Win]] !! [[:Kategori:" + kategorier[1] + "|Mac]] !! [[:Kategori:" + kategorier[2] + "|Amiga]] !! [[:Kategori:" + kategorier[3] + "|Atari]] !! [[:Kategori:" + kategorier[4] + "|Wii]] !! [[:Kategori:" + kategorier[5] + "|PS3]] !! [[:Kategori:" + kategorier[6] + "|Xbox360]]\n|-\n";
		foreach(string kategori in kategorier)
		{
			pl.FillFromCategoryTree(kategori);
			antalKat = pl.Count();
			tmpStr = getPage("http://toolserver.org/~daniel/WikiSense/CategoryIntersect.php?wikilang=sv&wikifam=.wikipedia.org&basecat=Datorspelsstubbar&basedeep=20&mode=cs&tagcat=" + kategori + "&tagdeep=3&go=S%C3%B6k&format=wiki&userlang=sv");
			pl.Clear();
			string[] lines = Regex.Split(tmpStr, "\n");
			antal = 0;
			foreach (string line in lines)
				antal++;
			proc = Math.Round(antal * 100 / (double)antalKat, 2);
			myPage3.text += "| [[Wikipedia:Projekt datorspel/Stat/" + kategori + "|" + antal.ToString() + "]] (" + proc + "%)\n";
		}
		myPage3.text += "|}\n";
		myPage3.Save("Uppdaterar statistiken", true);	
	}
}