====== Travian Map Download Script ======
This is my script(s) which I use to downoad the map.sql from Travian and import it to the database.
===== config.inc =====
#
# database
DB_USER="travian" # set this to your database user
DB_PASS="travian" # set this to your database password
DB_INST="travian" # set this to your database instance
#
# directories
MAP_DIR=${HOME}/opt/travian
DUMP_DIR=/srv/glassfish/domains/domain1/docroot/sql
#
# executables
MYSQL="/srv/mysql/bin/mysql --default-character-set=utf8 -u${DB_USER} -p${DB_PASS} ${DB_INST}"
MYSQLDUMP="/srv/mysql/bin/mysqldump -u${DB_USER} -p${DB_PASS} ${DB_INST}"
WGET="/usr/bin/wget -nv --output-document="
#WGET="/usr/bin/curl --silent --show-error --output "
===== cron.hourly =====
#! /bin/sh
echo `date +'%Y-%m-%d %H:%M'`: $0
for w in de7
do
${HOME}/opt/travian/bin/get.sh ${w}
done
===== get.sh =====
#! /bin/sh
BIN_DIR=`dirname $0`
. ${BIN_DIR}/config.inc
echo
echo "`date +'%Y-%m-%d %H:%M:%S'` $0[$$] starting"
world=$1
today=`date +'%Y-%m-%d'`
todayhour=`date +'%Y-%m-%d-%H'`
case "$1" in
de7)
url='http://welt7.travian.de/map.sql'
;;
org)
url='http://www.travian.org/map.sql'
;;
*)
echo "ERROR! World $1 unknown!"
exit 1
;;
esac
savemap="${MAP_DIR}/${world}/map-${todayhour}.sql"
lastmap="${MAP_DIR}/${world}/map-last.sql"
todaymap="${MAP_DIR}/${world}/map-${today}.sql"
${WGET}${savemap} "${url}"
if [ -e ${savemap} ] && diff ${savemap} ${lastmap} > /dev/null
then
# savemap an lastmap are the same
echo ${savemap} is the same als last one: REMOVING
rm ${savemap}
else
# savemap and lastmap differ
echo NEW MAP: ${savemap}
rm -f ${todaymap}
ln ${savemap} ${todaymap}
rm ${lastmap}
ln -s map-${today}.sql ${lastmap}
#
# import SQL
${BIN_DIR}/import.sh ${world}
#
# update SQL
${BIN_DIR}/update.sh ${world}
#
# export dump
if [ -d ${DUMP_DIR} ]
then
${MYSQLDUMP} | bzip2 -c > ${DUMP_DIR}/travian-${today}.sql.bz2
fi
fi
===== import.sh =====
#! /bin/sh
BIN_DIR=`dirname $0`
. ${BIN_DIR}/config.inc
echo "***"
echo "`date +'%Y-%m-%d %H:%M:%S'` $0[$$] starting"
world=$1
today=`date +'%Y-%m-%d'`
todaymap="${MAP_DIR}/${world}/map-${today}.sql"
if [ ! -e ${todaymap} ]
then
echo "${todaymap} doesn't exist: EXIT"
exit 1
fi
${MYSQL} << __SQL__
TRUNCATE x_world;
__SQL__
${MYSQL} < ${todaymap}
echo "`date +'%Y-%m-%d %H:%M:%S'` $0 finished"
===== update.sh =====
#! /bin/sh
BIN_DIR=`dirname $0`
. ${BIN_DIR}/config.inc
echo "***"
echo "`date +'%Y-%m-%d %H:%M:%S'` $0[$$] starting"
world=$1
today=`date +'%Y-%m-%d'`
echo " `date +'%H:%M:%S'`: ${world}_world"
${MYSQL} << __SQL__
--
-- update world
--
TRUNCATE ${world}_world;
INSERT INTO ${world}_world SELECT * FROM x_world;
__SQL__
echo " `date +'%H:%M:%S'`: ${world}_history"
${MYSQL} << __SQL__
--
-- update history
--
DELETE FROM ${world}_history WHERE snapdate='${today}';
INSERT INTO ${world}_history SELECT *, '${today}' FROM x_world;
__SQL__
echo " `date +'%H:%M:%S'`: ${world}_alliance"
${MYSQL} << __SQL__
--
-- update alliances
--
TRUNCATE ${world}_alliance;
INSERT INTO ${world}_alliance(aid, alliancename, alliancepopulation)
SELECT DISTINCT w1.aid, w1.alliance, sum(population)
FROM ${world}_world w1
GROUP BY w1.aid;
__SQL__
echo " `date +'%H:%M:%S'`: ${world}_village"
TEMP_TABLE="tmp_${world}_village_${today_}$$"
${MYSQL} << __SQL__
--
-- update villages
--
CREATE TABLE ${TEMP_TABLE} (
fid int(11) NOT NULL,
x smallint(6) NOT NULL,
y smallint(6) NOT NULL,
tid int(11) NOT NULL,
vid int(11) NOT NULL,
villagename varchar(255) NOT NULL,
uid int(11) NOT NULL,
accountname varchar(255) NOT NULL,
aid int(11) NOT NULL DEFAULT '0',
alliancename varchar(255) NOT NULL DEFAULT '',
population smallint(6) NOT NULL,
inactive smallint(6) NOT NULL DEFAULT 0,
history_1 int(11) NOT NULL DEFAULT 0,
PRIMARY KEY (vid),
KEY x (x),
KEY y (y),
KEY fid (fid),
KEY villagename (villagename),
KEY uid (uid),
KEY aid (aid),
KEY population (population),
KEY inactive (inactive),
KEY history_1 (history_1)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
INSERT INTO ${TEMP_TABLE}
SELECT
v.*
, h.inactive + 1
, h.population
FROM ${world}_world v
LEFT JOIN ${world}_village h ON h.vid = v.vid
GROUP BY v.vid;
UPDATE ${TEMP_TABLE}
SET inactive = 0
WHERE population > history_1;
DROP TABLE ${world}_village;
RENAME TABLE ${TEMP_TABLE} TO ${world}_village;
__SQL__
echo " `date +'%H:%M:%S'`: ${world}_account"
${MYSQL} << __SQL__
--
-- update account
--
TRUNCATE ${world}_account;
INSERT INTO ${world}_account
SELECT
w.uid
, w.tid
, w.aid
, w.alliance AS alliancename
, w.player AS accountname
, COUNT(DISTINCT w.vid) AS villages
, SUM(DISTINCT w.population) AS accountpopulation
, MIN(v.inactive) AS accountinactive
, SUM(v.history_1) AS history_1
FROM
${world}_world w
, ${world}_village v
WHERE
v.vid=w.vid
GROUP
by w.uid;
--
-- end of sql
--
__SQL__
echo "`date +'%Y-%m-%d %H:%M:%S'` $0 finished"
{{tag>travian shell script download map sql}}