рдЧреНрд░реЗрдкреЛрд▓рд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐ рд╢реБрдн рджреЛрдкрд╣рд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдСрдирд▓рд╛рдЗрди mmo рд░рдгрдиреАрддрд┐ рдЧреЗрдо рдЧреНрд░реЗрдкреЛрд▓рд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдЯ рдХреЗ рд▓реЗрдЦрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦреЗрд▓ рдХреЗ рдирд┐рдпрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рдПрдВрдЧреЗ, рдФрд░ рдмрд┐рдирд╛ рдХрд╛рд░рдг рдХреЗ рдирд╣реАрдВред рдореБрдЭреЗ рдмрд╕ рдЦреЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╢реМрдХ рд╣реИред рдФрд░ рд▓рд┐рдЦрдирд╛ рдирд┐рд╖рд┐рджреНрдз рдирд╣реАрдВ рд╣реИред рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ, рдХреГрдкрдпрд╛ рддрд░реНрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИред

рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдПрдХ рдХрдбрд╝реА рд╣реИред

рдореБрдЭреЗ рдЧреНрд░реЗрдкреЛрд▓рд┐рд╕, рдПрдХ рдЕрдЪреНрдЫрд╛ рдЦреЗрд▓ рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╣рд░ 5 рдорд┐рдирдЯ рдореЗрдВ рдЧрд╛рдВрд╡реЛрдВ рд╕реЗ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рд▓реЗрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рдореИрдВ рд╕рд╛рд░рд╛ рджрд┐рди рдореБрдЦреНрдп рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╡реНрдпрд╕реНрдд рд░рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдмреЙрдЯ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдореБрдЦреНрдп рд▓рдХреНрд╖реНрдп рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рдерд╛ред рддрдм рдЧрд╛рдВрд╡реЛрдВ рдХрд╛ рдСрдЯреЛ-рд╕реБрдзрд╛рд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ (рддрдм рд╡реЗ рдЕрдзрд┐рдХ рд▓рд╛рдн рджреЗрддреЗ рд╣реИрдВ), рдСрдЯреЛ-рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди (рддрд╛рдХрд┐ рд░рд╛рдд рдореЗрдВ, рдЬрдм рдореИрдВ рд╕реЛрдКрдВрдЧрд╛, рддреЛ рдирд┐рд░реНрдорд╛рдг рдХреА рд░реЗрдЦрд╛ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛрдЧреА)ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдпреЗ рдХрд╛рд░реНрдп рдЦреЗрд▓ рдХреЗ рдкреНрд░рд╢рд╛рд╕рди рд░рд╛рдЬрд╕реНрд╡ рдХрд╛ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд▓рд╛рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдЗрд╕рд▓рд┐рдП рдХрд┐ рдмреЙрдЯ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдкрд░ рдЗрддрдиреА рдмрд╛рд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдкрдиреЗ рдЖрдк рд╕реЗ, рдмреЙрдЯ рдирд╣реАрдВ рдЦреЗрд▓реЗрдВрдЧреЗ, рдХреЗрд╡рд▓ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЕрдХреЗрд▓реЗ рдирд╣реАрдВ рдЫреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ - рд╡реЗ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдмреЙрдЯ рдХрд╛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рд╕рд╛рде рд╣реА рдкрд░реНрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдкрд╣рд▓рд╛ рднреА рд╣реИред рд╣рд░ рдкрд╛рдВрдЪ рдорд┐рдирдЯ рдореЗрдВ рдПрдХ рдмрд╛рд░ рддрд╛рдЬ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрд╕рд╛рдзрди рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдФрд░ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдФрд░ рдЗрд╕рдиреЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рдореИрдВ рд╢реАрд░реНрд╖ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдореЗрдВ рдЖ рдЧрдпрд╛, рд╕рдм рдХреБрдЫ рдареАрдХ рдерд╛ред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЦреЗрд▓ рдердХ рдЧрдпрд╛ рдФрд░ рдореИрдВрдиреЗ рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛, рдЬрдм рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ - рдореБрдЭреЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмреЙрдЯ рдбрд┐рдЯреЗрдХреНрд╢рди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдерд╛, рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдЦреЗрддреЛрдВ рдФрд░ рд╢рд╣рд░реЛрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рд╢реНрд░рдо рдирд╣реАрдВ рдерд╛ред

