ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/markovd
Revision: 1.11
Committed: Sat Jan 29 00:23:07 2005 UTC (21 years, 7 months ago) by root
Branch: MAIN
Changes since 1.10: +59 -25 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 unless (-e $logdir) {
101 mkdir $logdir;
102 }
103
104 unless (open T, ">>$logdir/$file") {
105 warn "Couldn't open for appending $logdir/$src: $!\n";
106 return;
107 }
108
109 print T "$room\t$src\t$dst\t$msg\n";
110 close T;
111 }
112
113 ####################################################################################
114 ########################## MAIN START ##############################################
115 ####################################################################################
116
117 $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
118
119 #$client->register (ALL => sub {
120 # use Dumpvalue;
121 # print "---\n";
122 # Dumpvalue->new (compactDump => 1, veryCompact => 1, quoteHighBit => 1, tick => '"')->dumpValue ([@_]);
123 #});
124
125 $client->register (login => sub {
126 for (@CHANNELS) {
127 print "JOIN($_)\n";
128 $client->enter_room ($_, $Knick, $Kpass);
129 sleep 1;
130 }
131 });
132
133 $client->register (msg_room => sub {
134 my ($room, $user, $msg) = @_;
135 });
136
137 my @queue;
138
139 Event->timer (interval => 1, cb => sub {
140 my $msg = shift @queue
141 or return;
142
143 logit ($msg->[2], $msg->[0], $Knick, $msg->[0], $msg->[1]);
144 $client->send_priv_msg (@$msg);
145 });
146
147 my %last;
148
149 $client->register (msg_priv_nondup => sub {
150 my ($room, $src, $dst, $msg) = @_;
151
152 return if $last{$src} eq $msg; $last{$src} = $msg;
153
154 $msg =~ s/\260[^\260]*\260//g;
155
156 print "($room) $src >> $msg\n";
157 logit ($msg, $src, $src, $dst, $room);
158
159 push @$seed, $msg;
160
161 my $reply = gen_reply $msg;
162
163 my $delay = 30 * (rand) ** 5 + 0.3 * length $reply;
164
165 print "($room) $src << $reply ($delay)\n";
166
167 Event->timer (after => $delay, cb => sub {
168 push @queue, [$src, $room, $reply];
169 });
170 });
171
172 connect_knuddels;
173 Event::loop;
174