Jump to content
Wikipedia The Free Encyclopedia

User:Rick Bot/scripts/getadminactivity

From Wikipedia, the free encyclopedia
#!/bin/bash
WGET="/usr/bin/curl" # on a mac OS X
# WGET="wget -q -O -" # on a linux box with wget
# files 
ACTIVE="admins.active"
SEMIACTIVE="Semi-active"
INACTIVE="Inactive"
CONTRIBS=".contrib.times"
WPLA="wpla"
function prevmonth () {
 case 1ドル in
 January) echo "December";;
 February) echo "January";;
 March) echo "February";;
 April) echo "March";;
 May) echo "April";;
 June) echo "May";;
 July) echo "June";;
 August) echo "July";;
 September) echo "August";;
 October) echo "September";;
 November) echo "October";;
 December) echo "November";;
 esac
}
normalizedate() {
 # normalize from one of two forms
 # 2009年10月02日T02:20:26Z
 # 15:59, 13 September 2009
 if [ "1ドル" = "" ]; then
 echo
 fi
 if [ "1ドル" = "${1%Z}" ]; then
 echo 1ドル | cut -c8-
 else
 YEAR=`echo 1ドル | cut -c1-4`
 MONTHNUM=`echo 1ドル | cut -c6-7`
 DAY=`echo 1ドル | cut -c9-10`
 case $MONTHNUM in
 01) MONTH="January";;
 02) MONTH="February";;
 03) MONTH="March";;
 04) MONTH="April";;
 05) MONTH="May";;
 06) MONTH="June";;
 07) MONTH="July";;
 08) MONTH="August";;
 09) MONTH="September";;
 10) MONTH="October";;
 11) MONTH="November";;
 12) MONTH="December";;
 esac
 echo "${DAY#0} $MONTH $YEAR"
 fi
}
function inactive () {
 # 1ドル is day number of latest contrib
 # 2ドル is month of latest contrib
 # 3ドル is year of latest contrib
 # 4ドル - 6ドル are day, month, year for today
 
 # if fewer than 6 args, let's say inactive
 [ $# -lt 6 ] && return 0
 # if latest contrib is this month, not inactive
 [ 2ドル = 5ドル -a 3ドル = 6ドル ] && return 1
 # if latest contrib is last month, not inactive
 MONTH=`prevmonth 5ドル`
 YEAR=6ドル
 [ $MONTH = "December" ] && let YEAR=$YEAR-1
 [ 2ドル = $MONTH -a 3ドル = $YEAR ] && return 1
 # if latest contrib is two months ago, not inactive
 MONTH=`prevmonth $MONTH`
 [ $MONTH = "December" ] && let YEAR=$YEAR-1
 [ 2ドル = $MONTH -a 3ドル = $YEAR ] && return 1
 # if latest contrib is less than three months ago, not inactive
 MONTH=`prevmonth $MONTH`
 [ $MONTH = "December" ] && let YEAR=$YEAR-1
 [ 2ドル = $MONTH -a 3ドル = $YEAR -a 1ドル -gt 4ドル ] && return 1
 return 0
}
function semiactive () {
 # 1ドル is day number of 30th most recent contrib
 # 2ドル is month of 30th most recent contrib
 # 3ドル is year of 30th most recent contrib
 # 4ドル - 6ドル are day, month, year for today
 # if 30th most recent contrib is this month, not semi-active
 if [ 2ドル = 5ドル -a 3ドル = 6ドル ]; then
 return 1
 fi
 # if 30th most recent contrib is last month, not semi-active
 MONTH=`prevmonth 5ドル`
 YEAR=6ドル
 [ $MONTH = "December" ] && let YEAR=$YEAR-1
 [ 2ドル = $MONTH -a 3ドル = $YEAR ] && return 1
 # if 30th most recent contrib is less than two months ago, not semi-active
 MONTH=`prevmonth $MONTH`
 [ $MONTH = "December" ] && let YEAR=$YEAR-1
 [ 2ドル = $MONTH -a 3ドル = $YEAR -a 1ドル -gt 4ドル ] && return 1
 return 0
}
TODAY=`date +"%e %B %Y"`
rm -f $ACTIVE
rm -f $INACTIVE
rm -f $SEMIACTIVE
let n=1
./listusers sysop >sysops
# $WGET 'http://en.wikipedia.org/w/index.php?title=Special%3aListUsers&group=sysop&limit=3000' >sysops
SYSOPSIZE=`cat sysops | wc -c`
if [ $SYSOPSIZE -lt 5000 ]; then
 ./listusers sysop >sysops
 # $WGET 'http://en.wikipedia.org/w/index.php?title=Special%3aListUsers&group=sysop&limit=3000' >sysops
fi
SYSOPSIZE=`cat sysops | wc -c`
if [ $SYSOPSIZE -lt 5000 ]; then
 echo "Can't fetch sysop list!"
 exit 0
fi
# <li><a href="/wiki/User:A_Man_In_Black" title="User:A Man In Black">A Man In Black</a>
#<li><a href="/w/index.php?title=User:Woggly&action=edit&redlink=1" class="new" title="User:Woggly (page does not exist)">Woggly</a>
# cat sysops | sed 's;</a>;</a>\
# ;g' | grep -F "<li>" | sed 's/^.*<li>[^U]*User://' | sed 's/">.*//' | sed 's/.amp;action=edit.amp;redlink=1. class=.new//' | sed 's/ .page does not exist.$//' | while read line; do
cat sysops | while read line; do
 # line=`echo $line | sed 's/class="mw-redirect" //'`
 # urlname=${line%%\" title=\"User:*}
 # realname=${line##*\" title=\"User:}
 realname="$line"
 urlname=`./urlencode "$realname"`
 # skip Jeffrey O. Gustafson - by request, and Example
 if [ "$urlname" = "Jeffrey_O._Gustafson" -o "$urlname" = "Example" ]; then
 continue
 fi
 # figure out if user is active based on contribs we already know about
 if [ -s $CONTRIBS.$urlname ]; then
 echo $CONTRIBS.$urlname
 LATEST=`head -1 $CONTRIBS.$urlname`
 LATEST=`normalizedate "$LATEST"`
 THIRTIETH=`tail -1 $CONTRIBS.$urlname`
 THIRTIETH=`normalizedate "$THIRTIETH"`
 inactive $LATEST $TODAY 
 if [ $? -ne 0 ]; then
 # not inactive, how about semiactive?
 semiactive $THIRTIETH $TODAY
 if [ $? -ne 0 ]; then
 echo "# {{user3|$realname}}" >>$ACTIVE
 continue
 fi
 fi
 fi
 # get latest contribs
 let n=n+1
 if [ $n -ge 10 -a "1ドル" != "-" ]; then
 echo $realname
 sleep 10
 let n=1
 fi
 if [ "1ドル" != "-" -o ! -s $CONTRIBS.$urlname ]; then
 echo ./usercontribs "$urlname" timestamp
 ./usercontribs "$urlname" timestamp >$CONTRIBS.$urlname
 # echo $WGET "http://en.wikipedia.org/w/index.php?title=Special:Contributions&target=$urlname&limit=30" 
 # $WGET "http://en.wikipedia.org/w/index.php?title=Special:Contributions&target=$urlname&limit=30" | grep "<li cl[^>]*><a href" | sed -e 's/^<li[^>]*><a href[^>]*>//' -e 's/<.*//' >$CONTRIBS.$urlname
 fi
 LATEST=`head -1 $CONTRIBS.$urlname`
 LATEST=`normalizedate "$LATEST"`
 THIRTIETH=`tail -1 $CONTRIBS.$urlname`
 THIRTIETH=`normalizedate "$THIRTIETH"`
 
 # inactive if LATEST contrib not within last three months
 # semi-active if 30th most recent contrib is more than two months ago
 inactive $LATEST $TODAY 
 if [ $? -eq 0 ]; then
 case "$urlname" in
 Jasonr) echo "# {{user3|$realname}} - has administrator access for technical rather than administrative reasons. Works on hardware upgrades." >> $INACTIVE;;
 *) echo "# {{user3|$realname}} - $LATEST" >>$INACTIVE;;
 esac
 continue
 fi
 semiactive $THIRTIETH $TODAY
 if [ $? -eq 0 ]; then
 echo "# {{user3|$realname}}" >>$SEMIACTIVE
 else
 echo "# {{user3|$realname}}" >>$ACTIVE
 fi
