| 1 | use strict; |
|---|
| 2 | use warnings; |
|---|
| 3 | |
|---|
| 4 | |
|---|
| 5 | use File::Basename; |
|---|
| 6 | use File::Spec; |
|---|
| 7 | use Cwd qw/abs_path/; |
|---|
| 8 | |
|---|
| 9 | |
|---|
| 10 | BEGIN { |
|---|
| 11 | my (undef, $path) = fileparse( File::Spec->rel2abs($0) ); |
|---|
| 12 | chdir $path; |
|---|
| 13 | chdir '..'; |
|---|
| 14 | } |
|---|
| 15 | use lib abs_path('lib'); |
|---|
| 16 | |
|---|
| 17 | use Net::IRC; |
|---|
| 18 | use Net::Jabber; |
|---|
| 19 | |
|---|
| 20 | use Vee::Bot; |
|---|
| 21 | |
|---|
| 22 | |
|---|
| 23 | |
|---|
| 24 | |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | my %Connections = ( |
|---|
| 28 | 'irc.veekun.com' => { |
|---|
| 29 | '#veekun' => {}, |
|---|
| 30 | '#tcod' => {}, |
|---|
| 31 | }, |
|---|
| 32 | |
|---|
| 33 | ); |
|---|
| 34 | |
|---|
| 35 | REPLACEME('Setup done'); |
|---|
| 36 | |
|---|
| 37 | |
|---|
| 38 | |
|---|
| 39 | |
|---|
| 40 | |
|---|
| 41 | |
|---|
| 42 | |
|---|
| 43 | |
|---|
| 44 | |
|---|
| 45 | my $irc = new Net::IRC; |
|---|
| 46 | my $server = (keys %Connections)[0]; |
|---|
| 47 | my $irc_conn = $irc->newconn( |
|---|
| 48 | Nick => 'Perlbui', |
|---|
| 49 | Server => $server, |
|---|
| 50 | Port => 6667, |
|---|
| 51 | Username => 'perlbui@veekun.com', |
|---|
| 52 | ); |
|---|
| 53 | |
|---|
| 54 | $irc_conn->add_handler(376, \&irc_connect); |
|---|
| 55 | $irc_conn->add_handler(422, \&irc_connect); |
|---|
| 56 | $irc_conn->add_handler('public', \&irc_public); |
|---|
| 57 | |
|---|
| 58 | |
|---|
| 59 | |
|---|
| 60 | |
|---|
| 61 | my $jabber_conn = new Net::Jabber::Client; |
|---|
| 62 | |
|---|
| 63 | $jabber_conn->SetCallBacks( message => \&jabber_message ); |
|---|
| 64 | |
|---|
| 65 | $jabber_conn->Connect( hostname => 'jabber.org' ) or die "Can't connect to Jabber server: $!"; |
|---|
| 66 | |
|---|
| 67 | my @result = $jabber_conn->AuthSend( username => 'perlbui', password => 'pretzel', resource => 'Perlbui 0.1' ); |
|---|
| 68 | |
|---|
| 69 | if ($result[0] ne "ok") { |
|---|
| 70 | die "Jabber auth failed: $result[0] - $result[1]"; |
|---|
| 71 | } |
|---|
| 72 | |
|---|
| 73 | REPLACEME("Connected to Jabber"); |
|---|
| 74 | |
|---|
| 75 | $jabber_conn->RosterGet; |
|---|
| 76 | $jabber_conn->PresenceSend; |
|---|
| 77 | |
|---|
| 78 | |
|---|
| 79 | |
|---|
| 80 | |
|---|
| 81 | $SIG{TERM} = \&abort; |
|---|
| 82 | |
|---|
| 83 | |
|---|
| 84 | while (1) { |
|---|
| 85 | $irc->do_one_loop; |
|---|
| 86 | my $jabber_status = $jabber_conn->Process(0); |
|---|
| 87 | die if not defined $jabber_status; |
|---|
| 88 | } |
|---|
| 89 | |
|---|
| 90 | |
|---|
| 91 | |
|---|
| 92 | |
|---|
| 93 | |
|---|
| 94 | sub abort { |
|---|
| 95 | $jabber_conn->Disconnect; |
|---|
| 96 | undef $irc; |
|---|
| 97 | exit 0; |
|---|
| 98 | } |
|---|
| 99 | |
|---|
| 100 | |
|---|
| 101 | |
|---|
| 102 | sub irc_connect { |
|---|
| 103 | my ($self) = @_; |
|---|
| 104 | |
|---|
| 105 | REPLACEME("Successfully connected to " . $self->server); |
|---|
| 106 | |
|---|
| 107 | for my $channel (keys %{$Connections{ $self->server }}) { |
|---|
| 108 | REPLACEME("Joining $channel"); |
|---|
| 109 | $self->join($channel); |
|---|
| 110 | } |
|---|
| 111 | } |
|---|
| 112 | |
|---|
| 113 | |
|---|
| 114 | |
|---|
| 115 | sub irc_public { |
|---|
| 116 | my ($self, $event) = @_; |
|---|
| 117 | my ($line) = $event->args; |
|---|
| 118 | |
|---|
| 119 | my $nick = $self->nick; |
|---|
| 120 | my ($to_me) = ($line =~ /^ $nick[:,] \s+ (.+?) [?!.]? $/ix); |
|---|
| 121 | return if not defined $to_me; |
|---|
| 122 | |
|---|
| 123 | my $response = Vee::Bot::dispatcher($to_me); |
|---|
| 124 | |
|---|
| 125 | |
|---|
| 126 | $response ||= 'What?'; |
|---|
| 127 | |
|---|
| 128 | $self->privmsg($event->to, $event->nick . ': ' . $response); |
|---|
| 129 | } |
|---|
| 130 | |
|---|
| 131 | |
|---|
| 132 | |
|---|
| 133 | sub jabber_message { |
|---|
| 134 | my ($sid, $message) = @_; |
|---|
| 135 | |
|---|
| 136 | my $type = $message->GetType; |
|---|
| 137 | my $from = $message->GetFrom("jid")->GetUserID; |
|---|
| 138 | |
|---|
| 139 | |
|---|
| 140 | |
|---|
| 141 | my $body = $message->GetBody; |
|---|
| 142 | return if not $body; |
|---|
| 143 | |
|---|
| 144 | my $response = Vee::Bot::dispatcher($body); |
|---|
| 145 | $response ||= 'What?'; |
|---|
| 146 | |
|---|
| 147 | my $reply = $message->Reply; |
|---|
| 148 | $reply->SetMessage( body => $response ); |
|---|
| 149 | $jabber_conn->Send($reply); |
|---|
| 150 | } |
|---|
| 151 | |
|---|
| 152 | |
|---|
| 153 | |
|---|
| 154 | |
|---|
| 155 | |
|---|
| 156 | sub REPLACEME { |
|---|
| 157 | warn shift; |
|---|
| 158 | } |
|---|