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

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