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