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