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