blob: 59d24f5db3e4ee15f1560b617f1f822f808c5eb9 [file] [log] [blame]
#pragma no_clone
#pragma no_inherit
#pragma no_shadow
#pragma strong_types
#include <properties.h>
#include <events.h>
#include <time.h>
private string ulog = "";
void WaitForQuarterHour() {
while(remove_call_out("QuarterReached")!=-1);
call_out("QuarterReached",900-(time() % 900));
}
void create() {
WaitForQuarterHour();
}
/* Ueberprueft die als Parameter "str" uebergebene Uhrmeldung.
Rueckgabewerte: 0 fuer fehlerhafte Parameter,
1 fuer korrekten Aufbau. */
int CheckClockMsg(string str)
{
int i = strstr(str, "%", 0);
/* Mehr als 1x %d enthalten, mehr als 1x % enthalten, oder auf das einzige
enthaltene % folgt kein "d". */
if ( sizeof(explode(str,"%d")) > 2 ||
sizeof(explode(str,"%")) > 2 ||
(i>-1 && ( i==sizeof(str)-1 || str[i+1] != 'd')))
return 0;
else
return 1;
}
void QuarterReached() {
int std, minuten;
string str, format;
int off;
int *lt=localtime(time());
minuten=lt[TM_MIN];
std=lt[TM_HOUR];
mapping edata = mkmapping(
({TM_SEC, TM_MIN, TM_HOUR, TM_MDAY, TM_MON, TM_YEAR, TM_WDAY, TM_YDAY,
TM_ISDST}),
lt);
// Clock-Event triggern
EVENTD->TriggerEvent(EVT_LIB_CLOCK, edata);
// bei Datumswechsel DATECHANGE-Event ausloesen.
if (std==0 && minuten < 15) {
EVENTD->TriggerEvent(EVT_LIB_DATECHANGE, edata);
}
if (minuten <= 2) {
foreach(object u : users()) {
if((off=to_int(u->QueryProp(P_TIMEZONE)))<0)off+=24;
off=(std+off)%24;
format=u->QueryProp(P_CLOCKMSG)||"Du hoerst die Uhr schlagen: "
"Es ist jetzt %d Uhr.\n";
if ( !CheckClockMsg(format) )
{
tell_object(u, break_string(
"So kann ich nicht arbeiten! Deine Uhrmeldung funktioniert so "
"nicht. Bitte korrigiere das.", 78, "Die Uhr teilt Dir mit: "));
continue;
}
if (strstr(format,"%d",0)==-1)
str=format;
else
str=sprintf(format,off);
if (str!="") tell_object(u,str);
}
}
str = "";
# ifndef __TESTMUD__
if (minuten < 10) {
log_file("USER_STATISTIK", ulog);
ulog = sprintf("\n%s%02d: ",(!std?("# "+lt[TM_WDAY]+":\n"):""),std);
}
ulog += sprintf("%4d",sizeof(users()));
# endif
WaitForQuarterHour();
}