مستخدم:وهراني/صيانة

روبوت لأعمال الصيانة برنامج آلي للقيام بأعمال صيانة آلية ونصف آلية. الكود يعتمد على مجموعة من استعلام SQL (راجع النقاش : ويكيبيديا:الميدان/تقنية - مهمة بوتية : حذف {{غير مصنفة}} من المقالات المصنفة)

  • مجموعة مهام الصيانة هي :
    1. حذف بعض القوالب غير المستخدمة
    2. تصحيح وضع مقالة مصنفة موسومة غير مصنفة
    3. حذف قالب:يتيمة من مقالة تصل إليها
    4. ترشيح تصنيفات صيانة فارغة للحذف السريع
    5. وسم تصنيفات غير مستخدمة بـ قالب {{تصنيف غير مستخدم}}
    6. وسم مقالات يتيمة غير موسومة بقالب {{يتيمة}}
    7. وسم ملفات استعمال عادل غير مستخدمة بقالب {{صورة استعمال عادل يتيمة}}
    8. إزالة الوسم من ملفات استعمال عادل مستخدمة وموسمة بقالب {{صورة استعمال عادل يتيمة}}.
    9. مقالات غير مصنفة. المطلوب: وسمها بقالب {{غير مصنفة}}.
    10. استخراج قوائم المقالات بعناوين بها تشكيل.
    11. استخراج قوائم التصنيفات غير المصنفة.
    12. استخراج قوائم صفحات نقاش كبيرة الحجم لبوت الأرشفة الآلية
    13. استخراج قوائم لصفحات النقاش اليتيمة
    14. حذف تصنيف:أشخاص على قيد الحياة من مقالة لشخص متوف.

طریقة العمل

عدل

هذا الكود يعمل على خوادم تولابز، ما يستوجب امتلاك حساب SQL (اسم المستخدم وكلمة السر) إضافة إلى حساب البوت (اسم المستخدم وكلمة السر).


يمكن لهذا الكود تنفيذ مهمة أو أكثر عند التشغيل. مثال :

  • php my_script_name.php 1 2 3 9
  • هذا الأمر ينفذ المهمات رقم 1 و 2 و 3 و 9 على التوالي (حسب ترقيم المهام المشار إليه أعلاه)

الإشكالات

عدل

يرجى وضع كل حالة خاطئة لاحظتموها في صفحة النقاش لهذه الصفحة.


الكود المصدري

عدل

لاستعمال هذا الكود : راجع مساعدة:الشروع في العمل مع بيشي

<?php
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
require_once( /* PATH TO PEACHY */ . '/Init.php' );

define( 'BootMsg', "[[مستخدم:وهراني/صيانة|أعمال صيانة]] : " );

$months = array('','يناير','فبراير','مارس','أبريل','مايو','يونيو','يوليو','أغسطس','سبتمبر','أكتوبر','نوفمبر','ديسمبر');

function remove_tpl($txt,$tplnames){
	if(preg_match_all('/{{([^}]*)}}/',$txt,$r) === false ) return false;
	
	if(!is_array($tplnames)) $tplnames = preg_split("/\\|/",$tplnames);

	if(count($r)<1) return false;

	$newtxt =$txt;

	for($i=0;$i<count($r[1]);$i++){
		$param = preg_split("/\\|/",$r[1][$i]);
		if(in_array(trim($param[0]) ,$tplnames))
		 $newtxt = str_replace(array("\\n".$r[0][$i],$r[0][$i]),'',$newtxt);
	}
	return $newtxt; 
}



function removeTPLs(&$wiki) {

	$removetpls = array(
			'يوم شهر عام'=> array('يوم شهر عام','يوم شهر سنة','Use dmy dates')
			,'Use Australian English' => array('Use Australian English')
			,'Use British English' => array('Use British English')
			//,'' => array('','')
			);

	cecho("\n[Remove unuseful templates|INFO] \n\n");		

	foreach($removetpls as $tpl=>$lst) {  
		$tpl = $wiki->initPage("قالب:".$tpl);
		$al = $tpl->embeddedin(0);
		print_r($al);
		foreach($al as $title){
			if(is_array($title)) $title = $title['title'];
			$article = $wiki->initPage($title);
			
			$txt = $article->get_text();
			$txt = remove_tpl($txt,$lst);
			$article->edit($txt,BootMsg."حذف قوالب غير مستخدمة : ".implode(' - ', $lst));
		}
	}
}


