#!/usr/local/bin/perl use strict; use warnings; use POE; use POE::Component::Cron; use POE::Component::Client::Twitter; use DateTime::Set; use DateTime::Duration; use DateTime::Event::Sunrise; my %location = ( longitude => 139.45, latitude => 35.40, altitude => -6 ); my $sunrise = DateTime::Event::Sunrise->sunrise(%location); my $sunset = DateTime::Event::Sunrise->sunset(%location); my $day_set = DateTime::SpanSet->from_sets( start_set => $sunrise, end_set => $sunset ); my $delta = DateTime::Duration->new( minutes => 1 ); my @daytime_name = qw( 明け六ツ 卯の刻二つ時 卯の刻三つ時 卯の刻四つ時 朝五ツ 辰の刻二つ時 辰の刻三つ時 辰の刻四つ時 昼四ツ 巳の刻二つ時 巳の刻三つ時 巳の刻四つ時 真昼九ツ 午の刻二つ時 正午 午の刻四つ時 昼八ツ 羊の刻二つ時 羊の刻三つ時 羊の刻四つ時 夕七ツ 申の刻二つ時 申の刻三つ時 申の刻四つ時 ); my @nighttime_name = qw( 暮れ六ツ 酉の刻二つ時 酉の刻三つ時 酉の刻四つ時 宵五ツ 戌の刻二つ時 戌の刻三つ時 戌の刻四つ時 夜四ツ 亥の刻二つ時 亥の刻三つ時 亥の刻四つ時 真夜九ツ 子の刻二つ時 子の刻三つ時 子の刻四つ時 夜八ツ 丑の刻二つ時 丑の刻三つ時 丑の刻四つ時 暁七ツ 寅の刻二つ時 寅の刻三つ時 寅の刻四つ時 ); my $twitter = POE::Component::Client::Twitter->spawn( username => "USERNAME", password => "PASSWORD", ); my $s1 = POE::Session->create( inline_states => { _start => sub { $_[KERNEL]->delay( 'check', 300 ); }, Tick => sub { $twitter->yield( update => sprintf "%s: %s", scalar localtime, nandoki( DateTime->now->set_time_zone('Asia/Tokyo') ) ); }, check => sub { $_[KERNEL]->delay( 'check', 300 ); } } ); POE::Component::Cron->add( $s1 => Tick => DateTime::Set->from_recurrence( span => DateTime::Span->from_datetimes( start => DateTime->now->set_time_zone('Asia/Tokyo'), end => DateTime::Infinite::Future->new ), recurrence => \&tick, ) ); POE::Kernel->run(); sub tick { my $dt = shift; my ( $ret, $quarter ); if ( $dt->is_infinite ) { $ret = $dt; } elsif ( $day_set->contains($dt) ) { my $i; $quarter = ( $sunset->next($dt) - $sunrise->current($dt) )->multiply( 1 / 24 ); $ret = $sunrise->current($dt); if ( ( $dt + $delta > $ret ) && ( $dt - $delta < $ret ) ) { $ret = $ret->add($quarter); } else { while ( $dt >= $ret ) { $ret = $ret->add($quarter); $i++; } $ret = $sunset->next($dt) if ( $i == 24 ); } } else { my $i; $quarter = ( $sunrise->next($dt) - $sunset->current($dt) )->multiply( 1 / 24 ); $ret = $sunset->current($dt); if ( ( $dt + $delta > $ret ) && ( $dt - $delta < $ret ) ) { $ret = $ret->add($quarter); } else { while ( $dt >= $ret ) { $ret = $ret->add($quarter); $i++; } $ret = $sunrise->next($dt) if ( $i == 24 ); } } return $ret; } sub nandoki { my $dt = shift; my ( $quarter, $tmp, $times, $ret ); if ( $day_set->contains($dt) ) { $quarter = ( $sunset->next($dt) - $sunrise->current($dt) )->multiply( 1 / 24 ); $times = 0; $tmp = $sunrise->current($dt) + $quarter * $times; while ( !( ( $dt + $delta > $tmp ) && ( $dt - $delta < $tmp ) ) ) { $times++; $tmp = $sunrise->current($dt) + $quarter * $times; } $ret = $daytime_name[$times]; } else { $quarter = ( $sunrise->next($dt) - $sunset->current($dt) )->multiply( 1 / 24 ); $tmp = $sunset->current($dt) + $quarter * $times; $times = 0; while ( !( ( $dt + $delta > $tmp ) && ( $dt - $delta < $tmp ) ) ) { $times++; $tmp = $sunset->current($dt) + $quarter * $times; } $ret = $nighttime_name[$times]; } return $ret; }