blob: f3a59bff4e8aaffe273e3384cd9801a9e17c6631 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// Log-Daemon, um Geldbugs zu finden.
2//
3// Noch experimentell, ich feile noch fleissig an den Werten&Co.
4// Wer mir ohne triftigen Grund daran herumpfuscht, der wird standesrechtlich
5// mit faulen Eiern beworfen. ]:->
6//
7// Tiamak
8
9#pragma strong_types,save_types
10#pragma no_clone,no_shadow
11
12#include <wizlevels.h>
13#include <money.h>
14
15#define LOGNAME "ADDMONEY"
16#define SAVEFILE "/p/daemon/save/moneylog"
17
18#define THRESHOLD_HOURLY 10000 // wieviel Geld darf man an einer Stelle pro
19#define THRESHOLD_DAILY 50000 // Stunde/Tag bekommen, ohne dass geloggt wird?
20
21
22private mapping mon, grenzen;
23private int check, next_reset;
24
25
26public void create()
27{
28 // wir muessen Savefile schreiben duerfen
29 seteuid(getuid());
30
31 if ( !restore_object(SAVEFILE) ){
32 mon = m_allocate( 0, 2 );
33 grenzen = m_allocate( 0, 2 );
34 check = 0;
35 next_reset = 3600;
36 }
37
38 if ( next_reset > 3600 )
39 next_reset = 3600;
40
41 if ( next_reset < 60 )
42 next_reset = 60;
43
44 // Auswertung jede Stunde
45 set_next_reset( next_reset );
46 next_reset += time();
47}
48
49
50// Sortierfunktionen
51
52static int _sort_hourly( string fn1, string fn2 )
53{
54 return mon[fn1, 0] > mon[fn2, 0];
55}
56
57
58static int _sort_daily( string fn1, string fn2 )
59{
60 return mon[fn1, 1] > mon[fn2, 1];
61}
62
63
64// im reset() wird die Auswertung vorgenommen
65public void reset()
66{
67 int i;
68 string *files, txt;
69
70 // keinen Aufruf per Hand bitte
71 if ( time() < next_reset )
72 return;
73
74 // Auswertung jede Stunde
75 set_next_reset(3600);
76 next_reset = time() + 3600;
77 check++;
78 txt = "";
79
80 files = sort_array( m_indices(mon), #'_sort_hourly/*'*/ );
81
82 for ( i = sizeof(files); i--; ){
83 if ( !(grenzen[files[i], 0] < 0) &&
84 (grenzen[files[i], 0] && mon[files[i], 0] > grenzen[files[i], 0])
85 || (!grenzen[files[i], 0] && mon[files[i], 0] > THRESHOLD_HOURLY) )
86 txt += sprintf( "%12d --- %s\n", mon[files[i], 0], files[i] );
87
88 mon[files[i], 0] = 0;
89 }
90
91 // nur loggen, wenn es auch etwas zu loggen gibt
92 if ( txt != "" )
93 log_file( LOGNAME, sprintf( "%s: =================================="
94 "==============(stuendlich)===\n",
95 ctime(time())[4..15] ) + txt );
96
97 // der "grosse" Check kommt nur einmal pro Tag
98 if ( check < 24 ){
99 save_object(SAVEFILE);
100 return;
101 }
102
103 check = 0;
104 txt = "";
105 files = sort_array( m_indices(mon), #'_sort_daily/*'*/ );
106
107 for ( i = sizeof(files); i--; )
108 if ( !(grenzen[files[i], 1] < 0) &&
109 (grenzen[files[i], 1] && mon[files[i], 1] > grenzen[files[i], 1])
110 || (!grenzen[files[i], 1] && mon[files[i], 1] > THRESHOLD_DAILY) )
111 txt += sprintf( "%12d --- %s\n", mon[files[i], 1], files[i] );
112
113 if ( txt != "" )
114 log_file( LOGNAME, sprintf( "%s: =================================="
115 "==============(taeglich)=====\n",
116 ctime(time())[4..15] ) + txt );
117
118 mon = m_allocate( 1, 2 );
119 save_object(SAVEFILE);
120}
121
122
123// die eigentliche Logg-Funktion
124public void AddMoney( object ob, int amount )
125{
126 string fn;
127
128 // keine Manipulationen per Hand bitte
129 if ( !objectp(ob) || amount < 0 || !previous_object() ||
130 (!query_once_interactive(previous_object()) &&
131 load_name(previous_object()) != GELD)
132 || IS_LEARNER(previous_object()) )
133 return;
134
135 fn = explode( object_name(ob), "#" )[0];
136
137 mon[fn, 0] += amount;
138 mon[fn, 1] += amount;
139}
140
141
142// Savefile noch schnell abspeichern - wir wollen ja keine Daten verlieren ;-)
143public int remove()
144{
145 next_reset = query_next_reset(this_object()) - time();
146 save_object(SAVEFILE);
147
148 destruct(this_object());
149 return 1;
150}
151
152
153// fuer bestimmte Files kann man die Grenzwerte einzeln setzen
154public varargs int modify_threshold( string fn, int amount1, int amount2 )
155{
156 if ( !this_interactive() || this_interactive() != this_player() ||
157 !IS_ARCH(this_interactive()) || process_call() )
158 return -1;
159
160 if ( !stringp(fn) || !intp(amount1) || !intp(amount2) )
161 return -2;
162
163 if ( !amount1 && !amount2 ){
164 m_delete( grenzen, fn );
165 write( "Eintrag " + fn + " geloescht.\n" );
166 return 1;
167 }
168
169 grenzen[fn, 0] = amount1;
170 grenzen[fn, 1] = amount2;
171
172 write( break_string( "Die Grenzen fuer " + fn + " betragen jetzt " +
173 ((amount1 < 0) ? "unendlich viele" :
174 to_string(amount1)) + " Muenzen fuer den "
175 "stuendlichen und " +
176 ((amount2 < 0) ? "unendlich viele" :
177 to_string(amount2)) + " Muenzen fuer den taeglichen "
178 "Check.", 78 ) );
179
180 save_object(SAVEFILE);
181 return 1;
182}
183
184
185// einzeln gesetzte Grenzwerte abfragen
186public varargs mixed query_thresholds( string str )
187{
188 int i;
189 string *files, txt;
190
191 if ( !this_player() )
192 return deep_copy(grenzen);
193
194 if ( stringp(str) && member( grenzen, str ) ){
195 write( break_string( "Die Grenzen fuer " + str + " betragen " +
196 ((grenzen[str, 0] < 0) ? "unendlich viele" :
197 to_string(grenzen[str, 0])) + " Muenzen fuer den "
198 "stuendlichen und " +
199 ((grenzen[str, 1] < 0) ? "unendlich viele" :
200 to_string(grenzen[str, 1])) +
201 " Muenzen fuer den taeglichen Check.", 78 ) );
202 return 0;
203 }
204
205 if ( stringp(str) && str != "" ){
206 write( "Es sind keine Grenzen fuer " + str + " eingetragen!\n" );
207 return 0;
208 }
209
210 files = sort_array( m_indices(grenzen), #'</*'*/ );
211 txt = "Eingetragene Grenzwerte:\n================================="
212 "=============================================\n";
213
214 for ( i = sizeof(files); i--; )
215 txt += sprintf( "%'.'-48s : %8d (h) %10d (d)\n",
216 files[i], grenzen[files[i], 0], grenzen[files[i], 1] );
217
218 this_player()->More( txt );
219 return 1;
220}
221
222
223// bisher geloggte Daten abfragen
224public mixed query_status()
225{
226 int i;
227 string *files, txt;
228
229 if ( !this_player() )
230 return deep_copy(mon);
231
232 files = sort_array( m_indices(mon), #'</*'*/ );
233 txt = "Geldquellen:\n================================="
234 "=============================================\n";
235
236 for ( i = sizeof(files); i--; )
237 txt += sprintf( "%'.'-48s : %8d (h) %10d (d)\n",
238 files[i], mon[files[i], 0], mon[files[i], 1] );
239
240 this_player()->More( txt );
241 return 1;
242}
243
244
245// keine Shadows bitte
246public varargs int query_prevent_shadow( object ob ) { return 1; }