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

# 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.5 'Singles 11-14',
20     'Singles 11-14 2',
21     'Singles 11-14 3',
22 elmex 1.1 );
23    
24 elmex 1.4 my $logdir = "logs/";
25    
26 elmex 1.1 my $Knick = "ich bin suess";
27     my $Kpass = "qwerty";
28    
29     my $client;
30    
31 root 1.2 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 elmex 1.1 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 elmex 1.4 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 elmex 1.1 ####################################################################################
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 root 1.2 });
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 elmex 1.1 });
96    
97     $client->register (msg_priv => sub {
98     my ($room, $src, $dst, $msg) = @_;
99    
100 root 1.2 return if $src eq "James";
101     return if $src eq $Knick;
102    
103     print "($room) $src >> $msg\n";
104 elmex 1.4 logit ($msg, $src, $dst, $room);
105 root 1.2
106     push @$seed, grep $_, $msg =~ /(\S+)/g;
107    
108     my $markov = new Algorithm::MarkovChain;
109     $markov->seed (symbols => $seed, longest => 7);
110 elmex 1.1
111 root 1.2 my $reply = join " ", $markov->spew (length => 1, stop_at_terminal => 1);
112 elmex 1.1
113 root 1.2 print "($room) $src << $reply\n";
114 elmex 1.4 logit ($reply, $Knick, $src, $room);
115 elmex 1.1
116 root 1.2 my $delay = (rand 8) + 0.2 * length $reply;
117     warn "delay $delay\n";
118 elmex 1.1
119 root 1.2 Event->timer (after => $delay, cb => sub {
120     push @queue, [$src, $room, $reply];
121     });
122 elmex 1.1 });
123    
124     connect_knuddels;
125     Event::loop;