User:Rick Bot/scripts/gethopefuls

#!/bin/bash

WGET="/usr/bin/curl"  # on a mac OS X
# WGET="wget -q -O -"   # on a linux box with wget

# files 
ACTIVE="hopeful.active"
SEMIACTIVE="hopeful.semi-active"
INACTIVE="hopeful.inactive"
CONTRIBS=".contrib.times"
ALLRFAS="rfas"
RFAS=".rfas"
WPHopefuls="wphopefuls"

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
}

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 no contribs, arg count is not 6
  [ $# -ne 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
./listcat Wikipedia_administrator_hopefuls | grep "^User" >hopefuls
HOPEFULSSIZE=`cat hopefuls | wc -l`
if [ $HOPEFULSSIZE -lt 500 ]; then
  ./listcat Wikipedia_administrator_hopefuls | grep "^User" >hopefuls
fi

HOPEFULSSIZE=`cat hopefuls | wc -l`
if [ $HOPEFULSSIZE -lt 500 ]; then
  echo "Can't fetch hopefuls list!"
  exit 0
fi

# make a list of current admins
> alreadyadmins
cat ../Admins/A* ../Admins/G* ../Admins/P* ../Admins/Semi-active ../Admins/Inactive | grep "# {{user3" | sed -e "s/# {{user3.//" -e "s/}}.*//" >adminlist
LINES=`cat adminlist | wc -l`
LINES=`expr $LINES`
if [ "$LINES" -lt 1000 ]; then
  echo "Don't have good list of admins"
  exit 0
fi


# get a list of all RFAs
./getallpages "Requests_for_adminship" 4 >$ALLRFAS
LINES=`cat $ALLRFAS | wc -l`
LINES=`expr $LINES`
if [ "$LINES" -lt 3000 ]; then
  ./getallpages "Requests_for_adminship" 4 >$ALLRFAS
  LINES=`cat $ALLRFAS | wc -l`
  LINES=`expr $LINES`
  if [ "$LINES" -lt 2000 ]; then
    echo "Problem fetching RFAs" >&2
    exit
  fi
fi

last=""
cat hopefuls | while read line; do

  realname="${line##User:}"
  realname="${realname##User talk:}"
  realname="${realname%%/*}"
  if [ "$realname" = "$last" ]; then
    continue
  fi

  last="$realname"
  urlname=`./urlencode "$realname"`

  grep "^$realname$" adminlist >/dev/null
  if [ $? -eq 0 ]; then
    echo "* {{admin|" $realname "}}" >>alreadyadmins
    continue
  fi

  # echo $realname
  # echo $urlname

  # get previous RFAs
  if [ "$1" != "-" -o ! -f "$RFAS.$urlname" ]; then
    cat $ALLRFAS | egrep "/$realname[ 0-9]*$" >$RFAS.$urlname
  fi

  # figure  out if user is active based on contribs we already know about
  if [ -s $CONTRIBS.$urlname ]; then
    LATEST=`head -1 $CONTRIBS.$urlname | cut -c8-`
    THIRTIETH=`tail -1 $CONTRIBS.$urlname | cut -c8-`
    inactive $LATEST $TODAY 
    if [ $? -ne 0 ]; then
      # not inactive, how about semiactive?
      semiactive $THIRTIETH $TODAY
      if [ $? -ne 0 ]; then
        if [ ! -s "$CONTRIBS.$urlname.earliest" ]; then
          $WGET "http://en.wiki.x.io/w/index.php?title=Special:Contributions&target=$urlname&limit=30&dir=prev" | grep "<li cl[^>]*><a href" | sed -e 's/^<li[^>]*><a href[^>]*>//' -e 's/<.*//' >$CONTRIBS.$urlname.earliest
        fi
        EARLIEST=`tail -1 $CONTRIBS.$urlname.earliest | cut -c8-`
        echo "$realname || $EARLIEST" >>$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 $WGET "http://en.wiki.x.io/w/index.php?title=Special:Contributions&target=$urlname&limit=30" 
    $WGET "http://en.wiki.x.io/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 | cut -c8-`
  THIRTIETH=`tail -1 $CONTRIBS.$urlname | cut -c8-`

  if [ ! -s "$CONTRIBS.$urlname.earliest" ]; then
    $WGET "http://en.wiki.x.io/w/index.php?title=Special:Contributions&target=$urlname&limit=30&dir=prev" | grep "<li cl[^>]*><a href" | sed -e 's/^<li[^>]*><a href[^>]*>//' -e 's/<.*//' >$CONTRIBS.$urlname.earliest
  fi
  EARLIEST=`tail -1 $CONTRIBS.$urlname.earliest | cut -c8-`
  
  # 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
      *) echo "$realname || $LATEST" >>$INACTIVE;;
    esac
    continue
  fi
  semiactive $THIRTIETH $TODAY
  if [ $? -eq 0 ]; then
    echo "$realname || $LATEST" >>$SEMIACTIVE
  else
    echo "$realname || $EARLIEST" >>$ACTIVE
  fi
