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

File Contents

# Content
1 #!/usr/bin/perl
2
3 use strict;
4
5 use Socket;
6 use IO::Socket::INET;
7
8 use YAML;
9 use Encode;
10 use Event;
11 use Net::Knuddels;
12 use Algorithm::MarkovChain;
13
14 my @CHANNELS = (
15 'Singles 11-14',
16 'Singles 11-14 2',
17 'Singles 11-14 3',
18 'Singles 11-14 4',
19 );
20
21 my $Knick = "ich bin suess";
22 my $Kpass = "qwerty";
23
24 my $client;
25
26 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 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 });
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 });
75
76 $client->register (msg_priv => sub {
77 my ($room, $src, $dst, $msg) = @_;
78
79 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
89 my $reply = join " ", $markov->spew (length => 1, stop_at_terminal => 1);
90
91 print "($room) $src << $reply\n";
92
93 my $delay = (rand 8) + 0.2 * length $reply;
94 warn "delay $delay\n";
95
96 Event->timer (after => $delay, cb => sub {
97 push @queue, [$src, $room, $reply];
98 });
99 });
100
101 connect_knuddels;
102 Event::loop;