blob: f4120e763fb9572ed2564acb7f2485e458028705 [file] [log] [blame]
// $Id: todo.c 9142 2015-02-04 22:17:29Z Zesstra $
#pragma strict_types
#pragma save_types
#pragma range_check
#pragma no_clone
#pragma pedantic
#include <wizlevels.h>
#include <defines.h>
#define NEED_PROTOTYPES
#include <magier.h>
#include <player.h>
#define SAVEFILENAME sprintf("/players/%s/.todoliste",getuid())
private nosave status todo_initialized;
private nosave mixed *todo_data;
mixed *todo_data_public;
static mixed _query_localcmds()
{
return ({
({"todo","_todo",0,WIZARD_LVL})});
}
private void todo_save()
{
int i,j;
string a,b;
a=SAVEFILENAME+".o";
rm(a);
if (j=sizeof(todo_data))
{
#if !__EFUN_DEFINED__(save_value)
write_file(a,"#0:0\ntodo_data_public ({");
for (i=0;i<j;i++)
{
b=regreplace(todo_data[i][1],"\"","\\\"",1);
b=regreplace(b,"\n","\\n",1);
write_file(a,sprintf("({%d,\"%s\",}),",
todo_data[i][0],b));
}
write_file(a,"})\n");
#else
todo_data_public=todo_data;
write_file(a,save_value(todo_data_public));
todo_data_public=0;
#endif
}
return;
}
static void initialize()
{
if(!IS_WIZARD(this_object())) return;
if (!restore_object(SAVEFILENAME)) todo_data=({});
else
{
todo_data=todo_data_public;
todo_data_public=0;
}
return;
}
static void _todo_neu2(string input,string carry)
{
if (input=="q"||(input=="."&&!sizeof(carry)))
{
printf("Abbruch!");
return;
}
if (input!=".")
{
printf("]");
input_to("_todo_neu2",0,carry+input+"\n");
return;
}
todo_data+=({ ({ time(), carry }) });
todo_save();
printf("Eintrag angelegt. Laufende Nummer ist %d.\n",sizeof(todo_data));
return;
}
private int _todo_neu(string cmdline)
{
if (cmdline!="neu") return 0;
printf("Was musst Du noch machen? (Abbruch mit 'q', "
"Ende mit '.')\n]");
input_to("_todo_neu2",0,"");
return 1;
}
private int _todo_loeschen(string cmdline)
{
int nr;
if (!sscanf(cmdline,"loeschen %d",nr))
return notify_fail("Welchen Eintrag moechtest Du loeschen?\n"),0;
if (!sizeof(todo_data))
return notify_fail("Deine Todo-Liste hat ja ueberhaupt keinen "
"Eintrag!\n"),0;
if (nr>sizeof(todo_data))
{
printf("Deine Todo-Liste hat nur %d Eintra%s.\n",sizeof(todo_data),
(sizeof(todo_data)==1?"g":"ege"));
return 1;
}
todo_data[nr-1]=0;
todo_data-=({0});
todo_save();
printf("Eintrag Nummer %d wurde geloescht. Da hast Du ja ordentlich "
"was geschafft...\noder geschickt delegiert ;-)\n",nr);
return 1;
}
private int _todo_anzeigen(string cmdline)
{
int nr1,nr2;
string output;
if (!sizeof(todo_data))
return notify_fail("Deine Todo-Liste hat keine Eintraege.\n"),0;
switch(sscanf(cmdline,"anzeigen %d bis %d",nr1,nr2))
{
case 0: nr1=1; nr2=sizeof(todo_data); break;
case 1: nr2=nr1; break;
case 2: break;
}
if (nr1<0) nr1=sizeof(todo_data)+nr1+1;
if (nr2<0) nr2=sizeof(todo_data)+nr2+1;
if (nr1<1||nr2<1||nr1>sizeof(todo_data)||nr2>sizeof(todo_data))
return notify_fail(sprintf("Deine Todo-Liste hat (gluecklicherweise) "
"nur %d Eintra%s.\n",sizeof(todo_data),
(sizeof(todo_data)>1?"ege":"g"))),0;
output="\n-----------------------------------------------------------------------------\n";
if (nr1>nr2) // Rueckwaerts
{
while(nr1>=nr2)
output+=sprintf("Eintrag Nr. %d von %s:\n%s\n\n",nr1--,
dtime(todo_data[nr1][0]),break_string(todo_data[nr1][1],78,5,
BS_LEAVE_MY_LFS));
}
else
{
nr1--;
while (nr1<nr2)
output+=sprintf("\nEintrag Nr. %d von %s:\n%s\n",(nr1+1),
dtime(todo_data[nr1][0]),break_string(todo_data[nr1++][1],78,5,
BS_LEAVE_MY_LFS));
}
More(output+"-----------------------------------------------------------------------------\n");
return 1;
}
private int _todo_verschieben(string cmdline)
{
int from;
mixed to,dummy;
if (!(sscanf(cmdline,"verschieben %d nach %d",from,to)==2||
sscanf(cmdline,"verschieben %d nach %s",from,to)==2))
return 0;
from--;
if (stringp(to))
{
switch(to)
{
case "oben": to=from-1; break;
case "unten": to=from+1; break;
default: return 0;
}
}
else to--;
if (to==from) return notify_fail("Da ist der Eintrag ja schon!\n"),0;
if (from<0||from>=sizeof(todo_data)) return notify_fail(
"Wie willst Du einen nicht existenten Eintrag verschieben?\n"),0;
if (to<0||to>=sizeof(todo_data)) return notify_fail(
"Dahin kannst Du den Eintrag nicht verschieben.\n"),0;
dummy=todo_data[from];
if (to>from)
while (from++<to) todo_data[from-1]=todo_data[from];
else
while(from-->to) todo_data[from+1]=todo_data[from];
todo_data[to]=dummy;
printf("Eintrag wurde verschoben.\n");
return 1;
}
private int _todo_hilfe()
{
printf(
"-------------------------------------------------------------------------------\n\n"
" Die Todo-Liste laesst sich mit den folgenden Befehlen steuern:\n\n"
" todo neu - Legt einen neuen Eintrag an.\n"
" todo loeschen <nummer> - Loescht einen Eintrag.\n"
" todo anzeigen [<nummer> [bis <nummer>]] - Zeigt die Todo-Liste an.\n"
" todo verschieben <nummer> nach <ziel> - Verschiebt einen Eintrag.\n\n"
" <ziel> kann eine Zahl oder die Worte 'oben' oder 'unten' sein.\n"
"-------------------------------------------------------------------------------\n");
return 1;
}
static int _todo(string cmdline)
{
string *args;
cmdline=_unparsed_args(1);
notify_fail("Falsche Syntax. 'todo hilfe' zeigt eine Hilfe an.\n");
if (sizeof(cmdline))
{
args=explode(cmdline," ");
switch(args[0])
{
case "neu": return _todo_neu(cmdline);
case "loeschen": return _todo_loeschen(cmdline);
case "anzeigen": return _todo_anzeigen(cmdline);
case "verschieben": return _todo_verschieben(cmdline);
case "hilfe": return _todo_hilfe();
default: return 0;
}
}
return 0;
}