ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/maps/perl/schmorp-irc.ext
Revision: 1.12
Committed: Sun Sep 17 23:57:20 2006 UTC (17 years, 8 months ago) by pippijn
Branch: MAIN
Changes since 1.11: +26 -3 lines
Log Message:
Implemented !tell fantasy commands and changed in-game tell and reply to
print to IRC.

File Contents

# User Rev Content
1 elmex 1.1 #! perl
2 root 1.4
3 elmex 1.1 use Time::HiRes;
4     use Net::IRC3::Client::Connection;
5    
6 root 1.6 my $BOTSERVER = 'localhost';
7 elmex 1.1 my $BOTPORT = '6667';
8 pippijn 1.10 my $BOTNAME = 'cfbot';
9 elmex 1.1 my $BOTCHAN = '#cf';
10    
11     my $CON; # the connection
12    
13 root 1.8 sub unload {
14 elmex 1.5 $CON->disconnect if $CON;
15 elmex 1.1 undef $CON;
16     }
17    
18     sub do_notice {
19     my ($msg) = @_;
20 elmex 1.7 $CON->send_chan ($BOTCHAN, NOTICE => $msg, $BOTCHAN)
21     if $CON;
22 elmex 1.1 }
23    
24 pippijn 1.9 sub handle_fcmd {
25 pippijn 1.12 my ($name, $me, $msg) = @_;
26 pippijn 1.9
27     if ($msg eq "!who") {
28     my ($numplayers, $numwiz, @plist) = (0, 0);
29    
30     foreach my $pl (cf::player::list) {
31     $numplayers++;
32     $numwiz++
33     if ($pl->ob->flag (cf::FLAG_WIZ));
34     push (@plist, $pl);
35     }
36    
37     $CON->send_chan ($BOTCHAN, NOTICE => "Total Players in The World. ($numplayers) -- WIZ($numwiz)", $BOTCHAN);
38    
39     if ($numplayers > 0) {
40     foreach my $pl (@plist) {
41     $CON->send_chan ($BOTCHAN, NOTICE =>
42 pippijn 1.11 "* " . $pl->ob->name . "/" . $pl->ob->level . ($pl->ob->flag (cf::FLAG_WIZ) ? " [WIZ] " : "")
43 pippijn 1.9 ." [" . ($pl->ob->map ? $pl->ob->map->path : "NULL") . "]", $BOTCHAN);
44     }
45     }
46 pippijn 1.12 } elsif ($msg =~ /^\!tell/) {
47     my (undef, $target, $tmsg) = split / /, $msg, 3;
48    
49     if (my $other = cf::player::find $target) {
50    
51     if ($tmsg) {
52     if ($me eq $target) {
53     $CON->send_chan ($BOTCHAN, NOTICE => "$me: You are talking to yourself, you freak!", $BOTCHAN);
54     } elsif ($other->ob->{ext_ignore_tell}{$me} >= time) {
55     $CON->send_chan ($BOTCHAN, NOTICE => "$me: $target ignores what you say. Give up on it.", $BOTCHAN);
56     } else {
57     utf8::encode $tmsg; # ->message not yet utf8-ified
58     cf::LOG cf::llevDebug, sprintf "TELL [%s/%s>%s] %s\n", $name, $me, $target, $tmsg;
59    
60     $other->ob->message ("$name/$me tells you: $tmsg");
61     $other->ob->{ext_last_tell} = "$name/$me";
62     }
63     } else {
64     $CON->send_chan ($BOTCHAN, NOTICE => "$me: What do you want to tell $target?", cf::NDI_UNIQUE);
65     }
66    
67     }
68 pippijn 1.9 }
69     }
70    
71 elmex 1.1 sub check_connection {
72     return if $CON;
73 root 1.4
74 elmex 1.1 $CON = Net::IRC3::Client::Connection->new;
75     $CON->connect ($BOTSERVER, $BOTPORT);
76     $CON->send_srv (JOIN => undef, $BOTCHAN);
77     $CON->register ($BOTNAME, $BOTNAME, 'crossfire connection');
78     $CON->reg_cb (
79     #d# 'irc_*' => sub { warn "IRC $_[1]->{trailing}\n"; 1 },
80     irc_privmsg => sub {
81     my ($con, $msg) = @_;
82     my $name = 'irc';
83 pippijn 1.12 my $nick = Net::IRC3::Util::prefix_nick ($msg);
84 elmex 1.1 my $NOW = Time::HiRes::time;
85 elmex 1.3 my $tmsg = $msg->{trailing};
86     $tmsg =~ s/\x01[^\x01]*\x01//g;
87 pippijn 1.9 if ($tmsg =~ /^\!/) {
88 pippijn 1.12 handle_fcmd ($name, $nick, $tmsg);
89 pippijn 1.9 } elsif ($tmsg =~ m/\S/) {
90 elmex 1.3 $_->ob->message (
91 pippijn 1.12 "$name/".$nick." chats: $tmsg", cf::NDI_BLUE
92 elmex 1.3 ) for grep { $_->ob->{ext_ignore_shout}{$name} < $NOW && $_->listening >= 10 } cf::player::list;
93     }
94 elmex 1.1 1;
95     },
96 elmex 1.2 # registered => sub {
97     # 1;
98     # },
99 elmex 1.1 disconnect => sub {
100     undef $CON;
101     0;
102     }
103     );
104     }
105    
106     my $timer;
107    
108     sub new_timer {
109     $timer = AnyEvent->timer (after => 10, cb => sub {
110     check_connection ();
111     &new_timer; # and restart the time
112     });
113     }
114    
115     new_timer; # create first timer
116     check_connection ();