рддреЛ рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдкреИрджрд╛ рд╣реБрдЖред рдЕрдм, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдмрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрд╡-рдЯреВрд▓реНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдХреАрдЬрд╝ рд╕реЗ рд▓реА рдЧрдИ) рдФрд░ рд╡рд╣ рд╕рд░реНрд╡рд░ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВред рд╢рд╣рд░реЛрдВ / рдЦреЗрддреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдЕрднреА рддрдХ рджреЛ рд╢рд╣рд░реЛрдВ рдкрд░ рдЗрд╕рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ, рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╢рд╣рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЧреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдирдЬрд╝рд░ рд░рдЦреЗрдВ - рдлрд╝рд┐рдХреНрд╕ рддреБрд░рдВрдд рдЬрд╛рд░реА рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдбреЗрдЯрд╛ рдпрд╛рдж рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдХрдо рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

рдЧреЗрдо рдХреЛ рд╕реНрд╡рдпрдВ рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрдЧрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рд╕рд┐рд░реНрдл html рдХреЛрдб рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЕрдм рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдП рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ json рдлрд╝реАрд▓реНрдб рдореЗрдВ рдПрдХ рдФрд░ json рдСрдмреНрдЬреЗрдХреНрдЯ рднреЗрдЬрдирд╛ рдЕрднреА рднреА рдПрдХ рдЪрд╛рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
{ 'type' => 'backbone', 'param_id' => 13980, 'subject' => 'Units', 'id' => 4414096, 'param_str' => '{"Units":{"id":13980,"home_town_id":5391,"current_town_id":5391,"sword":23,"slinger":21,"archer":5,"hoplite":10,"rider":0,"chariot":0,"catapult":0,"minotaur":0,"manticore":0,"zyklop":0,"harpy":0,"medusa":0,"centaur":0,"pegasus":0,"cerberus":0,"fury":0,"griffin":0,"calydonian_boar":0,"godsent":34,"big_transporter":0,"bireme":0,"attack_ship":0,"demolition_ship":0,"small_transporter":0,"trireme":0,"colonize_ship":0,"sea_monster":0,"militia":0,"heroes":null,"home_town_link":"<a href=\\"#eyJpZCI6NTM5MSwiaXgiOjUxMSwiaXkiOjYyMywidHAiOiJ0b3duIiwibmFtZSI6IlBlcmwifQ==\\" class=\\"gp_town_link\\">Perl<\\/a>","same_island":true,"current_town_link":"<a href=\\"#eyJpZCI6NTM5MSwiaXgiOjUxMSwiaXkiOjYyMywidHAiOiJ0b3duIiwibmFtZSI6IlBlcmwifQ==\\" class=\\"gp_town_link\\">Perl<\\/a>","current_player_link":"<a href=\\"#eyJuYW1lIjoiUGluZ3ZlaW4iLCJpZCI6e319\\" class=\\"gp_player_link\\">Pingvein<\\/a>"}}', 'time' => 1383837485 } 

рдореИрдВрдиреЗ рд╕рднреА рдЖрд╢реНрд░рд┐рддреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдмрд┐рдпрди / ubuntu рдХреЗ рд╕рд╛рде "install_lbooks.sh" рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдИред рджреВрд╕рд░реЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╡рд┐рддрд░рдг рдХреЗ cpan рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рд╕рднреА рдХреЛрдб рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдЬреАрдм рд╣реЛрдЧрд╛ рдпрджрд┐ рдмреЙрдЯ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 2 рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рдФрд░ IO :: Async :: рд▓реВрдк рдЗрд╕ рдереНрд░реЗрдб рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИред Async.pm:

 package GrepolisBotModules::Async; use GrepolisBotModules::Log; use IO::Async::Timer::Countdown; use IO::Async::Loop; my $loop = IO::Async::Loop->new; sub delay{ my($delay, $callback) = @_; GrepolisBotModules::Log::echo 1, "Start delay $delay \n"; my $timer = IO::Async::Timer::Countdown->new( delay => $delay, on_expire => $callback, ); $timer->start; $loop->add( $timer ); } sub run{ $loop->later(shift); $loop->run; } 1; 

рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ, рдЗрд╡реЗрдВрдЯ рдЯреНрд░рд┐рдЧрд░реНрд╕ рдХреЛ рдореБрдЦреНрдп рд▓реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЯрд╛рдЗрдорд░ рдкрд░ рд╕рдм рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдЬреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ "рд░рди" рд╡рд┐рдзрд┐ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВ рд░реИрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЯрд╛рдЗрдорд░ рдХреЗ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рддрд╛рдХрд┐ рд▓рдбрд╝рдЦрдбрд╝рд╛рдирд╛ рди рд╣реЛред рдореБрдЦреНрдп рдлрд╝рд╛рдЗрд▓ grepolis_bot.pl рд╣реИ:

 #!/usr/bin/perl use strict; use warnings; use Config::IniFiles; use GrepolisBotModules::Request; use GrepolisBotModules::Town; use GrepolisBotModules::Async; use GrepolisBotModules::Log; use utf8; my $cfg = Config::IniFiles->new( -file => "config.ini" ); my $config = { security => { sid => $cfg->val( 'security', 'sid' ), server => $cfg->val( 'security', 'server' ) }, global => { log => $cfg->val( 'global', 'log' ), } }; undef $cfg; my $Towns = []; GrepolisBotModules::Async::run sub{ GrepolisBotModules::Request::init($config->{'security'}); GrepolisBotModules::Log::init($config->{'global'}); GrepolisBotModules::Log::echo(0, "Program started\n"); my $game = GrepolisBotModules::Request::base_request('http://'.$config->{'security'}->{'server'}.'.grepolis.com/game'); $game =~ /"csrfToken":"([^"]+)",/; GrepolisBotModules::Request::setH($1); $game =~ /"townId":(\d+),/; GrepolisBotModules::Log::echo 1, "Town $1 added\n"; push($Towns, new GrepolisBotModules::Town($1)); }; 

рд╣рдо рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ, рдФрд░ рд╡рд░реНрддрдорд╛рди рд╢рд╣рд░ рдХреЗ рд▓рд┐рдП csrfToken рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реБрдП рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдПрдХ рдирдП рд╢рд╣рд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рддрд╛ рд╣реВрдВ, рдХрдИ рд╢рд╣рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдореИрдВ рдЬрд┐рддрдиреА рдЬрд▓реНрджреА рд╣реЛ рд╕рдХреЗ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реВрдВред

