ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Net-Knuddels/eg/knuddels2irc
Revision: 1.1
Committed: Fri Jan 14 20:56:01 2005 UTC (21 years, 8 months ago) by elmex
Branch: MAIN
Log Message:
a first knuddesl2irc gateway.

File Contents

# Content
1 #!/usr/bin/perl
2
3 use strict;
4 use lib '../Net-IRC-Server/';
5 use IO::Select;
6 use Socket;
7 use IO::Socket::INET;
8 use Event;
9 use Net::Knuddels;
10 use Net::IRC::Server;
11
12 my $client;
13 my $ircsrv;
14 my %irc_clients;
15
16 my %knuddel_to_irc;
17 my %irc_to_knuddel;
18 my %knuddel_channels;
19 my %irc_chan_to_knuddel;
20
21 my $kn_active;
22
23 my %privmsg_receiver;
24
25
26 sub ready_irc_server {
27 $ircsrv = Net::IRC::Server->new (srv_prefix => "this.de");
28
29 $ircsrv->set_send_cb (sub {
30 my ($cl, $data, @msg) = @_;
31
32 if (not defined $cl->{socket}) {
33 return 1;
34 }
35
36 }, 'PRIVMSG');
37
38 $ircsrv->set_cmd_cb ('!', sub {
39 my ($cl, $msg) = @_;
40 $privmsg_receiver{$cl->{nickname}} = $cl;
41 });
42
43 $ircsrv->set_cmd_cb ('PRIVMSG', sub {
44 my ($cl, $msg) = @_;
45
46 my $targ = $msg->{params}->[0];
47 my $imsg = $msg->{params}->[1];
48
49 print "::: $targ :: $imsg \n";
50 print join(',', keys %knuddel_channels). "<<<<<<<<\n";
51 if (defined $knuddel_channels{lc $targ}) {
52 $client->send_room_msg (irc_to_room ($targ), $imsg);
53
54 return 1;
55 } elsif (defined $irc_to_knuddel{lc $targ}) {
56 my $cl = $irc_to_knuddel{lc $targ};
57
58 $client->send_priv_msg ($cl->{knuddelnick}, $cl->{knuddelroom}, $imsg);
59 return 1;
60 }
61 return 0;
62 });
63 $ircsrv->set_send_cb (sub {
64 my ($cl, $data) = @_;
65
66 if (defined $cl->{socket}) { # a knuddels-client
67
68 $cl->{socket}->syswrite ($data);
69 print "send $cl->{nickname}> $data"
70 }
71 });
72
73 my $sock = IO::Socket::INET->new(
74 Listen => 5,
75 # LocalAddr => localhost,
76 LocalPort => 6667,
77 Proto => 'tcp',
78 ReuseAddr => 1);
79
80 if (!$sock) { die "Couldn't get listening socket: $!\n" }
81
82 Event->io (
83 fd => $sock,
84 poll => 'r',
85 cb => sub {
86 my $newfh = $sock->accept ();
87 my $addr = $newfh->sockaddr ();
88 $irc_clients{$newfh} = { hostname => inet_ntoa ($addr), socket => $newfh };
89
90 Event->io (
91 fd => $newfh,
92 poll => 'r',
93 cb => sub {
94 my ($e) = @_;
95
96 my $data;
97 my $c = $newfh->sysread ($data, 2048);
98 print "recv $irc_clients{$newfh}->{nickname}> $data";
99
100 if ($c == 0) {
101 $e->w->cancel ();
102 $newfh->close ();
103
104 } else {
105 $ircsrv->feed_irc_data ($irc_clients{$newfh}, $data);
106 }
107 });
108 });
109 }
110 sub connect_knuddels {
111 return if $kn_active; # don't make another login if we are already in
112
113 $client->login;
114 Event->io (
115 fd => $client->fh,
116 poll => 'r',
117 cb => sub {
118 my $e = shift;
119 if (not $client->ready) {
120 $e->w->cancel;
121 }
122 });
123 }
124
125 sub room_to_irc {
126 my $o = $_[0];
127 $_[0] =~ s/[ ]/_/g;
128 $_[0] =~ s/[^a-zA-Z0-9_-]*//g;
129 $irc_chan_to_knuddel{lc "#$_[0]"} = $o;
130 lc "#$_[0]"
131 }
132
133 sub irc_to_room {
134 $irc_chan_to_knuddel{lc $_[0]};
135 }
136
137 sub knuddel_room_msg {
138 my ($room, $user, $msg) = @_;
139
140 $room = room_to_irc $room;
141 my $kncl = $knuddel_channels{$room}->{knd}->{lc $user};
142 $ircsrv->generic_msg ($kncl, $room, "PRIVMSG", $msg);
143 }
144
145 sub knuddel_priv_msg {
146 my ($room, $src, $dst, $msg) = @_;
147
148 my $srccl = $knuddel_to_irc{lc $src};
149 # not of much meaning ;) # my $dstcl = $knuddel_channels{room_to_irc $room}->{knd}->{lc $dst};
150
151 $ircsrv->generic_msg ($srccl, $_, "PRIVMSG", $msg) for keys %privmsg_receiver;
152 }
153
154 sub part_knuddels_nick {
155 my ($knuddels_nick, $room) = @_;
156
157 $room = room_to_irc $room;
158
159 my $kncl = $knuddel_channels{$room}->{knd}->{lc $knuddels_nick};
160 delete $knuddel_channels{$room}->{irc}->{lc $kncl->{nickname}};
161
162 $ircsrv->part_channel ($kncl, $room)
163 }
164
165 sub action_knuddels {
166 my ($room, $action) = @_;
167 $ircsrv->generic_msg ({ nickname => "|", username => "server", hostname => "localhost" },
168 room_to_irc ($room), "PRIVMSG", $action) for keys %privmsg_receiver;
169 }
170
171 sub join_knuddels_nick {
172 my ($knuddel_nick, $age, $gender, $room) = @_;
173 my $orig_knick = $knuddel_nick;
174 $knuddel_nick =~ s/[ ]/_/g;
175 # $knuddel_nick =~ s/[ä]/ae/g;
176 # $knuddel_nick =~ s/[Ä]/ae/g;
177 # $knuddel_nick =~ s/[ö]/oe/g;
178 # $knuddel_nick =~ s/[Ö]/Oe/g;
179 # $knuddel_nick =~ s/[ü]/ue/g;
180 # $knuddel_nick =~ s/[Ü]/Ue/g;
181 # $knuddel_nick =~ s/[ß]/ss/g;
182 $knuddel_nick =~ s/[^a-zA-Z0-9_-]*//g;
183
184 if (defined $irc_to_knuddel{lc $knuddel_nick}) {
185 my $d = 2;
186
187 while (defined $irc_to_knuddel{lc ($knuddel_nick.$d)}) {
188 $d++;
189 }
190 $knuddel_nick = $knuddel_nick.$d;
191 }
192
193 $irc_to_knuddel{lc $knuddel_nick} = {
194 nickname => $knuddel_nick,
195 username => $knuddel_nick,
196 hostname => "knuddels.de",
197 realname => "$knuddel_nick ($age) [$gender]",
198 knuddelnick => $orig_knick,
199 knuddelroom => $room,
200 registered => 1
201 };
202
203 my $kncl = $knuddel_to_irc{lc $orig_knick} = $irc_to_knuddel{lc $knuddel_nick};
204
205 $room = room_to_irc $room;
206
207 $knuddel_channels{$room}->{knd}->{lc $orig_knick} = $kncl;
208 $knuddel_channels{$room}->{irc}->{lc $knuddel_nick} = $kncl;
209
210 $ircsrv->join_channel ($kncl, $room)
211 }
212
213 ####################################################################################
214 ########################## MAIN START ##############################################
215 ####################################################################################
216
217 $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710";
218
219
220 $client->register (UNHANDLED => sub {
221 use Dumpvalue;
222 print "---\n";
223 Dumpvalue->new (compactDump => 1, veryCompact => 1, quoteHighBit => 1, tick => '"')->dumpValue ([@_]);
224 });
225
226 $client->register (login => sub {
227 $client->set_nick ("Wolke7 2", "Net-Knuddels", "lolfe");
228 $kn_active = 1;
229 });
230
231 $client->register (msg_room => sub {
232 my ($room, $user, $msg) = @_;
233 print "($room) $user: $msg\n";
234 knuddel_room_msg ($room, $user, $msg);
235 });
236
237 $client->register (msg_priv => sub {
238 my ($room, $src, $dst, $msg) = @_;
239 print "($room) ########### $src an $dst: $msg\n";
240 knuddel_priv_msg ($room, $src, $dst, $msg);
241 });
242
243 $client->register (join_room => sub {
244 print "$_[1]->{name} joined $_[0]: ".scalar(keys %{$client->{user_lists}->{lc $_[0]}}). " users\n";
245 join_knuddels_nick ($_[1]->{name}, $_[1]->{age}, $_[1]->{gender}, $_[0]);
246 });
247
248 $client->register (action_room => sub {
249 action_knuddels ($_[0], $_[1]);
250 });
251 $client->register (part_room => sub {
252 print "$_[1]->{name} left $_[0]: ".scalar(keys %{$client->{user_lists}->{lc $_[0]}}). " users\n";
253 part_knuddels_nick ($_[1]->{name}, $_[0]);
254 });
255
256 $client->register (user_list => sub {
257 my ($room, $list) = @_;
258 print "***** USER JOIN FUER $room *****\n";
259
260 join_knuddels_nick ($_->{name}, $_->{age}, $_->{gender}, $room)
261 for values %$list;
262
263 print scalar (keys %$list)." users\n";
264 print "********************************\n";
265 });
266
267 $client->register (room_info => sub {
268 my ($room, $ri) = @_;
269 print "ROOM INFO: $room : $ri->{picture}\n";
270 });
271
272 ready_irc_server;
273 connect_knuddels;
274 Event::loop;
275
276
277