ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/markovd
Revision: 1.12
Committed: Sat Jan 29 00:31:30 2005 UTC (21 years, 7 months ago) by root
Branch: MAIN
Changes since 1.11: +5 -6 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 Private',
17 'Flirt Private 2',
18 'Singles 11-14',
19 'Singles 11-14 2',
20 'Singles 15-17',
21
22 'Flirt 2',
23 'Singles 11-14 3',
24 'Singles 15-17 2',
25 'Flirt 3',
26 'Singles 11-14 4',
27 'Singles 15-17 3',
28 'Flirt 4',
29 'Singles 11-14 5',
30 'Singles 15-17 4',
31 'Flirt 5',
32 'Singles 11-14 6',
33 'Singles 15-17 5',
34 'Flirt 6',
35 'Singles 11-14 7',
36 'Singles 15-17 6',
37 'Flirt 7',
38 'Singles 11-14 8',
39 'Singles 15-17 7',
40 'Flirt 8',
41 'Singles 11-14 9',
42 'Singles 15-17 8',
43 );
44
45 my $logdir = "logs/";
46
47 my $Knick = "ich bin suess";
48 my $Kpass = "qwerty";
49
50 my $client;
51
52 my $seed = Load do { open my $fh, "<", "markovbot.dat"; binmode $fh, ":utf8"; local $/; <$fh> };
53 $seed ||= [];
54
55 my $markov = new Algorithm::MarkovChain;
56
57 sub seed_msg {
58 my $msg = $_[0];
59 my @msg = $msg =~ m/(\S+)/g;
60
61 $markov->seed (symbols => \@msg, longest => 10);
62 }
63
64 for (@$seed) {
65 seed_msg $_;
66 }
67
68 sub gen_reply {
69 my ($msg) = @_;
70
71 join " ", $markov->spew (length => 15, stop_at_terminal => 1)
72 }
73
74 Event->signal (signal => "INT", cb => sub { Event::unloop(-1) });
75
76 Event->timer (interval => 60, cb => sub {
77 open my $fh, ">", "markovbot.dat~"
78 or return;
79 print $fh Encode::encode_utf8 Dump $seed;
80 close $fh;
81 rename "markovbot.dat~", "markovbot.dat";
82 });
83
84 sub connect_knuddels {
85 $client->login;
86 Event->io (
87 fd => $client->fh,
88 poll => 'r',
89 cb => sub {
90 my $e = shift;
91 if (not $client->ready) {
92 $e->w->cancel;
93 }
94 });
95 }
96
97 sub logit {
98 my ($msg, $file, $src, $dst, $room) = @_;
99
100 mkdir $logdir;
101 my $fh;
102
103 unless (open $fh, ">>", Encode::encode_utf8 "$logdir/$file") {
104 warn "Couldn't open for appending $logdir/$src: $!\n";
105 return;
106 }
107
108 binmode $fh, ":utf8";
109 print $fh "$room\t$src\t$dst\t$msg\n";
110 }
111
112 ####################################################################################
113 ########################## MAIN START ##############################################
114 ####################################################################################
115
116 $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
117
118 #$client->register (ALL => sub {
119 # use Dumpvalue;
120 # print "---\n";
121 # Dumpvalue->new (compactDump => 1, veryCompact => 1, quoteHighBit => 1, tick => '"')->dumpValue ([@_]);
122 #});
123
124 $client->register (login => sub {
125 for (@CHANNELS) {
126 print "JOIN($_)\n";
127 $client->enter_room ($_, $Knick, $Kpass);
128 sleep 1;
129 }
130 });
131
132 $client->register (msg_room => sub {
133 my ($room, $user, $msg) = @_;
134 });
135
136 my @queue;
137
138 Event->timer (interval => 1, cb => sub {
139 my $msg = shift @queue
140 or return;
141
142 logit ($msg->[2], $msg->[0], $Knick, $msg->[0], $msg->[1]);
143 $client->send_priv_msg (@$msg);
144 });
145
146 my %last;
147
148 $client->register (msg_priv_nondup => sub {
149 my ($room, $src, $dst, $msg) = @_;
150
151 return if $last{$src} eq $msg; $last{$src} = $msg;
152
153 $msg =~ s/\260[^\260]*\260//g;
154
155 print "($room) $src >> $msg\n";
156 logit ($msg, $src, $src, $dst, $room);
157
158 push @$seed, $msg;
159
160 my $reply = gen_reply $msg;
161
162 my $delay = 30 * (rand) ** 5 + 0.3 * length $reply;
163
164 print "($room) $src << $reply ($delay)\n";
165
166 Event->timer (after => $delay, cb => sub {
167 push @queue, [$src, $room, $reply];
168 });
169 });
170
171 connect_knuddels;
172 Event::loop;
173