view scan.pl @ 232:978a949602e5

Auto-update Scientists numbers for Academy. Refined the rules for safehouse, the safe house must be same or higher level then Town Hall. Make people very happy, when the townHall is less then 16. Build museum first then tavern THG: changed warfare.pl
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Thu, 06 Nov 2008 20:31:05 +0800
parents 541bc1fba446
children 1a7b2d42fcbf
line wrap: on
line source

#!/usr/bin/perl
use strict;
use Data::Dumper;
use Ikariam;

package main;

sub saveCities
{
    my ($island, @cities) = @_;

    if ($#cities == -1) {
        warn ("empty cities list.\n");
        return;
    }

    foreach my $h_city (@cities) {
        $h_city->{island} = $island;
        $h_city->{'time'} = time;
        my $c = Ikariam::Cities->retrieve($h_city->{cityId});
        if(defined($c)) {
            foreach (keys(%$h_city)) { 
                $c->set($_ => $h_city->{$_}); 
            }
        } else {
            $c = Ikariam::Cities->insert($h_city);
        }
        $c->update();

        my $user = Ikariam::User->retrieve($h_city->{'user'});
        next if (defined($user) && defined($user->time) && $user->time le (time - 30*60*1));

        saveUser($h_city->{owner});
    }
}

sub saveUser
{
    my $userName = shift;
    my $users;

    foreach my $x (qw/score army_score_main trader_score_secondary/) {
        $users = $::i->viewScore($x, $userName, 0);

        foreach my $h_user (values(%{$users})) {
            printf("Saving user %s\n", $h_user->{'name'});
            $h_user->{'time'} = time;

            my $user = Ikariam::User->retrieve($h_user->{'id'});
            if(defined($user)) {
                foreach (keys(%$h_user)) { $user->set($_ => $h_user->{$_}); }
            } else {
                $user = Ikariam::User->insert($h_user);
            }
            $user->update();
            saveAlly($h_user->{allyId});
        }
    }
}

sub saveAlly
{
    my $allyId = shift;
    return unless (defined($allyId) && $allyId ne '0');

    # Save for member of ally 
    my $ally = Ikariam::Ally->retrieve($allyId);
    if(!defined($ally) || $ally->time le (time - 30*60*1)) {
        my $h_ally = $::i->viewAlly($allyId);
        $h_ally->{'time'} = time;
        if(defined($ally)) {
            foreach (keys(%$h_ally)) { $ally->set($_ => $h_ally->{$_}); }
        } else {
            $ally = Ikariam::Ally->insert($h_ally);
        }
    }
}

sub saveIslands {
    my @islands = @_;

    foreach my $h_island (@islands)
    {
        # printf("checking island %d\n", $h_island->{id});

        my $island;
        if($island = Ikariam::Island->retrieve($h_island->{id})) {
            foreach my $i (keys(%$h_island)) {
                $island->set($i => $h_island->{$i});
            }
        } else {
            $island = Ikariam::Island->insert($h_island);
        }

        # scanning the island
        if($island->time le (time - 30*60*6))
        {
            my @cities = $::i->viewIsland($h_island->{id});
            saveCities($h_island->{id}, @cities);

            $island->set('time', time);
        }
        $island->update();

    }
}


local $SIG{ALRM} = sub { die "timeout\n" };
alarm 3;
our $i = new Ikariam($::server, $::user, $::pass);

if($#ARGV == 1) {
    $i->login;
    my @islands = $i->viewWorldMap($ARGV[0], $ARGV[1]);
    saveIslands(@islands);
    $i->logout;
} elsif($#ARGV == 0) {
    $i->login;
    my $island = $ARGV[0];
    my @cities = $i->viewIsland($island);
    saveCities($island, @cities);
    $i->logout;
} elsif($#ARGV == -1) {
    $i->login;
    my $cities = $i->check;
    # random
    foreach my $cityId (keys(%$cities)) {
        printf("%s %s\n", $cities->{$cityId}->{island}->{x},  $cities->{$cityId}->{island}->{y});
        my @islands = $i->viewWorldMap( $cities->{$cityId}->{island}->{x},  $cities->{$cityId}->{island}->{y});
        saveIslands(@islands);
    }
    $i->logout;
} else {
    die("Usage: $0\nUsage: $0 x y\n");
}