using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using DotNetWikiBot;
namespace OnKSabloncusu
{
class Program
{
static void Main(string[] args)
{
Site trViki = new Site("http://tr.wiki.x.io", "10K Şabloncusu", "PASSWORD");
Page p = new Page(trViki, "Vikipedi:Her Vikipedi'de olması gereken maddeler/Genişletilmiş/Tarih");
p.Load();
List<TempArticlePaar> ListTempArticle = new List<TempArticlePaar>();
try
{
using (StringReader reader = new StringReader(p.text))
{
string line;
while ((line = reader.ReadLine()) != null)
{
if (line.StartsWith("#") || line.StartsWith("##") || line.StartsWith("###") || line.StartsWith("####"))
{
TempArticlePaar oneTempArticlePaar = new TempArticlePaar();
oneTempArticlePaar.Template = GetTemplateName(line, "{{", "}}");
if (oneTempArticlePaar.Template == "Taslak" ||
oneTempArticlePaar.Template == "Başlangıç" ||
oneTempArticlePaar.Template == "C" ||
oneTempArticlePaar.Template == "B" ||
oneTempArticlePaar.Template == "KM" ||
oneTempArticlePaar.Template == "SM" ||
oneTempArticlePaar.Template == "Liste" ||
oneTempArticlePaar.Template == "SL")
// oneTempArticlePaar.Template == "" Dahil edilince değerlendirilmemiş maddelere de şablon eklenecek.
{
oneTempArticlePaar.ArticleName = GetArticleName(line, "[[", "]]");
// Bu Maddenin olup olmadığına bak
Page pLink = new Page(trViki, oneTempArticlePaar.ArticleName);
pLink.Load();
// Yönlendirme varsa ana sayfanın tartışma sayfası kullanılır.
if (pLink.Exists())
{
if (IsRedirected(pLink))
{
oneTempArticlePaar.ArticleName = FindRedirectPage(pLink);
}
ListTempArticle.Add(oneTempArticlePaar);
}
}
// Test için sadece ilk 10 maddeyi oku
if (ListTempArticle.Count >= 25)
break;
}
}
}
// Oluşturduğumuz listedeki maddelerin tartışma sayfalarını okuyoruz. Eğer 10K Template'i varsa onu değiştiriyoruz, yoksa ekliyoruz.
foreach (TempArticlePaar tempArticle in ListTempArticle)
{
Page pTartisma = new Page(trViki, "Tartışma:" + tempArticle.ArticleName);
bool redir = pTartisma.IsRedirect();
pTartisma.Load();
string[] setOfTemplates = pTartisma.GetTemplates(false);
// Tartışma sayfasında 10K Şablonu var mı?
bool exist10K = false;
foreach (string template in setOfTemplates)
{
if (template == "VikiProje 10K")
{
// Tartışma sayfasında 10K Şablonu buldu, değiştiriyor
pTartisma.SetTemplateParameter("VikiProje 10K", "sınıf", tempArticle.Template, true);
string commentVar = tempArticle.Template;
if (commentVar == null || commentVar == "") { commentVar = "belirsiz"; }
pTartisma.Save("10K Şablonu " + commentVar + " olarak değiştirildi", true);
exist10K = true;
}
}
// Tartışma sayfasında 10K Şablonu bulamadı, Şablonu ekliyor
if (!exist10K)
{
pTartisma.text = AddTemplateToText(pTartisma.text, tempArticle.Template);
//pTartisma.AddTemplate("{{VikiProje 10K|sınıf=" + tempArticle.Template + "|önem=}}");
string commentVar = tempArticle.Template;
if (commentVar == null || commentVar == "") { commentVar = "belirsiz"; }
pTartisma.Save("10K Şablonu " + commentVar + " olarak eklendi", true);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
static string GetTemplateName(string input, string start, string end)
{
try
{
int first = input.IndexOf(start);
string returnStr = input.Substring(first + 6); // Şablon örneği: {{tl|10K Taslak}}. Baştaki ""{{10K " kısmı 6 karakter olduğu için baştan 6 karakter siliyoruz.
int last = returnStr.IndexOf(end);
returnStr = returnStr.Substring(0, last);
return returnStr;
}
catch (Exception ex)
{
// Template adı girilmemiş ise exceptiona düşecek ve null değil "" döndürülecek.
return "";
}
}
static string GetArticleName(string input, string start, string end)
{
int first = input.IndexOf(start);
string returnStr = input.Substring(first + 2); // Madde örneği(linkli şekilde): [[Tarih]]. Baştaki "[[" kısmı 2 karakter olduğu için baştan 2 karakter siliyoruz.
int last = returnStr.IndexOf(end);
returnStr = returnStr.Substring(0, last);
if (returnStr.Contains("|"))
{
last = returnStr.IndexOf("|");
returnStr = returnStr.Substring(0, last);
}
return returnStr;
}
static bool IsRedirected(Page pLink)
{
bool IsRedirected = false;
if (pLink.IsRedirect())
{
IsRedirected = true;
}
else if (pLink.text.Contains("#YÖNLENDİR"))
{
IsRedirected = true;
}
return IsRedirected;
}
// "#YONLENDIR ya da #REDIRECT komutunun olduğu inputPage'i alıp yönlenilen sayfayı gönderir."
static string FindRedirectPage(Page PLink)
{
string RedirectsTo = "";
if (PLink.IsRedirect())
{
RedirectsTo = PLink.RedirectsTo();
}
else if (PLink.text.Contains("#YÖNLENDİR"))
{
int first = PLink.text.IndexOf("[[");
string returnStr = PLink.text.Substring(first + 2);
int last = returnStr.IndexOf("]]");
returnStr = returnStr.Substring(0, last);
RedirectsTo = returnStr;
}
return RedirectsTo;
}
static string AddTemplateToText(string text, string Class)
{
int first, last = 0;
string returnStr = text;
if (text.Contains("{{VikiProje GM"))
{
first = text.IndexOf("{{VikiProje GM");
returnStr = text.Substring(first);
last = returnStr.IndexOf("}}");
returnStr = text.Substring(0, first + last + 2) + "\n{{VikiProje 10K|sınıf=" + Class + "|önem=}}\n";
if (text.Length > (first + last + 2))
{
returnStr += text.Substring(first + last + 3);
}
}
else if (text.Contains("{{MaddeGeçmişi"))
{
first = text.IndexOf("{{MaddeGeçmişi");
returnStr = text.Substring(first);
last = returnStr.IndexOf("}}");
returnStr = text.Substring(0, first + last + 2) + "\n{{VikiProje 10K|sınıf=" + Class + "|önem=}}\n";
if (text.Length > (first + last + 2))
{
returnStr += text.Substring(first + last + 3);
}
}
else if (text.Contains("{{tartışma"))
{
first = text.IndexOf("{{tartışma");
returnStr = text.Substring(first);
last = returnStr.IndexOf("}}");
returnStr = text.Substring(0, first + last + 2) + "\n{{VikiProje 10K|sınıf=" + Class + "|önem=}}\n";
if (text.Length > (first + last + 2))
{
returnStr += text.Substring(first + last + 3);
}
}
else
{
returnStr = "{{VikiProje 10K|sınıf=" + Class + "|önem=}}\n" + text;
}
return returnStr;
}
}
class TempArticlePaar
{
public string Template;
public string ArticleName;
}
}