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

# 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     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 root 1.1 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 pippijn 1.4
764     1
765 root 1.1 };
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 pippijn 1.4
789     1
790 root 1.1 };
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 pippijn 1.4 1
815 root 1.1 };
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 root 1.3 } elsif (my $other = cf::player::find_active $target) {
832 root 1.1
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 pippijn 1.4
854     1
855 root 1.1 };
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 root 1.3 } elsif (my $other = cf::player::find_active $who->{ext_last_tell}) {
870 root 1.1
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 pippijn 1.4
893     1
894 root 1.1 };
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 pippijn 1.4
944     1
945 root 1.1 };
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 pippijn 1.4
980     1
981 root 1.1 };
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 root 1.3 } elsif (cf::player::find_active $login) {
990 root 1.1 $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 pippijn 1.4
1005     1
1006 root 1.1 };
1007