done
# get the current contents of WP:LA
$WGET 'http://en.wikipedia.org/w/index.php?title=Wikipedia:List_of_administrators/A-F&action=raw' >$WPLA
echo >>$WPLA
cat $WPLA | sed -e '/^===#/,$d' >"A-F"
$WGET 'http://en.wikipedia.org/w/index.php?title=Wikipedia:List_of_administrators/G-O&action=raw' >>$WPLA
echo >>$WPLA
$WGET 'http://en.wikipedia.org/w/index.php?title=Wikipedia:List_of_administrators/P-Z&action=raw' >>$WPLA
echo >>$WPLA
$WGET 'http://en.wikipedia.org/w/index.php?title=Wikipedia:List_of_administrators/Semi-active&action=raw' >>$WPLA
egrep "^# {{user3.*<noinclude>" $WPLA >$WPLA.notes
# fix the format and sort order
sort -fd $ACTIVE >tmp.$ACTIVE
( cat $WPLA.notes ; echo "END OF NOTES"; grep "[|][^a-zA-Z]" tmp.$ACTIVE ; grep "[|][a-zA-Z]" tmp.$ACTIVE) | awk >$ACTIVE '
BEGIN {
 print "===#==="
 print "</noinclude>"
 nextletter = "A"
 alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ["
}
/END OF NOTES/ {
 noting=1
 next
}
{
 if (noting == 0) {
 admin = 0ドル
 sub("}} *<noinclude.*","}}",admin)
 notetext = 0ドル
 sub("^.*}} *<noinclude","<noinclude",notetext)
 note[admin] = " " notetext
 } else {
 if ( 0ドル ~ "^# {{user3.[" nextletter "-[]") {
 print "<noinclude>"
 print ""
 print "===" nextletter "==="
 print "</noinclude>"
 thisletter = substr(0,11,1ドル)
 while (thisletter != nextletter) {
 nextletter = substr(alphabet,index(alphabet,nextletter)+1,1)
 print "<noinclude>"
 print ""
 print "===" nextletter "==="
 print "</noinclude>"
 }
 nextletter = substr(alphabet,index(alphabet,nextletter)+1,1)
 }
 # add "1=" to template invocation for User:Until(1 == 2)
 if ( 0ドル ~ "=" ) {
 sub("user3.","user3|1=",0ドル)
 }
 print 0ドル note[0ドル]
 }
}'
# split into 3 sections
cp "A-F" "G-O"
cp "A-F" "P-Z"
cat $ACTIVE | sed -e '/^===G/,$d' | sed -e '$d' >>"A-F"
cat $ACTIVE | sed -n -e '/^===G/,$p' | sed -e '/^===P/,$d' | sed -e '$d' >>"G-O"
cat $ACTIVE | sed -n -e '/^===P/,$p' >>"P-Z"
sort -fd $SEMIACTIVE >tmp.$SEMIACTIVE
cat <<% >$SEMIACTIVE
{| id="toc" class="toc" summary="Contents"
! {{MediaWiki:Toc}}:
|<center>[[Wikipedia:List of administrators/A-F##|#]] [[Wikipedia:List of administrators/A-F#A|A]] [[Wikipedia:List of administrators/A-F#B|B]]
[[Wikipedia:List of administrators/A-F#C|C]] [[Wikipedia:List of administrators/A-F#D|D]] [[Wikipedia:List of administrators/A-F#E|E]] [[Wikipedia:List of administrators/A-F#F|F]] [[Wikipedia:List of administrators/G-O#G|G]] [[Wikipedia:List of administrators/G-O#H|H]] [[Wikipedia:List of administrators/G-O#I|I]] [[Wikipedia:List of administrators/G-O#J|J]] [[Wikipedia:List of administrators/G-O#K|K]] [[Wikipedia:List of administrators/G-O#L|L]] [[Wikipedia:List of administrators/G-O#M|M]] [[Wikipedia:List of administrators/G-O#N|N]] [[Wikipedia:List of administrators/G-O#O|O]] [[Wikipedia:List of administrators/P-Z#P|P]] [[Wikipedia:List of administrators/P-Z#Q|Q]] [[Wikipedia:List of administrators/P-Z#R|R]] [[Wikipedia:List of administrators/P-Z#S|S]] [[Wikipedia:List of administrators/P-Z#T|T]] [[Wikipedia:List of administrators/P-Z#U|U]] [[Wikipedia:List of administrators/P-Z#V|V]] [[Wikipedia:List of administrators/P-Z#W|W]] [[Wikipedia:List of administrators/P-Z#X|X]] [[Wikipedia:List of administrators/P-Z#Y|Y]] [[Wikipedia:List of administrators/P-Z#Z|Z]] • [[Wikipedia:List of administrators/Semi-active|Semi-active]] • [[Wikipedia:List of administrators/Inactive|Inactive]]</center>
|}
{{Clear}}
''These administrators have made fewer than 30 edits in the last 2 months but at least one edit in the last 3 months.''
%
( cat $WPLA.notes ; echo "END OF NOTES"; grep "[|][^a-zA-Z]" tmp.$SEMIACTIVE ; grep "[|][a-zA-Z]" tmp.$SEMIACTIVE ) | awk >>$SEMIACTIVE '
/END OF NOTES/ {
 noting=1
 next
}
{
 if (noting == 0) {
 admin = 0ドル
 sub("}} *<noinclude.*","}}",admin)
 notetext = 0ドル
 sub("^.*}} *<noinclude","<noinclude",notetext)
 note[admin] = " " notetext
 } else {
 # add "1=" to template invocation for User:Until(1 == 2)
 if ( 0ドル ~ "=" ) {
 sub("user3.","admin|1=",0ドル)
 }
 print 0ドル note[0ドル]
 }
}'
cat <<% >tmp.$INACTIVE
{| id="toc" class="toc" summary="Contents"
! {{MediaWiki:Toc}}:
|<center>[[Wikipedia:List of administrators/A-F##|#]] [[Wikipedia:List of administrators/A-F#A|A]] [[Wikipedia:List of administrators/A-F#B|B]]
[[Wikipedia:List of administrators/A-F#C|C]] [[Wikipedia:List of administrators/A-F#D|D]] [[Wikipedia:List of administrators/A-F#E|E]] [[Wikipedia:List of administrators/A-F#F|F]] [[Wikipedia:List of administrators/G-O#G|G]] [[Wikipedia:List of administrators/G-O#H|H]] [[Wikipedia:List of administrators/G-O#I|I]] [[Wikipedia:List of administrators/G-O#J|J]] [[Wikipedia:List of administrators/G-O#K|K]] [[Wikipedia:List of administrators/G-O#L|L]] [[Wikipedia:List of administrators/G-O#M|M]] [[Wikipedia:List of administrators/G-O#N|N]] [[Wikipedia:List of administrators/G-O#O|O]] [[Wikipedia:List of administrators/P-Z#P|P]] [[Wikipedia:List of administrators/P-Z#Q|Q]] [[Wikipedia:List of administrators/P-Z#R|R]] [[Wikipedia:List of administrators/P-Z#S|S]] [[Wikipedia:List of administrators/P-Z#T|T]] [[Wikipedia:List of administrators/P-Z#U|U]] [[Wikipedia:List of administrators/P-Z#V|V]] [[Wikipedia:List of administrators/P-Z#W|W]] [[Wikipedia:List of administrators/P-Z#X|X]] [[Wikipedia:List of administrators/P-Z#Y|Y]] [[Wikipedia:List of administrators/P-Z#Z|Z]] • [[Wikipedia:List of administrators/Semi-active|Semi-active]] • [[Wikipedia:List of administrators/Inactive|Inactive]]</center>
|}
''Administrators who have not edited in at least 3 months, sorted by length of inactivity:''
%
grep "Jasonr}}" $INACTIVE >>tmp.$INACTIVE
if [ $? -eq 0 ]; then
 echo "#: " >>tmp.$INACTIVE
fi
THISYEAR=`date +%Y`
let year=2001
while [ $year -lt $THISYEAR ]; do
 let year=$year+1
 egrep "$year$" $INACTIVE | awk >>tmp.$INACTIVE '
{
 monthday = $(NF-1) $(NF-2)
 if (inactive[monthday] == "") {
 inactive[monthday] = 0ドル
 } else {
 inactive[monthday] = inactive[monthday] "\n" 0ドル
 }
}
END {
 months[1] = "January"
 months[2] = "February"
 months[3] = "March"
 months[4] = "April"
 months[5] = "May"
 months[6] = "June"
 months[7] = "July"
 months[8] = "August"
 months[9] = "September"
 months[10] = "October"
 months[11] = "November"
 months[12] = "December"
 for (month=1; month<=12; month=month+1) {
 for (day=1; day<=31; day=day+1) {
 if (inactive[months[month] day] != "") {
 if (inactive[months[month] day] ~ "=") {
 gsub("user3.","user3|1=",inactive[months[month] day])
 }
 print inactive[months[month] day]
 }
 }
 }
}
'
 if [ $year -lt $THISYEAR ]; then
 echo "#: " >>tmp.$INACTIVE
 fi
done
cat >>tmp.$INACTIVE <<!
<!-- Do not add admins to the inactive list who have just recently announced their departure. It is not uncommon for users to change their mind. This list is not intended to track every temporary absence from activity. Wait until they haven't edited for a month before adding them here. -->
!
cp tmp.$INACTIVE $INACTIVE
$WGET 'http://en.wikipedia.org/w/index.php?title=Wikipedia:List_of_administrators&action=raw' >LA
NUMACTIVE=`cat A-F G-O P-Z | grep "^# ..user3" | wc -l`
NUMACTIVE=`expr $NUMACTIVE`
DATE=`date +"%Y-%m-%d"`
cat LA | sed -e "s/[0-9]* of them active (as of .*)/$NUMACTIVE of them active (as of [[$DATE]])/" -e "s/last checked on .*[.]/last checked on [[$DATE]]./" >LA.new
echo $NUMACTIVE >LA.active
NUMSEMIACTIVE=`cat Semi-active | grep "^# ..user3" | wc -l`
NUMSEMIACTIVE=`expr $NUMSEMIACTIVE`
echo $NUMSEMIACTIVE >Semi-active.count
NUMINACTIVE=`cat Inactive | grep "^# ..user3" | wc -l`
NUMINACTIVE=`expr $NUMINACTIVE`
echo $NUMINACTIVE >Inactive.count

AltStyle によって変換されたページ (->オリジナル) /