view sheep.pl @ 24:93d4e6ffe330

refined the SQL.
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Fri, 10 Oct 2008 03:17:50 +0800
parents 54ab0becd730
children d183277b4d93
line wrap: on
line source

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

package main;
my @tradegoodText = qw/NULL 葡萄酒 大理石 水晶 硫磺/;

Ikariam::User->has_many(cities => 'Ikariam::Cities');
Ikariam::User->set_sql(inactivity => qq {
    SELECT user.id 
      FROM user, cities, island
      WHERE user.id == cities.user
        AND cities.island == island.id
        AND island.x <= ?
        AND island.x >= ?
        AND island.y <= ?
        AND island.y >= ?
        AND cities.status = 'i'
    }
);
#Ikariam::User->set_sql(sheeps => qq {
#    SELECT user.id 
#      FROM user, cities, island
#      WHERE user.id == cities.user
#        AND cities.island == island.id
#        AND island.x <= ?
#        AND island.x >= ?
#        AND island.y <= ?
#        AND island.y >= ?
#        AND user.trader_score_secondary >= 50000
#        AND user.army_score_main <= 100
#    }
#);

Ikariam::User->set_sql(sheeps => qq {
        SELECT user.id 
          FROM user, cities 
         WHERE user.id == cities.user 
           AND user.trader_score_secondary >= 50000 
           AND user.army_score_main <= 40
           AND cities.island IN (SELECT island.id FROM island WHERE island.x <= ? AND island.x >= ? AND island.y <= ? AND island.y >= ? )
    }
);

if($#ARGV != 1) {
    die("Usage: $0 x y\n");
}
my ($x, $y) = @ARGV;

listSheeps(Ikariam::User->search_sheeps(($x + 6), ($x - 6), ($y + 6), ($y - 6)));
# listSheeps(Ikariam::User->search_inactivity(($x + 6), ($x - 6), ($y + 6), ($y - 6)));

sub listSheeps
{
    my @sheeps = @_;
    my %results;

    my $s;
    foreach my $sheep (sort (@sheeps)) {
        # avoid duplicate
        next if($sheep->id == $s); $s = $sheep->id;

        # 查聯盟數量
        my $members = 1;
        unless ($sheep->allyId == '0') {
            $members = Ikariam::User->search(allyId => $sheep->allyId)->count();
        }

        foreach my $c ($sheep->cities) {
            my $line = "";
            # Ignore 假期模式
            next if($c->status eq 'v');

            unless($c->status eq 'i') {
                next if($members > 3);
            }

            my $island = Ikariam::Island->retrieve($c->island);

            # 所得金錢 = 對方城鎮等級x(對方城鎮等級-1)x對方金錢/10000
            my $robbery = $c->citylevel * ($c->citylevel - 1) * $sheep->trader_score_secondary / 10000;

            next if($robbery < 2000);
            $line = sprintf("%d %s army %d %s/%s(%d),", 
                $robbery,
                $c->status, $sheep->army_score_main, $sheep->name, $sheep->ally, $members);

            $line .= sprintf("\"%s\" %d [%d,%d] %s http://s2.ikariam.tw/index.php?view=island&id=%d\n",
                $c->cityname, $c->citylevel, 
                $island->x, $island->y,
                $tradegoodText[$island->tradegood],
                $island->id);

            printf("%s", $line);
        }
    }
}
# find_or_create