/*
تصحيح وضع مقالة مصنفة موسومة غير مصنفة
*/
function removeUnCatFromCatPages(&$wiki,&$mysqli) {
 
	$query = "select page_title "
		."from page "
		."where page_namespace = 0 "
		."and page_is_redirect = 0 "
		."and page_id in (select cl_from from categorylinks  where cl_to = 'جميع_المقالات_غير_المصنفة' ) "
		."and page_id in ( " // in unhidden cat 
		."select cl_from from categorylinks  where cl_to in "
		      ."( "
			."select page_title from page "
			."where "
			    ."page_namespace = 14 "
			."and page_id not in (select cl_from from categorylinks  where cl_to = 'تصنيفات_مخفية' ) "
			."and page_title not like '%غير_مصنفة%' "
		      .")"
		.")"
	;
	cecho("\n\n[Running NoCat SQL : |INFO] \n $query \n\n");

	if ($result = $mysqli->query($query)) {	

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			$article = $wiki->initPage($title);
			
			$txt = $article->get_text();
			$txt = remove_tpl($txt,"غير مصنفة|Uncategorized|غير مصنف|Uncategorised|Uncat");
			$article->edit($txt,BootMsg."تصحيح وضع مقالة مصنفة موسومة غير مصنفة");
		}
		
		$result->free();
	}
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
} 

/*
حذف قالب:يتيمة من مقالة تصل إليها
*/
function unmarkUnorphPage(&$wiki,&$mysqli) {

	$query = <<<QUERY
	SELECT p.page_title , COUNT(pl.pl_from) as Nb
	  FROM page p
	    INNER JOIN categorylinks c ON p.page_id = c.cl_from AND c.cl_to = "جميع_المقالات_اليتيمة"
	    INNER JOIN pagelinks pl ON p.page_title = pl.pl_title AND p.page_namespace = pl.pl_namespace
	    INNER JOIN page p2 ON p2.page_id = pl.pl_from AND pl.pl_from_namespace = 0 and p2.page_is_redirect=0
	  GROUP BY p.page_title
	  having COUNT(pl.pl_from)>2
	#  ORDER BY COUNT(pl.pl_from) DESC
	#  limit 50
QUERY;

	cecho("\n\n[Running Not orphan SQL : |INFO] \n $query \n\n");

	if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			$article = $wiki->initPage($title);

			$txt = $article->get_text();
			$txt = remove_tpl($txt,"يتيمة|Orphan|orphan");
			$article->edit($txt,BootMsg."حذف قالب:يتيمة من مقالة تصل إليها ".$d['Nb']." مقالات/مقالة");
		}
		
		$result->free();
	}
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}

