ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/markovd
Revision: 1.17
Committed: Sat Jan 29 06:23:07 2005 UTC (21 years, 7 months ago) by root
Branch: MAIN
Changes since 1.16: +2 -2 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 use String::Similarity;
14
15 my @CHANNELS = (
16 'Flirt',
17 'Flirt Private',
18 'Flirt Private 2',
19 'Singles 11-14',
20 'Singles 11-14 2',
21 'Singles 15-17',
22
23 'Flirt 2',
24 'Singles 11-14 3',
25 'Singles 15-17 2',
26 'Flirt 3',
27 'Singles 11-14 4',
28 'Singles 15-17 3',
29 'Flirt 4',
30 'Singles 11-14 5',
31 'Singles 15-17 4',
32 'Flirt 5',
33 'Singles 11-14 6',
34 'Singles 15-17 5',
35 'Flirt 6',
36 'Singles 11-14 7',
37 'Singles 15-17 6',
38 'Flirt 7',
39 'Singles 11-14 8',
40 'Singles 15-17 7',
41 'Flirt 8',
42 'Singles 11-14 9',
43 'Singles 15-17 8',
44 );
45
46 my $logdir = "logs";
47
48 my $Knick = "baileysmaedl";
49 my $Kpass = "qwerty";
50
51 my $client;
52
53 my $seed = Load do { open my $fh, "<", "markovbot.dat"; binmode $fh, ":utf8"; local $/; <$fh> };
54 $seed ||= [];
55
56 my $markov = new Algorithm::MarkovChain;
57
58 sub seed_msg {
59 my $msg = $_[0];
60
61 return if $msg =~ /leck|fick|m.se|uschi|fikkn|bumsen|wichs|wix|popp|popen|fuck|dreck|laber|saugen
62 |blasen
63 |hure|strich
64 |stengel|penis|schwanz|pimmel|steifen
65 |\bcs\b|\bts\b|\brs\b
66 |cam\b|\bmsn\b|\bbot\b|\bchat.*bot\b|tanga|schlafen|sex|\bsau\b
67 |intim|arsch|fotze|dumm|schnauze|klappe|rasiert|fresse|maul\b|\bmaul
68 |zieh.*aus|nackt
69 |sätz|saetz|setze|\bsatz
70 |schwul|schwuchtel|transe|transv
71 |(?-i:[A-Z]{4,})
72 /xi;
73
74 my @msg = $msg =~ m/(\S+)/g;
75
76 $markov->seed (symbols => \@msg, longest => 10);
77 }
78
79 for (@$seed) {
80 seed_msg $_;
81 }
82
83 sub gen_reply {
84 my ($msg) = @_;
85
86 my $reply;
87 my $best = -1;
88
89 for (1..20) {
90 my $r = join " ", $markov->spew (length => 5, stop_at_terminal => 1);
91 my $b = similarity lc $msg, lc $r, $best;
92 ($reply, $best) = ($r, $b) if $b > $best;
93 }
94
95 $reply;
96 }
97
98 Event->signal (signal => "INT", cb => sub { Event::unloop(-1) });
99
100 Event->timer (interval => 60, cb => sub {
101 open my $fh, ">", "markovbot.dat~"
102 or return;
103 print $fh Encode::encode_utf8 Dump $seed;
104 close $fh;
105 rename "markovbot.dat~", "markovbot.dat";
106 });
107
108 sub connect_knuddels {
109 $client->login;
110 Event->io (
111 fd => $client->fh,
112 poll => 'r',
113 cb => sub {
114 my $e = shift;
115 if (not $client->ready) {
116 $e->w->cancel;
117 }
118 });
119 }
120
121 sub logit {
122 my ($msg, $file, $src, $dst, $room) = @_;
123
124 mkdir $logdir;
125 my $fh;
126
127 unless (open $fh, ">>:utf8", Encode::encode_utf8 "$logdir/$file") {
128 warn "Couldn't open for appending $logdir/$src: $!\n";
129 return;
130 }
131
132 print $fh "$room\t$src\t$dst\t$msg\n";
133 }
134
135 ####################################################################################
136 ########################## MAIN START ##############################################
137 ####################################################################################
138
139 $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
140
141 #$client->register (ALL => sub {
142 # use Dumpvalue;
143 # print "---\n";
144 # Dumpvalue->new (compactDump => 1, veryCompact => 1, quoteHighBit => 1, tick => '"')->dumpValue ([@_]);
145 #});
146
147 $client->register (login => sub {
148 Event->timer (after => 0, interval => 1, repeat => 0, cb => sub {
149 my $channel = pop @CHANNELS
150 or return;
151
152 $client->enter_room ($channel, $Knick, $Kpass);
153 $_[0]->w->again;
154 });
155 });
156
157 $client->register (msg_room => sub {
158 my ($room, $user, $msg) = @_;
159 });
160
161 my @queue;
162
163 Event->timer (interval => 1, cb => sub {
164 my $msg = shift @queue
165 or return;
166
167 logit ($msg->[2], $msg->[0], $Knick, $msg->[0], $msg->[1]);
168 $client->send_priv_msg (@$msg);
169 });
170
171 my %last;
172
173 $client->register (room_info => sub {
174 print "JOIN ROOM: $_[0]\n";
175 });
176
177 $client->register (msg_priv_nondup => sub {
178 my ($room, $src, $dst, $msg) = @_;
179
180 return if $last{$src} eq $msg; $last{$src} = $msg;
181
182 $msg =~ s/\260[^\260]*\260//g;
183
184 print "($room) $src >> $msg\n";
185 logit ($msg, $src, $src, $dst, $room);
186
187 push @$seed, $msg;
188 seed_msg $msg;
189
190 my $reply = gen_reply $msg;
191
192 my $delay = 30 * (rand) ** 5 + 0.3 * length $reply;
193
194 print "($room) $src << $reply ($delay)\n";
195
196 Event->timer (after => $delay, cb => sub {
197 push @queue, [$src, $room, $reply];
198 });
199 });
200
201 connect_knuddels;
202 Event::loop;
203