… | |
… | |
249 | |
249 | |
250 | sub handle_room { |
250 | sub handle_room { |
251 | my ($self, $room) = @_; |
251 | my ($self, $room) = @_; |
252 | |
252 | |
253 | if ($room eq "-") { |
253 | if ($room eq "-") { |
254 | if (defined $self->{only_room}) { |
254 | if (scalar (keys %{$self->{room}}) == 1) { |
255 | return $self->{only_room}; |
255 | return (keys %{$self->{room}})[0]; |
256 | } else { |
256 | } else { |
257 | warn "Couldn't assign '-' room to a room!"; |
257 | warn "Couldn't assign '-' room to a room!"; |
258 | return '-'; |
258 | return '#nosuchroom'; |
259 | } |
259 | } |
260 | } else { |
260 | } else { |
261 | return $room; |
261 | return $room; |
262 | } |
262 | } |
263 | } |
263 | } |
… | |
… | |
401 | syswrite $fh, "\0"; |
401 | syswrite $fh, "\0"; |
402 | |
402 | |
403 | $self->register ("(" => sub { |
403 | $self->register ("(" => sub { |
404 | $self->{login_challenge} = $_[0]; |
404 | $self->{login_challenge} = $_[0]; |
405 | $self->{login_room} = $_[1]; |
405 | $self->{login_room} = $_[1]; |
406 | $self->{proto}->feed_event ("login"); |
406 | $self->{proto}->feed_event (login => $_[1]); |
407 | }); |
407 | }); |
|
|
408 | |
408 | $self->register (k => sub { |
409 | $self->register (k => sub { |
409 | my @str = map { s/[\356\343]//; $_ } @_; |
410 | my @str = map { s/[\356\343]//; $_ } @_; |
410 | my @out; |
411 | my @out; |
411 | push @out, split /#/, $_ for @str; |
412 | push @out, split /#/, $_ for @str; |
412 | $self->{proto}->feed_event (dialog => \@out); |
413 | $self->{proto}->feed_event (dialog => \@out); |
413 | }); |
414 | }); |
|
|
415 | |
414 | $self->register (t => sub { |
416 | $self->register (t => sub { |
415 | my $src = $_[0]; |
417 | my $src = $_[0]; |
|
|
418 | |
416 | if ($src eq '-') { |
419 | if ($src eq '-') { |
417 | $_[2] = $self->{knuddels_nick} . " " . $_[2]; |
420 | $_[2] = $self->{knuddels_nick} . " " . $_[2]; |
|
|
421 | |
418 | } else { |
422 | } else { |
419 | $_[2] = $src . " " . $_[2]; |
423 | $_[2] = $src . " " . $_[2]; |
420 | } |
424 | } |
421 | $self->{proto}->feed_event (action_room => $self->handle_room ($_[1]), $_[2]); |
425 | $self->{proto}->feed_event (action_room => $self->handle_room ($_[1]), $_[2]); |
422 | }); |
426 | }); |
|
|
427 | |
423 | $self->register (r => sub { |
428 | $self->register (r => sub { |
424 | my $src = $_[0]; |
429 | my $src = $_[0]; |
425 | $src = $self->{knuddels_nick} if $src eq "-"; |
430 | $src = $self->{knuddels_nick} if $src eq "-"; |
426 | $self->{proto}->feed_event (msg_priv => $self->handle_room ($_[2]), $src, $_[1], $_[3]); |
431 | $self->{proto}->feed_event (msg_priv => $self->handle_room ($_[2]), $src, $_[1], $_[3]); |
427 | }); |
432 | }); |
|
|
433 | |
428 | $self->register (e => sub { |
434 | $self->register (e => sub { |
429 | $self->{proto}->feed_event (msg_room => $self->handle_room ($_[1]), $_[0], $_[2]); |
435 | $self->{proto}->feed_event (msg_room => $self->handle_room ($_[1]), $_[0], $_[2]); |
430 | }); |
436 | }); |
|
|
437 | |
|
|
438 | $self->register (l => sub { |
|
|
439 | |
|
|
440 | }); |
|
|
441 | |
431 | $self->register (l => sub { |
442 | $self->register (l => sub { |
432 | my $room = $self->handle_room ($_[0]); |
443 | my $room = $self->handle_room ($_[0]); |
433 | return if $room eq "-"; # things that shouln't happen |
444 | return if $room eq "-"; # things that shouln't happen |
434 | |
445 | |
435 | my $user = { |
446 | my $user = { |
… | |
… | |
458 | $u = { name => $username }; |
469 | $u = { name => $username }; |
459 | } |
470 | } |
460 | |
471 | |
461 | $self->{proto}->feed_event (part_room => $room, $u); |
472 | $self->{proto}->feed_event (part_room => $room, $u); |
462 | }); |
473 | }); |
|
|
474 | |
|
|
475 | $self->register (b => sub { |
|
|
476 | my @arg = @_; |
|
|
477 | my $cc = {}; |
|
|
478 | $self->{knuddels_rooms}->{$cc->{name}} = {}; |
|
|
479 | |
|
|
480 | my $last = $cc; |
|
|
481 | my $chan_cnt = 2; |
|
|
482 | |
|
|
483 | while (@arg) { |
|
|
484 | $cc->{name} = shift @arg; |
|
|
485 | |
|
|
486 | if ($cc->{name} =~ s/\cJ(\d+)$//) { |
|
|
487 | $cc->{user_count} = $1; |
|
|
488 | } |
|
|
489 | if ($cc->{name} =~ m/^"/) { |
|
|
490 | $cc->{name} = "$last->{name} $chan_cnt"; |
|
|
491 | $chan_cnt++; |
|
|
492 | |
|
|
493 | } else { |
|
|
494 | $last = $cc; |
|
|
495 | $chan_cnt = 2; |
|
|
496 | } |
|
|
497 | |
|
|
498 | |
|
|
499 | $cc->{flag1} = shift @arg; |
|
|
500 | $cc->{flag2} = shift @arg; |
|
|
501 | |
|
|
502 | my $i = 0; |
|
|
503 | |
|
|
504 | for (my $a = shift @arg; $a ne "-"; $a = shift @arg) { |
|
|
505 | |
|
|
506 | if ($i == 0) { |
|
|
507 | $cc->{picture} = $a; |
|
|
508 | $cc->{full_flag} = 1 if $cc->{picture} =~ m/full/i; |
|
|
509 | } |
|
|
510 | $i++; |
|
|
511 | } |
|
|
512 | |
|
|
513 | $self->{knuddels_rooms}->{$cc->{name}} = $cc; |
|
|
514 | $cc = {}; |
|
|
515 | } |
|
|
516 | |
|
|
517 | $self->{proto}->feed_event (room_list => $self->{knuddels_rooms}); |
|
|
518 | }); |
|
|
519 | |
|
|
520 | $self->register (d => sub { |
|
|
521 | my $room = $self->handle_room ($_[0]); |
|
|
522 | |
|
|
523 | delete $self->{room}->{lc $room}; |
|
|
524 | $self->{room}->{lc $_[1]} = { name => $_[1] }; |
|
|
525 | |
|
|
526 | $self->{proto}->feed_event (change_room => $room, $_[1]); |
|
|
527 | }); |
|
|
528 | |
|
|
529 | $self->register ('6' => sub { |
|
|
530 | # i have no exact clue what this message does, |
|
|
531 | # but java-code seems to say i should do this: |
|
|
532 | |
|
|
533 | warn "*********************** SIX MESSAGE GOT!!! CHECK PROTOCOL FOR OCCURENCE!!"; |
|
|
534 | # delete $self->{room}->{lc ($self->handle_room ($_[0]))}; |
|
|
535 | }); |
|
|
536 | |
463 | $self->register (a => sub { |
537 | $self->register (a => sub { |
464 | # the only_room stuff is from java-code, which has naughy semantics |
|
|
465 | if (not defined $self->{only_room}) { |
|
|
466 | $self->{only_room} = $_[0]; |
|
|
467 | } else { |
|
|
468 | $self->{only_room} = "-"; |
|
|
469 | } |
|
|
470 | |
|
|
471 | $self->{my_nick} = $_[1]; # i'm really _not_ shure about this |
538 | $self->{my_nick} = $_[1]; # i'm really _not_ shure about this |
472 | |
539 | |
473 | my $ri = $self->{room}->{lc $_[0]} = { |
540 | my $ri = $self->{room}->{lc $_[0]} = { |
|
|
541 | name => $_[0], |
474 | picture => $_[7], |
542 | picture => $_[7], |
475 | }; |
543 | }; |
476 | |
544 | |
477 | $self->{proto}->feed_event (room_info => $_[0], $ri); |
545 | $self->{proto}->feed_event (room_info => $_[0], $ri); |
478 | }); |
546 | }); |
|
|
547 | |
479 | $self->register (u => sub { |
548 | $self->register (u => sub { |
480 | my $room = shift; |
549 | my $room = shift; |
481 | my $rl = $self->{user_lists}->{lc $room} = {}; |
550 | my $rl = $self->{user_lists}->{lc $room} = {}; |
482 | my $cur_u = {}; |
551 | my $cur_u = {}; |
483 | |
552 | |
… | |
… | |
559 | my ($self, $url, $unknown) = @_; |
628 | my ($self, $url, $unknown) = @_; |
560 | |
629 | |
561 | $self->command ("t", "V8.6a", $url || "http://www.knuddels.de/applet.html?v=86a&c=0", $unknown || 3); |
630 | $self->command ("t", "V8.6a", $url || "http://www.knuddels.de/applet.html?v=86a&c=0", $unknown || 3); |
562 | } |
631 | } |
563 | |
632 | |
564 | =item $client->set_nick ($room, $nick, $password) |
633 | =item $client->enter_room ($room, $nick, $password) |
565 | |
634 | |
566 | Registers the nick with the given password. |
635 | Enters a room C<$room> with C<$nick> and C<$password>. |
|
|
636 | (for joining multiple rooms call this multiple times) |
567 | |
637 | |
568 | =cut |
638 | NOTE: i won't allow joins to multiple rooms with different nick/password's, |
|
|
639 | the java client reacted very confused.. don't know whether the server supports this. |
569 | |
640 | |
570 | sub set_nick { |
641 | =cut |
|
|
642 | |
|
|
643 | sub enter_room { |
571 | my ($self, $room, $nick, $password) = @_; |
644 | my ($self, $room, $nick, $password) = @_; |
572 | |
645 | |
|
|
646 | if (defined $self->{knuddels_nick} and $self->{knuddels_nick} ne $nick) { |
|
|
647 | return # i don't think knuddels-server will be happy if |
|
|
648 | # we join multiple rooms on multiple accounts over 1 connection |
|
|
649 | } |
|
|
650 | |
573 | exists $self->{login_challenge} or Carp::croak "set_nick can only be called after a login event"; |
651 | exists $self->{login_challenge} or Carp::croak "set_nick can only be called after a login event"; |
574 | |
652 | |
575 | $self->{knuddels_nick} = $nick; |
653 | $self->{knuddels_nick} = $nick; |
|
|
654 | print "ENTER: $room\n"; |
576 | $self->command ("n", $room, $nick, Net::Knuddels::hash_pw $self->{login_challenge}, $password); |
655 | $self->command ("n", $room, $nick, Net::Knuddels::hash_pw $self->{login_challenge}, $password); |
577 | } |
656 | } |
578 | |
657 | |
579 | =item $client->send_whois ($nick) |
658 | =item $client->send_whois ($nick) |
580 | |
659 | |
… | |
… | |
595 | |
674 | |
596 | =cut |
675 | =cut |
597 | sub send_room_msg { |
676 | sub send_room_msg { |
598 | my ($self, $room, $message) = @_; |
677 | my ($self, $room, $message) = @_; |
599 | |
678 | |
600 | print "SEND ROOM: $room : $message\n"; |
679 | print "SEND ROOM:$room\: $message\n"; |
601 | $self->command ("e", $room, $message); |
680 | $self->command ("e", $room, $message); |
602 | } |
681 | } |
603 | |
682 | |
604 | |
683 | |
605 | =item $client->send_priv_msg ($nick, $room, $message) |
684 | =item $client->send_priv_msg ($nick, $room, $message) |
… | |
… | |
608 | |
687 | |
609 | =cut |
688 | =cut |
610 | sub send_priv_msg { |
689 | sub send_priv_msg { |
611 | my ($self, $nick, $room, $message) = @_; |
690 | my ($self, $nick, $room, $message) = @_; |
612 | |
691 | |
613 | print "SEND ROOM: $room : /p $nick:$message\n"; |
692 | print "SEND PRIV:$room: /p $nick:$message\n"; |
614 | $self->command ("e", $room, "/p $nick:$message"); |
693 | $self->command ("e", $room, "/p $nick:$message"); |
|
|
694 | } |
|
|
695 | |
|
|
696 | =item $client->send_join_room ($oldroom, $room) |
|
|
697 | |
|
|
698 | Sends the server a join command for C<$room>. This |
|
|
699 | will result in a room change from C<$oldroom> to C<$room>. |
|
|
700 | |
|
|
701 | =cut |
|
|
702 | sub send_join_room { |
|
|
703 | my ($self, $old_room, $room) = @_; |
|
|
704 | |
|
|
705 | print "JOIN ROOM: #room : /go $room\n"; |
|
|
706 | $self->command ("e", $old_room, "/go $room"); |
|
|
707 | } |
|
|
708 | |
|
|
709 | =item $client->send_exit_room ($room) |
|
|
710 | |
|
|
711 | Exits C<$room> completly. (can be seen as counter method for C<enter_room ()>); |
|
|
712 | |
|
|
713 | =cut |
|
|
714 | sub send_exit_room { |
|
|
715 | my ($self, $room) = @_; |
|
|
716 | print "EXIT EOORM: $room \n"; |
|
|
717 | $self->command ("w", $room, "\0", "\0"); |
|
|
718 | delete $self->{room}->{lc $room}; |
615 | } |
719 | } |
616 | |
720 | |
617 | =item $client->register ($type => $cb) |
721 | =item $client->register ($type => $cb) |
618 | |
722 | |
619 | See L<Net::Knuddels::Protocol::register>. The following extra events will |
723 | See L<Net::Knuddels::Protocol::register>. The following extra events will |