#!/usr/bin/perl package main; use strict; use lib '../Net-IRC-Server/'; use Gtk2 -init; use Gtk2::SimpleList; use Gtk2::Helper; use IO::Select; use IO::Socket::INET; use Socket; use Net::Knuddels; use YAML; my %CFG = ( knuddel_nick => "Net-Knuddels", knuddel_pass => "lolfe", knuddel_chan => "Flirt Private", ); scan_config (); my $client; my $kn_active; sub scan_config { my $config = $ENV{HOME}."/.knuddels2irc2.rc"; if (! -e $config) { return; } my $h = YAML::LoadFile $config; if (defined $h and ref $h eq "HASH") { %CFG = (%CFG, %$h); } else { die "$config is not a map!"; } } sub connect_knuddels { return if $kn_active; # don't make another login if we are already in $client->login; Gtk2::Helper->add_watch ($client->fh()->fileno, 'in', sub { my ($fh, $tag) = @_; if (not $client->ready) { Gtk2::Helper->remove_watch ($tag) or die "Couldn't remove watcher for knuddels connection\n"; $client->fh ()->close; return 1; } return 1; }); } #################################################################################### ########################## BUILD GUI ############################################### #################################################################################### my $ntb; my %targets; ##### CONSTRUCT ROOMLIST: my $roomlist = new Gtk2::SimpleList ( 'Channel' => 'text', 'Users' => 'int', 'Full' => 'text' ); $roomlist->signal_connect (row_activated => sub { my ($l, $path, $column) = @_; my $row = $l->get_row_data_from_path ($path); $client->enter_room ($row->[0], $CFG{knuddel_nick}, $CFG{knuddel_pass}); }); my $list_win = Gtk2::Window->new ('toplevel'); $list_win->set_default_size (200, 500); $list_win->add (my $sw = new Gtk2::ScrolledWindow); $sw->add ($roomlist); ##### CONSTRUCT MAINWINDOW my $main = Gtk2::Window->new ('toplevel'); $main->set_default_size (400, 400); $main->add (my $vb = new Gtk2::VBox (0, 2)); $vb->pack_start (my $hb = new Gtk2::HBox (1, 2), 0, 1, 2); $hb->pack_start (my $btn = new Gtk2::Button ("connect"), 0, 1, 2); $btn->signal_connect (clicked => sub { connect_knuddels (); }); $hb->pack_start (my $btn = new Gtk2::Button ("list"), 0, 1, 2); $btn->signal_connect (clicked => sub { if (not $list_win->visible) { $list_win->show_all; } else { $list_win->hide_all; } }); $hb->pack_start (my $e = new Gtk2::Entry, 0, 1, 2); $e->signal_connect (activate => sub { create_target ($e->get_text (), 1); $e->set_text (""); }); $vb->pack_start ($ntb = new Gtk2::Notebook, 1, 1, 2); #################################################################################### ########################## MAIN START ############################################## #################################################################################### sub send_keepalive { my ($room) = grep { defined $_->{room} } values %targets; return if not defined $room; $client->send_room_msg ($room->{room}, "/knuschel"); } sub create_target { my ($targ, $priv) = @_; $ntb->append_page (my $vb = new Gtk2::VBox (0, 0), $targ); $vb->pack_start (my $txt = new Gtk2::TextView, 1, 1, 2); $txt->set_wrap_mode ('char'); $targets{lc $targ}->{text} = $txt->get_buffer; $targets{lc $targ}->{room} = $targ if not $priv; $txt->get_buffer ()->create_tag ("priv", foreground => "red"); $txt->get_buffer ()->create_tag ("nick", foreground => "blue"); $vb->pack_start (my $e = new Gtk2::Entry, 0, 1, 2); $e->signal_connect (activate => sub { my $t = $e->get_text; $e->set_text (""); if ($priv) { my ($room) = grep { defined $_->{room} } values %targets; if (not defined $room) { print "no room i'm in found, won't send message!\n"; return; } print "$room->{room}|$targ|$t\n"; $client->send_priv_msg ($targ, $room->{room}, $t); } else { $client->send_room_msg ($targ, $t); } }); $vb->show_all; } $client = new Net::Knuddels::Client PeerAddr => "213.61.5.150:2710"; $client->register (UNHANDLED => sub { use Dumpvalue; print "---\n"; Dumpvalue->new (compactDump => 1, veryCompact => 1, quoteHighBit => 1, tick => '"')->dumpValue ([@_]); }); $client->register (login => sub { $kn_active = 1; print "CONNECTION ACTIVATED\n"; Glib::Timeout->add (1000 * 10, sub { send_keepalive () }); }); $client->register (msg_room => sub { my ($room, $user, $msg) = @_; my $b = $targets{lc $room}->{text}; print "ROOM: $room : $user : $msg\n"; return if not defined $b; my $ei = $b->get_end_iter; $b->insert_with_tags_by_name ($ei, "$user", "nick"); $ei = $b->get_end_iter; $b->insert_with_tags_by_name ($ei, ": $msg\n"); }); $client->register (msg_priv => sub { my ($room, $src, $dst, $msg) = @_; return if $msg =~ m/Die.*Funktion.*knuschel.*gibts.*hier.*leider.*nicht/i; print "PRIV:$room:$dst\n"; my $b = $targets{lc $src}->{text}; $b = $targets{lc $dst}->{text} if not defined $b; $b = $targets{lc $room}->{text} if not defined $b; if (not defined $b) { ($b) = map { $_->{text} } values %targets; } my $ei = $b->get_end_iter; $b->insert_with_tags_by_name ($ei, "{$src:$dst} $msg\n", "priv"); }); $client->register (dialog => sub { for my $l (@{$_[0]}) { # $l =~ s/\260[^\260]*female[^\260]*\260/weiblich/i; # $l =~ s/\260[^\260]*male[^\260]*\260/maennlich/i; # $l =~ s/\260[^\260]*\260//g; # $ircsrv->generic_msg ($server_cl, $_, "PRIVMSG", $l) for keys %privmsg_receiver; # $ircsrv->send_msg ($irc_client, $ircsrv->mk_clpref ($server_cl), "NOTICE", $l, $irc_client->{nickname}); } }); $client->register (join_room => sub { # print "$_[1]->{name} joined $_[0]: ".scalar(keys %{$client->{user_lists}->{lc $_[0]}}). " users\n"; # join_knuddels_nick ($_[1]->{name}, $_[1]->{age}, $_[1]->{gender}, $_[0]); }); $client->register (action_room => sub { my ($room, $msg); # action_knuddels ($_[0], $_[1]); my $b = $targets{lc $room}->{text}; return if not defined $b; my $ei = $b->get_end_iter; $b->insert ($ei, "$msg\n"); }); $client->register (part_room => sub { # print "$_[1]->{name} left $_[0]: ".scalar(keys %{$client->{user_lists}->{lc $_[0]}}). " users\n"; # part_knuddels_nick ($_[1]->{name}, $_[0]); }); $client->register (user_list => sub { my ($room, $list) = @_; print "***** USER JOIN FUER $room *****\n"; # join_knuddels_nick ($_->{name}, $_->{age}, $_->{gender}, $room) # for values %$list; print scalar (keys %$list)." users\n"; # send_nameslist ($room); print "********************************\n"; }); $client->register (room_info => sub { my ($room, $ri) = @_; create_target ($room); }); $client->register (change_room => sub { my ($r, $nr) = @_; # change_knuddels_room ($r, $nr); }); $client->register (room_list => sub { my ($room_hash) = @_; # %knuddel_channels = %$room_hash; @{$roomlist->{data}} = (); for (map { $room_hash->{$_} } sort keys %$room_hash) { next if $_->{name} eq ""; push @{$roomlist->{data}}, [ $_->{name}, $_->{user_count}, $_->{full_flag} ? "full" : "" ] } }); $main->show_all; Gtk2->main;