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