done

# fix the format and sort order
sort -fdu $ACTIVE >tmp.$ACTIVE

( grep "[|][^a-zA-Z]" tmp.$ACTIVE ; grep "[|][a-zA-Z]" tmp.$ACTIVE) | awk >$ACTIVE '

BEGIN {
  FS=" \\|\\| "
  monthabbr["January"] = "Jan"
  monthabbr["February"] = "Feb"
  monthabbr["March"] = "Mar"
  monthabbr["April"] = "Apr"
  monthabbr["May"] = "May"
  monthabbr["June"] = "Jun"
  monthabbr["July"] = "Jul"
  monthabbr["August"] = "Aug"
  monthabbr["September"] = "Sep"
  monthabbr["October"] = "Oct"
  monthabbr["November"] = "Nov"
  monthabbr["December"] = "Dec"
}

{
  # add "1=" to template invocation for User:Until(1 == 2)
  if ( $0 ~ "=" ) {
     sub("user.","user|1=",$0)
  }
  print "|-"
  split($2,date," ")
  if (date[1] < 10 ) {
    date[1] = "0" date[1]
  }
  printf ("%s",  "| {{user20|" $1 "}} || " date[1]  "-" monthabbr[date[2]] "-" date[3] " ||" )
  rfanum = 1
  rfafile = ".rfas." $1
  rfa=""
  getline rfa < rfafile
  while (rfa != "") {
    printf ("%s"," [[" rfa "|" rfanum "]]" )
    rfa=""
    getline rfa <rfafile
    rfanum = rfanum + 1
  }
  close(rfafile)
  printf "\n"
}'

# fix the format and sort order
sort -fdu $INACTIVE $SEMIACTIVE >tmp.$INACTIVE

( grep "[|][^a-zA-Z]" tmp.$INACTIVE ; grep "[|][a-zA-Z]" tmp.$INACTIVE) | awk >$INACTIVE '

BEGIN {
  FS=" \\|\\| "
  monthabbr["January"] = "Jan"
  monthabbr["February"] = "Feb"
  monthabbr["March"] = "Mar"
  monthabbr["April"] = "Apr"
  monthabbr["May"] = "May"
  monthabbr["June"] = "Jun"
  monthabbr["July"] = "Jul"
  monthabbr["August"] = "Aug"
  monthabbr["September"] = "Sep"
  monthabbr["October"] = "Oct"
  monthabbr["November"] = "Nov"
  monthabbr["December"] = "Dec"
}

{
   # add "1=" to template invocation for User:Until(1 == 2)
   if ( $0 ~ "=" ) {
      sub("user.","user|1=",$0)
   }
   print "|-"
   if ( $2 == "" ) {
     print "| {{user20|" $1 "}} || No edits ||"
   } else {
     split($2,date," ")
     if (date[1] < 10 ) {
       date[1] = "0" date[1]
     }
     printf ("%s",  "| {{user20|" $1 "}} || " date[1]  "-" monthabbr[date[2]] "-" date[3] " ||" )
     rfanum = 1
     rfafile = ".rfas." $1
     rfa=""
     getline rfa < rfafile
     while (rfa != "") {
       printf ("%s"," [[" rfa "|" rfanum "]]" )
       rfa=""
       getline rfa <rfafile
       rfanum = rfanum + 1
     }
    close(rfafile)
    printf "\n"
  }
}'

# get the current contents of WP:admin_hopefuls
$WGET 'http://en.wiki.x.io/w/index.php?title=Wikipedia:List_of_administrator_hopefuls&action=raw' >$WPHopefuls
echo >>$WPHopefuls

# remove dups from alreadyadmins
sort -fdu alreadyadmins  >tmp.alreadyadmins
mv tmp.alreadyadmins alreadyadmins

awk <$WPHopefuls >tmp.$WPHopefuls '

/^== / {
  skip = 0
  if (file == "") {
    file = "hopeful.active"
  } else if (file == "hopeful.active") {
    file = "hopeful.inactive"
  } else {
    file = "alreadyadmins"
  }
}

/^== Users who are already/ {
  print $0
  skip = 1
  next
}

/^[{][|]/ {
  print $0

  # next line should be "|-"
  getline
  print $0
  
  # next line is the table header
  getline
  print $0

  skip = 1
  next
}

/^[|]}/ {
  skip = 0
  # and now print the table contents
  while ( ( getline <file ) > 0 ) {
    print $0
  }
  print "|}"
  next
}

/^[|*]/ {
  if (skip == 1) {
    next
  }
}

/^None./ {
  if (skip == 1) {
    next
  }
}

{
  if (skip == 1) {
    skip = 0
    line = $0
    if (file == "alreadyadmins") {
      none="None."
      while ( ( getline <file ) > 0 ) {
        none=""
        print $0
      }
      if (none == "None.") {
        print "None."
      }
    }
    $0 = line
    
  }
  print $0
}
'