ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/ext/chat.ext
Revision: 1.4
Committed: Wed Feb 28 19:13:23 2007 UTC (17 years, 2 months ago) by pippijn
Branch: MAIN
Changes since 1.3: +667 -0 lines
Log Message:
added emotions

File Contents

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