рд╢рд╣рд░ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓, Town.pm:

 package GrepolisBotModules::Town; use strict; use warnings; use GrepolisBotModules::Request; use GrepolisBotModules::Farm; use GrepolisBotModules::Log; use JSON; my $get_town_data = sub { my( $self ) = @_; my $resp = JSON->new->allow_nonref->decode( GrepolisBotModules::Request::request( 'town_info', 'go_to_town', $self->{'id'}, undef, 0 ) ); $self->{'max_storage'} = $resp->{'json'}->{'max_storage'}; $resp = JSON->new->allow_nonref->decode( GrepolisBotModules::Request::request( 'data', 'get', $self->{'id'}, '{"types":[{"type":"backbone"},{"type":"map","param":{"x":0,"y":0}}]}', 1 ) ); foreach my $arg (@{$resp->{'json'}->{'backbone'}->{'collections'}}) { if( defined $arg->{'model_class_name'} && $arg->{'model_class_name'} eq 'Town' ){ my $town = pop($arg->{'data'}); $self->setResources($town->{'last_iron'}, $town->{'last_stone'}, $town->{'last_wood'}); } } foreach my $data (@{$resp->{'json'}->{'map'}->{'data'}->{'data'}->{'data'}} ) { foreach my $key (keys %{$data->{'towns'}}) { if( defined $data->{'towns'}->{$key}->{'relation_status'} && $data->{'towns'}->{$key}->{'relation_status'} == 1 ){ my $village = new GrepolisBotModules::Farm($data->{'towns'}->{$key}->{'id'}, $self); push($self->{'villages'}, $village); } } } }; my $build_something; $build_something = sub { my $self = shift; GrepolisBotModules::Log::echo 0, "Build request ".$self->{'id'}."\n"; my $response_body = GrepolisBotModules::Request::request('building_main', 'index', $self->{'id'}, '{"town_id":"'.$self->{'id'}.'"}', 0); $response_body =~ m/({.*})/; my %hash = ( JSON->new->allow_nonref->decode( $1 )->{'json'}->{'html'} =~ /BuildingMain.buildBuilding\('([^']+)',\s(\d+)\)/g ); my $to_build = ''; if(defined $hash{'main'} && $hash{'main'}<25){ $to_build = 'main'; }elsif(defined $hash{'academy'}){ $to_build = 'academy'; }elsif(defined $hash{'farm'}){ $to_build = 'farm'; }elsif(defined $hash{'barracks'}){ $to_build = 'barracks'; }elsif(defined $hash{'storage'}){ $to_build = 'storage'; }elsif(defined $hash{'docks'}){ $to_build = 'docks'; }elsif(defined $hash{'stoner'}){ $to_build = 'stoner'; }elsif(defined $hash{'lumber'}){ $to_build = 'lumber'; }elsif(defined $hash{'ironer'}){ $to_build = 'ironer'; } if($to_build ne ''){ my $response_body = GrepolisBotModules::Request::request( 'building_main', 'build', $self->{'id'}, '{"building":"'.$to_build.'","level":5,"wnd_main":{"typeinforefid":0,"type":9},"wnd_index":0,"town_id":"'.$self->{'id'}.'"}', 1 ); } my $time_wait = undef; my $json = JSON->new->allow_nonref->decode($response_body); if(defined $json->{'notifications'}){ foreach my $arg (@{$json->{'notifications'}}) { if( $arg->{'type'} eq 'backbone' && $arg->{'subject'} eq 'BuildingOrder' ){ my $order = JSON->new->allow_nonref->decode($arg->{'param_str'})->{'BuildingOrder'}; $time_wait = $order->{'to_be_completed_at'} - $order->{'created_at'}; } } } if(defined $time_wait){ GrepolisBotModules::Log::echo 0, "Town ".$self->{'id'}." build ".$to_build."\n"; GrepolisBotModules::Async::delay( $time_wait + int(rand(60)), sub {$self->$build_something} ); }else{ GrepolisBotModules::Log::echo 0, "Town ".$self->{'id'}." can not build. Waiting\n"; GrepolisBotModules::Async::delay( 600 + int(rand(300)), sub {$self->$build_something} ); } }; sub setResources{ my $self = shift; my $iron = shift; my $stone = shift; my $wood = shift; $self->{'iron'} = $iron; $self->{'wood'} = $wood; $self->{'stone'} = $stone; GrepolisBotModules::Log::echo 1, "Town ".$self->{'id'}." resources updates iron-".$self->{'iron'}.", stone-".$self->{'stone'}.", wood-".$self->{'wood'}."\n"; } sub needResources{ my $self = shift; my $resources_by_request = shift; if( $self->{'iron'} + $resources_by_request < $self->{'max_storage'} || $self->{'wood'} + $resources_by_request < $self->{'max_storage'} || $self->{'stone'} + $resources_by_request < $self->{'max_storage'} ){ return 1; } return 0; } sub toUpgradeResources{ my $self = shift; return { wood => int($self->{'iron'}/5), stone => int($self->{'wood'}/5), iron => int($self->{'stone'}/5), }; } sub getId{ my $self = shift; return $self->{'id'}; } sub new { my $class = shift; my $self = { id => shift, villages => [], max_storage => undef, iron => undef, wood => undef, stone => undef }; bless $self, $class; GrepolisBotModules::Log::echo 0, "Town ".$self->{'id'}." init started\n"; $self->$get_town_data; GrepolisBotModules::Log::echo 0, "Town ".$self->{'id'}." data gettings finished\n"; $self->$build_something; GrepolisBotModules::Log::echo 0, "Town ".$self->{'id'}." build started\n"; return $self; } 1; 

рдЬрдм рдпрд╣ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдореМрдЬреВрдж рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрди рдЦреЗрддреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗ рдЗрд╕реЗ рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐ рдФрд░ рдЧреЛрджрд╛рдо рдХреА рдорд╛рддреНрд░рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ "build_something" рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдирд┐рд░реНрдорд╛рдг рд░рдгрдиреАрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдлрд┐рдЯ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЖрдк рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред "рдЦреЗрддреЛрдВ" (рддрдерд╛рдХрдерд┐рдд рдХрд┐рд╕рд╛рди рдмрд╕реНрддрд┐рдпреЛрдВ) рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ Farm.pm:

 package GrepolisBotModules::Farm; use GrepolisBotModules::Request; use GrepolisBotModules::Log; use JSON; my $get_farm_data = sub { my $self = shift; my $resp = JSON->new->allow_nonref->decode( GrepolisBotModules::Request::request( 'farm_town_info', 'claim_info', $self->{'town'}->getId, '{"id":"'.$self->{'id'}.'"}', 0 ) ); $self->{'name'} = $resp->{'json'}->{'json'}->{'farm_town_name'}; $resp->{'json'}->{'html'} =~ /<h4>You\sreceive:\s\d+\sresources<\/h4><ul><li>(\d+)\swood<\/li><li>\d+\srock<\/li><li>\d+\ssilver\scoins<\/li><\/ul>/; $self->{'resources_by_request'} = $1; if($resp->{'json'}->{'html'} =~ /<h4>Upgrade\slevel\s\((\d)\/6\)<\/h4>/ ){ $self->{'level'} = $1; }else{ die('Level not found'); } }; my $upgrade = sub{ my $self = shift; my $donate = $self->{'town'}->toUpgradeResources(); $json = '{"target_id":'.$self->{'id'}.',"wood":'.$donate->{'wood'}.',"stone":'.$donate->{'stone'}.',"iron":'.$donate->{'iron'}.',"town_id":"'.$self->{'town'}->getId().'"}'; my $response_body = GrepolisBotModules::Request::request('farm_town_info', 'send_resources', $self->{'town'}->getId(), $json, 1); GrepolisBotModules::Log::echo 1, "Village send request. Town ID ".$self->{'town'}->getId()." Village ID ".$self->{'id'}."\n"; $self->$get_farm_data; }; my $claim = sub{ my $self = shift; $json = '{"target_id":"'.$self->{'id'}.'","claim_type":"normal","time":300,"town_id":"'.$self->{'town'}->getId.'"}'; my $response_body = GrepolisBotModules::Request::request('farm_town_info', 'claim_load', $self->{'town'}->getId, $json, 1); my $json = JSON->new->allow_nonref->decode($response_body)->{'json'}; if(defined $json->{'notifications'}){ foreach my $arg (@{$json->{'notifications'}}) { if( $arg->{'type'} eq 'backbone' && $arg->{'subject'} eq 'Town' ){ my $town = JSON->new->allow_nonref->decode($arg->{'param_str'})->{'Town'}; $self->{'town'}->setResources($town->{'last_iron'}, $town->{'last_stone'}, $town->{'last_wood'}); } } } GrepolisBotModules::Log::echo 1, "Farm ".$self->{'id'}." claim finished\n"; }; my $needUpgrade = sub { my $self = shift; if($self->{'level'} < 6){ return true; }else{ return false; } }; my $tick; $tick = sub { my $self = shift; if($self->{'town'}->needResources($self->{'resources_by_request'})){ $self->$claim(); GrepolisBotModules::Async::delay( 360 + int(rand(240)), sub { $self->$tick} ); }elsif($self->$needUpgrade()){ $self->$upgrade(); GrepolisBotModules::Async::delay( 600 + int(rand(240)), sub { $self->$tick} ); } }; sub new { my $class = shift; my $self = { id => shift, name => undef, resources_by_request => undef, town => shift, level => undef }; GrepolisBotModules::Log::echo 0, "Farm ".$self->{'id'}." init started\n"; bless $self, $class; $self->$get_farm_data; GrepolisBotModules::Log::echo 0, "Farm ".$self->{'id'}." data gettings finished\n"; $self->$tick; GrepolisBotModules::Log::echo 0, "Farm ".$self->{'id'}." ticker started\n"; return $self; } 1; 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдкрд░, рдЦреЗрдд рдЕрдкрдиреЗ рд╕реНрддрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ 5 рдорд┐рдирдЯ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЬрд╛рдВрдЪрддрд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рд╢рд╣рд░ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдирд┐рдкрдЯрд╛рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдПрдХ рдмрд╛рд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди рджреЗ рд╕рдХреЗред рдирд┐рдкрдЯрд╛рди рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдЙрдирдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдореИрдВрдиреЗ рд╢рд╣рд░ рдХреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП рддрд╛рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рди рднреЗрдЬреЗрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж, рдирд┐рдкрдЯрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛рддреА рд╣реИред рдореИрдВ рдЙрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдЬреЛ рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, Request.pm:

 if($response_body =~ /^{/){ my $json = JSON->new->allow_nonref->decode( $response_body )->{'json'}; if(defined $json->{'notifications'}){ foreach my $arg (@{$json->{'notifications'}}) { if( ( $arg->{'type'} ne 'building_finished' && $arg->{'type'} ne 'newreport' && ( $arg->{'type'} ne 'backbone' || $arg->{'type'} eq 'backbone' && ( !(defined $arg->{'subject'}) || ( $arg->{'subject'} ne 'BuildingOrder' && $arg->{'subject'} ne 'Town' && $arg->{'subject'} ne 'PlayerRanking' && $arg->{'subject'} ne 'Buildings' && $arg->{'subject'} ne 'IslandQuest' && $arg->{'subject'} ne 'TutorialQuest' ) ) ) ) ){ GrepolisBotModules::Log::dump 5, $arg; } } } } 

рдореИрдВ рдЙрди рд╣рд┐рддреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд░реБрдЪрддреА рд╣реИрдВ рдЕрд░реНрдерд╛рддреН, рдХреИрдкреНрдЪрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдзред рджрд░рдЕрд╕рд▓, рдореИрдВ рдмреЙрдЯ рдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдкреНрдЪрд╛ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдПрдХ рдФрд░ "рдирд╛рдЗрдЯ рдореЛрдб" рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рдЧрдИ рд╣реИ - рддрд╛рдХрд┐ рд░рд╛рдд рдореЗрдВ рдмреЙрдЯ рдЕрдиреБрд░реЛрдз рди рднреЗрдЬреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдЧреЛрджрд╛рдо рднрд░реЗ рд╣реБрдП рд╣реИрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдг рд▓рд╛рдЗрди рд▓рдВрдмреЗ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рднрд░реА рд╣реИ, рддреЛ рд╡реИрд╕реЗ рднреА рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рднреЗрдЬреЗ рдЬрд╛рдПрдВрдЧреЗред

рдЦреЗрд▓ рдореЗрдВ, рдкрд╣рд▓рд╛ рд╢рд╣рд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╢рд╣рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рд╕рдореБрджреНрд░реА рд╣рдорд▓рд╛рд╡рд░ рд╕реЗрдирд╛, рд╕рдореБрджреНрд░реА рд░рдХреНрд╖рд╛ рдФрд░ рднреВрдорд┐ рдкрд░ рд╣рдорд▓рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ / рд░рдХреНрд╖рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рд╢рд╣рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдЗрдорд╛рд░рддреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЗрд╕рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдореБрдХреНрдд рдЖрдмрд╛рджреА рдФрд░ рд╡рд┐рднрд┐рдиреНрди рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдиреАрддрд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ рдЦреБрд╢реА рд╣реЛрдЧреА рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╢рд╣рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реЗрдирд╛рдУрдВ, рднрд╡рдиреЛрдВ, рдСрдЯреЛ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреЗ рдСрдЯреЛ-рдирд┐рд░реНрдорд╛рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдпрд╛ рдмреЙрдЯ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдЯреЛ-рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рд░рд╣рд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрдиреБрд╕реВрдЪрд┐рдд рднреЗрдЬрдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рдореБрдЭреЗ рдЧреНрд░реАрдкреЛрд▓рд┐рд╕ рд╕рд░реНрд╡рд░ рдХреА рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреА рдЬреЛ рдореБрдЭреЗ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред

Source: https://habr.com/ru/post/In201272/


All Articles