ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/markovd
Revision: 1.5
Committed: Fri Jan 28 02:59:28 2005 UTC (21 years, 7 months ago) by elmex
Branch: MAIN
Changes since 1.4: +3 -0 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 'Flirt',
16 'Flirt 2',
17 'Flirt 3',
18 'Flirt 4',
19 'Singles 11-14',
20 'Singles 11-14 2',
21 'Singles 11-14 3',
22 );
23
24 my $logdir = "logs/";
25
26 my $Knick = "ich bin suess";
27 my $Kpass = "qwerty";
28
29 my $client;
30
31 my $seed = Load do { open my $fh, "<", "markovd.dat"; binmode $fh, ":utf8"; local $/; <$fh> };
32 $seed ||= [];
33
34 $SIG{INT} = sub { Event::unloop(-1) };
35
36 Event->timer (interval => 1, cb => sub {
37 open my $fh, ">", "markovd.dat~"
38 or return;
39 print $fh Encode::encode_utf8 Dump $seed;
40 close $fh;
41 rename "markovd.dat~", "markovd.dat";
42 });
43
44 sub connect_knuddels {
45 $client->login;
46 Event->io (
47 fd => $client->fh,
48 poll => 'r',
49 cb => sub {
50 my $e = shift;
51 if (not $client->ready) {
52 $e->w->cancel;
53 }
54 });
55 }
56
57 sub logit {
58 my ($msg, $src, $dst, $room) = @_;
59
60 unless (-e $logdir) {
61 mkdir $logdir;
62 }
63
64 unless (open T, ">>$logdir/$src") {
65 warn "Couldn't open for appending $logdir/$src: $!\n";
66 return;
67 }
68
69 print T "$room\t$src\t$dst\t$msg\n";
70 close T;
71 }
72
73 ####################################################################################
74 ########################## MAIN START ##############################################
75 ####################################################################################
76
77 $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
78
79 $client->register (login => sub {
80 $client->enter_room ($_, $Knick, $Kpass)
81 for (@CHANNELS);
82 });
83
84 $client->register (msg_room => sub {
85 my ($room, $user, $msg) = @_;
86 });
87
88 my @queue;
89
90 Event->timer (interval => 1, cb => sub {
91 my $msg = shift @queue
92 or return;
93
94 $client->send_priv_msg (@$msg);
95 });
96
97 $client->register (msg_priv => sub {
98 my ($room, $src, $dst, $msg) = @_;
99
100 return if $src eq "James";
101 return if $src eq $Knick;
102
103 print "($room) $src >> $msg\n";
104 logit ($msg, $src, $dst, $room);
105
106 push @$seed, grep $_, $msg =~ /(\S+)/g;
107
108 my $markov = new Algorithm::MarkovChain;
109 $markov->seed (symbols => $seed, longest => 7);
110
111 my $reply = join " ", $markov->spew (length => 1, stop_at_terminal => 1);
112
113 print "($room) $src << $reply\n";
114 logit ($reply, $Knick, $src, $room);
115
116 my $delay = (rand 8) + 0.2 * length $reply;
117 warn "delay $delay\n";
118
119 Event->timer (after => $delay, cb => sub {
120 push @queue, [$src, $room, $reply];
121 });
122 });
123
124 connect_knuddels;
125 Event::loop;