#! perl # mandatory # implements user list monitoring # if opted in via exti ["nickmon", 1], # sends ext ["nicklist", [add/upd...], [del...]] messages # where each add/upd stands for an added or changed nick: # [nick, NT_PLAYER, count, uuid] - deliantra player # [nick, NT_SERVICE, description] - some internal service # [nick, NT_OTHER, type] - some other user (e.g. irc) # and each del is simply the nickname that is gone. sub NT_PLAYER() { 0 } sub NT_SERVICE() { 1 } sub NT_OTHER() { 2 } # uses global variables in extvar::nickmon: %CLIENT, $NICK cf::register_exticmd nickmon => sub { my ($ns, $enable) = @_; delete $ns->{nickmon}; delete $extvar::nickmon::CLIENT{$ns}; if ($enable) { $ns->{nickmon} = 1; $extvar::nickmon::CLIENT{$ns+0} = $ns; $ns->ext_msg (nicklist => [values %extvar::nickmon::NICK], []) if %extvar::nickmon::NICK; } $enable }; cf::client->attach ( on_client_destroy => sub { my ($ns) = @_; delete $extvar::nickmon::CLIENT{$ns+0}; }, ); sub msg($$) { $_->ext_msg (nicklist => $_[0], $_[1]) for values %extvar::nickmon::CLIENT; } # to be called by other extensions as well sub upd($$@) { my $nick = [@_]; $extvar::nickmon::NICK{$nick->[0]} = $nick; msg [$nick], []; } sub del($) { delete $extvar::nickmon::NICK{$_[0]}; msg [], [$_[0]]; } cf::player->attach ( on_login => sub { my ($pl) = @_; $pl = $pl->ob; upd $pl->name, NT_PLAYER, $pl->count, $pl->uuid; }, on_logout => sub { my ($pl) = @_; del $pl->ob->name; }, on_birth => sub { my ($pl) = @_; $pl = $pl->ob; upd $pl->name, NT_PLAYER, $pl->count, $pl->uuid; }, on_quit => sub { my ($pl) = @_; del $pl->ob->name; }, );