MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |
| 22 | private mapping mon, grenzen; |
| 23 | private int check, next_reset; |
| 24 | |
| 25 | |
| 26 | public 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 | |
| 52 | static int _sort_hourly( string fn1, string fn2 ) |
| 53 | { |
| 54 | return mon[fn1, 0] > mon[fn2, 0]; |
| 55 | } |
| 56 | |
| 57 | |
| 58 | static 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 |
| 65 | public 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 |
| 124 | public 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 ;-) |
| 143 | public 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 |
| 154 | public 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 |
| 186 | public 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 |
| 224 | public 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 |
| 246 | public varargs int query_prevent_shadow( object ob ) { return 1; } |