#!/bin/bash
#
#############################################################
#
# Converts a Trillian Contact List into a Licq contact list
#
# only the icq-part, of course
#
##############################################################
#
# You need to have a working licq.conf in your LICQ_DIR
#
# All old group/User information already in Licq will be lost!
#
# Back up your licq dir before using this tool!
#
##############################################################
#
# Written by Steffen Stein
#
#############################################################

# your buddies file from Trillian
# usually located in c:\program files\Trillian\default\
SOURCE_FILE="buddies.xml"

# Licq default $HOME/.licq
LICQ_DIR="$HOME/licq_tmp"
LICQ_USER_DIR="$LICQ_DIR/users"
LICQ_CONF="$LICQ_DIR/licq.conf"

CONTACT_COUNT=`cat $SOURCE_FILE | grep buddy | grep ICQ | wc -l`


# Some checks to start with
if ! [ -d $LICQ_DIR ]
then
	echo "Licq Directory not found!!"
	echo "either update LICQ_DIR in this file or prepare $LICQ_DIR with a working licq.conf"
	exit 1
fi

if ! [ -f $LICQ_CONF ]
then
	echo "You need to have a working licq.conf in $LICQ_DIR!"
	exit 1
fi

if ! [ -d $LICQ_USER_DIR ]
then
	mkdir $LICQ_USER_DIR
fi


echo "Writing users.conf"

#write users.conf
echo "[users]" > "$LICQ_DIR/users.conf"
echo "NumOfUsers = $CONTACT_COUNT" >> "$LICQ_DIR/users.conf"

I=1;
for UIN in `cat $SOURCE_FILE | grep buddy | grep ICQ | awk -F ">" '{print $1}' \
		| sed  "s/^[^%3A]*%3A//" | sed "s/%3A.*$//"`
do
	echo "User$I = $UIN.Licq" >> "$LICQ_DIR/users.conf"
	I=$(($I+1))
done

# edit licq.conf -> remove groups section and replace by new one

echo "Initializing groups in $LICQ_CONF"

#remove old groups part (lets hope there is a blank line afterwards!)
sed "/^\[groups\]$/,/^$/d" $LICQ_CONF > $LICQ_CONF.2
mv $LICQ_CONF.2 $LICQ_CONF # the one not so good thing in sed....

#make new groups section
echo >> $LICQ_CONF
echo [groups] >> $LICQ_CONF
echo "NumOfGroups = `cat $SOURCE_FILE | grep group -A 2 | grep title | wc -l`" >> $LICQ_CONF
echo "DefaultGroup = 0" >> $LICQ_CONF
echo "NewUserGroup = 0"  >> $LICQ_CONF

#sorry blanks become underscores :( don't know how to do it better.
NUM=1
for GROUP in `cat $SOURCE_FILE | grep "[G,g][R,r][O,o][U,u][P,p]" -A 2 | grep "[T,t][I,i][T,t][L,l][E,e]" | sed -e "s/<[^>]*>//g" -e "s/^ *//" -e "s/ /_/g"`
do
  echo "Group$NUM.name = $GROUP" >> $LICQ_CONF
  NUM=$(($NUM + 1))
done

NUM_BUD=0
UPD_BUD=0

echo "Adding/Updating Buddies"

for ((j=1;$j<$NUM;j++))
do
	echo "Group$j.id = 0" >> $LICQ_CONF
	START_GROUP=`cat -n $SOURCE_FILE | grep \<group | head -n $j | tail -n 1 |awk '{print $1}'`
	END_GROUP=`cat -n $SOURCE_FILE | grep \</group | head -n $j | tail -n 1 |awk '{print $1}'`

	GROUP_CODE=$((2**$(($j-1)) ))

	for UIN in `head -n $END_GROUP $SOURCE_FILE | tail -n $(($END_GROUP - $START_GROUP +1)) | grep buddy | grep ICQ | \
	            awk -F ">" '{print $1}' | sed  "s/^[^%3A]*%3A//" | sed "s/%3A.*$//"`
	do
		USR_FILE="$LICQ_USER_DIR/$UIN.Licq"
		echo -n "."

		if [ -f "$USR_FILE" ]
		then
			#user file already exits -> add current GROUP_CODE to the one already there
			UPD_BUD=$(($UPD_BUD+1))
			G_CODE=`cat $USR_FILE | awk -F = '/Groups\.User/ {printf "%i",$2}'`
			if ! [ $G_CODE -eq $GROUP_CODE ]
			then
				G_CODE=$(($G_CODE+$GROUP_CODE))
			fi
			sed "s/^Groups\.User.*$/Groups.User = $G_CODE/" $USR_FILE > $USR_FILE.2
			mv $USR_FILE.2 $USR_FILE
		else
			#create new user file
			NUM_BUD=$(($NUM_BUD + 1))
			ALIAS=`cat $SOURCE_FILE | grep $UIN | sed -e "s/<[^>]*>//g" -e "s/^ *//" | head -n 1`
			echo "[user]" > $USR_FILE
			echo "History = default" >> $USR_FILE
			echo "Groups.System = 0" >> $USR_FILE
			echo "Groups.User = $GROUP_CODE" >> $USR_FILE
			echo "Alias = $ALIAS" >> $USR_FILE
		fi
	done

done

echo
echo "added $NUM_BUD Buddies, updated $UPD_BUD Buddies"

