ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/markovd
Revision: 1.3
Committed: Fri Jan 28 02:47:19 2005 UTC (21 years, 7 months ago) by elmex
Branch: MAIN
Changes since 1.2: +4 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 elmex 1.1 #!/usr/bin/perl
2    
3     use strict;
4 root 1.2
5 elmex 1.1 use Socket;
6     use IO::Socket::INET;
7 root 1.2
8     use YAML;
9     use Encode;
10 elmex 1.1 use Event;
11     use Net::Knuddels;
12 root 1.2 use Algorithm::MarkovChain;
13 elmex 1.1
14     my @CHANNELS = (
15 elmex 1.3 'Flirt',
16     'Flirt 2',
17     'Flirt 3',
18     'Flirt 4',
19 elmex 1.1 );
20    
21     my $Knick = "ich bin suess";
22     my $Kpass = "qwerty";
23    
24     my $client;
25    
26 root 1.2 my $seed = Load do { open my $fh, "<", "markovd.dat"; binmode $fh, ":utf8"; local $/; <$fh> };
27     $seed ||= [];
28    
29     $SIG{INT} = sub { Event::unloop(-1) };
30    
31     Event->timer (interval => 1, cb => sub {
32     open my $fh, ">", "markovd.dat~"
33     or return;
34     print $fh Encode::encode_utf8 Dump $seed;
35     close $fh;
36     rename "markovd.dat~", "markovd.dat";
37     });
38    
39 elmex 1.1 sub connect_knuddels {
40     $client->login;
41     Event->io (
42     fd => $client->fh,
43     poll => 'r',
44     cb => sub {
45     my $e = shift;
46     if (not $client->ready) {
47     $e->w->cancel;
48     }
49     });
50     }
51    
52     ####################################################################################
53     ########################## MAIN START ##############################################
54     ####################################################################################
55    
56     $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
57    
58     $client->register (login => sub {
59     $client->enter_room ($_, $Knick, $Kpass)
60     for (@CHANNELS);
61     });
62    
63     $client->register (msg_room => sub {
64     my ($room, $user, $msg) = @_;
65 root 1.2 });
66    
67     my @queue;
68    
69     Event->timer (interval => 1, cb => sub {
70     my $msg = shift @queue
71     or return;
72    
73     $client->send_priv_msg (@$msg);
74 elmex 1.1 });
75    
76     $client->register (msg_priv => sub {
77     my ($room, $src, $dst, $msg) = @_;
78    
79 root 1.2 return if $src eq "James";
80     return if $src eq $Knick;
81    
82     print "($room) $src >> $msg\n";
83    
84     push @$seed, grep $_, $msg =~ /(\S+)/g;
85    
86     my $markov = new Algorithm::MarkovChain;
87     $markov->seed (symbols => $seed, longest => 7);
88 elmex 1.1
89 root 1.2 my $reply = join " ", $markov->spew (length => 1, stop_at_terminal => 1);
90 elmex 1.1
91 root 1.2 print "($room) $src << $reply\n";
92 elmex 1.1
93 root 1.2 my $delay = (rand 8) + 0.2 * length $reply;
94     warn "delay $delay\n";
95 elmex 1.1
96 root 1.2 Event->timer (after => $delay, cb => sub {
97     push @queue, [$src, $room, $reply];
98     });
99 elmex 1.1 });
100    
101     connect_knuddels;
102     Event::loop;