blob: c87d17d4f3188ca1034f9855559c5515a918a21f [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// $Id: todo.c 9142 2015-02-04 22:17:29Z Zesstra $
2#pragma strict_types
3#pragma save_types
4#pragma range_check
5#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +02006
7#include <wizlevels.h>
8#include <defines.h>
9#define NEED_PROTOTYPES
10#include <magier.h>
11#include <player.h>
12
13#define SAVEFILENAME sprintf("/players/%s/.todoliste",getuid())
14
15private nosave status todo_initialized;
16private nosave mixed *todo_data;
17mixed *todo_data_public;
18static mixed _query_localcmds()
19{
20 return ({
21 ({"todo","_todo",0,WIZARD_LVL})});
22}
23
24private void todo_save()
25{
26
27 int i,j;
28 string a,b;
29 a=SAVEFILENAME+".o";
30 rm(a);
31 if (j=sizeof(todo_data))
32 {
33#if !__EFUN_DEFINED__(save_value)
34 write_file(a,"#0:0\ntodo_data_public ({");
35 for (i=0;i<j;i++)
36 {
37 b=regreplace(todo_data[i][1],"\"","\\\"",1);
38 b=regreplace(b,"\n","\\n",1);
39 write_file(a,sprintf("({%d,\"%s\",}),",
40 todo_data[i][0],b));
41 }
42 write_file(a,"})\n");
43#else
44 todo_data_public=todo_data;
45 write_file(a,save_value(todo_data_public));
46 todo_data_public=0;
47#endif
48 }
49 return;
50
51}
52
53static void initialize()
54{
55 if(!IS_WIZARD(this_object())) return;
56 if (!restore_object(SAVEFILENAME)) todo_data=({});
57 else
58 {
59 todo_data=todo_data_public;
60 todo_data_public=0;
61 }
62 return;
63}
64
65static void _todo_neu2(string input,string carry)
66{
67 if (input=="q"||(input=="."&&!sizeof(carry)))
68 {
69 printf("Abbruch!");
70 return;
71 }
72 if (input!=".")
73 {
74 printf("]");
75 input_to("_todo_neu2",0,carry+input+"\n");
76 return;
77 }
78 todo_data+=({ ({ time(), carry }) });
79 todo_save();
80 printf("Eintrag angelegt. Laufende Nummer ist %d.\n",sizeof(todo_data));
81 return;
82}
83
84private int _todo_neu(string cmdline)
85{
86 if (cmdline!="neu") return 0;
87 printf("Was musst Du noch machen? (Abbruch mit 'q', "
88 "Ende mit '.')\n]");
89 input_to("_todo_neu2",0,"");
90 return 1;
91}
92
93private int _todo_loeschen(string cmdline)
94{
95 int nr;
96 if (!sscanf(cmdline,"loeschen %d",nr))
97 return notify_fail("Welchen Eintrag moechtest Du loeschen?\n"),0;
98 if (!sizeof(todo_data))
99 return notify_fail("Deine Todo-Liste hat ja ueberhaupt keinen "
100 "Eintrag!\n"),0;
101 if (nr>sizeof(todo_data))
102 {
103 printf("Deine Todo-Liste hat nur %d Eintra%s.\n",sizeof(todo_data),
104 (sizeof(todo_data)==1?"g":"ege"));
105 return 1;
106 }
107 todo_data[nr-1]=0;
108 todo_data-=({0});
109 todo_save();
110 printf("Eintrag Nummer %d wurde geloescht. Da hast Du ja ordentlich "
111 "was geschafft...\noder geschickt delegiert ;-)\n",nr);
112 return 1;
113}
114
115private int _todo_anzeigen(string cmdline)
116{
117 int nr1,nr2;
118 string output;
119 if (!sizeof(todo_data))
120 return notify_fail("Deine Todo-Liste hat keine Eintraege.\n"),0;
121 switch(sscanf(cmdline,"anzeigen %d bis %d",nr1,nr2))
122 {
123 case 0: nr1=1; nr2=sizeof(todo_data); break;
124 case 1: nr2=nr1; break;
125 case 2: break;
126 }
127 if (nr1<0) nr1=sizeof(todo_data)+nr1+1;
128 if (nr2<0) nr2=sizeof(todo_data)+nr2+1;
129 if (nr1<1||nr2<1||nr1>sizeof(todo_data)||nr2>sizeof(todo_data))
130 return notify_fail(sprintf("Deine Todo-Liste hat (gluecklicherweise) "
131 "nur %d Eintra%s.\n",sizeof(todo_data),
132 (sizeof(todo_data)>1?"ege":"g"))),0;
133 output="\n-----------------------------------------------------------------------------\n";
134 if (nr1>nr2) // Rueckwaerts
135 {
136 while(nr1>=nr2)
137 output+=sprintf("Eintrag Nr. %d von %s:\n%s\n\n",nr1--,
138 dtime(todo_data[nr1][0]),break_string(todo_data[nr1][1],78,5,
139 BS_LEAVE_MY_LFS));
140 }
141 else
142 {
143 nr1--;
144 while (nr1<nr2)
145 output+=sprintf("\nEintrag Nr. %d von %s:\n%s\n",(nr1+1),
146 dtime(todo_data[nr1][0]),break_string(todo_data[nr1++][1],78,5,
147 BS_LEAVE_MY_LFS));
148 }
149 More(output+"-----------------------------------------------------------------------------\n");
150 return 1;
151}
152
153private int _todo_verschieben(string cmdline)
154{
155 int from;
156 mixed to,dummy;
157 if (!(sscanf(cmdline,"verschieben %d nach %d",from,to)==2||
158 sscanf(cmdline,"verschieben %d nach %s",from,to)==2))
159 return 0;
160 from--;
161 if (stringp(to))
162 {
163 switch(to)
164 {
165 case "oben": to=from-1; break;
166 case "unten": to=from+1; break;
167 default: return 0;
168 }
169 }
170 else to--;
171 if (to==from) return notify_fail("Da ist der Eintrag ja schon!\n"),0;
172 if (from<0||from>=sizeof(todo_data)) return notify_fail(
173 "Wie willst Du einen nicht existenten Eintrag verschieben?\n"),0;
174 if (to<0||to>=sizeof(todo_data)) return notify_fail(
175 "Dahin kannst Du den Eintrag nicht verschieben.\n"),0;
176 dummy=todo_data[from];
177 if (to>from)
178 while (from++<to) todo_data[from-1]=todo_data[from];
179 else
180 while(from-->to) todo_data[from+1]=todo_data[from];
181 todo_data[to]=dummy;
182 printf("Eintrag wurde verschoben.\n");
183 return 1;
184}
185
186private int _todo_hilfe()
187{
188 printf(
189 "-------------------------------------------------------------------------------\n\n"
190 " Die Todo-Liste laesst sich mit den folgenden Befehlen steuern:\n\n"
191 " todo neu - Legt einen neuen Eintrag an.\n"
192 " todo loeschen <nummer> - Loescht einen Eintrag.\n"
193 " todo anzeigen [<nummer> [bis <nummer>]] - Zeigt die Todo-Liste an.\n"
194 " todo verschieben <nummer> nach <ziel> - Verschiebt einen Eintrag.\n\n"
195 " <ziel> kann eine Zahl oder die Worte 'oben' oder 'unten' sein.\n"
196 "-------------------------------------------------------------------------------\n");
197 return 1;
198}
199
200
201static int _todo(string cmdline)
202{
203 string *args;
204
205 cmdline=_unparsed_args(1);
206 notify_fail("Falsche Syntax. 'todo hilfe' zeigt eine Hilfe an.\n");
207 if (sizeof(cmdline))
208 {
209 args=explode(cmdline," ");
210 switch(args[0])
211 {
212 case "neu": return _todo_neu(cmdline);
213 case "loeschen": return _todo_loeschen(cmdline);
214 case "anzeigen": return _todo_anzeigen(cmdline);
215 case "verschieben": return _todo_verschieben(cmdline);
216 case "hilfe": return _todo_hilfe();
217 default: return 0;
218 }
219 }
220 return 0;
221}