/*
ترشيح تصنيفات صيانة فارغة للحذف السريع
*/
function markEmptyCattoRemove(&$wiki,&$mysqli) {
      global $months;
      $query =<<<QUERY
SELECT distinct page_title, rev_timestamp , DATEDIFF(now(),rev_timestamp)
    FROM categorylinks
    RIGHT JOIN page
    ON cl_to = page_title
    JOIN revision
    ON rev_page = page_id
    WHERE page_namespace = 14
    AND rev_parent_id = 0
    AND cl_to IS NULL
    AND page_title LIKE '%منذ%' #since
    AND DATEDIFF(now(),rev_timestamp)> 45
QUERY;

    cecho("\n\n[Running EmptyCat SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = "تصنيف:".str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage($title);

			$txt = $article->get_text();
			if(strpos($txt,"{{تصنيف غير مستخدم") !== false) { echo "\n\n"; continue; }
			$txt = "{{تصنيف غير مستخدم|تاريخ="
				.$months[date('n')]
				." "
				.date('Y')
				."}}\n".$txt;
			$article->edit($txt,BootMsg."ترشيح تصنيفات صيانة فارغة للحذف السريع");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }

}
/*
وسم تصنيفات غير مستخدمة بـ قالب {{قا|تصنيف غير مستخدم}}
*/
function markUnusedCat(&$wiki,&$mysqli) {       
    global $months;

$query =<<<QUERY
    SELECT distinct page_title, str_to_date(rev_timestamp, '%Y%m%d%H%i%s') AS rev_timestamp
    FROM categorylinks
    RIGHT JOIN page
    ON cl_to = page_title
    JOIN revision
    ON rev_page = page_id
    WHERE page_namespace = 14
    AND page_is_redirect = 0
    AND rev_parent_id = 0
    AND page_id NOT IN (SELECT tl_from FROM templatelinks WHERE tl_title = 'تحويل_تصنيف')
    AND page_id NOT IN (SELECT tl_from FROM templatelinks WHERE tl_title = 'تصنيف_فارغ')
    AND page_id NOT IN (SELECT tl_from FROM templatelinks WHERE tl_title = 'توضيح_تصنيف')
    AND page_id NOT IN (SELECT tl_from FROM templatelinks WHERE tl_title = 'تصنيف_غير_مستخدم') 
    AND cl_to IS NULL
QUERY;

    cecho("\n\n[Running EmptyCat SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = "تصنيف:".str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage($title);

			$txt = $article->get_text();
			if(strpos($txt,"{{تصنيف غير مستخدم") !== false) { echo "\n\n"; continue; }
			$txt = "{{تصنيف غير مستخدم|تاريخ="
				.$months[date('n')]
				." "
				.date('Y')
				."}}\n".$txt;
			$article->edit($txt,BootMsg."وسم تصنيف غير مستخدم");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}
/*
وسم مقالات يتيمة غير موسومة بقالب {{يتيمة}}
*/
function markOrphPages(&$wiki,&$mysqli) {
      global $months;

      $query =<<<QUERY
      SELECT  page_title
      FROM page
      LEFT JOIN pagelinks
      ON pl_title = page_title
      AND pl_namespace = page_namespace
      WHERE pl_namespace IS NULL
      AND page.page_namespace =0 AND page.page_is_redirect = 0
      and page.page_id not in (select tl_from from templatelinks  where tl_title = 'يتيمة')
      and page.page_id not in (select tl_from from templatelinks  where tl_title = 'توضيح') 
      LIMIT 1000;
QUERY;

    cecho("\n\n[Running OrphanPage SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage($title);
			
			if($article->get_exists() === false) continue;

			$txt = $article->get_text();

			if(strpos($txt,"{{يتيمة") !== false) continue;
			
			$txt = "{{يتيمة|تاريخ="
				.$months[date('n')]
				." "
				.date('Y')
				."}}\n".$txt;
			$article->edit($txt,BootMsg."وسم مقالة يتيمة غير موسومة");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}

/*
ملفات استعمال عادل غير مستخدمة. المطلوب: وسمها بقالب {{صورة استعمال عادل يتيمة}} حسب طريقة استخدام القالب.
*/
function markUnusedFiles(&$wiki,&$mysqli) {
      global $months;

$query =<<<QUERY
	select page_title 
	from page as p1
	join image 
	on exists (select *
		  from categorylinks as cl1
		  where cl_from = page_id
		  and (cl_to = "جميع_الملفات_غير_الحرة"
	or exists (select *
		  from page as p2
		  where p2.page_namespace = 14
		  and p2.page_title = cl1.cl_to 
	and exists (select *
		    from categorylinks as cl2
		    where cl2.cl_from = p2.page_id
		    and (cl2.cl_to = "جميع_الملفات_غير_الحرة"
	or exists (select *
		  from page as p3
		  where p3.page_namespace = 14
		  and p3.page_title = cl2.cl_to
	and exists (select *
		    from categorylinks as cl3
		    where cl3.cl_from = p3.page_id
		    and (cl3.cl_to ="جميع_الملفات_غير_الحرة"))))))))
	and page_namespace = 6
	and not exists (select *
			from imagelinks
			where il_to = page_title
			and il_from_namespace in (0, 1, 2, 3, 4, 5, 11, 12, 100, 118))
			and img_name = page_title
			and datediff(now(), img_timestamp) > 7
	and page_id not IN (SELECT tl_from FROM templatelinks where tl_title = 'صورة_استعمال_عادل_يتيمة')  #Remove # to find untagged files
QUERY;
    
    cecho("\n\n[Running FairFile SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage("ملف:".$title);
			
			if($article->get_exists() === false) continue;

			$txt = $article->get_text();
			$txt = "{{صورة استعمال عادل يتيمة|1="
				.date("d.m.Y")
				."}}\n".$txt;
			$article->edit($txt,BootMsg."وسم ملف استعمال عادل غير مستخدم");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}

/*
ملفات استعمال عادل مستخدمة وموسمة. المطلوب: إزالة الوسم السابق منها.
*/
function unmarkUsedFiles(&$wiki,&$mysqli) {

$query =<<<QUERY
SELECT p.page_title FROM page p
INNER JOIN categorylinks c1 ON p.page_id = c1.cl_from
LEFT JOIN imagelinks i ON p.page_title = i.il_to AND (i.il_from_namespace in (0, 1, 2, 3, 4, 5, 11, 12, 100, 118))
LEFT JOIN categorylinks c2 ON p.page_id = c2.cl_from AND c2.cl_to = "ملفات_غير_حرة_يتيمة"
LEFT JOIN redirect as r ON p.page_title = r.rd_title
WHERE c1.cl_to = "جميع_الملفات_غير_الحرة"
AND i.il_from IS NULL
AND c2.cl_from IS NULL
AND r.rd_from IS NULL
AND p.page_namespace = 6
QUERY;

    cecho("\n\n[Running untag used FairFile SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage("ملف:".$title);
			
			if($article->get_exists() === false) continue;

			$txt = $article->get_text();
			$txt = remove_tpl($txt,"صورة استعمال عادل يتيمة|صورة استعمال عادل غير مستخدمة|Db-badfairuse");
			$article->edit($txt,BootMsg."إزالة وسم ملف استعمال عادل غير مستخدم");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}

/*
مقالات غير مصنفة. المطلوب: وسمها بقالب {{غير مصنفة}}.
*/
function markUnCatPages(&$wiki,&$mysqli) {global $months;

$query =<<<QUERY
SELECT page_title   FROM page
LEFT JOIN categorylinks
ON cl_from = page_id
WHERE cl_from IS NULL
AND page_namespace = 0
AND page_is_redirect = 0
AND page_title NOT LIKE "الصفحة_الرئيسية"
QUERY;

    cecho("\n\n[Running markUncat Page SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage($title);

			$txt = $article->get_text();
			$txt = "{{غير مصنفة|تاريخ="
				.$months[date('n')]
				." "
				.date('Y')
				."}}\n".$txt;
			$bls = $article->get_backlinks(array( 0 ),'nonredirects');
			if(count($bls)<3)
			$txt = "{{يتيمة|تاريخ="
				.$months[date('n')]
				." "
				.date('Y')
				."}}\n".$txt;			
			$article->edit($txt,BootMsg."وسم مقالة غير مصنفة");
		}
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
	
}
/*
استخراج قوائم المقالات بعناوين بها تشكيل.
*/
function extractPagesList(&$wiki,&$mysqli) {

$query =<<<QUERY
	SELECT page_title
	FROM page
	WHERE page_title REGEXP '(ّ|َ|ً|ُ|ٌ|ِ|ٍ|ْ)'
	AND page_title NOT LIKE '%(كانا)%' #
	AND page_namespace = 0
	AND page_is_redirect = 0
QUERY;

    cecho("\n\n[Running extractPagesList Page SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		$titles = array();
		while($d = $result->fetch_assoc()) {
			$titles[] = "\n# [[:".str_replace('_',' ',$d['page_title'])."]]";
		}
		$article = $wiki->initPage("ويكيبيديا:مشروع ويكي الصيانة/مقالات بعناوين مشكلة");
		
		$txt= "{{مهام تحريرية}}\n"
		      ."هذه قائمة بمقالات تحتوي عناوينها على [[علامة تشكيل|علامات تشكيل]] بما يُخالف [[ويكيبيديا:تسمية المقالات|سياسة تسمية المقالات]]. "
		      ."المطلوب نقل المقالات إلى عناوين صحيحة لا تحتوي أي علامة تشكيل.";
		      
		$txt .= "\n<h4>آخر تحديث كان في {{تاريخ2|".date("Y-m-d")."|dmy}} ".date("H:i:s")." </h4>\n<hr>"
		.'<div style = "-moz-column-count: 4;-moz-column-gap: 20px;-webkit-column-count: 4;-webkit-column-gap: 20px;column-count: 4;column-gap: 20px;">'
		."\n".implode("",$titles)
		.'</div>';
		
		$article->edit($txt,BootMsg."استخراج قائمة المقالات بعناوين بها تشكيل");
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}

/*
استخراج قوائم التصنيفات غير المصنفة.
*/

function extractCatList(&$wiki,&$mysqli) {

	$query =<<<QUERY
	SELECT
	  distinct page_title,
	  page_len,
	  cat_pages,
	  rev_timestamp,
	  rev_user_text
	FROM revision
	JOIN
	(SELECT
	  page_id,
	  page_title,
	  page_len,
	  cat_pages
	FROM category
	RIGHT JOIN page ON cat_title = page_title
	LEFT JOIN categorylinks ON page_id = cl_from
	WHERE cl_from IS NULL
	AND page_namespace = 14
	AND page_is_redirect = 0) AS pagetmp
	ON rev_page = pagetmp.page_id
	AND rev_timestamp = (SELECT MAX(rev_timestamp)
			    FROM revision AS last 
			    WHERE last.rev_page = pagetmp.page_id);
QUERY;

    cecho("\n\n[Running extractCatList Page SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		$titles = array();
		while($d = $result->fetch_assoc()) {
			$titles[] = "\n# [[:تصنيف:".str_replace('_',' ',$d['page_title'])."]]";	
		}
		$article = $wiki->initPage("ويكيبيديا:مشروع ويكي الصيانة/التصنيفات غير المصنفة");

		$txt = "\n<h4>آخر تحديث كان في {{تاريخ2|".date("Y-m-d")."|dmy}} ".date("H:i:s")." </h4>\n<hr>"
		.'<div style = "-moz-column-count: 4;-moz-column-gap: 20px;-webkit-column-count: 4;-webkit-column-gap: 20px;column-count: 4;column-gap: 20px;">'
		."\n".implode("",$titles)
		.'</div>';
		
		$article->edit($txt,BootMsg."استخراج قائمة التصنيفات غير المصنفة");
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
	
}
/*
استخراج قوائم لبوت الأرشفة الآلية
*/
function extractLongUserTalkPages(&$wiki,&$mysqli) {

$query =<<<QUERY
	  select
	      page_title, 
	      page_len  
	  from page 
	  where 
	    page_namespace = 3  and 
	    page_title not like "%/%" and 
	    page_len >100000 
	  ORDER BY page_len 
	  DESC limit 100;
QUERY;

  if ($result = $mysqli->query($query)) {

		$titles = array();
		while($d = $result->fetch_assoc()) {
			$titles[] = sprintf("\n# [[نقاش المستخدم:%s]] (%d حرف)" ,str_replace('_',' ',$d['page_title']),$d['page_len']);
	
		}
		$article = $wiki->initPage("ويكيبيديا:مشروع ويكي الصيانة/أكبر صفحات نقاش المستخدمين");

		$txt = "\n<h4>آخر تحديث كان في {{تاريخ2|".date("Y-m-d")."|dmy}} ".date("H:i:s")." </h4>\n<hr>"
		.'<div style = "-moz-column-count: 4;-moz-column-gap: 20px;-webkit-column-count: 4;-webkit-column-gap: 20px;column-count: 4;column-gap: 20px;">'
		."\n".implode("",$titles)
		.'</div>';

		
		$article->edit($txt,BootMsg."استخراج قائمة أكبر صفحات نقاش المستخدمين");
		
		$result->free();
    }
	else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}
/*****************************************************************************************************/
/*
استخراج قوائم لصفحات النقاش اليتيمة
*/
function extractOrphanedTalkPages(&$wiki,&$mysqli) {

$query =<<<QUERY
SELECT 
p1.page_title,p1.page_namespace
FROM page AS p1
WHERE 
p1.page_title NOT LIKE '%/%' 
and p1.page_is_redirect = 0
and p1.page_namespace in  (1,5,11,13,15,101,447,829,2301,2303 )
AND NOT EXISTS (SELECT 1
FROM page AS p2
WHERE p2.page_namespace = p1.page_namespace - 1
AND p1.page_title = p2.page_title)
QUERY;


$nstitles = array(
      //"ns-0"=>"(مقالات)",
      "ns-1"=>"نقاش",
      "ns-2"=>"مستخدم",
      "ns-3"=>"نقاش المستخدم",
      "ns-4"=>"ويكيبيديا",
      "ns-5"=>"نقاش ويكيبيديا",
      "ns-6"=>"ملف",
      "ns-7"=>"نقاش الملف",
      "ns-8"=>"ميدياويكي",
      "ns-9"=>"نقاش ميدياويكي",
      "ns-10"=>"قالب",
      "ns-11"=>"نقاش القالب",
      "ns-12"=>"مساعدة",
      "ns-13"=>"نقاش المساعدة",
      "ns-14"=>"تصنيف",
      "ns-15"=>"نقاش التصنيف",
      "ns-100"=>"بوابة",
      "ns-101"=>"نقاش البوابة",
      "ns-446"=>"برنامج التعليم",
      "ns-447"=>"نقاش برنامج التعليم",
      "ns-828"=>"وحدة",
      "ns-829"=>"نقاش الوحدة",
      "ns-2300"=>"إضافة",
      "ns-2301"=>"نقاش الإضافة",
      "ns-2302"=>"تعريف الإضافة",
      "ns-2303"=>"نقاش تعريف الإضافة",
      "ns-2600"=>"موضوع",
);

    cecho("\n\n[Running extractOrphanedTalkPages SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {
		$titles = array();
		while($d = $result->fetch_assoc()) {
			$titles[] = "\n# [[:".$nstitles['ns-'.$d['page_namespace']].":".str_replace('_',' ',$d['page_title'])."]]";	
		}
		$article = $wiki->initPage("ويكيبيديا:مشروع ويكي الصيانة/صفحات نقاش يتيمة");

		$txt = "\n<h4>آخر تحديث كان في {{تاريخ2|".date("Y-m-d")."|dmy}} ".date("H:i:s")." </h4>\n<hr>"
		.'<div style = "-moz-column-count: 2;-moz-column-gap: 20px;-webkit-column-count: 2;-webkit-column-gap: 20px;column-count: 2;column-gap: 20px;">'
		."\n".implode("",$titles)
		.'</div>';

		
		$article->edit($txt,BootMsg."استخراج قائمة صفحات النقاش يتيمة");
		
		$result->free();    
    } else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}
/*****************************************************************************************************/
/*
حذف  : [[تصنيف:أشخاص على قيد الحياة]] لشخص متوف
*/
function removeDeadsFromLivingPeopleCat(&$wiki,&$mysqli) {

$query =<<<QUERY
select 
  page.page_title
from page 
where page_namespace = 0 
and page_id in (select cl_from from categorylinks  where cl_to = 'أشخاص_على_قيد_الحياة') 
and page_id in (select cl_from from categorylinks  where cl_to like 'وفيات_%') 
and page_is_redirect = 0 
QUERY;
    cecho("\n\n[remove Deads From Living People Cat SQL : |INFO] \n $query \n\n");
    
    if ($result = $mysqli->query($query)) {

		while($d = $result->fetch_assoc()) {
			$title = str_replace('_',' ',$d['page_title']);
			echo "\n\t >>> * $title \n";
			$article = $wiki->initPage($title);

			$texte = $article->get_text();
			$texte = str_replace("\n[[تصنيف:أشخاص على قيد الحياة]]","",$texte);
			$comment = "حذف  : [[تصنيف:أشخاص على قيد الحياة]] لشخص متوف";
			$article->edit($texte,$comment);
		}
		$result->free();    
    } else {cecho("\n[SQL ERROR : $query |ERROR]"); }
}
/*****************************************************************************************************/

$wiki = Peachy::newWiki(null, 
	  /*Username*/ 'BotName'
	, /*password*/ 'BotPassword'
	, 'https://ar.wiki.x.io/w/api.php',);

$user='put_sql_username';
$password='put_sql_pasword';

$mysqli =new mysqli('arwiki.labsdb',$user,$password,'arwiki_p');

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

if(in_array(1,$argv)) { removeTPLs($wiki);}
if(in_array(2,$argv)) { removeUnCatFromCatPages($wiki,$mysqli);}
if(in_array(3,$argv)) { unmarkUnorphPage($wiki,$mysqli);}
if(in_array(4,$argv)) { markEmptyCattoRemove($wiki,$mysqli);      } 
if(in_array(5,$argv)) { markUnusedCat($wiki,$mysqli);      }
if(in_array(6,$argv)) { markOrphPages($wiki,$mysqli);  }
if(in_array(7,$argv)) { markUnusedFiles($wiki,$mysqli);  }
if(in_array(8,$argv)) { unmarkUsedFiles($wiki,$mysqli);  }
if(in_array(9,$argv)) { markUnCatPages($wiki,$mysqli);     }        
if(in_array(10,$argv)) { extractPagesList($wiki,$mysqli); }
if(in_array(11,$argv)) { extractCatList($wiki,$mysqli);    }         
if(in_array(12,$argv)) { extractLongUserTalkPages($wiki,$mysqli); }
if(in_array(13,$argv)) { extractOrphanedTalkPages($wiki,$mysqli); }
if(in_array(14,$argv)) { removeDeadsFromLivingPeopleCat($wiki,$mysqli); }
$mysqli->close();

/*****************************************************************************************************/