Utente:DonPaolo/LastContrib.sh

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca

#!/bin/sh	

PATH="/bin:/usr/bin"

# get the program name
PROGRAMNAME=`echo $0| tr \/ \\\n |tail -n 1`
VERSION=1.2.6
LASTEDITDATE="7/10/2006"

USAGE="$PROGRAMNAME v. $VERSION ($LASTEDITDATE)
Copyright   Paolo Benvenuto (donpaolo@gsi.it)
Credits to  Ivan Vighetto (Sbisolo), HelLViS69, Marco D'Itri
License     GPL

A program that retrieves from it.wikipedia.org and writes to standard output or sends to an e-mail address
the last contribution date of one or more it.wiki users.

* Invoked without args, it asks for one or more it.wiki user(s) and returns his/her/their last contribution date
* Invoked with one or more users, it returns the corresponding dates of last contribution

Usage: $PROGRAMNAME { -f file } { -m e-mail-address } { -a | -d | -u } { -r } { -h } { it.wiki-user }..

Switches:
	-a, --sort-alfa                 sort results alfabetically
	-d, --sort-date                 sort results according to date
	-f <file>, --file <file>        returns last contribution dates of the users specified in <file>
	-h, --help                      help
	-m <address>, --mail <address>  mail results to <address> instead of sending it to standard output
	--sort-no-reverse	             sort results normal (no reverse) order
	-r, --sort-reverse             sort results reverse order
	-u, --unsorted                 do not sort results (default)

You can mix one or more user names with one or more files, in any order.

User names' first letter is case insensitive (as in wikipedia), and is presented upper case.

Removes leading and trailing spaces from usernames; removes duplicates user names and void lines."

# TODO: permit selecting another wikipedia: needs changing the way months are converted to numbers

# The file where the user names are temporarily stored
USERLISTFILE="/tmp/LastContrib.list"
if [ -e "$USERLISTFILE" ] ; then
	rm "$USERLISTFILE"
fi
touch "$USERLISTFILE"

# The file where the temp results are stored
RESULTFILE="/tmp/LastContrib.result"
if [ -e "$RESULTFILE" ] ; then
	rm "$RESULTFILE"
fi
touch "$RESULTFILE"

SORT=unsorted
SORTMODE=normal


while [ $# -gt 0 ] ; do
    case "$1" in
    -a | --sort-alfa )
    	SORT=alfa
	shift
	;;
    -d | --sort-date )
    	SORT=date
	shift
	;;
    -f | --file )			# next parameter is the file with the USERNAME, one for line
        shift
	if [ $# -eq 0 ] ; then 
		echo "Missing file after -f switch, ignoring -f"
	elif [ ! -e $1 ] ; then
		echo "Unexistent file" $1 ": ignoring it"
	else
		cat $1 >> "$USERLISTFILE"
	fi
	shift
        ;;
    -h | --help )
    	echo "$USAGE"
	exit 0
	;;
    -m | --mail )
    	shift
	if [ $# -eq 0 ] ; then 
		echo "Missing parameter after -m switch, ignoring -m"
	else
		MAIL=$1
	fi
	shift
	;;
    --sort-no-reverse )
    	SORTMODE=normal
	shift
	;;
    -r | --sort-reverse )
    	SORTMODE=reverse
	shift
	;;
    -u | --unsorted )
    	SORT=unsorted
	shift
	;;
    -*)
    	echo >&2 "=========> Unrecognized option $1"
	echo
	echo "$USAGE"
	exit 1
	;;
    *)				# One or more USERNAME
	echo $1 >> "$USERLISTFILE"
	shift
        ;;
    esac
done

# The script is invoked with no command-line args: ask for one or more it.wiki user
if [ ! -s "$USERLISTFILE" ] ; then 	
	echo "This program retrieves the date of the last contribution to it.wiki of its users."
	echo "Enter one or more it.wiki users."
	echo "You can separate them with <RETURN>. Hit ctl-d to end."
	echo -n "User(s): "
	cat < /dev/stdin >> "$USERLISTFILE"
fi  

# removing initial and final spaces and void lines
cp "$USERLISTFILE" "$USERLISTFILE".tmp
cat "$USERLISTFILE".tmp | sed 's/^ *//' | sed 's/ *$//' | sed '/^$/ d' > "$USERLISTFILE"

# removing 
cp "$USERLISTFILE" "$USERLISTFILE".tmp
cat "$USERLISTFILE".tmp > "$USERLISTFILE"

# changing internal spaces to undescores
while ( grep \   "$USERLISTFILE" > /dev/null )  ; do 
	cp "$USERLISTFILE" "$USERLISTFILE".tmp
	cat "$USERLISTFILE".tmp | sed 's/ /_/' > "$USERLISTFILE"
