#!/bin/bash
#
#####################################################################
#
# This script converts a LICQ user database into a Trillian
# user buddies.xml file
#
####################################################################
#
# You might want to adjust the default group name, as well as the
# replacements (sed-batchfile) to fit your needs.
#
# by default a file named buddies.xml is generated in your current
# directory. If one is already present, it will be overwritten!
# Just replace your buddies.xml on your trillian machine
# and you're all set.
#
####################################################################

# Licq Dirs -- change if applicable

LICQ_DIR=$HOME/.licq/
LICQ_USER_DIR=${LICQ_DIR}users/

# Licq Files -- change if applicable

LICQ_CONF=$LICQ_DIR/licq.conf
# LICQ_USERS=$LICQ_DIR/users.conf

# output file
OUT_FILE="buddies.xml"

#Default Group for users that don't belong to a group
GRUPPEN[0]="Andere user"

#Filename for a temporary sed batch-file
SED_TMP=sed.tmp

#generate sed batchfile for stripping leading blanks and replacing Umlauts in Alias-names
#
# adjust for special Characters in your language
#
echo "s/^ *//"    > $SED_TMP  #leading blanks
echo "s/Ä/%C4/g" >> $SED_TMP  #Ä
echo "s/Ö/%D6/g" >> $SED_TMP  #Ö
echo "s/Ü/%DC/g" >> $SED_TMP  #Ü
echo "s/ä/%E4/g" >> $SED_TMP  #ä
echo "s/ö/%F6/g" >> $SED_TMP  #ö
echo "s/ü/%FC/g" >> $SED_TMP  #ü

GROUP_COUNT=`awk -F = '/NumOfGroups/ {printf "%i",$2}' < $LICQ_CONF`

echo "Parsing Group Names"

#Parsing group names into Array
for ((j=1;$j<=$GROUP_COUNT;j++))
do
	GRUPPEN[$j]="`cat $LICQ_CONF | grep Group$j\.name | awk -F = '{ print $2 }' | sed "s/^ *//"`"
done


echo "Analyzing Group Memberships"

#Determine group memberships
for DATEI in `ls -1 $LICQ_USER_DIR/*`
do
	DAT=`basename "$DATEI"`

	#is user on ignore list? -- don't add
	SYSTEM_GROUP=`cat $DATEI | awk -F = '/Groups\.System/ {print $2}'`
	if  ([ -n "$SYSTEM_GROUP" ] && ! [ $SYSTEM_GROUP -eq 8 ])
	then

		#determine group membership
		GROUP_CODE=`cat $DATEI | awk -F = '/Groups\.User/ {print $2}' | sed "s/^ *//"`
		if ([ -z "$GROUP_CODE" ] || [ "$GROUP_CODE" -eq 0 ] )
		then
			MEMBERS[0]=`echo "${MEMBERS[0]} $DAT"`
		else
			for ((j=0;$j<=$GROUP_COUNT;j++))
			do
				TEST_GROUP=$((2**($GROUP_COUNT - $j) ))
				TEST_ERG=$(( $GROUP_CODE / $TEST_GROUP ))
				if [ $TEST_ERG -eq 1 ]
				then
					#member of group group_count - j + 1
					GROUP_NUM=$(($GROUP_COUNT - $j + 1))
					MEMBERS[$GROUP_NUM]=`echo "${MEMBERS[$GROUP_NUM]} $DAT"`
					if [ ! $TEST_GROUP -eq 1 ]
					then
						GROUP_CODE=$(($GROUP_CODE % $TEST_GROUP ))
					fi
				fi
			done
		fi
	fi
done

echo "Writing File Header"

#old output file will be overwritten!!!
#Write Header

echo "<?xml version=\"1.0\"?>" > $OUT_FILE
echo "<!DOCTYPE buddies">> $OUT_FILE
echo "     PUBLIC \"-//IETF//DTD RFCxxxx XBUDDY 1.0 //EN\" \"xbuddy.dtd\">" >> $OUT_FILE
echo >> $OUT_FILE
echo "<!-- some warning from Trillian here :-) -->" >> $OUT_FILE
echo >> $OUT_FILE

#End of Header

echo "Writing Data"

#genereate entries in OUT_FILE

echo "<buddies>" >> $OUT_FILE
echo "  <title>Buddies for Trillian User</title>" >> $OUT_FILE
echo "  <version>1.2</version>" >> $OUT_FILE

TMP=0
for ((COUNT=1;$COUNT <= $GROUP_COUNT; COUNT++))
do
	echo "Adding Group ${GRUPPEN[$COUNT]}"
	echo "    <group expanded=\"1\">" >> $OUT_FILE
	echo "      <title>${GRUPPEN[$COUNT]}</title>" >> $OUT_FILE

	for BUDDY in ${MEMBERS[$COUNT]}
	do
		TMP=$(($TMP + 1))
		#add entries for buddies
		UIN=`basename "$BUDDY" ".Licq"`
		ALIAS=`awk -F = '/^Alias\ / {print $2}' < $LICQ_USER_DIR/$BUDDY | sed -f $SED_TMP`
		echo "adding buddy $ALIAS ($UIN)"
		echo "        <buddy uri=\"ICQ:1%3A${UIN}%3A${ALIAS}\">${ALIAS}</buddy>"  >> $OUT_FILE

	done
	echo "    </group>" >> $OUT_FILE
done

COUNT=0
#Lets add the default group last :-)
echo "Adding Group ${GRUPPEN[$COUNT]}"
echo "    <group expanded=\"1\">" >> $OUT_FILE
echo "      <title>${GRUPPEN[$COUNT]}</title>" >> $OUT_FILE

for BUDDY in ${MEMBERS[$COUNT]}
do
	TMP=$(($TMP + 1))
	#add entries for buddies
	UIN=`basename "$BUDDY" ".Licq"`
	ALIAS=`awk -F = '/^Alias\ / {print $2}' < $LICQ_USER_DIR/$BUDDY | sed -f $SED_TMP`
	echo "adding buddy $ALIAS ($UIN)"
	echo "        <buddy uri=\"ICQ:1%3A${UIN}%3A${ALIAS}\">${ALIAS}</buddy>"  >> $OUT_FILE
done
echo "    </group>" >> $OUT_FILE
echo "</buddies>" >> $OUT_FILE

rm -f $SED_TMP

echo "added $TMP Buddies"