ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/chat.ext
Revision: 1.8
Committed: Wed Feb 28 19:41:29 2007 UTC (17 years, 2 months ago) by pippijn
Branch: MAIN
Changes since 1.7: +9 -0 lines
Log Message:
moved me to perl

File Contents

# User Rev Content
1 root 1.1 #! perl
2     #CONVERSION: PARTIAL
3    
4     # implement a replacement for the built-in say/chat/shout/tell/reply commands
5     # adds ignore/unignore functionality
6    
7     use NPC_Dialogue;
8     use POSIX (); # for strftime only
9    
10     sub clean_timeouts($) {
11     my ($player) = @_;
12     my $NOW = time;
13    
14     for my $hash (@$player{qw(ext_ignore_shout ext_ignore_tell)}) {
15     while (my ($k, $v) = each %$hash) {
16     if ($v < $NOW) {
17     $player->message ("Your ignore on $k has expired.", cf::NDI_GREEN | cf::NDI_UNIQUE);
18     delete $hash->{$k};
19     } elsif (!cf::player::exists $k) {
20     $player->message ("Your ignore on $k is no longer valid (no such user).", cf::NDI_GREEN | cf::NDI_UNIQUE);
21     delete $hash->{$k};
22     }
23     }
24     }
25     }
26    
27 root 1.2 cf::player->attach (
28     prio => -1000,
29 root 1.1 on_login => sub {
30     my ($pl) = @_;
31    
32     clean_timeouts $pl->ob;
33     },
34 pippijn 1.4
35     1
36 root 1.2 );
37 root 1.1
38     cf::register_command listen => sub {
39     my ($who, $msg) = @_;
40 root 1.3 my $player = cf::player::find_active $who->name;
41 root 1.1
42     if ($msg ne "") {
43     my $prev_listen = $player->listening;
44     $player->listening ($msg);
45     if ($prev_listen == $player->listening) {
46     $who->message ("Your verbose level stayed $prev_listen.", cf::NDI_UNIQUE);
47     } else {
48     $who->message ("Your verbose level is now " . $player->listening . ". (previously: $prev_listen)", cf::NDI_UNIQUE);
49     }
50     } else {
51     $who->message ("Your verbose level is " . $player->listening . ".", cf::NDI_UNIQUE);
52     }
53 pippijn 1.4
54     1
55 root 1.1 };
56    
57 pippijn 1.4 my $emotes = {
58     growl => {
59     noparams => {
60 pippijn 1.5 other => "<self> growls.",
61     self => "Grrrrrrrrr....",
62 pippijn 1.4 },
63     params => {
64     },
65     self => {
66     },
67     },
68     giggle => {
69     noparams => {
70 pippijn 1.5 other => "<self> giggles.",
71     self => "You giggle.",
72 pippijn 1.4 },
73     params => {
74     },
75     self => {
76     },
77     },
78     shiver => {
79     noparams => {
80 pippijn 1.5 other => "<self> shivers uncomfortably.",
81     self => "Brrrrrrrrr.",
82 pippijn 1.4 },
83     params => {
84     },
85     self => {
86     },
87     },
88     chuckle => {
89     noparams => {
90 pippijn 1.5 other => "<self> chuckles politely.",
91     self => "You chuckle politely",
92 pippijn 1.4 },
93     params => {
94     },
95     self => {
96     },
97     },
98     sigh => {
99     noparams => {
100 pippijn 1.5 other => "<self> sighs loudly.",
101     self => "You sigh.",
102 pippijn 1.4 },
103     params => {
104     },
105     self => {
106     },
107     },
108     scream => {
109     noparams => {
110 pippijn 1.5 other => "<self> screams at the top of his lungs!",
111     self => "ARRRRRRRRRRGH!!!!!",
112 pippijn 1.4 },
113     params => {
114     },
115     self => {
116     },
117     },
118     puke => {
119     noparams => {
120 pippijn 1.5 other => "<self> pukes.",
121     self => "Bleaaaaaghhhhhhh!",
122 pippijn 1.4 },
123     params => {
124 pippijn 1.5 target => "<self> pukes on your clothes!",
125     other => "<self> pukes on <other>.",
126     self => "You puke on <other>.",
127 pippijn 1.4 },
128     self => {
129 pippijn 1.5 other => "<self> pukes on his clothes.",
130     self => "You puke on yourself.",
131 pippijn 1.4 },
132     },
133     strut => {
134     noparams => {
135 pippijn 1.5 other => "<self> struts proudly.",
136     self => "Strut your stuff.",
137 pippijn 1.4 },
138     params => {
139     },
140     self => {
141     },
142     },
143     cringe => {
144     noparams => {
145 pippijn 1.5 other => "<self> cringes in terror!",
146     self => "You cringe in terror.",
147 pippijn 1.4 },
148     params => {
149 pippijn 1.5 target => "<self> cringes away from <other> in mortal terror.",
150     self => "You cringe away from <other>.",
151 pippijn 1.4 },
152     self => {
153     },
154     },
155     hiccup => {
156     noparams => {
157 pippijn 1.5 other => "<self> hiccups.",
158     self => "*HIC*",
159 pippijn 1.4 },
160     params => {
161     },
162     self => {
163     },
164     },
165     clap => {
166     noparams => {
167 pippijn 1.5 other => "<self> gives a round of applause.",
168     self => "Clap, clap, clap.",
169 pippijn 1.4 },
170     params => {
171     },
172     self => {
173     },
174     },
175     kiss => {
176     noparams => {
177 pippijn 1.5 other => "<self> makes a weird facial contortion",
178     self => "All the lonely people..",
179 pippijn 1.4 },
180     params => {
181 pippijn 1.5 target => "<self> kisses you.",
182     other => "<self> kisses <other>.",
183     self => "You kiss <other>.",
184 pippijn 1.4 },
185     self => {
186     },
187     },
188     wink => {
189     noparams => {
190 pippijn 1.5 other => "<self> winks suggestively.",
191     self => "Have you got something in your eye?",
192 pippijn 1.4 },
193     params => {
194 pippijn 1.5 target => "<self> winks at <other>.",
195     self => "You wink suggestively at <other>.",
196 pippijn 1.4 },
197     self => {
198 pippijn 1.5 other => "<self> winks at himself - something strange is going on...",
199     self => "You wink at yourself?? What are you up to?",
200 pippijn 1.4 },
201     },
202     pout => {
203     noparams => {
204 pippijn 1.5 other => "<self> pouts.",
205     self => "Aww, don't take it so hard.",
206 pippijn 1.4 },
207     params => {
208     },
209     self => {
210     },
211     },
212     cackle => {
213     noparams => {
214 pippijn 1.5 other => "<self> throws back his head and cackles with insane glee!",
215     self => "You cackle gleefully.",
216 pippijn 1.4 },
217     params => {
218     },
219     self => {
220     },
221     },
222     sniff => {
223     noparams => {
224 pippijn 1.5 other => "<self> sniffs sadly.",
225     self => "You sniff sadly. *SNIFF*",
226 pippijn 1.4 },
227     params => {
228 pippijn 1.5 target => "<self> sniffs you.",
229     other => "<self> sniffs <other>",
230     self => "You sniff <other>.",
231 pippijn 1.4 },
232     self => {
233 pippijn 1.5 other => "<self> sniffs himself.",
234     self => "You sniff yourself.",
235 pippijn 1.4 },
236     },
237     nod => {
238     noparams => {
239 pippijn 1.5 other => "<self> nods solemnly.",
240     self => "You nod solemnly.",
241 pippijn 1.4 },
242     params => {
243 pippijn 1.5 target => "<self> nods solemnly to you.",
244     other => "<self> nods solemnly to <other>.",
245     self => "You nod solemnly to <other>.",
246 pippijn 1.4 },
247     self => {
248     },
249     },
250     frown => {
251     noparams => {
252 pippijn 1.5 other => "<self> frowns.",
253     self => "What's bothering you?",
254 pippijn 1.4 },
255     params => {
256 pippijn 1.5 target => "<self> frowns darkly at you.",
257     other => "<self> frowns darkly at <other>.",
258     self => "You frown darkly at <other>.",
259 pippijn 1.4 },
260     self => {
261 pippijn 1.5 other => "<self> frowns at himself.",
262     self => "You frown at yourself.",
263 pippijn 1.4 },
264     },
265     snicker => {
266     noparams => {
267 pippijn 1.5 other => "<self> snickers softly.",
268     self => "You snicker softly.",
269 pippijn 1.4 },
270     params => {
271     },
272     self => {
273     },
274     },
275     shrug => {
276     noparams => {
277 pippijn 1.5 other => "<self> shrugs helplessly.",
278     self => "You shrug.",
279 pippijn 1.4 },
280     params => {
281 pippijn 1.5 target => "<self> shrugs at you.",
282     other => "<self> shrugs at <other>.",
283     self => "You shrug at <other>.",
284 pippijn 1.4 },
285     self => {
286     },
287     },
288     bleed => {
289     noparams => {
290 pippijn 1.5 other => "<self> is bleeding all over the carpet - got a spare tourniquet?",
291     self => "You bleed all over your nice new armour.",
292 pippijn 1.4 },
293     params => {
294 pippijn 1.5 target => "<self> slashes his wrist and bleeds all over <other>.",
295     self => "You slash your wrist and bleed all over <other>",
296 pippijn 1.4 },
297     self => {
298 pippijn 1.5 other => "<self> performs some satanic ritual while wiping his blood on himself.",
299     self => "Very impressive! You wipe your blood all over yourself.",
300 pippijn 1.4 },
301     },
302     twiddle => {
303     noparams => {
304 pippijn 1.5 other => "<self> patiently twiddles his thumbs.",
305     self => "You patiently twiddle your thumbs.",
306 pippijn 1.4 },
307     params => {
308     },
309     self => {
310     },
311     },
312     spit => {
313     noparams => {
314 pippijn 1.5 other => "<self> spits over his left shoulder.",
315     self => "You spit over your left shoulder.",
316 pippijn 1.4 },
317     params => {
318 pippijn 1.5 target => "<self> spits in your face!",
319     other => "<self> spits in <other>'s face.",
320     self => "You spit on <other>.",
321 pippijn 1.4 },
322     self => {
323 pippijn 1.5 other => "<self> drools all over himself.",
324     self => "You drool all over yourself.",
325 pippijn 1.4 },
326     },
327     glare => {
328     noparams => {
329 pippijn 1.5 other => "<self> glares around him.",
330     self => "You glare at nothing in particular.",
331 pippijn 1.4 },
332     params => {
333 pippijn 1.5 target => "<self> glares icily at you, you feel cold to your bones.",
334     other => "<self> glares at <other>.",
335     self => "You glare icily at <other>.",
336 pippijn 1.4 },
337     self => {
338 pippijn 1.5 other => "<self> glares at his feet, what is bothering him?",
339     self => "You glare icily at your feet, they are suddenly very cold.",
340 pippijn 1.4 },
341     },
342     bow => {
343     noparams => {
344 pippijn 1.5 other => "<self> bows deeply.",
345     self => "You bow deeply.",
346 pippijn 1.4 },
347     params => {
348 pippijn 1.5 target => "<self> bows before you.",
349     other => "<self> bows before <other>.",
350     self => "You bow before <other>.",
351 pippijn 1.4 },
352     self => {
353 pippijn 1.5 other => "<self> folds up like a jackknife and kisses his own toes.",
354     self => "You kiss your toes.",
355 pippijn 1.4 },
356     },
357     dance => {
358     noparams => {
359 pippijn 1.5 other => "<self> expresses himself through interpretive dance.",
360     self => "You dance with glee.",
361 pippijn 1.4 },
362     params => {
363 pippijn 1.5 target => "<self> grabs you, and begins dancing!",
364     other => "Yipe! <self> and <other> are doing the Macarena!",
365     self => "You grab <other> and begin doing the Cha-Cha!",
366 pippijn 1.4 },
367     self => {
368 pippijn 1.5 other => "<self> embraces himself and begins to dance!",
369     self => "You skip and dance around by yourself.",
370 pippijn 1.4 },
371     },
372     snore => {
373     noparams => {
374 pippijn 1.5 other => "<self> snores loudly.",
375     self => "Zzzzzzzzzzzzzzz.",
376 pippijn 1.4 },
377     params => {
378     },
379     self => {
380     },
381     },
382     blush => {
383     noparams => {
384 pippijn 1.5 other => "<self> blushes.",
385     self => "Your cheeks are burning.",
386 pippijn 1.4 },
387     params => {
388     },
389     self => {
390     },
391     },
392     snap => {
393     noparams => {
394 pippijn 1.5 other => "<self> snaps his fingers.",
395     self => "PRONTO! you snap your fingers.",
396 pippijn 1.4 },
397     params => {
398     },
399     self => {
400     },
401     },
402     wave => {
403     noparams => {
404 pippijn 1.5 other => "<self> waves happily.",
405     self => "You wave.",
406 pippijn 1.4 },
407     params => {
408 pippijn 1.5 target => "<self> waves goodbye to you. Have a good journey.",
409     other => "<self> waves goodbye to <other>.",
410     self => "You wave goodbye to <other>.",
411 pippijn 1.4 },
412     self => {
413 pippijn 1.5 other => "<self> waves goodbye to himself.",
414     self => "Are you going on adventures as well??",
415 pippijn 1.4 },
416     },
417     smile => {
418     noparams => {
419 pippijn 1.5 other => "<self> smiles happily.",
420     self => "You smile happily.",
421 pippijn 1.4 },
422     params => {
423 pippijn 1.5 target => "<self> smiles at you.",
424     other => "<self> beams a smile at <other>.",
425     self => "You smile at <other>.",
426 pippijn 1.4 },
427     self => {
428     },
429     },
430     sneeze => {
431     noparams => {
432 pippijn 1.5 other => "<self> sneezes.",
433     self => "Gesundheit!",
434 pippijn 1.4 },
435     params => {
436 pippijn 1.5 target => "<self> sneezes on you, you feel the snot cover you. EEEEEEW.",
437     other => "<self> sneezes on <other> and a film of snot covers him.",
438     self => "You sneeze at <other> and a film of snot shoots onto him.",
439 pippijn 1.4 },
440     self => {
441 pippijn 1.5 other => "<self> sneezes, and covers himself in a slimy substance.",
442     self => "You sneeze on yourself, what a mess!",
443 pippijn 1.4 },
444     },
445     bounce => {
446     noparams => {
447 pippijn 1.5 other => "<self> bounces around.",
448     self => "BOIINNNNNNGG!",
449 pippijn 1.4 },
450     params => {
451 pippijn 1.5 target => "<self> bounces around the room with you.",
452     other => "<self> bounces around the room with <other>.",
453     self => "You bounce around the room with <other>.",
454 pippijn 1.4 },
455     self => {
456     },
457     },
458     shake => {
459     noparams => {
460 pippijn 1.5 other => "<self> shakes his head.",
461     self => "You shake your head.",
462 pippijn 1.4 },
463     params => {
464 pippijn 1.5 target => "<self> shakes your hand.",
465     other => "<self> shakes <other>'s hand.",
466     self => "You shake <other>'s hand.",
467 pippijn 1.4 },
468     self => {
469 pippijn 1.5 other => "<self> shakes and quivers like a bowlful of jelly.",
470     self => "You are shaken by yourself.",
471 pippijn 1.4 },
472     },
473     lick => {
474     noparams => {
475 pippijn 1.5 other => "<self> licks his mouth and smiles.",
476     self => "You lick your mouth and smile.",
477 pippijn 1.4 },
478     params => {
479 pippijn 1.5 target => "<self> licks you.",
480     other => "<self> licks <other>.",
481     self => "You lick <other>.",
482 pippijn 1.4 },
483     self => {
484 pippijn 1.5 other => "<self> licks himself - YUCK.",
485     self => "You lick yourself.",
486 pippijn 1.4 },
487     },
488     flip => {
489     noparams => {
490 pippijn 1.5 other => "<self> flips head over heels.",
491     self => "You flip head over heels.",
492 pippijn 1.4 },
493     params => {
494     },
495     self => {
496     },
497     },
498     think => {
499     noparams => {
500 pippijn 1.5 other => "<self> closes his eyes and thinks really hard.",
501     self => "Anything in particular that you'd care to think about?",
502 pippijn 1.4 },
503     params => {
504     },
505     self => {
506     },
507     },
508     yawn => {
509     noparams => {
510 pippijn 1.5 other => "<self> yawns sleepily.",
511     self => "You open up your yap and let out a big breeze of stale air.",
512 pippijn 1.4 },
513     params => {
514     },
515     self => {
516     },
517     },
518     laugh => {
519     noparams => {
520 pippijn 1.5 other => "<self> falls down laughing.",
521     self => "You fall down laughing.",
522 pippijn 1.4 },
523     params => {
524 pippijn 1.5 target => "<self> looks at you and falls down on the ground laughing.",
525     other => "<self> looks at <other> and falls down on the ground laughing.",
526     self => "You take one look at <other> and fall down laughing.",
527 pippijn 1.4 },
528     self => {
529 pippijn 1.5 other => "<self> is laughing at something.",
530     self => "Laugh at yourself all you want, the others won't understand.",
531 pippijn 1.4 },
532     },
533     burp => {
534     noparams => {
535 pippijn 1.5 other => "<self> burps loudly.",
536     self => "You burp loudly.",
537 pippijn 1.4 },
538     params => {
539     },
540     self => {
541     },
542     },
543     gasp => {
544     noparams => {
545 pippijn 1.5 other => "<self> gasps in astonishment.",
546     self => "You gasp in astonishment.",
547 pippijn 1.4 },
548     params => {
549     },
550     self => {
551     },
552     },
553     smirk => {
554     noparams => {
555 pippijn 1.5 other => "<self> smirks.",
556     self => "You smirk.",
557 pippijn 1.4 },
558     params => {
559     },
560     self => {
561     },
562     },
563     cry => {
564     noparams => {
565 pippijn 1.5 other => "<self> bursts into tears.",
566     self => "Waaaaaaahhh..",
567 pippijn 1.4 },
568     params => {
569 pippijn 1.5 target => "<self> cries on your shoulder.",
570     other => "<self> cries on <other>'s shoulder.",
571     self => "You cry on <other>'s shoulder.",
572 pippijn 1.4 },
573     self => {
574 pippijn 1.5 other => "<self> sobs quietly to himself.",
575     self => "You cry to yourself.",
576 pippijn 1.4 },
577     },
578     sulk => {
579     noparams => {
580 pippijn 1.5 other => "<self> sulks in the corner.",
581     self => "You sulk.",
582 pippijn 1.4 },
583     params => {
584     },
585     self => {
586     },
587     },
588     whistle => {
589     noparams => {
590 pippijn 1.5 other => "<self> whistles appreciatively.",
591     self => "You whistle appreciatively.",
592 pippijn 1.4 },
593     params => {
594 pippijn 1.5 target => "<self> whistles at <other>.",
595     self => "You whistle at <other>.",
596 pippijn 1.4 },
597     self => {
598 pippijn 1.5 other => "<self> whistles to himself in boredom.",
599     self => "You whistle while you work.",
600 pippijn 1.4 },
601     },
602     groan => {
603     noparams => {
604 pippijn 1.5 other => "<self> groans loudly.",
605     self => "You groan loudly.",
606 pippijn 1.4 },
607     params => {
608     },
609     self => {
610     },
611     },
612     cough => {
613     noparams => {
614 pippijn 1.5 other => "<self> coughs loudly.",
615     self => "Yuck, try to cover your mouth next time!",
616 pippijn 1.4 },
617     params => {
618     },
619     self => {
620     },
621     },
622     grin => {
623     noparams => {
624 pippijn 1.5 other => "<self> grins evilly.",
625     self => "You grin evilly.",
626 pippijn 1.4 },
627     params => {
628 pippijn 1.5 target => "<self> grins evilly at you.",
629     other => "<self> grins evilly at <other>.",
630     self => "You grin at <other>.",
631 pippijn 1.4 },
632     self => {
633     },
634     },
635     };
636 pippijn 1.7
637 pippijn 1.4 for my $emotion (keys %$emotes) {
638     cf::register_command $emotion => sub {
639     my ($ob, $tname) = @_;
640    
641     cf::async {
642     my $name = $ob->name;
643    
644     if ($tname eq $name) {
645     my $emote = $emotes->{$emotion}->{self};
646 pippijn 1.7
647     $emote->{other} = "You look away from <self>."
648     if !$emote->{other};
649     $emote->{self} = "My god! Is that LEGAL?"
650     if !$emote->{self};
651    
652 pippijn 1.4 $emote->{other} =~ s/<self>/$name/;
653    
654     for my $other ( grep { $ob->on_same_map_as ($_->ob) } cf::player::list ) {
655     next
656     if $other->ob == $ob;
657     $other->ob->message ($emote->{other}, cf::NDI_GREY | cf::NDI_UNIQUE);
658     }
659    
660     $ob->message ($emote->{self}, cf::NDI_GREY | cf::NDI_UNIQUE);
661     } elsif ($tname) {
662     my $target = cf::player::find $tname
663     or return $ob->reply (undef, "$tname is not around.");
664    
665     my $emote = $emotes->{$emotion}->{params};
666 pippijn 1.7
667     $emote->{other} = "<self> is eyeing <other> quizzically."
668     if !$emote->{other};
669     $emote->{self} = "You are still nuts."
670     if !$emote->{self};
671     $emote->{target} = "You get the distinct feeling that <other> is nuts."
672     if !$emote->{target};
673    
674 pippijn 1.4 $emote->{self} =~ s/<other>/$tname/;
675     $emote->{target} =~ s/<self>/$name/;
676     $emote->{other} =~ s/<other>/$tname/;
677     $emote->{other} =~ s/<self>/$name/;
678    
679     for my $other ( grep { $ob->on_same_map_as ($_->ob) } cf::player::list ) {
680     next
681     if $other->ob == $ob or $other == $target;
682     $other->ob->message ($emote->{other}, cf::NDI_GREY | cf::NDI_UNIQUE);
683     }
684    
685     $target->ob->message ($emote->{target}, cf::NDI_GREY | cf::NDI_UNIQUE);
686     $ob->message ($emote->{self}, cf::NDI_GREY | cf::NDI_UNIQUE);
687     } else {
688     my $emote = $emotes->{$emotion}->{noparams};
689     $emote->{other} =~ s/<self>/$name/;
690 pippijn 1.7
691     $emote->{other} = "<self> dances with glee."
692     if !$emote->{other};
693     $emote->{self} = "You are a nut."
694     if !$emote->{self};
695 pippijn 1.4
696     for my $other ( grep { $ob->on_same_map_as ($_->ob) } cf::player::list ) {
697     next
698     if $other->ob == $ob;
699     $other->ob->message ($emote->{other}, cf::NDI_GREY | cf::NDI_UNIQUE);
700     }
701    
702     $ob->message ($emote->{self}, cf::NDI_GREY | cf::NDI_UNIQUE);
703     }
704     };
705     };
706     }
707    
708 pippijn 1.8 cf::register_command me => sub {
709     my ($ob, $msg) = @_;
710    
711     my $name = $ob->name;
712    
713     $_->ob->message ("* $name $msg", cf::NDI_GREY | cf::NDI_UNIQUE)
714     for grep $ob->on_same_map_as ($_->ob), cf::player::list;
715     };
716    
717 root 1.1 cf::register_command say => sub {
718     my ($who, $msg) = @_;
719    
720     utf8::decode $msg;
721    
722     return if $who->contr->invoke (cf::EVENT_PLAYER_SAY, $msg);
723    
724     if ($msg) {
725     my $name = $who->name;
726    
727     utf8::encode $msg; # ->message not yet utf8-ified
728     $_->ob->message ("$name says: $msg", cf::NDI_GREY | cf::NDI_UNIQUE)
729     for grep $who->on_same_map_as ($_->ob), cf::player::list;
730     utf8::decode $msg;
731    
732     # npcs, magic_ears etc.
733     # first find all objects and theirt-level inventories
734     # within a 5x5 square # that have something resembling
735     # dialogue or support on_say.
736     my ($map, $x, $y) = ($who->map, $who->x - 2, $who->y - 2);
737    
738     for my $npc (
739     grep +($_->invoke (cf::EVENT_OBJECT_SAY, $who->contr, $msg) && return) || NPC_Dialogue::has_dialogue $_,
740     map +($_, $_->inv),
741     grep $_,
742     map $map->at ($x + $_ % 5, $y + (int $_ / 5)),
743     0..24
744     ) {
745     # if some listener teleported us somewhere else, stop right here
746     last unless $map->path == $who->map->path;
747    
748     my $dialog = new NPC_Dialogue ob => $who, npc => $npc;
749     my ($reply, @kw) = $dialog->tell ($msg);
750    
751     if (defined $reply) {
752     if ($npc->type == cf::MAGIC_EAR) {
753     if (length $reply) {
754     $_->ob->message ($reply, cf::NDI_BROWN | cf::NDI_UNIQUE)
755     for grep $who->on_same_map_as ($_->ob), cf::player::list;
756     }
757     $npc->use_trigger;
758     } else {
759     if (length $reply) {
760     $_->ob->message ($npc->name . " says: $reply", cf::NDI_BROWN | cf::NDI_UNIQUE)
761     for grep $who->on_same_map_as ($_->ob), cf::player::list;
762     }
763     }
764     }
765    
766     if (@kw) {
767     $_->ob->message ("[further topics: " . (join ", ", @kw) . "]", cf::NDI_BROWN | cf::NDI_UNIQUE)
768     for grep $who->on_same_map_as ($_->ob), cf::player::list;
769     }
770     }
771    
772     } else {
773     $who->message ("What do you want to say?", cf::NDI_UNIQUE);
774     }
775 pippijn 1.4
776     1
777 root 1.1 };
778    
779     cf::register_command chat => sub {
780     my ($who, $msg) = @_;
781    
782     utf8::decode $msg;
783    
784     return if $who->contr->invoke (cf::EVENT_PLAYER_CHAT, $msg);
785    
786     if ($msg) {
787     my $name = $who->name;
788     my $NOW = time;
789    
790     utf8::encode $msg; # ->message not yet utf8-ified
791     cf::LOG cf::llevDebug, sprintf "QBERT [%s] %s\n", $name, $msg;
792     ext::schmorp_irc::do_notice (sprintf "[%s] %s", $name, $msg);
793    
794     $_->ob->message ("$name chats: $msg", cf::NDI_BLUE)
795     for grep { $_->ob->{ext_ignore_shout}{$name} < $NOW && $_->listening >= 10 } cf::player::list;
796    
797     } else {
798     $who->message ("Chat what?", cf::NDI_UNIQUE);
799     }
800 pippijn 1.4
801     1
802 root 1.1 };
803    
804     cf::register_command shout => sub {
805     my ($who, $msg) = @_;
806    
807     utf8::decode $msg;
808    
809     return if $who->contr->invoke (cf::EVENT_PLAYER_SHOUT, $msg);
810    
811     if ($msg) {
812     my $NOW = time;
813     my $name = $who->name;
814    
815     cf::LOG cf::llevDebug, sprintf "QBERT {%s} %s\n", $name, $msg;
816     ext::schmorp_irc::do_notice (sprintf "\007\0034{%s} %s\n", $name, $msg);
817    
818     utf8::encode $msg; # ->message not yet utf8-ified
819     $_->ob->message ("$name shouts: $msg", cf::NDI_RED)
820     for grep { $_->ob->{ext_ignore_shout}{$name} < $NOW && $_->listening >= 2 } cf::player::list;
821    
822     } else {
823     $who->message ("Shout what?", cf::NDI_UNIQUE);
824     }
825    
826 pippijn 1.4 1
827 root 1.1 };
828    
829     cf::register_command tell => sub {
830     my ($who, $args) = @_;
831     my ($target, $msg) = split /\s+/, $args, 2;
832    
833     utf8::decode $msg;
834    
835     return if $who->contr->invoke (cf::EVENT_PLAYER_TELL, $target, $msg);
836    
837     my $name = $who->name;
838    
839     if ($target =~ /irc\//) {
840     my (undef, $nick) = split /\//, $target, 2;
841     $who->message ("You tell $target: $args");
842     ext::schmorp_irc::do_notice (sprintf "(%s) %s: %s\n", $name, $nick, $msg);
843 root 1.3 } elsif (my $other = cf::player::find_active $target) {
844 root 1.1
845     if ($msg) {
846     if ($target eq $name) {
847     $who->message ("You are talking to yourself, you freak!", cf::NDI_UNIQUE);
848     } elsif ($other->ob->{ext_ignore_tell}{$name} >= time) {
849     $who->message ("$target ignores what you say. Give up on it.", cf::NDI_UNIQUE);
850     } else {
851     utf8::encode $msg; # ->message not yet utf8-ified
852     cf::LOG cf::llevDebug, sprintf "TELL [%s>%s] %s\n", $name, $target, $msg;
853    
854     $who->message ("You tell $target: $msg");
855     $other->ob->message ("$name tells you: $msg");
856     $other->ob->{ext_last_tell} = $name;
857     }
858     } else {
859     $who->message ("What do you want to tell $target?", cf::NDI_UNIQUE);
860     }
861    
862     } else {
863     $who->message ("No such player. Your message: $msg", cf::NDI_UNIQUE);
864     }
865 pippijn 1.4
866     1
867 root 1.1 };
868    
869     cf::register_command reply => sub {
870     my ($who, $args) = @_;
871     my $name = $who->name;
872    
873     utf8::decode $args;
874    
875     return if $who->contr->invoke (cf::EVENT_PLAYER_TELL, $who->{ext_last_tell}, $args);
876    
877     if ($who->{ext_last_tell} =~ /irc\//) {
878     my (undef, $nick) = split /\//, $who->{ext_last_tell}, 2;
879     $who->message ("You tell " . $who->{ext_last_tell} . ": $args");
880     ext::schmorp_irc::do_notice (sprintf "(%s) %s: %s\n", $name, $nick, $args);
881 root 1.3 } elsif (my $other = cf::player::find_active $who->{ext_last_tell}) {
882 root 1.1
883     if ($args) {
884     $other->ob->{ext_ignore_tell}{$name} >= time
885     or delete $other->ob->{ext_ignore_tell}{$name};
886    
887     if ($other->ob->{ext_ignore_tell}{$name} < time) {
888     utf8::encode $args; # ->message not yet utf8-ified
889     cf::LOG cf::llevDebug, sprintf "TELL [%s>%s] %s\n", $name, $other->ob->name, $args;
890    
891     $who->message ("You tell " . $other->ob->name . ": $args");
892     $other->ob->message ("$name tells you: $args");
893     $who->{ext_last_tell} = $other->ob->name;
894     } else {
895     $who->message ($other->ob->name . " ignores what you say. Give up on it.", cf::NDI_UNIQUE);
896     }
897     } else {
898     $who->message ("What do you want to tell ".$other->ob->name."?", cf::NDI_UNIQUE);
899     }
900    
901     } else {
902     $who->message ("Can't reply, player left. Your message: $args".$who->{ext_last_tell}, cf::NDI_UNIQUE);
903     }
904 pippijn 1.4
905     1
906 root 1.1 };
907    
908     cf::register_command ignore => sub {
909     my ($who, $args) = @_;
910     my ($target, $type, $timeout) = split /\s+/, $args;
911    
912     if ($args eq "list") {
913     clean_timeouts $who;
914    
915     if ((my @ignored_tell = sort keys %{$who->{ext_ignore_tell}})
916     + (my @ignored_shout = sort keys %{$who->{ext_ignore_shout}})) {
917     $who->message ("Currently ignoring private messages from: ", cf::NDI_UNIQUE);
918     $who->message ((join ", ", @ignored_tell), cf::NDI_UNIQUE);
919     $who->message ("Currently ignoring shouts from: ", cf::NDI_UNIQUE);
920     $who->message ((join ", ", @ignored_shout), cf::NDI_UNIQUE);
921     $who->message ("To stop ignoring one, use unignore.", cf::NDI_UNIQUE);
922     } else {
923     $who->message ("Not ignoring anyone", cf::NDI_UNIQUE);
924     }
925    
926     } elsif ($target && $type) {
927    
928     $timeout ne "" or $timeout = 24;
929     my $absolute_timeout = time + $timeout * 3600;
930    
931     if (cf::player::exists $target) {
932     if ($type eq "tell") {
933     $who->message ("Now ignoring private messages from $target for $timeout hours.", cf::NDI_UNIQUE);
934     $who->{ext_ignore_tell}{$target} = $absolute_timeout;
935     } elsif ($type eq "shout") {
936     $who->message ("Now ignoring shouts from $target for $timeout hours.", cf::NDI_UNIQUE);
937     $who->{ext_ignore_shout}{$target} = $absolute_timeout;
938     } elsif ($type eq "all") {
939     $who->message ("Now ignoring everything from $target for $timeout hours.", cf::NDI_UNIQUE);
940     $who->{ext_ignore_tell}{$target} = $absolute_timeout;
941     $who->{ext_ignore_shout}{$target} = $absolute_timeout;
942     } else {
943     $who->message ("You need to specify tell, shout or all.", cf::NDI_UNIQUE);
944     }
945     } else {
946     $who->message ("No such player: $target", cf::NDI_UNIQUE);
947     }
948    
949     } else {
950     $who->message ("Usage: ignore <player> <tell|shout|all> <timeout>\n"
951     . "will ignore a player for <timeout> hours.\n"
952     . "Usage: ignore list\n"
953     . "will show you a list of players currently ignored.", cf::NDI_UNIQUE);
954     }
955 pippijn 1.4
956     1
957 root 1.1 };
958    
959     cf::register_command unignore => sub {
960     my ($who, $args) = @_;
961     my ($target, $type) = split /\s+/, $args;
962    
963     if ($args eq "") {
964     if ($who->{ext_ignore_tell}) {
965     $who->message ("Currently ignoring private messages from: ", cf::NDI_UNIQUE);
966     $who->message ((join ", ", sort keys %{ $who->{ext_ignore_tell} }), cf::NDI_UNIQUE);
967     $who->message ("Currently ignoring shouts from: ", cf::NDI_UNIQUE);
968     $who->message ((join ", ", sort keys %{ $who->{ext_ignore_shout} }), cf::NDI_UNIQUE);
969     } else {
970     $who->message ("Not ignoring anyone", cf::NDI_UNIQUE);
971     }
972     } else {
973     if (cf::player::exists $target) {
974     if ($type eq "tell") {
975     $who->message ("Not ignoring private messages from $target anymore.", cf::NDI_UNIQUE);
976     delete $who->{ext_ignore_tell} {$target};
977     } elsif ($type eq "shout") {
978     $who->message ("Not ignoring shouts from $target anymore.", cf::NDI_UNIQUE);
979     delete $who->{ext_ignore_shout}{$target};
980     } elsif ($type eq "all") {
981     $who->message ("Not ignoring anything from $target anymore.", cf::NDI_UNIQUE);
982     delete $who->{ext_ignore_tell} {$target};
983     delete $who->{ext_ignore_shout}{$target};
984     } else {
985     $who->message ("You need to specify tell, shout or all.", cf::NDI_UNIQUE);
986     }
987     } else {
988     $who->message ("No such player or ambiguous name: $target", cf::NDI_UNIQUE);
989     }
990     }
991 pippijn 1.4
992     1
993 root 1.1 };
994    
995     cf::register_command seen => sub {
996     my ($who, $args) = @_;
997    
998     if (my ($login) = $args =~ /(\S+)/) {
999     if ($login eq $who->name) {
1000     $who->message ("Very funny, $login. Ha. Ha.", cf::NDI_UNIQUE);
1001 root 1.3 } elsif (cf::player::find_active $login) {
1002 root 1.1 $who->message ("$login is right here on this server!", cf::NDI_UNIQUE);
1003     } elsif (cf::player::exists $login
1004     and stat sprintf "%s/%s/%s/%s.pl", cf::localdir, cf::playerdir, ($login) x 2) {
1005     my $time = (stat _)[9];
1006    
1007     $who->message ("$login was last seen here "
1008     . (POSIX::strftime "%Y-%m-%d %H:%M:%S +0000", gmtime $time)
1009     . " which was " . (int +(time - $time) / 3600) . " hours ago.", cf::NDI_UNIQUE);
1010     } else {
1011     $who->message ("No player named $login is known to me.", cf::NDI_UNIQUE);
1012     }
1013     } else {
1014     $who->message ("Usage: seen <player>", cf::NDI_UNIQUE);
1015     }
1016 pippijn 1.4
1017     1
1018 root 1.1 };
1019