done

# 1st letter case upper case (in wikipedia it's case insensitive, and is represented upper case) - perl code kindly contributed by Marco D'Itri
cp "$USERLISTFILE" "$USERLISTFILE".tmp
cat "$USERLISTFILE".tmp | perl -npe 's/^(.)/uc($1)/e'  > "$USERLISTFILE"

# remove duplicate users preserving order
cp "$USERLISTFILE" "$USERLISTFILE".tmp
nl "$USERLISTFILE".tmp | sort -k2 | uniq -f1| sort | cut -f2 > "$USERLISTFILE"

# Calculates the number of users

NLINES=`wc -l "$USERLISTFILE"  |cut -d " " -f1`

echo -n "Retrieving last contribution date for $NLINES it.wiki user name"
if [ "$NLINES" = 1 ] ; then
	echo ": "
else
	echo "s: "
fi

# loop on the usernames

for I in `seq 1 "$NLINES"`; do

	# print the advancing indicator to screen
	if [ "$I" -lt 10 ] ; then
		echo -n " "
	fi
	echo -n "$I "

	# get the i-th USERNAME
	USERNAME=`head -n "$I" "$USERLISTFILE" | tail -n 1`

	# get the corresponding last contribution date in italian
	DATATMP=`wget -O - "http://it.wikipedia.org/w/index.php?title=Speciale:Contributions&limit=1&target=$USERNAME" 2> /dev/null |grep \<li\> | head -1 | sed 's/<li>//' | sed 's/ (.*//'`
	
	# DATATMP format is for it.wiki "22:16, 29 lug 2006"
 
	HOUR=`echo "$DATATMP" | cut -d',' -f1`
	DAY=`echo "$DATATMP" | cut -d' ' -f2`
	MONTHTMP=`echo "$DATATMP" | cut -d' ' -f3`
	YEAR=`echo "$DATATMP" | cut -d' ' -f4`
 
	UNEXISTENTUSER=no
	# we need converting months to numbers because date -d doesn't accept argument in a locale different from C
	case "$MONTHTMP" in
	    gen) MONTH="01" ;;
	    feb) MONTH="02" ;;
	    mar) MONTH="03" ;;
	    apr) MONTH="04" ;;
	    mag) MONTH="05" ;;
	    giu) MONTH="06" ;;
	    lug) MONTH="07" ;;
	    ago) MONTH="08" ;;
	    set) MONTH="09" ;;
	    ott) MONTH="10" ;;
	    nov) MONTH="11" ;;
	    dic) MONTH="12" ;;
	    # if the month isn't recognized, then the server answered "unexistent user"
	    *) UNEXISTENTUSER=yes
	esac
	
	# fill with an initial 0 if day<10
	if [ ${#DAY} = 1 ] ; then
		DAY=0"$DAY"
	fi
	
	DATE="$YEAR$MONTH$DAY $HOUR"

	# write the date and the user name to the temporaly result file
	if [ "$UNEXISTENTUSER" = "yes" ] ; then
		echo "Unexistent user      $USERNAME" >> "$RESULTFILE"
	else
		echo "`date -d "$DATE" +%F` `date -d "$DATE" +%H:%M:%S`  $USERNAME" >> "$RESULTFILE"
	fi
		
	# lacking control on $I multiple of 10 (one space more)
	if ( echo "$I" | grep 0$  > /dev/null ) ; then
		echo
	fi
done

echo "done!"

# sort the results
cp "$RESULTFILE" "$RESULTFILE".tmp

if [ "$SORT" = "date" -a "$SORTMODE" = "normal" ] ; then
	sort -f "$RESULTFILE".tmp > "$RESULTFILE"
elif [ "$SORT" = "date" -a "$SORTMODE" = "reverse" ] ; then
	sort -f -r "$RESULTFILE".tmp > "$RESULTFILE"
elif  [ "$SORT" = "alfa" -a "$SORTMODE" = "normal" ] ; then
	sort -f -k3 "$RESULTFILE".tmp > "$RESULTFILE"
elif  [ "$SORT" = "alfa" -a "$SORTMODE" = "reverse" ] ; then
	sort -f -k3 -r "$RESULTFILE".tmp > "$RESULTFILE"
fi

# add line numbers
cp "$RESULTFILE" "$RESULTFILE".tmp
nl "$RESULTFILE".tmp > "$RESULTFILE"

# mail the result if requested, otherwise output it to standard output
if [ "$MAIL" ] ; then
	cat "$RESULTFILE" | mail -s "it.wiki Last contribution dates" "$MAIL" && echo "Sent result mail to $MAIL"
else
	cat "$RESULTFILE"
fi

exit 0